標籤:printf 無限迴圈 clu int 迴圈條件 ble 提示 資訊 偶數
(一)實驗總結
(一)改錯題 (一)
序列求和:輸入一個正實數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後面加上分號
錯誤資訊二:
輸出與題目要求不符
錯誤原因:
迴圈設定錯誤
解決辦法:
while中的的迴圈條件改為
while( item >= eps)
錯誤資訊三:改正之後依舊無法正確輸出
錯誤原因:item = 1/ n 語句錯誤,這樣item只會等於整數,而題目給出了小數
解決辦法:將item = 1/ n改為item = 1.0/ n
錯誤資訊四:計算結果與例題仍有小部分差距
錯誤原因:eps和s在開始時都定義為了double類型函數,但使用時都用了%f。而這會損失精度,使結果出現誤差
(二)學習總結
1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?
這兩條語句都表示無限迴圈,使用時要保證設定了結束條件來跳出這個迴圈,否則就會無限的執行下去。可以使用break跳出迴圈或者exit(0)直接結束程式
2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。
迴圈次數已知最好使用for語句,迴圈次數未知,但迴圈條件在進入迴圈時明確最好使用while語句,迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確則使用do while語句更好。
適用for類型舉例
PTA迴圈結構練習一的第二題:統計學生平均成績與及格人數。
原始碼:
#include<stdio.h>int main(){int a,b,i,count = 0;double average,sum;scanf("%d",&a);if(i=0){ printf("average = 0\n"); printf("count = 0\n");}else{for(i=1;i<=a;i++){scanf("%d",&b);sum = sum + b;average = sum/i; if(b>=60) { count = count+1; } else { count = count+0; }}printf("average = %0.1f\n",average);printf("count = %d\n",count); } return 0;}
因為知道輸入的學生人數(即迴圈次數)所以這裡使用了for迴圈
適用while類型舉例
PTA迴圈結構練習二的第七題:尋找250
原始碼
#include<stdio.h>int main(){int a,i=0;a=0;while(a < 250 || a>250){ scanf("%d",&a); i=i+1; }printf("%d",i);return 0; }
這裡因為不知道具體迴圈幾次,但是知道迴圈結束的條件,所以使用while語句更好。
適用do while語句舉例
迴圈結構二的第六題:掉入陷阱的數字
原始碼
#include <stdio.h>int main(){int N,A,B,C,D,E,i=1,N2,flag = 1;scanf("%d",&N);do{ A=N%10;B=(N/10)%10;C=(N/100)%10;D=(N/1000)%10;E=N/10000;N2=(A+B+C+D+E)*3+1;if(N == N2){ flag += 1;} else{ N = N2;}printf("%d:%d\n",i,N2);i++;if(flag == 2){ break;}}while(1); return 0;
}
這裡我引用了徐振剛同學的代碼,因為我是用while做的,看了他寫的代碼感覺do while更方便,先進行一次迴圈來確定迴圈條件,在使用者輸入非法字元時比較方便判斷。
4.運行下面程式,輸入1到10,結果分別是什嗎?為什嗎?
3.有如下問題:輸入一批學產生績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種迴圈語句實現,並說明你認為哪種形式更合適?
for語句
#include<stdio.h>int main(){int x,i=0,sum=0;double average; for(;;){ scanf("%d",&x); if(x==-1) break; else { sum = sum + x; i = i + 1; } } average = (double)sum / i; printf("%lf",average); return 0;}
while語句
#include<stdio.h>int main(){int x,i=0,sum=0;double average; scanf("%d",&x);while(x >=0 ){ sum = sum + x; i = i + 1; scanf("%d",&x);} average = (double)sum / i; printf("%lf",average); return 0;}
do while語句
#include<stdio.h>int main(){ int x,i=0,sum=0;double average; scanf("%d",&x);do{ sum = sum + x; i = i + 1; scanf("%d",&x);}while(x >=0 ); average = (double)sum / i; printf("%lf",average); return 0;}
這裡的while和do while語句要注意變換一下條件,while和do while都是滿足條件執行迴圈,所以最要把判斷條件設定成成績>=0時來執行
在這裡我認為如果能利用還無限迴圈的話,無論是哪一種都能很好的完成,如果想不到的話,我覺得while迴圈更好一些,因為結束條件是明確的,不需要執行一次來確定。
4.運行下面程式,輸入1到10,結果分別是什嗎?為什嗎?
第一個代碼運行結果
第二個代碼運行結果
第一個代碼我認識是用來求輸入數位奇數的和,但是因為迴圈中設定了break而導致當是奇數是退出了迴圈,導致輸出結果是1
第二個代碼因為是continue而導致的無論輸入的是不是偶數都會繼續執行迴圈,最後的結果是輸入的所有數的和即25
(三)(實驗總結)
(1) 求給定精度的簡單交錯序列部分和
本題要求編寫程式,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最後一項的絕對值不大於給定精度eps。
(2)流程圖
(3)原始碼
#include<stdio.h>#include<math.h>int main(){double eps,sum = 0.0,n = 1.0,a = 0.0;int i = 1;scanf("%lf",&eps);do { a = (1.0/i) * pow(-1,n+1); sum = sum + a; i = i + 3; n++; }while(fabs(a) > eps);printf("sum = %.6f",sum);return 0;}
(4)測試資料及運行結果
(5)實驗分析
錯誤資訊一:無法輸出結果
錯誤原因:迴圈條件設定錯誤而導致了死迴圈,無法輸出結果
解決辦法將迴圈條件設定為while(fabs(a) > eps);
錯誤資訊二:結果錯誤
錯誤原因:sum,n,a函數沒有設定初始值
解決辦法:將以上函數在開始時賦值
(1) 猜數字遊戲
猜數字遊戲是令遊戲機隨機產生一個100以內的正整數,使用者輸入一個數對其進行猜測,需要你編寫程式自動對其與隨機產生的被猜數進行比較,並提示大了(“Too big”),還是小了(“Too small”),相等表示猜到了。如果猜到,則結束程式。程式還要求統計猜的次數,如果1次猜出該數,提示“Bingo!”;如果3次以內猜到該數,則提示“Lucky You!”;如果超過3次但是在N(>3)次以內(包括第N次)猜到該數,則提示“Good Guess!”;如果超過N次都沒有猜到,則提示“Game Over”,並結束程式。如果在到達N次之前,使用者輸入了一個負數,也輸出“Game Over”,並結束程式。
(2)流程圖
(3)原始碼
#include<stdio.h>int main(){int a = 0,N = 0,i = 0,b = 0;scanf("%d%d",&a,&N);for(i = 1;i <= N;i++){ scanf("%d",&b); if(b < 0 ) { printf("Game Over"); break; } else if(b > a) { printf("Too big\n"); } else if(b < a) { printf("Too small\n"); } else if(a == b) { if(i == 1) { printf("Bingo!"); break; } else if(i <= 3 && i > 1) { printf("Lucky You!"); break; } else if(i > 3) { printf("Good Guess!"); break; } break; }if(i >= N){printf("Game Over");break;}}return 0;}
(4)測試資料及運行結果
(5)實驗分析
要區分好各個輸出的條件
錯誤資訊一:輸出結果錯誤
錯誤原因:if條件裡只用了一個等號,而一個表示賦值,兩個才表示相等
解決辦法:再加上一個等號
(6)本題PTA提交列表
(1) 求奇數和
本題要求計算給定的一系列正整數中奇數的和。
(2)流程圖
(3)原始碼
#include<stdio.h>#include<math.h>int main(){int sum=0,a;scanf("%d",&a);while(a>0){ if(a%2!=0) { sum = sum + a; } else { sum = sum + 0; } scanf("%d",&a); }printf("%d",sum);return 0; }
(4)測試資料及運行結果
(5)實驗分析
這道題比較簡單注意迴圈條件和判斷條件,基本不會出錯
(6)本題PTA提交列表
(四) 部落格互評
劉長森
何強
賀博濤
C語言程式設計第六次作業——迴圈結構(2)