實驗視頻-第4章語言控制結(jié)構(gòu)_第1頁
實驗視頻-第4章語言控制結(jié)構(gòu)_第2頁
實驗視頻-第4章語言控制結(jié)構(gòu)_第3頁
實驗視頻-第4章語言控制結(jié)構(gòu)_第4頁
實驗視頻-第4章語言控制結(jié)構(gòu)_第5頁
已閱讀5頁,還剩76頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章C語言程序的控制結(jié)構(gòu)if語句及switch語句的使用3種循環(huán)結(jié)構(gòu)break、continue和goto語句的作用常用算法:如遞推法、窮舉法等4.1算法4.1.1算法的概念4.1.2算法的表示方法4.1.1算法的概念著名的計算機(jī)科學(xué)家沃思(NikiklausWirth)曾經(jīng)提出過:

數(shù)據(jù)結(jié)構(gòu)+算法=程序數(shù)據(jù)結(jié)構(gòu)(datastructure):即對數(shù)據(jù)的描述和組織形式。算法(algorithm):對操作或行為的描述,即操作步驟。廣義地說,算法就是做某一件事的步驟或程序。計算機(jī)解題的算法大致包括這兩大類算法:

非數(shù)值運(yùn)算算法和數(shù)值運(yùn)算算法。算法特性

:①有窮性。算法的步驟必須是有限的,每個步驟都在有限的時間內(nèi)做完,執(zhí)行有限個步驟后終止。②確定性。算法中每一步驟都必須有明確定義,不允許有模棱兩可的解釋,不允許有多義性。③有效性。算法的每一步操作都應(yīng)該能有效執(zhí)行。如一個數(shù)被0除就是無效不可行的,應(yīng)避免。④沒有輸入或有多個輸入。例如:求1+2+3+…+100時,不需要輸入任何信息就能求出結(jié)果;而要求1+2+3+…+n時,必須從鍵盤輸入n的值,才能求出結(jié)果。⑤有一個或多個輸出。算法的目的是為了求解,“解”就是算法的輸出。沒有輸出的算法是沒有意義的。4.1.2算法的表示方法

常用方法有:自然語言、傳統(tǒng)流程圖、NS流程圖、偽代碼等

1.用自然語言表示算法自然語言就是人們?nèi)粘J褂玫恼Z言,可以是漢語、英語或其他語言。用自然語言表示算法,通俗易懂,但文字冗長,在表達(dá)上不夠嚴(yán)格,引起理解上的歧義性,不易轉(zhuǎn)化為程序,描述復(fù)雜的算法不很方便。因此,除了很簡單的問題外,一般不用自然語言描述算法。

用自然語言表示的求1+2+3+…+6的算法如下:算法1:S1:計算1+2得到3;S2:將第一步中的運(yùn)算結(jié)果3與3相加得到6;S3:將第二步中的運(yùn)算結(jié)果6與4相加得到10;S4:將第三步中的運(yùn)算結(jié)果10與5相加得到15;S5:將第四步中的運(yùn)算結(jié)果15與6相加得到21。算法2:S1:定義循環(huán)變量i=1,用于保存和的變量s,并置初值為0;S2:判斷i的值是否小于等于6,若是則執(zhí)行S3,否則跳轉(zhuǎn)到S4執(zhí)行;S3:將i的值累加到s,然后變量i自身加1,轉(zhuǎn)到S2執(zhí)行;S4:輸出s的值。算法1是最原始的方法,最為繁瑣,步驟較多,當(dāng)加數(shù)較大時,比如1+2+3+…,再用這種方法是行不通的;算法2是比較簡單的算法,且易于在計算機(jī)上執(zhí)行操作。

2.用傳統(tǒng)流程圖表示算法

流程圖是一個描述程序的控制流程和指令執(zhí)行情況的有向圖,用流程圖表示算法,直觀形象,易于理解。美國國家標(biāo)準(zhǔn)化協(xié)會(ANSI)規(guī)定了一些常用符號如圖所示用傳統(tǒng)流程圖描述計算1+2+3+…+6的算法

3.用NS結(jié)構(gòu)化流程圖表示算法1973年美國學(xué)者I.Nassi和B.Schneiderman提出了一種新型流程圖—NS結(jié)構(gòu)化流程圖,這種流程圖一方面取消了帶箭頭的流程線,這樣算法被迫只能從上到下順序執(zhí)行,避免了算法流程的任意轉(zhuǎn)向,適于結(jié)構(gòu)化程序設(shè)計;另一方面,這種流程圖節(jié)省篇幅,因而很受歡迎。用NS流程圖描述的計算1+2+3+…+6的算法

4.用偽代碼表示算法

