Een programma zal niet steeds hetzelfde verlopen. Aan de hand van een if-else
statement kan er bepaald worden welke instructies er uitgevoerd moeten worden en welke niet.
Een andere naam voor het if-else
statement is ‘selectie’.
De algemene syntax van een if-else
statement ziet er als volgt uit:
if (voorwaarde)
{
//instructieblok dat uitgevoerd wordt indien er aan de voorwaarde voldaan is;
}
else
{
//instructieblok dat uitgevoerd wordt indien er er niet aan de voorwaarde voldaan is;
}
Grafisch kunnen we dit met onderstaande flowchart voorstellen:
Bespreking:
De voorwaarde die tussen haakjes bij if
staat kan voldaan zijn of niet voldaan zijn en geeft respectievelijk true
of false
als resultaat.
Voorbeelden:
In onderstaande voorbeelden gaan we ervan uit dat de variabele a de waarde 10 heeft.
Voorwaarde | Resultaat |
---|---|
a < 5 | false |
a > 7 | true |
a > 1 || a < 20 | true |
Indien de voorwaarde true
als resultaat geeft wordt het instructieblok dat bij if
staat uitgevoerd. Is het resultaat van de voorwaarde false
dan wordt het else
gedeelte uitgevoerd. Op die manier kan d.m.v. voorwaarden het programmaverloop beïnvloed worden.
Opmerkingen:
if
en else
worden telkens accolades geplaatst. Deze accolades maken duidelijk welke instructies bij if
horen, en welke bij else
. Indien een instructieblok slechts één instructie bevat, mogen de accolades weg gelaten worden. De eerste instructie hoort immers sowieso bij if
of else
. We maken echter de afspraak de accolades steeds te plaatsen, ook bij één instructie in het instructieblok. Op die manier wordt het aanpassen van de code achteraf makkelijker. Bij het achteraf toevoegen van instructies worden de accolades vaak vergeten, wat tot fouten leidt. De accolades er steeds van in het begin zetten, vermijdt dit probleem.Voorbeeld: Als de variabele a een negatief getal is, wordt de variabele a gelijkgesteld aan 0. Is a groter of gelijk aan 0, dan gebeurt er niets, daarom is een else
gedeelte dus niet nodig. De functie geeft de uiteindelijke waarde van a als resultaat. Deze waarde kan dus 0 of de oorspronkelijke waarde van a zijn.
public static int test(int a)
{
if (a < 0)
{
a = 0;
}
return a;
}
Voorbeeld: De waarde van de variabele a moet tussen 1 en 100 liggen (grenzen inbegrepen). Indien a buiten deze grenzen ligt, wordt a op 100 geïnitialiseerd. Om te kunnen testen dat a buiten deze grenzen ligt, hebben we twee voorwaarden nodig. Deze twee voorwaarden koppelen we met de OR-operator. Ook hier is een else
gedeelte niet nodig aangezien er niets moet gebeuren als a binnen de opgegeven grenzen ligt.
public static int test(int a)
{
if (a < 1|| a > 100) // de twee voorwaarden worden gekoppeld met de OR-operator (||)
{
a = 100;
}
return a;
}
Voorbeeld: We hernemen bovenstaand voorbeeld, maar de grenzen worden nu eveneens als argumenten aan de functie doorgegeven. Het argument min wordt als benedengrens gebruikt, het argument max als bovengrens. Indien a buiten de opgegeven range valt, wordt de variabele gelijk gesteld aan de bovengrens max. Een else
gedeelte is ook hier nog steeds niet nodig.
public static int test(int a, int min, int max)
{
if (a < min || a > max) // de twee voorwaarden worden gekoppeld met de OR-operator (||)
{
a = max;
}
return a;
}
Voorbeeld: Indien het factuurbedrag (totalCost) boven 100 euro ligt, wordt er een korting van 5% gegeven, tot en met 100 euro bedraagt de korting 3%. De functie geeft het kortingspercentage als resultaat. Om het kortingspercentage kunnen op te slaan gebruiken we een hulpvariabele die binnen de functie gedeclareerd wordt: de float discountPerc. Het is deze variabele die we als returnwaarde voor de functie zullen gebruiken.
In het begin van dit hoofdstuk werd de flowchart van een if-else statement getoond. Toegepast op deze opgave, wordt de flowchart het volgende:
In C# wordt dit de volgende code:
public static float calcDiscountPerc(float totalCost)
{
float discountPerc; // Declaratie van de hulpvariabele.
if (totalCost > 100)
{
discountPerc = 0.05F;
}
else
{
discountPerc = 0.03F;
}
return discountPerc;
}
Zoals je ziet, geeft een flowchart een duidelijk beeld van het verloop van een programma. Ook verder in de cursus zullen we zien hoe het verloop van een bepaalde structuur grafisch wordt voorgesteld in een flowchart. Bij het uitwerken van kleine, eenvoudige algoritmes is het vaak overbodig om het verloop van je programma eerst uit te werken in een flowchart voordat je begint te programmeren. Bij uitgebreidere algoritmes kan dit echter wel een handig hulpmiddel zijn. Het algoritme eerst grafisch structureren in een flowchart maakt het uitwerken ervan in de programmeertaal zelf vaak eenvoudiger.
Opmerkingen bij dit voorbeeld: Het else-gedeelte kan vermeden worden door de code anders te schrijven. Door de variabele discountPerc op voorhand te initialiseren op 0.03F en slechts indien nodig (als het aankoopbedrag hoger is dan 100) te wijzigen naar 0.05F, is er geen else-gedeelte meer nodig:
public static float calcDiscountPerc(float totalCost)
{
float discountPerc = 0.03F; // Het kortingspercentage wordt default op 3% gezet
if (totalCost > 100)
{
// Indien de verkoop 100 euro of hoger bedraagt, wordt het
// kortingspercentage van 3% naar 5% gewijzigd.
discountPerc = 0.05F;
}
return discountPerc;
}
Opgepast: Hoe het niet moet! Gebruik van meerdere if
instructies i.p.v. de combinatie van if
en else
.
public static float calcDiscountPerc(float totalCost)
{
float discountPerc = 0F;
if (totalCost > 100)
{
discountPerc = 0.05F;
}
if (totalCost <= 100) // Fout! Het else gedeelte is vervangen door een if.
{
discountPerc = 0.03F;
}
return discountPerc;
}
Bovenstaande code gebruikt twee if-instructies en zal een correct resultaat afleveren. Toch is deze manier van werken niet optimaal. Indien we de code met if-else en de code met if-if vergelijken wat betreft het aantal testen dat de computer moet uitvoeren, dan krijgen we onderstaand overzicht.
Case 1: de variabele totalCost heeft de waarde 80.
Bij gebruik van een if-else
structuur:
Bij gebruik van een if-if
structuur:
Besluit: bij if-if
wordt er één test extra uitgevoerd, deze test is overbodig. Gebruik van if-else
vermijdt dat deze overbodige test gedaan wordt. Gebruik van if-if
vraagt dus meer tijd en zorgt voor een minder efficiënt programma. Dit is te vermijden!
Case 2: de variabele totalCost heeft de waarde 130.
Bij gebruik van een if-else
structuur:
Bij gebruik van een if-if
structuur:
Besluit: omdat er in dit voorbeeld twee afzonderlijke if
-instructies gebruikt worden, zal de tweede test ook uitgevoerd worden als aan de eerste test reeds voldaan was. Dit is totaal overbodig, dus ook nu geeft het gebruik van if-if
een minder efficiënt programma.
Algemeen kunnen we hieruit besluiten dat voorwaarden die deel uitmaken van dezelfde test steeds in een if-else structuur getest worden. Er wordt geen afzonderlijke if-instructie gebruikt om elke voorwaarde te testen omdat dit een minder efficiënt programma geeft.
Opmerking: de variabele discountPerc wordt in dit voorbeeld bij de declaratie geïnitialiseerd. Bij de vorige voorbeelden was dit niet noodzakelijk, in dit voorbeeld moet dit wel gebeuren om een foutmelding te vermijden. De reden hierachter is de volgende: waar bij de vorige voorbeelden de variabele kortingPerc steeds geïnitialiseerd wordt tijdens het uitvoeren van de functie (ofwel bij if ofwel bij else), is dit bij de versie met de twee afzonderlijke if
-instructies niet noodzakelijk het geval. Als aan geen enkele voorwaarde voldaan zou zijn, krijgt discountPerc geen waarde. Tijdens het builden wordt dit als een potentieel probleem opgemerkt, met een foutmelding tot gevolg. De variabele op voorhand initialiseren vermijdt deze foutmelding.
Indien er meerdere voorwaarden getest moeten worden, kunnen meerdere if-statements in een if-else structuur gecombineerd worden. De ongeschreven regel voor deze werkwijze is dat het aantal te testen voorwaarden beperkt wordt tot drie. Indien er meer voorwaarden getest moeten worden, wordt switch
gebruikt. Over deze structuur is een apart voorbeeld.
Voorbeeld: De score op een test wordt via het argument doorgegeven aan de functie Result(). De functie geeft een gepaste tekst als resultaat. Indien de score lager is dan 5, geeft de functie ‘Fail’ als resultaat. Voor scores vanaf 5 tot en met 9 geeft de functie ‘Pass’. Indien de score gelijk is aan 10 geeft de functie ‘Perfect’ als return-waarde.
public static string Result(int score)
{
string resulttext = "";
if (score < 5)
{
resulttext = "Fail";
}
else if (score <= 9) // Merk op dat de test (score <= 9) hier voldoende is en er niet getest
// moet worden op (score >=5).
// Alle scores lager dan 5 worden reeds afgehandeld in het eerste deel
// van deze selectie-structuur.
{
resulttext = "Pass";
}
else
{
resulttext = "Perfect";
}
return resulttext;
}
Open het project oefening-if-else-1 en maak de oefeningenreeks