標籤:跳過 題目 小數 over 輸入輸出 超過 logs 浮點 程式設計
(一)改錯題
序列求和:輸入一個正實數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)
錯誤資訊:
錯誤原因:在輸出前沒有加封號。
改正方法:在while( item < eps)後加上“;”
(2)
錯誤資訊:
錯誤原因:n不是浮點型資料
改正方法:將n定義為double類型,並且在item = 1/n的n前加上(double)強制執行。
(3)
錯誤資訊:
錯誤原因:double型資料是%f
改正方法:將%f改為%lf。
(4)
錯誤資訊:
錯誤原因:item在不停變小,一開始就比eps大。
改正方法:將“<”改成“>=”。
(二)學習總結1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?
答:while(1)和for(;;)的意思都是無限迴圈,語句不出現錯誤,迴圈就會正常執行。
2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。
答:當迴圈次數已知時可以用for語句來進行,譬如pta程式設計結構(2)中的第二題。
當迴圈次數未知,但迴圈條件在進入迴圈時明確時用while語句,可以直接 無限迴圈,然後判斷是否符合條件,符合條件就直接break退出迴圈。例如pta程式設計結構(2)中的第三題。
當迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確應當用do while迴圈,應為在do while迴圈中,是先進行一次迴圈然後再判斷,假如判斷條件是在迴圈後才出來的,那麼就應當使用,do while迴圈。例如pta程式設計結構(2)中的第六題。
3.有如下問題:輸入一批學產生績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句和無限迴圈四種迴圈語句實現,並說明你認為哪種形式更合適?
答:
(1)for語句
#include<stdio.h>int main(void){int a=0,s=0,i=0;double average=0.0;for(;;) {scanf("%d",&a);if(a!=-1){s = s +a;i++;}else{break;}}average = s / i;printf("%f",average);return 0;}
(2)while語句
#include<stdio.h>int main(){double sum = 0.0,average = 0.0,score = 0.0;int i = 1;scanf("%lf",&score);while(score >= 0){ sum += score; scanf("%lf",&score); average = sum / i; i++;}printf("average = %.2f",average);}
(3)do while語句
#include<stdio.h>int main(void){double sum = 0.0,a = 0.0,s= 0.0;int i = 1;scanf("%lf",&s);if(s < 0) { a = 0.0;}else{do{ sum += s; scanf("%lf",&s); a = sum / i; i++;}while(s >= 0);}printf("average = %.2f",a);}
(4)無限迴圈
#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;}
我個人認為,就本題而言,用while語句比較,因為此題的條件是輸入-1結束,只需要在輸入-1時break即可,而且相比較其他的迴圈體來說,這種迴圈體會縮短啟動並執行步驟,節省計算時間。
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的時候,2和2求餘是0跳出了s=1+0=1所以輸出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;}
運行結果為:
原因是:
跳過了所有的偶數,1,3,5,7,9和2求餘都不是0,執行s=s+n偶數的時候不執行s=s+n。
三:實驗總結:1:求給定精度的交錯數列和:
(1)題目
本題要求編寫程式,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最後一項的絕對值不大於給定精度eps。
(2)流程圖:
(3)來源程式:
#include<stdio.h>#include<math.h>int main() { double S,m,n,k,a,b,c,N,Q; S=0,b=1,c=-1,a=0; scanf("%lf",&N); do { a++,b++,c++; k=pow(-1,b); m=2*a-1+c; n=1/m; Q=k*n; S=S+Q; }while(fabs(Q)>N); printf("sum = %.6f",S); }
(4)實驗分析
問題1:結果總是錯誤
原因:迴圈結構不對
解決辦法:先將s注釋出來查看問題,然後將Q改掉。
(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 key, n; scanf("%d %d",&key,&n); int i; int m; int flag = 0; for (i = 1;i <= n;i ++) { scanf("%d",&m); if (m < 0) break; if (m > key) printf("Too big\n"); if (m < key) printf("Too small\n"); if (m == key) { if (i == 1) { flag = 1; printf("Bingo!\n"); break; } if (i == 2 || i == 3) { flag = 1; printf("Lucky You!\n"); break; } if (i > 3) { flag = 1; printf("Good Guess!\n"); break; } } } if (flag == 0) printf("Game Over\n"); return 0; }
(4)實驗分析
問題1:結果總是錯誤
原因:迴圈結構不對
解決辦法:先將s注釋出來查看問題,然後將Q改掉。
(5)本題pta提交列表
3:求奇數和
(1)題目
本題要求計算給定的一系列正整數中奇數的和。
(2)流程圖:
(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;}
(4)實驗分析
問題1:結果總是錯誤
原因:迴圈結構不對
解決辦法:先將s注釋出來查看問題,然後將Q改掉。
(5)本題pta提交列表
(四)部落格互評
- http://www.cnblogs.com/rjp123/p/7859004.html 任佳鵬
- http://www.cnblogs.com/lipan123/p/7858162.html 李攀
- http://www.cnblogs.com/yaole10086/p/7851074.html 姚慶虎
---恢複內容結束---
C語言程式設計第六次作業——迴圈結構(2)