偽代碼使用介于自然語言和計算機(jī)語言之間的文字和符號來描述算法。它使用起來靈活,無固定格式和規(guī)范,無圖形符號,只要寫出來自己或別人能看懂就行,由于它與計算機(jī)語言比較接近,便于向計算機(jī)語言算法(即程序)過渡。用偽代碼描述的1+2+3+…+6算法如下:begin/*算法開始*/1=>i0=>swhilei≤6{s+i=>si+1=>i}printsend/*算法結(jié)束*/在程序設(shè)計中讀者可根據(jù)需要和習(xí)慣任意選用。

4.2.4順序程序控制結(jié)構(gòu)

BAAB(a)傳統(tǒng)流程圖

(b)NS流程圖程序自上而下執(zhí)行,先執(zhí)行A塊,再執(zhí)行B塊。順序結(jié)構(gòu)的程序主要由4部分組成:①變量說明部分。②數(shù)據(jù)輸入部分。③運(yùn)算部分。④運(yùn)算結(jié)果輸出部分。例

:將任意小寫字母轉(zhuǎn)換為對應(yīng)的大寫字母并輸出。#include<stdio.h>main(){ charc;

c=getchar(); c=c-32; putchar(c);}程序運(yùn)行時,若輸入:h↙則輸出:H思考:如何判斷輸入的字符是否為小寫字母?(將在3.5中講解)例:從鍵盤任意輸入一個三位數(shù),要求輸出這個數(shù)的逆序數(shù)。如:輸入123,輸出321。分析:要輸出逆序數(shù),則要將原數(shù)的個位、十位和百位數(shù)分離出來,再用“個位*100+十位*10+百位”求出逆序數(shù)。個位數(shù)字可用對10求余得到,如123%10=3;最高位百位數(shù)字可用對100整除得到,如123/100=1;中間位的數(shù)字既可通過將其變換為最高位再整除的方法得到,如(123-1*100)/10=2;也可通過將其變換為最低位再求余得到,如(123/10)%10=2。程序源代碼如下:#include<stdio.h>main(){ intx,y,b0,b1,b2;/*變量聲明*/ printf("Pleaseenteranintegerx:");/*提示用戶輸入一個整數(shù)*/ scanf("%d",&x);/*輸入一個整數(shù)*/ b0=x%10;/*求最低位*/

b1=(x/10)%10;/*求中間位*/ b2=x/100;/*求最高位*/ y=b0*100+b1*10+b2;/*求逆序數(shù)*/ printf("y=%d\n",y);/*輸出逆序數(shù)*/}程序的運(yùn)行結(jié)果如下:Pleaseenteranintegerx:123↙y=321思考:是否還有其他方法分離個位、十位和百位數(shù)?4.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1if語句C語言的if語言有兩種形式:if(表達(dá)式)語句if(表達(dá)式)語句1else

語句2單分支if語句不含else子句雙分支if語句含else子句關(guān)鍵字關(guān)鍵字(b)圖表達(dá)式語句1語句2滿足不滿足(a)圖表達(dá)式語句滿足不滿足例如:if(a<b){t=a;a=b;b=t;}例如:if(a!=0)printf(“a!=0\n”);elseprintf(“a==0\n”);4.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1if語句例4.1輸入兩個數(shù),分別放入x和y中,若兩數(shù)不相等,則輸出其中的最大數(shù);若兩數(shù)相等,則輸出字符串x==y和x的值。程序分析:輸入兩個整數(shù)分別賦給變量x和y。比較兩個數(shù)不相等相等x大于y(x>y)x小于y(x<y)x等于y(x==y)輸出x輸出y輸出x==y和x開始輸入x、y結(jié)束x>yx<yx==y滿足不滿足滿足滿足不滿足不滿足#include<stdio.h>main(){intx,y;printf("Enterx&y:\n");scanf("%d%d",&x,&y);if(x>y)printf("x=%d\n",x);if(x<y)printf("y=%d\n",y);if(x==y)printf("x==y%d\n",x);}printf("x,y:%d%d\n",x,y);輸出x輸出y輸出x==y和x例:

寫出以下程序執(zhí)行后的輸出結(jié)果#include<stdio.h>main(){inta=4,b=3,c=5,t=0;if(a<b)t=a;a=b;b=t;if(a<c)t=a;a=c;c=t;printf("%d%d%d\n",a,b,c);}輸出結(jié)果為:5034.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1if語句例4.2輸入三個整數(shù),分別放在變量a、b、c中,然后把輸入數(shù)據(jù)重新按由小到大的順序放在變量a、b、c中,最后輸出a、b、c中的值。程序分析:輸入三個整數(shù)分別放在變量a、b、c中。把三個整數(shù)由小到大進(jìn)行排序。

a<b<c③

輸出a、b、c。開始輸入a、b、c結(jié)束輸出a、b、c排序#include<stdio.h>main(){inta,b,c;

printf("inputa,b,c:");scanf("%d%d%d",&a,&b,&c);printf(“a=%d,b=%d,c=%d\n”,a,b,c);/*輸出原始數(shù)據(jù)*/

排序過程;

