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

來源:互聯網
上載者:User

標籤:出現   語句   原始碼   無限   code   精確   main   整型   特定   

(一)改錯題:
錯誤資訊一:

錯誤原因:while後面沒有分號。
改正方法:

在while後面加上分號。

改正錯誤資訊一後編譯無錯誤,但是運行出現錯誤。

錯誤資訊二:

錯誤原因1:

while後面括弧中的是迴圈能夠進行的條件,而item < eps是限制條件。
改正方法:

如果要想迴圈進行,把item < eps改成 item >= eps。

錯誤原因2:

eps 定義的是 double 類型 所以輸入時應該是%lf
改正方法:

把%f改成%lf

錯誤原因3:

n定義的是整型,而item是double類型
改正方法:

把1改成1.0
編譯運行後發現沒有錯誤,

(二)學習總結:
1.語句while(1)和for(;;)是什麼意思?,如何保證這種迴圈能正常執行?
while(1)的意思:1就是真(條件成立),0就是假(條件不成立),while(1) 永遠都是真,如果內部沒有跳出語句,那就是個死迴圈。
for(;;)的意思:for後的圓括弧中,第一個分號前的內容是執行第一次迴圈前執行的,第二個分號前的內容是每次執行前都要判斷的(如果該處運算式的值為真,那麼執行迴圈體,如果為假,那麼就跳出迴圈體),第二個分號後的內容是每執行完一次迴圈體後執行的 。這裡中間沒有限制條件(第2個分號前)(有限制條件也要該條件必然會變成真,迴圈才會停止),所以不會停。另一種停止的方法在迴圈體中使用break跳出迴圈體。

2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。
①迴圈次數已知
用for 語句,比如在PTA迴圈結構(1)中第8題找出最小值。題目是輸入在一行中首先給出一個正整數n,之後是n個整數,在一行中按照“min = 最小值”的格式輸出n個整數中的最小值。本題迴圈次數是知道的,輸入n個整數找出最小值,所以迴圈次數就是n次。
②迴圈次數未知,但迴圈條件在進入迴圈時明確
用whlie語句,比如在PTA迴圈結構(2)中的第7題尋找250,題目是輸入在一行中給出不知道多少個絕對值不超過1000的整數,其中保證至少存在一個“250”。在一行中輸出第一次出現的“250”是對方扔過來的第幾個數字(計數從1開始)。題目保證輸出的數字在整型範圍內。這都題不知道要迴圈幾次,所以用while(1)無限迴圈,當輸入250時迴圈停止,所以加上break語句進行控制。
③迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
用do while語句,比如用do while語句。比如在PTA迴圈結構(2)中第5題爬動的蠕蟲,題目是一條蠕蟲長1寸,在一口深為N寸的井的底部。已知蠕蟲每1分鐘可以向上爬U寸,但必須休息1分鐘才能接著往上爬。在休息的過程中,蠕蟲又下滑了D寸。就這樣,上爬和下滑重複進行。請問,蠕蟲需要多長時間才能爬出井?這裡要求不足1分鐘按1分鐘計,並且假定只要在某次上爬過程中蠕蟲的頭部到達了井的頂部,那麼蠕蟲就完成任務了。初始時,蠕蟲是趴在井底的(即高度為0)。此程式至少要進行一次迴圈
3.有如下問題:輸入一批學產生績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種迴圈語句實現,並說明你認為哪種形式更合適?
for語句:

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

while語句:

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

for while 語句:

# include<stdio.h>int main(){    int m,sum,i;    double average;    sum = 0;    i = 0;    do{    scanf("%d",m);    sum = sum+m;    i++;}while(m!=-1);average = sum/i;printf("%f",average);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;}

輸入1到10,結果:

(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到10,結果:

兩個程式的輸出結果分別是s=1,s=25
兩個程式的區別在於第一個使用了break跳出語句,第二個使用了continue語句。continue語句只結束本次迴圈,而不是終止整個迴圈的執行。而break語句則是結束整個迴圈過程,不再判斷執行迴圈的條件。第一個程式中當輸入1時(n%2==0)成立所以執行break語句,跳出迴圈體,輸出s=1。第二個程式中輸入1到10,當if語句成立結束本次迴圈(不是終止整個迴圈),否則執行本次迴圈。

(三)實驗總結:
1.求給定精度的簡單交錯序列部分和:
(1)題目:計算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最後一項的絕對值不大於給定精度eps。在一行中按照“sum = S”的格式輸出部分和的值S,精確到小數點後六位。
(2)流程圖:

(3)原始碼:

# include <stdio.h># include<math.h>int main(void){int m,n;double eps,sum,item;item = 1;sum = 0;m = 1;n = 1;scanf("%lf",&eps);if(eps>=item){  sum = 1;}while(fabs(item)>eps){    item = (double)m/n;    sum = sum+item;    n = n+3;    m = -m;}printf("sum = %.6f",sum);return 0;}

(4)實驗分析:
問題1:

原因:沒有考慮當輸入第一個數時大於或是等於item,此時sum=1
解決辦法:

在迴圈前加入一個if語句。
(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 i,n,a,N;     scanf("%d",&i);scanf("%d",&N);n == 0;while(n<=N){    scanf("%d",&a);    n=n+1;    if(a<0)    {        printf("Game Over\n");        break;    }    if(i>a)    {        printf("Too small\n");            }    else if(i<a)    {        printf("Too big\n");            }    else    {                if(n==1)        {            printf("Bingo!\n");            break;        }        else if(n>1&&n<=3)        {            printf("Lucky You!\n");            break;        }        else if(n>3&&n<=N)        {            printf("Good Guess!\n");            break;        }        else        {            printf("Game Over\n");            break;        }    }    } return 0;}

(4)實驗分析:
錯誤資訊:

錯誤原因:

沒有給n賦初值,在迴圈中沒有使n=n+1
改正方法:

(5)本題PTA提交列表:

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

(3)原始碼:

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

(4)實驗分析:
本題的迴圈條件是a>0,while後面是迴圈能進行的條件,在whlie後面的括弧中加上a>0這個迴圈條件。
(5)本題PTA提交列表:

(四)部落格互評:
(1)http://www.cnblogs.com/luyu0322-/p/7846404.html
(2)http://www.cnblogs.com/yiqiekaoziji/p/7858416.html
(3)http://www.cnblogs.com/karry-5201314/p/7846648.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.