標籤:include 個數 負數 .com 代碼 差距 類型 原始碼 題目
(一)改錯題
序列求和:輸入一個正實數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。而這會損失精度,使結果出現誤差
解決辦法:%f改為%lf
最終正確
(二)學習總結
1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?
答:兩個都是無限迴圈。想要正常運行,就得保證能夠就結束迴圈,可以使用break跳出迴圈或者exit(0)直接結束程式。
2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。
答:第(1)種是for語句最優。
舉例: 2017迴圈結構(1)7-1求奇數分之一序列前N項和
#include<stdio.h>int main(){ int n,i; double sum; scanf("%d",&n); for(i = 1,sum = 0;i <= n;i=i+1) { sum = sum + 1.0 / (2*i-1); } printf("sum = %.6f",sum); return 0;}
因為已知迴圈次數為輸入的,是已知的,所以用for迴圈最優。
第(2)種是用while語句最優。
舉例:2017迴圈結構(2)7-7 尋找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; }
因為迴圈條件在進入迴圈時明確,就是要找250。
第(3)種是用do while語句最優。
舉例:2017迴圈結構(2)7-3 求奇數和
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語句三種迴圈語句實現,並說明你認為哪種形式更合適?
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語句更好一些,因為結束條件是明確的。
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)
第(1)個當輸入1時,1%2=1,迴圈,輸入2時2%2=0break,跳出迴圈輸出s=1,結束程式。
第(2)個 continue就是當輸入偶數時不執行下一步s = s + n,單迴圈繼續,所以程式計算的是輸入的奇數的和。
(三)(實驗總結)
- (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)實驗分析
剛開始不太瞭解,do while語句,看到題後不知道如何控制迴圈結束。
(5)本題PTA提交列表
- (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)本題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; }
(5)本題PTA提交列表
(四) 部落格互評
http://www.cnblogs.com/moying456/p/7859207.html
http://www.cnblogs.com/he111923/p/7840814.html
http://www.cnblogs.com/ying-7/p/7857820.html
C語言程式設計第六次作業——迴圈結構(2)