Sammenligning og forgrening i Java

Oprettet 26-04-1999 Bjarne Larsen

Eksempel 2. Sammenligning og forgrening.

Indlæs tre tal. De to første tal adderes, og summen divideres med det tredie tal, hvis det tredie tal er forskellig fra 0, ellers udskrives en fejlmeddelelse.

Opstilling af drejebog:

1. afprøvning:

Indtast det første tal: 10

Indtast det andet tal: 20

Indtast det tredie tal: 3

Resultatet er: 10

2. afprøvning:

Indtast det første tal: 10

Indtast det andet tal: 20

Indtast det tredie tal: 0

Beregning umulig

Formler:

Beregning: (tal1 + tal2) / tal3, hvis tal3 er forskellig fra 0.

Indlæsning af data fra tastaturet

Indlæsning af data fra tastaturet eller andre inddata kilder er en nødvendig forudsætning for løsning af de fleste programmeringsopgaver. Desværre er indlæsning af data i Java ikke ligeså enkel som udskrivning. Dette hænger i nogen grad sammen med det forhold, at indlæsning af data kan resultere i, at der opstår forskellige fejl (exceptions), som der skal tages hensyn til i programmet. For at dette eksempel ikke skal blive unødigt kompliceret, er der dog ikke i første omgang taget hensyn til disse fejl i programmet.

Generelle rutiner:

Udskrivning af en ledetekst efterfulgt af indlæsning af et tal er en handling, som skal udføres 3 gange. Det kan derfor være relevant at generalisere denne handling i en funktion:

static int laesTal(String tekst) throws IOException

{

int tal;

BufferedReader in = new BufferedReader

(new InputStreamReader(System.in));

System.out.print(tekst);

tal = Integer.valueOf(in.readLine().trim()).intValue();

return tal;

}

static double beregning(int tal1, int tal2, int tal3)

{

double resultat;

resultat = (tal1 + tal2) * 1.0 / tal3;

return resultat;

}

Bemærk det ekstra led i beregningen (* 1.0), som er nødvendigt for at få resultatet udskrevet med decimaler.

 

Programmets struktur:

import java.io.*;

class Eks002

{

static int laesTal(String tekst) throws IOException

{

int tal;

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

System.out.print(tekst);

tal = Integer.valueOf(in.readLine().trim()).intValue();

return tal;

}

static double beregning(int tal1, int tal2, int tal3)

{

double resultat;

resultat = (tal1 + tal2) * 1.0 / tal3;

return resultat;

}

public static void main (String [] args) throws IOException

{

int tal1, tal2, tal3;

tal1 = laesTal("Indtast det første tal: ");

tal2 = laesTal("Indtast det andet tal: ");

tal3 = laesTal("Indtast det tredie tal: ");

if (tal3 != 0)

{

System.out.println("Resultatet er: " + beregning(tal1, tal2, tal3));

}

else

{

System.out.println("Beregning er umulig");

}

}

}

Ligesom muligheden for at udføre gentagelser er en fundamental egenskab ved datamaskiner, så er datamaskinens evne til at sammenligne og teste variabler af lige så stor vigtighed. En datamaskine ville nemlig ikke kunne bruges til løsning af vore administrative eller tekniske problemer, hvis den ikke kunne sammenligne to variabler og foretage en forgrening af databehandlingen på grundlag af resultatet af denne sammenligning.

Man udtrykker undertiden denne egenskab ved at sige, at datamaskinen er i stand til at udføre logiske valg. Et logisk valg udtrykkes i naturligt sprog ofte med en sætning, der indledes med ordet "hvis": Hvis betingelsen er opfyldt, så udfør denne behandling - ellers udføres en anden behandling.

Betingelser.

En betingelse er en sammensætning af ét eller flere boolske udtryk. Et boolsk udtryk er et udtryk, som kun kan antage én af de to værdier sand og falsk. De enkelte boolske udtryk består normalt af to variabler med en logisk operand imellem. De logiske operander kan være en af nedenstående muligheder:

== lig med

> større end

< mindre end

>= større end eller lig med

<= mindre end eller lig med

!= forskellig fra

Hvis betingelsen er sammensat af flere boolske udtryk, skal de enkelte boolske udtryk være omsluttet af paranteser. Sammenhængen mellem de enkelte boolske udtryk beskrives ved hjælp af logiske operander som AND (&) og OR (|).

Negation.

Det er muligt ved hjælp af operanden ! at negere et boolsk udtryk. Det vil sige at ændre en værdi fra sand til falsk eller fra falsk til sand. Man skal passe på, hvis det boolske udtryk, som skal negeres, indeholder operander som AND og OR, fordi disse operander ifølge de Morgans lov skifter fra AND til OR eller fra OR til AND i forbindelse med negationen.

 

Eksempel 2a. Exception handling.

I gennemgangen af eksempel 2 blev det nævnt, at der i forbindelse med indlæsning af data kan forekomme fejl, som man bør tage højde for i programmet. En af de fejl, der typisk opstår i relation til indlæsning af numeriske data, er at de data, brugeren ved tastaturet har indtastet, ikke er numeriske. Hvis brugeren ved et uheld har indtastet et bogstav, kan det indtastede f.eks. ikke omformes til et heltal. Systemet vil i stedet betragte den opståede situation som en undtagelse (exception), som signaleres til programmet. Programmet kan opfange signalet og indrette fortsættelsen herefter.

Dette eksempel viser, hvilke ændringer der skal gennemføres i funktionen laesTal, for at programmet i eksempel 2 kan reagere mere fornuftigt på den typiske situation, at der bliver indtastet et forkert (ikke-numerisk) tegn i forbindelse med indtastning af et tal.

Indlæsningsfunktionen

static int laesTal(String tekst) throws IOException

{

int tal;

BufferedReader in = new BufferedReader

(new InputStreamReader(System.in));

System.out.print(tekst);

while (true)

{

try

{

tal = Integer.valueOf(in.readLine().trim()).intValue();

return tal;

}

catch (NumberFormatException e2)

{

System.out.println("Fejl i det indtastede tal, prøv igen");

System.out.print(tekst);

}

}

}