《C語言程序設(shè)計》課件2第5章_第1頁
《C語言程序設(shè)計》課件2第5章_第2頁
《C語言程序設(shè)計》課件2第5章_第3頁
《C語言程序設(shè)計》課件2第5章_第4頁
《C語言程序設(shè)計》課件2第5章_第5頁
已閱讀5頁,還剩161頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第5章循環(huán)結(jié)構(gòu)5.1while循環(huán)5.2do-while循環(huán)5.3for循環(huán)5.4循環(huán)嵌套5.5轉(zhuǎn)移控制語句5.6程序舉例習(xí)題5

本章學(xué)習(xí)要求:

1.了解goto語句的使用。

2.掌握for語句、while語句和do-while語句的使用以及它們之間的區(qū)別。

3.掌握break、continue語句與循環(huán)語句的結(jié)合使用;循環(huán)語句的嵌套使用。

4.掌握循環(huán)語句解決算法問題之?dāng)?shù)列問題、窮舉算法、密碼問題。

5.掌握二分法、牛頓迭代法求非線性方程的根,了解梯形法求定積分。

循環(huán)結(jié)構(gòu)用來描述具有規(guī)律性的重復(fù)工作。例如,求若干個數(shù)的累積;輸入全班所有學(xué)生的成績等。實際上,幾乎所有實用的程序都包括循環(huán)。循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的基本結(jié)構(gòu)之一,與順序結(jié)構(gòu)、選擇結(jié)構(gòu)一起作為各種復(fù)雜程序的基本構(gòu)造單元。循環(huán)結(jié)構(gòu)的應(yīng)用使得大量重復(fù)的工作變得更容易,提高了編程效率。C語言提供了三種循環(huán)結(jié)構(gòu)的語句:while、do-while和for語句。

在第1章中,我們講述了循環(huán)結(jié)構(gòu)有當(dāng)型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu),前者是先進(jìn)行條件判斷,再決定是否執(zhí)行循環(huán)體;后者是先執(zhí)行一次循環(huán)體,再進(jìn)行條件判斷。

while循環(huán)是當(dāng)型循環(huán)。

1.?while循環(huán)的一般格式

while循環(huán)的一般格式如下:

while(表達(dá)式)

循環(huán)體;5.1while循環(huán)說明:

(1)“表達(dá)式”可以是任意表達(dá)式,用來判定循環(huán)是否終止(或者說判定循環(huán)體是否執(zhí)行)。表達(dá)式的值要么為真,要么為假;如果其值為一個數(shù)值,則非0的任何數(shù)都為真,而0代表假。如果第一次執(zhí)行時,“表達(dá)式”的值為假,則“循環(huán)體”中的語句一次都不執(zhí)行。

(2)“循環(huán)體”中可以是單語句,也可以是空語句(只有一個;的語句)或復(fù)合語句,如果是復(fù)合語句,則必須括在{}之中。

2.?while循環(huán)語句的執(zhí)行順序

while循環(huán)語句的執(zhí)行順序如下:

(1)先計算表達(dá)式的值,再判斷表達(dá)式的值是真還是假;

(2)如果是真,則執(zhí)行循環(huán)體,再轉(zhuǎn)到第(1)步繼續(xù);

(3)否則退出循環(huán),轉(zhuǎn)而執(zhí)行本語句后的其他語句。

圖5.1是用流程圖來表示while語句的執(zhí)行順序,虛線框內(nèi)是while語句部分。

圖5.1while循環(huán)語句流程圖

3.?while語句使用舉例

例5.1

計算s

=

1

+

2

+

3

+

…+

100。

問題分析:解決這類累加、累積問題,關(guān)鍵是要找出通用的計算公式,即找到循環(huán)體中的部分。s

=

s

+

i是本例的通用性計算公式。公式中,s既作為一個加數(shù)使用,也用于存放累加后的結(jié)果,其初值為0;i既作為另一個加數(shù)使用,也作為循環(huán)變量,其取值范圍是1~100。對于每個i值,要進(jìn)行一次s

=

s

+

i的計算。例如,當(dāng)i

=

1時,s

=

0

+

1

=

1;當(dāng)i

=

2時,s

=

1

+

2

=

3;當(dāng)i

=

3時,s

=

2

+

3

=

5;……依此類推下去,就可以得到結(jié)果s(本例的流程圖見圖5.2)。

圖5.2累加流程圖程序如下:

main()

{

inti,s;

s=0; /*存放累加結(jié)果的變量賦初值*/

i=1; /*從1開始累加*/

while(i<=100) /*i小于等于100時繼續(xù)執(zhí)行循環(huán)體*/

{s=s+i; /*累加*/

i++;

}

printf("s=%d\n",s); /*輸出累加后的結(jié)果*/

}

do-while循環(huán)是直到型循環(huán)結(jié)構(gòu),其流程圖如圖1.4(b)所示。

直到型循環(huán)的執(zhí)行過程是,首先執(zhí)行循環(huán)體,然后判斷條件(計算邏輯表達(dá)式),如果條件滿足(即邏輯表達(dá)式值為真),則繼續(xù)執(zhí)行循環(huán)體;如果條件不滿足(即邏輯表達(dá)式值為假),則退出循環(huán)結(jié)構(gòu)。5.2do-while循環(huán)從上述的執(zhí)行過程來看,直到型循環(huán)結(jié)構(gòu)由于首先執(zhí)行循環(huán)體,然后再判斷條件,因此,其循環(huán)體至少要執(zhí)行一次。這是與當(dāng)型循環(huán)結(jié)構(gòu)最明顯的區(qū)別。

1.?do-while循環(huán)的一般格式

do-while循環(huán)的一般格式如下:

do

循環(huán)體

while(表達(dá)式);說明:

(1)“表達(dá)式”可以是任意表達(dá)式,用來判定循環(huán)是否終止(或者說判定循環(huán)體是否執(zhí)行)。表達(dá)式的值要么為真,要么為假;如果其值為一個數(shù)值,則非0的任何數(shù)都為真,而0代表假。即使第一次執(zhí)行時“表達(dá)式”的值為假,“循環(huán)體”中的語句最少會被執(zhí)行一次。

(2)“循環(huán)體”中可以是單語句,也可以是空語句(只有一個;的語句)或復(fù)合語句,如果是復(fù)合語句,則必須括在{}之中。

(3)

do-while作為一個語句,必須以分號(;)結(jié)束,所以在while(表達(dá)式)后一定要有分號。

2.?do-while循環(huán)語句的執(zhí)行順序

do-while循環(huán)語句的執(zhí)行順序如下:

(1)先執(zhí)行循環(huán)體;

(2)計算表達(dá)式的值,并判斷表達(dá)式的值是真還是假;

(3)如果是真,則繼續(xù)轉(zhuǎn)到第(1)步執(zhí)行循環(huán)體;

(4)否則退出循環(huán),轉(zhuǎn)而執(zhí)行本語句后的其他語句。

圖5.3是用流程圖來表示do-while語句的執(zhí)行順序,虛線框內(nèi)是do-while語句部分。

5.3do-while循環(huán)語句流程圖

3.?do-while語句使用舉例

例5.1中的問題也可以用do-while循環(huán)語句來實現(xiàn),其C程序如下:

main()

{inti,s;

s=0;

i=1;

do

{s=s+i; /*累加*/

i++;

}while(i<=100); /*i的值小于等于100時繼續(xù)循環(huán)*/

printf("s=%d\n",s); /*輸出累加結(jié)果*/

}

例5.2

編寫程序計算并輸出下列級數(shù)和,直到某項的絕對值小于10-4為止。

問題分析:

(1)這是一個逐項相加的問題,第一項可以看成sum的初值;

(2)每一項的正或負(fù)交替進(jìn)行(即各項符號相間),因此可以設(shè)一個改變每一項符號的變量f,每次累加前將變量f自身取負(fù)(即f

=

-f),并將其與該項的和相乘;

(3)第k項的表達(dá)式為1/(k*(k

+

1)),可以用一個變量d來存放第k項的值,以便于累加和判斷該項的值是否滿足條件。

程序如下:

#include<stdio.h>

#include<math.h>

main()

{intk;

doublesum,d,f;

sum=1.0;k=0;f=1.0;

do

{k=k+1;f=-f; /*符號變量f自身取負(fù)*/

d=1.0/(k*(k+1)); /*計算第k項的值,試想: 為什么1必須用1.0?*/

sum=sum+f*d; /*累加第k項*/

}while(fabs(d)>=1.0e-4); /*某項的值d的絕對值如果 大于10-4則退出循環(huán)*/

printf("sum=%lf\n",sum);

}

對于這一類求級數(shù)和的問題,最為關(guān)鍵的是要先找到通項表達(dá)式,在找通項表達(dá)式時,可以對前后兩項進(jìn)行對比來發(fā)現(xiàn),而本例的通項已知,所以不必再去找通項。

例5.3

從鍵盤輸入1個整數(shù),把這個整數(shù)中的各位數(shù)字反序輸出。例如,輸入12345,則輸出為54321。

問題分析:所謂反序輸出就是先輸出個位數(shù),再輸出十位數(shù)……。對任意整數(shù)k而言,可以用k%10求得個位數(shù),例如,12345$10

=

5。在此基礎(chǔ)上,將k的值用k/10來代替,即用k/10將k縮小10倍。例如,12345/10

=

1234(試想為什么不等于1234.5?)。這樣,k就由原來的5位數(shù)變成了4位數(shù)。用同樣的方法可以求得該4位數(shù)的個位數(shù)(即原5位數(shù)的十位數(shù)),再將4位數(shù)縮小為3位數(shù),依此類推,直到剩1位數(shù)。在1位數(shù)的情況下,直接輸出該數(shù),整個問題就解決了。剩下的問題就是如何判斷k已經(jīng)縮小為1位數(shù),如果k為1位數(shù),則必有k/10=0。因此,解決這個問題的基本思路是不斷求出k的個位數(shù),將該個位數(shù)輸出,然后將k縮小10倍。如果縮小后的k不等于0,就繼續(xù)進(jìn)入下一輪循環(huán);否則,退出循環(huán)。程序如下:

main()

{

intk,g;

printf("Pleaseinputaninteger:");

scanf("%d",&k);

do

{

g=k%10;

printf("%2d",g);

k=k/10;

}while(k!=0);

}

前面介紹的while、do-while循環(huán)語句對于循環(huán)體執(zhí)行的次數(shù)事先無法估計的情況,是十分有效的。但在有些實際問題中,循環(huán)體的執(zhí)行次數(shù)是可以事先估計出來(或已知)的,在這種情況,雖然也可以用前面介紹的兩種循環(huán)語句來實現(xiàn),但在C語言中還提供了另一種實現(xiàn)循環(huán)的語句,即for語句。5.3for循環(huán)

1.?for循環(huán)語句的一般格式

for循環(huán)語句的一般格式如下:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

循環(huán)體語句(組);

一般來說,表達(dá)式1用于提供循環(huán)的初始值(經(jīng)常用逗號運算符給多個變量賦初值),表達(dá)式2用于提供循環(huán)的條件,表達(dá)式3用于改變循環(huán)變量的值,表達(dá)式3的位置相當(dāng)于在循環(huán)體中的最后一個語句。

for循環(huán)語句在功能上等價于下列的while循環(huán)語句:

表達(dá)式1;

while(表達(dá)式2)

{循環(huán)體語句(組);

表達(dá)式3;

}

2.?for循環(huán)語句的執(zhí)行順序

for循環(huán)語句的執(zhí)行順序如下:

(1)執(zhí)行表達(dá)式1;

(2)計算表達(dá)式2的值;

(3)如果表達(dá)式2的值為真,則執(zhí)行循環(huán)體,再執(zhí)行表達(dá)式3,轉(zhuǎn)到第(2)步執(zhí)行;

(4)如果表達(dá)式2的值為假,則結(jié)束循環(huán)的執(zhí)行,轉(zhuǎn)而去執(zhí)行for語句后的語句。

可以用圖5.4來表示for語句的執(zhí)行過程。

圖5.4for語句的執(zhí)行過程下面是用for循環(huán)語句求解例5.1中問題的程序:

main()

{inti,s;

s=0;

for(i=1;i<=100;i++)/*i的值小于等于100時繼續(xù)循環(huán)*/

{s=s+i; /*累加*/

}

printf("s=%d\n",s); /*輸出累加結(jié)果*/

}

例5.4

在0°~360°之間,每隔20°計算并輸出正弦與余弦值。

程序如下:

#include<stdio.h>

#include<math.h>

#definePI3.1415926

main()

{

intk;

doublef;

for(k=0;k<=360;k=k+20)

{f=PI*k/180;

printf("sin(f)=%lf,cos(f)=%lf\n",sin(f),cos(f));

}

}

下面對for循環(huán)語句作幾點說明:

(1)在for語句中,三個表達(dá)式中的任何一個表達(dá)式都可省略,但其中的兩個“;”不能省略。例如,下面的四種循環(huán)語句是等價形式:

for(i=1;i<=100;i++)循環(huán)體

