1. 程式人生 > >《C語言及程式設計》實踐專案——發現Bug

《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);
}
閱讀程式,發現在不退出時,想繼續一次業務,卻……,如圖:
通過單步的方式,找出問題的原因,並自行查詢資料,找出解決的辦法。
[參考解答]