標籤:習慣性 htm amp ges 隨機數 turn lag mat 解決辦法
(一)改錯題
錯誤資訊(1):
錯誤原因:用do while迴圈語句在while後面要加分號,這個語句特殊需牢記
改正方法:在while後面加上分號
錯誤資訊(2):
錯誤原因:item = 1/ n;次語句中n定義為整型,所以1/n不會出現小數
改正方法:把 item = 1/ n; 改為 item = (double)1/ n;
錯誤資訊(3):
錯誤原因: }while( item < eps);此語句錯誤;因為該迴圈語句中的迴圈條件是當 item < esp 條件滿足是輸出,而原始碼中誤解為item > esp時輸出
改正方法:把}while( item < eps);改為}while( item > eps);
錯誤資訊(4):
錯誤原因:題幹中要求把最後一項小於eps的那一項也加上
改正方法:在迴圈語句結束後輸出語句前加上該語句s = s + flag * item;
錯誤資訊(5):
錯誤原因: double變數的輸入引號內,如果是小數,輸出用%f,而輸入用%lf
改正方法:把 scanf("%f",&eps);語句改為 scanf("%lf",&eps);
(二)學習總結
1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?
答:都是無限迴圈;在迴圈語句中if語句後面加上break;就可以正常跳出,從而正常執行了
2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。
答:(1)迴圈次數已知使用for迴圈語句實現比較好
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確使用while迴圈語句實現比較好
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確使用do while迴圈語句實現比較好
①用for的迴圈結構來寫。例如:
迴圈結構(1)中 7-2 統計學生平均成績與及格人數, 7-3 奇偶分家 7-8 找出最小值,給出7-3的來源程式:
#include <stdio.h>int main(void){int N,i,n,a = 0,b = 0;scanf("%d",&n);for(i = 0;i < n;i++){ scanf("%d",&N); if(N % 2 == 0) { a++; } else { b++; }} printf("%d %d",b,a); return 0; }
②可以用while和do while的迴圈結構來寫。例如:迴圈結構(2)中 7-5爬動的蠕蟲,迴圈結構(1)中 7-4 到底是不是太胖了 給出7-5的來源程式:
#include <stdio.h>int main(void){ int N,U,D,head=1,time=0; scanf("%d %d %d",&N,&U,&D); while(1) { head+=U; time++; if(head>N)break; head-=D; time++; } printf("%d",time); return 0;}
③可以用do while的迴圈結構來寫。例如:迴圈結構(2)中 7-1 求給定精度的簡單交錯序列部分和 7-3 求奇數和,給出7-3的來源程式:
#include <stdio.h>int main(){ int n = 0, sum = 0; do { scanf("%d", &n); if (n % 2 == 1) sum += n; } while (n > 0); printf("%d\n", sum); return 0; }
3.有如下問題:輸入一批學產生績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種迴圈語句實現,並說明你認為哪種形式更合適?
答:while好些。結束條件直接寫在括弧裡就行,而且一上來就可以結束
4.運行下面程式,輸入1到10,結果分別是什嗎?為什嗎?
(1)
(2)
答:這倆個來源程式看上去基本一樣,但是不同的地方就是第一個用的是break,而第二個用的是continue。結果一個輸出1,一個輸出25,因為第一個就執行一次s=s+n,而s為0,n為1,當第一次輸入1的時候就直接跳出迴圈就進行s=s+n,所以最後輸出1;而第二個流程圖用continue倆控制迴圈條件,他進行判斷後不會跳出而是直接進行下一個,並且把能整除2的數過濾掉,所以最後輸出的是25。
(三)實驗總結
(1) 題目
7-1 求給定精度的簡單交錯序列部分和
(2) 流程圖
(3)原始碼
#include <stdio.h> #include <math.h> int main(){ int i=1,k=1; double sum=0,t,n; scanf("%lf",&n); do{ t=k*1.0/(3*i-2); sum+=t; k=-k; i++; }while(fabs(t)>n); printf("sum = %f\n", sum); return 0; }
(4)實驗分析
問題1:答案錯誤,輸入0.02經常不對
原因:迴圈判斷條件出問題
解決辦法:fabs(t)>n,不是>=
(5)本題PTA提交列表
(1) 題目:
7-2 猜數字遊戲
(2) 流程圖
(3) 原始碼
#include <stdio.h>int main(void) { int number, n; int count = 0; int value; scanf("%d%d", &number, &n); while(count <= n) { scanf("%d", &value); if(value < 0) { printf("Game Over\n"); break; } ++count; if(value > number) printf("Too big\n"); else if(value < number) printf("Too small\n"); else { if(count == 1) printf("Bingo!\n"); else if(count <= 3) printf("Lucky You!\n"); else if(count <= n) printf("Good Guess!\n"); break; } } if(count > n) printf("Game Over\n"); return 0;}
(4) 實驗分析
錯誤資訊:一開始輸入產生隨機數,用了數學函數rand(),但是結果輸出錯誤。
原因:理解題意錯誤,不用函數就可以,直接輸入倆個數再進行迴圈就可以。
需要注意的:迴圈結束可以用break來實現。在本題需要定義一個量flag=0,如果後面的跟前面所定義的相等就判斷為真,如果不相等就判斷為假,並且在break的條件下進行跳出進行下一步的運算。
(5)本題PTA提交列表
(1) 題目
7-3 求奇數和
(2) 流程圖
(3)原始碼
# include <stdio.h>int main(){ int x,sum = 0; do { scanf("%d",&x); if(x%2) { sum = sum + x; } }while(x > 0); x = -x; if(x%2) { sum = sum + x; printf("%d",sum); } else { sum = sum; printf("%d",sum); } return 0;}
(4)實驗分析
問題1:答案錯誤
原因:if裡判斷條件習慣性寫得shu*1.0/2!=0
解決辦法:改成shu%2!=0
(5)本題PTA提交列表
(四)部落格互評
(1)http://www.cnblogs.com/bilililili/p/7842022.html
(2)http://www.cnblogs.com/wsd-lian/p/7860213.html
(3)http://www.cnblogs.com/zxh980818/p/7842242.html
C語言程式設計第六次作業——迴圈結構(2)