《C语言及程序设计》实践项目——发现Bug

返回:贺老师课程教学链接


【项目1-sin泰勒展式中的错误】

下面是sin函数的泰勒展式:
(注:x取弧度值,而非角度值)
编写了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);
}
提示:请进入到mysin中后,注意各变量的变化,看通项是否会收敛,从而使循环能够结束。
[ 参考解答]

【项目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);
}
阅读程序,发现在不退出时,想继续一次业务,却……,如图:
通过单步的方式,找出问题的原因,并自行查找资料,找出解决的办法。
[ 参考解答]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迂者-贺利坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值