c語言基礎(chǔ)教程-第四章-語-句_第1頁
c語言基礎(chǔ)教程-第四章-語-句_第2頁
c語言基礎(chǔ)教程-第四章-語-句_第3頁
c語言基礎(chǔ)教程-第四章-語-句_第4頁
c語言基礎(chǔ)教程-第四章-語-句_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章語句表達式語句表達式語句是指任何一種表達式末尾加上分號〔;〕所組成的語句。在C語言程序中,表達式語句出現(xiàn)得最多,因此,有人說C語言是表達式語言。表達式語句與表達式之間雖然只差一個分號〔;〕,但二者是截然不同的。在程序中,有的地方需要用表達式,那么不能寫成表達式語句。例如,在if語句或循環(huán)語句的條件中,要求用表達式作為條件,如果寫成表達式語句〔即末尾加了分號〕,那么是錯誤的。同樣,在要求用表達式語句的地方,寫成表達式〔即少寫一個分號〕,也是錯誤的。所以,讀者一定要搞清楚何時用表達式,何時用表達式語句,二者不要搞混了。例如,b=a+3是一個表達式;而

b=a十3;

便是一個表達式語句,這是一個賦值表達式語句。類似地,表達式語句還有:++i;〔算術(shù)表達式語句〕

m>n7m:n;〔條件表達式語句〕

b==5〔比擬表達式語句〕

x&&++y||Z;〔邏輯表達式語〕;

printf〔"0n!\n"〕〔函數(shù)調(diào)用也是表達式語句〕

i=a,j=5,k=7;〔逗號表達式語句〕等等。有些表達式語句雖然是合法的,例如,m>n?m;n;但是,它并沒有實際意義,需要將其表達式的值賦給某個變量才有意義。例如,x=m>n?m:n;這是一個有意義的表達式語句,它將一個表達式m>n?m;n的值賦給了變量x.雖然任何一個表達式加上分號都構(gòu)成表達式語句,但在程序中要出現(xiàn)的是有意義的表達式語句。空語句空語句是一種只有分號而沒有表達式的特殊語句。空語句是c語句中最簡單的語句,因為它只由一個分號〔;〕組成??照Z句是一種不執(zhí)行任何操作的語句。說它是特殊語句是指它是一種"不做事情"的語句??照Z句在編程中也是有用的,它主要被用在需要一條不做事情的語句的地方。例如,它可用來作循環(huán)體,那么該循環(huán)是空循環(huán)。下面是一個為了延遲一段時間的循環(huán),其循環(huán)體可用空語句。for<i=0:i<1000;i++〕空語句還可以用在goto.語句中語句標號的后面,即需要goto語句轉(zhuǎn)向一條什么事情都不做的語句,那么在該語句標號的后面可用空語句。復合語句復合語句是指由兩條或兩條以上語句用花括號〔{}〕括起來的語句序列。C語句中的語句簡單地劃分為單條語句和復合語句兩類。單條語句是指只有一條語句,而復合語句是指多條語句的總稱,但是,多條語句用花括號括起來才稱復合語句。沒有用花括號括起的假設(shè)干條單條語句只能稱為語句序列。所以,復合語句是一種特殊的語句序列,它被一對花括號括起來,它在程序中被看作是一條語句。一般地說,但凡可以出現(xiàn)一條語句的地方都可以出現(xiàn)復合語句。復合語句是C語言程序中常用的語句形式之一。在復合語句內(nèi)部還可以包含有復合語句,即復合語句可以嵌套。例如,上述便是復合語句嵌套的一種形式。復合語句常用作if語句的if體、else體和elseif體以及循環(huán)語句的循環(huán)體等。復合語句和函數(shù)體雖然都是用一對花括號〔{}〕來定界的,但是兩者間是有區(qū)別的。復合語句是由兩條或兩條以上語句序列組成的,而函數(shù)體內(nèi)可以是多條語句的語句序列,也可以只有單條語句,還可以沒有語句,即為空。另外,函數(shù)體內(nèi)可以包含假設(shè)干個復合語句,而復合語句內(nèi)不能包含函數(shù)體,只能包含復合語句。分程序分程序又稱程序塊。分程序是一種花括號內(nèi)含有說明語句的復合語句。分程序是一種復合語句,但是復合語句不一定是分程序,只有包含說明語句的復合語句才是分程序。因此,復合語句包含了分程序,分程序是復合語句的一種。具有以下格式的復合語句是分程序:〔說明語句序列〕

〔執(zhí)行語句序列〕

}在分程序中,說明語句序列一定要放在執(zhí)行語句序列的前邊。在分程序內(nèi)可以定義或說明變量,也可以對已定義過的變量進行重新定義。在分程序中定義的變量都是屬于局部變量,它的作用域僅在定義它的分程序內(nèi)。有關(guān)這方面的詳細情況在講述存儲類時再做詳細描述。條件語句條件語句是一種根據(jù)指定的條件來決定執(zhí)行不同的程序段的語句。條件語句又稱if語句。1.條件語句的格式和功能條件語句的格式如下:if〔條件i>〕

〔語句1〕

elseif〔〔條件2〕〕

〔語句2>

elseif〔〔條件3〕〕

〔語句3〕

elseif〔〔條件N〕〕

〔語句N〕

else

