Announcement

Collapse
No announcement yet.

Lỗi gì mà kết quả cứ ra x = nan thế này @@

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [Ansi C] Lỗi gì mà kết quả cứ ra x = nan thế này @@

    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 :

    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",&deg);
    	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();
    }

LHQC

Collapse
Working...
X