rekursive Funktion < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:52 Fr 04.01.2013 | Autor: | pina7 |
Aufgabe | Intervallschachtelung
Schreiben Sie ein Programm, das die Quadratwurzel von 2 berechnet. Verwenden Sie dazu das folgende Verfahren (Hinweis: Wählen Sie für alle Variablen den Datentyp double):
1.Beginnen Sie mit der Überlegung, dass der Wert für [mm] \wurzel{2} [/mm] zwischen 1 und 2 liegen muss, Probe: 1*1 < 2 < 2*2=4. Mathematisch formuliert liegt der Wert im Intervall [1,2]. Die Intervallgrenzen a und b sind also zu Anfang a=1 und b=2.
2.Halbieren Sie das Intervall [a,b], indem Sie die Intervallmitte x berechnen. Beim ersten Durchlauf ist die Intervallmitte 1,5.
3.Berechnen Sie [mm] x^{2} [/mm] und prüfen Sie, ob sich ein Wert kleiner oder größer als 2 ergibt. Bei der ersten Berechnung ergibt sich 1,5*1,5=2,25 also ein Wert größer 2.
4.Ist der Wert größer als 2, so liegt [mm] \wurzel{2} [/mm] im Intervall [a,x]. Weisen Sie b (der oberen Intervallgrenze) den Wert von x zu: b=x;
5.Ist der Wert kleiner 2, so liegt [mm] \wurzel{2} [/mm] im Intervall [x,b]. Zuweisung: a=x;
6.Durch das Halbieren des Intervalls verkleinert sich die Intervalllänge mit jedem Berechnungsdurchlauf. Beenden Sie Ihre Berechnung, wenn gilt: b-a < 10−5 und geben Sie a und b zusammen mit der Anzahl der Berechnungsdurchläufe aus. Ist die Differenz größer, so wird die Berechnung bei Schritt 2 fortgesetzt.
7.Geben Sie zum Vergleich den Wert der Bibliotheksfunktion sqrt(2) aus.
a)Lösen Sie das Problem zunächst, indem Sie eine Schleife verwenden.
b)(schwere Aufgabe)Schreiben Sie danach ein zweites Programm, welches das Problem mit einer Funktion löst. Hier benötigen Sie keine Schleife. Allerdings müssen Sie dazu eine neue Eigenschaft von Funktionen erlernen, die sogenannte Rekursion. Eine Funktion kann sich selbst mit unterschiedlichen Parametern aufrufen. Nutzen Sie dies, um das Problem zu lösen. |
Hallo. Zunächst mein Quellcode zur Lösung des ersten Teils, ohne Funktion. Funktioniert einwandfrei.
#include "stdafx.h"
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
double a = 1;
double b = 2;
double x = 1.5;
double x_quadrat = 0;
int zaehler = 0;
cout << "Berechnung der Quadratwurzel aus 2." << endl << endl;
cout << "Annaeherung: Ergebnis liegt im Intervall [1,2]." << endl << endl;
do
{
x = (a+b)/2;
if (x_quadrat < 2)
{
a= x;
}
else if (x_quadrat > 2)
{
b = x;
}
x_quadrat = x*x;
zaehler ++;
}while ((b-a) > pow(10.0,-5.0));
cout << "Intervallmitte = " << x << endl << endl;
cout << "Quadratwurzel aus 2 = " << sqrt(2.0) << endl << endl;
cout << "a = " << a << " " << "b = " << b << endl << endl;
cout << "Anzahl Durchlaeufe: " << zaehler << endl << endl;
system("pause");
return 0;
}
Nun mein Versuch der Aufgabenlösung mit einer rekursiven Funktion. Ich glaube ich bin schon nag dran, aber mein Problem sind die Variablen. Wo muss ich diese schreiben, damit mein Programm korrekt funktioniert? Den Aufgabenteil dass dann die Anzahl der Durchläufe angegeben werden soll, habe ich noch nicht mit drin. (Habe noch keine Idee hierzu) Ich danke vielmals für Hilfe.
#include "stdafx.h"
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;
double intervallschachtelung(double a, double b, double x, double x_quadrat)
{
double x = 1.5;
double x_quadrat = 0;
double a = 1;
double b = 2;
if ((b-a) > pow(10.0,-5.0))
{
x = (a+b)/2;
if (x_quadrat < 2)
{
a= x;
}
else if (x_quadrat > 2)
{
b = x;
}
x_quadrat = x*x;
return intervallschachtelung(a,b,x,x_quadrat);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
double x = 1.5;
double x_quadrat = 0;
double a = 1;
double b = 2;
cout << "Berechnung der Quadratwurzel aus 2." << endl << endl;
cout << "Annaeherung: Ergebnis liegt im Intervall [1,2]." << endl << endl;
intervallschachtelung(a,b,x,x_quadrat);
cout << "Intervallmitte = " << x << endl << endl;
cout << "Quadratwurzel aus 2 = " << sqrt(2.0) << endl << endl;
cout << "a = " << a << " " << "b = " << b << endl << endl;
system("pause");
return 0;
}
Ich habe diese Frage in keinem anderen Forum gestellt.
|
|
|
|
Hallo pina7,
> Intervallschachtelung
> Schreiben Sie ein Programm, das die Quadratwurzel von 2
> berechnet. Verwenden Sie dazu das folgende Verfahren
> (Hinweis: Wählen Sie für alle Variablen den Datentyp
> double):
> 1.Beginnen Sie mit der Überlegung, dass der Wert für
> [mm]\wurzel{2}[/mm] zwischen 1 und 2 liegen muss, Probe: 1*1 < 2 <
> 2*2=4. Mathematisch formuliert liegt der Wert im Intervall
> [1,2]. Die Intervallgrenzen a und b sind also zu Anfang a=1
> und b=2.
> 2.Halbieren Sie das Intervall [a,b], indem Sie die
> Intervallmitte x berechnen. Beim ersten Durchlauf ist die
> Intervallmitte 1,5.
> 3.Berechnen Sie [mm]x^{2}[/mm] und prüfen Sie, ob sich ein Wert
> kleiner oder größer als 2 ergibt. Bei der ersten
> Berechnung ergibt sich 1,5*1,5=2,25 also ein Wert größer
> 2.
> 4.Ist der Wert größer als 2, so liegt [mm]\wurzel{2}[/mm] im
> Intervall [a,x]. Weisen Sie b (der oberen Intervallgrenze)
> den Wert von x zu: b=x;
> 5.Ist der Wert kleiner 2, so liegt [mm]\wurzel{2}[/mm] im Intervall
> [x,b]. Zuweisung: a=x;
> 6.Durch das Halbieren des Intervalls verkleinert sich die
> Intervalllänge mit jedem Berechnungsdurchlauf. Beenden Sie
> Ihre Berechnung, wenn gilt: b-a < 10−5 und geben Sie a
> und b zusammen mit der Anzahl der Berechnungsdurchläufe
> aus. Ist die Differenz größer, so wird die Berechnung bei
> Schritt 2 fortgesetzt.
> 7.Geben Sie zum Vergleich den Wert der Bibliotheksfunktion
> sqrt(2) aus.
> a)Lösen Sie das Problem zunächst, indem Sie eine
> Schleife verwenden.
> b)(schwere Aufgabe)Schreiben Sie danach ein zweites
> Programm, welches das Problem mit einer Funktion löst.
> Hier benötigen Sie keine Schleife. Allerdings müssen Sie
> dazu eine neue Eigenschaft von Funktionen erlernen, die
> sogenannte Rekursion. Eine Funktion kann sich selbst mit
> unterschiedlichen Parametern aufrufen. Nutzen Sie dies, um
> das Problem zu lösen.
> Hallo. Zunächst mein Quellcode zur Lösung des ersten
> Teils, ohne Funktion. Funktioniert einwandfrei.
>
>
>
> #include "stdafx.h"
> #include <iostream>
> #define _USE_MATH_DEFINES
> #include <math.h>
>
> using namespace std;
> int _tmain(int argc, _TCHAR* argv[])
> {
> double a = 1;
> double b = 2;
> double x = 1.5;
> double x_quadrat = 0;
> int zaehler = 0;
>
> cout << "Berechnung der Quadratwurzel aus 2." << endl <<
> endl;
> cout << "Annaeherung: Ergebnis liegt im Intervall [1,2]."
> << endl << endl;
>
> do
> {
> x = (a+b)/2;
>
> if (x_quadrat < 2)
> {
> a= x;
> }
> else if (x_quadrat > 2)
> {
> b = x;
> }
>
> x_quadrat = x*x;
>
> zaehler ++;
>
> }while ((b-a) > pow(10.0,-5.0));
>
> cout << "Intervallmitte = " << x << endl << endl;
> cout << "Quadratwurzel aus 2 = " << sqrt(2.0) << endl <<
> endl;
> cout << "a = " << a << " " << "b = " << b << endl <<
> endl;
> cout << "Anzahl Durchlaeufe: " << zaehler << endl <<
> endl;
>
> system("pause");
> return 0;
> }
>
x_quadrat ist dann zu berechnen, wenn x halbiert wurde.
Dann ist die if-Abfrage auszuführen.
1: |
| 2: | x = (a+b)/2;
| 3: | x_quadrat = x*x;
| 4: | if (x_quadrat < 2)
| 5: | ...
|
>
>
> Nun mein Versuch der Aufgabenlösung mit einer rekursiven
> Funktion. Ich glaube ich bin schon nag dran, aber mein
> Problem sind die Variablen. Wo muss ich diese schreiben,
> damit mein Programm korrekt funktioniert? Den Aufgabenteil
> dass dann die Anzahl der Durchläufe angegeben werden soll,
> habe ich noch nicht mit drin. (Habe noch keine Idee hierzu)
> Ich danke vielmals für Hilfe.
>
>
>
> #include "stdafx.h"
> #include <iostream>
> #define _USE_MATH_DEFINES
> #include <math.h>
>
> using namespace std;
>
> double intervallschachtelung(double a, double b, double x,
> double x_quadrat)
> {
> double x = 1.5;
> double x_quadrat = 0;
> double a = 1;
> double b = 2;
>
> if ((b-a) > pow(10.0,-5.0))
> {
> x = (a+b)/2;
>
> if (x_quadrat < 2)
> {
> a= x;
> }
> else if (x_quadrat > 2)
> {
> b = x;
> }
>
> x_quadrat = x*x;
>
> return intervallschachtelung(a,b,x,x_quadrat);
> }
>
> return 0;
> }
>
Was gibt die Funktion zurück?
Siehe oben.
> int _tmain(int argc, _TCHAR* argv[])
> {
> double x = 1.5;
> double x_quadrat = 0;
> double a = 1;
> double b = 2;
>
> cout << "Berechnung der Quadratwurzel aus 2." << endl <<
> endl;
> cout << "Annaeherung: Ergebnis liegt im Intervall [1,2]."
> << endl << endl;
>
> intervallschachtelung(a,b,x,x_quadrat);
>
> cout << "Intervallmitte = " << x << endl << endl;
> cout << "Quadratwurzel aus 2 = " << sqrt(2.0) << endl <<
> endl;
> cout << "a = " << a << " " << "b = " << b << endl <<
> endl;
>
> system("pause");
> return 0;
> }
>
a und b sind lokal in der Funtkion _tmain als auch
in der Funktion intervallschachtelung definiert. Daher
behalten a und b ihren zugewiesenen Wert in der Funktion _tmain.
>
>
> Ich habe diese Frage in keinem anderen Forum gestellt.
>
>
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:26 Fr 04.01.2013 | Autor: | pina7 |
Hallo und danke schonmal, ich bekomme es aber immer noch nicht hin...Ich habe den Code so geändert:
#include "stdafx.h"
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;
double intervallschachtelung(double a, double b)
{
double x;
double x_quadrat;
if ((b-a) > pow(10.0,-5.0))
{
x = (a+b)/2;
x_quadrat = x*x;
if (x_quadrat < 2)
{
a= x;
}
else if (x_quadrat > 2)
{
b = x;
}
return intervallschachtelung(a,b);
}
return x;
}
int _tmain(int argc, _TCHAR* argv[])
{
double a = 1;
double b = 2;
double x;
double x_quadrat;
cout << "Berechnung der Quadratwurzel aus 2." << endl << endl;
cout << "Annaeherung: Ergebnis liegt im Intervall [1,2]." << endl << endl;
intervallschachtelung(a,b);
cout << "Intervallmitte = " << x << endl << endl;
cout << "Quadratwurzel aus 2 = " << sqrt(2.0) << endl << endl;
cout << "a = " << a << " " << "b = " << b << endl << endl;
system("pause");
return 0;
}
Das mit den Variablen erschließt sich mir nicht. Ich habe nun x und x_quadrat aus der Parameterliste entfernt und als Rückgabewert x statt 0 definiert. Aber das mit der Variablendefinition an sich ist noch nicht richtig :-(
Ich muss in der Funktion ja x und x_quadrat bekannt machen aber wenn ich dann in main den Wert für x ausgeben will muss auch in main x deklariert werden. Ob ich es initialisiert habe oder nicht, funktioniert nicht... Was mache ich falsch? Danke nochmal
|
|
|
|
|
Hallo pina7,
> Hallo und danke schonmal, ich bekomme es aber immer noch
> nicht hin...Ich habe den Code so geändert:
>
> #include "stdafx.h"
> #include <iostream>
> #define _USE_MATH_DEFINES
> #include <math.h>
>
> using namespace std;
>
> double intervallschachtelung(double a, double b)
> {
> double x;
> double x_quadrat;
>
> if ((b-a) > pow(10.0,-5.0))
> {
> x = (a+b)/2;
> x_quadrat = x*x;
>
> if (x_quadrat < 2)
> {
> a= x;
> }
> else if (x_quadrat > 2)
> {
> b = x;
> }
>
> return intervallschachtelung(a,b);
> }
>
> return x;
> }
>
> int _tmain(int argc, _TCHAR* argv[])
> {
> double a = 1;
> double b = 2;
> double x;
> double x_quadrat;
>
> cout << "Berechnung der Quadratwurzel aus 2." << endl <<
> endl;
> cout << "Annaeherung: Ergebnis liegt im Intervall [1,2]."
> << endl << endl;
>
> intervallschachtelung(a,b);
>
> cout << "Intervallmitte = " << x << endl << endl;
> cout << "Quadratwurzel aus 2 = " << sqrt(2.0) << endl <<
> endl;
> cout << "a = " << a << " " << "b = " << b << endl <<
> endl;
>
> system("pause");
> return 0;
> }
>
>
>
> Das mit den Variablen erschließt sich mir nicht. Ich habe
> nun x und x_quadrat aus der Parameterliste entfernt und als
> Rückgabewert x statt 0 definiert. Aber das mit der
> Variablendefinition an sich ist noch nicht richtig :-(
> Ich muss in der Funktion ja x und x_quadrat bekannt machen
> aber wenn ich dann in main den Wert für x ausgeben will
> muss auch in main x deklariert werden. Ob ich es
> initialisiert habe oder nicht, funktioniert nicht... Was
> mache ich falsch? Danke nochmal
>
Es geht doch nur um die Variablen a und b.
Diese kannst Du z.B. global definieren.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:28 Fr 04.01.2013 | Autor: | pina7 |
Danke. Jetzt gibt es nur noch ein Problem: Der ausgegebene Wert für a und b entspricht dem initialisierten Wert von 1 und 2. Auch, wenn ich a und b von der Funktion zurückgeben lasse. Wie kann man das beheben?
Das mit dem Zaehler hab ich nun auch geschafft.
neuer Quelltext:
#include "stdafx.h"
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace std;
double a = 1;
double b = 2;
double x = 0;
double x_quadrat = 0;
int zaehler = 0;
double intervallschachtelung(double a, double b)
{
if ((b-a) > pow(10.0,-5.0))
{
x = (a+b)/2;
x_quadrat = x*x;
if (x_quadrat < 2)
{
a= x;
}
else if (x_quadrat > 2)
{
b = x;
}
zaehler ++;
return intervallschachtelung(a,b);
}
return x,zaehler;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Berechnung der Quadratwurzel aus 2." << endl << endl;
cout << "Annaeherung: Ergebnis liegt im Intervall [1,2]." << endl << endl;
intervallschachtelung(a,b);
cout << "Intervallmitte = " << x << endl << endl;
cout << "Quadratwurzel aus 2 = " << sqrt(2.0) << endl << endl;
cout << "a = " << a << " " << "b = " << b << endl << endl;
cout << "Anzahl Durchlaeufe: " << zaehler << endl << endl;
system("pause");
return 0;
}
|
|
|
|
|
Hallo pina7,
>
> Danke. Jetzt gibt es nur noch ein Problem: Der
> ausgegebene Wert für a und b entspricht dem
> initialisierten Wert von 1 und 2. Auch, wenn ich a und b
> von der Funktion zurückgeben lasse. Wie kann man das
> beheben?
> Das mit dem Zaehler hab ich nun auch geschafft.
>
>
Über den Rückgabewert der Funktion intervallschachtelung
ist nochmal nachzudenken.
Insbesondere über den Rückgabewert für den Fall,
daß die if-Abfrage nicht erfüllt wird.
Das sieht dann so aus:
1: |
| 2: | if{ ..}
| 3: | {
| 4: | ...
| 5: | return ...;
| 6: | }
| 7: | else
| 8: | {
| 9: | ...
| 10: | return ...;
| 11: | }
|
> neuer Quelltext:
>
> #include "stdafx.h"
> #include <iostream>
> #define _USE_MATH_DEFINES
> #include <math.h>
>
> using namespace std;
>
> double a = 1;
> double b = 2;
> double x = 0;
> double x_quadrat = 0;
> int zaehler = 0;
>
> double intervallschachtelung(double a, double b)
> {
> if ((b-a) > pow(10.0,-5.0))
> {
> x = (a+b)/2;
> x_quadrat = x*x;
>
> if (x_quadrat < 2)
> {
> a= x;
> }
> else if (x_quadrat > 2)
> {
> b = x;
> }
>
> zaehler ++;
>
> return intervallschachtelung(a,b);
> }
>
> return x,zaehler;
> }
>
> int _tmain(int argc, _TCHAR* argv[])
> {
> cout << "Berechnung der Quadratwurzel aus 2." << endl <<
> endl;
> cout << "Annaeherung: Ergebnis liegt im Intervall [1,2]."
> << endl << endl;
>
> intervallschachtelung(a,b);
>
> cout << "Intervallmitte = " << x << endl << endl;
> cout << "Quadratwurzel aus 2 = " << sqrt(2.0) << endl <<
> endl;
> cout << "a = " << a << " " << "b = " << b << endl <<
> endl;
> cout << "Anzahl Durchlaeufe: " << zaehler << endl <<
> endl;
>
> system("pause");
> return 0;
> }
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:07 Sa 05.01.2013 | Autor: | pina7 |
Hallo. Entschuldige bitte, ich verstehe deine Antwort nicht bzw. sie hilft mir noch nicht. Ich habe nun viele Sachen probiert, egal an welcher Stelle in der rekursiven Funktion ich die Variablen a und b zurückgeben lasse kommt es entweder zu einem Programmfehler oder die Werte bleiben bei 1 und 2.
Und welche Abfrage meinst du mit nicht erfüllen?
if ((b-a) > pow(10.0,-5.0))
oder
if (x_quadrat < 2)
else if (x_quadrat > 2)
Danke nochmals.
|
|
|
|
|
Hallo pina7,
> Hallo. Entschuldige bitte, ich verstehe deine Antwort nicht
> bzw. sie hilft mir noch nicht. Ich habe nun viele Sachen
> probiert, egal an welcher Stelle in der rekursiven Funktion
> ich die Variablen a und b zurückgeben lasse kommt es
> entweder zu einem Programmfehler oder die Werte bleiben bei
> 1 und 2.
Die Funktion kann ja nur einen Wert zurückgeben.
> Und welche Abfrage meinst du mit nicht erfüllen?
> if ((b-a) > pow(10.0,-5.0))
>
Genau, die meine ich.
> oder
>
> if (x_quadrat < 2)
> else if (x_quadrat > 2)
>
> Danke nochmals.
>
Die Funktion ist dann z.B so abzuändern:
1: |
| 2: | double intervallschachtelung(double a, double b)
| 3: | {
| 4: | double x,x_quadrat;
| 5: | double l=a;
| 6: | double r=b;
| 7: |
| 8: | if ((r-l) > pow(10.0,-5.0))
| 9: | {
| 10: |
| 11: | x = (l+r)/2;
| 12: | x_quadrat = x*x;
| 13: |
| 14: | if (x_quadrat < 2)
| 15: | {
| 16: | l=x;
| 17: | }
| 18: | else if (x_quadrat > 2)
| 19: | {
| 20: | r=x;
| 21: | }
| 22: | zaehler++;
| 23: |
| 24: | return intervallschachtelung(l,r);
| 25: | }
| 26: | else
| 27: | {
| 28: | return a;
| 29: | }
| 30: | }
|
Gruss
MathePower
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:32 Di 08.01.2013 | Autor: | pina7 |
1: |
| 2: | #include "stdafx.h"
| 3: | #include <iostream>
| 4: | #define _USE_MATH_DEFINES
| 5: | #include <math.h>
| 6: |
| 7: | using namespace std;
| 8: |
| 9: | double a = 1.0;
| 10: | double b = 2.0;
| 11: | double x = 0.0;
| 12: | double x_quadrat = 0.0;
| 13: | int zaehler = 0;
| 14: |
| 15: | double intervallschachtelung()
| 16: | {
| 17: | if ((b-a) > pow(10.0,-5.0))
| 18: | {
| 19: | x = (a+b)/2;
| 20: | x_quadrat = x*x;
| 21: |
| 22: | if (x_quadrat < 2)
| 23: | {
| 24: | a= x;
| 25: | }
| 26: | else if (x_quadrat > 2)
| 27: | {
| 28: | b = x;
| 29: | }
| 30: |
| 31: | zaehler ++;
| 32: |
| 33: | return intervallschachtelung();
| 34: | }
| 35: |
| 36: | return x,zaehler;
| 37: | }
| 38: |
| 39: | int _tmain(int argc, _TCHAR* argv[])
| 40: | {
| 41: |
| 42: | cout << "Berechnung der Quadratwurzel aus 2." << endl << endl;
| 43: | cout << "Annaeherung: Ergebnis liegt im Intervall [1,2]." << endl << endl;
| 44: |
| 45: | intervallschachtelung();
| 46: |
| 47: | cout << "Intervallmitte = " << x << endl << endl;
| 48: | cout << "Quadratwurzel aus 2 = " << sqrt(2.0) << endl << endl;
| 49: | cout << "a = " << a << " " << "b = " << b << endl << endl;
| 50: | cout << "Anzahl Durchlaeufe: " << zaehler << endl << endl;
| 51: |
| 52: | system("pause");
| 53: | return 0;
| 54: | }
|
|
|
|
|