〔語句N+1>這是if語句的完整的格式,其中,if和。lse都是關(guān)鍵字?!矖l件1〕至<條件N〕都是任一表達式,用來指出條件的表達式多是關(guān)系表達式和邏輯表達式,也可用其他表達式。<語句1〕至〔語句N-}}〕都是單條語句或復合語句。在if語句中,至少要有一個if短語,最簡單的if語句格式如下:if〔條件〕〕

〔語句〕在if語句中,除了至少要有一個if短語之外,可以有一個〔只能有一個〕else短語,或者沒有else短語。elseif短語在if語句中可以沒有,也可以有一個或多個。一般在多路分支的間題中,需要用到多個elseif短語。具有一個else短語而無elseif短語的if語句格式如下:if〔條件1〕〕

〔語句1〕

else

〔語句2〕if語句的功能描述如下:先計算〔條件1〕中表達式的值,如果其值為非零,那么執(zhí)行〔語句1〕,然后執(zhí)行該if語句后邊語句,如果其值為非零,那么不執(zhí)行〔語句1>,接著計算《條件2〕中表達式的值。如果其值為非零,那么執(zhí)行〔語句2〕,然后執(zhí)行該if語句后邊語句;如果其值為零,那么不執(zhí)行<語句2〕,接,計算<條件3〕中表達式的值,再判斷,依次類推。如果N個條件對應(yīng)的表達式的值全都為零,那么執(zhí)行<語句N+1〕然后執(zhí)行該if語句后邊的語句。如果N個條件對應(yīng)的表達式中某個值不為零,那么執(zhí)行該條件后邊的語句,然后退出if語句,即執(zhí)行該if語句后邊的語句。if語句的功能可用以下圖所示:2.if語句的應(yīng)用if語句在具體應(yīng)用中要注意:一個if語句中只能有一個。Ise短語,也可以沒有。lse短語,而且在多重嵌套的if語句中,else短語總是與它前面最近的if相匹配的。下面通過]L個具體例子說明if語句的使用。[例4.1]輸入兩個整數(shù),按其值由大到小順序輸出這兩個數(shù)。Main〔〕

{

inta,b,t,

pcintf〔"Inputa,b;"〕,

scanf〔"%d%d"&a,&b〕,

if〔a<b〕

{

t=a

a=b,

b=t,

}

printf〔%d,"d\n,",a,b〕;

}執(zhí)行該程序后,屏幕顯示如下提示信息:Inputa,b,3u5輸入3和5后,按回車鍵3與5之間用空格符分隔,屏幕顯示如下結(jié)果:5.3說明:該程序中使用了最簡單的if語句的格式。僅有if短語和一個if體,該if體用一個復合語句,它由3條斌值表達式語句組成,其功能是實現(xiàn)變量a和b之間的內(nèi)容的交換。交換方法是通過第3個變量t,先將a的值斌給t,再將b的值賦給a,最后將t的值賦給b.其關(guān)系如下所示:通過上述方法使得變量a和b的值進行了交換。這是一種有用的算法,以后還會用到。如果要求將兩個整數(shù)按由小到大的順序輸出時,只需將程序中if〔a<b〕

改寫為

if<a>b〕其余不變。這時上例中輸出結(jié)果如下:3,5〔例4.幻假設(shè)有一個物品其價格規(guī)定如下:低于5公斤〔含5公斤〕,每公斤a元,大于5公斤缺乏10公斤,每公斤b元,IO公斤以上〔含10公斤〕,每公斤。元。編程計算該物品為m公斤的價格。main〔〕

{

floatx,p,a,b,c;

printf〔"Inputweightx:"〕;

scant〔"%f",&x〕

prints〔"Inputpricea,b,c:"〕,

scanf〔"%f%f%f%f",&a,&b,&c〕;

if〔x<=5〕

p=a*x;

elseif〔x>5&&x<10〕

P=b*x;

else

p=c*x;

printf〔"%.2f\n".p〕;

}程序中變量x是該物品的重量,P是該物品的價格。該程序中使用了一個if語句,該語句含有一個。lseif短語和一個else短語句。這是一個簡單的多路分支程序。如果分支再多時,可以再多用幾個elseif短語。[例4.3]較兩個整型數(shù)的大小。main〔〕

inta,b;

printf〔"Inputa,b:"〕;

scanf〔"%d%d",&a,&b〕;

if〔a1=b〕

if〔a>b〕

printf〔"a}b\n"〕;

else

printf〔"a<b\n"〕;

else

printf〔"a=b\n};

}執(zhí)行該程序輸入兩個lilt型數(shù):Inputa,b:-35

a<b說明:本例程序中,用了一個if-else語句,該語句的if體又是一個if-else語句,這是if語句嵌套。當從鍵盤輸入兩個int型數(shù)以后,程序中a和b獲取了值。如,a為一3,b為5,顯然,這時a!=b為非零,接著執(zhí)行if體,這又是一個if-else語句,先判斷a>b為。,那么執(zhí)行printf〔"a<b\n"〕;語句,屏幕上顯示a<b.退出內(nèi)重的if語句,再退出外重if語句,最后結(jié)束整個程序。此例中使用的if語句還有其他形式。例如,if〔a==b〕'

printf〔"a=b\n"〕,

else

if〔a>b〕

printf〔"a>b\n"〕.

else

printf〔"a,b\n}}還可以寫成如下形式,if〔a==b〕

printf〔"a=b\n"〕;

elseif〔a>b〕

printf〔"a>b\n"〕;

ease

printf〔"a<b\n"〕還可以寫成如卜形式:if〔a>=b〕

if〔a=b>

prinrf〔"a=b\n"〕;

