Kontrollstrukturer i C++
Förord
Jag insåg att jag i min introduktion till C++ förutsätter att man behärskar alla de styrstrukturer som finns i C/C++/Java. Eftersom kursen riktar sig till nybörjare vill jag rätta till det men en liten artikel om styrstrukturer som kan användas som referens till min första artikel.Innehåll
»»
»
»
»
»
»
»
»
Relaterade artiklar
» Introduktion till C++
Programflöde
Det är inte många program som bara går igenom en lista med operationer för att när det är färdigt med det avslutas. Oftast finns det saker man vill ska utföras bara om vissa villkor är uppfyllda eller saker man vill göra flera gånger. Då används styrstrukturer så att programmets beteende inte är så statiskt. Styrstrukturer finns i alla språk men här går jag igenom vad som gäller för C++. Jag kommer inte att behandla strukturer som är föråldrade och jag inte vill uppmuntra till användning av. Jag nämner ovan att man kan få saker att utföras bara om ett villkor är uppfyllt. Men vad är egentligen ett villkor?
Boolska villkor
Där det i koden ovan står villkor kan egentligen vilket uttryck som helst förekomma men klart vanligast är ett boolskt uttryck. Boolsk algebra är det man gör när man bara räknar med sant och falskt och uppfanns av George Boole. Med boolska variabler (av typen bool i C++) kan man utföra vissa operationer: logiskt och, logiskt eller och negation. Effekten av var och en av dessa brukar sammanställas i en sk. sanningstabell. I tabellerna skriver jag 0 för falskt (false) och 1 för (true). Denna omvandling går också att göra i C++.
Och (AND) skrivs && i C++
Värde på A Värde på B Resultat
0 0 0
0 1 0
1 0 0
1 1 1
Eller (OR) skrivs || i C++
Värde på A Värde på B Resultat
0 0 0
0 1 1
1 0 1
1 1 1
Icke (NOT) skrivs ! i C++
Värde på A Resultat
0 1
1 0
Förutom de boolska operationerna måste man kunna jämföra saker, det görs med jämförelseoperatorerna.
Jämförelser i C++
Uttryck | Syntax |
---|---|
Är lika med | == |
Mindre än | < |
Större än | > |
Mindre än eller lika med | <= |
Större än eller lika med | >= |
Skiljt från | != |
Med hjälp av dessa operationer och jämförelser kan man skriva uttryck som beskriver villkor. (age>40) && (bodyType == OVERWEIGHT) // parenteser för att klargöra vad som menas är sant endast då värdet på variabeln age är större än 40 OCH värdet på bodyType är lika med OVERWEIGHT (som nog är en konstant variabel).
if
if-satser (statements) används för att utföra operationer bara om ett villkor är uppfyllt. Syntaxen för en if-sats är:
if (villkor) {
// flera programsatser tex.
cout << "Inne i if-satsens kropp" << endl;
}
I koden ovanför kommer raderna mellan klamrarna ("måsvingar" {}) att utföras bara om villkoret inom parentesen efter if är sant. Man kan även vilja göra något annat om villkoret inte är uppfyllt.
if((age>40) && (bodyType == OVERWEIGHT)) {
cout << "Personen är i riskzonen" << endl;
} else {
cout << "Ingen fara på taket" << endl;
}
Man kan också välja att stapla if satser på varandra.
if(villkor) {
// gör saker
} else if(ettAnnatVillkor) {
// gör andra saker
} else if(ettTredjeVillkor) {
// annat
} else {
// om inget villkor ovan är uppfyllt
}
En viktig detalj är att villkoren i en if-sats inte kommer göra fler jämförelser än nödvändigt Så om personen inte är över 40 år körs inte ens testet om han är överviktig och en operation sparas in.
Slingor
while
while-slingan (loopen) har följande syntax
while(villkor) {
// flera programsatser tex
cout << "Görs varje varv" << endl;
}
Här kommer koden mellan klamrarna göras så länge som villkoret är uppfyllt. While används oftast när man inte vet exakt hur länge man kommer upprepa sig.
int number = 0;
while(number > 0) {
cout << "Talet är " << number << endl;
cout << "Mata in ett nytt tal :";
cin >> number;
cout << endl;
}
Slingan ovan bryts först när användaren matar in ett nagativt tal.
for
for-slingor används oftast istället för while när man vet innan hur länge en sak måste upprepas.
Syntaxen är
for(initiera;villkor;varjeVarv) {
// programsatser
}
Initiera är en sats som görs första gången innan slingan körs. Villkor anger att slingan ska köras så länge villkoret är uppfyllt.
varje varv anger en operation som ska utföras varje varv efter slingan. Exempelvis kan man gå igenom alla tal i en array.
int length = 4;
int tal[length] = {2,4,6,8};
for(int i = 0;i < length;i++) {
cout << tal[i] << " är på plats " << i << endl;
}
Koden ovanför kommer att skriva ut talen i arrayen ett efter ett tills i är lika med 4. Då kommer slingan avbrytas och vi kommer alltså inte försöka skriva ut tal[4] som ju inte är definierat (eftersom arrayer är nollräknade). i++ är ett kortsätt att skriva i = i + 1. (för dom som är petiga kan man även skriva det ++i som i många fall är effektivare eftersom en temporär variabel inte behöver skapas. Men detta är överkurs och förvirrar nog bara just nu.)
Utbytbara
Man kan göra precis samma saker med while och for-slingor, det är bara en fråga om tycke och smak. Själv tycker jag som sagt att while används när man inte vet exakt hur länge man ska göra något medans for används för att tex gå igenom alla element i någon lista. While-slingan ovan kan skrivas
int number = 0;
for(;number > 0;) { //tom initiering och varjeVarv
cout << "Talet är " << number << endl;
cout << "Mata in ett nytt tal :";
cin >> number;
cout << endl;
}
Precis som for-slingan tidigare kan skrivas som
int length = 4;
int tal[length] = {2,4,6,8};
int i = 0;
while(i < length) {
cout << tal[i] << " är på plats " << i << endl;
i++;
}
En nackdel med while-versionen ovan är att variabeln i nu är definierad i hela kodsnutten och inte bara inom slingan. Men det är också överkurs.
0 Kommentarer