2、給定程序MODI1.C中,函數(shù)fun的功能是:求出以下分?jǐn)?shù)序列的前n項(xiàng)之和。(序列見后面的圖片)
其結(jié)果通過函數(shù)值返回main函數(shù)。例如,若n的值為:5,則應(yīng)輸出:8.391667。
請改正程序中的錯誤,或在下劃線處填上適當(dāng)?shù)膬?nèi)容并把下劃線刪除,使它能得出正確的結(jié)果。
注意:不要改動main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!
試題源程序如下:
#include<stdio.h>
/**********found**********/
fun(int n)
{ int i;double t,s,a,b,c;
/**********found**********/
s=1;a=1;b=2;
/**********found**********/
For(i=0,i<=n,i++)
{t=a/b; s=s+t;
/**********found**********/
________;
a=b;
b=c;
}
return s;
}
main()
{ int n;
printf("Enter n: "; scanf("%d",&n);printf("\n\nn=%d\n",n);
printf("\nThe value of function is:%lf\n",fun(n));
}分析:(1)當(dāng)對以上程序進(jìn)行編譯時,給出的第一個出錯信息是:Statement missing;,指出語句缺少分號(。再看出現(xiàn)此信息的上一行,關(guān)鍵字for寫成了For,改正后再編譯,給出的出錯信息是:Code has no effect,指出代碼無效,檢查信息所在的for語句行,可以發(fā)現(xiàn)括號內(nèi)的各項(xiàng)用逗號分開而不是用分號,因此應(yīng)當(dāng)改正。
(2)進(jìn)行以上改正后,編譯指出下劃線處出錯,這是必然的,應(yīng)當(dāng)在此處填寫適當(dāng)?shù)恼Z句。這要求考生理解題義和給定的程序算法。由程序可見,分?jǐn)?shù)序列中的每一項(xiàng)放在變量t中,其中的分子放在變量a中,分母放在變量b中,累加和放在變量s中。每次累加之后,需要重新獲得下一項(xiàng)的分子和分母,按給出的分?jǐn)?shù)序列可知,下一項(xiàng)的分母是上一項(xiàng)的分子,這由語句b=a;來實(shí)現(xiàn);而下一項(xiàng)的分子是上一項(xiàng)的分子與分母之和,根據(jù)語句a=c;可知,上一項(xiàng)的分子與分母之和放在變量c中,因此在下劃線處應(yīng)填入:c=a+b。
(3)編譯之后沒有語法錯,執(zhí)行程序給n輸入5,輸出的結(jié)果是0.000000,檢查函數(shù)中的return語句,函數(shù)的返回值是s,難道s中的值是0?為此,在for循環(huán)體的最后添加一個輸出語句printf("s=%f\n",s);,以檢查s的值。運(yùn)行程序,得到以下的輸出結(jié)果:
n=5
s=1.500000
s=4.5000000
s=5.8333333
s=7.5833333
s=9.154762
The value of function is:0.000000
可見,s的值不是0 !由此可以斷定函數(shù)值在返回時出了問題,檢查與函數(shù)值有關(guān)的函數(shù)值類型,發(fā)現(xiàn)函數(shù)的類型為int,而在主函數(shù)中,從輸出格式可見輸出的函數(shù)值是雙精度型,而s本身也是雙精度型,因此應(yīng)當(dāng)在函數(shù)名fun前添加類型名double。
(4)再次執(zhí)行程序給n輸入5,輸出的結(jié)果不是8.391667,而是10.791126,大于應(yīng)得的結(jié)果,這就應(yīng)當(dāng)檢查所賦的初值和循環(huán)次數(shù)是否過多;首先檢查各變量的初值,存放累加和的s初值應(yīng)是0,而不應(yīng)是1,進(jìn)行改正;變量a是分子,第一項(xiàng)分子的初值應(yīng)是2,第一項(xiàng)的分母應(yīng)是1,因此應(yīng)給a賦2,給b賦1,進(jìn)行改正。
(5)改正后執(zhí)行程序給n輸入5,輸出的結(jié)果是10.007051,因此接著檢查循環(huán)次數(shù),發(fā)現(xiàn)for循環(huán)的循環(huán)控制變量i從0變化到5,循環(huán)次數(shù)是6,因此應(yīng)把for循環(huán)改成for(i=0;i<n;i++)或for(i=1;i<=n;i++),再次運(yùn)行即得到正確的結(jié)果。
(6)提示:
①對于計(jì)算類型的程序,一開始就檢查一下函數(shù)值的類型。
②對于計(jì)算類型的程序,需要注意變量的初值,循環(huán)重復(fù)的次數(shù)。
③對于如1/n這樣的整除應(yīng)該改為1.0/n或(double)1/n這樣的方式。
④所有的關(guān)鍵字必須小寫,例如:不能把if寫成If,把double寫成Double。
⑤注意,變量名字母的大、小寫,例如,定義變量名為str則不能錯寫成Str、定義變量名為pt則不能錯寫成Pt。
其結(jié)果通過函數(shù)值返回main函數(shù)。例如,若n的值為:5,則應(yīng)輸出:8.391667。
請改正程序中的錯誤,或在下劃線處填上適當(dāng)?shù)膬?nèi)容并把下劃線刪除,使它能得出正確的結(jié)果。
注意:不要改動main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!
試題源程序如下:
#include<stdio.h>
/**********found**********/
fun(int n)
{ int i;double t,s,a,b,c;
/**********found**********/
s=1;a=1;b=2;
/**********found**********/
For(i=0,i<=n,i++)
{t=a/b; s=s+t;
/**********found**********/
________;
a=b;
b=c;
}
return s;
}
main()
{ int n;
printf("Enter n: "; scanf("%d",&n);printf("\n\nn=%d\n",n);
printf("\nThe value of function is:%lf\n",fun(n));
}分析:(1)當(dāng)對以上程序進(jìn)行編譯時,給出的第一個出錯信息是:Statement missing;,指出語句缺少分號(。再看出現(xiàn)此信息的上一行,關(guān)鍵字for寫成了For,改正后再編譯,給出的出錯信息是:Code has no effect,指出代碼無效,檢查信息所在的for語句行,可以發(fā)現(xiàn)括號內(nèi)的各項(xiàng)用逗號分開而不是用分號,因此應(yīng)當(dāng)改正。
(2)進(jìn)行以上改正后,編譯指出下劃線處出錯,這是必然的,應(yīng)當(dāng)在此處填寫適當(dāng)?shù)恼Z句。這要求考生理解題義和給定的程序算法。由程序可見,分?jǐn)?shù)序列中的每一項(xiàng)放在變量t中,其中的分子放在變量a中,分母放在變量b中,累加和放在變量s中。每次累加之后,需要重新獲得下一項(xiàng)的分子和分母,按給出的分?jǐn)?shù)序列可知,下一項(xiàng)的分母是上一項(xiàng)的分子,這由語句b=a;來實(shí)現(xiàn);而下一項(xiàng)的分子是上一項(xiàng)的分子與分母之和,根據(jù)語句a=c;可知,上一項(xiàng)的分子與分母之和放在變量c中,因此在下劃線處應(yīng)填入:c=a+b。
(3)編譯之后沒有語法錯,執(zhí)行程序給n輸入5,輸出的結(jié)果是0.000000,檢查函數(shù)中的return語句,函數(shù)的返回值是s,難道s中的值是0?為此,在for循環(huán)體的最后添加一個輸出語句printf("s=%f\n",s);,以檢查s的值。運(yùn)行程序,得到以下的輸出結(jié)果:
n=5
s=1.500000
s=4.5000000
s=5.8333333
s=7.5833333
s=9.154762
The value of function is:0.000000
可見,s的值不是0 !由此可以斷定函數(shù)值在返回時出了問題,檢查與函數(shù)值有關(guān)的函數(shù)值類型,發(fā)現(xiàn)函數(shù)的類型為int,而在主函數(shù)中,從輸出格式可見輸出的函數(shù)值是雙精度型,而s本身也是雙精度型,因此應(yīng)當(dāng)在函數(shù)名fun前添加類型名double。
(4)再次執(zhí)行程序給n輸入5,輸出的結(jié)果不是8.391667,而是10.791126,大于應(yīng)得的結(jié)果,這就應(yīng)當(dāng)檢查所賦的初值和循環(huán)次數(shù)是否過多;首先檢查各變量的初值,存放累加和的s初值應(yīng)是0,而不應(yīng)是1,進(jìn)行改正;變量a是分子,第一項(xiàng)分子的初值應(yīng)是2,第一項(xiàng)的分母應(yīng)是1,因此應(yīng)給a賦2,給b賦1,進(jìn)行改正。
(5)改正后執(zhí)行程序給n輸入5,輸出的結(jié)果是10.007051,因此接著檢查循環(huán)次數(shù),發(fā)現(xiàn)for循環(huán)的循環(huán)控制變量i從0變化到5,循環(huán)次數(shù)是6,因此應(yīng)把for循環(huán)改成for(i=0;i<n;i++)或for(i=1;i<=n;i++),再次運(yùn)行即得到正確的結(jié)果。
(6)提示:
①對于計(jì)算類型的程序,一開始就檢查一下函數(shù)值的類型。
②對于計(jì)算類型的程序,需要注意變量的初值,循環(huán)重復(fù)的次數(shù)。
③對于如1/n這樣的整除應(yīng)該改為1.0/n或(double)1/n這樣的方式。
④所有的關(guān)鍵字必須小寫,例如:不能把if寫成If,把double寫成Double。
⑤注意,變量名字母的大、小寫,例如,定義變量名為str則不能錯寫成Str、定義變量名為pt則不能錯寫成Pt。