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

來源:互聯網
上載者:User

標籤:item   精確   std   stdio.h   迴圈語句   編譯   定義   inpu   進入   

(一)改錯題

序列求和:輸入一個正實數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:

錯誤原因:do……while語句後沒有分號 ;
改正

此時編譯結果為:

錯誤資訊2:

錯誤原因::item 為double類型,但是1/n 為int整型,格式錯誤。
改正

此時編譯結果為:

則編譯正確,那麼運行時一下試試吧。

輸出結果錯誤則還需再檢查一下。

錯誤資訊3:

錯誤原因3:while中應為迴圈開始的語句,而題中給出的為迴圈結束的語句
改正

錯誤資訊4:

錯誤原因:esp定義的為double形式,題中不符合。
改正

編譯及運行結果;

與結果相符,則修改完成,修改後的代碼為:

#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)表示無限迴圈,當括弧裡的數字為1時,表示為真,執行迴圈語句,當括弧裡的數字為0時,表示為假,跳出迴圈。
for(;;)運算式1是初值,運算式2是判斷,運算式3是步長,先執行運算式1,然後執行運算式2,接著執行迴圈體,然後再執行運算式3,再回到執行運算式2,然後執行迴圈體,接著執行運算式3,直到運算式2不成立退出。所以for(;;)也為無限迴圈。這兩種迴圈的意思是等價的。當與語句中沒有停止語句時這兩種迴圈會一直迴圈下去,如果語句中出現類似於break語句的話,那麼這個迴圈就會停止跳出。
2.一般情況下,設計迴圈結構時,使用for、while、do while三種語句都可以,並且三種語句可以相互轉換,但是,在某些特定情況下,我們應該優先選擇某種語句來快速實現迴圈設計。如果有如下情況:
(1)迴圈次數已知
(2)迴圈次數未知,但迴圈條件在進入迴圈時明確
(3)迴圈次數未知,且迴圈條件在進入迴圈時未知,需要在迴圈體中明確
針對上面三種情況,分別採用什麼迴圈語句實現比較好?對每種情況,用我們完成的兩次迴圈結構作業中的題目加以說明。

(1)例如for語句的例子:
本題要求編寫程式,計算序列 1 + 1/3 + 1/5 + ... 的前N項之和。
這道題用for比較方便,題中明確給出了迴圈次數,給次數賦初值,明確了迴圈條件和步長,就可以得出答案。
(2)例如while 語句的例子:
本題要求計算給定的一系列正整數中奇數的和。
輸入在一行中給出一系列正整數,其間以空格分隔。當讀到零或負整數時,表示輸入結束,該數字不要處理。
此處便用到了while迴圈語句,這道題讓你求你輸入的數中的奇數的和,因為不知道要迴圈多少次,所以用到了while(1)這個無限迴圈,類似的題目還有:
對方不想和你說話,並向你扔了一串數…… 而你必須從這一串數字中找到“250”這個高大上的感人數字。
這個數字,做題時並不知道要迴圈多少次,,這就是典型的先迴圈再判斷。
(3)do...while語句例子:
對任意一個自然數N0?? ,先將其各位元字相加求和,再將其和乘以3後加上1,變成一個新自然數N?1;然後對?N1?? 重複這種操作,可以產生新自然數N?2?? ;……多次重複這種操作,運算結果最終會得到一個固定不變的數N?k ,就像掉入一個數字“陷阱”。
本題要求對輸入的自然數,給出其掉入“陷阱”的過程。
掉入陷阱的數字, 當你輸入一個自然數時,你要先鎖定他的各個位元,然後再求和,他的要求是當輸出的這一次的數和上一次和一樣便輸出,所以你需要先迴圈一次,再開始進行判斷,直到輸出為止。像這種都未知 的情況下就用do...while 語句。
就是當這一次的輸出的結果和上一次的輸出結果相同時輸出,所以需要先迴圈一次,再進行判斷,直到輸出,所以用do...while是合適的。
3.有如下問題:輸入一批學產生績,以-1作為結束,計算學生的平均成績。
要求分別用for語句、while語句、do while語句三種迴圈語句實現,並說明你認為哪種形式更合適?
(1)for語句

#include<stdio.h>#include<stdlib.h>int main(){int sum,n,i;double average;sum=0;for(i=0;1;){    scanf("%d",&n);    if(n==-1)    {        printf("average=0.00");        exit(0);    }    else    {        sum+=n;         i++;            }}average=(double)sum/i;printf("%.2lf",average);}

(2)while語句:

#include<stdio.h>#include<stdlib.h>int main(){int sum,n,i;double average;sum=0;i=0;while(1){    scanf("%d",&n);         if(n==-1)    {        printf("average=0.00");        exit(0);    }    else    {        sum+=n;         i++;            }}average=(double)sum/i;printf("%.2lf",average);}

(3)do……while語句

#include<stdio.h>#include<stdlib.h>int main(){int sum,n,i;double average;sum=0;i=0;do{    scanf("%d",&n);         if(n==-1)            {                printf("average=0.00");        exit(0);            }               else    {       sum+=n;        i++;            }}while(1);average=(double)sum/i;printf("%.2lf",average);}

在這道題上使用while語句比較合適。因為這個程式是迴圈次數未知,但迴圈條件在進入迴圈時明確,如果用for語句或者是do...while語句來寫的話會比while麻煩一點需要加判斷語句。

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.