e1Se

printf〔"a>b\n"〕;

else

printf〔"a<c,h\n"〕:還有很多其他的等價寫法,這里不再一一列舉。在if語句嵌套時,如果if體或elseif體或else體是一個if語句時,那么應(yīng)該被完全包含在體內(nèi)。一般形式如下:if〔〔條件1〕〕

if〔〔條件23〕

〔語句1〕

else

<語句2〕

else

if〔〔條件33〕

〔語句3〕

else

<語句4〕這是一個if-eis.語句,該語句中if體和else體又是一個if-els.語句,應(yīng)按上述形式書寫。在使用if語句時應(yīng)該特別注意的是if和else的配對關(guān)系。其原那么如下:一個if語句中最多只能有一個else短語〔可以沒有〕;以最內(nèi)層開始〔如有嵌套〕,else總是與它前面最近的未曾配對的if配對。[例4.4]分析以下程序輸出結(jié)果。main〔〕

{

inta.b;

a=b=2;

if{b==1〕

if〔b==i〕

printf〔"%d\n",a=b〕;

else

printf〔"%d\n",:a-=b〕;

printf"〔"%d\n",n+b〕;

}該程序從外表分析看好似是一個if-else語句,而if體是一個if語句,這樣分析輸出結(jié)果是4.因為首先a!一l為非零,又b==1為零,那么退出整個if語句,執(zhí)行printf〔"%d\n",a+b〕;輸出結(jié)果為4.而實際上,按照else的配對原那么,該例中else應(yīng)該與第二個if配對,if語句應(yīng)書寫如下:if〔a1=1〕

if〔b==1〕

printf〔"%d'\n",a+=b〕;

else

printf〔"%d\n",a一=b〕;

這實際上是一個簡單的if語句,該if語句的if體是一個if-else語句。按這種情況,分析輸出結(jié)果為:

由此可見,書寫的對齊格式往往會產(chǎn)生誤導,一定要注意書寫格式正確性,同時應(yīng)該牢記else的配對規(guī)那么,這樣可以防止"誤導".如果該程序中,確要else短語與第一個if配對,那么該段程序作如下修改:if〔al=1〕

{

if〔b==1〕

printf〔%d\n",a+=b〕;

}

eles

printf〔%d\n",a一=b〕;這里通過加上一對花括號來改變其配對關(guān)系。開關(guān)語句開關(guān)語句也是一種根據(jù)條件來判斷的多路分支選擇語句。開關(guān)語句又稱為switch語句。1.開關(guān)語句的格式和功能

開關(guān)語句的格式如下:switch〔〔整型表達式〕〕

{

case<整常型表達式1〕:〔程序段1〕

case〔整常型表達式2〕:<程序段2〕

case<整常型表達式3〕:<程序段3〕

case整常型表達式N〕:<程序段N1

default:<程序段N十1〕其中,switch,case和default是關(guān)鍵字?!舱捅磉_式〕要求其表達式的值為1}2t型數(shù),否那么轉(zhuǎn)換成lilt型數(shù)?!舱P捅磉_式1i至〔整常型表達式Ni要求表達式用int型常量組成,不得含有變量,一般用數(shù)字或字符組成?!渤绦蚨?>至〔程序段N十1》分別是由0條、1條或多條語句組成的語句序列。一般情況下,按其需要非空程序段的最后一條語句用break;,表示退出該開關(guān)語句,執(zhí)行其后面語句。如果該程序段中沒有break;語句,那么表示繼續(xù)執(zhí)行下面的程序段,直到遇到break;語句或所有程序段都執(zhí)行完再退出該開關(guān)語句。開關(guān)語句執(zhí)行過程如下:先計算switch關(guān)鍵字后面的<整型表達式〕的值,并轉(zhuǎn)換成int型數(shù)。然后用該值依次順序地與花括號內(nèi)的case關(guān)鍵字后面的整常型表達式的值進行比擬。先與<整常型表達式1〕的值進行比擬,如果相等,那么執(zhí)行〔程序段1〕,遇到break;語句退出該開關(guān)語句,否那么繼續(xù)執(zhí)行〔程序段2〕,直到遇到break語句退出該開關(guān)語句為止;如果不等,將〔整型表達式〕的值再與〔整常型表達式2>的值進行比擬,如果相等,那么執(zhí)行〔程序段}〕,其方法同于執(zhí)行〔程序段1;如果不等,再將<整型表達式〕的值與〔整常型表達式3〕的值進行比擬,依次類推??傊?,將switch語句開頭的整型表達式的值依次與花括號內(nèi)。ase后邊的整常型表達式的值進行比擬,哪個整常型表達式的值與其相等,便開始執(zhí)行該整常型表達式之后對應(yīng)的程序段,如果都不相等,那么執(zhí)行關(guān)鍵字default后面的程序段,如果沒有default,那么什么都不做,退出該switch語句。當一旦開始執(zhí)行某個程序段時,當遇到break語句后,那么立即退出該,witch語句,如果在整個程序段中沒有break語句,那么繼續(xù)執(zhí)行該程序段下面的程序段,同樣是遇到break語句退出該、witch語句,否那么再繼續(xù)執(zhí)行下面的程序段,直到執(zhí)行完最后一個程序段遇到右花括號為止,這時退出該switch語句,這便是break語句在開關(guān)語句中的作用。2.開關(guān)語句的應(yīng)用和說明開關(guān)語句是一個很好的多路分支選擇語句,常用它來實現(xiàn)較為復雜的多路分支程序。下面將誦付一些佃}子講休開羊語句的具體府用?!怖?.5]編寫一個程序,實現(xiàn)兩個浮點數(shù)的四那么運算。程序中,用d1和d2表示兩個浮點數(shù),用oP表示四那么運算的運算符:+,-,*,/程序內(nèi)容如下:main〔〕

