📄 解高次幂方程12.cpp
字号:
#include<math.h>
#include<stdio.h>
#include<conio.h>
#define NN 3 //设置最高次幂
char ch; //判别键盘输入字符值,alter()中须传值到主函数中使用
//double x_min,x_max;
float a[NN+1];
float fuction(float x)
{int i;
float sum=0;
for(i=0;i<=NN;i++)
sum+=a[i]*pow(x,i);
return sum;
}
int check_f (void)
{char ch; int i;
//clrscr(); ??????????????????
printf("你输入的方程是:\nf(x)=");
if(a[0]>0.0001||a[0]<-0.0001) printf("(%.2f)",a[0]);
if(a[1]>0.0001||a[1]<-0.0001) printf("+(%.2f)*x",a[1]);
for(i=2;i<=NN;i++)
if(a[i]>0.0001||a[i]<-0.0001) printf("+(%.2f)*x^%d",a[i],i);
printf("\n你确认输入正确?(Y/N)");
label:ch=getch();
if(ch=='Y'||ch=='y') return 0;//正确返回 1,只退出当前子程序
else if(ch=='N'||ch=='n') return 1;
else {printf("please input 'y'(yes) or 'N'(NO)!");goto label;}
}
void alter(void)
{//用全局ch, 对主函数中是否需退出判断
int i=-1; //设置初始值,使能进入循环
printf("do you want to modify?(press 'N' to quit)");
getch(); //note:接收回车键 ,否则流中的值将赋值给ch,于是将不等待输入就越过
ch=getchar();
if(ch=='N'||ch=='n') return;
else
{ while( i<0||i>NN )
{printf("请输入需要修改的项:(0~~~%d)",NN);scanf("%d",&i); }
printf("a[%d]:(必须输入实数,不能为字母)",i);
scanf("\t%f",&a[i]);
}
}
int main (void)
{int i,flag;
//flag=1时,输入的区间是f(min)<0,f(max)>0,flag=0时,输入的区间是f(min)>0,f(max)<0
float min,max,mid,key,f;
printf("请输入%d个函数的系数:(即最高次%d次)\n系数的形式为(低次先输入):",NN+1,NN);
printf("\nf(x)=a[0]+a[1]x+a[2]x^2+....+a[N]x^N\n");
for(i=0;i<=NN;i++)
{printf("a[%d]:\t",i);
scanf("%f",&a[i]);
}
if( check_f() )
{alter();
if(ch=='N'||ch=='n') goto quit;} // 只在输入'n',既不修改时退出
label1: printf("\n输入解的区间[min,max]\nmin:");
scanf("%f",&min);
printf("max:");
scanf("%f",&max);
// x_max=max;x_min=min; //保存方程根所在区间
if(fuction(min)*fuction(max)>0)
{ printf("此区间不符合要求,请重新"); goto label1;}
{if(fuction(min)<0) flag=1; else flag=-1;}
mid=(min+max)/2;
f=fuction(mid);
while( f>0.001 || f<-0.001 ) //设置解的精度
{if((f*flag)>0) max=mid;
else min=mid;
mid=(min+max)/2;
f=fuction(mid);}
key=mid;
printf("方程的解是:%.3f\n",key);
quit:return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -