Teil 10 „If...“

Der C-Kurs
Antworten
Benutzeravatar
bodo
User
Beiträge: 319
Registriert: 14.02.2007, 17:21
Kontaktdaten:

Teil 10 „If...“

Beitrag von bodo » 30.10.2010, 16:05

C für BASIC-Programmierer

Arbeiten mit dem z88dk Cross-Compiler

von Jens Sommerfeld und Bodo Wenzel

Teil 10

Bisher können wir nur Programme schreiben, die einfach geradeaus durchlaufen. Deshalb wird es höchste Zeit für das Kapitel 10: „If...“ , mit dessen Stoff ein Programm Entscheidungen fällen kann.

Beginnen wir mit einem Beispiel:

Code: Alles auswählen

#include <stdio.h>
#include <string.h>

int main(void) {
    char eingabe[20];

    puts("SOLL ICH EINEN WITZ ERZAEHLEN?");
    gets(eingabe);
    if (strcmp(eingabe, "HAU AB") == 0) {
        puts("\nSCHON GUT, ICH LASSE ES.");
    } else {
        int wert;

        puts("\nWIEVIELE SEITEN HAT EINE GITARRE?");
        gets(eingabe);
        sscanf(eingabe, "%d", &wert);
        if (wert == 6) {
            puts("\nJA, RICHTIG.");
        } else {
            puts("\nNEE, 6: OBEN, UNTEN, RECHTS,");
            puts("        LINKS, VORNE, HINTEN.");
        }
    }

    return 0;
}
Für das Programmieren von Entscheidungen gibt es nur zwei Schlüsselworte: „if“ und „else“. Das einfache „if“ kennt ihr vom BASIC schon: wenn die angegebene Bedingung wahr ist, wird etwas ausgeführt, sonst nicht.

In C wird nach dem „if“ ein Ausdruck in runden Klammern angegeben. Durch die Klammern ist klar, was alles zu dem Ausdruck gehört, daher ist kein Schlüsselwort wie „then“ nötig. Innerhalb der runden Klammern könnt ihr einen beliebigen (ganzzahligen) Ausdruck formulieren; wenn er einen Wert ungleich 0 (Null) ergibt, gilt er als „wahr“, ein Wert gleich 0 ist „falsch“.

Das, was im wahren Fall ausgeführt wird, steht nach der schließenden runden Klammer. Dies kann eine einzelne Anweisung sein, oder ein Anweisungsblock in geschweiften Klammern. Um Probleme und Irrtümer zu vermeiden, solltet ihr immer geschweifte Klammern benutzen, auch wenn nur eine Anweisung kommt. Denn es zählt halt nicht, was der Programmierer sich dachte, oder wie weit eingerückt wurde; es zählt, was der Compiler erkennt!

Wenn es alternative Anweisungen gibt, die im falschen Fall ausgeführt werden sollen, werden diese nach dem Schlüsselwort „else“ angegeben. Auch hier empfiehlt sich die konsequente Anwendung der geschweiften Klammern! Die Angabe von „else“ ist natürlich optional.

Zur Formulierung von logischen Verknüpfungen stellt C einige Operatoren bereit. Hier sind die binären Operatoren, die zwischen zwei Operanden stehen:
  • && Das Ergebnis ist wahr, wenn beide Werte wahr sind. Ansonsten ist das Ergebnis falsch. Dies ist also die logische UND-Verknüpfung, nicht zu verwechseln mit dem Operator „&“, der eine bitweise UND-Verknüpfung ausführt.
  • || Das Ergebnis ist wahr, wenn mindestens einer der beiden Werte wahr ist. Ansonsten ist das Ergebnis falsch. Dies ist also die logische ODER-Verknüpfung, nicht zu verwechseln mit dem Operator „|“, der eine bitweise ODER-Verknüpfung ausführt.
  • == Das Ergebnis ist wahr, wenn beide Werte gleich sind. Ansonsten ist das Ergebnis falsch. Bei BASIC reichte hier ein einzelnes '='.
  • != Das Ergebnis ist wahr, wenn beide Werte ungleich sind. Ansonsten ist das Ergebnis falsch. Bei BASIC lautete dieser Operator '<>'.
  • < Das Ergebnis ist wahr, wenn der erste Wert kleiner als der zweite Wert ist. Ansonsten ist das Ergebnis falsch.
  • > Das Ergebnis ist wahr, wenn der erste Wert größer als der zweite Wert ist. Ansonsten ist das Ergebnis falsch.
  • <= Das Ergebnis ist wahr, wenn der erste Wert kleiner als oder gleich dem zweiten Wert ist. Ansonsten ist das Ergebnis falsch.
  • >= Das Ergebnis ist wahr, wenn der erste Wert größer als oder gleich dem zweiten Wert ist. Ansonsten ist das Ergebnis falsch.
