C语言的程序,但是测试时总出错。。。请高手指点下

应该是直接复制就能跑的,小小的有点复杂,有兴趣的朋友可以留个QQ,我把题目发给你,要是能直接找到问题更好。

区间里面的数字,全部取最小值的时候出问题。
比如k=0.1 , a=0 , b=0 , d=1 , w=1 , z=1, r=2
就会拿不到结果。。。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main()

{ int r;
float a,b,d,k,w,z; /* input */
float s_kbd,kbd,wzr,wr,zr,wz; /* sub equation label */
float Qr1,Qr2,Gr,Qr,F,kaq; /* final Q(r) & G(r) label */

printf("\nF = G(r)*[1+k^3*a/Q(r)]\n\n");
printf("G(r) = (b*w^r+d*z^r)/[1+(w/r)^r]\n\n");
printf("Q(r) = [(b*w^r)/(d*z^r)]*[1+(k^2-bd)^(1/2)]\n\n");

printf("k[ 0.1 - 10 ] a[ 0 - 1 ]\n");
printf("b[ 0 - 1 ] d[ 0 - 1 ]\n");
printf("w[ 1 - 5 ] z[ 1 - 10 ]\n\n");

printf("please type in k[0.1-10] : ");
scanf("%f",&k);
while(!(k>=0.1&&k<=10)) {
printf("Out of range k[0.1-10],please type in again : ");
scanf("%f",&k);}

printf("\nplease type in a[0-1] : ");
scanf("%f",&a);
while(!(a<=1&&a>=0)) {
printf("Out of range a[0-1],please type in again : ");
scanf("%f",&a);}

printf("\nplease type in b[0-1] : ");
scanf("%f",&b);
while(!(b>=0&&b<=1)) {
printf("Out of range b[0-1],please type in again : ");
scanf("%f",&b);}

printf("\nplease type in d[0-1] : ");
scanf("%f",&d);
while(!(d>=0&&d<=1)) {
printf("Out of range d[0-1],please type in again : ");
scanf("%f",&d);}

printf("\nplease type in w[1-5] : ");
scanf("%f",&w);
while(!(w>=1&&w<=5)) {
printf("Out of range w[1-5],please type in again : ");
scanf("%f",&w);}

printf("\nplease type in z[1-10] : ");
scanf("%f",&z);
while(!(z>=1&&z<=10)) {
printf(" Out of range z[1-10] ,please type in again : ");
scanf("%f",&z);}

printf("\nplease type in r[1,2,3...] : ");
scanf("%d",&r);
while(!(r>=1)) {
printf(" Out of range r[1,2,3...] ,please type in again : ");
scanf("%d",&r);}

/* Calculation for G(r) , Q(r) */
wr=pow(w,r); /* w^r */
zr=pow(z,r); /* z^r */
wz=w/z; /* w/z */
wzr=pow(wz,r); /* (w/z)^r */
kbd=(k*k-b*d); /* k^2-b*d */
s_kbd=sqrt(kbd); /* root of (k^2-b*d) */

if (kbd<0){
Qr=1;
printf("\nCannot generate a real value for Q(r) ");
printf("\nwill set Q(r) to 1 for F ");}
else{
Qr1=(b*wr)/(d*zr);
Qr2=(1+s_kbd);
Qr=Qr1*Qr2;
printf("\nQ(r)= %f",Qr);}

Gr=(b*wr+d*zr)/(1+wzr);
printf("\nG(r)= %f",Gr);

if (Qr>Gr)
printf("\nQ(r) > G(r)");
else if (Qr<Gr)
printf("\nQ(r) < G(r)");
else
printf("\nQ(r) = G(r)");

kaq=(k*k*k*a);
F=Gr*(1+kaq/Qr);
printf("\nF = %f",F);
system("pause");

}

运算式的正确性自己校验,但程序中有些错误,可能会导致运算错误:
(1)注意运算取值范围的限制正确性,如while(!(d>=0&&d<=1)) { ...}不能防止d=0,这样 Qr1=(b*wr)/(d*zr)是非法的; s_kbd=sqrt(kbd); 应放在 if (kbd<0)... else { 这里 }; 否则可能出现非法运算,有些运行库会进入数据非法的例外处理程序,中断你的正常程序。
(2)浮点比较时,要进行精度相配处理,否则结果可能不是你要的。包括常量1,0等至少应写成浮点类型0.0 ,1.0,通常应该进行相同精度位数的四舍五入处理后才能保证比较的正确性,如 if (Qr>Gr) else if (Qr<Gr)... else ...可能结果是错的,典型的错误情况是:Qr、Gr应该相等,但这里比较的结果是有大小的。
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答
大家正在搜