i=1;

for(;i<=100;i++)循環(huán)體

在這種形式中,for語句將提供循環(huán)初值的表達(dá)式1放到for語句前,從而省略了表達(dá)式1。

i=1;

for(;i<=100;){循環(huán)體;i++;}

在這種形式中,for語句將提供循環(huán)初值的表達(dá)式1放到for語句前,從而省略了表達(dá)式1;并且將表達(dá)式3放到循環(huán)體中作為循環(huán)體的最后一個語句。

i=1;

while(i<=100){循環(huán)體;i++;}

在這種形式中,是將第③種形式的for語句換成while語句,這也是將for循環(huán)語句改成while語句的方法,即將表達(dá)式1放到循環(huán)前面,將表達(dá)式3放到循環(huán)體中作為最后一個語句,最后將for語句換成while。

(2)在for循環(huán)語句中,循環(huán)體中可以是單語句,也可以是空語句(只有一個

;的語句)或復(fù)合語句,如果是復(fù)合語句,則必須括在{}之中。

(3)下面兩種形式可能導(dǎo)致死循環(huán):

for(表達(dá)式1;;表達(dá)式3)循環(huán)體

for(;;)循環(huán)體上面兩個語句都沒有用于判斷循環(huán)結(jié)束的條件(即表達(dá)式2)。在C語言中,一個空表達(dá)式的值一般為非零值。因此,在for語句中如果省略了表達(dá)式2,就意味著表達(dá)式2的值一直為真,從而可能導(dǎo)致死循環(huán)。在這種情況下,要想避免死循環(huán),可以在循環(huán)體中增加if語句+轉(zhuǎn)移控制語句跳出循環(huán)(還可以使用if+goto形式退出循環(huán)),比如可以使用

if(表達(dá)式)break;

(4)

for循環(huán)也是當(dāng)型循環(huán)結(jié)構(gòu),只不過它對于事先可以確定循環(huán)次數(shù)的問題特別方便,如我們在解決例5.1中的問題時。

在C語言中,雖然for循環(huán)語句的形式很靈活,但從程序的可讀性考慮,建議使用如下兩種形式:

for(i=初值;i<=終值;i=i+步長)循環(huán)體

for(i=初值;i>=終值;i=i-步長)循環(huán)體

所謂循環(huán)嵌套,是指一個循環(huán)體中完整地包含了另一個循環(huán)結(jié)構(gòu),又稱多重循環(huán)。在C語言中,允許循環(huán)結(jié)構(gòu)多重嵌套,并且while、do-while和for循環(huán)語句都可以嵌套。另外,在一個循環(huán)體內(nèi)還可以包括各種完整的選擇結(jié)構(gòu),在一個選擇結(jié)構(gòu)的某個獨立部分中,還可以包括完整的循環(huán)結(jié)構(gòu)。5.4循環(huán)嵌套

例5.5

打印九九乘法表。

問題分析:九九乘法表中,都是由一個1位整數(shù)(用變量i來表示)乘以另一個1位整數(shù)(用變量j來表示)。i和j的取值范圍都是1~9,當(dāng)i

=

1時,j可以取1~9的值,得到:

1*1

=

11*2

=

2…

當(dāng)i=2時,j同樣可以取1~9的值,得到:

2*1

=

22*2

=

4…

當(dāng)i=9時,j可以取1~9的值,得到:

9*1

=

99*2

=

18…

因此,如果用i來作為外循環(huán)的變量,而用j作為內(nèi)循環(huán)的變量,可得程序如下:

main()

{inti,j;

for(i=1;i<=9;i++)

{for(j=1;j<=9;j++)

printf("%d*%d=%2d",i,j,i*j);

printf("\n");

}

}程序輸出結(jié)果如下:

1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7

2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 1*8=8

1*9=9

2*9=18

2*8=16

9*1=9 9*2=189*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

例5.6

順序輸出3~100之間的所有素數(shù)。

問題分析:素數(shù)就是只能被1和自身整除的數(shù),判斷一個正整數(shù)n(n>2)是否是素數(shù),可以有以下兩種方法:

(1)根據(jù)素數(shù)的定義來判斷一個正整數(shù)n是否是素數(shù),因為素數(shù)只能被1和自身整除,所以將n與2~n-1逐個判斷能否整除,并且用變量k進(jìn)行計數(shù)(能整除的數(shù)的個數(shù)),再判斷k是否為0,如果為0則n是素數(shù),否則n就不是素數(shù)。判斷n是否是素數(shù)程序段如下:

k=0; /*計數(shù)變量k清零*/

for(j=2;j<=n-1;j++)

if(n%j==0){k++;break;}/*如果n能被j整除,則k加1*/

if(k==0)printf("%d",n); /*如果n是素數(shù),就輸出n*/

由于要輸出的是3~100之間的所有素數(shù),則n的取值范圍應(yīng)是3~100,因此全部程序如下:

#include<stdio.h>

main()

{intj,k,n,m=0;

for(n=3;n<=100;n++)

{

k=0; /*計數(shù)變量k清零*/

for(j=2;j<=n-1;j++)

if(n%j==0){k++;break;} /*如果n能被j整 除,則k加1*/

if(k==0){m++;printf(“%5d”,n);} /*如果n是素數(shù),就 輸出n*/

if(m%10==0)printf(“\n”); /*每行輸出10個素 數(shù)*/

}

}

(2)上述方法是根據(jù)素數(shù)的定義來進(jìn)行判斷的,循環(huán)的次數(shù)比較多。因此,我們可以采用下面的方法:用2到之間的整數(shù)j去除n,如果所有的j均不能整除n,則n為素數(shù),否則n不是素數(shù),這種方法的流程圖可以參見第1章中的圖1.2。

由于n的取值范圍是3~100,因此外循環(huán)的循環(huán)變量使用n,如:

for(n=3;n<=100;n++)

{

判斷n是否是素數(shù)

}

在內(nèi)循環(huán)中判斷n是否是素數(shù)的程序如下:

k=0; /*計數(shù)變量k清零*/

for(j=2;j<=sqrt(n);j++)

if(n%j==0){k++;break;}

if(k==0){m++;printf(“%5d”,n);} /*如果n是素數(shù),就 輸出n*/

完整的程序如下:

#include<stdio.h>

#include<math.h>

main()

{intj,k,n,m=0;

for(n=3;n<=100;n++)

{

k=0; /*計數(shù)變量k清零*/

for(j=2;j<=sqrt(n);j++)

if(n%j==0){k++;break;} /*如果n能被j整 除,則k加1*/

if(k==0){m++;printf(“%5d”,n);} /*如果n是素數(shù),就 輸出n*/

if(m%10==0)printf(“\n”);

/*每行輸出10個素數(shù)*/

}

}

