返回:賀老師課程教學鏈接
【項目1-sin泰勒展式中的錯誤】
下面是sin函數的泰勒展式:
(注:x取弧度值,而非角度值)
編寫了double mysin(double x)用于求sin值,卻“死”在了123°上。劇透一下,循環沒有問題(當然問題會表現在循環中)。試著用調試工具找出問題出現在哪里,然后給出解決問題的方案。
#include#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-總是多一次?】
先閱讀下面的程序。這樣的結構,經常用于重復性工作。執行一次程序要完成的工作后,由操作人員選擇,決定是否還來一遍。
#includevoid 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);
}閱讀程序,發現在不退出時,想繼續一次業務,卻……,如圖:
通過單步的方式,找出問題的原因,并自行查找資料,找出解決的辦法。
[ 參考解答]