Programmieren in C

Arbeitsblatt 2
Kontrollstrukturen und Operatoren

Im letzten Arbeitsblatt hatten Ihre Programme einen geradlinigen Aufbau. Ein Befehl folgte dem anderen, wobei jeder Befehl einen kleinen Teil zur Gesamtaufgabe beisteuerte. Ihr Programm führte jeden Befehl genau einmal aus und beendete sich danach.

Einige Aufgaben in diesem Arbeitsblatt zeigen Ihnen nun, dass diese Möglichkeit für praktische Aufgabenstellungen zumeist nicht ausreicht. Deshalb lernen Sie in dieser Arbeitseinheit, wie Sie die Logik von komplexeren Aufgaben realisieren können, indem Ihr Programm bestimmte Programmteile unterschiedlich häufig und in beliebiger Reihenfolge ausführt. Einen wesentlichen Grundbaustein bilden dabei wenn-dann-Aussagen. Sie ermöglichen Verzweigungen innerhalb Ihres Quellcodes und werden in C mit dem Schlüsselwort if umgesetzt. Mit Schleifen können Sie einen Codeteil mehrmals ausführen lassen. Das Schlüsselwort while implementiert hierfür die Aussage solange, während das Schlüsselwort for die Aussage für jedes realisiert.

Lesen Sie für dieses Arbeitsblatt bitte im Skript die Kapitel 6, 7 und 8

Aufgabe 201
Grundlagen zu if-else-Verzweigungen

Das folgende Programm prüft, ob eine eingegebene Zahl gleich Null ist.

26  #include <stdio.h>
27
28
29  int main()
30  {
31    int zahl = 0;
32
33    printf("Bitte geben Sie eine ganze Zahl ein: ");
34    scanf("%i", &zahl);
35
36    if (zahl == 0) {
37      printf("Sie haben Null eingegeben.\n");
38
39    } else {
40      printf("Sie haben eine Zahl ungleich Null eingegeben.\n");
41
42    }
43  }
  1. Versuchen Sie bitte als erstes, obigen Code zu verstehen. Gehen Sie ihn Schritt für Schritt durch. Compilieren Sie das Programm auch und testen Sie es mit verschiedenen Zahlen. Zur einfacheren Handhabung finden Sie den Code bereits in Brad als Angabe zu Aufgabe 201d.

    Das Programm zeigt eine typische Verwendung der if-Verzweigung. Prägen Sie sich bitte deshalb seine Struktur ein.

  2. Multiple Choice-FrageWelche Bedeutung hat der Operator = in Zeile 31?

    Lösen einer mathematischen Gleichung
    Vergleichen zweier Werte oder Variablen
    Zuweisung eines Wertes an eine Variable
    Prüfen, ob beide Seiten gleich sind

  3. Multiple Choice-FrageWelche Bedeutung hat der Operator == in Zeile 36?

    Vergleichen der linken mit der rechten Seite
    Wert der linken Seite ändern
    Wert der rechten Seite ändern
    Mathematische Gleichung lösen

  4. Programmieraufgabe in BradÄndern Sie das Programm nun so ab, dass es folgende Logik umsetzt: Wenn zahl größer Null ist, dann soll das Programm

    "Sie haben eine Zahl groesser Null eingegeben."
    

    ausgeben. Andernfalls, wenn zahl gleich Null ist, dann soll das Programm

    "Sie haben Null eingegeben."
    

    ausgeben. Andernfalls soll das Programm

    "Sie haben eine Zahl kleiner Null eingegeben."
    

    ausgeben. Setzen Sie bitte genau die Struktur um, welche durch die Wörter wenn, dann und andernfalls vorgegeben ist.

Icon für C-Quellcode-Datei

Aufgabe 202
Übersetzen römischer Ziffern in arabische Zahlen

Das folgende Programm übersetzt eine römische Zahl, die nur aus einem einzelnen Zeichen besteht, in unser (arabisches) Ziffernsystem. Unten finden Sie die Übersetzungstabelle.

