Programmieren in C

Arbeitsblatt 1
Datentypen und Ein- / Ausgabe

Abgabefrist: 06.11.2012

Dieses Arbeitsblatt leitet Sie durch die ersten Erfahrungen mit der Programmiersprache C. Als Lernziel sollen Sie sich das Konzept der Datentypen vergegenwärtigen und üben, wie Sie die Funktionen printf und scanf verwenden können. Lesen Sie dazu bitte die Kapitel 3, 4 und 5 im Skript Programmieren in C.

Multiple Choice-Frage Mit diesem Symbol gekennzeichnete Aufgaben sind Multiple-Choice-Fragen. Bearbeiten Sie diese in der Brad-Umgebung. Diese Aufgaben fließen in die Gesamtwertung des Praktikums ein.
Programmieraufgabe in Brad Mit diesem Symbol gekennzeichnete Aufgaben sind Programmieraufgaben. Bearbeiten Sie diese in Brad. Sobald Brad 1/1 Punkte anzeigt, überträgt es Ihre Lösung automatisch per Internet an den Lehrstuhl. Brad kann aber nicht eindeutig feststellen, ob eine Lösung richtig ist. Das müssen Sie entscheiden. Deshalb können Sie mehrere Lösungen zu einer Aufgabe einreichen; wir werten nur die beste. Bitte prüfen Sie in Brad am Ende jedes Arbeitsblattes, ob all Ihre Lösungen tatsächlich übertragen werden konnten! Diese Aufgaben fließen in die Gesamtwertung des Praktikums ein.

Aufgabe 101
Grundlagen zu Zeichenketten und Steuerzeichen

Lösen Sie diese Aufgabe begleitend zu Kapitel 2 im Skript.

