Struktogramm+Quellcode < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 19:28 So 14.09.2008 | Autor: | tynia |
Aufgabe | Schreibe ein Programm, welches Näherungslösungen zu [mm] e^{x} [/mm] nach der Formel [mm] e^{x}=\summe x^{i}/i! [/mm] berechnet. |
Hallo. Ich habe dazu den Quellcode und würde nun gerne wissen, ob das Struktogramm was ich dazu gemacht habe auch stimmt.
Vielen Dank schonmal.
Quellcode:
1: | #include <iostream>
| 2: | #include <cmath>
| 3: | using namespace std;
| 4: | void main()
| 5: | {
| 6: | double pot(double, int);
| 7: | int fac(int);
| 8: | int i, j;
| 9: | double x;
| 10: | double sum = 0;
| 11: | cout << "\n Geben Sie den Exponenten ein: ";
| 12: | cin >> x;
| 13: | cout << "\n Geben Sie die Anzahl n der Summenglieder ein: ";
| 14: | cin >> i;
| 15: | for(j = 0; j<i; j++)
| 16: | {
| 17: | sum += pot(x,j) / fac(j);
| 18: | }
| 19: | cout.precision(10);
| 20: | cout << "\n Ergebnis fuer ~e^" << x << " = " << sum;
| 21: | }
| 22: | double pot(double x, int i)
| 23: | {
| 24: | int j;
| 25: | double p = 1;
| 26: | for(j = 0; j < i; j++)
| 27: | p *= x;
| 28: | return p;
| 29: | }
| 30: | int fac(int i)
| 31: | {
| 32: | int j;
| 33: | int p = 1;
| 34: | for(j = 1; j <= i; j++)
| 35: | p *= j;
| 36: | return p;
| 37: | } |
Und jetzt mein Struktogramm:
[Dateianhang nicht öffentlich]
http://www.imgimg.de/uploads/Scannen00074da12f75jpg.jpg
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:40 Mo 15.09.2008 | Autor: | rainerS |
Hallo!
> Schreibe ein Programm, welches Näherungslösungen zu [mm]e^{x}[/mm]
> nach der Formel [mm]e^{x}=\summe x^{i}/i![/mm] berechnet.
> Hallo. Ich habe dazu den Quellcode und würde nun gerne
> wissen, ob das Struktogramm was ich dazu gemacht habe auch
> stimmt.
>
> Und jetzt mein Struktogramm:
>
> [Dateianhang nicht öffentlich]
Was mir auffällt: du hast in deinen beiden Modulen pot und fac jeweils eine Verzweigung innerhalb der Schleife. Woher kommt die? In deinem Programm kommt sie nicht vor, da ist eine reine Schleife.
Habt ihr nicht auch ein spezielles Symbol für den Rücksprung aus einem Modul?
Noch eine Bemerkung, die nicht direkt etwas mit der Aufgabe zu tun hat: die Berechnung, die du durchführst, ist numerisch sehr schlecht, weil du in jeder Schleife des Hauptprogramms Zähler und Nenner getrennt berechnest und dividierst. Schon für relativ kleine Werte von x bekommst du zwei sehr große Zahlen als Rückgabewert von pot bzw. fac, die daher sehr schnell zu einem Overflow führen. Besser ist es, die Zähler und Nenner gemeinsam auszurechnen, denn es handelt sich in beiden Fällen um die gleiche Anzahl von Faktoren.
Viele Grüße
Rainer
|
|
|
|