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.
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.
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.return s;Musterlösung anzeigen (zählt als erledigt)
#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; }
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.
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.
== vergleicht immer genau die beiden Werte links und rechts — hier sind das keine Buchstaben.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:
if (strcmp(a, b) == 0) { printf("gleich\n"); }
In C++ mit std::string funktioniert == dagegen wie erwartet.
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};
scanf: Es bekommt eine Adresse, weil es in eine fremde Variable schreiben muss.void minmax(int a[], int n, int *min, int *max); Aufruf minmax(werte, 5, &kl, &gr);Musterlösung anzeigen (zählt als erledigt)
#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; }
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.