printf("%d,%d,%d\n",a,b,c);}abc302010a>ba>cb>c交換兩個變量中的值交換兩個變量中的值交換兩個變量中的值302020102030if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}#include<stdio.h>main(){inta,b,c,t;printf("inputa,b,c:");scanf("%d%d%d",&a,&b,&c);printf("a=%d,b=%d,c=%d\n",a,b,c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%d,%d,%d\n",a,b,c);}inputa,b,c:302010<CR>a=30,b=20,c=1010,20,304.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1if語句例4.3輸入兩個數(shù),分別賦給x和y,輸出其中的大數(shù)。程序分析:1.輸入兩個數(shù)分別賦給變量x和y。2.輸出其中的最大數(shù):兩數(shù)進(jìn)行比較判斷。如果x>y,則輸出x;

否則,輸出y。開始輸入x、y結(jié)束x>y輸出x輸出y不滿足滿足#include<stdio.h>main(){intx,y;printf("Enterx&y:");scanf("%d%d",&x,&y);printf("x,y:%d%d\n",x,y);if(x>y) printf("max=x=%d\n",x);else printf("max=y=%d\n",y);printf("**end**\n");}Enterx&y:53<CR>x,y:53max=x=5**end**4.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1if語句例4.4輸入一個數(shù),判別它是否能被3整除。若能被3整除,打印YES;不能被3整除,打印NO。程序分析:1.輸入一個數(shù)賦給一個變量,比如n。2.判斷它是否能被3整除??梢?,則輸出YES;

否則,輸出NO。n%3==0(若能整除,則余數(shù)肯定為0)開始輸入n結(jié)束n%3==0輸出YES輸出yNO不滿足滿足#include<stdio.h>main(){intn;printf("inputn:");scanf("%d",&n);if(n%3==0)/*判斷n能否被3整除*/ printf("YES\n");else printf("NO\n");}inputn:9<CR>YESinputn:5<CR>NO問題描述:確定用戶輸入的數(shù)字是否可以被5整除,并輸出相應(yīng)的消息。#include<stdio.h>voidmain(){intnum;printf("\n請輸入一個數(shù):");scanf("%d",&num);

if(!(num%5)) printf("\n該數(shù)能被5整除

\n");else printf("\n該數(shù)不能被5整除

\n");}請輸入一個數(shù):90該數(shù)能被5整除示例(能否整除)問題描述:判定給定的年份是否為閏年。提示:閏年的判定規(guī)則為:能被4整除但不能被100整除的年份,或能被400整除的年份。

#include<stdio.h>voidmain(){intyear;printf("\n請輸入年份:");scanf("%d",&year);

if((year%4==0&&year%100!=0)||(year%400==0)) printf("\n%d年是閏年

\n",year);else printf("\n%d年不是閏年

\n",year);}示例(判斷閏年)請輸入年份:20052005年不是閏年問題描述:輸入一個5位數(shù),判斷它是不是回文數(shù)。例如:12321是回文數(shù),個位與萬位相同,十位與千位相同。

#include<stdio.h>voidmain(){ longge,shi,qian,wan,x; printf("\n請輸入一個五位整數(shù):"); scanf("%ld",&x);

wan=x/10000;//分解出萬位數(shù)

qian=x%10000/1000;//分解出千位數(shù)

shi=x%100/10;//分解出十位數(shù)

ge=x%10;//分解出個位數(shù)

if(ge==wan&&shi==qian)/*個位等于萬位并且十位等于千位*/ printf("\n這個數(shù)是回文數(shù)\n"); else printf("\n這個數(shù)不是回文數(shù)\n");}示例(回文數(shù))輸出:請輸入一個五位整數(shù):45654這個數(shù)是回文數(shù)4.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1if語句注意if后面圓括號中的表達(dá)式,可以是任意合法的C語言表達(dá)式(如:邏輯表達(dá)式、關(guān)系表達(dá)式、算術(shù)表達(dá)式、賦值表達(dá)式等),也可以是任意類型的數(shù)據(jù)(如:整型、實型、字符型、指針型等)。無論是否有else子句,if子句中如果只有一條語句,則此語句后的分號不能省略。如:if(x!=0)printf(“%f”,x);elseprintf(“%f”,y);此處的分號不能省略此處的分號也不能省略不能上菜有胡蘿卜嗎?有黃瓜嗎?制作胡蘿卜沙拉有多重條件判斷有可以上菜制作黃瓜沙拉制作沙拉沒有沒有開始做黃瓜沙拉做胡蘿卜沙拉有沒有不能上菜可以上菜是否有胡蘿卜有沒有是否有黃瓜?結(jié)束多重if要處理多重條件判斷的情況,需要使用多重條件結(jié)構(gòu)多重條件結(jié)構(gòu)嵌套ifswitch結(jié)構(gòu)多重條件結(jié)構(gòu)4.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1.2嵌套的if語句第一種嵌套形式:if(表達(dá)式1)if(表達(dá)式2)語句1else語句2else

語句3圖1表達(dá)式1語句3不滿足表達(dá)式2語句1語句2滿足滿足不滿足4.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)嵌套的if語句第二種嵌套形式:if(表達(dá)式1){if(表達(dá)式2)語句1}else

語句2圖2表達(dá)式1語句2不滿足滿足表達(dá)式2語句1滿足不滿足注意在if子句中的一對花括號不可缺少。if(表達(dá)式1)if(表達(dá)式2)語句1else

語句2

應(yīng)當(dāng)注意if與else的配對關(guān)系。else總是與它上面的最近的if配對。例設(shè)變量a、b、c、d和y都已正確定義并賦值。若有以下if語句

if(a<b)if(c==d)y=0;elsey=1;該語句所表示的含義是()。A)B)C)D)

4.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1嵌套的if語句第三種嵌套形式:if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2else語句3表達(dá)式1不滿足滿足語句1表達(dá)式2語句2語句3滿足不滿足圖3if(表達(dá)式2)語句2else語句3例從鍵盤輸入x的值,并通過如下的數(shù)學(xué)關(guān)系式求出相應(yīng)的y值。分析:該題的意圖是根據(jù)輸入的x值,判斷x所屬的區(qū)間,求出y值并輸出。程序?qū)崿F(xiàn)的步驟是:①從鍵盤輸入一個數(shù);②判斷x所屬的區(qū)間,求出y值;③輸出結(jié)果。#include<stdio.h>main(){intx,y;scanf("%d",&x);if(x<0)y=-1;elseif(x==0)y=0;

elsey=1;printf("y=%d\n",y);}注意:在表示相等條件時,必須用“==”,不能用“=”

4.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1嵌套的if語句第四種嵌套形式:if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2表達(dá)式1不滿足滿足語句1表達(dá)式2語句2滿足不滿足圖4if(表達(dá)式2)語句24.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1嵌套的if語句第五種嵌套形式:if(表達(dá)式1)

語句1elseif(表達(dá)式2)

語句2elseif(表達(dá)式3)

語句3elseif(表達(dá)式4)

語句4:else

語句nif(表達(dá)式2)語句2else語句3if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2elseif(表達(dá)式3)語句3elseif(表達(dá)式4)語句4:else語句n表達(dá)式1語句1表達(dá)式2表達(dá)式3表達(dá)式4語句2語句3語句4語句n真真真真假假假假4.3if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)4.3.1嵌套的if語句例4.5編寫程序,根據(jù)輸入的學(xué)生成績給出相應(yīng)的等級,大于或等于90分以上的等級為A,60分以下的等級為E,其余每10分為一個等級。程序的意思為:成績(g)大于等于90分以上(g>=90):A成績(g)大于等于80分以上(g>=80):B成績(g)大于等于70分以上(g>=70):C成績(g)大于等于60分以上(g>=60):D成績(g)不及格(g<60):Eg>=90g>=80g>=70g>=60真真真真假假假假輸出A輸出B輸出C輸出D輸出E#include<stdio.h>main(){intg;printf("Enterg:");scanf("%d",&g);printf("g=%d:",g);if(g>=90)printf("A\n");elseif(g>=80)printf("B\n");elseif(g>=70)printf("C\n");elseif(g>=60)printf("D\n");elseprintf("E\n");}Enterg:72<CR>g=72:CEnterg:55<CR>g=55:E

4.3.2switch語句

當(dāng)問題的分支較多(一般大于3個),用if-else-if結(jié)構(gòu)解決時由于分支過多,結(jié)構(gòu)冗長,程序邏輯關(guān)系不清晰,通常使用開關(guān)語句(switch語句)來簡化程序設(shè)計。開關(guān)語句就像多路開關(guān)一樣,使程序控制流程形成多個分支,根據(jù)一個表達(dá)式可能產(chǎn)生的不同結(jié)果值,選擇其中的一個或幾個分支語句去執(zhí)行。因此,它常用于各種分類統(tǒng)計、菜單等程序設(shè)計。switch語句switch語句的形式如下:switch(表達(dá)式){case常量表達(dá)式1:語句1case常量表達(dá)式2:語句2::case常量表達(dá)式n:語句ndefault:語句n+1}關(guān)鍵字注意在關(guān)鍵字case和常量表達(dá)式之間一定要有空格,例如:

case10(正確)case10(不正確)switch結(jié)構(gòu)流程圖執(zhí)行過程:①計算switch后圓括號內(nèi)表達(dá)式的值,然后用該值逐個與case后的常量表達(dá)式值進(jìn)行比較。當(dāng)找到相匹配的值時,就執(zhí)行該case后面的語句。若所有case中的常量表達(dá)式的值都沒有與表達(dá)式的值匹配的,就執(zhí)行default后面的語句。②執(zhí)行完一個case后面的語句后,如果遇到break語句,則跳出switch語句;如果沒有break語句,程序轉(zhuǎn)到下一個case處繼續(xù)執(zhí)行,并不再進(jìn)行判斷。說明:①switch、case、default、break均是關(guān)鍵字。上述格式中花括號括起來的部分稱為switch語句體。switch語句體中可以沒有break語句和default部分。②switch后的表達(dá)式可以是整型或字符型,不能為實型。每一個case后面的常量表達(dá)式的值必須互不相同,常量表達(dá)式中不能有變量。③default最多只有一個,位置任意。各個case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。④多個case可以共用一組執(zhí)行語句。switch結(jié)構(gòu)printf(“這是邁克爾,身高180cm,加利福尼亞第12大街”);printf(“這是丹尼爾,身高193cm,現(xiàn)居住地不明,1998年12月12日在佛羅里達(dá)被捕”);printf(“這是吉姆,身高175cm,墨西哥州海鷗路弗羅拉公寓,于2003年11月1日在新澤西因搶銀行被捕”);default:printf(“未發(fā)現(xiàn)匹配項。對不起!”);停止搜索停止搜索停止搜索停止搜索警察記錄嫌疑犯照片不是這是吉姆,身高175cm,墨西哥州海鷗路弗羅拉公寓,于2003年11月1日在新澤西因搶銀行被捕不是是switch-case語句是多路判斷語句switch語句計算條件表達(dá)式并對照多個常數(shù)值進(jìn)行檢查switch結(jié)構(gòu)switch(表達(dá)式){case常量1:

語句; break;case常量

2:

語句; break;

default:

語句;}計算表達(dá)式的值如果等于常量1如果等于常量2如果沒有找到匹配的值例若有定義:floatx=1.5;inta=1,b=3,c=2;則正確的switch語句是()。A)switch(x){case1.0:printf(“*\n”);case2.0:printf(“**\n”);}B)switch((int)x);{case1:printf(“*\n”);case2:printf(“**\n”);}C)switch(a+b){case1:printf(“*\n”);case2+1:printf(“**\n”);}D)switch(a+b){case1:printf(“*\n”);casec:printf(“**\n”);}switch語句例4.6用switch語句改寫例4.5。#include<stdio.h>main(){intg;printf(“Enteramark:”);scanf(“%d”,&g);printf(“g=%d:”,g);switch(g/10){case10:case9:printf(“A\n”);case8:printf(“B\n”);case7:printf(“C\n”);case6:printf(“D\n”);default:printf(“E\n”);}}#include<stdio.h>main(){intg;printf("Enterg:");scanf("%d",&g);printf("g=%d:",g);if(g>=90)printf("A\n");elseif(g>=80)printf("B\n");elseif(g>=70)printf("C\n");elseif(g>=60)printf("D\n");elseprintf("E\n");}Enteramark:85<CR>g=85:BCDEbreak;break;break;break;break;/*最后一個也可以不要*/Enteramark:100<CR>g=100:AEnteramark:45<CR>g=45:EEnteramark:85<CR>g=85:B

