Verfahren von Heron < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Aufgabe | [Dateianhang nicht öffentlich] |
Da ich das erstmal auf einfache Art und Weise lösen möchte (ohne Sqrt) habe ich diesen Code:
1: | # include <iostream>
| 2: | using namespace std;
| 3: |
| 4: | int main(){
| 5: | double x_1,a;
| 6: | int n;
| 7: |
| 8: | cout << "Geben Sie die Zahl unter der Wurzel ein: " << "\n";
| 9: | cin >> a;
| 10: | cout << "Geben Sie nun -n- an: " << "\n";
| 11: | cin >> n;
| 12: | if (a < 0){
| 13: | cout << "Fehler/Abbruch" << "\n";
| 14: | exit (-1);}
| 15: | if (n < 0){
| 16: | cout << "Fehler/Abbruch" << "\n";
| 17: | exit (-1);}
| 18: |
| 19: | for (x_1=1; x_1<=n; ){
| 20: | x_1 = 0.5*(x_1 + (a/x_1));
| 21: | }
| 22: | cout << x_1 <<"\n";
| 23: | } |
Wie könnte ich das jetzt in eine Art void (wie Aufgabenstellung) festlegen?
void Sqrt(double a,double x_1,int n)
Sei Vorausgesetzt... sollte ich das am besten vor "int-main()" setzen und vor der "for-schleife" beenden?
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
Hallo,
ich fürchte, du hast den Sinn und Zweck von Funktionen noch nicht verstanden.
Du sollst die komplette Parameterüberprüfung, Berechnung und Ausgabe in dieser Funktion unterbringen. Es wäre methodisch vielleicht besser, wenn du immer erst mit der Funktion anfingst.
In der main()-Funktion (ja, das ist auch eine Funktion) sollten nur die Eingabe (ohne Prüfung der Parameter auf Gültigkeit) und der Aufruf der Sqrt-Funktion stehen.
Du nimmst also alles vom ersten if bis zur vorletzten Zeile, schneidest es aus und packst es in die Sqrt-Funktion. Dort solltest du aber die exit-Aufrufe entfernen.
Ach ja: Du solltest noch x auf Gültigkeit prüfen! Natürlich auch in der Funktion.
Gruß
Martin
|
|
|
|
|
Wieso soll man hier x auf Gültigkeit prüfen? Das muss doch ausgerechnet werden!
Und gibt es auch alternative Exit-Operationen?
Return 0 wäre ja blödsinn :(
|
|
|
|
|
Hallo,
> Wieso soll man hier x auf Gültigkeit prüfen? Das muss doch ausgerechnet werden!
Hoppla! Mein Fehler. Ich habe übersehen, dass die Wurzel von a gesucht wird...
> Und gibt es auch alternative Exit-Operationen?
Nö!
> Return 0 wäre ja blödsinn :(
Wieso? Habe ich doch gar nicht verlangt.
Du hast hierbei mehrere Dinge nicht beachtet:
1. Die Funktion ist vom Typ void, gibt also gar nichts zurück! Sie endet einfach mit einer schließenden Klammer, also ohne exit und ohne return.
Natürlich kannst du das exit in der Funktion aufrufen, aber dafür würde dich jeder verfluchen, wenn eine Funktion einfach so aussteigt, ohne dem Programm Bescheid zu geben.
2. Wenn die Funktion nicht void wäre, dann könntest du bei Auftreten eines Fehlers einen spezifischen Code zurückgeben, der als normales Ergebnis nicht auftreten kann. Also könntest du bei ungültigem a eine -1 und bei ungültigem n eine -2 zurückgeben.
Allerdings muss man dann dafür sorgen, dass das Programm diese zusätzliche Information verarbeitet und nicht einfach als gültiges Ergebnis auffasst. Deswegen muss man hier immer Vorsicht walten lassen.
3. Da deine Funktion nun einmal void ist, hast du keine (stimmt nicht ganz) Möglichkeit, dem Programm mitzuteilen, dass der Funktionsaufruf gescheitert ist. Wenn du es trotzdem machen willst, kannst du dich mal über "errno" informieren.
4. Warum wäre return 0 Blödsinn? Eigentlich will das Programm gar nicht wissen, wie der Funktionsaufruf verlaufen ist.
Gruß
Martin
|
|
|
|
|
Ich hab die exit-Anweisungen einfach entfernt und nur die Fehlermeldung ausgeben lassen:
1: | if (var < 0 ||n < 0 ){
| 2: | cout << "Fehler/Abbruch" << "\n";
| 3: | } |
Wie sieht es denn bei "cin"-Befehlen aus? Darf man diese ohne weiteres in void einbinden?
Ansonsten müsste ich die Variablen außerhalb von void deklarieren und genau das will ich nämlich vermeiden!
|
|
|
|
|
Hallo,
> Wie sieht es denn bei "cin"-Befehlen aus? Darf man diese ohne weiteres in void einbinden?
Ja. Man darf (fast) alles überall benutzen. Das mit dem exit wäre nur sehr unschön gewesen und überflüssig.
> Ansonsten müsste ich die Variablen außerhalb von void deklarieren und genau das will ich nämlich vermeiden!
Deklarieren oder zuweisen?
Laut Aufgabenstellung soll die Zuweisung in der main-Funktion stattfinden und die Werte dann an deine Sqrt-Funktion übergeben werden.
Gruß
Martin
|
|
|
|
|
1: | #include <iostream>
| 2: | using namespace std;
| 3: |
| 4: | void sqrt(double *x, double var, int n)
| 5: | {
| 6: | for(int i=1; i<=n; i++)
| 7: | *x = 0.5*((*x) + (var/(*x)));
| 8: | }
| 9: |
| 10: | int main()
| 11: | {
| 12: | double var;
| 13: | int n;
| 14: | double x;
| 15: |
| 16: | cout << "Geben Sie die Zahl unter der Wurzel ein: " << endl;
| 17: | cin >> var;
| 18: |
| 19: | cout << "Geben Sie nun -n- an: " << endl;
| 20: | cin >> n;
| 21: |
| 22: | if(var < 0){
| 23: | cout << "Zahl unter der Wurzel < 0" << endl;
| 24: | return(1);}
| 25: |
| 26: | if(n < 0){
| 27: | cout << "n < 0" << endl;
| 28: | return(1);}
| 29: |
| 30: | x = 1;
| 31: | sqrt(&x, var, n);
| 32: | cout <<"Das Ergebnis ist: " << x << endl;
| 33: |
| 34: | return(0);
| 35: | } |
Habe das jetzt halbwegs hinbekommen!
Mich würde noch zusätzlich interessieren ob man statt n - Schritten ein Epsilon wählen kann:
|x_approximation - [mm] \wurzel{var} [/mm] | < [mm] \varepsilon
[/mm]
am besten mit einer void sqrt2 (double var;double x;double epsilon)
|
|
|
|
|
Hallo,
> Mich würde noch zusätzlich interessieren ob man statt n - Schritten ein Epsilon wählen kann:
>
> |x_approximation - [mm] \wurzel{var} [/mm] | < [mm] \varepsilon [/mm]
Klar!
Da du allerdings den genauen Wert nicht kennst, weil ihn ja gerade erst berechnen sollst, musst du innerhalb deiner Sqrt2-Funktion eine lokale Variable x_old einführen. Dann sieht deine Abbruchbedingung so aus:
|x_approximation - x_old | < [mm] \varepsilon [/mm]
Auch wenn ich Gefahr laufe mich zu wiederholen: Deine Lösung genügt nicht der Aufgabenstellung:
1. Die Signatur der Sqrt-Funktion soll sein:
void Sqrt(double, double, int);
Deine ist:
void sqrt(double*, double, int);
2. Die Gültigkeitsprüfung der Parameter soll innerhalb von Sqrt stattfinden.
3. Das Ergebnis soll von der Sqrt-Funktion ausgegeben werden, nicht von der main-Funktion.
Gruß
Martin
|
|
|
|
|
Abbruchbedingung mit < [mm] \varepsilon [/mm] ?
Was ist dann die Variable Epsilon?
|
|
|
|
|
Hallo,
du hast die Variable ins Spiel gebracht, also wirst du dir auch etwas dabei gedacht haben. Vermutlich gibst du statt eines ganzzahligen n einen kleinen double-Wert für [mm] $\epsilon$ [/mm] an, der unterschritten werden muss.
Gruß
Martin
|
|
|
|