版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度食品行業(yè)員工工資支付合同范本3篇
- 2024智慧城市公共安全監(jiān)控系統(tǒng)合同
- 2025年度智能廚房設(shè)備承包服務(wù)合同范本3篇
- 二零二五年餐廳合伙人聯(lián)合推廣宣傳合同3篇
- 二零二五版單位職工食堂員工健康飲食指導(dǎo)承包協(xié)議3篇
- 2024高端裝備制造業(yè)國際合作框架合同
- 二零二五年新材料企業(yè)股份代持與研發(fā)合作合同3篇
- 2025年度采礦權(quán)抵押融資法律服務(wù)協(xié)議書3篇
- 2025年度綠色食品配送中心員工勞務(wù)合同范本3篇
- 2024年長期戰(zhàn)略聯(lián)盟協(xié)議
- 2025年度土地經(jīng)營權(quán)流轉(zhuǎn)合同補充條款范本
- 南通市2025屆高三第一次調(diào)研測試(一模)地理試卷(含答案 )
- Python試題庫(附參考答案)
- 聚酯合成副反應(yīng)介紹
- DB37-T 1342-2021平原水庫工程設(shè)計規(guī)范
- 電除顫教學(xué)課件
- 廣東省藥品電子交易平臺結(jié)算門戶系統(tǒng)會員操作手冊
- DB32T 3960-2020 抗水性自修復(fù)穩(wěn)定土基層施工技術(shù)規(guī)范
- 大斷面隧道設(shè)計技術(shù)基本原理
- 41某31層框架結(jié)構(gòu)住宅預(yù)算書工程概算表
- 成都市國土資源局關(guān)于加強國有建設(shè)用地土地用途變更和
評論
0/150
提交評論