{

floatdl,d2;

charop,

printf〔"Inputdl,op,d2,"〕;

scant〔"%f,%c,%r&d1,&op,&d2〕;

switchCop〕

{

case'+:printf〔"%.2f%c2%,2f=\n",dl,op,d2,d1十d2〕;

break;

case'-':printf〔"%2f%o,2f=%\,2f\n",dl,op,d2,d1一d2〕;

break;

case'*':printf〔"%2f%c,0}.2f----%.2f\n",dl,op,d2,d1*d2〕;

break;

case'/':printf%〔2f%o,2f=%\,2f\n",dl,op,d2,d1*d2〕,

break;

default:printf〔"opiserror!\n"〕;執(zhí)行該程序出現(xiàn)以下提示信息:Input,dl,ap,d2.3.5,4按要求鍵入數(shù)據(jù)后,執(zhí)行程序輸出結(jié)果為:3.50*4.00=14.00說明:該例中使用了switch語句,共有S個分支,除了十,一,x,/外。還有一個不可識別的表達式,每個分支對應(yīng)著一個程序段,除最后一個程序段外,其余4個程序段中都有break語句,這意味著執(zhí)行完某個程序段后都退出switch語句,最后一個程序段沒有break語句,實際上執(zhí)行完該程序段后遇上了右花括號,也有退出switch語句的作用,因此最后一個程序段可以省略break語句。[例4.6]編寫一個程序用來統(tǒng)計從健盤上輸入的字符流中,每種數(shù)字字符、空白字符和其他字符出現(xiàn)的個數(shù)。程序中將每種數(shù)字字符統(tǒng)計的個數(shù)存放在一個int型數(shù)組動igit中,該數(shù)組共IO個元素,用ndigit[0],ndigit[1],…二分別存放數(shù)字字符0,1…的個數(shù)。空白字符〔包含空格符、換行符和水平制表符〕個數(shù)存放在變量nwhite中,其他字符的個數(shù)存放在變量nothe,中。程序內(nèi)容如下:#irniude<stdio.h>

main〔〕

{

inti,c,ndigit[l0],nwhite,nother,

nwhite=mother=O

for〔i=O;i<10;i++〕

ndigit[i]=0;

while〔e=getchar〔〕I=EOF〕

switch〔c〕

{

case'0':

case'1':

case'2':

case'3':

case'4':

case'5':

case'6':

case'7':

case'8':

case'9':++nwhit;

break;

case'u,:

case'\t':

case'\n':}-+nwhitex

break;

default:十十nother}

}

printf〔"digiter="〕;

for〔i=O;i<10;i十十〕

printf〔"%d",ndigit[i]〕;

printf〔"\whitespace=%d,other=%d\n",nwhite,nother〕;執(zhí)行該程序從鍵盤_h輸入如下字符流;ab35795\tmn45379pq98765〔Ctrl〕其中,〔ctrl〕z了是用來結(jié)束輸人的字符流。屏幕顯示如下信息:digiter=0002141313

whitespace=2,other=5說明;該程序中用到了后面要講述的循環(huán)語句:for循環(huán)和while循環(huán),這里不詳細講解,可參照下面將要講述的關(guān)于循環(huán)語句的內(nèi)容。該程序中使用了一個switch語句作為while循環(huán)的循環(huán)體,該switch語句中共有14個分支,僅有3個非空程序段。這里,有些分支對應(yīng)著空程序段,例如,對于數(shù)字字符的10個分支只有一個非空程序段,這意味著但凡輸入數(shù)字字符都執(zhí)行case'9':后面對應(yīng)的程序段,這樣將為書寫帶來方便。同樣,但凡輸入空白符時都執(zhí)行case'\n':后面對應(yīng)的程序段。空程序段的使用是該例的特點。該例中,對數(shù)字字符和空白符的統(tǒng)計使用不同的case分支來實現(xiàn),而對其他字符的統(tǒng)計使用default最為適宜。該例中的switch語句也可以用if語句來替代,替代這里的switch語句的if語句格式如下:if〔c>一&&c<='9'〕

++ndigit[c-0];

elseif〔c=='〕

+十nwhite;

elseif〔c=='\t'〕

+nwhite;

elseif〔c=='\n'〕

+一nwhite;

else

+一nother;請讀者試一下,這樣替代后看其結(jié)果是否相同。switch語句中要求case短語后面是一個整常型表達式,一般只能用整數(shù)值或字符,而不允許使用關(guān)系表達式或邏輯表達式。因此,在有些情況下,需要將某種較復雜的關(guān)系轉(zhuǎn)換為簡單的數(shù)字,以便使用switch語句來編程,下面便是一個這方面的例子。[例4.7]有商場為了促銷對某商品實行打折銷售。具體方法如下:〔假設(shè)購置商品的個數(shù)為x)x<5沒折扣

5≤x<101.%折扣

10≤x<202%折扣

20≤x<304%折扣

30≤x6%折扣假定該商品單價為m元,編程計算某顧客購置x個該商品應(yīng)付多少錢。計算公式如下:p=m*x*〔1一d〕其中,p為應(yīng)付錢數(shù)〔元〕,d是所打的折扣數(shù)。程序內(nèi)容如下:main〔〕

