標籤:錯誤資訊 src img 快速 for語句 優先 ima 保留 break
(一)改錯題序列求和:輸入一個正實數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為整型改正方法:item = 1/ n;改為item = 1.0/ n;3.錯誤資訊:發現答案還是不對錯誤原因:與題意不符合while( item < eps)改為while( fabs(item) > eps)4.答案正確(二)學習總結1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?語句while(1)是無限迴圈,一直在執行是無限迴圈。
for(;;)是有指定次數的迴圈。兩個都是迴圈結構
2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:(1)迴圈次數已知(2)迴圈次數未知,但迴圈條件在進入迴圈時明確(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。第一個應該用for語句;第二個用while迴圈;第三個用do while迴圈3.有如下問題:輸入一批學產生績,以-1作為結束,計算學生的平均成績。要求分別用for語句、while語句、do while語句三種迴圈語句實現,並說明你認為哪種形式更合適?應該用while語句比較好(1) for語句
#include <stdio.h>int main(){ int s; double sum=0,average,n=0; { for(;1;) { scanf("%d",&s); if(s != -1) { sum=sum+s; n=n+1; } else { break; } } average=sum/n; printf("%lf",average); }}
(2)while語句
#include <stdio.h>int main(){int s;double sum=0,average,n=0;{ while(1) { scanf("%d",&s); if(s != -1) { sum=sum+s; n=n+1; } else { break; } } average=sum/n; printf("%lf",average);}}
(3)do while語句
#include <stdio.h>int main(){ int s,i; double sum=0,average,n=0; scanf("%d",&i); { do { scanf("%d",&s); if(s != -1) { sum=sum+s; n=n+1; } else { break; } }while(n<i); average=sum/n; printf("%lf",average);}}
運行下面程式,輸入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>輸入1時不運行if語句,執行了s=s+n,<2>輸入2時運行if語句,break直接結束語句,所以s=1。第二個程式用continue倆控制迴圈條件,他進行判斷後不會跳出而是直接進行下一個,並且把能整除2的數過濾掉,所以最後輸出的是25。(三)實驗總結1.(1)題目求給定精度的簡單交錯序列部分和(2)流程圖
(3)原始碼
#include <stdio.h>int main(void){double eps=0;scanf("%lf",&eps);int f=1,d=1;double sum=0;if(eps>=1){printf("sum = 1.000000");}else{ while((1.0/d)>=eps){sum+=(1.0/d)*f; f=-f;d+=3;}printf("sum = %.6f",sum);}return 0;}
(4)實驗分析問題1:輸出的答案一直是1.0000原因:對while的判斷條件不瞭解解決辦法:分出兩種情況判斷一下。(5)本題PTA提交列表2.(1)(1)題目猜數字遊戲(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)實驗分析無問題(5)本題PTA提交列表
3.(1)題目猜數字遊戲(2)流程圖
(3)原始碼
#include <stdio.h>int main(){ int n,s,sum; sum=0; scanf("%d",&s); while(s > 0) { if(s%2!=0) { sum=sum+s; } scanf("%d",&s); } printf("%d",sum);}
(4)實驗分析問題1: 老是運行逾時原因:使用for迴圈解決辦法:換成了while(5)本題PTA提交列表
(四)部落格互評一隻貓の磊?的部落格:http://www.cnblogs.com/8426224ll/p/7847221.html王映丹:http://www.cnblogs.com/windsky-1999/姚慶虎:http://www.cnblogs.com/yaole10086/p/7851074.html
C語言程式設計第六次作業——迴圈結構(2)