語句標(biāo)號和goto語句請看下面的程序例子:#include<stdio.h>main(){inti,sum=0;i=1;if(i<=100){sum=sum+i;i++;}printf(“%d\n”,sum);}loop:gotoloop;標(biāo)識符建議同學(xué)們限制使用goto語句進(jìn)行編程。但同學(xué)們一定要記住goto語句的一般形式和執(zhí)行流程。選擇結(jié)構(gòu)習(xí)題4.1下列運(yùn)算符中優(yōu)先級最高的的算符是A!B%C-=D&&4.2下列運(yùn)算符中優(yōu)先級最低的的算符是A||B!=C<=D+4.3為表示關(guān)系:x≥y≥z,應(yīng)使用C語言表達(dá)式是A(x>=y)&&(y>=z)B(x>=y)AND(y>=x)C(x>=y>=z)D(x>=y)&(y>=z)4.4設(shè)a,b和c都是int型變量,且a=3,b=4,c=5,則以下的表達(dá)式中值為0的表達(dá)式是Aa&&bBa<=bCa||b+c&&b-cD!((a<b)&&!c||1)4.5有以下程序:#include<stdio.h>main(){inta=2,b=-1,c=2;if(a<b)if(b<0)c=0;elsec+=1;printf("%d\n",c);}程序的輸出結(jié)果是A0B1C2D3AAADC選擇結(jié)構(gòu)習(xí)題4.6有以下程序#include<stdio.h>main(){intw=4,x=3,y=2,z=1;printf("%d\n",(w<x?w:z<y?z:x));}程序的輸出結(jié)果是A1B2C3D44.7有以下程序#include<stdio.h>main(){inta,b,s;scanf("%d%d",&a,&b);s=a;if(a<b)s=b;s*=s;printf("%d\n",s);}若執(zhí)行以上程序時從鍵盤上輸入3和4,則輸出結(jié)果是A14B16C18D20AB選擇結(jié)構(gòu)習(xí)題4.8有以下程序段y=-1;if(x!=0)if(x>0)y=1;elsey=0;其能正確表示的數(shù)學(xué)函數(shù)關(guān)系是Ay=-1(x<0)0(x=0)1(x>0)By=1(x<0)-1(x=0)0(x>0)Cy=0(x<0)-1(x=0)1(x>0)Dy=-1(x<0)1(x=0)0(x>0)4.9有以下程序:#include<stdio.h>main(){intk=-3;if(k<=0)printf("****\n")elesprintf("&&&&\n");}程序的輸出結(jié)果是A輸出####B輸出&&&&C輸出####&&&&D有語法錯不能通過編譯CD選擇結(jié)構(gòu)習(xí)題4.10若a和b均是正整型變量,正確的switch語句是Aswitch(pow(a,2)+pow(b,2)){case1:case3:y=a+b;break;case0:case5:y=a-b;}Bswitch(a*a+b*b);{case3:case1:y=a+b;break;case0:y=a-b;break;}Cswitcha{default:x=a+b;case10:y=a-b;break;case11:x=a*b;break;}Dswitch(a+b){case10:x=a+b;break;case11:y=a-b;break;}A選擇結(jié)構(gòu)習(xí)題二.填空題4.11C語言中用______表示邏輯值”真”,用______表示邏輯值”假”.4.12C語言中的關(guān)系運(yùn)算符”!=”的優(yōu)先級比”<=”________.4.13C語言中的邏輯運(yùn)算符”&&”比”||”的優(yōu)先級________.4.14C語言中的關(guān)系運(yùn)算符”==”比邏輯運(yùn)算符”&&”的優(yōu)先級________.4.15C語言中邏輯運(yùn)算符______的優(yōu)先級高于算術(shù)運(yùn)算符.4.16將下列數(shù)學(xué)式改寫成C語言的關(guān)系表達(dá)式或邏輯表達(dá)式A)_________B)________.A)a=b或a<cB)|x|>44.17請寫出以下程序的輸出結(jié)果__________.#include<stdio.h>main(){inta=100;if(a>100)printf("%d\n",a>100);elseprintf("%d\n",a<=100);}4.18請寫出與以下表達(dá)式等價的表達(dá)式:A)__________B)_______!(x>0)B)!0非00低高高!a==b||a<cx<-4||x>41x<=01選擇結(jié)構(gòu)習(xí)題4.19當(dāng)a=1,b=2,c=3時,以下if語句執(zhí)行后,a,b,c中的值分別為_____,_____,______.if(a>c)b=a;a=c;c=b;4.20若變量已正確定義,以下語句段的輸出結(jié)果是_________x=0;y=2;z=3;switch(x){case0:switch(y==2){case1:printf("*");break;case2:printf("%");break;}case1:switch(z){case1:printf("$");case2:printf("*");break;default:printf("#");}}322*#4.4循環(huán)結(jié)構(gòu)while語句和用while語句構(gòu)成的循環(huán)結(jié)構(gòu)do-while語句和用do-while語句構(gòu)成的循環(huán)結(jié)構(gòu)for語句和用for語句構(gòu)成的循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)的嵌套break和continue語句在循環(huán)體中的作用程序舉例4.4.1while語句和用while語句構(gòu)成的循環(huán)結(jié)構(gòu)while循環(huán)的一般形式while(表達(dá)式)循環(huán)體關(guān)鍵字當(dāng)型循環(huán)圖表達(dá)式循環(huán)體滿足不滿足例如:k=0;while(k<10){printf(“*”);k++;}**********4.4while語句和用while語句構(gòu)成的循環(huán)結(jié)構(gòu)4.4.1while循環(huán)的一般形式利用while循環(huán)編寫程序,求1+2+3+…+100的值。分析:1+2+3+4+5ss=0s=s+1s=s+2s=s+3s=s+4s=s+5ss=1+2+3+4+5ns=s+n0保存到1361015初值#include<stdio.h>main(){ints=0,n;n=1;

while(n<=5){s=s+n;n++;}printf(“%d\n”,s);}15while(n<=100)問:循環(huán)體共執(zhí)行了幾次?4.4.2do-while語句和用do-while語句構(gòu)成的循環(huán)結(jié)構(gòu)do-while語句構(gòu)成的循環(huán)結(jié)構(gòu)do-while循環(huán)結(jié)構(gòu)的一般形式:do

循環(huán)體

while(表達(dá)式);關(guān)鍵字直到循環(huán)不要忘了分號圖循環(huán)體表達(dá)式不滿足滿足例如:s=0;i=0;do{i++;s+=i;}while(i<10);4.4.2do-while語句和用do-while語句構(gòu)成的循環(huán)結(jié)構(gòu)例:

計算Fibonacci(斐波那契)數(shù)列,直到某項大于1000為止,并輸出該項的值。程序分析:f1f2f01①f=f1+f21②f1=f2③f2=f112直到f2大于1000為止#include<stdio.h>main(){intf1,f2,f;f1=0;f2=1;do{f=f1+f2;f1=f2;f2=f;}while(f2<=1000);printf("F=%d\n",f);}F=1597上機(jī)練習(xí):請用while循環(huán)編寫此程序。4.4.3for語句和用for語句構(gòu)成的循環(huán)結(jié)for語句構(gòu)成的循環(huán)結(jié)構(gòu)for循環(huán)的一般形式如下:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體關(guān)鍵字for循環(huán)的執(zhí)行過程:首先計算表達(dá)式1。然后計算機(jī)表達(dá)式2,進(jìn)行條件判斷。若條件為真,則執(zhí)行循環(huán)體;否則,退出循環(huán)。當(dāng)條件為真時,循環(huán)體執(zhí)行一次后,轉(zhuǎn)回執(zhí)行表達(dá)式3。然后執(zhí)行表達(dá)式2,繼續(xù)進(jìn)行條件判斷…………例如:for(k=0;k<10;k++)printf(“*”);**********

說明1.for語句中的表達(dá)式可以部分或全部省略,但兩個“;”不可省略。例如:for(;i<=10;i++)for(sum=0,i=1;i<=100;sum=sum+i,i++);2.for后一對圓括號中的表達(dá)式可以是任意有效的C語言表達(dá)式。例如:for(;;)printf(“*”);4.4.3for語句和用for語句構(gòu)成的循環(huán)結(jié)構(gòu)例:

用for語句編寫程序,求1+2+3+…+100。#include<stdio.h>main(){ints=0,n;n=1;while(n<=100){s=s+n;n++;}printf(“%d\n”,s);}while結(jié)構(gòu)#include<stdio.h>main(){ints,n;s=0;for(n=1;n<=100;n++)s+=n;printf("s=%d\n",s);}for結(jié)構(gòu)s=5050思考與上機(jī)練習(xí)1.編寫程序,求1*2*3*…*100

4.4.4循環(huán)結(jié)構(gòu)的嵌套

循環(huán)結(jié)構(gòu)中的循環(huán)體語句可以是任何合法的C語句,while、do…while、for語句是合法的C語句,當(dāng)然也能出現(xiàn)在循環(huán)體中,這種循環(huán)體中又包含了另一個完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)還可以嵌套循環(huán),這就是多層循環(huán)。while、do…while、for三種循環(huán)可以相互嵌套,層數(shù)不限。但最常用的是二重循環(huán)或三重循環(huán),如果嵌套的層數(shù)更多,會增加程序閱讀、理解的困難,給程序調(diào)試帶來麻煩。嵌套循環(huán)時,外循環(huán)必須完整地包含內(nèi)循環(huán),不能相互交叉。嵌套循環(huán)的執(zhí)行過程:首先執(zhí)行外循環(huán),然后執(zhí)行內(nèi)循環(huán),外循環(huán)每執(zhí)行一次,內(nèi)循環(huán)就完整地執(zhí)行一遍。若內(nèi)循環(huán)中還存在嵌套的循環(huán),則進(jìn)入下一層嵌套循環(huán)結(jié)構(gòu)中,順序執(zhí)行有關(guān)的循環(huán)結(jié)構(gòu)。若在某層循環(huán)結(jié)構(gòu)中嵌套了兩個或多個并列的循環(huán)結(jié)構(gòu),則從外循環(huán)進(jìn)入時,順次執(zhí)行這些并列的循環(huán)結(jié)構(gòu)。例如:輸出如下圖所示圖形,可以用單層循環(huán)實現(xiàn):#include<stdio.h>main()*****{*****inti;*****for(i=1;i<=5;i++)*****printf(“*****\n”);*****}

語句“printf(“*****\n”);”的功能等價于以下的循環(huán)結(jié)構(gòu):for(j=1;j<=5;j++)printf(“*”);printf(“\n”);進(jìn)行一個等價替換,就可以得到以下的嵌套循環(huán):#include<stdio.h>main(){inti,j;for(i=1;i<=5;i++)

{for(j=1;j<=5;j++)printf(“*”);printf(“\n”);}}99表例:整元換零錢問題。把1元兌換成1分、2分和5分的硬幣,共有多少種不同換法?(每種至少一個)分析:本題是一個窮舉法問題。窮舉是一種重復(fù)型算法。它的基本思想是,對問題的所有可能狀態(tài)一一測試,直到找到解或者將全部可能狀態(tài)都測試過為止。設(shè)5分硬幣的可能個數(shù)為i,則i的取值范圍應(yīng)為1~19;設(shè)2分硬幣的可能個數(shù)為j,則j的取值范圍應(yīng)為1~(100-i*5)/2-1;而1分的硬幣個數(shù)應(yīng)是100-5*i-2*j。設(shè)共有m種換法。為了方便閱讀和計數(shù),每10種換法中間空一行。#include<stdio.h>main(){ inti,j,m; m=0;

