Kontrollanweisungen Flashcards
Auswahlanweisungen, Iterationsanweisungen, Terminierung, Blöcke, Sichtbarkeit, Lokale Variablen, Spuranweisungen.
Welches sind die beiden Auswahlanweisungen und wozu sind sie gut?
Auswahlanweisungen realisieren Verzweigungen im Programm. Es existieren:
- 𝚒𝚏-Anweisung
- 𝚒𝚏-𝚎𝚕𝚜𝚎-Anweisung
Wie sieht die Anatomie einer 𝚒𝚏-Anweisung aus, d.h. aus welchen “Teilen” besteht die Anweisung? Was macht die Anweisung?
𝚒𝚏 (𝚌𝚘𝚗𝚍𝚒𝚝𝚘𝚗) {𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝}
Das 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 wird ausgeführt, wenn die 𝚌𝚘𝚗𝚍𝚒𝚝𝚘𝚗 wahr ist. Somit ist 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 eine beliebige Anweisung, die 𝚌𝚘𝚗𝚍𝚒𝚝𝚘𝚗 muss jedoch nach 𝚋𝚘𝚘𝚕 konvertierbar sein.
Wie sieht die Anatomie einer 𝚒𝚏-𝚎𝚕𝚜𝚎-Anweisung aus, d.h. aus welchen “Teilen” besteht die Anweisung? Was macht die Anweisung?
𝚒𝚏 (𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗)
{𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 𝟷}
𝚎𝚕𝚜𝚎
{𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 𝟸}
Das 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 𝟷 wird ausgeführt, wenn 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 wahr ist, andernfalls wird 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 𝟸 ausgeführt. Wiederum können 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 beliebige Anweisungen sein, während 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 nach 𝚋𝚘𝚘𝚕 konvertierbar sein muss.
Was sind Iterationsanweisungen, welche existieren und wozu sind sie gut?
Die drei Iterationsanweisungen 𝚏𝚘𝚛, 𝚠𝚑𝚒𝚕𝚎 und 𝚍𝚘 realisieren Schleifen, so kann man z.B. Summen berechnen oder Prozesse wiederholen.
Wie sieht die Anatomie einer 𝚏𝚘𝚛-Anweisung aus, d.h. aus welchen “Teilen” besteht die Anweisung? Was macht die Anweisung?
𝚏𝚘𝚛 (𝚒𝚗𝚒𝚝 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝; 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗; 𝚎𝚡𝚙𝚛𝚎𝚜𝚜𝚒𝚘𝚗)
{𝚋𝚘𝚍𝚢 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝}
Das 𝚒𝚗𝚒𝚝 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 ist eine Ausdrucks-, Deklarations- oder Nullanweisung, z.B. zur Deklaration einer Laufvariable 𝚒 = 𝟷.
Solange die 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 wahr ist, wird das 𝚋𝚘𝚍𝚢 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 ausgeführt. Ist die 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 falsch, terminiert die Schleife. Somit muss 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 einen boolschen Wert besitzen.
Die 𝚎𝚡𝚙𝚛𝚎𝚜𝚜𝚒𝚘𝚗 ändert einen Wert, der in der 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 vorkommt, so funktioniert es überhaupt, dass die 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 von wahr zu falsch wechseln kann.
Wie würde eine 𝚏𝚘𝚛-Anweisung aussehen, die die Summe aller Zahlen von 1 bis 100 berechnet?
𝚏𝚘𝚛 (𝚒=𝟷; 𝚒<=𝟷00; 𝚒++)
𝚊 += 𝚒;
𝚜𝚝𝚍::𝚌𝚘𝚞𝚝 «_space;𝚊;
Anmerkung: Falls nur eine Anweisung im Rumpf steht, können die geschweiften Klammern weggelassen werden.
Wie würde ein Programmausschnitt mit einer 𝚏𝚘𝚛-Anweisung aussehen, die für eine eingegebene Zahl 𝚗 des Typs 𝚒𝚗𝚝 berechnet, ob es eine Primzahl ist oder nicht, und das Ergebnis wieder ausgibt?
𝚜𝚝𝚍::𝚌𝚒𝚗»_space; 𝚗;
𝚏𝚘𝚛 (𝚒 = 𝟸; 𝚗 % 𝚒 != 0; ++𝚒);
𝚒𝚏 (𝚒 != 𝚗)
𝚜𝚝𝚍::𝚌𝚘𝚞𝚝 «_space;𝚗 «_space;” 𝚒𝚜 𝚗𝚘𝚝 𝚙𝚛𝚒𝚖𝚎.”;
𝚎𝚕𝚜𝚎
𝚜𝚝𝚍::𝚌𝚘𝚞𝚝 «_space;𝚗 «_space;” 𝚒𝚜 𝚙𝚛𝚒𝚖𝚎.”;
Bemerke, dass die 𝚒𝚏-𝚎𝚕𝚜𝚎-Anweisung erst aufgerufen wird, nach dem die 𝚏𝚘𝚛-Schleife terminiert hat (Semikolon hinter der Schleife).
Was sind Blöcke und wozu sind sie gut?
Eine Gruppierung einer oder mehrerer Anweisungen ist ein Block. Sie verhelfen zu einer logischen Programmstruktur und man kann mit ihnen mächtige und doch lesbare Kontrollanweisungen erschaffen.
Weshalb können Blöcke Probleme bei der Deklaration von Variablen erschaffen?
Was in einem Block deklariert wird, gilt zwar für den Block und alle “Unterblöcke”, jedoch nicht für den grösseren Block. Man könnte sagen, die “Blickrichtung” sei von rechts nach links. Wird also eine Variable in einem Block deklariert und man verwendet sie später ausserhalb des Blocks wieder, wird es zu einem Fehler kommen.
Betrachte folgendes Programm:
𝚒𝚗𝚝 𝚖𝚊𝚒𝚗 () { 𝚏𝚘𝚛 (𝚞𝚗𝚜𝚒𝚐𝚗𝚎𝚍 𝚒𝚗𝚝 𝚒 = 0; 𝚒 < 𝟷0; ++𝚒) 𝚜 += 𝚒; 𝚜𝚝𝚍::𝚌𝚘𝚞𝚝 << 𝚒; 𝚛𝚎𝚝𝚞𝚛𝚗 0; }
Weshalb wird es hier unvermeidlich zu einem Fehler kommen und was wird der Fehler sein?
Da 𝚒 nur innerhalb der 𝚏𝚘𝚛-Anweisung deklariert wurde und Schleifen die gleiche strukturelle Auswirkung haben wie Blöcke, wird der Compiler melden, dass ein undeklarierter Name (𝚒) verwendet wurde.
Betrachte folgendes Programm:
𝚒𝚗𝚝 𝚖𝚊𝚒𝚗 () { 𝚒𝚗𝚝 𝚒 = 𝟸; 𝚏𝚘𝚛 (𝚞𝚗𝚜𝚒𝚐𝚗𝚎𝚍 𝚒𝚗𝚝 𝚒 = 0; 𝚒 < 𝟷0; ++𝚒) 𝚜 += 𝚒; 𝚜𝚝𝚍::𝚌𝚘𝚞𝚝 << 𝚒; 𝚛𝚎𝚝𝚞𝚛𝚗 0; }
Was wird das Programm ausgeben und warum?
Der Output dieses Programms lautet:
0𝟷𝟸𝟹𝟺𝟸
Man betrachte, dass hier zwei verschiedene 𝚒 deklariert wurden, die sich aber beide nicht überschneiden. Somit funktioniert das Programm, und es werden zuerst die in der 𝚏𝚘𝚛-Anweisung deklarierten 𝚒 ausgegeben und dann das im grösseren Block mit 𝚒𝚗𝚝 𝚒 = 𝟸 deklarierte 𝚒.
Wie funktioniert das Konzept der “automatischen Speicherdauer” von lokalen Variablen?
Lokale Variablen (Deklaration in Block) werden bei jedem Erreichen ihrer Deklaration neu angelegt, d.h. ein Speicher / eine Adresse wird zugewiesen. Am Ende ihrer deklarativen Region wird der Speicher wieder freigegeben und die Adresse wird ungültig.
Wie sieht die Anatomie einer 𝚠𝚑𝚒𝚕𝚎-Anweisung aus, d.h. aus welchen “Teilen” besteht die Anweisung? Was macht die Anweisung?
𝚠𝚑𝚒𝚕𝚎 (𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗)
{𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝}
Das 𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝 - eine beliebige Anweisung - wird solange ausgeführt, wie 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 - ein boolscher Wert - wahr ist. Ist 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 falsch, terminiert die Schleife.
Wie kann man eine 𝚠𝚑𝚒𝚕𝚎-Anweisung in eine 𝚏𝚘𝚛-Anweisung konvertieren, d.h., wie sind die beiden Anweisungen äquivalent zueinander?
𝚠𝚑𝚒𝚕𝚎 (𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗) {𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝} ⇔ 𝚏𝚘𝚛 ( ; 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗; ) {𝚜𝚝𝚊𝚝𝚎𝚖𝚎𝚗𝚝}
In welchen Fällen eignet sich die 𝚠𝚑𝚒𝚕𝚎-Anweisung besser als die 𝚏𝚘𝚛-Anweisung?
Meist verwendet man eine 𝚏𝚘𝚛-Schleife, wenn der “Fortschritt”, also die 𝚎𝚡𝚙𝚛𝚎𝚜𝚜𝚒𝚘𝚗, die die 𝚌𝚘𝚗𝚍𝚒𝚝𝚒𝚘𝚗 verändert, ziemlich simpel ist, wie z.B. ++𝚒.
Ist hingegen die 𝚎𝚡𝚙𝚛𝚎𝚜𝚜𝚒𝚘𝚗 sehr komplex, eignet sich eher eine 𝚠𝚑𝚒𝚕𝚎-Anweisung, da sie besser lesbar sein wird.