Vom Algorithmus zum Programm

Werbung
Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung Vom Algorithmus zum Programm Lernziele: Vertiefen der Kenntnisse über den Entwurf von Algorithmen und deren Übertragung in ein C-­‐ Programm Aufgabe 1: Pythagoreisches Tripel a) Entwickeln Sie einen Algorithmus, der die ersten pythagoreischen Tripel ermittelt und ausgibt. Es sollen alle pythagoreischen Tripel mit x; y; z <= 20 ausgeben werden. Hinweis: Drei natürliche Zahlen x, y und z bilden ein pythagoreisches Tripel, wenn x2 + y2 = z2 gilt. Beispiele: • 3, 4, 5 bilden ein pythagoreisches Tripel, da 32 + 42 = 9 + 16 = 25 = 52 gilt. • 1, 2, 3 bilden kein pythagoreisches Tripel, da 12 + 22 = 1 + 4 = 5 ≠ 32 = 9 gilt. • 5, 12, 13 bilden ein pythagoreisches Tripel, da 52 + 122 = 25 + 144 = 169 = 132 gilt. • 3, 4, 6 bilden kein pythagoreisches Tripel, da 32 + 42 = 9 + 16 =2 5 ≠ 62 = 36 gilt. ALGORITHMUS pythagoreischesTripel() Beschreibung Berechnung aller pythagoreischen Zahlentripel <= 20 ! Deklaration und Definition der lokalen Größen Übernahmeparameter: -­‐-­‐-­‐ Übergabeparameter: -­‐-­‐-­‐ Natürliche Zahlen: x, y, z Boolsche Variable: teilBar // optional Algorithmuskern Für x = 1 bis 20 SCHRITTWEITE 1 Für y = x+1 bis 20 SCHRITTWEITE 1 Für z = y+1 bis 20 SCHRITTWEITE 1 FALLS (x*x + y*y gleich z*z) DANN Drucke x "," y "," z";" ENDE FALLS ENDE FÜR ENDE FÜR S. 1 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung ENDE FÜR ENDE ALGORITHMUS b) Überführen Sie den Algorithmus in ein C-­‐Programm. #include <stdio.h>
void main(void) {
/* Berechnet alle pythagoreischen Tripel <= 20 */
/* Daten*/
int x, y, z;
/* Kern*/
for (x = 1; x <= 20; x++) {
for (y = x+1; y <= 20; y++) {
for (z = y+1; z <= 20; z++) {
if (x * x + y * y == z * z) {
printf("%2d, %2d, %2d\n",
x, y, z);
}
}
}
}
} Aufgabe 2: Teilbarkeit von Zahlen durch ihre Ziffern a) Entwickeln Sie einen Algorithmus, der für alle dreistelligen Zahlen prüft, ob die jeweilige Zahl durch alle ihre Ziffern (ausgenommen der Ziffer 0) teilbar ist und diese Zahl jeweils auf dem Bildschirm ausgibt. Hinweis: Folgende Zahlen erfüllen bspw. obige Bedingung: • 102 ist durch 1 und 2 teilbar. • 216 ist durch 2, 1 und 6 teilbar. • 384 ist durch 3, 8 und 4 teilbar. S. 2 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung ALGORITHMUS Ziffernteilbarkeit() Beschreibung Angabe aller 3 ziffrigen Zahlen, die durch ihre Ziffern teilbar sind! Deklaration und Definition der lokalen Größen Übernahmeparameter: -­‐-­‐-­‐ Übergabeparameter: -­‐-­‐-­‐ Natürliche Zahlen: zahl, ziffer, i Boolsche Variable: teilBar Algorithmuskern Für i=100 bis 999 SCHRITTWEITE 1 zahl = i; teilbar = WAHR; SOLANGE ((teilbar gleich WAHR) und (zahl > 0)) FÜHRE AUS ziffer = zahl MODULO 10; zahl = zahl / 10; FALLS ((ziffer ungleich 0) UND (i MODULO ziffer ungleich 0) DANN teilbar = 0; ENDE FALLS ENDE Solange FALLS (teilbar gleich WAHR) DANN Drucke i ENDE FALLS ENDE FÜR ENDE ALGORITHMUS S. 3 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung b) Überführen Sie den Algorithmus in ein C-­‐Programm. #include <stdio.h>
int main(void) {
/* Ausgabe aller 3-stelligen Zahlen,
die sich durch ihre Ziffern teilen lassen*/
/* Daten */
int i,zahl,ziffer;
char teilbar = 1;
/* Kern */
for (i = 100; i < 1000; i++) {
zahl = i;
teilbar = 1;
/* Prüfung, ob jeweils letzte Ziffer die Zahl teilt*/
while (teilbar && zahl > 0) {
ziffer = zahl % 10;
//letzte Ziffer
zahl = zahl / 10;
// Vorbereitung der nächsten letzten Ziffer
if (ziffer != 0 && i % ziffer != 0) //Teilbarkeit ?
teilbar = 0;
}
if (teilbar)
printf("%d\n", i);
}
return 0;
}
S. 4 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung Aufgabe 3: Kontrollstrukturen: Schleifen Geben Sei folgender Algorithmusschritt: Die Variable i wird auf 1 gesetzt SOLANGE i kleiner oder gleich 10 ist FÜHRE AUS Drucke den Wert i * i aus i wird um 1 erhöht ENDE SOLANGE Übersetzen Sie diesen Algorithmusschritt dreimal in C-­‐Code. 1. Verwenden Sie eine while-­‐Schleife 2. Verwenden Sie eine do-while-­‐Schleife 3. Verwenden Sie eine for-­‐Schleife #include <stdio.h>
void main(void) {
int i;
printf("while-Schleife:\n");
i = 1;
while (i <= 10) {
printf("i^2 = %d,\n", i * i);
i = i + 1;
}
printf("do-while-Schleife:\n");
i = 1;
do {
printf("i^2 = %d,\n", i * i);
i += 1;
// i = i + 1; // oder: i++;
} while (i <= 10);
printf("for-Schleife:\n");
for (i = 1; i <= 10; i++) {
printf("i^2 = %d,\n", i * i);
}
}
S. 5 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung Aufgabe 4: Nicht ausgelastet? – Geld wechseln Schreiben Sie ein C-­‐Programm, das zu einem der zu einen gegebenen Kaufpreis (≤ 100 Euro) bei Bezahlung mit einem Hundertmarkschein das Wechselgeld bestimmt. Dabei soll nur die minimale Anzahl von Münzen bzw. Scheinen zurückgegeben werden. Hinweis: • Siehe Aufgabenblatt 1 – dort finden Sie auch verschiedene Versionen dieser Aufgabe (als Algorithmus). Aufgabe 5: Kosinusreihe a) Entwickeln Sie einen Algorithmus mit Namen kosinusreihe, der entsprechend der im Hinweis angegebenen Reihendarstellung zu einem einzulesenden reellen x und einem einzulesenden epsilon den reellen Funktionswert von cos(x) mit einer vorgegebenen Genauigkeit epsilon bestimmt und ausgibt. Hinweis: Beispiellösung: ALGORITHMUS Kosinusreihe() Deklaration und Definition der lokalen Größen reelle Zahl: x, epsilon, summe, nenner, zaehler, summand ganze Zahl: k Algorithmuskern Einlesen von x und epsilon k = 0 zaehler = 1 nenner = 1 summe = zaehler / nenner WIEDERHOLE k = k+1 zaehler = (-­‐1)* zaehler * x*x nenner = nenner * (2* k-­‐1) (2 *k) summand = zaehler / nenner summe = summe + summand SOLANGE | summand| > epsilon Ausgabe von summe ENDE ALGORITHMUS S. 6 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung b) Überführen Sie die Algorithmen in ein C-­‐Programm. #include <stdio.h>
#include <math.h>
int main (void ) {
/* Berechnung von cos(x)*/
/* Daten*/
double x, epsilon;
double summe, summand, zaehler, nenner;
int k;
/* Kern*/
printf("Bitte geben Sie einen Wert fuer x ein");
scanf("%lf", &x);
printf("Bitte geben Sie einen Wert fuer epsilon ein");
scanf("%lf", &epsilon);
k = 0;
zaehler = 1;
nenner = 1;
summe = zaehler / nenner;
do{
k = k+1;
zaehler = (-1) * zaehler *x*x;
nenner = nenner * (2*k-1) * (2*k);
summand = zaehler / nenner;
summe = summe + summand;
}while (fabs(summand)>= epsilon) ;
printf(" Der Wert von cos(%f)= %f mit der Genauigkeit %f ",x, summe,
epsilon);
return 0;
} S. 7 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung Aufgabe 5: Reihendarstellungen des natürlichen Logarithmus a) Entwickeln Sie einen Algorithmus mit Namen natLogarithmus, der für ein einzugebendes reelles z mit 0 < z <= 2 über beide Reihendarstellungen den Wert des natürlichen Logarithmus' mit einer Genauigkeit epsilon = 10 -­‐6 berechnet und ausgibt. Hinweis: S. 8 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung ALGORITHMUS natLogarithmus() Beschreibung Bestimmung der Funktion ln(z) durch die Reihe: Deklaration und Definition der lokalen Größen reelle Zahl: x1, x2, epsilon, z, summe1, summe2, summand1, summand2, zaehler1, faktor1, faktor2, c natürliche Zahl: nenner1, nenner2 Algorithmuskern Einlesen von z epsilon = 0.000001 x1= z -­‐1 x2 = z /* erste Summe */ FALLS ((x1>-­‐1) UND (x1<= 1) DANN // erlaubte Eingabewerte zaehler1 =x1 nenner1 = 1 summe1 = zaehler1/nenner1 WIEDERHOLE zaehler1 = zaehler1 * (-­‐x1) nenner1 = nenner1 + 1 summand1 = zaehler1/nenner1 summe1 = summe1 + summand1 SOLANGE (|summand1| >= epsilon) SONST summe1 = 0.0 ENDE FALLS Drucke "Erstes Verfahren: ln("z") ist gleich" summe1 S. 9 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung /* zweite Summe */ FALLS (x2> 0) DANN // erlaubte Eingabewerte c = (x2 -­‐ 1) / (x2 + 1) nenner2 = 1 faktor2 = c summe2 = 2 * faktor2 WIEDERHOLE nenner2 = nenner2 + 2 faktor1 = 2.0/nenner faktor2 = faktor2 * c * c summand2 = faktor1 * faktor2 summe2 = summe2 + summand2 SOLANGE (|summand2| >= epsilon) SONST summe2 = 0.0 ENDE FALLS Drucke "Zweites Verfahren: ln("x2") ist gleich" summe2 ENDE ALGORITHMUS S. 10 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung b) Übersetzen Sie den Algorithmus in ein C-­‐Programm #include <stdio.h>
#include <math.h>
int main (void ) {
/* Varianten ln(z) zu berechnen */
/* Daten */
double z, epsilon, x1, x2,summe1, summe2,
double zaehler1,faktor1, faktor2, c;
unsigned nenner1, nenner2;
summand1, summand2;
/* Algorithmuskern */
printf(" Geben Sie bitte einen Wert ein\n");
scanf("%lf", &z);
epsilon = 0.000001;
x1 = z -1;
x2 = z;
/* erste Summe */
if ((x1 > -1) && (x1 <= 1)) { // erlaubte Eingabewerte
zaehler1 =x1;
nenner1 = 1;
summe1 = zaehler1 / nenner1;
do {
zaehler1 = zaehler1 * (-x1);
nenner1 = nenner1 + 1;
summand1 = zaehler1/nenner1;
summe1 = summe1 + summand1;
} while(fabs(summand1) >= epsilon);
} else {
summe1 = 0.0;
}
printf("1: ln(%f)= %f (Anzahl (%d))\n",z, summe1, nenner1 -1 );
/* zweite Summe */
if (x2> 0){ // erlaubte Eingabewerte
c = (x2 - 1) / (x2 + 1);
nenner2 = 1;
faktor2 = c;
summe2 = 2 * faktor2;
do{
nenner2 = nenner2 + 2;
faktor1 = 2.0/nenner2;
faktor2 = faktor2 * c * c;
summand2 = faktor1 * faktor2;
summe2 = summe2 + summand2;
} while (fabs(summand2) >= epsilon);
}else{
summe2 = 0.0;
}
printf("2.: ln(%f)= %f(Anzahl (%d))\n",
z, summe2, (nenner2-1)/2);
}
S. 11 / 12 Hochschule Niederrhein Fachbereich 03 Bachelor Informatik Einführung in die Programmierung WS 2015/16 Prof. Dr. Nitsche Prof. Dr. Davids Blatt 2 – Beispiellösung Nicht ausgelastet? Modifizieren Sie das C-­‐Programm so, dass das C-­‐Programm testet, welche der beiden Reihen für ln(2) schneller konvergiert. S. 12 / 12 
Herunterladen