5.5.1break語句

在第4章介紹多分支選擇結(jié)構(gòu)switch時,曾經(jīng)提到過break語句,它的功能是退出switch語句。實際上,C語言中break語句具有以下兩個功能:

(1)跳出switch結(jié)構(gòu);

(2)退出當(dāng)前循環(huán)結(jié)構(gòu),包括while語句、do-while語句和for語句。5.5轉(zhuǎn)移控制語句

例5.7break在循環(huán)結(jié)構(gòu)中的控制作用示例。

main()

{intk;

for(k=1;k<=100;k++)

{printf("%d",k);

if(k==20)break;

}

}

在程序中如果沒有break語句,for循環(huán)將執(zhí)行100次。由于break語句的存在,使得當(dāng)k=20時,break就被執(zhí)行,循環(huán)被提前結(jié)束,從而程序運行結(jié)束,因此,程序只輸出1~20這20個整數(shù),而不是輸出100個整數(shù)。說明:

(1)

break通常要和if語句聯(lián)用,才能提前結(jié)束循環(huán)。在嵌套的循環(huán)中,break只能退出它所在的那一層循環(huán)。

(2)當(dāng)循環(huán)體中包含switch語句,而break位于switch語句中時,break只強迫程序流程退出該switch而不是退出switch所在的循環(huán)。例如:

for(i=1;i<=10;i++)

{switch(i)

{case1:printf("%d",1);break;

case2:printf("%d",2);break;

default:printf("大于2");break;

}

}

在switch語句中的break只是退出switch語句,而對于循環(huán)結(jié)構(gòu)并無影響。5.5.2continue語句

continue語句的功能是結(jié)束本次循環(huán)的執(zhí)行,轉(zhuǎn)而去執(zhí)行下一次循環(huán)(即去計算條件表達(dá)式),但不退出循環(huán)結(jié)構(gòu)。

continue語句在C語言中只能用在循環(huán)結(jié)構(gòu)中,包括while語句、do-while語句和for語句。

例5.8continue在循環(huán)結(jié)構(gòu)中的控制作用示例。

main()

{intk;

for(k=1;k<=100;k++)

{if(k%5==0)continue;

printf("%d",k);

}

}上面的程序如果沒有continue,則會輸出1~100共100個整數(shù),由于用到continue,使得程序流程每當(dāng)k能被5整除時就不輸出,因此,最后輸出的是1~100之間不能被5整除的整數(shù)。注意:在for循環(huán)語句中,當(dāng)執(zhí)行到continue語句時,不是直接去執(zhí)行“表達(dá)式2”,而是先執(zhí)行“表達(dá)式3”,再去執(zhí)行“表達(dá)式2”,即continue語句的執(zhí)行只是在本次循環(huán)中不再執(zhí)行循環(huán)體中continue以后的語句,但“表達(dá)式3”還是要執(zhí)行的。說明:

(1)

continue語句只能用在循環(huán)結(jié)構(gòu)中;

(2)

continue語句通常要和if語句聯(lián)用,它只能提前結(jié)束本次循環(huán),立即進(jìn)入下一次循環(huán)條件的判斷(如果是for語句,則先執(zhí)行“表達(dá)式3”),并不能終止整個循環(huán)。

(3)如果循環(huán)體中包含switch語句,而且continue位于switch結(jié)構(gòu)中,該continue也只對循環(huán)起作用,下面的程序可以說明這一點。

main()

{intk=0;

charc='A';

do

{switch(c++)

{case'A':k++;break;

case'B':k--;

case'C':k+=2;break;

case'D':k=k%2;

continue;

case'E':k=k*10;

break;

default:k=k/3;

}

k++;

}while(c<'G');

printf("%d\n",k);

}

上面程序中的break位于switch結(jié)構(gòu)中,因此它只對switch語句起作用,而對循環(huán)不產(chǎn)生影響。continue雖然也位于switch結(jié)構(gòu)中,但它只對do-while循環(huán)語句產(chǎn)生影響,而不影響switch語句。閱讀本程序時,需要注意以下兩點:

(1)每次計算switch中的表達(dá)式c++時,總是先取c的當(dāng)前值,然后再將c的值加1。例如,第一次執(zhí)行switch時,c的當(dāng)前值為“A”,c加1后的值為“B”。將當(dāng)前值(“A”)與各個case中的常量進(jìn)行匹配。

(2)一旦執(zhí)行到含有continue的case時,就會提前進(jìn)入下一輪循環(huán),即跳過switch語句中后面的語句,同時跳過循環(huán)中switch語句后的語句,而直接轉(zhuǎn)到條件判斷表達(dá)式(即計算while(c<'G'))。

表5.1給出了本例程序在運行過程中變量c和k值的變化情況。

表5.1變量c和k值的變化情況5.5.3goto語句

goto語句不是結(jié)構(gòu)化程序設(shè)計的語句,因此,多年來都建議編程者盡可能少用goto語句。另外在C語言中,因為有許多的控制結(jié)構(gòu),并且可以使用break和continue這樣的轉(zhuǎn)移控制語句,所以goto語句也可以不使用。

在多重循環(huán)中,如果需要從最內(nèi)層循環(huán)一次退出,則使用goto語句的效果非常明顯。

1.?goto語句的一般格式

goto語句的一般格式如下:

goto語句標(biāo)號;

語句標(biāo)號用標(biāo)識符表示,它的命名規(guī)則與變量名相同,即以字母或下劃線為首后跟字母、數(shù)字或下劃線。不能用整數(shù)來作標(biāo)號,但標(biāo)號可以與變量同名。例如:

gotolable_1;

是合法的。

goto語句的主要功能:控制程序流程轉(zhuǎn)移到指定標(biāo)號處執(zhí)行。由于標(biāo)號可以重置,因此使用goto語句可以選擇不唯一的跳轉(zhuǎn)目的地。

2.?goto語句的用途

一般來說,goto語句有以下兩種用途:

(1)與if語句一起構(gòu)成循環(huán)結(jié)構(gòu);

(2)從循環(huán)體中跳轉(zhuǎn)到循環(huán)體外。如果只是從一重循環(huán)中跳出,可以使用break語句,而如果從多重循環(huán)的內(nèi)層循環(huán)中跳出來,就需要用到goto語句。但這種用法不符合結(jié)構(gòu)化編程的原則,一般很少采用,只有在需要大大提高效率時才使用。如果用if語句和goto語句來解決例5.1的問題,則程序如下:

main()

