C語言程式設計第六次作業

來源:互聯網
上載者:User

標籤:類型   進入   比較   fabs   必須   運算式   範圍   無限   do while   

(一)改錯題

序列求和:輸入一個正實數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; scanf("%f",&eps);    printf("Input 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:
原因1:希望在while後邊加上分號,所以程式出現錯誤
改正1:在while後邊加上分號,但是如果是while 語句則不加分號,加上會出現錯誤
程式的編譯沒有問題,但是運行結果有問題
錯誤2:
:
原因2:item為double類型,但在運算式中卻是整型,格式有問題
改正2: 將item = 1/ n;改為 item = 1.0/ n;
繼續編輯,輸出結果依然不對
錯誤3:

原因3:
分析題型,應該是while中出錯
改正3:將其改為 item > eps
錯誤4:
輸出結果與答案不符
原因4:題目定義eps是double類型,而在代碼中 scanf("%f",&eps);
改正4:將%f改為%lf
運行結果正確
正確代碼

#include<stdio.h>int main(){int flag,n;double eps,item,s;printf("Input eps: ");scanf("%lf",&eps);flag = 1;s = 0;n = 1;do{    item = 1.0/ n;    s = s + flag * item;      flag = -flag;    n = n + 3;    }while( item >= eps);    printf( "s = %f\n",s);return 0;}

(二)學習總結

1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?
答:while(1)表示無限迴圈,while語句的原型是while(運算式)語句,當運算式為非0時,執行while語句中的嵌套語句,while(1)表示永遠為真,迴圈會無休止進行下去,直到碰到
break則停止。在for(::)中第一個分號前的內容是執行第一次迴圈前執行的,第二個分號前的內容是每次執行前都要判斷的,在這沒有限制條件的,所以會一直迴圈不會停,直到遇到break停止。一般來說,只要不碰到break都可以一直正常進行。

2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句
來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。
答:迴圈條件已知用for語句,可以確定次數,迴圈次數未知,但迴圈條件在進入迴圈時明確,用while語句,
次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確用do while語句,這個語句先執行一次,然後判斷進入迴圈
例:(1)迴圈次數已知:使用for語句,比如我們PTA作業迴圈結構(1)中的7-7題,因為迴圈次數已知,所以用for迴圈
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確:使用while語句,比如我們PTA作業迴圈結構(2)中的7-1題
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確:使用do...while語句,比如我們PTA作業迴圈結構(2)中的7-7題

3.有如下問題:輸入一批學產生績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種迴圈語句實現,並說明你認為哪種形式更合適?
for語句

 #include<stdio.h>int main(){int sum,grade ,i=0;double ave=0;for(;;){scanf("%d",&grade);if(grade!=-1){    sum=sum+grade;    i++;            }       else if(grade==-1){    break;}       }ave=sum/i;printf("%f",ave);return 0;    } 

while語句

#include<stdio.h>int main(){int sum,grade ,i=0;double ave=0;while(1){    scanf("%d",&grade);    if(grade==-1)    {     break;    }        sum=sum+grade;        i++;}    ave=sum/i;    printf("%f",ave);    return 0;     }

do while語句

#include<stdio.h>int main(){int sum,grade ,i=0;double ave=0;scanf("%d",&grade);if(grade==-1){    ave=0;}else{    do{    scanf("%d",&grade);    if(grade==-1)        {         break;        }        sum=sum+grade;        i++;        }while(1);        ave=sum/i;        printf("%f",ave);        return 0;    } }

我認為此題用while語句較好一點,因為此題是迴圈次數未知,所以用for迴圈不太好 ,如果用do while 還得先進行判斷,然後才能進行迴圈,也比較麻煩,
所以用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除取餘為0的話,則跳出迴圈,當輸入2的時候取餘為0,則直接跳出迴圈,所以和為1;但是在(2)中如果輸入的數被2除取餘為0的話,
則繼續執行for迴圈,則不把此數加入迴圈,計算的就是1-10中奇數的和所以和為25,這就是break與continue的區別。

(三)實驗總結

一:(1)題目
求給定精度的簡單交錯序列部分和(10 分)
本題要求編寫程式,計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最後一項的絕對值不大於給定精度eps。
輸入格式:
輸入在一行中給出一個正實數eps。
輸出格式:
在一行中按照“sum = S”的格式輸出部分和的值S,精確到小數點後六位。題目保證計算結果不超過雙精確度範圍。
(2)流程圖

(3)原始碼

#include<stdio.h>#include<math.h>int main(){   int a,b;double sum=0,eps,x;   scanf("%lf", &eps); x=1.0;a=1;b=1; if(eps>=1) sum=1.0;    else   {while(fabs(x)>eps) {x=b*1.0/a;sum=sum+x;b=-b;a=a+3;     }         }    printf("sum = %0.6lf\n",sum);  return 0; } 

(4)實驗分析
用for迴圈寫還比較熟練。但是用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”,並結束程式。
輸入格式:
輸入第一行中給出兩個不超過100的正整數,分別是遊戲機產生的隨機數、以及猜測的最大次數N。最後每行給出一個使用者的輸入,直到出現負數為止。
輸出格式:
在一行中輸出每次猜測相應的結果,直到輸出猜對的結果或“Game Over”則結束。
(2)流程圖

(3)原始碼

#include <stdio.h>#include <stdlib.h>int main(){int x,y,m,n=0;scanf("%d %d",&y,&m);while(1){    if(m<=n)    {        printf("Game Over\n");        exit(0);    }    scanf("%d",&x);    if(x<0)    {           printf("Game Over\n");        exit(0);    }    if(m>n)    {        if(x<y)        {        printf("Too small\n");        }        if(x>y)        {        printf("Too big\n");        }        if(x==y)        {            if(n<1)            {                printf("Bingo!\n");                break;            }            else if(n<3)            {                printf("Lucky You!\n");                break;            }            else if(n>=3&&n<m)            {                printf("Good Guess!\n");                break;            }        }    }    n++;}return 0;}

(4)實驗分析
這道題目寫比較麻煩,首先需要先去讀懂題目,根據層次一點點寫下來,寫的時候比較麻煩,寫的時候那些else if 以及if的關係總是出錯

(5)pta提交


三:(1)題目
本題要求計算給定的一系列正整數中奇數的和。
輸入格式:
輸入在一行中給出一系列正整數,其間以空格分隔。當讀到零或負整數時,表示輸入結束,該數字不要處理。
輸出格式:
在一行中輸出正整數序列中奇數的和。
(2)流程圖

(3)原始碼

#include<stdio.h>int main()  {int x,sum=0;scanf("%d",&x);while(x>0){if(x%2!=0){sum=sum+x;}scanf("%d",&x);}    printf("%d",sum);}

(4)實驗分析
此道題目比較簡單,沒有很大問題

(5)pta提交

四:部落格互評

一隻貓の磊:?http://www.cnblogs.com/8426224ll/p/7847221.html
luckyyou : http://www.cnblogs.com/LYFRRS/p/7854183.html
碧海聽潮: http://www.cnblogs.com/hfh0420/p/7857846.html

C語言程式設計第六次作業

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.