26  #include <stdio.h>
27  
28  
29  int main()
30  {
31    char zeichen = 0;
32  
33  
34    printf("Einstellige roemische Ziffer: ");
35    scanf(" %c", &zeichen);
36  
37    if (zeichen == 'I') {
38      printf("Der Wert betraegt 1.\n");
39  
40    } else if (zeichen == 'V') {
41      printf("Der Wert betraegt 5.\n");
42  
43    } else if (zeichen == 'X') {
44      printf("Der Wert betraegt 10.\n");
45  
46    } else if (zeichen == 'L') {
47      printf("Der Wert betraegt 50.\n");
48  
49    } else if (zeichen == 'C') {
50      printf("Der Wert betraegt 100.\n");
51  
52    } else if (zeichen == 'D') {
53      printf("Der Wert betraegt 500.\n");
54  
55    } else if (zeichen == 'M') {
56      printf("Der Wert betraegt 1000.\n");
57  
58    } else {
59      printf("Es wurde keine roemische Ziffer eingegeben.\n");
60    }
61  }
  1. Versuchen Sie zuerst, den Quellcode zu verstehen. Compilieren Sie ihn dazu und probieren Sie das Programm mehrfach aus. Sie finden den Quellcode in Brad als Angabe zu Aufgabe 202c.

  2. Multiple Choice-FrageTesten Sie nun das Programm mit den verschiedensten Eingaben. Wo liegen die Schwächen der hier verwendeten scanf-Methode?

    Bitte markieren Sie die korrekten Antworten. Es können mehrere Lösungsmöglichkeiten ausgewählt werden!
    Der Benutzer muss immer ein Leerzeichen vor der römischen Ziffer eingeben
    Das Programm stürzt ab, sobald der Benutzer die Eingabetaste (Enter) drückt
    Der Benutzer kann beliebig viele Zeichen eingeben (das Programm prüft aber dann nur eines)
    Der Benutzer kann Zeichen eingeben, die keine römische Ziffer repräsentieren

  3. Programmieraufgabe in BradSchreiben Sie das Programm so um, dass es die switch-Verzweigung an Stelle der if-else-Verzweigung benutzt.

  4. Multiple Choice-FrageWelche Datentypen verarbeitet eine switch-Verzweigung?

    Bedenken Sie bitte, dass die switch-Verzweigung selbst nur das Ergebnis des Ausdrucks innerhalb der runden Klammern sieht. Trifft der Compiler auf den Code switch(a < b), leitet er nur das Ergebnis des Vergleichs an die switch-Verzweigung weiter, also 0 oder 1. Bei dem Code switch(zahl) leitet er den Wert der Variablen zahl weiter. Dabei konvertiert er bei Bedarf den Wert in den gefragten Datentyp.

    Bitte markieren Sie die korrekten Antworten. Es können mehrere Lösungsmöglichkeiten ausgewählt werden!
    char
    double
    int
    long

  5. Multiple Choice-FrageWelche logischen Verknüpfungen realisiert eine switch-Verzweigung (auf Ebene der Prozessor-Instruktionen)? Bedenken Sie auch hier wieder, dass die switch-Verzweigung nur das Ergebnis des Ausdrucks in runden Klammern sieht.

    Bitte markieren Sie die korrekten Antworten. Es können mehrere Lösungsmöglichkeiten ausgewählt werden!
    Kleiner als
    Kleiner als oder gleich wie
    Gleich wie
    Größer als
    Größer als oder gleich wie

Die folgende Tabelle zeigt die Entsprechungen der römischen Ziffern:

I1
V5
X10
L50
C100
D500
M1000
Icon für C-Quellcode-Datei

Aufgabe 203
Lösen quadratischer Gleichungen

Schreiben Sie in dieser Aufgabe ein Programm, welches eine quadratische Gleichung

a x2 + b x + c = 0

