標籤:出現 語句 原始碼 無限 code 精確 main 整型 特定
(一)改錯題:
錯誤資訊一:
錯誤原因:while後面沒有分號。
改正方法:
在while後面加上分號。
改正錯誤資訊一後編譯無錯誤,但是運行出現錯誤。
錯誤資訊二:
錯誤原因1:
while後面括弧中的是迴圈能夠進行的條件,而item < eps是限制條件。
改正方法:
如果要想迴圈進行,把item < eps改成 item >= eps。
錯誤原因2:
eps 定義的是 double 類型 所以輸入時應該是%lf
改正方法:
把%f改成%lf
錯誤原因3:
n定義的是整型,而item是double類型
改正方法:
把1改成1.0
編譯運行後發現沒有錯誤,
(二)學習總結:
1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?
while(1)的意思:1就是真(條件成立),0就是假(條件不成立),while(1) 永遠都是真,如果內部沒有跳出語句,那就是個死迴圈。
for(;;)的意思:for後的圓括弧中,第一個分號前的內容是執行第一次迴圈前執行的,第二個分號前的內容是每次執行前都要判斷的(如果該處運算式的值為真,那麼執行迴圈體,如果為假,那麼就跳出迴圈體),第二個分號後的內容是每執行完一次迴圈體後執行的 。這裡中間沒有限制條件(第2個分號前)(有限制條件也要該條件必然會變成真,迴圈才會停止),所以不會停。另一種停止的方法在迴圈體中使用break跳出迴圈體。
2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。
①迴圈次數已知
用for 語句,比如在PTA迴圈結構(1)中第8題找出最小值。題目是輸入在一行中首先給出一個正整數n,之後是n個整數,在一行中按照“min = 最小值”的格式輸出n個整數中的最小值。本題迴圈次數是知道的,輸入n個整數找出最小值,所以迴圈次數就是n次。
②迴圈次數未知,但迴圈條件在進入迴圈時明確
用whlie語句,比如在PTA迴圈結構(2)中的第7題尋找250,題目是輸入在一行中給出不知道多少個絕對值不超過1000的整數,其中保證至少存在一個“250”。在一行中輸出第一次出現的“250”是對方扔過來的第幾個數字(計數從1開始)。題目保證輸出的數字在整型範圍內。這都題不知道要迴圈幾次,所以用while(1)無限迴圈,當輸入250時迴圈停止,所以加上break語句進行控制。
③迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
用do while語句,比如用do while語句。比如在PTA迴圈結構(2)中第5題爬動的蠕蟲,題目是一條蠕蟲長1寸,在一口深為N寸的井的底部。已知蠕蟲每1分鐘可以向上爬U寸,但必須休息1分鐘才能接著往上爬。在休息的過程中,蠕蟲又下滑了D寸。就這樣,上爬和下滑重複進行。請問,蠕蟲需要多長時間才能爬出井?這裡要求不足1分鐘按1分鐘計,並且假定只要在某次上爬過程中蠕蟲的頭部到達了井的頂部,那麼蠕蟲就完成任務了。初始時,蠕蟲是趴在井底的(即高度為0)。此程式至少要進行一次迴圈
3.有如下問題:輸入一批學產生績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種迴圈語句實現,並說明你認為哪種形式更合適?
for語句:
# include<stdio.h>int main (){ int m,i,n,sum; double average; sum = 0; scanf("%d",&m); for(i = 1;i<=m;i++) { scanf("%d",&n); if(n == -1) { break; } else { sum = sum+n; } } average = (double)sum/m; printf("%.1f",average) ; return 0;}
while語句:
# include<stdio.h>int main (){ int m,sum,i; double average; sum = 0; i = 0; while(1) { scanf("%d",&m); if(m == -1) { break; } else { sum = sum+m; I++; } } average=sum/i; printf("%.2f",average); return 0;}
for while 語句:
# include<stdio.h>int main(){ int m,sum,i; double average; sum = 0; i = 0; do{ scanf("%d",m); sum = sum+m; i++;}while(m!=-1);average = sum/i;printf("%f",average);return 0; }
用do while語句,因為此程式至少執行一次。
4.運行下面程式,輸入1到10,結果分別是什嗎?為什嗎?
(1)
#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;}
輸入1到10,結果:
(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;}
輸入1到10,結果:
兩個程式的輸出結果分別是s=1,s=25
兩個程式的區別在於第一個使用了break跳出語句,第二個使用了continue語句。continue語句只結束本次迴圈,而不是終止整個迴圈的執行。而break語句則是結束整個迴圈過程,不再判斷執行迴圈的條件。第一個程式中當輸入1時(n%2==0)成立所以執行break語句,跳出迴圈體,輸出s=1。第二個程式中輸入1到10,當if語句成立結束本次迴圈(不是終止整個迴圈),否則執行本次迴圈。
(三)實驗總結:
1.求給定精度的簡單交錯序列部分和:
(1)題目:計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最後一項的絕對值不大於給定精度eps。在一行中按照“sum = S”的格式輸出部分和的值S,精確到小數點後六位。
(2)流程圖:
(3)原始碼:
# include <stdio.h># include<math.h>int main(void){int m,n;double eps,sum,item;item = 1;sum = 0;m = 1;n = 1;scanf("%lf",&eps);if(eps>=item){ sum = 1;}while(fabs(item)>eps){ item = (double)m/n; sum = sum+item; n = n+3; m = -m;}printf("sum = %.6f",sum);return 0;}
(4)實驗分析:
問題1:
原因:沒有考慮當輸入第一個數時大於或是等於item,此時sum=1
解決辦法:
在迴圈前加入一個if語句。
(5)本題PTA提交列表:
2.猜數字遊戲:
(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 i,n,a,N; scanf("%d",&i);scanf("%d",&N);n == 0;while(n<=N){ scanf("%d",&a); n=n+1; if(a<0) { printf("Game Over\n"); break; } if(i>a) { printf("Too small\n"); } else if(i<a) { printf("Too big\n"); } else { if(n==1) { printf("Bingo!\n"); break; } else if(n>1&&n<=3) { printf("Lucky You!\n"); break; } else if(n>3&&n<=N) { printf("Good Guess!\n"); break; } else { printf("Game Over\n"); break; } } } return 0;}
(4)實驗分析:
錯誤資訊:
錯誤原因:
沒有給n賦初值,在迴圈中沒有使n=n+1
改正方法:
(5)本題PTA提交列表:
3.求奇數和:
(1)題目:
輸入在一行中給出一系列正整數,其間以空格分隔。當讀到零或負整數時,表示輸入結束,該數字不要處理。在一行中輸出正整數序列奇數的和。
(2)流程圖:
(3)原始碼:
# include <stdio.h>int main(void){ int a,sum; sum = 0; scanf("%d",&a); do {if(a<0) { break; }else if(a%2!=0) { sum = sum+a; } scanf("%d",&a); }while(a>0); printf("%d",sum); return 0;}
(4)實驗分析:
本題的迴圈條件是a>0,while後面是迴圈能進行的條件,在whlie後面的括弧中加上a>0這個迴圈條件。
(5)本題PTA提交列表:
(四)部落格互評:
(1)http://www.cnblogs.com/luyu0322-/p/7846404.html
(2)http://www.cnblogs.com/yiqiekaoziji/p/7858416.html
(3)http://www.cnblogs.com/karry-5201314/p/7846648.html
C語言程式設計第六次作業——迴圈結構(2)