第5章 程序的基本控制結(jié)構(gòu)_第1頁(yè)
第5章 程序的基本控制結(jié)構(gòu)_第2頁(yè)
第5章 程序的基本控制結(jié)構(gòu)_第3頁(yè)
第5章 程序的基本控制結(jié)構(gòu)_第4頁(yè)
第5章 程序的基本控制結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5

章程序的基本控制結(jié)構(gòu)順序結(jié)構(gòu)選擇結(jié)構(gòu)

循環(huán)結(jié)構(gòu)其他控制語(yǔ)句本章的基本內(nèi)容是:【任務(wù)5.1】整數(shù)的逆值【問(wèn)題】給定一個(gè)兩位數(shù),將這個(gè)兩位數(shù)的個(gè)位和十位顛倒得到其逆值(也稱(chēng)逆向值),例如85的逆值是58?!鞠敕ā吭O(shè)這個(gè)兩位數(shù)的個(gè)位數(shù)字是x,十位數(shù)字為y,則該數(shù)的逆值為x×10+y。首先需要分離出這個(gè)兩位數(shù)的個(gè)位和十位,分離的方法是整除和求余,例如,通過(guò)對(duì)85除10取整數(shù)部分得到十位數(shù)字8,通過(guò)對(duì)85除10取余數(shù)部分得到個(gè)位數(shù)字5。5.1

順序結(jié)構(gòu)順序結(jié)構(gòu):由若干條語(yǔ)句組成的語(yǔ)句塊,從執(zhí)行過(guò)程上看,按照位置的先后順序依次執(zhí)行每一條語(yǔ)句?!菊Z(yǔ)法】復(fù)合語(yǔ)句的一般形式如下:

復(fù)合語(yǔ)句實(shí)現(xiàn)順序結(jié)構(gòu){語(yǔ)句1

語(yǔ)句2

語(yǔ)句n}……沒(méi)有分號(hào)可以是任何語(yǔ)句【語(yǔ)義】依次執(zhí)行花括號(hào)中的每條語(yǔ)句。例5.1設(shè)計(jì)復(fù)合語(yǔ)句實(shí)現(xiàn)交換兩個(gè)變量的值。{temp=x;x=y;y=temp;}5.1

順序結(jié)構(gòu)復(fù)合語(yǔ)句實(shí)現(xiàn)順序結(jié)構(gòu)temp1020xy102020xy2010xytemp10temp10(a)第一步temp=x(b)第二步x=y(c)第三步y(tǒng)=temp1#include<stdio.h>2intFlower(intx);34intmain()5{6intx;7printf("請(qǐng)輸入一個(gè)整數(shù):");8scanf("%d",&x);9if(Flower(x))10printf("此數(shù)為水仙花數(shù)\n");11else12printf("此數(shù)非水仙花數(shù)\n");13return0;14}15解決任務(wù)5.1的程序

解決任務(wù)5.1的程序

1/*duty5-1.cpp*/2#include<stdio.h>34intmain()5{6intnum,x,y,numDevo;7printf("請(qǐng)輸入一個(gè)兩位數(shù):");8scanf("%d",&num);9x=num%10;10y=num/10;11numDevo=x*10+y;12printf("%2d的逆值為:%2d\n",num,numDevo);13return0;14}【任務(wù)5.2】水仙花數(shù)【問(wèn)題】所謂水仙花數(shù)是指一個(gè)三位數(shù),其各位數(shù)字的立方和等于該數(shù)本身。例如:153=13+53+33,則153是一個(gè)水仙花數(shù)。要求從鍵盤(pán)上輸入一個(gè)三位數(shù),判斷該數(shù)是否是一個(gè)水仙花數(shù)?!鞠敕ā渴紫葘⑦@個(gè)三位數(shù)的個(gè)位、十位和百位分離出來(lái),然后判斷各位數(shù)字的立方和是否等于該數(shù)。分離出各位數(shù)字的方法是整除和取余,通過(guò)對(duì)153除10取余分離出最低位:153%10=3;通過(guò)對(duì)153除10取整數(shù)部分獲得高兩位:153/10=15;通過(guò)對(duì)15除10取余分離出中間位:15%10=5;通過(guò)對(duì)15除10取整數(shù)部分獲得最高位:15/10=1。1.x1=x%10;y=x/10;2.x2=y%10;3.x3=y/10;4.如果(x==x1*x1*x1+x2*x2*x2+x3*x3*x3),則返回1;否則,返回0;【算法】輸入:一個(gè)三位數(shù)x輸出:如果x為水仙花數(shù),則返回邏輯真,否則返回邏輯假設(shè)變量x1、x2和x3分別存儲(chǔ)x的個(gè)位、十位和百位,算法如下:【任務(wù)5.2】水仙花數(shù)5.2選擇結(jié)構(gòu)單分支的選擇結(jié)構(gòu)一般由if語(yǔ)句實(shí)現(xiàn)。

