10. Elementen i strukturerad programmering Sekvens Selektion Iteration Sekvens Sekvens En sekvens beskriver något som kan delas upp i en bestämd tidsföljd, t.ex 19.00 Kulturnyheterna 19.10 Regionala nyheter 19.30 Filmkrönikan eller 06.00 Gomorron Sverige 06.45 Klappar på kredit kan bli dyr affär, 06.50 Svensk hockey på hal is? 07.15 Julkalendern med Allrams höjdarpaket 07.30 Gomorron Sverige 07.49 Boktips för barn 08.10 Är Rumänien redo för EU? 08.20 Möt männen bakom Hipphipp! 09.30 Om barn 10.00 Alla sinnen tillåtna! Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 3 Sekvens public class JSPTest { public static void Main () { int a = 2; int b = 3; int c = 4; a = a + b + c; b = a + b + c; c = a + b + c; System.Console.WriteLine("a = " + a); System.Console.WriteLine("b = " + b); System.Console.WriteLine("c = " + c); } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 4 Sekvens JSP Flödesdiagram Program bearbetning bearbetning Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 5 Sekvens, exempel JSP Flödesdiagram Hello Start Skriv ut ”Hello World!” Skriv ut ”Hello World!” Stopp public class Hello { public static void Main () { System.Console.WriteLine(“Hello World!"); } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 6 Sekvens AreaTest Inmatning Skriv ledtext Beräkning Läs radie area=PI * radie*radie Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur Utskrift Skriv area 7 Sekvens AreaTest Skriv ledtext Läs radie area = pi * radie * radie Skriv area Slut Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 8 Sekvens public class AreaTest { public static void Main () { System.Console.WriteLine("Ange radie: "); double radie = double.Parse( System.Console.ReadLine() ); double area = 3.1415 * radie * radie; System.Console.WriteLine("area = " + area); } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 9 Selektion Relationsoperatorer == != > >= < <= Lika med Inte lika med (Skilt från) Större än Större än eller lika med Mindre än Mindre än eller lika med Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 11 Booleska operatorer ! || && inte eller och Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 12 Booleska (logiska) operatorer ! (ICKE) Om… a b s s s f f s f f && (OCH) a && b s f f f Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur || (ELLER) a || b s s s f !a f f s s 13 Selektion - if JSP Flödesdiagram Program villkor sant (villkor) o bearbetning Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur falskt bearbetning 14 Selektion - if, exempel JSP Flödesdiagram SelektionsTest Sätt antal = 2 antalkoll (antal = 2) Skriv ut "OK, det o stämde!" Start Sätt antal = 2 Är antal=2? falskt sant Skriv ut "OK, det stämde!" Stopp Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 15 Sekvens public class IfTest { public static void Main () { int antal = 2; if (antal == 2) { System.Console.WriteLine(“OK, det stämde!"); } } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 16 Selektion – if-else JSP Flödesdiagram villkor Program (villkor = sant) (villkor = falskt) o bearbetning sant falskt o bearbetning bearbetning bearbetning Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 17 Selektion – if-else, exempel JSP Flödesdiagram Start SelektionsTest Läs in antal Läs in antal antalkoll sant Är antal=2? (antal = 2) Skriv "OK, det stämde!" falskt o Skriv ”Nej, det blev fel!” o Skriv "OK, det stämde!" Skriv ”Nej, det blev fel!” Stopp Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 18 Sekvens public class IfTest { public static void Main () { int antal = int.Parse( System.Console.ReadLine() ); if (antal == 2) { System.Console.WriteLine(“OK, det stämde!"); } else { System.Console.WriteLine(“Nej, det blev fel!"); } } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 19 Selektion – if-else, exempel JSP Flödesdiagram SelektionsTest3 Läs in antal (antal = 1 eller 2) Skriv "OK, det stämde!" Start Läs in antal antalkoll o Skriv ”Utanför intervallet!” o antal = 1 eller 2? falskt sant Skriv "OK, det stämde!" Skriv ”Utanför intervallet!” Stopp Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 20 Selektion – if-else public class IfTest { public static void Main () { int antal = int.Parse( System.Console.ReadLine() ); if (antal == 1 || antal == 2) { System.Console.WriteLine(“OK, det stämde!"); } else { System.Console.WriteLine(“Utanför intervallet!"); } } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 21 Villkorsoperatorn Kommer ni ihåg Excel? villkor resultat om sant resultat om falskt Villkorsoperatorn i C/C++/Java/C#: villkor ? resultat om sant : resultat om falskt ; Exempel: int a = 23; string b = a >= 10 ? “större” : “mindre” ; System.Console.WriteLine( b ); (Nu har vi nämnt villkorsoperatorn, men använd hellre if-satser… ) Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 22 if - else Villkorsoperatorn i C/C++/Java/C#: int a = 23; string b = a >= 10 ? “större” : “mindre” ; System.Console.WriteLine( b ); Kan lika gärna (hellre?) använda en if-else-sats: int a = 23; string b = null; if (a >= 10) { b = “större”; } else { b = “mindre” ; } System.Console.WriteLine( b ); Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 23 CompareTo Används för att jämföra strängar. Uttrycket s1.CompareTo(s2) ger följande resultat: <0 om s1 är mindre än s2 =0 om s1 är lika med s2 >0 om s1 är större än s2 Tecken för tecken jämförs Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 24 CompareTo ett exempel string s1 = ”Bo”; string s2 = ”Hans”; if( (s1.CompareTo(s2)) > 0 ) { System.Console.Write(”Bo”); } else { System.Console.Write(”Hans”); } Vad skrivs ut?? Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 25 Selektion – if-else/switch JSP Flödesdiagram Program villkor Alternativ 1 Alternativ 2 (alt 1) o bearbetning (alt 2) o bearbetning (alt 3) o bearbetning Alternativ 3 Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur bearbetning bearbetning bearbetning 26 Selektion – if-else/switch JSP Flödesdiagram Start SwitchTest Läs in antal Läs in antal (antal = 1) Antal-koll (antal = 2) o Skriv ut ”Nu är det galet igen” Skriv ut ”OK, det stämde” antal ? 1 o 2 o Skriv ut ”Hmm, så ska det inte vara” Skriv ut ”Nu är det galet igen” Skriv ut ”OK, det stämde” annat Skriv ut ”Hmm, så ska det inte vara” Stopp Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 27 Sekvens – switch public class SwitchTest { public static void Main () { int antal = int.Parse( System.Console.ReadLine() ); switch ( antal ) { case 1 : System.Console.WriteLine(“Nu är det galet igen!"); break; case 2 : System.Console.WriteLine(“OK, det stämde!"); break; default : System.Console.WriteLine(“Hmm, så ska det inte vara!"); break; } } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 28 Sekvens – if-else public class IfTest { public static void Main () { int antal = int.Parse( System.Console.ReadLine() ); if (antal == 1 ) { System.Console.WriteLine(“Nu är det galet igen!"); } else if (antal == 2) { System.Console.WriteLine(“OK, det stämde!"); } else { System.Console.WriteLine(“Hmm, så ska det inte vara!"); } } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 29 Iteration Iteration JSP Flödesdiagram Stomme falskt villkor (villkor) bearbetning * sant bearbetning Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 31 JSP WhileLoop summa=0 antal =0 Läs in tal Talstomme (tal <> 999) Tal-bearbetning* summa = summa + tal medel = summa / antal antal = antal +1 Skriv ut medel Läs in tal Flödesdiagram Start sant tal = 999 summa = 0 Medel = summa / antal Skriv ut medel falskt antal = 0 Läs in tal summa = summa + tal Stopp antal = antal +1 Läs in tal Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 32 Iteration – while public class WhileLoop { public static void Main () { double summa = 0; int antal = 0; int tal = int.Parse( System.Console.ReadLine() ); while ( tal != 999 ) { summa = summa + tal; antal++; tal = int.Parse( System.Console.ReadLine() ); } double medel = summa / antal; System.Console.WriteLine(“Medel = “ + medel); } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 33 Ett återkommande mönster Standarditeration Initiering av uttrycket för villkoret (villkor) ... Förändring av uttrycket för villkoret Iterationen i exemplet - iteration Inläsning av tal * (tal är inte 999) - iteration * Inläsning av tal ... Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur ... 34 Ett återkommande mönster Initiering av uttrycket för villkoret villkor Inläsning av tal sant falskt … Förändring av uttrycket för villkoret sant tal = 999 falskt … Inläsning av tal … Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 35 Iteration – do-while JSP Flödesdiagram Stomme bearbetning (villkor) bearbetning * villkor sant falskt Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 36 JSP Flödesdiagram Iteration – do-while, exempel Start DoLoop Sätt fortsätt till ’n’ Sätt fortsätt till ’n’ Skriv ut datum (fortsätt = y) * Läs in fortsätt Skriv ut datum Läs in fortsätt fortsätt y n Stopp Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 37 Iteration - for JSP Flödesdiagram Stomme villkor (x ggr) bearbetning * x ggr bearbetning Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 38 Iteration – vad for gör – egentligen… JSP Flödesdiagram initiering initiering (villkor) bearbetning - - * loopslut villkor bearbetning Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur loopslut 39 Iteration – men ibland kan vi uttrycka for enklare… JSP Flödesdiagram - (100 ggr) bearbetning * 100 ggr bearbetning Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 40 Iteration - foreach JSP Flödesdiagram Stomme villkor * (för varje x i y) Bearbetning för varje x i y Bearbetning Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 41 Iteration – break, continue Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 42 Rekursiva metoder JSP Inparametrar: rot, av typen DirectoryInfo nivå, heltal Directories Skapa en sträng indent med längden nivå Skriv ut indent och DirectoryInfo Rekursiv Iteration v = rot.GetDirectories() (för varje nod i v) * Directories (nod, nivå) Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 43 Rekursiva metoder Flödesdiagram Directories Inparametrar: rot av typen DirectoryInfo nivå, heltal Skapa en sträng indent med längden nivå Skriv ut indent och DirectoryInfo villkor för varje nod i v v = rot.GetDirectories() Directories (nod, nivå + 1) Stopp Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 44 Fällor • Har du nollställt de variabler du använder innan du går in i en ny iteration? • Tänk särskilt på vad det är för värden i de variabler som ingår i olika villkor. • I synnerhet i villkorssatser för iterationer, eftersom du annars kan hamna i en oändlig loop! • Skrivbordstesta! Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 45 Diagram för metoder JSP Flödesdiagram Inparametrar: a och b (heltal) Inparametrar: a och b (heltal) Max a>b returnera r r=a (a > b) r=a Max o r=b r=b o Returnera r Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 46 Diagram för metoder JSP Flödesdiagram Inparametrar: a och b (heltal) Inparametrar: a och b (heltal) Max Start Max a>b (a > b) Returnera a o Returnera b o Returnera a Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur Returnera b 47 Diagram för metoder JSP Flödesdiagram Start Main Main Inläsning av tal x Inläsning av tal y z = Max(x, y) Inläsning av tal x Inläsning av tal y z = Max(x, y) Skriv ut z Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur Skriv ut z Stopp 48 Fler exempel Statlig inkomstskatt • Definiera problemet (Ur ”Dags att deklarera”): ”Om din beskattningsbara förvärvsinkomst är lägst 100 kr men högst 209 100 kr, betalar du 200 kr i statlig inkomstskatt. Om din beskattningsbara förvärvsinkomst är högre än 209 100 kr, betalar du statlig inkomstskatt med 200 kr plus 25% av den del som överstiger 209 100 kr.” Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 50 Statlig inkomstskatt • Planera för lösningen • Vid körning av programmet skall man ges tillfälle att mata in den beskattningsbara förvärvsinkomsten. • När användaren matat in den aktuella inkomsten skall den statliga inkomstskatten skrivas ut, föregången av texten ”Den statliga skatten blir:” • Vi förutsätter att den inmatade inkomsten är ett heltal. • Man ska kunna göra godtyckligt många beräkningar utan att behöva starta programmet igen. För att markera avslutning ska ett negativt belopp matas in. Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 51 Strukturerad Programmering Start Mata in inkomst [>= 0] inkomst [< 0] Slut Beräkning Skriv ut skatt Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 52 Strukturerad Programmering Beräkning Start inkomst [>= 0 and < 100] [>= 100 and < 209100] skatt = 0 skatt = 200 [>= 209100] skatt = 200 + 25% Slut Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 53 Strukturerad Programmering Start Mata in inkomst inkomst [< 0] Slut [>= 0 and < 100] [>= 100 and < 209100] skatt = 0 skatt = 200 [>= 209100] skatt = 200 + 25% Skriv ut skatt Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 54 Statlig inkomstskatt Start Tills inkomst < 0 Mata in inkomst * Kolla inkomst Skriv ut skatt [negativt tal] [< 100] o [>= 100och < 209100] o negativ ingen Avsluta Skatt = 0 [> 209100] låg o Skatt = 200 Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur hög o Skatt = 200 + 25% 55 Strukturerad Programmering • Pseudokod: REPETERA Läs in inkomst OM inkomst < 0 avbryt exekveringen ANNARS OM inkomst > 209100 skatt = 200 + 0.25 * (inkomst - 209100) ANNARS OM inkomst >= 100 skatt = 200 ANNARS skatt = 0; OM-SLUT Skriv ut "Den statliga skatten blir: " + skatt LOOP-SLUT Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 56 Strukturerad Programmering int skatt, inkomst; while (true) { Console.Write ("Ange den beskattningsbara inkomsten: "); inkomst = int.Parse( Console.ReadLine() ); if (inkomst < 0) { return; } else if (inkomst > 209100) { skatt = (int) (200 + 0.25 * (inkomst - 209100)); } else if (inkomst >= 100) { skatt = 200; } else { skatt = 0; } Console.WriteLine("Den statliga skatten blir: " + skatt); } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 57 Strukturer - poster class Bok { public string titel; public string författare; public float pris; } class BokTest { public static void Main ( ) { Bok programmeringsbok = new Bok(); programmeringsbok.titel = ”C# från grunden”; System.Console.WriteLine(programmeringsbok.titel); } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 58 Strukturer - poster Även poster kan beskrivas med strukturdiagram class Bibliotek { public Bok[] böcker; } class Bok { public string titel; public string författare; public float pris; } Vad är den totala inköpssumman för alla böckerna? titel Bibliotek * Bok författare Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur pris 59 Strukturer - poster Vi börjar med att renodla vad vi behöver använda i algoritmen. Summering summa = 0 Skriv ut summa Bibliotek Som du ser följer vi helt enkelt den struktur som redan finns! Vad är den totala inköpssumman för alla böckerna? Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur (Så länge det finns böcker) * Bok summa = pris summa + pris 60 Strukturer - poster Vad är den totala inköpssumman för alla böckerna? class Bok { public string titel; public string författare; public float pris; } class Bibliotek { public static void Main() { Bok[] böcker = new Bok[2]; double summa = 0; böcker[0] = new Bok( ); böcker[0].titel = "AAA"; böcker[0].författare = "AAA"; böcker[0].pris = 100; böcker[1] = new Bok( ); böcker[1].titel = "BBB"; böcker[1].författare = "BBB"; böcker[1].pris = 200; for (int i = 0; i < böcker.Length; i++) { summa = summa + böcker[i].pris; } System.Console.WriteLine(summa); } } Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 61 Strukturerad Programmering • Pseudokod (exempel ”studenterna”): skriv ut rubrik sätt räknare till 0 läs in 1:a studentens resultat REPETERA så länge studentens resultat är större än eller lika med 0 läs in studentens namn skriv ut namn och resultat OM totalpoäng är mindre än 60 lägg 1 till räknaren OM-SLUT läs in studentens resultat REPETERA-SLUT skriv ut antalet underkända studenter Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 62 Strukturerad Programmering • Pseudokod (exempel ”studenterna”): start A Skriv rubrik resultat >= 0 falskt Skriv antal sant antal = 0 Läs 1.a resultat A Läs namn start Skriv namn, poäng resultat < 60 sant antal = antal + 1 falskt Läs resultat Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 63 Strukturerad Programmering • Pseudokod (exempel ”studenterna”): Start Skriv rubrik antal = 0 Bearbeta alla Läs resultat Skriv antal Bearbeta * en student Läs namn Skriv namn, resultat antal o = antal + 1 Abelli, B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur Läs resultat resultat? ---- o 64 Strukturerad Programmering class Student { public string namn; public int poäng; } class Studentpoäng { public static void Main ( ) { int antal; Student student = new Student(); Console.WriteLine(”Skriv ut antalet underkända studenter”); antal = 0; Console.Write("Ange studentens resultat"); student.poäng = int.Parse( Console.ReadLine() ); while (student.poäng >= 0) { Console.Write("Ange studentens namn"); student.namn = Console.ReadLine(); Console.WriteLine(student.namn + ” ” + student.poäng); if (student.poäng < 60) antal++; Console.Write("Ange studentens resultat"); student.poäng = int.Parse( Console.ReadLine() ); } Console.WriteLine("antalet undergända studenter är = " + antal); } Abelli,}B. (2004). Programmeringens Grunder – med exempel i C#. Lund: Studentlitteratur 65