Iteration – Repetitionssats - while Lektion 7 Iteration – Repetitionssats - while
if-else-if if(uttryck_1){ satser_1 } else if(uttryck_2){ satser_2 else if(uttryck_3){ satser_3 . else{ satser
switch-case Fungerar som if-sats Programmeringsexempel: switch(heltalsvariabel) { case 1: //programmeringskod break; case 2: … default: } Programmeringsexempel: Läs in två tal Fråga efter räknesätt (+, -, *, /) Räkna ut och skriv ut resultat
System.out.println("Ange två tal och raknesätt: "); double tal1 = Keyboard.readDouble(); double tal2 = Keyboard.readDouble(); char räknesätt = Keyboard.readChar(); switch(räknesätt){ case '+': System.out.println((tal1 + tal2)); break; case '-': System.out.println((tal1 - tal2)); case '*': System.out.println((tal1 * tal2)); case '/': System.out.println((tal1 / tal2)); default: System.out.println("Felinmatning!"); } Inläsning räknesätt bestämmer vilket case vi går in i! räknesätt är en char alltså ’ ’ Om räknesätt innehåller annat
Algoritm och pseudokod algoritm = ett begränsat antal instruktioner för att lösa ett problem pseudokod = den programmeringskod, beskriven i ord, som löser algoritmen
Från källkod till pseudokod Algoritm skriven i programmeringsspråk int n1 = Keyboard.readInt(); int n2 = Keyboard.readInt(); int sum = n1 + n2; System.out.print(”Summan blir ”+sum); Läs in två heltal. Beräkna summan av talen. Skriv ut summan. Algoritm skriven i pseudokod
Från pseudokod till källkod Skriv ett program som kollar om två inlästa heltal är jämnt delbara med varandra. Läs in två heltal. Kolla om talen är jämnt delbara genom att undersöka resten. Skriv lämplig utskrift beroende på vilket fall. int n1 = Keyboard.readInt(); int n2 = Keyboard.readInt(); if(n1%n2 == 0 || n2%n1 == 0) System.out.println(”Ja!”); else System.out.println(”Nej!”); Blir det rest?
Strukturdiagram För att kunna få en struktur på ett program eller en algoritm kan det vara bra att gör s k strukturdiagram
Från pseodokod till strukturdiagram
Från pseodokod till strukturdiagram Läs in två heltal. Kolla om talen är jämnt delbara genom att undersöka resten. Skriv lämplig utskrift beroende på vilket fall.
Deklarera i och ge den startvärdet 0 Iteration Iteration är någonting som upprepar sig ett visst antal gånger. Ex: Skriv in ett namn och skriv ut namnet 10 gånger. Lösning: Använd en räknare som ”håller koll på” hur många gånger som iterationen har kört. Start Läs in namn Deklarera i och ge den startvärdet 0 false i < 10 true Skriv ut namn Avsluta Öka i med 1
while-sats while-satsen är en s k repetitionssats. Den utför den programmeringskod som finns innanför klammrarna så länge dess vilkor är uppfyllt. while(uttryck) { //satser }
while-sats System.out.print(”Skriv in ditt namn: ”); String namn = Keyboard.readInt(); int i = 0; while(i < 10) { System.out.println(namn); i++; }
Iteration Skriv ett program som summerar alla tal som användaren skriver in till dess att användaren skriver in siffran 0.
Iteration System.out.print(”Skriv in ett tal: ”); int n1 = Keyboard.readInt(); int sum = 0; while(n1!=0) { sum+=n1; n1 = Keyboard.readInt(); } System.out.print(”Summan blir ” +sum); Ge sum startvärde Så länge n1 ej är 0 Öka sum Läs in nytt tal till n1 Skriv ut vad sum blir
System.out.print(”Skriv in ett tal: ”); int n = Keyboard.readInt(); Skriv ett program som ber användaren skriva en ett heltal. Programmet skriver sedan ut talen tal, tal-1, tal-2, …, 3, 2, 1. Alltså programmet ska räkna ner från talet till 1. System.out.print(”Skriv in ett tal: ”); int n = Keyboard.readInt(); while(n > 0) System.out.print(n-- +” ”); while(uttryck) satser Ger följande utskrift om siffran 7 lagras i n!
while-satsen while(uttryck) { sats_1; sats_2; . } Följande sker: Uttrycket innanför parentesen testas först – är detta true (sant) görs satserna i while-satsen. Efter varje ”runda” testas uttrycket och om uttrycket är false (falskt) bryts while- loopen. Programmet fortsätter att köra där while-loopen slutar. OBS! Ska mer än en sats köras i while-loopen måste klamrar användas för att visa var loopen börjar och slutar!
Därefter ska resultatet skrivas ut och programmet avslutas. Skriv ett program som multiplicerar alla tal från 1 till ett tal som användaren anger. Därefter ska resultatet skrivas ut och programmet avslutas. (Programmet räknar alltså ut n! (läs n-fakultet), d.v.s. 1*2*3*…*n, där n är ett inläst positivt heltal) Start Läs in tal Deklarera prod och ge den startvärdet 1 Deklarera i och ge den startvärdet 1 false i <= tal true prod = prod * i Avsluta Öka i med 1
Multiplicera prod med i Iteration System.out.print(”Skriv in ett positiv heltal: ”); int tal = Keyboard.readInt(); int prod = 1; int i = 1; while(i <= tal) { prod = prod * i; i++; } System.out.print(tal+”! = ” +prod); Ge prod startvärde Ge i startvärde Multiplicera prod med i Öka i med 1 Skriv ut vad prod blir
while(quant < Math.pow(10,6)) { quant *= 2; month++; } Antal råttor i en stad är vid ett tillfälle 100 st. Råttfångaren blir långtidssjukskriven vilket gör att råttpopulationen fördubblas för varje månad. Hur lång tid tar det innan råttantalet har passerat en miljon. Svara i hela år och måndader. Om man vill definiera och tilldela flera variabler av samma datatyp i samma sats int quant = 100, month = 0; while(quant < Math.pow(10,6)) { quant *= 2; month++; } System.out.print("Passerar 1 000 000 efter "); System.out.println(month/12 +" år "+month%12+” måndader"); Beräknar 106, returnerar en double! Heltalsdelen Resten
import static javax.swing.JOptionPane.*; public class Rik { Tänk er följande högst orealistiska anställningsvillkor. Du har fått ett väldigt farligt och riskfyllt arbete. Lönesättningen är direkt ovanlig. Första dagen får du 1 öre i lön, dag två får du 2 öre, dag tre 4 öre, fjärde 8 öre osv. Lönen fördubblas varje dag. Du är rädd om din hälsa men vill samtidigt bli rik. Skriv ett program som frågor efter önskat belopp (d v s hur rik du vill bli) och som sedan räknar ut hur många dagar det tar för att bli rik. import static javax.swing.JOptionPane.*; public class Rik { public static void main(String [] arg) { String input = showInputDialog(”Belopp?”); double rich = Double.parseDouble(input); int days = 1; double dayPay = 0.01; double totAmount = 0.01; while(totAmount < rich) { days++; dayPay *=2; totAmount += dayPay; } showMessageDialog(null, ”Det tar ”+days+” dagar”); System.exit(0); Gör om till double! Initiera variablerna! Öka days Fördubbla dagslönen Räkna ut ny totallön
Samma stad har en befolkningsökning på 5 % varje år Samma stad har en befolkningsökning på 5 % varje år. Hur många år tar det att för att dubbla folkökningen. Säg att nuvarande folkmängd är 1 000 000. int pop = (int)Math.pow(10,6); int y = 0; while(pop < 2*Math.pow(10,6)) { pop *=1.05; y++; } System.out.print(”Det tar ”+y+” år.”);
Användaren styr avbrott i while-loopen Repetitionssatser kan användas då man vill att användaren ska ”styra” programmet! char ans = ’j’; while(ans == ’j’ || ans == ’J’) { System.out.print(”Tal 1: ”); double n1 = Keyboard.readDouble(); System.out.print(”Tal 2: ”); double n2 = Keyboard.readDouble(); System.out.println(n1*n2); System.out.print(”En beräkning till? ”); ans = Keyboard.readChar(); }
Uppgifter Skriv ett program som multiplicerar alla heltal som anges förutom talet ”0” – då ska resultatet skrivas ut och programmet avslutas. Skriv ett program som frågar efter en räntesats och som därefter beräknar hur många år det tar för ett kapital (t ex 1000 kr) att fördubblas vid den angivna räntesatsen. Ledning: Kapitalets storlek vi varje års slut kan beräknas med satsen nedan: kapital = kapital + räntesats * kapital/100; OBS! Ett bra sätt att kontrollera om programmet fungerar som det ska är att ange räntesatsen 100%. Kapitalet ska ju i så fall fördubblas på ett år. Skriv ett program som läser in ett heltal och därefter räknar ner heltalet. Ange ett heltal: 5 nedräknat: 5 4 3 2 1
Uppgifter Skriv ett program som frågar efter en räntesats och startkapital och som därefter beräknar och skriver ut hur kapitalet växer år för år under 5 år (eller antal år som man själv får ange). Exempel på körresultat: Hur stor är räntesatsen? 4.25 Hur stort är startkapitalet? 10000 år Kapital 1 10425 2 10868 3 11329 4 11811 5 12313
Uppgifter Gör följande arbetsuppgifter (sist i respektive kapitel): Uppgift 4.2 (s. 53), Uppgift 4.3, Uppgift 4.4, Uppgift 4.5, Uppgift 3.4 (s. 39), Uppgift 6.3 (s. 84), Uppgift 6.6 (från förra veckan) Studera exempel 6.8 (s. 77) Gör övning 6.8 (s. 78) Uppgift 6.4 (s.84)