改錯題
序列求和:輸入一個正實數eps,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精確到最后一項的絕對值小於eps(保留6位小數)。
錯誤信息:
錯誤原因:while條件后沒加;
改正方法:while的括號后面加;
錯誤信息:
錯誤原因:while條件中小於號方向錯誤,1直接/n
改正方法:把小於改成大於,1/n改成1.0/n
錯誤信息:
錯誤原因:double用的%f來輸入
改正方法:%f改成%lf
錯誤信息:
錯誤原因:最后少加一項
改正方法:循環結束后加上s = s + flag * item;
學習總結
語句while(1)和for(;;)是什么意思?,如何保證這種循環能正常執行?
都是無限循環。在里面加上跳出條件,if.....旳話就break
一般情況下,設計循環結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現循環設計。
循環2第三題用while好,因為不知道要循環幾次,而且一上來就可以結束。循環2第六題用do while好,因為至少得先循環一次要不然沒法確定判斷條件,條件所需變量沒有被賦值。
循環1第一題用for好。因為知道循環次數,而且用while旳話那些i=1和i++啥的都得寫到循環前循環里這些其他位置,比較亂。
有如下問題:輸入一批學生成績,以-1作為結束,計算學生的平均成績。 要求分別用for語句、while語句、do while語句三種循環語句實現,並說明你認為哪種形式更合適?
while好些。結束條件直接寫在括號里就行,而且一上來就可以結束
運行下面程序,輸入1到10,結果分別是什么?為什么?
分別得1和25。因為break是直接跳出循環,所以第一次循環得一,結果也就是一。continue是跳過當前循環進入下一次循環,所以n和2求余不得0時的各種情況依然會被加到s中。
實驗總結
求給定精度的簡單交錯序列部分和
一.本題要求編寫程序,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一項的絕對值不大於給定精度eps。
二.
三.
#include<stdio.h>
#include<math.h>
int main()
{
int i=1;
double sum=0,eps,a;
scanf("%lf",&eps);
while( 1.0/(3*i-2)>eps)
{
sum=sum-pow(-1,i)*(1.0/(3*i-2));
i=i+1;
}
sum=sum-pow(-1,i)*(1.0/(3*i-2));
printf("sum = %f",sum);
return 0;
}
四.
問題1:編譯錯誤
原因:用pow沒加math頭
解決辦法:頭上加include《math.h》
問題2:多種錯誤
原因:while循環不熟練產生多種錯誤解決辦法:輸入時格式字符串用的%d,改成%lf。沒有加上最后一項,最后填個sum=sum-pow(-1,i)(1.0/(3i-2));。
while括號里關系運算符用的大小於反了,小於等於改成大於等於。
五.
猜數字游戲
一.猜數字游戲是令游戲機隨機產生一個100以內的正整數,用戶輸入一個數對其進行猜測,需要你編寫程序自動對其與隨機產生的被猜數進行比較,並提示大了(“Too big”),還是小了(“Too small”),相等表示猜到了。如果猜到,則結束程序。程序還要求統計猜的次數,如果1次猜出該數,提示“Bingo!”;如果3次以內猜到該數,則提示“Lucky You!”;如果超過3次但是在N(>3)次以內(包括第N次)猜到該數,則提示“Good Guess!”;如果超過N次都沒有猜到,則提示“Game Over”,並結束程序。如果在到達N次之前,用戶輸入了一個負數,也輸出“Game Over”,並結束程序。
二.
三.
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,N,i=0,shu;
scanf("%d%d",&n,&N);
scanf("%d",&shu);
while(shu!=n)
{
i=i+1;
if(shu<0)
{printf("Game Over");exit(0);}
else if(shu<n)
{printf("Too small\n");}
else if(shu>n)
{printf("Too big\n");}
scanf("%d",&shu);
}
if(i==0)
{printf("Bingo!");}
else if(i<=2)
{printf("Lucky You!");}
else if(i<N)
{printf("Good Guess!");}
else
{printf("Game Over");}
return 0;
}
四.
問題1:答案錯誤
原因:luck后面少個y
解決辦法:加上y
問題2:直接退出時運行超時
原因:沒有考慮shu<0的情況
解決辦法:加上 if(shu<0)
{printf("Game Over");exit(0);}
五.
本題要求計算給定的一系列正整數中奇數的和。
一.輸入在一行中給出一系列正整數,其間以空格分隔。當讀到零或負整數時,表示輸入結束,該數字不要處理。
二.
三.
#include<stdio.h>
int main()
{
int shu,sum=0;
scanf("%d",&shu);
while(shu>0)
{
if(shu%2!=0)
{sum=sum+shu;}
scanf("%d",&shu);
}
printf("%d",sum);
return 0;
}
四.
問題1:答案錯誤
原因:if里判斷條件習慣性寫得shu*1.0/2!=0
解決辦法:改成shu%2!=0
五.