löst.

  1. Programmieraufgabe in BradFragen Sie dazu zuerst die Variablen a, b und c (Gleitkommazahlen) mit den folgenden drei Aufforderungen vom Benutzer ab:

     "a: "
     "b: "
     "c: "
    

    Berechnen Sie dann die Lösung unter Berücksichtigung der drei Fälle: Es gibt keine reelle Lösung, eine reelle Lösung (die doppelte Nullstelle x1_2) und zwei reelle Lösungen (x1 und x2). Geben Sie je nach Fall einen der folgenden Texte aus:

    "Es gibt keine reelle Loesung."
    "Die doppelte Nullstelle lautet x1_2."
    "Die beiden reellen Loesungen sind x1 und x2."
    

    Geben Sie die Lösung mit genau zwei Nachkommastellen aus.

  2. Multiple Choice-FrageKann man diese Aufgabe mit if- und mit switch-Verzweigungen gleichermaßen sinnvoll lösen?

    Ja, man kann die Verzweigung mit einer switch-Anweisung und if-Verzweigungen sinnvoll lösen.
    Nein, es sind nicht beide Verzweigungsformen gleichermaßen sinnvoll.

  3. Multiple Choice-FrageWelches Problem entsteht, wenn Sie in C einen berechneten Gleitkommawert auf Gleichheit mit Null prüfen?

    Der Compiler meldet einen Syntaxfehler (Vergleich double mit int)
    Ein Vergleich ist nur mit Werten ungleich Null möglich
    Die Null ist im IEEE-Gleitkommasystem nicht vorhanden (nur Werte knapp neben Null möglich)
    Wegen der begrenzten Genauigkeit kommt es bei Berechnungen häufig zu kleinen Rundungsfehlern, so dass Gleitkommawerte selten identisch sind trotz einer mathematischen Äquivalenz der Berechnungen

  4. Korrigieren Sie Ihr Programm so, dass es doppelte Nullstellen korrekt erkennt. Testen Sie es dazu mit den Werten

    • a = 1, b = 2,2, c = 1,21 und
    • a = 1, b = 2,2, c = 1,2099.

    Finden Sie auch geeignete Nachbarwerte und eigene Testkombinationen. Das Ziel soll dabei sein, eine Genauigkeit von drei Nachkommastellen zu erreichen.

Zu Ihrer Erinnerung:

Falls die Gleichung beispielsweise zwei Lösungen besitzt, lauten diese

x1 = (-b + sqrt(b*b - 4*a*c)) / (2*a),
x2 = (-b - sqrt(b*b - 4*a*c)) / (2*a).

Die C-Funktion (in math.h)

erg = sqrt(z);

weist dabei der Variablen erg die positive Wurzel von z zu. Das funktioniert (natürlich) nur für positive z.

Icon für C-Quellcode-Datei

Aufgabe 204
Grundlagen zum Modulo-Operator

Das folgende Programm zeigt Ihnen, wie man zu einem Bruch den Wert und den Rest des Quotienten berechnet – die beiden Komponenten einer Ganzzahldivision. Den Kern des Programms bilden der Divisions- (/) und der Modulo-Operator (%).

11  #include <stdio.h>
12
13
14  int main()
15  {
16    int d1, d2;         /* Die Operanden */
17    int division, rest; /* Beide Kompontenten des Ergebnisses */
18
19    /* Operanden einlesen */
20    printf("Dividend: ");
21    scanf("%i", &d1);
22    printf("Divisor: ");
23    scanf("%i", &d2);
24
25    /* Berechnungen durchführen */
26    division = d1 / d2;
27    rest = d1 % d2;
28
29    /* Ergebnis ausgeben */
30    printf("Ganzzahldivision: %i\n", division);
31    printf("Rest: %i\n", rest);
32  }
  1. Versuchen Sie zuerst, den Quellcode zu verstehen. Compilieren Sie ihn dazu und probieren Sie das Programm mehrfach aus. Zur einfacheren Handhabung finden Sie den Code in Brad; Sie brauchen ihn nicht abzugeben.

  2. Multiple Choice-FrageWas berechnet die Modulo-Operation?

    Den Wert einer Ganzzahldivision
    Den Rest einer Ganzzahldivision
    Die Summe aus Wert und Rest einer Ganzzahldivision
    Ein Wertepaar (Tupel) aus Wert und Rest einer Ganzzahldivision

  3. Multiple Choice-FrageAuf welche Datentypen können Sie den Modulo-Operator (%) anwenden?

    Bitte markieren Sie die korrekten Antworten.
    char
    double
    int
    long

  4. Programmieraufgabe in BradIn dieser Teilaufgabe schreiben Sie ein Programm, mit dem der Benutzer prüfen kann, ob ein bestimmtes Jahr ein Schaltjahr ist. Dazu liest es erst eine Jahreszahl vom Benutzer ein, prüft dann, ob dieses Jahr ein Schaltjahr war, und informiert den Benutzer zuletzt über das Ergebnis. Berücksichtigen Sie folgende Regeln für das Schaltjahr:

    • Ein Jahr, dessen Jahreszahl durch 4 teilbar ist, ist ein Schaltjahr ...
    • ..., außer wenn die Jahreszahl durch 100 teilbar ist.
    • Ist die Jahreszahl durch 400 teilbar, dann ist das entsprechende Jahr aber trotzdem ein Schaltjahr (z.B. 1900 ist kein Schaltjahr, 2000 ist ein Schaltjahr).
    • Das angenommene Jahr 0 war kein Schaltjahr.

    Die Ein- und Ausgaben des Programms sind bereits vorgegeben. Sie müssen lediglich die Schaltjahresberechnung hinzufügen; benutzen Sie dazu den Modulo-Operator. Speichern Sie dann das Ergebnis Ihrer Berechnung in der Variablen istSchaltjahr ab! Sie soll 1 (wahr/true) sein, wenn das eingegebene Jahr ein Schaltjahr war und 0 (falsch/false), wenn das eingegebene Jahr kein Schaltjahr war.

    18  #include <stdio.h>
    19
    20
    21  int main()
    22  {
    23    /* Vom Benutzer eingegebene Jahreszahl. */
    24    int jahr = 0;
    25    /* 1, falls jahr ein Schaltjahr ist.
    26       0, falls jahr kein Schaltjahr ist. */
    27    int istSchaltjahr = 0;
    28
    29
    30    printf("Jahreszahl: ");
    31    scanf("%i", &jahr);
    32
    33    /* Berechnen Sie hier, ob jahr ein Schaltjahr ist. */
    34
    35
    36
    37    if (istSchaltjahr == 1) {
    38      printf("%i war ein Schaltjahr.\n", jahr);
    39
    40    } else {
    41      printf("%i war kein Schaltjahr.\n", jahr);
    42    }
    43  }
    
