Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 6 – Beispiellösung Funktionen und Arrays in C Lernziele: Vertiefen der Kenntnisse über die Verwendung von Funktionen sowie Arrays in C. Aufgabe 1: Quickies a) Welches Schlüsselwort muss verwendet werden, wenn eine Methode keinen Rückgabewert zurückgeben kann/will? -­‐ void b) Was wird hier ausgegeben? int i; for (i = 2; i <= 4; i++); printf("i = %d\n", i); -­‐ Beachte: Semikolon ; nach for(…) à for-­‐Schleife (i = 2 … 4, Abbruch bei i == 5) besteht nur aus der leeren Anweisung ; -­‐ à printf-­‐Anweisung erfolgt nach der Schleife (für i ==5) -­‐ à Ausgabe: i = 5 c) Wie viele Sterne werden hier auf dem Bildschirm ausgegeben? int i, j; for (i = 0; i <= 6; i++) { for (j = 1; j < 4; j++) { printf("*"); } } -­‐ äußere Schleife: i = 0 … 6 à 7 mal durchlaufen -­‐ innere Schleife: j = 1 … 3 à 3 mal durchlaufen -­‐ à insgesamt: 7 ⋅ 3 = 21 Sterne S. 1 / 9 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 6 – Beispiellösung d) Was wird hier ausgegeben? int i; char a[6] = { 'A', 'B', 'C', 'D', 'E', 'F' }; printf("%c\n", printf("%c\n", i = 5; printf("%c\n", printf("%c\n", a[0]); a[5]); a[i--]); a[i]); printf("%c\n", a[6]); -­‐ Ausgabe: A F F E <irgendein Zeichen> oder Absturz (a[6] nicht definiert, Index nur 0…5!) Aufgabe 2: sign-­‐‑Funktion a) Entwickeln Sie eine C-­‐Funktion sign, die das Vorzeichen einer Zahl bestimmt und zurückliefert. Hinweis: Die sign-­‐Funktion ist definiert als 1 𝑓𝑎𝑙𝑙𝑠 𝑥 > 0 𝑠𝑖𝑔𝑛 𝑥 = 0 𝑓𝑎𝑙𝑙𝑠 𝑥 = 0 −1 𝑓𝑎𝑙𝑙𝑠 𝑥 < 0 b) Schreiben Sie ein C-­‐Hauptprogramm (main-­‐Funktion), das eine Zahl einliest und dessen Vorzeichen durch Aufruf der Funktion sign berechnet und ausgibt. #include <stdio.h> int sign(double x) { int result; if (x > 0) { result = 1; } else if (x == 0) { result = 0; } else { result = -­‐1; } S. 2 / 9 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 6 – Beispiellösung return result; } int main(void) { double zahl; int vorzeichen; printf("zahl = "); scanf("%lf", &zahl); // Einlesen einer Zahl vorzeichen = sign(zahl); // Berechnung Vorzeichen durch Aufruf Funktion sign printf("sign(%lf) = %d\n", zahl, sign(zahl)); // Ausgeben des Vorzeichens return 0; } Aufgabe 3: Arrays a) Definieren Sie zwei Arrays von 5 ganzen Zahlen. b) Initialisieren Sie das erste Array direkt bei der Definition, das andere lesen Sie elementweise mittels scanf ein. c) Geben Sie die Elemente dieser Arrays auf dem Bildschirm aus. d) Definieren Sie ein zweidimensionales Array mit 2 Zeilen und 3 Spalten (d.h. eine 2×3-­‐Matrix) von Gleitpunktzahlen. #include <stdio.h> int main(void) { /* int-­‐Arrays a und b */ int a[5] = { 5, 9, -­‐3, 6, 2 }; int b[5]; /* 2x3-­‐Matrix von double-­‐Zahlen */ double m[2][3]; int i; // Algorithmuskern printf("Arrays\n\n"); // Einlesen von Array b printf("Eingabe Array b:\n"); for (i = 0; i < 5; i++) { printf(" b[%d] = ", i); scanf("%d", &b[i]); S. 3 / 9 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 6 – Beispiellösung } } // Ausgeben der Arrays printf("\nArray a: "); for (i = 0; i < 5; i++) { printf("%d ", a[i]); } printf("\n"); printf("Array b = { "); for (i = 0; i < 5; i++) { printf("%d", b[i]); if (i < 4) printf(", "); } printf(" }\n"); return 0; Aufgabe 4: Determinante Schreiben Sie ein Programm, das die Determinante einer 2×2-­‐Matrix berechnet und ausgibt. Die einzelnen Matrix-­‐Elemente sollen mittels scanf eingelesen werden. Hinweis: Die Determinante einer 2×2-­‐Matrix A 𝑎11 𝑎12 𝐴 = 𝑎 21 𝑎22 ist definiert als det 𝐴 = 𝑎11 𝑎22 − 𝑎12 𝑎21 #include <stdio.h> /* Funktion main: * -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐ * Beschreibung: * Berechnet die Determinante einer 2x2-­‐Matrix */ int main(void) { /* Deklaration und Definition der lokalen Größen: * Übergabeparameter: -­‐-­‐-­‐ * Rückgabeparameter: * -­‐ ganze Zahl (Fehlercode) * Lokale Variablen: * -­‐ Matrix reeller Zahlen: a S. 4 / 9 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 6 – Beispiellösung } * -­‐ reelle Zahl: det * -­‐ ganze Zahl: i, j */ double a[2][2]; double det; int i, j; // Algorithmuskern printf("Determinante\n\n"); printf("Eingabe Matrix a:\n"); for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) { printf(" a[%d][%d] = ", i, j); scanf("%lf", &a[i][j]); } } det = a[0][0] * a[1][1] -­‐ a[0][1] * a[1][0]; printf("det(m) = %lf\n", det); return 0; Aufgabe 5: Matrix-­‐‑Transposition Schreiben Sie ein Programm, das eine n×m-­‐Matrix (elementweise) mittels scanf einliest, die Matrix transponiert (d.h. an der Diagonale spiegelt), und anschließend die transponierte Matrix ausgibt. Hinweis: Für eine Matrix 𝐴 = 𝑎67 ist die transponierte Matrix 𝐴8 = 𝑎76 . Beispiel: 1 2.5 1 −1 0.33 𝐴 = −1 ⇒ 𝐴8 = 4 2.5 4 0 0.33 0 #include <stdio.h> /* Funktion main: * -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐ * Beschreibung: * Berechnet die transponierte Matrix einer nxm-­‐Matrix */ int main(void) { /* Deklaration und Definition der lokalen Größen: * Übergabeparameter: -­‐-­‐-­‐ * Rückgabeparameter: S. 5 / 9 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 6 – Beispiellösung } * -­‐ ganze Zahl (Fehlercode) * Lokale Variablen: * -­‐ Matrix reeller Zahlen: a, transpA * -­‐ ganze Zahl: i, j, n, m */ /* Annahme: n, m <= 10 */ double a[10][10]; // n x m -­‐ Matrix double transpA[10][10]; // m x n -­‐ Matrix int n, m, i, j; // Algorithmuskern printf("Matrix-­‐Transposition\n\n"); // Einlesen der Matrix-­‐Größe do { printf("Zeilenzahl (max. 10) n = "); scanf("%d", &n); } while (n <= 0 || n > 10); do { printf("Spaltenzahl (max. 10) m = "); scanf("%d", &m); } while (m <= 0 || m > 10); // Einlesen der Matrix printf("Eingabe Matrix a:\n"); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { printf(" a[%d][%d] = ", i, j); scanf("%lf", &a[i][j]); } } // Transponieren der Matrix for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { transpA[i][j] = a[j][i]; } } // Ausgeben der Matrix printf("\ntransponierte Matrix\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { printf("%7.2lf ", transpA[i][j]); } printf("\n"); } return 0; S. 6 / 9 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 6 – Beispiellösung Aufgabe 6: Mittelwert Schreiben Sie ein C-­‐Programm, das den Mittelwert einer Zahlenfolge (d.h. eines Arrays von Zahlen) ermittelt. Lesen Sie dazu das Array von Zahlen ein und geben Sie den berechneten Mittelwert auf dem Bildschirm aus. Hinweise: • Der Mittelwert aus n Zahlen a1, …, an ist definiert als 𝑎1 + 𝑎2 + … + 𝑎A 𝑎𝑣𝑔 𝑎1 , … , 𝑎A = 𝑛 • Sie können davon ausgehen, dass nicht mehr als 10 Zahlen eingegeben werden. #include <stdio.h> int main(void) { double werte[10]; double summe = 0.0; int anzahl, i; printf("Mittelwertberechnung\n\n"); do { printf("Anzahl? "); scanf("%d", &anzahl); } while (anzahl < 0 || anzahl > 10); for (i = 0; i < anzahl; i++) { printf("%d. Wert: ", i + 1); scanf("%lf", &werte[i]); } for (i = 0; i < anzahl; i++) summe += werte[i]; printf("Mittelwert: %lf\n", summe / anzahl); return 0; } S. 7 / 9 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 6 – Beispiellösung Aufgabe 7: Münzumrechnung Schreiben Sie ein C-­‐Programm, das zu mehreren Geldbeträgen eine Münzliste erstellt, also eine Tabelle, in der angegeben ist, wie viel Stück der einzelnen Geldwerte man benötigt, um alle Geldbeträge ohne Wechselgeld auszahlen zu können. Dabei seien alle Geldbeträge in Cent angegeben, d.h. 5432 entspricht 54,32 Euro, und wir können Münzen im Wert von 1, 2, 5, 10, 20, 50 Cent sowie 100 (= 1 Euro), 200 (= 2 Euro) und 500 Cent (= 5 Euro) verwenden. Beispiel: 5432, 345 und 756 Betrag | 500 200 100 50 20 10 5 2 1 --------------------------------------------------------5432 | 10 2 0 0 1 1 0 1 0 345 | 0 1 1 0 2 0 1 0 0 756 | 1 1 0 1 0 0 1 0 1 --------------------------------------------------------Summe | 11 4 1 1 3 1 2 1 1 #include <stdio.h> int main(void) { int geld[9] = {500, 200, 100, 50, 20, 10, 5, 2, 1}; int werte[3] = {5432, 345, 756}; int summen[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; int matrix[3][9]; int i, j; printf("Muenzumrechnung\n\n"); for (i = 0; i < 3; i++) { int betrag = werte[i]; for (j = 0; j < 9; j++) { int anz = betrag / geld[j]; matrix[i][j] = anz; summen[j] += anz; betrag %= geld[j]; } } printf("Betrag | "); for (i = 0; i < 9; i++) printf("%5d", geld[i]); printf("\n"); printf("-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐\n"); for (i = 0; i < 3; i++) { printf(" %5d | ", werte[i]); S. 8 / 9 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 6 – Beispiellösung } for (j = 0; j < 9; j++) printf("%5d", matrix[i][j]); printf("\n"); } printf("-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐\n"); printf(" Summe | "); for (i = 0; i < 9; i++) printf("%5d", summen[i]); printf("\n"); return 0; Zusatz-­‐‑Aufgabe 8: Umwandlung Dezimal nach Binär a) Entwickeln Sie ein Programm, um eine nicht-­‐negative ganze Zahl in ihre Binärdarstellung umzuwandeln. Die Binärdarstellung der Zahl soll dabei in der korrekten Reihenfolge der Ziffern ausgegeben werden. b) Entwickeln Sie ferner ein Programm, um eine nicht-­‐negative ganze Zahl in ihre • Oktaldarstellung (= Zahldarstellung zur Basis 8) sowie in ihre • Hexadezimaldarstellung (= Zahldarstellung zur Basis 8) umzuwandeln. Hinweis: Sie können das Programm Dezimal à Binär als Grundlage nehmen. S. 9 / 9