3.3. Betinget udførelse

Indtil nu har vores programmer været fuldstændig forudsigelige. Vi har bedt computeren om at udføre den ene kommando efter den anden uanset udfaldet af de tidligere kommandoer.

Figur 3-4. Logikken i en if-sætning

I programmer kan man påvirke programudførelsen ved at indføre betingelser, der fortæller, at en del af programmet kun skal gennemløbes, hvis betingelsen er opfyldt.

Det består af et udtryk, der enten er sandt eller falsk, og noget, der afhænger af dets sandhedsværdi (se Figur 3-4).

Alle er bekendte med betingelser fra deres dagligdag, f.eks.:

I Java er syntaksen

 
if (betingelse) kommando; 

For eksempel:

 
if (alder >= 18) System.out.println("Du er myndig"); 
if (alkoholpromille > 0.5) System.out.println("Lad bilen stå"); 
if (pris < 500) System.out.println("Jeg køber den!"); 
if (alder == 18) System.out.println("Du er præcis atten år."); 
if (alder != 18) System.out.println("Du er ikke atten."); 

Udtrykkene i parenteserne er logiske udtryk (eller boolske udtryk). På dansk er sætningen "over 18" tvetydig: skal man være OVER 18, dvs. 19, for at være myndig? Java har derfor to forskellige sammenligningsoperatorer: a >= b undersøger, om a er større end eller lig med b, mens a > b undersøger om a er større end b. I appendiks Afsnit 3.9.4 findes en oversigt over sammenligningsoperatorerne.

Figur 3-5. Rutediagram for Alder

Herunder et komplet eksempel på et program, der afgør, om man er myndig. Programkoden, udtrykt på dansk, kunne være: hvis alder er større end 18, så skriv "Du er myndig". I et javaprogram skriver man:

 
public class Alder 
{ 
  public static void main(String[] args)  
  { 
    int alder; 
    alder = 15; 
 
    if (alder >= 18) 
    System.out.println("Du er myndig."); 
    System.out.println("Du er " + alder + " år."); 
  } 
} 

Resultatet bliver

 
Du er 15 år. 

Kommandoen System.out.println("Du er myndig"), bliver kun udført, hvis udtrykket (alder > 18) er sandt. I dette tilfælde er alder = 15, og der bliver ikke skrevet noget ud. Hvis vi ændrer i programmet, så alder = 18, er betingelsen (alder >= 18) sand, og vi får:

 
Du er myndig. 
Du er 18 år. 

Programudførelsen fortsætter under alle omstændigheder efter betingelsen, så uafhængigt af udfaldet vil linjen

 
System.out.println("Du er " + alder + " år."); 

blive udført.

Bemærk, oversætteren er ligeglad med indrykning, linjeskift etc. Det er teksten, der tæller. Vi kunne lige så godt have skrevet

 
if (alder >= 18) System.out.println("Du er myndig."); 

eller for den sags skyld

 
    if (alder >= 18)  
System.out.println("Du er myndig."); 

... men det sidste er en dårlig stil, for det gør det sværere at læse kildeteksten. Normalt indrykker man 2-4 tegn, når en kommando er betinget.

3.3.1. if-else

Figur 3-6. Logikken i en if-else-sætning

Hvis vi ønsker at gøre én ting, hvor betingelsen er sand, og en anden ting hvis betingelsen er falsk, kan vi føje en else-del til vores if-sætning. Denne del vil kun blive udført, hvis betingelsen er falsk. Syntaksen er:

 
if (betingelse) kommando1; 
else kommando2; 

Eksempelvis:

 
public class Alder2 
{ 
  public static void main(String[] args)  
  { 
    int alder; 
    alder = 15; 
 
    if (alder >= 18) 
      System.out.println("Du er myndig."); 
    else System.out.println("Du er ikke myndig."); 
 
    System.out.println("Du er " + alder + " år."); 
  } 
} 
 
Du er ikke myndig. 
Du er 15 år. 

Ændrer vi så alder = 18, er betingelsen (alder >= 18) sand, og vi får resultatet

 
Du er myndig. 
Du er 18 år. 

Det er selvfølgelig lidt kedeligt at kunne se direkte i vores program uden at køre det, om en betingelse er opfyldt. I virkeligheden er betingelser kun nyttige, når forgreningen afhænger af nogle ydre omstændigheder, f.eks. af brugerens indtastning eller af værdien af en variabel fra en anden del af programmet. Hvis du bare vil prøve, kan du lave et ikke-forudsigeligt program med Math.random().

3.3.2. Opgaver

  1. Lav et veksleprogram fra dollar til euro. Det skal påregne en kommission på 2 %, dog mindst 0,5 euro. Afprøv programmet med forskellige beløb.

  2. Skriv et program, der beregner porto for et brev. Inddata er brevets vægt (i gram). Uddata er prisen for at sende det som A-post i Danmark.