Einbauen einer Schleife
-
Hallo, ich möchte gern ein kleines Programm schreiben mit dem man Nullstellen einer Funktion berechenen kann.
Wenn es eine Nullstelle gibt funktioniert das Programm auch nur wenn es keine
gibt wird die if Bedingung endlos wiederholt.
Wie kann ich jetzt eine Schleife einbauen, dass die if Bedingung z.B. 100mal
wiederholt und wenn dann immernoch xn!=x ist irgendeine Meldung ausgegeben wird?Hab das hier alles ein bischen gekürzt, aber von Prinzip ist es das gleiche:
#include "stdafx.h" #include "iostream.h" int main(int argc, char* argv[]) { float a,b ; //Zahlen bzw. Multiplikatorn der Gleichung float x,xn; //x und y Wert cout <<"\n Bitte Wert fuer a eingeben:"; //Einlesen Wert von a cin >> (a); cout <<"\n Bitte Wert fuer b eingeben:"; //Einlesen Wert von b cin >> (b); cout <<"\n\n"; cout <<"\n Gewuenschten Wert fuer x eingeben (Startwert):"; //Einlesen des Gewünschten x Wertes cin >> (x); cout <<"\n\n"; Gleichung: //An diese Stelle wird gesprungen, wenn xn ungleich x ist xn = x-((a * x*x)+b)/(2*a * x); //Berechnet die Funktion x = xn-((a * xn*xn)+b)/(2*a * xn); if(xn!=x) { goto Gleichung; } else if(xn==x) { cout<<" Nullstelle ist:"<<xn; } return 0; }Vielen Dank schon mal für eure Hilfe.
Gruß marwin
-
wie wäre es mit einer for schleife
#include "stdafx.h"//die kenn ich nicht #include "iostream.h//das sollte hier #include <iostream> heisen // dann brauchst du noch using namespace std; //weil die nicht nach dem iso standart ist
-
und/oder einer while schleife
-
btw solltest du diese goto-Gehüpfe durch eine echte Schleife ersetzen:
int counter; while(xn!=x&&counter<max_counter)//der counter bricht die Rechnung ab, wenn es zu lange dauert { xn=...; x=...; ++counter; } if(xn==x) cout<<"Nullstelle gefunden:"<<xn<<endl; else cout<<"keine Nullstelle."<<endl;@g: "stdafx.h" sind die vorkompilierten Header von Visual Studio

-
Anbei die Lösung für die Fortgeschrittenen.
Es wird streng getrennt zwischen der Funktion, dem Lösungsalgorithmus und der Eingabe der Parameter und Ergebnisdarstellung.
Es ist zu empfehlen Fließkommavariablen nicht auf Gleichheit sondern auf eine zulässige Abweichung (EPS) hin abzufragen.#include <iostream> #include <utility> // std::make_pair #include <cmath> // std::abs struct Funktion { Funktion( double a, double b ) : m_a( a ) , m_b( b ) {} double operator()( double x ) const { return ( m_a * x * x + m_b ) / ( 2 * m_a * x ); } private: double m_a; double m_b; }; // -- solve: findet eine Nullstelle von 'f'; beginned bei 'x' // EPS gibt die zulässige Abweichung des Funktionswertes von 0 an // N ist die maximale Anzahl der Iterations-Schritte // Return-Wert.second ist true, falls eine Nullstelle gefunden wurde template< typename F > std::pair< double, bool > solve( F f, double x, const double EPS, const int N ) { int n = 0; for( double y; x -= (y = f( x )), std::abs( y ) > EPS && n < N; ++n ) ; return std::make_pair( x, n < N ); } int main() { using namespace std; cout << "Bitte zwei Zahlen eingeben: "; double a, b; cin >> a >> b; cout << "Bitte Startwert eingeben: "; double x; cin >> x; const Funktion f( a, b ); const std::pair< double, bool > ret = solve( f, x, 1.E-8, 20 ); if( ret.second ) { cout << "Die Nullstelle liegt bei: " << ret.first << endl; cout << "F( " << ret.first << " ) = " << f( ret.first ) << endl; } else { cout << "keine Nullstelle gefunden" << endl; } }Gruß
Werner
-
Danke erstmal an alle für die Mühe.

@ CStoll, wenn ich den Code rein kopiere, dann sagt er mir:
: error C2065: 'max_counter' : nichtdeklarierter Bezeichner : error C2059: Syntaxfehler : '...' : error C2059: Syntaxfehler : '...'Muss ich noch sonst irgendetwas ändern???
Gruß marwin
-
CStoll schrieb:
btw solltest du diese goto-Gehüpfe durch eine echte Schleife ersetzen:
Ach Quatsch. Das ist schon in Ordnung so.

-
marwin schrieb:
Danke erstmal an alle für die Mühe.

@ CStoll, wenn ich den Code rein kopiere, dann sagt er mir:
: error C2065: 'max_counter' : nichtdeklarierter Bezeichner : error C2059: Syntaxfehler : '...' : error C2059: Syntaxfehler : '...'Muss ich noch sonst irgendetwas ändern???
Gruß marwin
Du solltst den Code nicht 1 zu 1 übernehmen, sondern an deine Bedürfnisse anpassen - und die "..."-Sequenzen ersetzt du natürlich durch sinnvolle Code-Elemente aus deinem Programm.
(so viel Verständnis von C++ hätte ich dir eigentlich schon zugetraut)