2017-03-29 4 views
0

Dieser Code war glatt Segeln, bis ich ausdrücklich die IF-Anweisung mit einem Break innerhalb der DO-WHILE LOOP, die einen mathematischen Fehler melden sollte, wenn fv1 = 0 (für alles durch Null ist nicht definiert). Es wurden jedoch unerwartete Ergebnisse gedruckt.Wie komme ich erfolgreich aus dieser Do-While-Schleife?

#include <iostream> 
#include <cmath> 
#include <iomanip> 

using namespace std; 

const double R = 0.082054; 
double f(double a,double b,double P,double T,double v); 
double f(double a,double b,double P,double T,double v) 
{ 
    double q =P*pow(v,3)-(P*b+R*T)*pow(v,2)+a*v-a*b; 
    return q; 
} 
double fPrime(double a,double b,double P,double T,double v); 
double fPrime(double a,double b,double P,double T,double v) 
{ 
    double s =3*P*pow(v,2)-2*(P*b+R*T)*pow(v,1)+a; 
    return s; 
} 
int main() 
{ 
//INPUT STAGE! 
cout << "Use gas constant, R: " << R << endl; 

double a,b,P,T,Tc; 
cout << "\nUse test value, a: "; 
cin >> a; 
cout << "\nUse test value, b: "; 
cin >> b; 
cout << "\nUse pressure, P (atm): "; 
cin >> P; 
cout << "\nUse absolute temperature, T (K): "; 
cin >> T; 

double v,v1=0,fv,fv1,N,e; 
int iteration = 0; 
cout << "\nUse initial guess for molal volume, v: "; 
cin >> v; 
cout << "\nUse maximum number of iterations, N: "; 
cin >> N; 
cout << "\nUse tolerance, e: "; 
cin >> e; 
cout << "\n"; 

do 
{ 
    v = v1; 
    fv = f(a,b,P,T,v); 
    fv1 = fPrime(a,b,P,T,v); 
    if (fv1=0) 
    { 
     cout << "Math Error"; 
     break; 
    } 
    v1 = v-(fv/fv1); 
    cout << iteration+1 << setw(12) << v << setw(16) << v1 << setw(16) << abs(v1-v) << endl; 
    iteration++; 
} 
while(iteration<N && abs(v1-v)>e); 

return 0; 
} 

Antwort

2

Die break-Anweisung beendet die Ausführung der nächsten einschließenden Schleife oder bedingte Anweisung in dem es erscheint -

Und übrigens sind Sie 0 bis fv1 zuweisen.

Verwendung

if (fv1 == 0) 

oder

if (0 == fv1) 
+0

so der Bruch wird nicht Beende die DO-WHILE-Schleife? –

+0

@ Mark-Louie in 'if (fv1 = 0)' Sie geben Null zu 'fv1' und dann testen, um zu sehen, ob es wahr oder falsch ist. Es wird immer falsch sein, weil Sie ** 0 zuweisen ** 'fv1' – peedurrr

+0

@Mark - Ja, wird es - die" bedingte Aussage "ist eine falsche Bezeichnung ... if (bool) {break; } beendet dich aus der Schleife, die die Bedingung enthält, nicht nur die Bedingung. – John

2

Versuchen Sie, wenn die Bedingung fv1=0-fv1==0 Dies ist Zuweisungsoperator = während dies vergleicht Betreiber ==

+1

Gute Antwort. Sie können Ihre Antwort erweitern, um zu klären, warum die Prüfung "if (fv1 = 0)" fehlschlägt. Zukünftige Leute, die Ihre Antwort finden, wissen vielleicht nicht, warum C++ das Ergebnis von "fv1 = 0" genauso behandelt wie falsch. –

+0

Ok, jetzt hat es funktioniert. Danke, mein Herr. Ein Vergleichsoperator sollte verwendet werden. Jetzt weiß ich nicht, ob die Break-Anweisung mich aus dem Do-While-Loop herausholen würde, oder? –

+0

Vielen Dank @ a-levy Ich bin ein Neuling hier. Ich muss meine Antwort bearbeiten, um das zu erklären, oder? – Umair