inta,x;

floatp,m,d;

printf〔"Inputm,x;"〕;

scanf〔%f%d,&M,&x〕;

if〔x>30〕

a=6;

else

a=x/5;

switch〔a〕

{

caseO:d=0.0;

break;

case1;d}0.Ola

break

case2:

case3:d=0,02;

break;

case4:

case5:d=0.04;

break;

case6:d--O.O6;

p=m*x*〔1一d〕;

printf〔%.2f\n",p〕;執(zhí)行該程序,顯示如下提示信息:Inputm,x:25.5u28輸出結(jié)果如下:685.44說明:分析題意,可看出折扣的變化是有規(guī)律的。其"變化點"是5的倍數(shù),利用這一特點將購置的商品數(shù)目除以5,那么分出不同折扣的檔次,于是可以使用switch語句了。本例中所用的switch語句共7不分支,5個程序段,無default短語。在開關(guān)語句中,default短語可以有,也可以沒有。如果有default短語,它可以放在開關(guān)語句的花括號內(nèi)的任一位置,無論放在何處它的功能都是不變的。default后面的程序段只有在所有的整常型表達式的值都與前面的整型表達式的值不相等時才被執(zhí)行。這一功能與default的位置無關(guān)。[例4.8]分析以下程序的輸出結(jié)果。#include<stdio.h>

main〔〕

{

charc:

intx,y,z;

x=y=z=0

while〔〔c=-getchar〔〕〕='\n'〕

switch〔c〕

{

case'a':

case'b':

case'c':x++

break

case'A':

case'B':

case'C':y++

printf〔"x=%d,x=%d,z=%d\n",x,y,z〕;當輸入如下信息時,aBcDeF了輸出結(jié)果如下:x=2,y=l,z=3說明:該程序的,witch語句中有defauat短語,它沒有放在開關(guān)語句的最后,而是放在case短語的中間,即前后各有3個case短語。讀者可以驗證一下,該程序中switc}t語句的形式與下述兩種形式是等價的。形式一:switch〔c〕

{

csse'a':

case'h':

case'c':x++

break;

case'A'

case'B'

case'c':y++

break:

default;z+-;

}形式二:switch〔c〕

{

default:z++

break;

case'a'

case'b'

case'c':x++

break;

case'A':

case'B'

case'C':Y++

}可見這幾種不同形式的SW1tCh語句只是區(qū)別在default短語的位置上。另外,但凡最后的一個程序段都可以省去break語句。4.4.Iwhile循環(huán)語句1.while循環(huán)語句的格式和功能while循環(huán)語句的格式如下:

while〔〔條件〕〕

〔語句>其中,while是關(guān)鍵字,<條件〕是通過一種表達式給出的是否執(zhí)行循環(huán)體的判斷條件,當表達式的值為非零時,執(zhí)行循環(huán)體;否那么不執(zhí)行循環(huán)體,退出循環(huán),執(zhí)行該循環(huán)后面的語句。常用的作為條件的表達式是關(guān)系表達式或邏輯表達式,也可以用其他表達式或常量。當使用賦值表達式時,有些編譯出現(xiàn)警告錯。<語句〕是循環(huán)體,它可以是一條語句,也可以是復合語句。如果在while循環(huán)頭下面有花括號,那么循環(huán)體將是由花括號括起的復合語句。如果在while循環(huán)頭下面無花括號,那么循環(huán)體將是一條語句,其余語句是循環(huán)語句后面的語句。while循環(huán)語句執(zhí)行過程如下:先計算由條件給出的表達式的值,如果該表達式的值為非零,那么執(zhí)行循環(huán)體的語句;否那么退出循環(huán),不執(zhí)行循環(huán)體,而執(zhí)行該循環(huán)語句后面的語句。while語句的執(zhí)行過程可由以下圖表示:可見,該種循環(huán)可能由于條件不滿足一次循環(huán)體都不執(zhí)行。2.while循環(huán)語句的應(yīng)用和說明下面通過具體實例進一步說明二hile循環(huán)語句的應(yīng)用。例4.編程計算1-100自然數(shù)之和。main〔〕

{

tnti一1,sum一O

While〔i<=100〕

Sun+一i;

i++

printf〔"%d\n",sum〕;

}執(zhí)行該程序輸出結(jié)果如下:5050說明:該程序中,循環(huán)條件是一個關(guān)系表達式i<=100,當該表達式值為1時,執(zhí)行循環(huán)體,當表達式值為。時。退出循環(huán),執(zhí)行循環(huán)語句后面的printf〔〕語句。該循環(huán)的循環(huán)體是一個復合語句,因為它是由兩條語句組成的。該循環(huán)體可以進一步簡化為由一條語句組成,即可寫成如下形式:while〔I<=100〕

sum十=i++;請讀者驗證一下,這種形式是正確的。do-while循環(huán)語句1.do-vVhile循環(huán)語句的格式和功能dowhile循環(huán)語句的格式如下;

do〔語句〕

while〔<條件〕〕;其中,d.和while是關(guān)鍵字?!舱Z句>是循環(huán)體,它可以是一條語句,也可以是復合語句。<條件〕將由任一表達式給出,常用的是關(guān)系表達式或邏輯表達式,也可以是其他表達式和常量。如果是賦值表達式,有些編譯會發(fā)生警告錯。do-while語句的執(zhí)行過程如下:先執(zhí)行一次循環(huán)體的語句,再計算條件所指定的表達式的值,如果表達式值為非零,那么再執(zhí)行循環(huán)體,否那么退出循環(huán),執(zhí)行該循環(huán)語句后面的語句。該種循環(huán)不管條件如何,總是要執(zhí)行一次循環(huán)體的,這便是do-while循環(huán)語句的特點:該語句的執(zhí)行過程由以下圖所示:do-while循環(huán)語句可以用前面講過的while循環(huán)語句表示,具體格式如下:

<語句>

while〔〔條件〕〕

<語句>2.do-while語句的應(yīng)用和說明下面舉例說明do-while語句的應(yīng)用。[例4.10]們編程計算1--10.自然數(shù)之和。main〔〕

{

inti=l,sum=0;

do{

Sum+-=i++;

}wliile〔i<=100〕,

printf〔"%d\n",sum},

}執(zhí)行該程序輸出結(jié)果與例4.9程序的輸出結(jié)果相同。說明:使用}o-while語句時,為了提高可讀性,在書寫時總是習慣于將循環(huán)體用一對花括號括起來,whit.關(guān)鍵字寫在右花括號的后面,就是單條語句作循環(huán)體也加上花括號,本例就是如此。另外,需要注意的是在while關(guān)鍵字后面的〔〔條件〕〕后面要加一個分號,該分號不可省去。該例中do-while循環(huán)語句可寫成如下的while語句的格式:sum十=i++