Icon für C-Quellcode-Datei Icon für C-Quellcode-Datei

Aufgabe 205
Grundlagen zu for-Schleifen

Das folgende Programm gibt eine Zahlenreihe aus. Es zeigt eine typische Verwendung der for-Schleife.

14  #include <stdio.h>
15
16
17  int main()
18  {
19    int i = 0;
20    int benutzerZahl = 0;
21
22
23    printf("Ganze Zahl: ");
24    scanf("%i", &benutzerZahl);
25
26    for (i=0; i<benutzerZahl; ++i) {
27      printf(" %2i", i);
28    }
29    printf("\n");
30  }
  1. Versuchen Sie bitte als erstes, obigen Code zu verstehen. Gehen Sie ihn Schritt für Schritt durch. Compilieren Sie das Programm auch und testen Sie es in verschiedenen Abwandlungen. Zur einfacheren Handhabung finden Sie den Code bereits in Brad in der Angabe zu Aufgabe 205b.

    Prägen Sie sich bitte seine Struktur ein, weil Sie sehr grundlegend und häufig ist. Beachten Sie bitte auch den Unterschied zwischen der Benutzereingabe und der maximal ausgegebenen Zahl. Woher kommt dieser Unterschied? Wie groß ist dagegen die Anzahl der ausgegebenen Zahlen?

  2. Programmieraufgabe in BradModifizieren Sie den Code nun so, dass er die Zahlen von der Variablen benutzerZahl bis 33 ausgibt. Die vom Benutzer eingegebene Zahl ist dabei immer kleiner oder gleich 33. Sie brauchen das nicht zu prüfen.

  3. Multiple Choice-FrageWelchen Zweck erfüllt der erste Teil in einer for-Klammer (hier i=0)?

    Eine Reihe von Anweisungen zur Initialisierung der Schleife (Startwerte)
    Eine Reihe von Anweisungen zu Iteration nach jedem Schleifendurchlauf
    Eine Reihe von Anweisungen zum Reset der Schleife nach dem letzten Schleifendurchlauf
    Eine Abbruchbedingung, auf die nach jedem Schleifendurchlauf getestet wird

  4. Multiple Choice-FrageWann bzw. wie oft wird der erste Teil in einer for-Klammer ausgeführt?

    Genau einmal vor dem ersten Schleifendurchlauf
    Vor jedem Schleifendurchlauf
    Nach jedem Schleifendurchlauf
    Genau einmal nach dem letzten Schleifendurchlauf

  5. Multiple Choice-FrageWelchen Zweck erfüllt der zweite Teil in einer for-Klammer (hier i<10)?

    Startbedingung: Wenn diese Bedingung erfüllt ist, wird die Schleife initialisiert
    Abbruchbedingung: Wenn diese Bedingung erfüllt ist, wird die Schleife beendet
    Wiederholbedingung: Wenn diese Bedingung erfüllt ist, wird ein weiterer Schleifendurchlauf durchgeführt

  6. Multiple Choice-FrageWann bzw. wie oft wird der zweite Teil in einer for-Klammer ausgeführt?

    Genau einmal vor dem ersten Schleifendurchlauf
    Vor jedem Schleifendurchlauf
    Nach jedem Schleifendurchlauf
    Genau einmal nach dem letzten Schleifendurchlauf

  7. Multiple Choice-FrageWelchen Zweck erfüllt der dritte Teil in einer for-Klammer (hier ++i)?

    Eine Reihe von Anweisungen zur Initialisierung der Schleife (Startwerte)
    Eine Reihe von Anweisungen zur Iteration nach jedem Schleifendurchlauf
    Eine Reihe von Anweisungen zum Reset der Schleife nach dem letzten Schleifendurchlauf
    Eine Abbruchbedingung, auf die nach jedem Schleifendurchlauf getestet wird

  8. Multiple Choice-FrageWann bzw. wie oft wird der dritte Teil in einer for-Klammer ausgeführt?

    Genau einmal vor dem ersten Schleifendurchlauf
    Vor jedem Schleifendurchlauf
    Nach jedem Schleifendurchlauf
    Genau einmal nach dem letzten Schleifendurchlauf

  9. Multiple Choice-Frage Welches Zeichen trennt diese drei Teile jeweils?

    .
    ,
    :
    ;

  10. Programmieraufgabe in BradBetrachten Sie nochmals den oben gegebenen Code. Schreiben Sie ihn so um, dass er die Zahlen in umgekehrter Reihenfolge ausgibt.