{inti,s;

s=0;

i=1;

loop:if(i<=100) /*i的值小于等于100時執(zhí)行循環(huán),在語句前加一個標(biāo)號loop*/

{s=s+i; /*累加*/

i++;

gotoloop; /*使用goto語句轉(zhuǎn)移到標(biāo)號loop處*/

}

printf("s=%d\n",s);/*輸出累加結(jié)果*/

}

例5.9

從6~80中找出第一個素數(shù)。

問題分析:本例題要求只要找到6~80中的第一個素數(shù),后面的數(shù)就不用找了。

程序如下:

#include<stdio.h>

#include<math.h>

main()

{intj,k,n;

for(n=6;n<=80;n++)

{

k=0; /*計數(shù)變量k清零*/

for(j=2;j<=sqrt(n);j++)

if(n%j==0){k++;break;} /*如果n能被j整除,則k加 1*/

if(k==0)gotolable_1; /*如果n是素數(shù),就退出循 環(huán)*/

}

lable_1:if(k==0)printf(“第一個素數(shù)是:%d”,n);

/*輸出 找到的第一個素數(shù)*/

}

5.6.1數(shù)列問題(累加、累積、遞推)

例5.10

求s=1+2+…+n。

問題分析:本題是一個累加問題,其中數(shù)n需要輸入(必須大于等于1),而累加的結(jié)果需要放在變量s中。程序流程圖如圖5.5所示。5.6程序舉例圖5.5例5.10程序流程圖程序如下:

main()

{

inti,n,s;

s=0; /*給s賦初值,注意:存放和的變 量s的初始值應(yīng)為0*/

printf("Pleaseinputn:");

scanf("%d",&n); /*輸入變量n的值*/

for(i=1;i<=n;i++) /*計算累加和s*/

s+=i;

printf("\nSum=%d\n",s); /*輸出和*/

}

程序運行結(jié)果:

Pleaseinputn:100

Sum=5050

如果將本例改成求s=1*2*…*n,則只需將程序中的兩處進(jìn)行修改:

(1)將s=0改成s=1;

(2)將循環(huán)體中的語句s+=i;改成s*=i;。

例5.11

計算e的近似值。

要求使用泰勒級數(shù)展開式來求自然對數(shù)的底e的近似值,泰勒級數(shù)展開式如下:

(設(shè)n=10)

問題分析:這是一個既要求累乘、又要求累加的問題。用e來表示級數(shù)前n項的和,用n來表示第i項的分母,用i對項數(shù)進(jìn)行計數(shù),用e

=

e

+

1/n來累加各項。

程序如下:

main()

{

inti=1;

floate=1,n=1;

while(i<=10) /*i大于10時退出循環(huán)*/

{

n=n*i; /*計算第i項的分母*/

e=e+1/n; /*將第i項累加到e中去*/

i++;

}

printf("e=%f\n",e);

}

程序運行結(jié)果:

e=2.718282

例5.12

以下程序采用遞推法計算

的值,即求 的值,其中x為鍵盤輸入的一個任意的單精度實數(shù)。請將程序完善。

#include<stdio.h>

main()

{inti,sign=1;

floatx,s,t;

scanf("%f",&x);

s=[1]; /*給存放和的變量s賦初值*/

t=x;

for(i=1;i<=10;i++)

{sign=-sign;

t=t*[2] ; /*計算第i項*/

s+=t*sign; /*累加求和*/

}

printf("s=%6.2f",s);

}問題分析:從程序中可以看出,變量sign用來交替變換奇偶數(shù)項的正負(fù)號,變量s用來存放累加和,變量t用來存放第i項的值。所以第1個空應(yīng)該是給和s賦初值,由于for循環(huán)中的i是從1開始的(即從第二項開始累加),因此第1個空應(yīng)填x;[2]空這一行程序顯然是計算第i項的值,第i項的值應(yīng)該是前一項乘上符號變化變量sign和增項,則第2個空中應(yīng)填增項,所謂增項就是第i-1項與第i項不同的地方,應(yīng)該是x*x/i。

答案應(yīng)為:[1]

x;[2]

x*x/i。5.6.2窮舉法

窮舉法就是在一個集合內(nèi)對每個元素一一測試,直到找出滿足條件的一組值為止。窮舉法對人們來說常常是單調(diào)而又繁瑣的工作,但對計算機來說,重復(fù)計算正好可以用簡潔的程序發(fā)揮它運算速度快的優(yōu)勢。比如,在網(wǎng)絡(luò)中黑客經(jīng)常使用一個密碼樣本庫對需要密碼認(rèn)證部分進(jìn)行窮舉式測試,即黑客不斷地從密碼樣本庫中取出一個密碼去試能否過關(guān),如果不行,再取一個密碼去試,一直進(jìn)行下去,直到找到一個能過關(guān)的密碼或密碼樣本庫中的密碼都測試完為止。

下面通過例子讓大家了解窮舉法。

例5.13

搬磚問題:36塊磚,36人搬,男搬4塊磚、女搬3塊磚、兩個小孩合搬一塊磚,要求一次全搬完,問男、女、小孩各需多少?

問題分析:設(shè)男、女、小孩各為men、women、children,則可得到如下方程式:

4*men+3*women+children/2=36

men+women+children=36

這個方程組有三個變量,可只有兩個方程,因此可能有很多組解。按題意:men、women、children都應(yīng)為正整數(shù),且它們的取值范圍應(yīng)為:

men:0~8

women:0~11

children:0~36(children必須是偶數(shù))

要想得到多種men、women、children組合,只需在上述三個數(shù)的范圍之內(nèi)找到合適的men、women、children的值并滿足上述方程組即可。

求解本題的一個自然想法是,依次對men、women、children取值范圍內(nèi)的各數(shù)進(jìn)行一一試探,找到滿足前面兩方程的組合:首先從0開始,列舉men的各種可能值,在每個men值下找到滿足兩個方程的一組解,算法如下:

men=0;

while(men++<8)

{

s1:找滿足兩個方程的解的women、children;

s2:輸出一組解;

}

下面進(jìn)一步用窮舉法來實現(xiàn)s1:

women=0;

while(women++<11)

{

s1.1:找滿足方程的一個children;

s1.2:輸出一組解;

}

由于對所列舉的每個men和women都可以按下式

children=36-men-women

求出一個children。因此只要該children滿足另一個方程

4*men+3*women+children/2=36

便可以得到一組滿足題意的men、women、children解。為保證children必須是偶數(shù),則應(yīng)是children/2.0,而不應(yīng)是children/2,故s1.1與s1.2可以改寫為:

children=36-men-women;

