Teil 24 „Counting on your fingers“

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

Teil 24 „Counting on your fingers“

Beitrag von bodo » 02.01.2011, 15:44

C für BASIC-Programmierer

Arbeiten mit dem z88dk Cross-Compiler

von Jens Sommerfeld und Bodo Wenzel

Teil 24

Das Kapitel 24 heißt bei Vickers „Counting on your fingers“ und behandelt binäres und hexadezimales Zählen. Das können wir aber alle (oder etwa nicht?!) und es ist auch nicht wirklich spezifisch für eine bestimmte Programmiersprache. Bevor wir in den letzten Teilen zu einem richtigen Endspurt ansetzen, gibt es daher dieses Mal eine bunte Sammlung von...

Hausaufgaben
  1. Zunächst könnt ihr ein paar einfache Programme schreiben:
  2. Schreibt ein Programm, das den Benutzer nach zwei Zahlen fragt, und dann alle Zahlen von der eingegebenen ersten bis zur letzten einschließlich ausgibt.
  3. Schreibt ein Programm, welches die Länge, Breite und Höhe eines Quaders einliest und das Volumen ausgibt! Beispielausgabe:

    Code: Alles auswählen

    EINGABE DER LAENGE: 2
    EINGABE DER BREITE: 5
    EINGABE DER HOEHE: 4
    DAS VOLUMEN BETRAEGT 40.
  4. Schreibt ein Programm, welches den Benutzer fragt, ob er weitermachen will. Es werden als Antworten nur die Zeichenketten "JA" und "NEIN" akzeptiert. Zum Start des Programms soll die Ausgabe "1. VERSUCH" erscheinen. Bei jedem weiteren "JA" erscheint der nächste Versuch ("2. VERSUCH", "3. VERSUCH", ...).
  5. Schreibt ein Programm, welches alle "r" und "R" eines eingegebenen Satzes (maximal 31 Zeichen) in "l" und "L" umwandelt. Dies ergibt dann einen Satz, welcher ausgesprochen sich anhört, wie Deutsch mit chinesischem Akzent.
  6. Schreibt eine Funktion "tausch", welche den Inhalt zweier übergebener Variablen vertauscht. Schreibt ein dazugehöriges Hauptprogramm zum Testen. Hinweis: Übergebt die Adressen der beiden Zahlen und arbeitet dann mit den Zeigern.
  7. Schreibt eine rekursive Funktion, die die Potenz von 3 zur übergebenen Zahl berechnet. Wenn beispielsweise 4 übergeben wird, soll die Funktion 81 zurückgeben. Testet die Funktion mit einem Programm.

    Die folgenden Programme sind etwas schwieriger:
  8. Schreibt ein Programm, welches eine Anfangszahl und eine Endzahl einliest. Sorgt dafür, dass die Anfangszahl kleiner als die Endzahl ist! Ausgegeben werden soll jede dritte Zahl, die sich zwischen der Anfangszahl und der Endzahl befindet. Benutzt dazu:
    1. eine while-Schleife
    2. eine do-while-Schleife
    3. eine for-Schleife
    Beispielausgabe:

    Code: Alles auswählen

    EINGABE DER ANFANGSZAHL: 1
    EINGABE DER ENDZAHL: 15
    ZAHLEN DAZWISCHEN: 2 5 8 11 14
  9. Schreibt ein Programm, das vom Nutzer beliebig viele Zahlen eingeben läßt. Nach Eingabe einer 0 soll die Eingabe beendet werden. Ausgegeben werden sollen die Anzahl der eingegebenen Zahlen, die Summe der eingegebenen Zahlen und der (ganzzahlige und gerundete) Durchschnitt aller eingegebenen Zahlen. Achtung! Die eingegebene 0 soll nicht mit in die Berechnung einfließen! Beispielausgabe:

    Code: Alles auswählen

    EINGABE (0 BRICHT AB): 1
    EINGABE (0 BRICHT AB): 2
    EINGABE (0 BRICHT AB): 3
    EINGABE (0 BRICHT AB): 0
    EINGEGEBENE ZAHLEN: 3
    SUMME: 6
    DURCHSCHNITT: 2
  10. Schreibt eine Funktion "ggt", welche den größten gemeinsamen Teiler zweier ganzer Zahlen berechnet. Die Zahlen sollen vom Programm übergeben werden und der größte gemeinsame Teiler zurückgegeben werden. Hinweis: Die Funktion muss rekursiv sein.
  11. Schreibt ein Programm, das eine beliebige Anzahl von Noten einliest. Die Anzahl soll beim Programmstart vom Nutzer abgefragt werden. Das Programm soll folgende Aufgaben erfüllen:
    • Einlesen der Noten;
    • Bestimmen von Minimum und Maximum;
    • Berechnung des (ganzzahligen, abgerundeten) Durchschnittswertes;
    • Anzeigen einer Liste aller Noten mit Durchschnitt, Minimum und Maximum.
    Realisiert das ganze Programm mit dynamischer Speicherverwaltung.
  12. Schreibt eine Funktion namens "add_arrays", die zwei Arrays derselben Größe übergeben kriegt. Sie soll dann die Elemente der beiden Arrays mit demselben Index addieren und die Summen in einem übergebenen dritten Array gleicher Größe ablegen. Zum Testen schreibt ihr ein Programm, das die Werte aller drei Arrays nach getaner
    Arbeit tabellarisch ausgibt. Tipp: Die Funktion bekommt die Adressen des ersten Elements jedes Array übergeben.
  13. Zum Debuggen ist eine Fehlerroutine nützlich, die eine Fehlernummer, eine Zeilennummer und den Modulnamen bekommt. Diese Routine soll eine Fehlermeldung formatieren und ausgeben und dann das Programm beenden. Benutzt beim Aufruf die vordefinierten Makros des Präprozessors. So sieht eine Beispielausgabe aus:

    Code: Alles auswählen

    CFBASIC_24-C.C (ZEILE 2): FEHLER 17
    Wo wir gerade bei der Fehlersuche sind, bei den folgenden Aufgaben könnt ihr eure analytischen Fähigkeiten schulen:
  14. Findet heraus, was verkehrt ist:
    1. Gibt nichts aus:

      Code: Alles auswählen

          for (x = 10; x == +20; x += 1)
              printf("%d\n", x);
    2. Läuft endlos:

      Code: Alles auswählen

          for (x = 10; x < 30; x = +20)
              printf("%d\n", x);
    3. Läuft auch endlos:

      Code: Alles auswählen

          for (x = 10; x + 20; x = 30)
              printf("%d\n", x);
  15. Warum wird zahl2 nicht wie erwartet hochgezählt?

    Code: Alles auswählen

    #include <stdio.h>
    
    int main(void) {
        int zahl1 = 0;
        int zahl2 = 0;
    
        while ((zahl1++ < 5) || (zahl2++ < 5)) {
            printf("ZAHL1=%d ZAHL2=%d\n", zahl1, zahl2);
        }
    
        return 0;
    }
  16. Was ist falsch am folgenden Quelltextstückchen?

    Code: Alles auswählen

        record = 0;
        while (record < 100) {
            printf("\nEINTRAG %d ", record);
            printf("\nHOLE NAECHSTEN EINTRAG...");
        }
  17. Das folgende Programm hat ein Problem. Versucht, es zu erkennen, bevor ihr es eingebt und probeweise compiliert. Welche Zeile verursacht den Fehler?

    Code: Alles auswählen

    #include <stdio.h>
    
    int main(void) {
        printf("DAS IST EIN PROGRAMM ");
        do_it("MIT EINEM PROBLEM!");
    
        return 0;
    }
  18. Was gibt das folgende Programm aus? Erst nachdenken, dann ausprobieren! Wenn es Unterschiede zwischen eurer Vorhersage und der tatsächlichen Ausgabe gibt, korrigiert das Programm!

    Code: Alles auswählen

    #include <stdio.h>
    
    void print_letter2(void);
    
    int ctr;
    char letter1 = 'X';
    char letter2 = '=';
    
    int main(void) {
        for (ctr = 0; ctr < 10; ctr++) {
            printf("%c", letter1);
            print_letter2();
        }
    
        return 0;
    }
    
    void print_letter2(void) {
        for (ctr = 0; ctr < 2; ctr++) {
            printf("%c", letter2);
        }
    }
    Zum guten Schluss kommen noch ein paar Verständnisfragen:
  19. Gegeben sind zwei Integervariablen namens zahl1 (Wert = 5) und zahl2 (Wert = 10) und zwei Zeigervariablen. Schreibt nach jedem Schritt auf, welche Werte sich ändern:
    1. zeiger1 = &zahl1;
    2. zeiger2 = &zahl2;
    3. *zeiger1 += 20;
    4. *zeiger2 -= 3;
    5. *zeiger1 = *zeiger2 + 5;
    6. *zeiger2 = *zeiger1 - zahl2;
  20. Schreibt einen Funktionsprototypen für eine Funktion namens "do_it", die drei Argumente vom Datentyp char erwartet und dann einen long zurückgibt.
  21. Schreibt einen Funktionsprototypen für eine Funktion namens "print_a_number", die einen einzelnen int erhält und nichts an den Aufrufer zurückgibt.
  22. Welchen Datentyp geben die folgenden Funktionen zurück?
    1. int print_error(long error_number);
    2. long read_record(int record_number, int size);
  23. Schreibt eine Deklaration für einen Zeiger auf eine char-Variable. Benennt den Zeiger mit "char_pointer".
  24. Kann ein Programm sowohl eine globale als auch eine lokale Variable gleichen Namens haben? Schreibt ein Programm, um eure Antwort zu beweisen.
  25. Schreibt die geschachtelte Abfrage neu mit einem einzigen if und einer logischen Verknüpfung:

    Code: Alles auswählen

    if (x > 1)
        if (x < 10)
            statement;
  26. Eine nicht-initialisierte Variable wird ausgelesen. Unter welchen Umständen hat sie welchen Wert? Versucht zu beweisen, dass ihr Inhalt zufällig ist.
B0D0: Real programmers do it in hex.

Antworten