MINT üben

Programmieren mit C & C++

Zehn Aufgaben zum Entwerfen, Begründen und Beurteilen — hier zählt, dass du erklären kannst, warum dein Code funktioniert.

Dein Fortschritt:
0 / 0 Aufgaben
3

Aufgabenblock — AFB III

Hier zählt das Begründen: eigene Funktionen entwerfen, Fehler erklären, Entwürfe beurteilen. Schreib deine Lösung erst vollständig auf und klapp dann die Musterlösung auf — sie zählt als erledigt.

A1
Die Quersumme berechnen
AFB III

Für eine Prüfziffer braucht die Mensa-Kasse die Quersumme einer Zahl, z. B. 4 + 0 + 9 + 6 = 19 für 4096.

Implementiere eine Funktion int quersumme(int n) für n ≥ 0 ohne Zeichenketten, nur mit %, / und einer Schleife. Teste sie mit 4096, 7 und 0.

Strategie: Zerlege die Zahl von hinten: n % 10 ist die letzte Ziffer, n / 10 schneidet sie ab.Warum so? Die Ganzzahldivision, die sonst eine Falle ist, ist hier genau das Werkzeug.
Lösungsskizze: Summe s = 0; solange n > 0: s += n % 10; n = n / 10; danach return s;
Musterlösung anzeigen (zählt als erledigt)
C
#include <stdio.h>

int quersumme(int n) {
    int s = 0;
    while (n > 0) {
        s += n % 10;   // letzte Ziffer addieren
        n = n / 10;    // letzte Ziffer abschneiden
    }
    return s;
}

int main(void) {
    printf("%d\n", quersumme(4096));
    printf("%d\n", quersumme(7));
    printf("%d\n", quersumme(0));
    return 0;
}
Ausgabe
19
7
0

Für 4096 läuft die Schleife viermal: 6, 9, 0, 4 werden addiert. Für 0 läuft sie gar nicht — while prüft vorher, deshalb stimmt auch das Ergebnis 0. Mit do … while wäre es hier ebenfalls richtig, aber unnötig.

A2
Zwei gleiche Wörter — „verschieden“?
AFB III
C
char a[] = "Rot";
char b[] = "Rot";
if (a == b) {
    printf("gleich\n");
} else {
    printf("verschieden\n");
}

Das Programm gibt verschieden aus, obwohl beide Arrays „Rot“ enthalten. Begründe das Verhalten mit dem, was ein Array-Name in C bedeutet, und gib eine korrekte Abfrage an.

Strategie: Überlege, wofür der Name eines Arrays in einem Ausdruck steht.Warum so? == vergleicht immer genau die beiden Werte links und rechts — hier sind das keine Buchstaben.
Lösungsskizze: a und b stehen für die Adressen ihrer ersten Elemente; zwei Arrays liegen an verschiedenen Stellen. Vergleich mit strcmp.
Musterlösung anzeigen (zählt als erledigt)

Ein Array-Name steht für die Adresse seines ersten Elements. a == b vergleicht also zwei Adressen. a und b sind zwei getrennte Arrays mit je 4 Byte an verschiedenen Speicherstellen — die Adressen sind nie gleich, egal was darin steht. gcc warnt mit -Wall sogar: comparison between two arrays.

Den Inhalt vergleicht strcmp aus <string.h> Zeichen für Zeichen; bei Gleichheit liefert es 0:

C
if (strcmp(a, b) == 0) {
    printf("gleich\n");
}

In C++ mit std::string funktioniert == dagegen wie erwartet.

A3
Zwei Ergebnisse aus einer Funktion
AFB III

Eine Funktion soll zu einem Array das Minimum und das Maximum liefern. Mit return kann sie aber nur einen Wert zurückgeben.

Entwirf eine Lösung mit Zeigerparametern: Gib den Funktionskopf an, implementiere die Funktion und zeige den Aufruf für int werte[5] = {7, 3, 9, 1, 5};

Strategie: Die Funktion bekommt zusätzlich die Adressen zweier Variablen des Aufrufers und schreibt die Ergebnisse dorthin.Warum so? So arbeitet auch scanf: Es bekommt eine Adresse, weil es in eine fremde Variable schreiben muss.
Lösungsskizze: void minmax(int a[], int n, int *min, int *max); Aufruf minmax(werte, 5, &kl, &gr);
Musterlösung anzeigen (zählt als erledigt)
C
#include <stdio.h>

void minmax(int a[], int n, int *min, int *max) {
    *min = a[0];
    *max = a[0];
    for (int i = 1; i < n; i++) {
        if (a[i] < *min) *min = a[i];
        if (a[i] > *max) *max = a[i];
    }
}

int main(void) {
    int werte[5] = {7, 3, 9, 1, 5};
    int kl, gr;
    minmax(werte, 5, &kl, &gr);
    printf("%d %d\n", kl, gr);
    return 0;
}
Ausgabe
1 9

Das Array wird ohne & übergeben — sein Name ist schon eine Adresse. Die Länge n muss mitgegeben werden, weil die Funktion sie sonst nicht kennt. Startwert ist a[0], nicht 0: Bei lauter negativen Zahlen wäre 0 sonst ein falsches Maximum.