NO.1 sin泰勒展式中的错误
编写了double mysin(double x)用于求sin值,却“死”在了123°上。剧透一下,循环没有问题(当然问题会表现在循环中)。试着用调试工具找出问题出现在哪里,然后给出解决问题的方案。
#include<stdio.h>
#define pi 3.1415926
double mysin(double x);
double myabs(double x);
int main( )
{
double angle;
for(angle=0; angle<=180; angle++)
printf("sin(%.0f°) = %.3f\n", angle, mysin((angle/180)*pi));
return 0;
}
//下面定义mysin函数,求sin值
double mysin(double x)
{
double sum=x,x_pow=x,item;
int n=1,fact=1, sign=1; //定义变量时赋初值,已经将第一项考虑到累加和sum中
do
{
fact=fact*(n+1)*(n+2); //fact用于表示阶乘,在公式中作分母
x_pow*=x*x; //x_pow是分子中用于表示阶乘,在公式中作分母
sign=-sign; //确定即将要累加的这一项的符号
item =x_pow/fact*sign; //计算出要累加的项
sum+=item; //将该项累加上去
n+=2;
}while(myabs(item)>1e-5);
return sum;
}
//下面定义myabs函数
double myabs(double x)
{
return ((x>=0)?x:-x);
}
分析
加断点调试,在变量窗口给angle赋值123,断点+单步运行可以看到:
当n=11时,fact=13!已经溢出(11!*12 *13少说已经大于11!的100倍,而fact却小于100倍)
NO.2 总是多一次?
在不退出时,想继续一次业务,却发现自动多运行了一次。
#include<stdio.h>
void dosomething(int *p);
int main( )
{
char choice='y';
int n=0;
while(choice!='N' && choice!='n')
{
dosomething(&n);
printf("按 N 退出,其他键继续....");
scanf("%c", &choice); //用choice=getchar();也一样
}
return 0;
}
void dosomething(int *p) //完成特定的业务
{
*p+=1; //本例中传地址, *p即n
printf("第%d次完成业务!\n", *p);
}
分析
循环内部有毛病,在循环开始和scanf处设断点,调试查看
小结
使用键盘输入给char型变量时,注意是否需要清除输入缓存区