【語(yǔ)法】if語(yǔ)句的一般形式如下:邏輯值控制的選擇結(jié)構(gòu)【語(yǔ)義】計(jì)算表達(dá)式的值;當(dāng)表達(dá)式的值為真時(shí)執(zhí)行語(yǔ)句;否則順序執(zhí)行if語(yǔ)句的下一條語(yǔ)句。if(表達(dá)式)語(yǔ)句判斷條件必須有括號(hào)表達(dá)式語(yǔ)句TF1.單分支的選擇結(jié)構(gòu)5.2邏輯控制的選擇結(jié)構(gòu)邏輯值控制的選擇結(jié)構(gòu)例5.2求兩個(gè)整數(shù)中的較大者。

解:設(shè)整數(shù)x和y的較大值為max,可以先假定x較大,即max=x,再判斷max是否小于y,如果max小于y,則較大值為y,即max=y。因此,max中保存的總是較大者,最后返回這個(gè)較大值。函數(shù)Max返回兩個(gè)整數(shù)x和y中的較大值,程序如下:1/*example6-2.cpp*/2#include<stdio.h>3intMax(intx,inty);45intmain()6{7inta,b;8printf("請(qǐng)輸入兩個(gè)整數(shù):");9scanf("%d%d",&a,&b);10printf("%d和%d的較大值是:%d\n",a,b,Max(a,b));11return0;12}135.2選擇結(jié)構(gòu)14intMax(intx,inty)15{16intmax;17max=x;18if(max<y)19max=y;20returnmax;21}5.2選擇結(jié)構(gòu)2.雙分支的選擇結(jié)構(gòu)雙分支選擇結(jié)構(gòu)一般由if-else語(yǔ)句實(shí)現(xiàn)。

【語(yǔ)法】if-else語(yǔ)句的一般形式如下:邏輯值控制的選擇結(jié)構(gòu)【語(yǔ)義】計(jì)算表達(dá)式的值;當(dāng)表達(dá)式的值為真時(shí)執(zhí)行語(yǔ)句1;否則執(zhí)行語(yǔ)句2。if(表達(dá)式)語(yǔ)句1else

語(yǔ)句2判斷條件表達(dá)式成立執(zhí)行表達(dá)式不成立執(zhí)行必須有括號(hào)5.2選擇結(jié)構(gòu)例5.3求兩個(gè)整數(shù)中的較大者。

解:設(shè)整數(shù)x和y的較大值為max,可以直接將x和y進(jìn)行比較,若x>=y,則較大值為x,即max=x,否則,較大值為y,即max=y。函數(shù)Max返回兩個(gè)整數(shù)x和y中的較大值,程序如下:14intMax(intx,inty)15{16intmax;17if(x>=y)18max=x;19else20max=y;21returnmax;22}邏輯值控制的選擇結(jié)構(gòu)5.2選擇結(jié)構(gòu)多分支的選擇結(jié)構(gòu)由switch語(yǔ)句實(shí)現(xiàn),switch語(yǔ)句也稱(chēng)為開(kāi)關(guān)語(yǔ)句或選擇語(yǔ)句。

【語(yǔ)法】switch語(yǔ)句的一般形式如下:算術(shù)值控制的選擇結(jié)構(gòu)

switch(表達(dá)式)

{

case常量表達(dá)式1:語(yǔ)句1[break;]

case常量表達(dá)式2:語(yǔ)句2[break;]

case常量表達(dá)式n:語(yǔ)句n[break;]

[default:語(yǔ)句n+1break;]

}算術(shù)表達(dá)式……相當(dāng)于語(yǔ)句標(biāo)號(hào)沒(méi)有分號(hào)5.2選擇結(jié)構(gòu)【語(yǔ)義】算術(shù)值控制的選擇結(jié)構(gòu)值=語(yǔ)句n值1語(yǔ)句1計(jì)算表達(dá)式的值值2語(yǔ)句2值n……breakbreakbreak……語(yǔ)句n+1defaultbreak5.2選擇結(jié)構(gòu)算術(shù)值控制的選擇結(jié)構(gòu)例5.6