while〔i<=100〕

Sum+-=i十十;請讀者注意不是所有的do-while語句都可寫成上述的while語句形式。wfaile循環(huán)語句與do-while循環(huán)語句是可以嵌套的,即在while循環(huán)體中可以出現(xiàn)do-white語句,反之,也可以。下面是一個循環(huán)語句嵌套的例子。[例4.11」分析以下程序的輸出結(jié)果。main〔〕

{

Inti=5;

While〔i>0〕

{

do〔

printf〔"%4d",i一一〕;

}while〔i>2〕;

i++

}

printf〔"\n"〕,

}執(zhí)行該程序輸出結(jié)果如下:43210說明:本例程序中,while循環(huán)語句的循環(huán)體中有一個do-while語句,這便是循環(huán)語句的嵌套。執(zhí)行該程序,作while循環(huán)時,i一一>.為1,那么執(zhí)行循環(huán)體,再執(zhí)行do-while語句時,先作循環(huán)體,輸出i-一的值為4,同時i變成3,判斷循環(huán)條件時,ii2為1,又執(zhí)行一次do-while循環(huán)體,輸出i_-一的值為3,同時i變成}4再判斷循環(huán)條件時,i}2值為}7退出do-while循環(huán),執(zhí)行i十+;語句,這時i的值為3,再判斷whsle的循環(huán)條件時,i一一>0值為1,這時i變成2,再作do-while循杯的循環(huán)體,輸出i一一的值為2,而i變成1,判斷do-while循環(huán)條件時,i32值為0,接著執(zhí)行1十十后,1變成2.再判斷While循環(huán)條件時,1一一>o值為1,這時i變成1,再作do-while循環(huán)的循環(huán)體,輸出i一一的值為1,而i變成。,判斷do-while循環(huán)條件時,i}2值為d,接著再執(zhí)行i十+后,i變成1.再判斷while循環(huán)條件時,i一一>0為1,i變成。,再作do-while循環(huán)的循環(huán)體,輸出i一一的值為。,而i變成一1,判斷do-while循環(huán)條件時,i>2值為0,接著執(zhí)行i十十后,i變成為再判斷while循環(huán)條件時,i一一>0的值為。,那么退出while循環(huán)語句,結(jié)束該程序。所以,屢次循環(huán)輸出結(jié)果為43210這里,while語句共循環(huán)4次,do-while循環(huán)語句除了第一次while循環(huán)時執(zhí)行2次循環(huán)體〔輸出4和3〕外,以后3次while循環(huán)時,它每次僅執(zhí)行一次循環(huán)體,分別輸出21和0for循環(huán)語句1.for循環(huán)語句的格式和功能for循環(huán)語句的格式如下:

for〔(表達式1〕;〔表達式2〕;<表達式3〕〕

〔語句〕其中,for是關(guān)鍵字。〔表達式f〕,<表達式2〕和〔表達式3〕是任意表達式,也可以是逗號表達式;<語句〕為循環(huán)體,它可以是一條語句,也可以是復合語句,還可以是空語句。for循環(huán)語句的執(zhí)行過程如下:先計算<表達式1〕的值,再計算<表達式2〕的值。接著進行判斷,如果〔表達式2〕的值為零,那么退出該循環(huán)語句,執(zhí)行該循環(huán)語句后面的語句。如果〔表達式2〕的值為非零,那么執(zhí)行循環(huán)體的語句,再計算〔表達式3>的值。然后再計算<表達式2i的值,再進行判斷是退出循環(huán)還是繼續(xù)執(zhí)行循環(huán)體,重復上述操作,直到退出循環(huán)語句為止ofo:循環(huán)語句執(zhí)行過程如以下圖所示;for循環(huán)語句也可以寫書成while循環(huán)語句的形式。下面便是由while循環(huán)語句寫成的for循環(huán)語句形式:dl;

whitel〔d2〕

〔語句〕

d3;

}因此,任一的for循環(huán)語句格式都可用while循環(huán)語句來替代。反之,也可以。2.for循環(huán)語句的應(yīng)用和說明for:循環(huán)語句具有以下特點:〔1〕循環(huán)次數(shù)的循環(huán)使用該語句比擬方便,對于事先難以確定循環(huán)次數(shù)的循環(huán)用此語句有時不方便?!?〕該種循環(huán)語句格式比擬靈活,丈表達式1},<表達式2》和<表達式3>可以移出for循環(huán)語句循環(huán)頭后面的圓括號,而放到其他適宜位置。表達式移出后,其分號仍然保存,不得省去。在一般情況下,〔表達式I〕給出循環(huán)變量的初始值,它只計算一次,有時可放在for循環(huán)語句之前。<表達式2〕給出判斷是否循環(huán)的條件,該表達式為非零時,執(zhí)行循環(huán)體,否那么退出循環(huán)體;〔表達式3>給出循環(huán)變量的改變量,即增量,每次執(zhí)行完循環(huán)體后,都要計算該表達式,改變循環(huán)變量的值。另外,這三個表達式都可以是逗號表達式。下面通過具體實例來說明for循環(huán)語句的特點。[例4.12]編程計算1^10自然數(shù)之和。下面給出5種不同格式的for循環(huán)語句,各程序執(zhí)行結(jié)果都是相同的。程序一:main〕

