最新求解方程源程序.docx
- 文档编号:14091597
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:14
- 大小:17.23KB
最新求解方程源程序.docx
《最新求解方程源程序.docx》由会员分享,可在线阅读,更多相关《最新求解方程源程序.docx(14页珍藏版)》请在冰点文库上搜索。
最新求解方程源程序
#include"iostream.h"
#include"stdio.h"
#include"conio.h"//基本输入输出文件
#include"string.h"
#include"stdlib.h"//定义杂项函数及内存分配函数
#include"ctype.h"//字符处理
#include"math.h"
charterms[99][20];
classEquation//定义类Equation
{
public:
Equation()
{}
voidjecfc(int,int,int);//解二次方程
voidgetterm(char*,char*,int&);//存放方程各项
voidgetyz(int*,int&,int);//得到因子
voidjc(char*,char*,float);//降次
voidgettermf(char*,char*,int);//得到指定幂的项
intgetxs(char*);//得到系数(整数)
intgetqium(char*);//求幂
intyang(char*,float);//检验根是否正确
intexp(int,int);//求某数的次方(整数)
floatknyz(int*,int*,int,int,char*);//求所有可能的根
floatexp(float,int);//求某数的次方(实数)
//返回equ的系数乘以val的equ的次数的次方的值
floatcalcequval(char*,float);
};
voidmain()
{
cout<<"使用说明(允许&不允许):
"< cout< cout<<"1.在输入的方程后面不能输入=;"< cout<<"2.所输入的方程必须是从高次到低次依次输入;"< cout<<"3.若某项系数为0,可以不输入或输入0作为系数;"< cout<<"4.不要用分数作为系数且第一项系数绝对值不小于一;"< cout<<"5.要用x^n表示指数,x^n一可以,但不能用x^n表示。 "< cout< EquationE; char*equ,*equ2; intloc=0,a=0,b=0,c=0,numterms; intdeg,f_a[1000],f_k[1000],num_a,num_k; inti; floatresult; equ=newchar[5000]; equ2=newchar[5000]; cout<<"请输入方程: "< gets(equ); if(strlen(equ)==0) { cout<<"没有输入方程! "< } for(i=0;i<99&&equ[loc]! ='='&&equ[loc]! ='\0'&&equ[loc]! ='\n';i++) E.getterm(equ,terms[i],loc); numterms=i; if((deg=E.getqium(terms[0]))<2) { cout<<"无效输入,输入的方程最高次应大于等于2次"< return; } cout<<"该方程的根为: "; while(deg>2) { E.getyz(f_a,num_a,E.getqium(terms[0])); for(i=1;i { if(E.getqium(terms[i])==0) { c=E.getxs(terms[i]); } } E.getyz(f_k,num_k,c); if((result=E.knyz(f_a,f_k,num_a,num_k,equ))==0) if(result<0.0f&&result>-0.05f) { cout<<"错误! 不能解得根。 "< return; } E.jc(equ,equ2,result); strcpy(equ,equ2); loc=0; for(i=0;i<99&&equ[loc]! ='='&&equ[loc]! ='\0'&&equ[loc]! ='\n’;i++) E.getterm(equ,terms[i],loc); numterms=i; deg--; } for(i=1;i if(E.getqium(terms[i])==1) b=E.getxs(terms[i]); for(i=1;i if(E.getqium(terms[i])==0) c=E.getxs(terms[i]); E.jecfc(E.getxs(terms[0]),b,c); } voidEquation: : jecfc(inta,intb,intc)//解二次方程 { intr1,r2,r3; floatr11,r12; if(b*b-4*a*c<0) { r1=b*-1; r2=(b*b-4*a*c)*-1; r3=2*a; cout<<"("< cout<<","; cout<<"("< } else { if(sqrt(b*b-4*a*c)-(int)sqrt(b*b-4*a*c)==0) { r11=(float)(-b+sqrt(b*b-4*a*c))/(2*a); r12=(float)(-b-sqrt(b*b-4*a*c))/(2*a); cout< } else { r1=b*-1; r2=b*b-4*a*c; r3=2*a; cout<<"("< cout<<","; cout<<"("< } } cout< } voidEquation: : getterm(char*src,char*dest,int&loc)//存放方程各项 { intloc2=0; if(src[loc]=='-') { dest[loc2]='-'; loc2++; } for(;src[loc+loc2]! ='+'&&src[loc+loc2]! ='-'&&src[loc+loc2]! ='\n'&&src[loc+loc2]! ='\0'&&src[loc+loc2]! ='=';loc2++) dest[loc2]=src[loc+loc2]; dest[loc2]='\0'; loc+=loc2; if(src[loc]! ='-'&&src[loc]! ='\0') loc++; } voidEquation: : getyz(int*yz_list,int&num,intval)//得到因子 { inti,fcount=0; num=0; val=abs(val); for(i=1;i<=val;i++) if((float)((float)((float)val/(float)i)-(int)((float)val/(float)i))==0.0f) { num++; yz_list[fcount]=i; fcount++; } } intEquation: : getxs(char*term)//得到系数 { char*temp; inti=0,mult=1; temp=newchar[strlen(term)]; if(term[0]=='-') { mult=-1; i++; } for(;! isdigit(term[i])&&! isalpha(term[i]);i++); if(term[i]=='x') returnmult; for(intj=0;isdigit(term[i+j]);j++) temp[j]=term[i+j]; returnatoi(temp)*mult; } intEquation: : getqium(char*term)//求幂 { chartemp[10]; if(strchr(term,'x')! =NULL) { if(strchr(term,'^')! =NULL) { for(inti=0;term[i]! ='^';i++); i++; for(intj=0;isdigit(term[i]);i++,j++) temp[j]=term[i]; temp[j]='\0'; returnatoi(temp); } else return1; } else return0; } intEquation: : yang(char*equ,floatroot)//检验根是否正确 { charterms[99][40]; floatval[99],totalval=0; intloc=0; for(inti=0;equ[loc]! ='='&&equ[loc]! ='\0'&&equ[loc]! ='\n';i++) getterm(equ,terms[i],loc); intnumterms=i; for(i=0;i { val[i]=calcequval(terms[i],root); totalval+=val[i]; } if(totalval*0.99f>-0.002f&&totalval*0.99f<0.002f) return0; else return1; } intEquation: : exp(intval,inte)//求某数的次方(整数) { intv2=val; if(e==0)return1; for(inti=1;i returnv2; } floatEquation: : exp(floatval,inte)//求某数的次方(实数) { floatv2=val; if(e==0)return1.0f; for(inti=1;i returnv2; } //返回equ的系数乘以val的equ的次数的次方的值 floatEquation: : calcequval(char*equ,floatval) { intcoeff=getxs(equ); intpower=getqium(equ); returncoeff*exp(val,power); } voidEquation: : jc(char*base,char*newequ,floatyz)//降次 { intsynthterms[99]; intnewterms[99]; intj=0,olddegree; chartemp[50]="",exp[10]="",exp1[10]=""; charnewequ1[20],newequ2[20]; if(yang(base,yz))return; olddegree=getqium(terms[0]); for(inti=0;i<=olddegree;i++) { gettermf(base,temp,i); synthterms[i]=getxs(temp); } newterms[olddegree-1]=(int)synthterms[olddegree]; for(i=olddegree-1;i>=1;i--)newterms[i-1]=(int)((float)(newterms[i]*yz+synthterms[i])); for(i=olddegree-1;newterms[i]==0;i--); strcpy(newequ,""); for(;i>=0;i--) { if(newterms[i]! =0) { switch(i) { case0: strcpy(exp,""); break; case1: strcpy(exp,"x"); break; default: itoa(i,exp1,10); strcpy(exp,"x^"); strcat(exp,exp1); break; } if(newterms[i]! =1) { if(newterms[i]<0) { itoa(newterms[i],newequ1,10); strcat(newequ1,exp); } else { if(i { strcpy(newequ1,"+"); itoa(newterms[i],newequ2,10); strcat(newequ1,newequ2); strcat(newequ1,exp); } else { itoa(newterms[i],newequ1,10); strcat(newequ1,exp); } } } else { if(newterms[i]<0) strcpy(newequ1,exp); else { if(i { strcpy(newequ1,"+"); strcat(newequ1,exp); } else strcpy(newequ1,exp); } } if(newterms[i]==1&&exp[0]=='\0') { if(newterms[i]>0) { strcpy(newequ1,"+"); itoa(newterms[i],newequ2,10); strcat(newequ1,newequ2); } else { itoa(newterms[i],newequ1,10); } } strcat(newequ,newequ1); } } } //得到指定幂的项 voidEquation: : gettermf(char*equ,char*dest,intpower) { intt=getqium(terms[0]); for(inti=0;i if(getqium(terms[i])==power) { strcpy(dest,terms[i]); return; } strcpy(dest,"0"); } //求所有可能的根 floatEquation: : knyz(int*a,int*k,intn_a,intn_k,char*equ) { for(inti=0;i { for(intj=0;j { if(yang(equ,(float)((float)k[j]/(float)a[i]))==0) { intr=k[j]/a[i]; cout< return(float)r; } if(yang(equ,(float)((float)k[j]/(float)a[i])*-1.0f)==0) { intr=-k[j]/a[i]; cout< return(float)r; } } } if(yang(equ,0)==0) { cout<<"0"<<","; return0; } returnNULL; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 求解 方程 源程序