Icon für C-Quellcode-Datei Icon für C-Quellcode-Datei

Aufgabe 206
Ausgabe eines Bitmusters im Speicher

Ihr Programm dieser Aufgabe soll das Bitmuster einer ganzen Zahl (int) ausgeben. Hierfür wenden Sie Bitoperatoren (>> und &) an. Sie sollen aber auch lernen, Algorithmen zuerst in Ihrer Sprache strukturiert zu verbalisieren und dann erst in C zu programmieren.

Wir haben den Algorithmus im Folgenden bereits in verbalisierter Form vorgegeben. In dieser Form ist jeder kleine Einzelschritt in natürlicher Sprache beschrieben. Zur Strukturierung verwenden wir die Begriffe WENN-DANN-ANSONSTEN (if-else), sowie FÜR JEDES (for) und SOLANGE (while oder do-while).

Für das Verständnis des Algorithmus ist die Anordnung der Bits wichtig. Wir betrachten nur den Betrag der Zahl, so dass uns nur die ersten 31 Bits interessieren. Das höherwertigste Bit des Betrags soll dabei Bit 30 und das niederwertigste Bit soll Bit 0 sein. Bit 30 sei bildlich ganz links und Bit 0 ganz rechts angeordnet. Damit lässt sich folgender Algorithmus formulieren:

Gebe "Geben Sie bitte eine Dezimalzahl ein: " aus.

Lese eine ganze Zahl vom Benutzer 
in die Variable "dezimal" ein.


WENN die Zahl "dezimal" kleiner Null ist, 
DANN

  Gebe "Die Zahl muss groesser gleich Null sein!" aus.

  Gebe einen Zeilenumbruch aus.

  Beende das Programm

ENDE DANN


Gebe "Die zugehoerige Binaerzahl lautet: " aus.


FÜR JEDES Bit ab Bit 30 bis Bit 0 in der Variablen "dezimal":

  Verschiebe das Bitmuster der Variablen "dezimal" so, dass das
  aktuelle Bit auf die Position 0 (ganz rechts) gelangt. Das Ergebnis
  wird in der neuen Variablen "aktBit" gespeichert.

  Führe eine bitweise UND-Operation der Variablen "aktBit" mit
  0x00000001 aus. Daraus ergibt sich eine neue Zahl, die wiederum in
  "aktBit" gespeichert wird.

  Gebe nur die Variable "aktBit" aus (ohne Zeilenumbruch).

ENDE FÜR JEDES

