《C語言及程式設計》實踐專案——發現Bug
阿新 • • 發佈:2019-02-14
【專案1-sin泰勒展式中的錯誤】
下面是sin函式的泰勒展式:
(注:x取弧度值,而非角度值)
編寫了double mysin(double x)用於求sin值,卻“死”在了123°上。劇透一下,迴圈沒有問題(當然問題會表現在迴圈中)。試著用除錯工具找出問題出現在哪裡,然後給出解決問題的方案。
提示:請進入到mysin中後,注意各變數的變化,看通項是否會收斂,從而使迴圈能夠結束。#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); }
[參考解答]
【專案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); }
通過單步的方式,找出問題的原因,並自行查詢資料,找出解決的辦法。
[參考解答]