2017-03-29 49 views
0

这段代码是顺利航行,直到我明确地包含IF-STATEMENT在DO-WHILE LOOP内部包含BREAK,如果fv1 = 0(对于任何被零除的值是未定义的),应该报告数学错误。但是,意外的结果被打印出来。如何成功摆脱这种do-while循环?

#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; 
} 

回答

2

break语句结束最近的封闭循环或条件语句中出现它的执行 -

顺便说一下你对FV1分配0。

使用

if (fv1 == 0) 

if (0 == fv1) 
+0

所以休息不会终止DO-WHILE循环? –

+0

@标记路易在'if(fv1 = 0)'你将0赋值给'fv1',然后测试它是真还是假。它总是错误的,因为你将**赋值给** 'fv1' – peedurrr

+0

@Mark - 是的,它会 - “条件陈述”是一种用词不当...... if(bool){break; }将退出循环包含条件,而不是条件。 – John

2

尝试改变,如果条件从fv1=0fv1==0 这是赋值运算符= ,而这是比较运营商==

+1

好的答案。您可以扩展您的答案,以澄清为什么“if(fv1 = 0)”检查失败。未来找到答案的人可能不知道为什么C++会将“fv1 = 0”的结果视为false。 –

+0

好吧,现在它工作。谢谢先生。应该使用比较运算符。现在我不知道break语句是否会让我脱离DO-WHILE LOOP,是吗? –

+0

非常感谢@ a-levy我是这里的新手。我将不得不编辑我的答案来解释,对吧? – Umair