if((4*men+3*women+children/2.0)==36)

{

printf("\nmenis%d",men);

printf("\nwomenis%d",women);

printf("\nchildrenis%d",children);

}經(jīng)過幾步求解之后,可寫出如下程序:

main()

{

intmen=0,women,children;

while(men++<8)

{

women=0;

while(women++<11)

{

children=36-women-men;

if((4*men+3*women+children/2.0)==36)

{

printf("\nmenis%d",men);

printf("\nwomenis%d",women);

printf("\nchildrenis%d",children);

}

}

}

}

程序運行結(jié)果如下:

menis3

womenis3

childrenis30

例5.14

填寫程序。打印所有符合下列條件的3位正整數(shù):是某一個數(shù)的平方數(shù),其中有兩位數(shù)字相同,如100、121等。

main()

{inta,b,c,n,k;

for(k=10;;k++)

{n=[1]; /*計算某數(shù)的平方數(shù)*/

if(n>999)[2]; /*如果不是3位正整數(shù)就退出*/

a=n/100; /*計算百位數(shù)*/

b=[3]; /*計算十位數(shù)*/

c=n%10; /*計算個位數(shù)*/

if(!((a-b)*(b-c)*(c-a))) /*判斷3位數(shù)a、b、c中是否有兩個 數(shù)相同*/

printf("\n%d,%d",n,k);

}

}

問題分析:本程序最終的目的是得到某數(shù)及某數(shù)的平方數(shù)(3位正整數(shù))。對于3位正整數(shù)來說,最小的是100,而最大的是999,從程序中可以看出變量k就是某數(shù),而n就是k的平方數(shù)。

圖5.6加密循環(huán)示意圖第一個空中很顯然應(yīng)該填k*k;第2個空是在n>999的條件下才執(zhí)行的,根據(jù)題意知:只有當(dāng)k的平方數(shù)不是3位數(shù)(大于999)時,應(yīng)該退出循環(huán),由此可得第2個空應(yīng)填break;從a=n/100可知變量a中存放的是3位正整數(shù)n的百位數(shù),由c=n%10可知,變量c中存放的是n的個位數(shù),由此第3個空中應(yīng)該計算得到十位數(shù),所以第3個空應(yīng)填n/10%10或(n-a*100)/10。所以答案應(yīng)為:[1]k*k;[2]break;[3]n/10%10或(n-a*100)/10。5.6.3密碼問題

在報文通信中,為了使報文保密,發(fā)報人經(jīng)常要按一定的規(guī)律將其加密,收報人按同樣的規(guī)律將其解密。

最簡單的加密方法是,將報文中的每一個英文字母轉(zhuǎn)換為其后的第h個字母。例如,當(dāng)h=4時,字母a轉(zhuǎn)換成e,B轉(zhuǎn)換成F等。這種轉(zhuǎn)換在C語言中比較方便,只要將該字母的ASCII碼加上4(變量h的值)即可。在轉(zhuǎn)換時,如果某小寫字母其后的第h個字母已經(jīng)超出小寫字母z,或某大寫字母其后的第h個字母已經(jīng)超出大寫字母Z,則將循環(huán)到字母表的開始。例如,小寫字母w轉(zhuǎn)換為a,大寫字母Z轉(zhuǎn)換為D等,如圖5.6所示。根據(jù)加密的過程可以知道解密的過程:將密文字母ASCII碼減去h的值,就可以恢復(fù)原文字母。

例5.15

從鍵盤輸入一行字符(明文),將其中的英文字母進(jìn)行加密輸出(非英文字母不用加密)。如“China!”轉(zhuǎn)換成“Glmre!”。

程序如下:

#include<stdio.h>

main()

{inth;

charc;

printf("Pleaseinputh:");

scanf("%d",&h);

scanf("%c",&c); /*消掉上一行輸入時的回車符*/

while((c=getchar())!=‘\n’) /*輸入的字符是回 車符就結(jié)束*/

{if((c>=‘a(chǎn)’&&c<=‘z’)||(c>=‘A’&&c<=‘Z’))/*如果是字母才 處理*/

{c=c+h;

if(c>‘Z’&&c<=‘Z’+h||c>‘z’)c=c-26; /*如果超過范圍, 則從頭開始*/

}

printf("%c",c);

}

}程序運行結(jié)果:

Pleaseinputh:4

China!

Glmre!

例5.16

從鍵盤輸入一行經(jīng)過加密的字符(密文),將其中的英文字母進(jìn)行解密輸出(非英文字母不用解密)。

程序如下:

#include<stdio.h>

main()

{inth;

charc;

printf("Pleaseinputh:");

scanf("%d",&h);

scanf(“%c”,&c); /*消掉上一行輸 入時輸入的回車符*/

while((c=getchar())!=‘\n’) /*輸入的字符是 回車符就結(jié)束*/

{if((c>=‘a(chǎn)’&&c<=‘z’)||(c>=‘A’&&c<=‘Z’)) /*如果是 字母才處理*/

{c=c-h;

if(c<‘a(chǎn)’&&c>=‘a(chǎn)’-h||c<‘A’)c=c+26; /*如果超過范 圍,則從頭開始*/

}

printf("%c",c);

}

}

程序運行結(jié)果:

Pleaseinputh:4

Glmre!

China!5.6.4方程求根問題

1.二分法求方程實根

二分法或稱對分法是求方程近似解的一種最簡單、最直觀的方法。

設(shè)函數(shù)f(x)在區(qū)間[a,b]上單調(diào)連續(xù),且f(a)f(b)<0(區(qū)間兩端點的函數(shù)值f(a)和f(b)異號),則方程f(x)=0在(a,b)內(nèi)有惟一的實根x*。這是微積分中的中值定理,也是使用二分法的前提條件。

1)算法思想

二分法是用對分區(qū)間的方法根據(jù)分點處函數(shù)f(x)值的符號,逐步將有根區(qū)間縮小,使在足夠小的區(qū)間內(nèi),方程有且僅有1個實根。

首先,為便于討論不妨設(shè)f(a)<0,f(b)>0,如圖5.7所示。