將百分制成績(jī)轉(zhuǎn)換為對(duì)應(yīng)的等級(jí)制成績(jī),其中100分~90分的成績(jī)等級(jí)為A,89分~80分的成績(jī)等級(jí)為B,79分~70分的成績(jī)等級(jí)為C,69分~60分的成績(jī)等級(jí)為D,59分~0分的成績(jī)等級(jí)為E。

5.2選擇結(jié)構(gòu)1/*example6-4.cpp*/2#include<stdio.h>3charGrade(doublescore);45intmain()6{7doublescore;8printf("請(qǐng)輸入一個(gè)百分制成績(jī):");9scanf("%lf",&score);10printf("%4.1f對(duì)應(yīng)的等級(jí)制成績(jī)?yōu)椋?c\n",score,Grade(score));11return0;12}13例5.6

將百分制成績(jī)轉(zhuǎn)換為對(duì)應(yīng)的等級(jí)制成績(jī)。14charGrade(doublescore)15{16chargrade;17inttemp;18temp=(int)score/10;//執(zhí)行整除前進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換19switch(temp)20{21case10://case10和case9共用一個(gè)程序段22case9:grade='A';break;23case8:grade='B';break;24case7:grade='C';break;25case6:grade='D';break;26default:grade='E';break;27}28returngrade;29}5.2選擇結(jié)構(gòu)1#include<stdio.h>2intCommonFactor(intm,intn);34intmain()5{6inta,b,factor;7printf("計(jì)算兩個(gè)自然數(shù)的最大公約數(shù)\n");8printf("請(qǐng)輸入兩個(gè)正整數(shù),以空格分隔\n");9scanf("%d%d",&a,&b);10factor=CommonFactor(a,b);11if(factor==0)12printf("請(qǐng)輸入正整數(shù)!\n");13else14printf("%d和%d的最大公約數(shù)是:%d\n",a,b,factor);15return0;16}17解決任務(wù)5.2的程序

16intFlower(intx)17{18intx1,x2,x3,y;19x1=x%10;20y=x/10;21x2=y%10;22x3=y/10;23if(x==x1*x1*x1+x2*x2*x2+x3*x3*x3)24return1;25else26return0;27}解決任務(wù)5.2的程序

【任務(wù)5.3】雞兔同籠問(wèn)題【問(wèn)題】雞有2只腳,兔子有4只腳,假設(shè)籠子里共有M只頭N只腳,問(wèn)雞和兔子各有多少只?【想法】設(shè)雞有x只兔子有y只,則有如下方程組成立:+【算法】設(shè)變量chicken表示雞的個(gè)數(shù),rabbit表示兔子的個(gè)數(shù),算法如下:step1:chicken從0~M重復(fù)執(zhí)行下述操作:

step1.1:rabbit=M–chicken; step1.2:如果(2*chicken+4*rabbit等于N),則跳出循環(huán); step1.3:chicken++; step2:如果是提前跳出循環(huán),則輸出chicken和rabbit的值;

否則輸出“無(wú)解”;【任務(wù)5.3】雞兔同籠問(wèn)題5.3

循環(huán)結(jié)構(gòu)當(dāng)型循環(huán)結(jié)構(gòu)由while語(yǔ)句實(shí)現(xiàn),因此,也稱(chēng)while循環(huán)。

【語(yǔ)法】while語(yǔ)句的一般形式如下:當(dāng)型循環(huán)結(jié)構(gòu)【語(yǔ)義】

while(表達(dá)式)語(yǔ)句循環(huán)體循環(huán)條件必須有括號(hào)表達(dá)式語(yǔ)句TF例5.7計(jì)算n!。

5.3循環(huán)結(jié)構(gòu)當(dāng)型循環(huán)結(jié)構(gòu)14longintFac(intn)15{16inti=1;//初始化循環(huán)變量17longintresult=1;//result為階乘結(jié)果,n!可能會(huì)超出int的表示范圍18while(i<=n)19{20result=result*i;21i++;//循環(huán)變量增122}23returnresult;24}解:n!=n×n-1×……×2×1,設(shè)變量result保存計(jì)算結(jié)果,首先將變量result初始化為1,然后將result乘以1、乘以2、……,乘以n,顯然需要設(shè)置變量i表示重復(fù)執(zhí)行的乘法次數(shù)。5.3循環(huán)結(jié)構(gòu)直到型循環(huán)結(jié)構(gòu)由do-while語(yǔ)句實(shí)現(xiàn),也稱(chēng)do-while循環(huán)。

【語(yǔ)法】do-while語(yǔ)句的一般形式如下:直到型循環(huán)結(jié)構(gòu)【語(yǔ)義】

do語(yǔ)句

while(表達(dá)式);循環(huán)體循環(huán)條件,括號(hào)不能省略一定要有分號(hào)表達(dá)式語(yǔ)句TF例5.8

計(jì)算n!。

5.3循環(huán)結(jié)構(gòu)直到型循環(huán)結(jié)構(gòu)14longintFac(intn)15{16inti=1;//初始化循環(huán)變量17longintresult=1;//result為階乘結(jié)果,n!可能會(huì)超出int的表示范圍18do19{20result=result*i;21i++;//循環(huán)變量增122}while(i<=n);23returnresult;24}5.3循環(huán)結(jié)構(gòu)計(jì)數(shù)型循環(huán)結(jié)構(gòu)由for語(yǔ)句實(shí)現(xiàn),因此,也稱(chēng)for循環(huán)。

【語(yǔ)法】for語(yǔ)句的一般形式如下:計(jì)數(shù)型循環(huán)結(jié)構(gòu)【語(yǔ)義】

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

語(yǔ)句循環(huán)體循環(huán)條件循環(huán)的初值循環(huán)變量的修正由括號(hào)括起,由分號(hào)分隔表達(dá)式2語(yǔ)句TF計(jì)算表達(dá)式1計(jì)算表達(dá)式3例5.9

計(jì)算n!。14longintFac(intn)15{16inti;//i為循環(huán)變量17longintresult;//result為階乘結(jié)果,n!可能會(huì)超出int的表示范圍18for(i=1,result=1;i<=n;i++)//表達(dá)式1由逗號(hào)分隔19{20result=result*i;21}22returnresult;23}5.3循環(huán)結(jié)構(gòu)計(jì)數(shù)型循環(huán)結(jié)構(gòu)5.3循環(huán)結(jié)構(gòu)計(jì)數(shù)型循環(huán)結(jié)構(gòu)表達(dá)式1、表達(dá)式2和表達(dá)式3均可以省略,但是分號(hào)不能省略。i=0;for(;i<n;i++)//省略表達(dá)式1,可以在for循環(huán)外面為循環(huán)變量賦初值{……}for(i=0;;i++)//省略表達(dá)式2,可以在循環(huán)體測(cè)試循環(huán)條件{if(i<n)break;}for(i=0;i<n;)//省略表達(dá)式3,可以在循環(huán)體內(nèi)改變循環(huán)變量{i++;}5.3循環(huán)結(jié)構(gòu)同一個(gè)問(wèn)題,往往既可以用當(dāng)型循環(huán),也可以用直到型循環(huán)或計(jì)數(shù)型循環(huán),但在實(shí)際應(yīng)用中,應(yīng)根據(jù)具體情況選用不同的循環(huán)結(jié)構(gòu),選用的一般原則是:1.如果循環(huán)次數(shù)在執(zhí)行循環(huán)體之前就已確定,一般選用計(jì)數(shù)型循環(huán);如果循環(huán)次數(shù)由循環(huán)體的執(zhí)行情況確定,一般選用當(dāng)型循環(huán)或直到型循環(huán)。2.如果循環(huán)體至少執(zhí)行一次,可以選用當(dāng)型循環(huán)也可以選用直到型循環(huán),如果循環(huán)體有可能一次也不執(zhí)行,則選用當(dāng)型循環(huán)。

三種循環(huán)結(jié)構(gòu)之間的比較例5.10

計(jì)算整數(shù)中所含數(shù)字的位數(shù)。

5.3循環(huán)結(jié)構(gòu)由于整數(shù)至少含有一位數(shù)字(包括整數(shù)0),顯然用do-while循環(huán)更合適。14intDigit(intx)15{16intdigits=0;17do18{19x=x/10;20digits++;21}while(x!=0);22returndigits;23}用while循環(huán)改寫(xiě)Digit函數(shù)14intDigit(intx)15{16intdigits=0;17x=x/10;18while(x!=0)19{20digits++;21x=x/10;22}23returndigits;24}5.3循環(huán)結(jié)構(gòu)如果循環(huán)結(jié)構(gòu)中的語(yǔ)句又是一個(gè)循環(huán)語(yǔ)句,則構(gòu)成循環(huán)結(jié)構(gòu)的嵌套。循環(huán)結(jié)構(gòu)的嵌套內(nèi)層循環(huán)…

合法的嵌套循環(huán)形式內(nèi)層循環(huán)外層循環(huán)2#include<stdio.h>4intmain()5{6intM,N;7intchicken,rabbit;8printf("請(qǐng)輸入頭的個(gè)數(shù)和腳的個(gè)數(shù):");9scanf("%d%d",&M,&N);10for(chicken=0;chicken<=M;chicken++)

11{12rabbit=M–chicken;13if(2*chicken+4*rabbit==N)break;

14}15if(chicken<=M)16printf("雞有%d只,兔子有%d只\n",chicken,rabbit);17else18printf("輸入數(shù)據(jù)不合理,無(wú)解\n");19return0;20}解決任務(wù)5.3的程序

【問(wèn)題】對(duì)給定的整數(shù)x,判定是否是素?cái)?shù)。【想法】素?cái)?shù)除了1和其自身外沒(méi)有其他因子。將整數(shù)x除以2~sqrt(x),如果能整除,則x不是素?cái)?shù)。

