Excerpt |
---|
if-kontrollstrukturen bruker en betingelse for å styre om en eller flere setninger blir utført. |
Den vanligste kontrollstrukturen er setninger som utføres i sekvens, som i følgende kode:
Code Block |
---|
| print('Hvor gammel er du?')
age = int(input())
print('Neste år blir du ' + str(age + 1) + ' år!') |
Først skrives spørsmålet ut, så venter programmet på input (som bør være et tall) fra brukeren og til slutt skrives en ny melding ut. | PlantUML Macro |
---|
start
:print('Hvor gammel er du?');
:age = int(input());
:print('Neste år blir du ' + str(age + 1) + ' år!');
stop |
Illustrasjon av koden med et flytskjema. Kontrollflyten går nedover fra boks til boks. |
En kommer imidlertid fort bort i situasjoner hvor kode bare skal utføres i bestemte tilfelle. F.eks. vil koden over kræsje hvis input-en ikke er et gyldig tall. Det vil være lurt å bare utføre den siste linja hvis input-en faktisk er et tall:
Code Block |
---|
| print('Hvor gammel er du?')
ageString = input()
if (ageString.isdigit()):
print('Neste år blir du ' + str(int(ageString) + 1) + ' år!') |
Her brukes if-nøkkelordet for å angi at print-setningen kun skal utføres hvis betingelsen ageInput.isdigit() er sann. | PlantUML Macro |
---|
start
:print('Hvor ...');
:ageString = input();
if (ageString.isdigit()) then (true)
:print('Neste år ...');
endif
stop |
Kontrollflyten har en forgreining, hvor verdien av betingelsen (true eller false) avgjør hvilken grein som tas. |
if-en angir en kontrollstruktur som kalles betinget utførelse. Betingelsen kan være hvilket som helst uttrykk som gir en logisk verdi, altså true/sant eller false/usant. Det finnes flere varianter av if-kontrollstrukturen. I eksemplet over skal det gjøres noe bare dersom betingelsen er true/sann. Dersom det skal gjøre noe annet i tilfellet hvor betingelsen er usann, så får en følgende variant:
Code Block |
---|
| print('Hvor gammel er du?')
ageString = input()
if (ageString.isdigit()):
print('Neste år blir du ' + str(int(ageString) + 1) + ' år!')
else:
print(ageString + ' er ikke et tall!') |
Her brukes if-nøkkelordet for å angi at print-setningen kun skal utføres hvis betingelsen ageInput.isdigit() er sann. | PlantUML Macro |
---|
start
:print('Hvor ...');
:ageString = input();
if (ageString.isdigit()) then (true)
:print('Neste år ...');
else (false)
:print(ageString + ' er ikke et tall!');
endif
stop |
Kontrollflyten har en forgreining, hvor verdien av betingelsen (true eller false) avgjør hvilken grein som tas. |
Noen ganger ønsker man å velge mellom flere enn to greiner. Dette kan gjøres ved å ha en ny if inni else-delen. Man tar altså først et valg mellom to greiner og i den ene greina gjør en et nytt valg. Eksemplet under, hvor en karakter (grade) settes basert på en poengsum (score):
Code Block |
---|
| if score >= 85:
grade = 'A';
else:
if score >= 75:
grade = 'B';
else:
if score >= 60:
grade = 'C';
else:
if score > 50:
grade = 'D';
else:
if score > 40:
grade = 'E';
else:
grade = 'F';
print(grade) |
| PlantUML Macro |
---|
start
if (score >= 85) then (true)
:grade = 'A';
else (false)
if (score > 75) then (true)
:grade = 'B';
else (false)
if (score > 60) then (true)
:grade = 'C';
else (false)
if (score > 50) then (true)
:grade = 'D';
else (false)
if (score > 40) then (true)
:grade = 'E';
else (false)
:grade = 'F';
endif
endif
endif
endif
endif
:print(grade);
stop |
|
Noen ganger blir det mange slike spørringer nøstet, og det blir fort forvirrende. En bedre løsning er da å bruke else-if-strukturen. Her kan man oppgi flere betingelser i hver sin else-if-grein, og den første som gir true/sann vil bli fulgt. I diagrammet nedenfor kan man tenke seg at man går fra venstre mot høyre, og følger den første pilen som passer.
Code Block |
---|
| if score >= 85:
grade = 'A';
elsif score >= 75:
grade = 'B';
elsif score >= 60:
grade = 'C';
elsif score > 50:
grade = 'D';
elsif score > 40:
grade = 'E';
else:
grade = 'F';
print(grade) |
| PlantUML Macro |
---|
(*) --> "if .."
"if .." -->[score > 90] "grade = 'A'"
--> (*)
"if .." -->[score > 80] "grade = 'B'"
--> (*)
"if .." -->[score > 60] "grade = 'C'"
--> (*)
"if .." -->[score > 50] "grade = 'D'"
--> (*)
"if .." -->[score > 40] "grade = 'E'"
-->(*)
"if .." -->[else] "grade = 'F'"
--> (*) |
|
Gruppering av setninger
En kan godt ha flere setninger i then- og/eller else-delen, og de fleste programmeringsspråk har en måte å gruppere setninger på. I Java grupperes setninger ved at en har { og } rundt, mens en i python bruker innrykket for å angi hvilke setninger som hører til de ulike greinene.