圖5.7二分法思想取區(qū)間[a,b]的中點x0= ,計算函數(shù)值f(x0),若正好f(x0)=0,則說明已經(jīng)找到方程的根x*= 。否則f(x0)與f(a)異號,或與f(b)異號。若f(x0)>0,則f(x0)與f(a)異號,記a1=a,b1= (即只取原來區(qū)間的左半部分);若f(x0)<0,則f(x0)與f(b)異號,記a1= ,b1=b(即只取原來區(qū)間的右半部分)。這樣區(qū)間[a1,b1]是方程新的有根區(qū)間,此區(qū)間被包含在舊的有根區(qū)間[a,b]內(nèi),且長度是原區(qū)間長度的一半,即b1-a1= 。再將區(qū)間[a1,b1]對分,得中點x1= ,計算函數(shù)值f(x1),重復(fù)上述過程,則可得到長度又縮小一半的有根區(qū)間[a2,b2],如此反復(fù)對分下去,可得到一系列的有根區(qū)間:[a,b],[a1,b1],[a2,b2],…,[ak,bk],…。其中,每個區(qū)間都在前一區(qū)間內(nèi),且長度是前一區(qū)間的一半,因此區(qū)間[ak,bk]的長度為

bk-ak=

=

=

每次對分后,如果取有根區(qū)間[ak,bk]的中點xk=作為f(x)=0的近似根,則在對分過程中將得到一系列的近似根:

x0,x1,x2,…,xk,……

2)二分法程序流程圖

二分法求方程實根算法的流程圖見圖5.8所示。

圖5.8二分法程序流程圖

3)程序?qū)嵗?/p>

例5.17

用二分法求非線性方程x2-6x-1=0在區(qū)間[2,8]上的實根。

程序如下:

#include<stdio.h>

#include<math.h>

#defineepsilon0.00001 /*定義要求的精度*/

floatf(floatx) /*求函數(shù)值*/

{return(x*x-6*x-1);

}

main()

{floata,b,x;

scanf(“%f%f”,&a,&b); /*輸入求根區(qū)間*/

if(f(a)*f(b)>=0) /*判斷是否符合二分法使 用的條件*/

{printf(“不滿足二分法使用條件,退出!”);exit(0);}

do

{x=(a+b)/2;

if(f(x)*f(b)<0) /*如果成立,則根在區(qū)間 的右半部分*/

a=x;

else /*否則根在左半部分*/

b=x;}

while(fabs(b-a)>=epsilon); /*判斷是否達(dá)到精度要求,如果沒達(dá)到,則繼續(xù)循環(huán)*/

x=(b+a)/2; /*取最后的小區(qū)間中點作為根的近似值*/

printf("x=%f\n",x); /*輸出函數(shù)的近似根*/

}

程序運行結(jié)果:

28

x=6.1662276

2.迭代法求方程實根

設(shè)非線性方程為f(x)=0,用迭代法求一個實根的基本方法如下:

首先將方程f(x)=0改寫成便于迭代的格式

x

=f(x)

然后初步估計方程實根的一個初值x0,按下面的公式進(jìn)行迭代:

(k=0,1,2,…)

直到滿足條件

或者迭代了足夠的次數(shù)還不滿足這個條件為止。其中e為事先給定的精度要求。

1)迭代式構(gòu)造的條件

迭代法在迭代過程中能否得到滿足條件的方程的實根,取決于根據(jù)原方程f(x)=0構(gòu)造的迭代式(k=0,1,2,…)在迭代過程中得到的一系列近似根(x1,x2,x3,…)是否趨近于(收斂)真實的根。只要迭代式中迭代函數(shù)滿足

≤L(0<L<1)

就可以使用迭代法得到一個實根。

2)迭代法程序流程圖

迭代法程序流程圖如圖5.9所示。

3)程序舉例

例5.18

用迭代方程xn+1=(lg(xn)+7)/2計算近似根。

程序如下:

#include<stdio.h>

#include<math.h>

#defineN100 /*最大迭代次數(shù),目的為防止迭代公式發(fā)散*/

圖5.9迭代法程序流程圖

#defineepsilon0.00001 /*要求的精度*/

floatfi(floatx) /*定義計算函數(shù)值的函 數(shù)*/

{

return((log10(x)+7)/2);

}

main()

{

floatx0,x1,d; /*變量c為要求的精度,變量d為計算得的 誤差*/

intk=1; /*迭代次數(shù)變量賦初值*/

printf(“Pleaseinputx0:”);

scanf(“%f”,&x0); /*輸入近似根的初值和要求的 精度*/

do

{x1=fi(x0); /*迭代*/

if(k++>N) /*如果達(dá)到最大迭代次數(shù),表 明迭代公式發(fā)散*/

{printf("Methodfailed!\n");

exit();

}

d=x1-x0;

x0=x1;

}

while(fabs(d)>=epsilon); /*如果未達(dá)到要求的精度,將繼續(xù) 循環(huán)*/

printf(“\nTherootoftheequationisx=%f\n”,x1);/*輸出近似 根*/

}

程序運行結(jié)果:

Pleaseinputx0:1.0

Therootoftheequationisx=3.789278

3.牛頓法求方程實根

牛頓迭代法是一種逐步線性化方法,即將非線性方程f(x)=0的求根問題歸結(jié)為計算一系列線性方程的根。

設(shè)xk是方程f(x)=0的一個近似根,將f(x)在xk處作一階泰勒展開,即

f(x)≈f(xk)

+

f'(xk)(x-xk)

于是得到如下的近似方程:

f(xk)

+

f'(xk)(x-xk)

=

0

設(shè)f'(xk)≠0,則上式的解為

取x作為原方程新的近似根xk+1,即令

k

=

0,1,2,…

則稱上式為牛頓迭代公式。用牛頓迭代公式求方程近似根的方法稱為牛頓迭代法,簡稱牛頓法。

1)牛頓法的幾何意義

方程y=f(xk)+f'(xk)(x-xk)是曲線在點Pk(xk,f(xk))處的切線方程。迭代公式中的xk+1就是切線與x軸交點的橫坐標(biāo),所以牛頓法就是用切線與x軸交點的橫坐標(biāo)近似代替曲線與x軸交點的橫坐標(biāo)。故牛頓法又稱切線法,其幾何意義見圖5.10。

圖5.10牛頓法幾何意義

2)牛頓法算法流程圖

牛頓法算法流程圖如圖5.11所示。

3)程序舉例

例5.19

用牛頓法求非線性方程x2-x-2

=

0在1.0附近的實根。

#include<stdio.h>

#include<math.h>

圖5.11牛頓法算法流程圖

#defineN100 /*最大迭代次數(shù),如果達(dá)到最大迭代次數(shù)仍找不到滿足精度要求的根,則說明精度要求太高或沒有根*/

#defineepsilon0.0001 /*控制精度*/

floatf(floatx) /*求f(x)的值*/

{return(x*x-x-2);}

floatf1(floatx) /*求f'(x)的值*/

{return(2*x-1);}

main()