【算法】1.i=2;2.循環(huán)直到i等于sqrt(x),執(zhí)行下述操作:2.1如果x%i==0,則說(shuō)明x不是素?cái)?shù),返回0,算法結(jié)束;2.2否則i++;3.返回1,x是素?cái)?shù);【任務(wù)5.4】素?cái)?shù)判定5.4其他控制語(yǔ)句break語(yǔ)句用于跳出switch語(yǔ)句和循環(huán)語(yǔ)句,

【語(yǔ)法】break語(yǔ)句一般與if語(yǔ)句配合使用,其一般形式如下:break語(yǔ)句【語(yǔ)義】如果條件表達(dá)式成立,則跳出switch語(yǔ)句(或循環(huán)語(yǔ)句),執(zhí)行switch語(yǔ)句(或循環(huán)語(yǔ)句)的下一條語(yǔ)句。switch語(yǔ)句{……if(條件表達(dá)式)break;……}或循環(huán)語(yǔ)句{……if(條件表達(dá)式)break;……}5.4其他控制語(yǔ)句例5.11

從鍵盤(pán)上輸入10個(gè)整數(shù),判斷是否含有負(fù)數(shù)。1/*example6-9.cpp*/2#include<stdio.h>3voidmain()4{5intflag=0;//flag為是否有負(fù)數(shù)的標(biāo)志,0表示沒(méi)有負(fù)數(shù),1表示有負(fù)數(shù)6inti,a;//i為循環(huán)變量,a暫存從鍵盤(pán)輸入的整數(shù)7for(i=1;i<=10;i++)8{9printf("請(qǐng)輸入一個(gè)整數(shù),可以是正數(shù)也可以是負(fù)數(shù)\n");10scanf("%d",&a);11if(a<0){12flag=1;break;//輸入負(fù)數(shù),跳出循環(huán)}if(flag==0)printf("沒(méi)有負(fù)數(shù)");else