{

inti,sum二0;

for〔i=l:i<=10:i++〕

sum+=i;

printf〔"00din",sum〕,

}程序二:main〔〕

{

inti=l,sum=0.

fort;iC=10:i++〕

sum十=i;

printf〔"%d\n",sum〕;

〕程序三:main〔〕

inti=1sum=0

for〔;i<=10;〕

sum+=i++;

printf〔"%d\n",sum〕;

}程序四main〔〕

{

inti=1,sum=0;

for〔;;〕

{

sum+一i++;

if〔i>10〕

break,

}

printf〔"%d\n",sum〕;

}程序五main〔〕

{

inti,sum;

for〔i=l,sum=O;i<=10;sum+=i.i++〕

printf〔"%d\n",sum〕;

}說明;從該例中可以看出for循環(huán)的各種不同的格式,使用中可以靈活選擇。〔1〕far語句一般形式中的假設(shè)表達式1〕可以省略。此時<表達式1〕應(yīng)出現(xiàn)在循環(huán)語句之前,正如本例程序二所示。〔2〕for語句一般形式中的'表達式Z〕如果省略,即不判斷其循環(huán)條件,那么循環(huán)將無終止地進行下去。要結(jié)束循環(huán),需要在循環(huán)體內(nèi)設(shè)置退出循環(huán)的語句break,正如本例程序四所示。〔3〕for循環(huán)語句一般形式中的〔表達式3>可以省略,即將循環(huán)變量增量的操作放在循環(huán)體內(nèi)進行,本例中程序三便屬于此類情況。〔4〕〔表達式1>不僅可以設(shè)置循環(huán)變量的初值,同時還可以通過逗號表達式設(shè)置一些其他值。類似地,〔表達式2〕和〔表達式3〕都可以這樣,正如本例中程序五所示。for循環(huán)可以與其他循環(huán)嵌套,它自身也可以嵌套,下面舉例說明。[例4.13]編程求出以下式子中M和N的值。程序內(nèi)容如下:main〔〕