{inti;

floatx0,x1;

printf("Pleaseinputinitx0:");

scanf("%f",&x0); /*輸入初始根x0*/

x1=x0;

for(i=0;i<N;i++)

{if(f1(x0)==0) /*如果f'(x0)的值為0,則無實根或 x0選擇不合適*/

{printf("f'(x)=0,nosolved!\n");

return;

}

printf("x(%d)=%f\n",i,x1); /*輸出每次迭代的近似根*/

x1=x0-f(x0)/f1(x0); /*牛頓法迭代公式*/

if(fabs(x1-x0)<epsilon||fabs(f(x1))<epsilon)/*如果滿足精度 要求*/

{printf("\nTherootoftheequationisx=%f\n",x1);/*輸出近 似根*/

return;

}

x0=x1;/*將最新一次得到的近似根作為下次迭代的 x0*/

}

printf("After%drepeate,nosolved!\n",N);/*超過迭代次數(shù)還 未找到實根*/

}程序運行結(jié)果:

Pleaseinputinitx0:1.0

x(0)=1.000000

x(1)=3.000000

x(2)=2.200000

x(3)=2.011765

x(4)=2.000046

Therootoftheequationisx=2.0000005.6.5*梯形法求定積分問題

設(shè)定積分為

由積分的知識可以知道,該積分值的幾何意義是在區(qū)間[a,b]內(nèi)的曲線f(x)下的面積(即由曲線AB、直線Aa、直線ab、直線Bb所圍成的區(qū)域的面積),如圖5.12所示。

如果用梯形區(qū)域ABba的面積近似代替曲邊AB與x軸之間的面積,即可得定積分的近似值。這種方法稱為求定積分的梯形法。

圖5.12定積分的幾何意義

1.梯形法求定積分公式

采用梯形面積近似作為積分值,因此

上式就是求定積分的梯形公式。但是這種方法求得的近似值誤差比較大,因此,通常情況下用于求定積分的梯形公式是復(fù)化梯形公式。

2.復(fù)化梯形求定積分公式

復(fù)化梯形求定積分的基本思想是:

首先將積分區(qū)間[a,b]進(jìn)行n等分,得到n個小區(qū)間[xi,xi+1](i=0,1,2,…,n-1),每個小區(qū)間的長度為h=(b-a)/n,如圖5.13所示,其中xi=a+i*h。

然后在每個小區(qū)間上用梯形公式求積分,即

圖5.13復(fù)化梯形求定積分的幾何意義最后將所有小區(qū)間的積分累加起來就可以得到整個積分區(qū)間的定積分了,即

復(fù)化梯形公式的算法流程圖如圖5.14所示。

圖5.14復(fù)化梯形公式流程圖

例5.20

用復(fù)化梯形法求定積分

即a=0,b=1,f(x)=e-x。

程序如下:

#include<stdio.h>

#include<math.h>

main()

{intn,k;

doublea=0.0,b=1.0,h,T,p,x;

printf("Pleaseinputn:");

scanf("%d",&n); /*輸入等分?jǐn)?shù)*/

h=(b-a)/n;

T=h*(exp(-a)+exp(-b))/2; /*用梯形公式計算積分近 似值*/

p=0.0;

for(k=1;k<n;k++) /*根據(jù)區(qū)間等分?jǐn)?shù),修正 積分值*/

{x=a+k*h;p=p+exp(-x);}

T=T+p*h; /*將積分近似值與修正值之和作為復(fù)化梯形公式求得的積分值*/

printf("T=%f\n",T);

}

在程序執(zhí)行時,提示如下:

Pleaseinputn:

此時要求從鍵盤輸入等分?jǐn)?shù)n,如果輸入100,則輸出結(jié)果為

T

=

0.632126

如果輸入10,則輸出結(jié)果為

T

=

0.632647

從運行結(jié)果可以看出,對于不同的等分?jǐn)?shù),輸出的結(jié)果(即積分的近似值)是不相同的。理論上說,等分?jǐn)?shù)越多,其精度越高。

一、選擇題

1.以下關(guān)于語句的說法中正確的是()。

A.

do-while語句的循環(huán)體至少會被執(zhí)行一次

B.

while語句的循環(huán)體至少會被執(zhí)行一次

C.

for語句的循環(huán)體至少會被執(zhí)行一次

D.在C語言中只能用do、do-while或for語句實現(xiàn)循環(huán)結(jié)構(gòu)習(xí)題5

2.

C語言用()表示邏輯“真”值。

A.

true B.

t或y C.

整數(shù)1 D.整數(shù)0

3.以下for循環(huán)是()。

for(x=0,y=0;(y!=123)&&(x<4);x++);

A.無限循環(huán)

B.循環(huán)次數(shù)不定

C.執(zhí)行4次

D.執(zhí)行3次

4.

C語言中()。

A.不能使用do-while語句構(gòu)成循環(huán)

B.

do-while語句構(gòu)成的循環(huán)必須用break語句才能退出

C.

do-while語句構(gòu)成的循環(huán),當(dāng)while語句中的表達(dá)式值為非零時結(jié)束循環(huán)

D.

do-while語句構(gòu)成的循環(huán),當(dāng)while語句中的表達(dá)式值為零時結(jié)束循環(huán)

5.

while語句和do-while語句的主要區(qū)別是()。

A.

do-while的循環(huán)體至少無條件執(zhí)行一次

B.

while的循環(huán)控制條件比do-while的循環(huán)控制條件嚴(yán)格

C.

do-while允許從外部轉(zhuǎn)到循環(huán)體內(nèi)

D.

do-while的循環(huán)體不能是復(fù)合語句

6.以下程序的輸出結(jié)果是()。

#include<stdio.h>

main()

{

inti;

for(i=1;i<=5;i++)

{if(i%2)printf("*");

elsecontinue;

printf("#");

}

printf("$\n");

}

A.

*#*#*#$

B.

#*#*#*$ C.

*#*#$ D.

#*#*$

7.執(zhí)行語句“for(s=0,i=1;i<=10;i=i+2)s+=i;”后,變量s、i的當(dāng)前值分別是()。

A.

25,11

B.

12,10

C.

25,10

D.

12,11

8.以下程序的輸出結(jié)果是(

)。

main()

{inta=0,i;

for(i=1;i<5;i++)

{switch(i)

{case0:

case3:a+=2;

case1:

case2:a+=5;

default:a+=5;

}

}

A.

13

B.

37 C.

10 D.

20

9.下面的程序段可循環(huán)的次數(shù)為()。

A.

2次 B.

1次

C.

0次 D.死循環(huán),無數(shù)次

inti=2;

while(i=0)printf("%d",i),i--;

printf("\n");

10.下面的程序運行后(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論