Mit dieser Aufgabe sollen Sie üben, Text exakt auszugeben. Dabei stellen Sie auch Sonderzeichen mit Hilfe von Steuerzeichen (auch Escape-Sequenzen genannt) dar. Betrachten Sie dazu insbesondere die Beispiele im unten angegebenen Kapitel des Skripts.

  1. Multiple Choice-Frage Was ist ein Steuerzeichen?

    Mausgeste des Programmierers
    C-Befehl zum Bewegen des Mauszeigers
    Hinweis für den Benutzer
    Sonderzeichen in einem C-String

  2. Multiple Choice-Frage Mit welchem Zeichen beginnen Steuerzeichen in C?

    \
    #
    /
    &

  3. Multiple Choice-Frage Mit welchem Steuerzeichen können Sie einen Zeilenumbruch erzeugen?

    \\
    \n
    \t
    %n

  4. Multiple Choice-Frage Mit welchem Steuerzeichen können Sie ein Anführungszeichen (") darstellen?

    \a
    \"\
    \n
    \"

  5. Multiple Choice-Frage Mit welchem Steuerzeichen können Sie einen Backslash (\) ausgeben?

    \b
    \\
    \t
    \n

  6. Programmieraufgabe in Brad Der unten stehende Text soll auf dem Bildschirm angezeigt werden. Achten Sie darauf, dass die Ausgabe exakt Zeichen für Zeichen mit der Vorgabe übereinstimmt.

    "Wir programmieren in 'C' (ANSI)."
    "  a[0] = 1; b = 2; x = 3 * a[0] + b"
    "Sie sagte: "Ich mag keine Hunde!""
    "Der Slash ("/") und der Backslash ("\") werden manchmal verwechselt"
    

    Die äußersten Anführungszeichen in jeder Zeile sind kein Teil der Ausgabe, sondern die Begrenzung des auszugebenden Textes. Geben Sie am Ende jeder Zeile auch einen Zeilenumbruch aus.

  7. Fügen Sie nun gezielt falsche Zeichen ein (auch an verschiedenen Stellen Leerzeichen), damit Sie sehen, welche Meldungen Brad in einem solchen Fall erzeugt.

Icon für C-Quellcode-Datei Icon für das Skript
3

Aufgabe 102
Grundlagen zu printf

Lernen Sie in dieser Aufgabe kennen, wie Sie Zahlen und Text mit der Funktion printf am Bildschirm ausgeben können. Dabei können Sie in der Formatbeschreibung (auch Formatstring genannt) beeinflussen, wie printf die Ausgabe darstellen soll. Verwendet Sie in dieser Aufgabe nur Konstanten, keine Variablen. Das folgende kleine Beispielprogramm zeigt dazu eine typische Verwendung von printf. Betrachten Sie auch die Beispiele im unten angegebenen Kapitel!

1  #include <stdio.h>
2
3  int main()
4  {
5    printf("Hallo!\n");
6    printf("Ich heiße Klaus. Und wie ein auserwählter ");
7    printf("Kreis weiterer besonderer Personen habe auch ");
8    printf("ich am %02i.%02i.%i Namenstag.\n", 6, 12, 2007);
9  }
  1. Multiple Choice-Frage Wie lautet der Platzhalter für eine ganze Zahl (z.B. 1) im Formatstring von printf?

    %g
    %z
    %i
    %f

  2. Multiple Choice-Frage Wie lautet der Platzhalter für eine Gleitkommazahl (z.B. 10,2) im Formatstring von printf? (Beachten Sie bitte, dass C einen Punkt als Dezimaltrennzeichen erwartet.)

    %lf
    %c
    %d
    %s

  3. Multiple Choice-Frage Wie lautet der Platzhalter für ein Zeichen (z.B. a) im Formatstring von printf?

    %g
    %i
    %c
    %lf

  4. Programmieraufgabe in Brad Schreiben Sie ein Programm, dass die unten stehende Ausgabe erzeugt. Dabei sollen Sie den Ausgabewert als Konstante durch einen Platzhalter in der Formatbeschreibung einbinden (z.B. printf("%.1lf\n", 1.0); oder Codezeile 8 im Beispiel oben). Lösen Sie die Aufgabe also mit Konstanten, aber ohne Variablen und benutzen Sie Platzhalter in der Formatbeschreibung.

    "42"
    "14.21"
    "A"
    

    Wieder sind die äußersten Anführungszeichen in jeder Zeile kein Teil der Ausgabe, sondern die Begrenzung des auszugebenden Textes. Geben Sie also keine Leerzeichen am Anfang und am Ende jeder Zeile aus, aber einen Zeilenumbruch am Ende jeder Zeile.

Icon für C-Quellcode-Datei Icon für das Skript
5.1

Aufgabe 103
Grundlagen zu Datentypen und Variablen

Sehen Sie in dieser Aufgabe, wie Sie Variablen Werte zuweisen können. Jede Variable speichert dabei den Wert eines bestimmten Datentyps. Sie können dann den Inhalt einer Variablen genauso ausgeben, wie eine Konstante in Aufgabe 102.

  1. Multiple Choice-FrageWelche Art von Information kann eine Variable vom Typ double aufnehmen?

    Zwei Zahlen
    Eine komplexe Zahl
    Einze Ganzzahl
    Eine Gleitkommazahl

  2. Multiple Choice-FrageWelche Art von Information kann eine Variable vom Typ char aufnehmen?

    Einen Zeiger
    Eine Gleitkommazahl
    Ein Zeichen
    Eine Zeichenkette

  3. Multiple Choice-FrageWelche Art von Information kann eine Variable vom Typ int aufnehmen?

    Eine Ganzzahl
    Eine Gleitkommazahl
    Einen internationalen Landescode
    Ein Integral

  4. Multiple Choice-FrageC ordnet auch einem konstanten Wert (Literal) einen Datentyp zu. Von welchem Datentyp ist das Literal -2.01?

    int
    double
    char
    float

  5. Multiple Choice-FrageVon welchem Datentyp ist das Literal -2000?
    Die Antwort steht nicht im Skript. Sie ist aber eindeutig im C-Standard festgelegt. Suchen Sie im Internet. Bitte markieren Sie die korrekte Antwort.

    char
    int
    double
    short

  6. Programmieraufgabe in Brad Schreiben Sie nun Ihren Code von Aufgabe 102 so um, dass Sie jeden Wert nicht direkt ausgeben. Stattdessen legen Sie zuerst für alle drei Daten je eine eigene Variable mit einem passenden Datentyp an und weisen ihnen den entsprechenden Wert zu. Geben Sie anschließend die Variablen mit printf aus. (Beachten Sie dabei, dass in C alle Variablen am Anfang des Programms angelegt (definiert) werden müssen.) Benutzen Sie für diese Aufgabe die Datentypen char, double und int.

Icon für C-Quellcode-Datei Icon für das Skript
4

Aufgabe 104
Grundlagen zu scanf

Ein Programm gibt aber üblicherweise nicht nur Text aus, sondern fragt auch Zahlen, Zeichen und Wörter vom Benutzer ab. Diese Aufgabe erledigt die Funktion scanf in C. Vergegenwärtigen Sie sich in dieser Aufgabe den grundlegenden Umgang mit scanf.

  1. Multiple Choice-Fragescanf speichert den vom Benutzer eingelesenen Wert in einer Variablen. Welches Zeichen muss vor dieser Variablen stehen (im Unterschied zu printf)?

    \
    *
    &
    /

  2. Multiple Choice-FrageWerte welchen Typs kann die Zeile scanf("%i", &i); vom Benutzer einlesen?

    char
    int
    double
    float

  3. Multiple Choice-Frage Werte welchen Typs kann die Zeile scanf(" %c", &c); vom Benutzer einlesen?

    char
    int
    string
    double

  4. Multiple Choice-Frage Werte welchen Typs kann die Zeile scanf("%lf", &d); vom Benutzer einlesen?

    char
    float
    int
    double

  5. Programmieraufgabe in Brad In dieser Teilaufgabe schreiben Sie nun ein einfaches Programm, das das typische Zusammenspiel zwischen Ein- und Ausgabe zeigt. Ihr Programm soll eine Gleitkommazahl vom Benutzer einlesen und als Nächstes wieder ausgeben. Der Quellcode ist soweit fertig; es fehlt lediglich noch eine scanf-Anweisung. Bitte ergänzen Sie das Programm geeignet.

    15  #include <stdio.h>
    16  
    17  
    18  int main()
    19  {
    20    double zahl = 0.0;
    21    printf("Zahl: ");
    22  
    23    /* Fügen Sie hier Ihre scanf-Anweisung ein. */
    24  
    25  
    26    printf("Sie haben %.2lf eingegeben.\n", zahl);
    27  }
    
  6. Multiple Choice-FrageWas bedeutet der Platzhalter %.2lf in der letzten Zeile der vorherigen Teilaufgabe?

    Ausgabe von zwei Punkten
    Ausgabe der Zahl mit zwei Nachkommastellen
    Ausgabe der Zahl in zweistelliger Form
    Ausgabe der Zahl mit zwei Vorkommastellen

Icon für C-Quellcode-Datei Icon für das Skript
5.2

Aufgabe 105
Kugeloberfläche und -volumen berechnen

Das gegebene Programm berechnet die Oberfläche einer Kugel.

23  #include <stdio.h>
24
25
26  int main()
27  {
28    const double PI = 3.14159;  /* Kreiskonstante pi */
29    double r = 0.0;             /* Radius der Kugel */
30    double A = 0.0;             /* Oberfläche der Kugel */
31
32    /* Radius vom Benutzer einlesen */
33    printf("Kugelradius: ");
34    scanf("%lf", &r);
35
36    /* Berechnungen durchführen */
37    A = 4.0 * PI * r * r;
38
39    /* Ausgabe des Ergebnisses */
40    printf("Radius: %.2lf\n", r);
41    printf("Oberflaeche: %.2lf\n", A);
42  }
  1. Arbeiten Sie bitte als Erstes obigen Code durch und versuchen Sie ihn zu verstehen. Prägen Sie sich auch seine Struktur und seine wesentlichen Merkmale ein. Kompilieren Sie dazu das gegebene Programm und vergegenwärtigen Sie sich seine Funktion durch mehrmaliges Ausprobieren mit verschiedenen Zahlen.

  2. Programmieraufgabe in Brad Ihr Programm soll nun zusätzlich zur Oberfläche auch noch das Volumen der Kugel berechnen. Die mathematische Formel hierfür lautet V = 4/3 π r3. (Benutzen Sie r*r*r für r3.) Zur Ausgabe wird der Text

    "Volumen: "

    gefolgt vom Wert des Volumens (wieder mit genau zwei Nachkommastellen) in einer eigenen Zeile dargestellt. Fügen Sie diese Berechnung in den gegebenen Quellcode ein. Beachten Sie dazu bitte auch die Ausgaben des Musterlösungsprogramms. Sie müssen diese identisch nachbilden (Zeichen für Zeichen)!

  3. Erhöhen Sie nun schrittweise die Anzahl der Nachkommastellen in allen drei Ausgaben und beachten Sie dabei, wie printf immer mathematisch richtig rundet. Ab wievielen Nachkommastellen tritt das erste Mal bei einer der drei Ausgaben ein Fehler auf? Benutzen Sie dazu verschiedene Radiuseingaben. (Der Fehler wird durch die begrenzte Rechengenauigkeit des Typs double verursacht.)

Icon für C-Quellcode-Datei Icon für das Skript
4
Icon für das Skript
5

Aufgabe 106
Fehler suchen

Der folgende Code enthält vier typische Fehler. Nur einen kann bereits der Compiler finden, die verbleibenden drei sind für den Compiler dagegen unsichtbar. (Selbst erfahrene Programmierer schreiben fehlerhaften Code. Deswegen ist es wichtig, das systematische Suchen von Programmierfehlern zu üben.)

19  #include <stdio.h>
20
21
22  int main()
23  {
24    int i
25    printf("Bitte geben Sie eine ganze Zahl ein: ");
26    scanf("%lf", i);
27    printf("Die eingegebene Zahl war %i.\n", &i);
28  }
  1. Multiple Choice-Frage Welche Art von Fehlern kann der C-Compiler erkennen?

    Alle Tippfehler
    Alle Syntaxfehler
    Alle logischen Fehler
    Alle Fehler in der Aufgabenstellung

  2. Multiple Choice-Frage Welche Art von Fehlern können dagegen nur Sie als Programmierer erkennen?

    Syntaxfehler
    Logische (inhaltliche) Fehler

  3. Programmieraufgabe in Brad Korrigieren Sie den Code. Vergleichen Sie dazu das Verhalten des fehlerhaften Programms (106c_angabe.c) mit der korrekten Musterlösung (106c_loesung). Ihre Ausgabe muss identisch mit der Ausgabe dieser Referenz Sein!

Icon für C-Quellcode-Datei Icon für das Skript
5

Aufgabe 107
Umwandeln von Groß- in Kleinschreibung

Ihr Programm macht aus einem Großbuchstaben einen Kleinbuchstaben.

  1. Multiple Choice-Frage Wieviel Speicher in Bit belegt eine Variable vom Typ char?

    8
    10
    16
    20

  2. Multiple Choice-Frage Was beschreibt der ASCII-Zeichensatz?

    Die maximale Menge an Zeichen, die jeder Computer darstellen kann
    Die Zuordnung zwischen Bitmuster und Zahlenwert
    Die Zuordnung zwischen Bitmuster und darzustellendem Zeichen

  3. Multiple Choice-Frage Welche Bitfolge ist darin dem Zeichen A zugeordnet?

    00000000
    01000001
    01010101
    11111111

  4. Multiple Choice-Frage Welche Hexadezimalzahl ergibt sich, wenn man diese Bitfolge als Dualzahl interpretiert?

    0x00
    0x01
    0x41
    0xFF

  5. Multiple Choice-Frage Welcher Dezimalzahl entspricht diese Bitfolge, wenn man sie als Dualzahl interpretiert?

    0
    1
    65
    100

  6. Programmieraufgabe in Brad Schreiben Sie nun ein Programm, das einen Großbuchstaben in einen Kleinbuchstaben umwandelt. Fragen Sie dazu mit der Aufforderung

    "Bitte geben Sie einen Grossbuchstaben ein: "

    ein Zeichen vom Benutzer ab. Sie müssen nicht prüfen, ob es tatsächlich ein Großbuchstabe ist. Übersetzen Sie diesen Großbuchstaben dann in einen Kleinbuchstaben. Den Kleinbuchstaben geben Sie schließlich in einer eigenen Zeile aus.

Hinweis: Eine Tabelle mit allen ASCII-Werten (ASCII-Tabelle) finden Sie bei www.asciitable.com.

Icon für C-Quellcode-Datei Icon für das Skript
9.2.1

Bitte prüfen Sie am Ende jedes Arbeitsblattes in Brad, ob all Ihre Lösungen tatsächlich übertragen werden konnten!

Aufgabe 111
Mit dem Roboter eine Schlangenlinie fahren

Diese Aufgabe ist freiwillig. Auf sie gibt es keine Punkte! Lesen Sie Kapitel 2.3 im Skript, um sich mit der Roboterumgebung vertraut zu machen.

In dieser Aufgabe können Sie den Roboter einfach ein bisschen fahren lassen. Dabei lernen Sie einige Befehle (in C „Funktionen“ genannt) zum Steuern der Hardware kennen und sehen, dass Sie auf dem alphanumerischen Bildschirm des Roboters ähnlich wie im Terminal schreiben können.

Wie kann ein Roboter nun eine Schlangenlinie fahren? Dazu muss er eine gewissen Zeit lang abwechselnd links herum und rechts herum fahren. Die Funktion go_left unten schlägt eine Linkskurve ein. Dazu stellt sie mit der Funktion motor_set die Geschwindigkeit 60 für den linken Motor (also die linken Reifen) und die Geschwindigkeit 110 für den rechten Motor ein. Die rechten Reifen drehen also schneller als die linken; damit fährt der Roboter links herum.

25  #include <motor.h>
26  #include <display.h>
27  
28  
29  void go_left(void)
30  {
31    motor_set(60, 110);
32    display_printf("links");
33  }
34  
35  
36  void go_right(void)
37  {
38  
39  }

An anderer Stelle haben wir schon den Code geschrieben, dass der Roboter abwechseln go_left und go_right ausführt, also eine Schlangenlinie fährt. Es fehlt jedoch noch der Code in go_right, der ein Rechtskurve einschlagen soll.

  1. Wie können Sie mit der Funktion motor_set den Roboter geradeaus fahren lassen?

  2. Wie können Sie mit der Funktion motor_set den Roboter anhalten?

  3. Programmieraufgabe in Brad Schreiben Sie in dieser Teilaufgabe den Code für die Funktion go_right; er soll eine Rechtskurve einschlagen. Steuern Sie dazu den kurveninneren Motor mit der Geschwindigkeit 60 und den kurvenäußeren Motor mit der Geschwindigkeit 110 an. Geben Sie dann den Text

    "rechts"

    am Bildschirm aus. Wenn alles passt, fährt der Roboter eine Schlangenlinie.

    Testen Sie Ihr Programm im Simulator und stellen Sie sicher, dass der Roboter eine Schlangenlinie fährt. Wenn Sie dass Programm anschließend auf einem Roboter testen wollen, dann rufen Sie einen Tutor.

Icon für C-Quellcode-Datei Icon für das Skript
4
Icon für das Skript
5

Aufgabe 121
Ampel-Schaltfläche

Diese Aufgabe zeigt Ihnen, wie Sie die Funktion einer Schaltfläche in einer grafischen Oberfläche verändern können. Lesen Sie begleitend zu dieser Aufgabe das Kapitel 2.4 im Skript.

Zunächst ist folgender Code gegeben; er zeigt Ihnen ein einfaches GTK+-Programm mit einer einzigen Schaltfläche in einem Fenster.

19  #include <gtk/gtk.h>
20  #include "121b_callbacks.h"
21  
22  
23  int main (int argc, char *argv[])
24  {
25    GtkWidget *window;
26    GtkWidget *button;
27  
28    window = ldv_window_create (argc, argv);
29  
30    /* Initialisiert eine Schaltfläche
31     * Gleichzeitig wird sie mit dem Text "Schliessen" beschriftet */
32    button = gtk_button_new_with_label ("Schliessen");
33  
34    /* Wenn die Schaltfläche das Signal "clicked" sendet, soll die
35     * Funktion "destroy" aufgerufen werden. Das macht die Funktion
36     * "g_signal_connect": Diese erhält zunächst das Objekt, welches das
37     * Signal sendet, hier also den Schalter "button". Das nächste
38     * Argument steht für das Signal, hier "clicked". Tritt das Signal
39     * "clicked" auf, soll die Funktion "destroy" aufgerufen werden;
40     * dies steht im drittem Argument. Das vierte Argument wird hier
41     * nicht benötigt und deshalb mit "NULL" belegt. */
42    g_signal_connect (G_OBJECT (button), "clicked",
43                      G_CALLBACK (destroy), NULL);
44  
45    /* Ordnet die Schaltfläche "button" auf dem Fenster "window" (ein
46       GTK-Container) an. Sie bleibt aber noch unsichtbar. */
47    gtk_container_add (GTK_CONTAINER (window), button);
48  
49    /* Macht die Schaltfläche sichtbar. */
50    gtk_widget_show (button);
51  
52    /* Alle GTK+-Programme müssen am Ende "gtk_main" aufrufen. Das
53     * Programm wartet dann auf Ereignisse (z.B. Tastendruck oder
54     * Mausklick). */
55    gtk_main ();
56  
57    return 0;
58  }
  1. Gehen Sie den Code Schritt für Schritt durch und versuchen Sie, ihn zu verstehen. Nehmen Sie dazu das GTK+-Tutorial zu Hilfe. Die Funktion ldv_window_create finden Sie dort nicht. Diese haben wir geschrieben; sie erzeugt einfach ein leeres Fenster.

  2. Programmieraufgabe in BradVerändern Sie den Code nun wie folgt:

    1. Beschriften Sie die Schaltfläche (engl. button) mit dem Text „Ich bin eine Ampel“
    2. Drückt der Benutzer diese Schaltfläche, soll Ihr Programm die Rückruf-Funktion (engl. callback) ampel aufrufen.
Icon für C-Quellcode-Datei Icon für das Skript
4
Icon für externe Anleitungen im Internet
GTK+-Tutorial

Aufgabe 125
Kugelvolumen berechnen mit grafischer Oberfläche

Wie bereits in Aufgabe 105 berechnen Sie nun wieder das Kugelvolumen; diesmal mit Hilfe einer graphischen Oberfläche.

  1. Die Benutzeroberfläche haben wir bereits in einer anderen Datei geschrieben. Ihre Aufgabe ist es, das Kugelvolumen neu zu berechnen, sobald sich der Wert des Radius ändert. Jedesmal, wenn sich dieser Wert ändert, wird die Funktion on_spin_button_changed aufgerufen, deren Verhalten Sie realisieren.

    Sie bekommen den Wert des Radius über die Variable radius geliefert. Berechnen Sie zu diesem Wert das Volumen. Geben Sie das Volumen dann mit genau zwei Nachkommastellen im GtkLabel ausgabeTextfeld aus. Die folgenden Funktionen helfen Ihnen dabei:

    • Sie können den Inhalt eines GtkLabels mit der Funktion

      gtk_label_set_text (label, text)

      ändern.

    • Mit Hilfe der Funktion

      g_strdup_printf (formatstring, ...)

      können Sie aus einer Gleitkommazahl einen Text erzeugen. Sie funktioniert analog zur bekannten printf-Funktion.

    Zusammengesetzt sieht die letzte Zeile Ihres Codes etwa wie folgt aus. Füllen Sie noch die fehlenden Parameter in die drei Lücken aus.

    gtk_label_set_text(    , g_strdup_printf(    ,    ));
Icon für C-Quellcode-Datei Icon für das Skript
4
Icon für das Skript
5
Icon für externe Anleitungen im Internet
GTK+-Tutorial

Zuletzt geändert am 18. Oktober 2010
XHTML 1.0 Strict und CSS 2