printf("有負(fù)數(shù)");18}5.4其他控制語(yǔ)句continue語(yǔ)句只是結(jié)束本次循環(huán)的執(zhí)行,但沒(méi)有跳出循環(huán)。

【語(yǔ)法】continue語(yǔ)句一般與if語(yǔ)句配合使用,其一般形式如下:continue語(yǔ)句【語(yǔ)義】如果條件表達(dá)式成立,則結(jié)束本次循環(huán),重新開(kāi)始新一輪的循環(huán)。循環(huán)語(yǔ)句

{

……

if(條件表達(dá)式)continue;

……

}例5.12

從鍵盤(pán)上輸入10個(gè)整數(shù),輸出其中的負(fù)數(shù)并統(tǒng)計(jì)負(fù)數(shù)出現(xiàn)的次數(shù)。5.4其他控制語(yǔ)句1/*example6-10.cpp*/2#include<stdio.h>3voidmain()4{5intcount=0;//count為負(fù)數(shù)出現(xiàn)的次數(shù)6inti,a;//i為循環(huán)變量,a暫存從鍵盤(pán)輸入的整數(shù)7for(i=1;i<=10;i++)8{9printf("請(qǐng)輸入一個(gè)整數(shù),可以是正數(shù)也可以是負(fù)數(shù)");10scanf("%d",&a);11if(a>=0)continue;12else13count++;14}15printf("\n負(fù)數(shù)出現(xiàn)的次數(shù)是:%d",count);16}例5.13

已知一個(gè)三角形的三條邊長(zhǎng)分別為a、b、c,求這個(gè)三角形的面積。

5.4其他控制語(yǔ)句1/*

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論