1改錯題
(一)改錯題
序列求和:輸入一個正實數eps,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精確到最后一項的絕對值小於eps(保留6位小數)。
輸入輸出樣例:
Input eps:1E-4
s = 0.835699
錯誤的源程序:
#include<stdio.h>
int main()
{
int flag,n;
double eps,item,s;
printf("Input eps: ");
scanf("%f",&eps);
flag = 1;
s = 0;
n = 1;
do{
item = 1/ n;
s = s + flag * item;
flag = -flag;
n = n + 3;
}while( item < eps)
printf( "s = %f\n",s);
return 0;
}
錯誤信息:
錯誤原因:在循環while語句后未加分號導致錯誤。
改正方法:在“while”后加分號即可。
錯誤信息:
經過運行本人發現如上錯誤,經檢查得知
錯誤原因:定義“item”運算是由於其是double型所以應使結果未浮點型。
改正:把“1”改為“1.0”即可。
錯誤信息:本人繼續運行程序發現仍然是如上錯誤
錯誤:后來本人發現在輸入函數中定義類型有錯誤,不應該為“%f”
改正:應該改為"%lf"變為double型變量即可。
繼續運行結果領本人覺得不可思議,結果仍然如上:
之后發現錯誤:while語句內循環結束條件錯誤。
改正:將"<"改為">="即可。
改正后輸出結果如下:
與預期結果相符改錯完畢,此處附加改正的源程序:
#include<stdio.h>
int main()
{
int flag,n;
double eps,item,s;
printf("Input eps: ");
scanf("%lf",&eps);
flag = 1;
s = 0;
n = 1;
do{
item = 1.0/ n;
s = s + flag * item;
flag = -flag;
n = n + 3;
}while( item >= eps);
printf( "s = %f\n",s);
return 0;
}
2學習總結
1.語句while(1)和for(;;)是什么意思?,如何保證這種循環能正常執行?
此處while語句內條件代表循環條件,只要為非零數即可循環。所以里面只要是非零數即可,即無限循環語句,"for(;😉"語句表示循環語句為空,沒有循環條件,也表示無限循環;為保證這兩個程序正常運行就要在循環內加入循環條件並且配合"break"用來跳出循環。
2.一般情況下,設計循環結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現循環設計。如果有如下情況:
(1)循環次數已知
(2)循環次數未知,但循環條件在進入循環時明確
(3)循環次數未知,且循環條件在進入循環時未知,需要在循環體中明確
針對上面三種情況,分別采用什么循環語句實現比較好?對每種情況,用我們完成的兩次循環結構作業中的題目加以說明。
在循環次數已知的情況下用for語句較好對應的題目有循環結構一中的統計字符問題——本題要求編寫程序,輸入10個字符,統計其中英文字母、空格或回車、數字字符和其他字符的個數。本題給定了循環次數,所以用for循環更好。
其次在循環次數未知的情況下但循環條件明確,應使用while語句——尋找250,對方不想和你說話,並向你扔了一串數…… 而你必須從這一串數字中找到“250”這個高大上的感人數字。本題只需要在while(1)的無限循環內給定循環判定條件以及break結束即可。
對於循環次數未知且循環條件進入循環未知應該使用do...while語句——爬動的蠕蟲,一條蠕蟲長1寸,在一口深為N寸的井的底部。已知蠕蟲每1分鍾可以向上爬U寸,但必須休息1分鍾才能接着往上爬。在休息的過程中,蠕蟲又下滑了D寸。就這樣,上爬和下滑重復進行。請問,蠕蟲需要多長時間才能爬出井?
本題需要先執行一次循環條件才可以計算爬行時間並讓答案正確。
3.有如下問題:輸入一批學生成績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句和無限循環四種循環語句實現,並說明你認為哪種形式更合適?
首先用for語句是對於確定的次數進行循環,此處無法運用for語句因為次數未知,但是可以使用“for語句的無限循環”也就是“for(;;)”,源程序如下:
#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
for(;;)
{
scanf("%d",&grade);
if(grade!=-1)
{
sum=sum+grade;
i++;
}
else
{
break;
}
}
average=(double)sum/i;
printf("%f",average);
return 0;
}
while語句的程序(對於未知次數的循環):
#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
while(grade!=-1)
{
scanf("%d",&grade);
sum=sum+grade;
i++;
}
average=(double)(sum+1)/(i-1);
printf("%f",average);
return 0;
}
此程序在不知道輸入數字為多少是(不給定-1時)無法使用。
do...while語句:
#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
do
{
scanf("%d",&grade);
sum=sum+grade;
i++;
}
while(grade!=-1);
average=(double)(sum+1)/(i-1);
printf("%f",average);
return 0;
}
無限循環語句:
#include <stdio.h>
int main()
{
int grade=0,n=0,i=0;
double sum=0.0,average=0.0;
while(1)
{
scanf("%d",&grade);
if(grade!=-1)
{
sum=sum+grade;
i++;
}
else
{
break;
}
}
average=(double)sum/i;
printf("%f",average);
return 0;
}
for語句的使用也只能是無限循環的形式,while與do...while語句在輸入的數字未知時無法使用,所以相比較而言使用無限循環更合適。
4.運行下面程序,輸入1到10,結果分別是什么?為什么?
#include<stdio.h>
int main()
{
int n,s,i;
s = 0;
for(i = 1; i <= 10; i++)
{
scanf("%d",&n);
if(n % 2 == 0)
break;
s = s + n;
}
printf("s = %d\n",s);
return 0;
}
結果如下:
因為循環控制語句“break”的作用,在判斷輸入數字與2求余時若不符合直接就控制語句結束跳出語句,導致在1后面的數字無法參與程序的運行。
(2)
#include<stdio.h>
int main()
{
int n,s,i;
s = 0;
for(i = 1; i <= 10; i++)
{
scanf("%d",&n);
if(n % 2 == 0)
continue;
s = s + n;
}
printf("s = %d\n",s);
return 0;
}
運行結果如圖:
因為continue 語句只控制當前語句結束,在繼續進行程序運行,不會直接使程序結束,接下來輸入的數字繼續參與程序運行,兩個程序體現了兩個語句的區別,break語句,若條件第一次不符合直接結束程序,而continue語句只結束當前語句,接下來繼續參與程序運行,而不會直接結束語句。
3實驗總結
(1)求給定精度的簡單交錯序列部分和
1.流程圖:
2.源程序:
#include <stdio.h>
#include <math.h>
int main()
{
double eps = 0.0,sum = 0.0,n = 1.0,flag = 1.0,m = 0.0;
scanf("%lf",&eps);
do
{
m = flag / (3 * n - 2);
sum = sum + m;
flag = -flag;
n++;
}
while(fabs(m)>eps);
printf("sum = %.6f",sum);
return 0;
}
問題:do...while語句while括號內判斷條件錯誤,本應為循環條件。如圖:
解決方法:將判斷條件改為循環的條件即可,即fabs(m)>eps 。
提交列表:
(2)猜數字游戲
1.流程圖:
2.源程序:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int a = 0,m = 0,i = 0,N = 0;
scanf("%d%d",&a,&N);
for(i = 1;i <= N;i++)
{
scanf("%d",&m);
if(m < 0)
{
break;
}
if(m == a)
{
if(i == 1)
{
printf("Bingo!");
}
else if(i <= 3)
{
printf("Lucky You!");
}
else if(i <= N)
{
printf("Good Guess!");
}
exit(0);
}
else if(m > a)
{
printf("Too big\n");
}
else
{
printf("Too small\n");
}
}
printf("Game Over");
return 0;
}
問題:當i初始值為1時,循環次數應該不大於本人設定的結束次數N,而最開始本人因范圍設定錯誤導致錯誤。
解決方法:把最初本人寫入的“i<N”改為“i<=N”即可。
錯誤:判斷條件句if時讓本人犯了一個低級錯誤,定義的猜的數字與隨機數相等時運算符使用錯誤,使用了賦值運算符導致結果錯誤。
解決方法:把“=”改為“==”即可。
提交列表:
(3)求奇數和
1.流程圖:
2.源程序:
#include <stdio.h>
int main()
{
int N,sum=0;
while(1)
{
scanf("%d",&N);
if(N%2!=0&&N>0)
{
sum+=N;
}
if(N<=0)
{
break;
}
}
printf("%d",sum);
return 0;
}
本題運用了while語句的無限循環,運行過程中未出現較大問題。
提交列表:
4博客互評
以下是本人與三位同學的博客互評,相互學習借鑒。
李曉曉:http://www.cnblogs.com/Reloaded/p/7825734.html
許天笑:http://www.cnblogs.com/snxtx/p/7824427.html
任佳鵬:http://www.cnblogs.com/rjp123/p/7859004.html