www.vorhilfe.de
- Förderverein -
Der Förderverein.

Gemeinnütziger Verein zur Finanzierung des Projekts Vorhilfe.de.
Hallo Gast!einloggen | registrieren ]
Startseite · Mitglieder · Impressum
Forenbaum
^ Forenbaum
Status VH e.V.
  Status Vereinsforum

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Suchen
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "C/C++" - Verfahren von Heron
Verfahren von Heron < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

Verfahren von Heron: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 15:54 Sa 17.11.2007
Autor: Fibonacci-

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]
        
Bezug
Verfahren von Heron: Antwort
Status: (Antwort) fertig Status 
Datum: 16:12 Sa 17.11.2007
Autor: Martin243

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

Bezug
                
Bezug
Verfahren von Heron: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 12:13 So 18.11.2007
Autor: Fibonacci-

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 :(

Bezug
                        
Bezug
Verfahren von Heron: Antwort
Status: (Antwort) fertig Status 
Datum: 14:05 So 18.11.2007
Autor: Martin243

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

Bezug
                                
Bezug
Verfahren von Heron: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 14:35 So 18.11.2007
Autor: Fibonacci-

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!

Bezug
                                        
Bezug
Verfahren von Heron: Antwort
Status: (Antwort) fertig Status 
Datum: 20:51 So 18.11.2007
Autor: Martin243

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

Bezug
                                                
Bezug
Verfahren von Heron: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 22:31 So 18.11.2007
Autor: Fibonacci-

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)



Bezug
                                                        
Bezug
Verfahren von Heron: Antwort
Status: (Antwort) fertig Status 
Datum: 00:39 Mo 19.11.2007
Autor: Martin243

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

Bezug
                                                                
Bezug
Verfahren von Heron: Frage (beantwortet)
Status: (Frage) beantwortet Status 
Datum: 08:45 Mo 19.11.2007
Autor: Fibonacci-

Abbruchbedingung mit < [mm] \varepsilon [/mm] ?
Was ist dann die Variable Epsilon?

Bezug
                                                                        
Bezug
Verfahren von Heron: Antwort
Status: (Antwort) fertig Status 
Datum: 16:01 Mo 19.11.2007
Autor: Martin243

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

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
ev.vorhilfe.de
[ Startseite | Mitglieder | Impressum ]