Villkor och tester Ett program består i princip av: Deklarationer som inför variabler, dvs namngivna minnesceller som används för att lagra data. int a; double radie=1.0, yta; double d = 4.5; String s = Nisse ; Utförande satser bygger upp metoderna, man brukar finindela detta i: sekvenser selektioner (val) repetitioner. Alla program byggs upp av dessa element (samt deklarationer förstås) Utförande satser som använder variablerna för att utföra beräkningar och annat arbete. Ex. tilldelning yta = Math.PI * radie * radie; Villkor och tester 29 September 2003 1 Villkor och tester 29 September 2003 2 En sekvens av satser utförs efter varandra tills man når slutet. Exempel på enkla satser som bygger upp sekvenser är: tilldelning, a = 2; utskrift, Std.out.println(a); inläsning, a = Std.in.readInt(); Selektioner (val) består i att datorn väljer ETT alternativ bland ett antal möjligheter. För att kunna skriva sådana måste vi kunna skriva testvillkor. Ett villkor är något som har ett logiskt värde (boolean), dvs sant eller falskt a är större än noll b är en stor bokstav c ligger i intervallet 0-10 månen är gjord av ost klockan är nio och solen skiner d har värdet 1 eller värdet 2 e har inte värdet 1 du är varken tjock eller ful Villkor och tester 29 September 2003 3 Villkor och tester 29 September 2003 4
Java bygger upp villkor m. h. a. logiska operatorer a > 2, Är a större än två? && och eller! inte relationsoperatorer == lika med!= skilt från > större än >= större än eller lika med < mindre än <= mindre än eller lika med a <= 1, Är a mindre eller lika med 1? b == 2, Är b lika med 2? c!= 2, Är c skilt från 2? Villkor som i matte skrivs som 0 a 10 Kan INTE skrivas 0 <= a <= 10 Java utför allt från vänster till höger och skulle först undersöka om 0<=a är sant. Sen skulle Java undersöka om svaret i denna jämför (sant eller falskt) är mindre än tio. Det går ju inte! Villkor och tester 29 September 2003 5 Villkor och tester 29 September 2003 6 För att kunna uttrycka mer komplicerade saker krävs logiska operatorer a >= 0 && a <= 10 a är större eller lika med noll OCH mindre eller lika med tio, dvs a ligger i intervallet [0,10]. Kan negeras:! (a >= 0 && a <= 10) a ligger INTE i intervallet [0,10]. Paranteser eftersom INTE har hög prioritet. kan också skrivas a < 0 a > 10 a är mindre än noll ELLER större än tio a >= 10 && a <= 20 a >=30 && a <= 40 a ligger i intervallet [10,20] eller i intervallet [30,40]. OCH görs alltid före ELLER (såvida vi inte sätter paranteser) a >= 10 && (a <= 20 a >=30) && a <= 40 Nu görs ELLER först. Det blir samma resultat just här men det gäller ju inte alltid. a < 0 && a > 10 a är mindre än noll OCH större än 10. Inte sant för några värden alls. a >= 0 a <=10 a är större än eller lika med noll ELLER mindre än eller lika med tio. Sant för alla värden. Villkor och tester 29 September 2003 7 Villkor och tester 29 September 2003 8
För att göra ett val i Java används satsen if eller satsen case. Syntax: if (villkor) sats eller if (villkor) sats annan-sats Den första formen betyder att om villkoret är sant så ska satsen utföras. Om villkoret inte är sant görs inget alls. I båda fallen fortsätter datorn sedan med nästa sats. Den andra formen betyder att om villkoret är sant så utförs den första satsen, om inte så görs den alternativa satsen i stället. I båda fallen fortsätter datorn med efterföljande sats. Villkor och tester 29 September 2003 9 Villkor och tester 29 September 2003 10 Std.out.println( Hur gammal är du? ); Om jag svarar med talet 5 så säger datorn Du är ung Om jag svarar med talet 47 så säger datorn inget alls Utbyggt exempel, raduppdelning och indragningar gör vi bara för att det ska bli lättare att läsa: Std.out.println( Hur gammal är du? ); Om jag nu svarar med talet 5 så säger datorn Du är ung Om jag svarar med talet 47 så säger datorn Du är gammal Villkor och tester 29 September 2003 11 Villkor och tester 29 September 2003 12
Mera utbyggt, jag vill skriva mera vid hög ålder: Std.out.println( Hur gammal är du? ); Std.out.println( Du har nog slutat skolan ); Om jag nu skriver talet 5 så säger datorn? om jag skriver talet 47 så säger datorn? De båda grenarna i if-satsen innehåller endast EN sats. Här utgör varje utskriftsats EN sats. Vi har alltså TVÅ satser i -grenen. Om vi sätter två satser i den första delen blir det språkligt fel, blir hemlös Std.out.println( Du går i skolan ); Men om vi sätter två satser i -grenen så blir det inte syntaxfel, bara logiskt fel. Den andra satsen hör INTE till if-satsen utan räknas som nästa sats. Std.out.println( Du har nog slutat skolan ); Villkor och tester 29 September 2003 13 Villkor och tester 29 September 2003 14 Satser kan grupperas med måsvingar, dvs { och. Om vi omger ett antal satser med dessa satsparanteser så räknas alltihopa som en sats. { Std.out.println( Du har nog slutat skolan ); Om du nu svarar med talet 5 så säger datorn Du är ung Om du svarar med talet 47 så säger datorn Du är gammal Du har nog slutat skolan En if-sats är ett tvåvägsval, du kan bara välja mellan två alternativ. Men en if-sats är en sats i Javas mening. Det betyder att de satser som ingår i villkoren mycket väl kan vara en if-sats. Då kan vi konstruera flervalssatser. import extra.*; public class Age3 { public static void main(string [] arg) { Std.out.println("Hur gammal är du?"); if (ålder < 7) Std.out.println("Går du på dagis?"); if (ålder >=7 && ålder < 18) Std.out.println("Du går nog i skolan"); if (ålder == 18) Std.out.println("Grattis! du får ta körkort!"); { Std.out.println("Du är gammal."); Std.out.println("Du har nog slutat skolan."); //slut på //slut main //slut class age3 Villkor och tester 29 September 2003 15 Villkor och tester 29 September 2003 16
kursa$ javac age3.java Hur gammal är du? 3 Går du på dagis? Hur gammal är du? 9 Du går nog i skolan Hur gammal är du? 18 Grattis! du får ta körkort! Hur gammal är du? 19 Du är gammal. Du har nog slutat skolan. Om vi återvänder till andragradsekvationen så kan vi bygga ut lösaren import extra.*; // // representera en andragradsekvation / / public class Equation { private double a, b, c; // koefficienterna // standardkonstruktor public Equation() { a = 1; // std ekvation b = -1; c = 0; // överlagrad konstruktor public Equation(double ap, double bp, double cp) { a = ap; b = bp; c = cp; // skriv ut din ekvation public void skrivut() { Std.out.println(a + "x^2 + " + b + "x" + " + " + c); // ändra din ekvation public void läsin() { Std.out.print("Ge koefficienterna: "); a = Std.in.readDouble(); b = Std.in.readDouble(); c = Std.in.readDouble(); Villkor och tester 29 September 2003 17 Villkor och tester 29 September 2003 18 // ta fram de två rötterna, skriv ut dem public void lös() { double d; double x1, x2; if (a == 0) Std.out.println( Ej lösbar ); { d = b*b - 4*a*c; if (d < 0) Std.out.println( Imaginära rötter ); { x1 = (-b + Math.sqrt(d))/(2*a); x2 = (-b - Math.sqrt(d))/(2*a); Std.out.println( "Rötterna är: " + x1 + "," + x2); public double hämtaa() { return a; public double hämtab() { return b; public double hämtac() { return c; public void sättkoeff(double ap, double bp, double cp) { a = ap; b = bp; c = cp; En annan flervägstest är switch-satsen switch (växel) { case nn: sats; case nn: sats;... default: sats; Växel är en variabel av diskret typ, dvs heltal, tecken eller boolean. Sedan väljs vilken case (gren) som ska göras beroende på variabelns värde. Det får finnas högst ett case per värde. Om inget case passar så väljs default -grenen. OBS: Grenarna är ingångar, inte utgångar. Det betyder att datorn väljer en ingång och tar sedan alla ingångan nedanför denna. Utgångar måste skrivas av dig! Testar om ekvationen har en andragradterm och om den har reella rötter. Här har vi först ett tvåvägsval. I den andra grenen har vi bland annat ett nytt tvåvägsval. Villkor och tester 29 September 2003 19 Villkor och tester 29 September 2003 20
// Sifferbetyg import extra.*; public class Betyg2 { public static void main(string [] arg) { int betyg; Std.out.println("Vilket betyg har du i matte?"); betyg = Std.in.readInt(); switch (betyg) { case 1: case 2: Std.out.println("...sorry"); case 3: Std.out.println("OK"); case 4: Std.out.println("Bra"); case 5: Std.out.println("Toppen!"); default: Std.out.println("Okänt betyg"); Om ett break glöms bort, tex efter case 3: och man svarar 3 blir svaret : OK Bra exempel på körningar: Vilket betyg har du i matte? 2...sorry Vilket betyg har du i matte? 7 Okänt betyg Villkor och tester 29 September 2003 21 Villkor och tester 29 September 2003 22