Gebe einen Zeilenumbruch aus.
			
  1. Arbeiten Sie obigen Algorithmus durch und versuchen Sie, ihn zu verstehen. Führen Sie den Algorithmus dazu anhand der Zahl 35 beispielhaft auf einem Blatt Papier durch. Das Ergebnis sollte die Bitfolge 0000000000000000000000000100011 sein. Das Lösungsprogramm (206h_loesung) hilft Ihnen, den Algorithmus zu verstehen.

  2. Multiple Choice-FrageWarum werden hier die Bits 0 bis 30 betrachtet?

    Bei int hat der Betrag der Zahl 31 bit, wobei die Verschiebung bei 0 beginnen soll
    30 bit genügen als Genauigkeit für die betrachteten Zahlen
    Bei einem positiven int hat der Wert der Zahl 30 bit, so dass sich eine Schleife von 0 bis 30 ergibt
    Ein int hat 31 bit; der Prozessor nummeriert sie von 0 bis 30

  3. Multiple Choice-Frage Welcher Operator in C verschiebt ein Bitmuster nach links?

    <
    <<
    ||
    \\

  4. Multiple Choice-Frage Welcher Operator in C verschiebt ein Bitmuster nach rechts?

    |
    >
    >>
    \\

  5. Multiple Choice-Frage Welcher ist der Operator für eine bitweise UND-Operation in C?

    %
    &
    /
    |

  6. Multiple Choice-Frage Welcher ist der Operator für eine bitweise ODER-Operation in C?

    %
    &
    /
    |

  7. Multiple Choice-Frage Welchen Zweck hat die bitweise UND-Operation im obigen Algorithmus?

    Wenn beide Seiten wahr sind, dann ist auch das Ergebnis wahr
    Wenn alle Bits 1 sind, dann ist das Ergebnis wahr bzw. 1
    Gibt den Wert des Bit 0 zurück
    Prüft, ob irgendein Bit in aktBit 1 ist

  8. Programmieraufgabe in BradSetzen Sie nun den Algorithmus in der Sprache C um.

Icon für C-Quellcode-Datei

Aufgabe 207
Berechnen von Primzahlen

Eine Primzahl ist eine natürliche Zahl größer 1, die nur durch sich selbst und 1 teilbar ist. In dieser Aufgabe entwickeln Sie einen einfachen Algorithmus, mit dem sich alle Primzahlen bis zu einem vom Benutzer vorgegebenen Obergrenze (Maximum) berechnen lassen.

Lesen Sie also zuerst die Obergrenze vom Benutzer ein. Verwenden Sie dazu die Aufforderung

"Bitte geben Sie die Obergrenze ein: "

Die Eingabe ist größer 1; Sie brauchen das nicht zu prüfen. Berechnen Sie als Nächstes schrittweise bei 2 beginnend alle Primzahlen bis einschließlich der Obergrenze. Geben Sie diese dann der Reihe nach mit dem Formatstring "%5i" aus. Schließen Sie Ihre Ausgabe am Ende mit einem Zeilenumbruch ab.

  1. Berechnen Sie zuerst für sich beispielhaft alle Primzahlen bis einschließlich 20 auf einem Blatt Papier.

  2. Fassen Sie Ihr Vorgehen als Nächstes in Worte. Benutzen Sie dazu wenn-dann- und für jedes-Aussagen, sowie mathematische Gleichungen. Zerteilen Sie dabei Ihr intuitives Vorgehen in kleine Schritte und verbalisieren Sie es auf diese Weise.

  3. Programmieraufgabe in BradRealisieren Sie nun den Algorithmus (das Vorgehen) der letzten Teilaufgabe in C. Verbessern Sie Ihr Programm, falls es noch Fehler enthält.

  4. Wenn Sie den fertigen Algorithmus von Teilaufgabe c mit dem Ansatz von Teilaufgabe b vergleichen, gibt es nun Unterschiede zwischen beiden Algorithmen? Woher kommen Sie? Welche Konsequenzen ergeben sich für das Entwicklen von Programmen?

In dieser Aufgabe geht es darum, sich mit verschachtelten Schleifen und dem Modulo-Operator vertraut zu machen. Die Primzahlberechung ist nur ein Beispiel. Natürlich gibt es für dieses sehr berühmte Problem komplexe, hoch optimierte Algorithmen. Zwei gute und dennoch einfache Algorithmen zur Primzahlberechnung sind beispielsweise das Sieb des Eratosthenes und das Sieb des Atkin. Sie setzen aber nicht das didaktische Ziel dieser Aufgabe um.

Icon für C-Quellcode-Datei

