標籤:bre 9.png 絕對值 結構 產生 語言 stdio.h 作業 原因
(一)改錯題
序列求和:輸入一個正實數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;}
對來源程式進行編譯,採用每次修改第一個錯誤並重新編譯的方法,記錄每個錯誤的錯誤資訊、分析錯誤原因並給出正確的語句。
錯誤資訊1:
錯誤原因:來源程式第17行的 do...while 語句中的 while 語句的最後沒有加分號。
改正方法:把來源程式第17行的 do...while 語句中的 while 語句的最後加上分號。
正確語句:
while( item < eps);
試運行,來源程式:
運行結果:
與預期結果 s = 0.835699 不同。
錯誤資訊2:
錯誤原因:來源程式第8行的輸入語句中的 %f 應為 %lf 。
改正方法:把來源程式第8行的輸入語句中的 %f 改為 %lf 。
正確語句:
scanf("%lf",&eps);
錯誤資訊3:
錯誤原因:來源程式第13行的指派陳述式中的 1 應為 1.0 。因為 item 是浮點型資料。
改正方法:把來源程式第13行的指派陳述式中的 1 改為 1.0 。
正確語句:
item = 1.0/ n;
錯誤資訊4:
錯誤原因:來源程式第17行的 do...while 語句中的 while 語句中的 < 應為 >= 。
改正方法:把來源程式第17行的 do...while 語句中的 while 語句中的 < 改為 >= 。
正確語句:
while( item >= eps);
試運行,來源程式:
運行結果:
與預期結果 s = 0.835699 相同。
(二)學習總結1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?
答:
while(1)表示無限迴圈 ,
for(;;)也表示無限迴圈。
while(1):
while(條件){ 代碼}
當條件為真時執行大括弧裡面的代碼,因為1為真,所以迴圈會一直執行,可以在迴圈內部用break語句跳出迴圈。
for(;;):
for()語句中,第二個子句是迴圈條件,如果什麼都沒有寫,則表示為恒為真,所以迴圈會一直執行,也可以在迴圈內部用break語句跳出迴圈。
2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。
(1)迴圈次數已知
採用 for 迴圈語句實現比較好,列如:迴圈結構(1)中的1,2,3,4,5,6,7,8。這幾個題的題目中要求輸入一個數,這個數為迴圈次數。所以當迴圈次數已知時採用 for 迴圈語句實現比較好。
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
採用 while 迴圈語句實現比較好,列如:迴圈結構(2)中的1,2,3,5。這幾個題無法通過題目知曉迴圈次數,但可以通過題目知曉進入迴圈的條件。所以當迴圈次數未知,但迴圈條件在進入迴圈時明確時採用 while 迴圈語句實現比較好。
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
採用 do...while 迴圈語句實現比較好,列如:迴圈結構(2)中的4,6,7。這幾個題即無法通過題目知曉迴圈次數,又無法通過題目知曉進入迴圈的條件。但迴圈的條件可以在迴圈體中明確。所以當迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確時採用 do...while 迴圈語句實現比較好。
3.有如下問題:輸入一批學產生績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種迴圈語句實現,並說明你認為哪種形式更合適?
for語句:
# include <stdio.h>int main(){int i,x = 0,sum = 0;double p;for(i = 0 ;x >= 0 ; ){ scanf("%d",&x); if(x >= 0) { sum = sum+x; i++; }}p = sum/(double)i;printf("%f",p);return 0;}
while語句:
# include <stdio.h>int main(){int i,x = 0,sum = 0;double p;while(x >= 0){ scanf("%d",&x); if(x >= 0) { sum = sum+x; i++; }}p = sum/(double)i;printf("%f",p);return 0;}
do while語句:
# include <stdio.h>int main(){int i,x = 0,sum = 0;double p;do{ scanf("%d",&x); if(x >= 0) { sum = sum+x; i++; }} while(x >= 0);p = sum/(double)i;printf("%f",p);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;}
(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)的結果為
(2)的結果為
因為:break 的作用是跳出迴圈;continue 的作用是結束本次迴圈。
(三)實驗總結1 求給定精度的簡單交錯序列部分和(1)題目
本題要求編寫程式,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最後一項的絕對值不大於給定精度eps。
(2)流程圖
(3)原始碼
# include <stdio.h># include <math.h>int main(){int i = 1;double sum = 0.0,eps = 0.0;scanf("%lf",&eps);while(fabs(1.0/i) > eps){ sum = sum+1.0/i; i = pow(-1,i)*(fabs(i)+3);}sum = sum+1.0/i;printf("sum = %.6f",sum);return 0;}
(4)實驗分析
無問題
(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 m,n; scanf("%d%d",&m,&n); int num; int s=0; while(scanf("%d",&num) > 0) { s=s+1; if(s>n||num<0) { printf("Game Over\n"); break; } else { if(num>m)printf("Too big\n"); else if(num<m)printf("Too small\n"); else if(num==m&&s==1) { printf("Bingo!\n"); break; } else if(num==m&&s<=3) { printf("Lucky You!\n"); break; } else { printf("Good Guess!\n"); break; } } } return 0;}
(4)實驗分析
問題:
原因:沒有考慮直接退出這一情況。
解決辦法:加上對直接退出這一情況的考慮。
(5)本題PTA提交列表
3 求奇數和(1)題目
本題要求計算給定的一系列正整數中奇數的和。
(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:
原因:運用的語句錯誤,不應用 while 語句,應用 do...while 語句。
解決辦法:把 while 語句,換為 do...while 語句。
問題2:
原因:沒有考慮為空白集這一情況。
解決辦法:加上對空集這一情況的考慮。
(5)本題PTA提交列表
(四)部落格互評1.郭玉霖:http://www.cnblogs.com/HBQ521/p/7826030.html
你的部落格整體看上去不夠整齊,相同部分的字型有的不同,導致很不美觀,其他方面很好。
2.許天笑!:http://www.cnblogs.com/snxtx/p/7824427.html
你的部落格的格式看上去很美觀、整齊。總結部分也很充分,有一點小瑕疵,就是你的第一部分的4個“錯誤資訊”的格式不全相同。
3.趙曉輝: http://www.cnblogs.com/2205747462x/p/7851029.html
你的部落格看上去很整齊。如果你把第三部分中的來源程式的換成直接插入的形式會更美觀的。
C語言程式設計第六次作業——迴圈結構(2)