Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Excerpt

En kontrollstruktur styrer hva slags kode som kjører når. Denne siden oppsummerer de viktigste kontrollstrukturene og peker videre til sider som tar for seg hver type.

Et program består av setninger som utføres i sekvens, så uten noen spesielle konstrollstrukturer vil all koden bli utført én og bare én gang. Koden under illustrerer poenget:

...

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 Derfor kan det vært lurt å bare utføre den siste linja hvis sjekke gyldigheten og utføre ulike setninger avhengig av om input-en faktisk er et tall :

Code Block
languagepython
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 varianteller ikke:

Code Block
languagepython
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
languagepython
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
languagepython
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.

Dette kalles gjerne betinget utførelse, setningene i de to greinene utføres bare hvis en bestemt betingelse er true/sann eller false/usann. Det finnes flere varianter, f.eks. kan en utelate else-delen er ha en ny if i else-delen for å håndtere flere tilfeller.

 Les mer om dette her: if-kontrollstrukturen

Løkker

Løkker er kode som utføres flere ganger. Det er vanlig å skille mellom while-løkker og for-løkker. En while-løkke sjekker en betingelse, og gjennomfører koden i løkkekroppen så lenge denne betingelsen er sann. Man må være forsiktig når man skriver while-løkker; dersom ikke betingelsen er formulert riktig kan man ende opp med det som kalles en "uendelig løkke". Når man leser inn data fra en tekstfil, kan det se omtrent slik ut:

...