C語言程式設計第六次作業——迴圈結構(2)

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.