Aufgabe 208
Grundlagen zu while

Der folgende Code zeigt ein einfaches Menü. Es wird typischerweise mit einer do-while-Schleife realisiert.

Neben der Verwendung der while- und do-while-Schleife soll diese Aufgabe auch die Äquivalenz der verschiedenen Schleifenformen zeigen. Jede for-Schleife lässt sich in eine while-Schleife und eine do-while-Schleife umformen. Tatsächlich verwenden sollten Sie aber diejenige Schleifenart, die für einen menschlichen Leser den programmierten Sachverhalt am besten ausdrückt.

14  #include <stdio.h>
15
16
17  int main()
18  {
19    char antwort = 'd';
20
21
22    do {
23      printf("\n");
24      printf("Menü\n");
25
26      printf("a)  Mensa Innenstadt\n");
27      printf("b)  Steinheil\n");
28      printf("c)  Thai Magie\n");
29      printf("d)  Beenden\n");
30      printf("\n");
31
32      printf("Bitte wählen Sie eine Aktion aus: ");
33      scanf(" %c", &antwort);
34
35      if (antwort == 'a' || antwort == 'A') {
36        printf("Es gibt Krautspaetzle. Verdauungsschlaf am Nachmittag.\n");
37
38      } else if (antwort == 'b' || antwort == 'B') {
39        printf("Grosses Schnitzel mit Bratkartoffeln.\n");
40
41      } else if (antwort == 'c' || antwort == 'C') {
42        printf("Menue 503. Es lebe die Mikrowelle.\n");
43      }
44    } while (antwort != 'd' && antwort != 'D');
45  }
  1. Versuchen Sie bitte als erstes, obigen Code zu verstehen. Gehen Sie ihn Schritt für Schritt durch. Compilieren Sie das Programm auch und testen Sie es mit verschiedenen Eingaben. Zur einfacheren Handhabung finden Sie den Code bereits in Brad in der Angabe zu Aufgabe 208d.

    Prägen Sie sich bitte seine Struktur ein, weil Sie sehr grundlegend und häufig ist.

  2. Multiple Choice-Frage Was ist der wesentliche Unteschied zwischen einer while- und einer do-while-Schleife?

    Bei while wird erst die Bedingung geprüft und dann die Schleife durchlaufen, bei do-while ist es umgekehrt
    Bei while ist die Bedingung eine Abbruchbedingung, bei do-while dagegen eine Wiederholbedingung
    Bei while braucht man mehr Strichpunkte als bei do-while
    Eine while-Schleife kann nur eine Anweisung wiederholen, eine do-while-Schleife dagegen mehrere

  3. Multiple Choice-Frage Was steht innerhalb der runden Klammern einer while-Schleife?

    Die Initialisierungsanweisungen
    Eine Bedingung, welche zum Abbruch der Schleife führt, wenn sie wahr ist
    Eine Bedingung, welche zum Abbruch der Schleife führt, wenn sie falsch ist
    Inkrementierungsanweisungen für jeden Schleifendurchlauf

  4. Programmieraufgabe in BradSchreiben Sie obigen Code so um, dass er eine while-Schleife anstelle der do-while-Schleife benutzt.

  5. Multiple Choice-Frage Welchem Feld innerhalb der runden Klammern einer for-Schleife entspricht der Ausdruck innerhalb der runden Klammern einer while-Schleife?

    Dem ersten
    Dem zweiten
    Dem dritten

  6. Programmieraufgabe in BradSchreiben Sie obigen Code so um, dass er eine for-Schleife anstelle der do-while-Schleife benutzt.

Icon für C-Quellcode-Datei Icon für C-Quellcode-Datei

Aufgabe 209
Mehrfache Kugelberechnungen

  1. Programmieraufgabe in BradErweitern Sie Ihr Programm zur Berechnung von Kugeloberfläche und -volumen (Aufgabe 105) so, dass so lange weitere Kugeln berechnet werden können, bis der Radius 0.0 eingegeben wird. Geben Sie hierfür zu Anfang Ihres Programms folgenden Hinweis für den Benutzer gefolgt von einer Leerzeile aus (vgl. Lösungsprogramm):

    "Geben Sie als Radius 0 ein, um das Programm zu beenden."
Icon für C-Quellcode-Datei

Zuletzt geändert am 18.10.2010
XHTML 1.0 Strict und CSS 2