for(i=1;i<=19;i++) for(j=1;j<=(100-i*5)/2-1;j++)

{ printf("%d\t%d\t%d\n",i,j,100-5*i-2*j); m++; if(m%10==0)printf("\n");

} printf("\nm=%d\n",m);}4.5break和continue語句在循環(huán)體中的作用break語句在循環(huán)結(jié)構(gòu)中起跳出循環(huán)體,即終止本層循環(huán)。圖表達(dá)式語句1break語句2滿足不滿足例5.9計算s=1+2+3+…+i,直到累加到s大于5000為止,并給出s和i的值。#include<stdio.h>main(){inti,s;s=0;for(i=1;s<=5000;i++){s=s+i;}printf("s=%d,i=%d\n",s,i-1);}#include<stdio.h>main(){inti,s;s=0;for(i=1;;i++){s=s+i;

if(s>5000)break;

}printf("s=%d,i=%d\n",s,i);}s=5050,i=1004.5break和continue語句在循環(huán)體中的作用continue語句為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著轉(zhuǎn)向循環(huán)條件進(jìn)行判斷。圖表達(dá)式語句1continue語句2滿足不滿足例5.10在循環(huán)體中continue語句執(zhí)行示例。#include<stdio.h>main(){intk=0,s=0,i;for(i=1;i<=5;i++){s=s+i;if(s>5){printf("****i=%d,s=%d,k=%d\n",i,s,k);continue;}k=k+s;printf("i=%d,s=%d,k=%d\n",i,s,k);}}問題描述:用“*”輸出一個菱形圖案,圖案如下:

*************************嵌套循環(huán)示例1voidmain(){ inti,j,k;

for(i=1;i<=4;i++) {

for(j=1;j<=4-i;j++) printf("");

for(k=1;k<=2*i-1;k++)

printf("*"); printf("\n"); }

for(i=1;i<=3;i++){

for(j=1;j<=i;j++) printf("");

for(k=1;k<=7-2*i;k++) printf("*"); printf("\n");}}

輸出:*************************控制打印的行數(shù)控制每行打印的空格數(shù)控制每行打印的*號數(shù)控制打印的行數(shù)控制每行打印的空格數(shù)控制每行打印的*號數(shù)問題描述:打印輸出100至200之間的全部素數(shù)。分析:素數(shù)是指只能被1和它本身整除的數(shù)。算法比較簡單,先將這個數(shù)被2除,如果能整除,且該數(shù)又不等于2,則該數(shù)不是素數(shù)。如果該數(shù)不能被2整除,再看則是否能被3整除。如果被3整除,并且該數(shù)不等于3,則該數(shù)不是素數(shù),否則再判斷是否被4整除,依此類推,該數(shù)只要是能被小于本身的某個數(shù)整除時,就不是素數(shù)。

嵌套循環(huán)示例2voidmain(){inti,j,n;n=0;

for(i=100;i<=200;i++){j=2;

while(i%j!=0)

j++;if(i==j){ printf("%4d",i); n++; if(n%8==0) printf("\n");}}printf("\n");}

輸出:從100到200之間所有的素數(shù)為:

101103107109113127131137139149151157163167173179181191193197199控制每行輸出8個素數(shù)如果第一個能被整除的數(shù)等于該數(shù)本身,則說明該數(shù)為素數(shù)從2到i之間尋找第一個能被整除的數(shù)嵌套循環(huán)示例3voidmain(){inti,num;charanswer;do{ printf("請輸入一個數(shù):"); scanf("%d",&num); printf("\n");

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

{ printf("="); } printf("\n該數(shù)是

%d",num); printf("\n\n您是否還要輸入其他的數(shù)(y/n)?"); fflush(stdin); answer=getchar(); }while(answer!='n');}輸出:請輸入一個數(shù):58==========該數(shù)是58您是否還要輸入其他的數(shù)(y/n)?y請輸入一個數(shù):64==========該數(shù)是64您是否還要輸入其他的數(shù)(y/n)?nPressanykeytocontinue習(xí)題一.選擇題5.1有以下程序段:intk,j,s;for(k=2;k<6;k++,k++){s=1;for(j=k;j<6;j++)s+=j;}printf("%d\n",s);程序段的輸出結(jié)果是A9B1C11D105.2有以下程序段:inti,j,m=0;for(i=1;i<=15;i+=4)for(j=3;j<=19;j+=4)m++;printf("%d\n",m);程序段的輸出結(jié)果是A12B15C20D25DC習(xí)題5.3有以下程序段:intn=10;while(n>7){n--;printf("%d\n",n);}程序段的輸出結(jié)果是A10B9C10D998988787765.4有以下程序段:intx=3;do{printf("%3d",x-=2);}while(!(--x));程序段的輸出結(jié)果是A1B30C1

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論