Control–statements

"Eigentliches Programmieren" braucht Kontrollstrukturen:
Bedingungen testen und ggf. ausführen,
Zähl–Schleifen, Endlosschleifen, etc.

if–else:
if ( expr ) { statements }

if ( expr ) { statements_1 } else { statements_2 }





       ...
       if ( a < b ) {  // einfaches if, auch ohne {} 
          a = b;       // wenn nur ein Befehl folgt
       }              // (gefaehrlich!)
       ...
       if ( a < b ) {
          a = b;     
       }
       else {
          b = a;
       }
       ...
       if ( a < b ) {
          a = b;     
       }
       else if ( a > b ) {
          b = a;
       }
       else if ( a == b ) {
          ...
       }
       else {  // wenn alles andre fehlschlaegt ..
     cout << "What else could I test ?" << endl;
       }




for–loops:
for ( expr1; expr2; expr3 ) { statements }



 for ( int i = 0; i < MAX; i++ ) { // Standard
    a[i] = i*i;                     // Abzaehlschleife
    sum += i;
 }
 for ( int i = 0; i < N; i++ ) { // Verschachtelte Schleifen
   for ( int j = i; j < M; j++ ) { // 
     a[i][j] = i*j;                     
   }
 }
 char *text = "Donaudampfschiffahrtsgesellschafts"
              "kapitaenskajuetenblumenvase";
 int count = 0;
 for (char *p = text; *p; p++ ) {
    count ++;
 }
 cout << count << " Buchstaben in " << text << endl;



for-each

Neu mit C++-11: Vereinfachte Schleife über Container mit direktem Zugriff auf jedes Element (for-each Loop in anderen Sprachen), z.B.

// C++ 11
  vector<double> vec1 = { 1., 0.7, 1.8, 2e-3 }; ..// fill vec1 .....
// ... then loop over it
  for( double x : vec1 ) { // iterate over each element in vec1
    cout << x;
};
  for( auto x : vec1 ) { // even more simple using auto for type
    cout << x;
};

// C++ 03
  vector<double> vec1; ..// fill vec1 .....
// ... then loop over it
  for(int i=0; i<vec1.size(); i++) {
    cout << vec1[i];
};


while–loops:
while ( expr2 ) { statements }
analog zu for ( ; expr; )
statements werden ausgeführt wenn expr2 true.

do { statements } while ( expr2 ) ;
Unterschied: statements werden mindestens einmal ausgeführt.


 ...
 string buffer, line;
 while ( cin >> line )  { // read from stdin until EOF
    buffer += line;  // append to buffer
 }
 ....
 int count = 0;
 do { // read from stdin until EOF
    count ++; // zaehlen
 } while ( cin >> line );



break/continue :
Innerhalb des statements Blocks von for bzw. while Schleifen kann man mit



 for ( ; true; ) { // Endlosschleife
    ...
    if ( ... ) continue;  // Springt ans Ende der Schleife
    if ( ... ) break;  // Springt aus der Schleife raus
    ...
 } // end of loop

In C/C++ gibt es auch noch die goto Anweisung, mit der man an beliebige Stellen im Programm springen kann. Verwendung möglichst vermeiden ( \bgroup\color{green}\ensuremath{\Rightarrow}\egroup Spaghetti–Code)



switch/case :

Variante von if/else ist die switch/case Kontrollstruktur:




  char response;
  cin >> response;
  switch(response) {
    case 'a' : cout << "you choose 'a'" << endl;
               break;
    case 'b' : cout << "you choose 'b'" << endl;
               break;
    case 'c' : cout << "you choose 'c'" << endl;
               break;
    case 'x' : 
    case 'q' : cout << "exiting/quitting menu" << endl;
               quit = true;
               break;
    default  : cout << "Please use a,b,c or q!"
               << endl;
  }


break nötig um switch Block zu beenden, ansonsten werden Anweisungen nach weiteren case ausgeführt.

default: wird immer ausgeführt (soweit vorhanden und nicht vorher mit break beendet).