#include <iostream> using namespace std; #include <math.h> //--------------函数方程f(x) = x^3 ;这个方程是独立的模块,可以更换,但必须是是连续函数----------- template<typename elem> elem f(elem x) { return pow(x,3);//---------假设方程为 f(x)= x^3 } void main() { double a=0.0; double b=0.0; double omega =0.0; do { cout<<" 解的范围中下限 a 必须小于上限 b "; cout<<"请输入解所在的范围的界限[a,b]"<<endl; //------------ cout<<"请输入a = "<<endl; // double a=0.0; //----------变量定义在循环体中,它的生命周期仅限于此。所以,编译器提示while(a>=b) 中a,b没有定义 cin>>a; //------------ cout<<"请输入b = "<<endl; // double b=0.0; cin>>b; //------------ cout<<"请输入精度要求 :omega = "<<endl; // double omega =0.0; cin>>omega; } while (a>=b);//============ //===='a' : undeclared identifier;'b' : undeclared identifier //-----------------检查a ,b 是否是方程的根------------------------------ if (f(a)==0 ) { cout<<a<<" 是方程的一个根"<<endl; } if (f(b) ==0) { cout<<b<<" 是方程的一个根"<<endl; } //-----------------f(a)*f(b)< 0 ,且 f 函数在[a,b]连续,则(a,b) 中必有解------------------------------- double x=0.0; if(f(a)*f(b) < 0) { do { x = (a+b)/2; if (f(x)*f(a)>0) { a = x; } else if (f(x)*f(a)<0) { b =x; } else break;//------如果已经f(x)f(a) = 0 } while (b-a>omega); } else cout<<"请确保 f(a)*f(b) < 0 ?"<<endl; cout<<" 在精度 "<<omega <<" 下的近似解是 x = "<<x; } /************************************************************************/ /* 经验: 1 。不要在循环体中定义变量,因为在多次嵌套中可能会使得变量的生命周期和使用范围发生变化, 查错比较隐蔽,不好查——还得分析每个变量的使用范围 2 。 变量定义时必须随即初始化。 */ /************************************************************************/