Em viết 1 chương trình nhỏ để giải phương trình nhưng bị lỗi :
1/ double x = (2*sqrt(denta)*cos(acos(k)/3-2.094395102)-b)/(3*a); thì sao cứ ra x = nan hoài ????
2/ Khi đưa vào chương trình hệ số lớn ( cỡ 3 chữ số ) là chương trình chạy giữa chừng là đứng máy ???
Đây là code :
1/ double x = (2*sqrt(denta)*cos(acos(k)/3-2.094395102)-b)/(3*a); thì sao cứ ra x = nan hoài ????
2/ Khi đưa vào chương trình hệ số lớn ( cỡ 3 chữ số ) là chương trình chạy giữa chừng là đứng máy ???
Đây là code :
Code:
/* chuong trinh giai phuong trinh bac n */ #include<stdio.h> #include<conio.h> #include<math.h> #include<dos.h> #include<windows.h> void TextHello(){ // In lời chào for(int i=0;i<=70;i++) printf("*"); printf("\nChao mung ban den voi chuong trinh GIAI GAN DUNG NGHIEM PHUONG TRINH\n"); for(int i=0;i<=70;i++) printf("*"); } void TextGoodbye(){ // In lời kết thúc for(int i=0;i<=70;i++) printf("*"); printf("\nA-TEAM cam on ban da su dung chuong trinh\n"); for(int i=0;i<=70;i++) printf("*"); } void TextNum(int num){ // In số nghiệm phương trình if(num==-1) printf("\nPhuong trinh co vo so nghiem"); if(num==0) printf("\nPhuong trinh vo nghiem"); if(num==1) printf("\nPhuong trinh co nghiem duy nhat :"); else if(num>=2) printf("\nPhuong trinh co %d nghiem :",num); } int DegCheck(int deg){ // Kiểm tra bậc pt có trong phạm vi giải không if(deg<=0||deg>=24) return 0; else return 1; } int Lenght(int loop, float step){ int count = 0; int between = -10*loop; int steptemp = 10*step; while(between<10*loop){ between += steptemp; count ++; } return count+1; } int Equal(float a, float b){ int true = 1; int false = 0; } long double f(int deg, float heso[], float x){ float F = 0; for(int i=0;i<=deg;i++) F = F+heso[i]*pow(x,deg-i); return F; } int Count(long double Value[], int lenght){ // Đếm số nghiệm pt int count = 0; for(int i=0;i<lenght-1;i++){ if(Value[i]*Value[i+1]<=0) count++; else count += 0; } return count; } int Find(long double value1, long double value2){ if(value1*value2<=0) return 1; else return 0; } void Solve1(float a[]){ // Giải pt bậc 1 int many = -1; int none = 0; if(a[0]==0){ if(a[1]==0) TextNum(-1); else TextNum(0); } else{ TextNum(1); printf("\n\n x = %f",-a[1]/a[0]); } } void Solve2(float a[]){ // Giải pt bậc 2 if(a[0]==0) { float aa[2]; for(int i=1;i<=2;i++) aa[i-1] =a[i]; Solve1(aa); } else if(a[0]!=0){ float d = a[1]*a[1]-4*a[0]*a[2]; if(d<0){ TextNum(2); printf("\n\n x1 = %f+%f.i",-a[1]/(2*a[0]),sqrt(-d)/(2*a[0])); printf("\n\n x2 = %f-%f.i",-a[1]/(2*a[0]),sqrt(-d)/(2*a[0])); } if(d==0){ TextNum(1); printf("\n\n x = %f",-a[1]/a[0]); } else if(d>0){ TextNum(2); printf("\n\n x1 = %f",(-a[1]+sqrt(d))/(2*a[0])); printf("\n\n x1 = %f",(-a[1]-sqrt(d))/(2*a[0])); } } } void Solve3(float heso[]){ // Giải pt bậc 3 - chỗ này x cứ ra nan ?? float a=heso[0]; float b=heso[1]; float c=heso[2]; float d=heso[3]; float denta = b*b-3*a*c; float k = (9*a*b*c-2*b*b*b-27*a*a*d)/(sqrt(pow(fabs(denta),3))); if(d>0){ if(fabs(k)<=1){ TextNum(3); double x1 = (2*sqrt(denta)*cos(acos(k)/3)-b)/(3*a); double x2 = (2*sqrt(denta)*cos(acos(k)/3-2.094395102)-b)/(3*a); double x3 = (2*sqrt(denta)*cos(acos(k)/3+2.094395102)-b)/(3*a); printf("\n\n x1 = %f \n\n x2 = %f \n\n x3 = %f",x1,x2,x3); } else if(fabs(k)>1){ double x = (sqrt(denta)*fabs(k)/(3*a*k))*(cbrt(fabs(k)+sqrt(k*k-1))+cbrt(fabs(k)-sqrt(k*k-1)))-b/(3*a); TextNum(1); printf("\n\n x = %f",x); } } if(d<0){ double x = (sqrt(denta)/(3*a))*(cbrt(fabs(k)+sqrt(k*k-1))+cbrt(fabs(k)-sqrt(k*k-1)))-b/(3*a); TextNum(1); printf("\n\n x = %f",x); } else if(d==0){ double x = (-b+cbrt(b*b*b-27*a*a*d))/(3*a); TextNum(1); printf("\n\n x = %f",x); } } float SolveN(float a, float b, int deg, float heso[]){ // Giải pt bậc >= 4 const float e = 1E-10; float c = (a+b)/2; if(f(deg,heso,a)==0) return a; if(f(deg,heso,b)==0) return b; if(f(deg,heso,c)==0) return c; else{ while(f(deg,heso,c)>e){ if(f(deg,heso,a)*f(deg,heso,c)<0) { c = SolveN(a,c,deg,heso); } if(f(deg,heso,b)*f(deg,heso,c)<0) { c = SolveN(c,b,deg,heso); } else break; } return c; } } void main(void){ int loop = 50; float step = 0.1f; int deg; int again; TextHello(); begin : printf("\n\nBan muon giai phuong trinh bac may' ? : "); scanf("%d",°); int check = DegCheck(deg); if(check==0){ printf("\nXin loi, phuong trinh bac %d khong nam trong pham vi xu ly cua chuong trinh",deg); goto begin; } else{ float heso[deg+1]; printf("\nPhuong trinh cua ban co dang : "); for(int i=0;i<=deg-2;i++) printf("%cx^%d+",65+i,deg-i); printf("%cx+%c = 0 \n",64+deg,65+deg); for(int i=0;i<=deg;i++){ printf("\n Nhap he so' %c : ",65+i); scanf("%f",&heso[i]); } switch(deg){ case 1 : Solve1(heso); break; case 2 : Solve2(heso); break; default : Sleep(0); printf("\n Dang tinh'..."); float x[Lenght(loop,step)]; for(int i=0;i<Lenght(loop,step);i++) x[i]=-loop+i*step; long double fx[Lenght(loop,step)]; for(int i=0;i<Lenght(loop,step);i++) fx[i]=f(deg,heso,x[i]); int count = Count(fx,Lenght(loop,step)); int u = 0; printf("\r "); printf("\r"); TextNum(count); float a[count]; float b[count]; float result[count]; for(int i=0;i<Lenght(loop,step)-1;i++){ if(Find(fx[i],fx[i+1])==1){ a[u]=x[i]; b[u]=x[i+1]; u++; } } for(int i=0;i<count;i++) { printf("\n\n Dang tinh'..."); Sleep(2000); printf("\r "); printf("\r x%d = %f",i,SolveN(a[i],b[i],deg,heso)); } break; } } end : printf("\n\nBan co muon tiep tuc khong ? (1=Yes/0=No) : "); scanf("%d",&again); if(again==1) goto begin; if(again==0) goto over; else goto end; over : printf("\n"); TextGoodbye(); printf("\n"); getch(); }