Außerdem gibt es noch einen unären Operator:
  • ! Das Ergebnis ist das Gegenteil des folgenden Wertes. Bei BASIC lautete dieser Operator 'NOT'. Vergleicht den Operator mit dem für „ungleich“.
Es ist übrigens für die Leser eines Quelltextes (und das seid ihr zwei Wochen später selber!) sehr hilfreich, in den runden Klammern des „if“ immer einen Ausdruck zu schreiben, der direkt „wahr“ oder „falsch“ liefert. Nutzt nicht das Wissen, dass der Wert 0 „falsch“ bedeutet! Vergleicht selbst:

Code: Alles auswählen

    /* kurz, aber missverständlich: */
    if (wert) { /* ... */

    /* besser und eindeutig: */
    if (wert != 0) { /* ... */
Innerhalb eines Anweisungsblocks mit geschweiften Klammern braucht übrigens keine Anweisung zu stehen. Ebenso ist ein einzelnes Semikolon eine gültige Anweisung, nämlich die „leere“. Damit sind folgende Konstrukte syntaktisch richtig, von Logik will ich hier nicht reden:

Code: Alles auswählen

    if (dies == das) {
    } else {
        puts("Dies ist ungleich Das.");
    }

    if (zx == 81) ;
    else ;
Der Ausdruck eines „if“ kann natürlich auch einer Variablen zugewiesen werden. Deren Datentyp ist meistens ein „int“, aber viele echte Programme benutzen den Datentyp „bool“ mit den beiden möglichen Werten „false“ und „true“, den man sich zur Not selbst definieren muss. Solch ausgefuchste Konzepte behandeln wir aber erst am Ende...

Besonders professionell ist es schließlich, die Namen dieser Variablen mit „is“ oder „has“ zu beginnen, oder auf deutsch mit „ist“ oder „hat“, z.B. „ist_ok“ oder „hat_handy“.

Hausaufgaben
  1. Was gibt das Programm aus?

    Code: Alles auswählen

    #include <stdio.h>
    
    int main(void) {
        int zahl1;
        int zahl2;
    
        zahl1 = 12;
        zahl2 = 81;
        if (zahl1 > 15)
            puts("Klasse.");
            if (zahl2 < 15)
                puts("Prima.");
        else
            puts("Na, ja.");
    
        return 0;
    }
  2. Gebt das folgende Programm ein und lasst es laufen. Sagt vorher das Ergebnis voraus!

    Code: Alles auswählen

    #include <stdio.h>
    
    int main(void) {
        int ergebnis;
    
        ergebnis = 2 == -4;
        printf("2 == -4 : %d\n", ergebnis);
        ergebnis = !ergebnis;
        printf("!(2 == -4) : %d\n", ergebnis);
        ergebnis = !ergebnis;
        printf("!!(2 == -4) : %d\n", ergebnis);
    
        return 0;
    }
  3. Schreibt den Ausdruck für „wenn A gleich B oder C ist“ hin. Testet ihn mit einem Programm.
  4. In ZX81-BASIC lautet eine Anweisung „LET C=(A AND A>=B)+(B AND A<B)“ und er liefert immer den größeren der beiden Werte A und B. In C geht das nicht... Wie müsstet ihr das schreiben?
  5. Welche Ergebnisse geben die folgenden Ausdrücke? Bitte überlegt euch das im Kopf, bevor ihr es eventuell mit einem Programm ausprobiert!
    1. 1 + 2 * 3
    2. 10 % 3 * 3 – (1 + 2)
    3. (1 + 2) * 3
    4. 5 == 5
    5. x = 5
  6. Mit x = 4, y = 6 und z = 2, welche der Ausdrücke sind wahr bzw. falsch, und warum? Auch hier ist eigenes Nachdenken gefragt, nicht simples Ausprobieren.
    1. x == 4
    2. x != y – z
    3. z = 1
    4. y
  7. Schreibt ein Programm, welches bei einer eingegebenen Anzahl von Punkten die entsprechende Note ausgibt. Dabei gelten folgende Regeln:
    • Mehr als 30 Punkte ergeben die Note 1;
    • 21 bis 30 Punkte ergeben die Note 2;
    • 11 bis 20 Punkte ergeben die Note 3;
    • Weniger als 11 Punkte ergeben die Note 4.
    Beispielausgabe:

    Code: Alles auswählen

    EINGABE DER PUNKTZAHL: 25
    FUER 25 PUNKTE GIBT ES EINE 2.
B0D0: Real programmers do it in hex.

Antworten