{

intm,n.k;

for〔m=1;m<10;m++〕

for〔n=l;n<10,n++〕

{

k=〔10*m+n〕,〔lo*n+m〕:

if〔k=6786〕

{

printf〔"M=%d,N=%d\n",m,n〕;

}

}執(zhí)行該程序輸出結(jié)果如下:M=7,N=8

MT8,N=7說明:該程序中使用了for循環(huán)語句的嵌套,即用for循環(huán)語句作為for循環(huán)的循環(huán)體。這稱為雙重for循環(huán)。前邊一個稱為外重循環(huán),后面一個稱為內(nèi)重循環(huán)。[例4.14]編程打印出以下圖案。程序內(nèi)容如下:main〔〕

{

inti,j;

for〔i=l;printf〔"\n"〕,i<=5;i++〕

for〔j=1;j<i+7;j++〕

if〔j<=7一i〕

printf〔""〕,

else

printf〔"*"〕;

for〔i=4;i>=1;i一一〕

{

for〔j=1;j<=i+6ilj++〕

if〔j<=7一i〕

printf〔""〕;

ease

printf〔""〕;

printf〔"\n"〕;說明:該程序中出現(xiàn)了兩次for的雙重循環(huán),第一次far的雙重循環(huán)打印出5行圖案的上局部,第二次for的雙重循環(huán)打印出4行圖案的下局部。另外,在最前面的一個for循環(huán)語句中,〔表達式2〕是一個逗號表達式,其中printf〔"\n"〕;語句用來實現(xiàn)每行換行的,在打印圖案下半局部時,printf〔"協(xié)灼;語句放在外重循環(huán)的循環(huán)體內(nèi)來實現(xiàn)每行換行的。[例4.15]編程求出50至lO0之間的全部素數(shù)。所謂素數(shù)是只能被1和本身整除的數(shù)。求解方法很多,這里僅選用一種算法簡單、效率較低的方法。程序內(nèi)容如下:main〔〕

{

inti,j,n=0;

for〔i=51;i<=l00;i++〕

j=2;

while<i%j!=0〕

j+-

if〔j==i〕

if〔n%6==0〕

printf〔"\n"〕;

n++

printf〔"%6d",i〕;

printf〔"\n"〕.執(zhí)行該程序輸出如下結(jié)果:535961fi771737983$997說明:該程序中for循環(huán)體內(nèi)出現(xiàn)了while循環(huán),這也是循環(huán)的嵌套。求素數(shù)的方法很多,下面再給出一種比該程序中所使用的方法效率要高些的求素數(shù)方法,將上述程序重寫如下:#include<math.h>

main〔〕

{

inti,j,k,n=0;

for〔i=51;i<=100;i+=2〕

{

k=sqrt〔〔double〕i〕;

for〔j=2;j<=k;j++〕

if〔i%j==0〕

break;

if〔j>=k+1〕

{

if〔n%6==0〕

printf〔"\n"〕;

n++,

pxintf〔"%6d",i〕;

}

}

ptintf〔"\n"〕;

}讀者可以與前面程序比擬一下,后一種方法程序中循環(huán)次數(shù)將會減少很多,于是將提高運算速度,但是這種求素數(shù)算法難懂一些,這里不去證明這一算法的正確性,讀者可以選用。C語言所提供的三種循環(huán)語句〔while循環(huán)、do-while循環(huán)和for循環(huán)〕,它們自身可以嵌套,它們相互之間也可以嵌套。嵌套時應(yīng)該注意的是要在一個循環(huán)體內(nèi)包含另一個完整的循環(huán)結(jié)構(gòu),這就是說,無論哪種嵌套關(guān)系都必須將一個完整的循環(huán)結(jié)構(gòu)全部放在某個循環(huán)體內(nèi)。下面舉幾個合法嵌套的格式:(1)do-while循環(huán)的自身嵌套afor循環(huán)和while循環(huán)也類似。

do{

.

do{

.

}while(...);

.

}while(...);

(2)for循環(huán)內(nèi)嵌套while循環(huán)。

for(;;)

{

.

while(...)

{

.

}

.

}

(3)while循環(huán)內(nèi)嵌套do-while循環(huán)。

while(...)

{

.

do{

.

}while(...);

}

}

(4)for循環(huán)內(nèi)嵌套while循環(huán)和do-while循環(huán)。

for(;;)

{

.

while(...)

{

.

}

do{

.

}while(...)

.

}

其他的各種循環(huán)嵌套將不一一列舉。goto語句gnto語句是無條件轉(zhuǎn)向語句,它的格式如下所示:gota〔語句標號>;其中,goto是關(guān)鍵字,〔語句標號〕是一種標識符,按標識符的規(guī)那么來寫出語句標號。語句標號是用來標識一條語句的,這種標識專門給gotp轉(zhuǎn)向語句使用的,即指明got.語句所要轉(zhuǎn)到的語句。語句標號出現(xiàn)在語句的前面,用冒號〔:〕與語句分隔。其格式如下所示:<語句標號>:<語句>一條語句叮以有一個或多個語句標號,多數(shù)語句不帶語句標號,只有g(shù)oto語句需要轉(zhuǎn)向到的語句才加語句標號。由于C語言中對goto語句采取限制使用的方法,限制goto語句轉(zhuǎn)向只能在本函數(shù)體內(nèi)。因此語句標號要求在一個函數(shù)體內(nèi)是唯一的,不同函數(shù)體可以相同,所以,語句標號的作用范圍也被限制在本函數(shù)體內(nèi)。在C語言程序中盡量要少用goto語句,最好不用goto語句,因為它會破壞結(jié)構(gòu)化,影響可讀性ogot.語句最常見的用法一是用來與if語句構(gòu)成循環(huán)結(jié)構(gòu),二是用來以多重循環(huán)最內(nèi)重一次退到最外邊。在使用goto語句時,要注意在轉(zhuǎn)向時越過循環(huán)語句的循環(huán)頭和分程序的說明語句局部時,可能會出現(xiàn)錯誤,請要小心慎重。下面面通過程序?qū)嵗f明got.語句的應(yīng)用。[例4.16]使用goto語句與if語句構(gòu)成循環(huán)計算1至100自然數(shù)之和。程序內(nèi)容如下:Main〔〕

inti=1sum=0;

loop:ii〔i<=100〕

aum+=i++;

gotoloop,

}

printf〔"%d\n",sum〕;

}

執(zhí)行該程序輸出結(jié)果如下:5050[例4.17]編寫一個程序,從的二維數(shù)組中查找第一次出現(xiàn)負的數(shù)組元素。main〔〕

inti,j,num[2][3].

printf〔"Input6digters;"〕

for〔i=O;i<2;I++〕

for〔j=O;j<3J++〕

ecanf〔%d",&cnum[i][j]〕,

for〔i=O,i<2,i++〕

for〔j=O,j<3,j++〕

if〔num[i][j]<O〕

gotofound,

printf〔"notfind11p"〕;

gotoend}

found.printf〔"num[%d][%d]=%d\n",i,j,num[i][j]〕

end:;

}說明:該程序中,兩次使用雙重for循環(huán),第一次是通過健盤翰入數(shù)據(jù)給二維數(shù)組num2][3]賦值,第二次便用雙重for循環(huán)是從數(shù)組中按順序一個一個查找其值為負的元素。如果找到后,那么將該數(shù)組元素的值愉出;如果找不到那么箱出信息"notfind!"該程序中,使用了二次goto語句,于是在兩個語句前出現(xiàn)了語句標號:found和end.其中,

溫馨提示

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

評論

0/150

提交評論