C語言課件第4章控制結(jié)構(gòu)程序設(shè)計(jì)_第1頁
C語言課件第4章控制結(jié)構(gòu)程序設(shè)計(jì)_第2頁
C語言課件第4章控制結(jié)構(gòu)程序設(shè)計(jì)_第3頁
C語言課件第4章控制結(jié)構(gòu)程序設(shè)計(jì)_第4頁
C語言課件第4章控制結(jié)構(gòu)程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩151頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章控制結(jié)構(gòu)程序設(shè)計(jì)

X

?現(xiàn)實(shí)問題總是復(fù)雜的,面對各種需要解決

的問題,人們必須首先對各類問題進(jìn)行分

析,確定解決問題的方法和步驟即算法,

再借助具體編程語言編制好一組讓計(jì)算機(jī)

執(zhí)行的指令(即程序),讓計(jì)算機(jī)按人們

指定的步驟有效地工作。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)2

?根據(jù)算法,依據(jù)某種編程語言的語法規(guī)則

編寫計(jì)算機(jī)執(zhí)行的命令序列,就是程序設(shè)

計(jì)。

?著名計(jì)算機(jī)科學(xué)家沃思(NikiklausWirth)

提出了一個(gè)公式:“數(shù)據(jù)結(jié)構(gòu)+算法=程

序”,即程序設(shè)計(jì)包括算法設(shè)計(jì)和數(shù)據(jù)存

儲。除此之外,還有結(jié)構(gòu)化程序設(shè)計(jì)方法

和計(jì)算機(jī)語言。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)3

問題的提出

?閏年問題:一年12個(gè)月,共365天,這是我

們說得最多的。但事實(shí)上,每年不完全是

365天。在中國農(nóng)歷中有閏月的說法,而公

歷也有閏年的說法。一般情況下,2月是2

天,而閏年時(shí)是29天,何年的2月是29天呢,

這就是閏年問題。編程判斷一個(gè)年份是否

為閏年。

?求根問題:編程求解一元二次方程的根。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)4

y

本章內(nèi)容

?算法的基礎(chǔ)知識

?大小寫字母轉(zhuǎn)換問題

-順序結(jié)構(gòu)程序的概念

-字符數(shù)據(jù)的輸入輸出

?閏年問題

-選擇結(jié)構(gòu)程序的概念

-if語句

-switch語句

?統(tǒng)計(jì)多名學(xué)生成績問題

-循環(huán)結(jié)構(gòu)程序的概念

-自增自減運(yùn)算符與逗號表達(dá)式

-while循環(huán)

-do—while循環(huán)

-for循環(huán)

-嵌套循環(huán)

4.1算法的基礎(chǔ)知識

-算法是靈魂,是問題求解過程中的精確描

述;數(shù)據(jù)結(jié)構(gòu)是加工對象;語言是工具;

編程需要采用合適的方法。

法:是對特定問題求解步驟的一種描述。

:是用具體的計(jì)算機(jī)語言來描述算法

碼,可以輸入計(jì)算機(jī)并產(chǎn)生結(jié)果。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)6

y

常用算法

?遞推化算法(牛頓迭代法、二分法、梯形法、窮舉法等);

?排序算法(選擇法、冒泡法);

?查找算法(順序查找、折半查找);

?有序數(shù)列的插入、刪除操作;

?存儲區(qū)的動(dòng)態(tài)分配與釋放,單向線性鏈表的建立、查找、

插入、刪除操作;

?初等數(shù)論問題求解的有關(guān)算法(最大公約數(shù)、最小公倍數(shù)、

素?cái)?shù)等);

八歸算法(求最大公約數(shù)、階乘等);

?字符串的處理(字符和字符串的插入、刪除、字符串的連

接、比較等)。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)7

y

算法的五個(gè)特性

?有窮性:對任何合法的輸入值,算法中每個(gè)步驟由計(jì)算

機(jī)執(zhí)行的次數(shù)及時(shí)間都是有限的。

?確定性:算法中每個(gè)步驟含義明確,無二義性。在任何

條件下,相同的輸入,必有相同的輸出。

?可行性:算法中描述的操作都可通過有限次的基本運(yùn)算

來實(shí)現(xiàn)。

?輸入:一個(gè)算法應(yīng)具有零個(gè)或多個(gè)輸入。

(無輸入情況:如求:1*2*3*4*5)。

?輸出:一個(gè)算法應(yīng)具有一個(gè)或多個(gè)輸入。

——

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)8

算法的設(shè)計(jì)目標(biāo)

?正確性:設(shè)計(jì)的算法應(yīng)當(dāng)滿足具有輸入、輸出和加工處理等明確的無歧

性的描述的具體問題的需求。驗(yàn)證正確性通常有4個(gè)層次:

①程序不含語法錯(cuò)誤;

②程序?qū)τ趲捉M輸入數(shù)據(jù)能夠得出滿足規(guī)格說明要求的結(jié)果;

③程序?qū)τ诰倪x擇的典型、苛刻而帶有刁難性的幾組輸入數(shù)

據(jù)

能夠得出滿足規(guī)格說明要求的結(jié)果;

④程序?qū)τ谝磺泻戏ǖ妮斎霐?shù)據(jù)能夠得出滿足規(guī)格說明要求的

結(jié)

果。

一般謫況至少通過第③層的驗(yàn)證。

?可讀性:算法主要是為了閱讀與交流,其次才是機(jī)器執(zhí)行??勺x性好有

于人對算法的理解;難懂的程序易于隱藏較多錯(cuò)誤,難以調(diào)試

修改「一二、

?健糖性:當(dāng)輸入非法數(shù)據(jù)碑附巡也戳融觸情解反應(yīng)或進(jìn)行處理,而9

算法的描述方法

?自然語言

?流程圖

?N?S圖

?PAD圖

?偽代碼

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)10

y

用自然語言表示算法

?自然語言就是人們?nèi)粘J褂玫恼Z言,可以

是漢語、英語或其他語言。用自然語言表

示通俗易懂,但文字冗長,容易出現(xiàn)“歧

義性”。除了簡單問題外,一般不用自然

語言描述算法。例如:

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)11

?【例4?1】輸入三個(gè)數(shù),然后輸出其中最大

的數(shù)。

?(1)輸入A,B,Co

?(2)若A>B,則MAX=A;否則MAX=B。

?(3)若C>MAX,則MAX=C。

?(4)輸出MAX,MAX即為最大數(shù)。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)12

y

11111

例:用自然語言寫出求1-----H-------------HH——的算法。

23499100

(1)sign<=l/*數(shù)值的符號*/

(2)sum〈二1/*累加和*/

(3)deno<=2■/*分母值*/

(4)sign〈二(-1)*sign

(5)term〈二sign*(1/deno)/*某一項(xiàng)的值*/

(6)sum〈二sum+term

(7)deno<=deno+l

(8)若denoW100返回第⑷步,否則轉(zhuǎn)第⑼步

(9)輸出sum

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)13

y

算法的描述——流程圖

用流程圖表示算法,形象直觀,比較清楚地顯示出各個(gè)框之間的邏輯關(guān)系,

易于理解。但流程圖占用篇幅較多,當(dāng)算法較復(fù)雜時(shí),畫流程圖既費(fèi)時(shí),又不

方便。但必須掌握。

美國國家標(biāo)準(zhǔn)化協(xié)會(huì)ANSI規(guī)定了一些常用的流程圖符號,并已被世界各國

程序工作者采用:

匚二InOII]或_o?……匚

起止框輸入輸出框判斷框處理框流程線連接點(diǎn)注釋框

三種基本結(jié)構(gòu):

為了解決程序設(shè)計(jì)混亂的問題,1966年提出了三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選

擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu),然后由這些基本結(jié)構(gòu)按一定規(guī)律組成一個(gè)算法結(jié)構(gòu),整個(gè)

算法結(jié)構(gòu)是由上而下將各個(gè)基本結(jié)構(gòu)順序排列起來的。使用這三種基本結(jié)構(gòu)順

序組成的算法結(jié)構(gòu),可以解決任何復(fù)雜的問題,并且是“結(jié)構(gòu)化”的算法。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)14

流程圖——順序結(jié)構(gòu)

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)15

流程圖—選擇結(jié)構(gòu)

選擇結(jié)構(gòu)(或稱選取結(jié)構(gòu),或稱分支結(jié)構(gòu)):

如下圖所示,虛線框內(nèi)是一個(gè)選擇結(jié)構(gòu)。此結(jié)構(gòu)必包括一個(gè)判斷框,根據(jù)給

定的條件P是否成立,而選擇執(zhí)行A框或B框。

注意:無論條件p是否成立,只能執(zhí)行A框或B框之一,不可能既執(zhí)行A框又執(zhí)

行B框。A或B兩個(gè)框中可以有一個(gè)是空的,即該空框不執(zhí)行任何操作。

流程圖—當(dāng)型循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)(或稱重復(fù)結(jié)構(gòu)):

循環(huán)結(jié)構(gòu)即反復(fù)執(zhí)行某一部分的操作,分為當(dāng)型(while型)循環(huán)結(jié)構(gòu)和直到

型(until型)循環(huán)結(jié)構(gòu)兩類。

當(dāng)型(while型)循環(huán)結(jié)構(gòu):

如右圖所示,虛線框內(nèi)是一

個(gè)while型結(jié)構(gòu)。它的功能是當(dāng)給

定的條件P成立時(shí),執(zhí)行A框操作,

執(zhí)行完A后再判斷條件p是否成立,

如果仍然成立,再執(zhí)行A框,如此

反復(fù)執(zhí)行A框,直到某一次p條件

不成立為止,此時(shí)不執(zhí)行A框,而

是從b點(diǎn)脫離循環(huán)結(jié)構(gòu)。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)17

流程圖——直到型循環(huán)結(jié)構(gòu)

如右圖所示,虛線框內(nèi)是一

個(gè)until型結(jié)構(gòu)。它的功能是先執(zhí)

行A框,然后判斷給定的條件p是

否成立,如果條件p成立,再執(zhí)

行A框,然后再對條件p作判斷,

如果條件P仍然成立,又執(zhí)行A

框,如此反復(fù)執(zhí)行A框,直到某一

次P條件不成立為止,此時(shí)不執(zhí)行b

A框,而是從b點(diǎn)脫離本循環(huán)結(jié)構(gòu)。

直到型(until型)循環(huán)結(jié)構(gòu)

一7

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)18

三種基本結(jié)構(gòu)的共同特點(diǎn)

?只有一個(gè)入口

?只有一個(gè)出口

?結(jié)構(gòu)內(nèi)的每一部分都有機(jī)會(huì)執(zhí)行到

?結(jié)構(gòu)內(nèi)不存在“死循環(huán)”(無終止的循環(huán))

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)19

y

流程圖其他結(jié)構(gòu)

事實(shí)上,基本結(jié)構(gòu)不一定只限于上面三種,只要具有上述基本結(jié)構(gòu)的4個(gè)

特點(diǎn)的結(jié)構(gòu)都可以作為基本結(jié)構(gòu)。人們可以運(yùn)用三種基本結(jié)構(gòu)定義自己派生

的基本結(jié)構(gòu),并由這些基本結(jié)構(gòu)組成結(jié)構(gòu)化程序。

如下兩圖所示。C語言就是采用的這種派生基本結(jié)構(gòu)。

根據(jù)表達(dá)式的值P進(jìn)行選擇

APn

ABN

成立

b

b

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)20

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)21

流程圖舉例

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)22

算法的描述—N?S圖

既然用基本結(jié)構(gòu)的順序組合可以表示任何復(fù)雜的算法結(jié)構(gòu),那么,基本

結(jié)構(gòu)之間的流程線就屬多余的了。1973年美國兩學(xué)者LNassi和

B.Shneiderman提出了一種新的流程圖形式,并以他們的名字命名為N—S結(jié)構(gòu)

化流程圖。這種流程圖完全去掉了帶箭頭的流程線,全部算法寫在一個(gè)矩形

框內(nèi),在該框內(nèi)還可以包括其他的從屬于它的框,即由一些基本的框組成一

個(gè)大框。這種N—S流程圖十分適合結(jié)構(gòu)化程序設(shè)計(jì),因而很受歡迎。

三種基本結(jié)構(gòu)對應(yīng)的N—S圖符號:

A

直到P成立

順序結(jié)構(gòu)選擇結(jié)構(gòu)當(dāng)(while)型循環(huán)結(jié)構(gòu)直到(until)型循環(huán)結(jié)構(gòu)

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)23

例4?4用N-S圖表示求素?cái)?shù)的算法

讀入m

k=Ym

素?cái)?shù)是指除了1和該數(shù)本身i=2

之外,不能被其他任何整數(shù)整當(dāng)i?k

除的數(shù)。

m被i整除

真假

實(shí)際上,若要判斷一個(gè)正整

用break

數(shù)m是否為素?cái)?shù),只要將2到Y(jié)

m結(jié)束循環(huán)

間的每一個(gè)整數(shù)去除m,若有一

個(gè)能整除m,則m不是素?cái)?shù),若i=i+l

其間的所有整數(shù)都不能整除m,

則m為素?cái)?shù)。真i>k+l假

輸出:m”是素?cái)?shù)輸出:m”不是素?cái)?shù)

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)25

算法的描述

PAD(ProblemAnalysisDiagram),是近年來在軟件開發(fā)中被廣泛使用的

一種算法的圖形表示法,與前面介紹的流程圖、N-S圖相比,流程圖、N-S

圖都是自上而下的順序描述,而PAD圖除了自上而下以外,還有自左向右的

展開,所以,如果說流程圖、N-S圖是一維的算法描述的話,貝UPAD圖就是

二維的,它能展現(xiàn)算法的層次結(jié)構(gòu),更直觀易懂。

PAD圖表小的二種基本結(jié)構(gòu)如卜所小:

WHILE〈條件》A

UNTIL/條件》

BA

b)

順序結(jié)構(gòu)的選擇結(jié)構(gòu)的循環(huán)結(jié)構(gòu)的

PADPADPAD

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)26

例:求三個(gè)數(shù)的最大值的PAD圖

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)27

算法的描述偽代彳

用流程圖、N-S圖、PAD圖等描述算法,直觀易懂,但繪制比較麻煩,在

設(shè)計(jì)一個(gè)算法時(shí),可能要反復(fù)修改,而修改流程圖是比較麻煩的,因此,流

程圖適合表示算法,但在設(shè)計(jì)算法過程中使用不是很理想。為了設(shè)計(jì)算法方

便,常使用偽代碼工具。

偽代碼是用介于自然語言和計(jì)算機(jī)語言之間的文字和符號來描述算法。

偽代碼不用圖形符號,書寫方便,格式緊湊,便于向計(jì)算機(jī)語言算法過渡。

因此,實(shí)際中常用偽代碼描述算法。

例:求三個(gè)數(shù)的最大值的偽代碼算法描述如下:

?定義三個(gè)變量i、j、k,用來存放三個(gè)數(shù),定義變量max存放最大值;

?輸入三個(gè)變量的值;

?max=i>j?i:j;

?max=max>k?max:k;

?輸出max。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)28

y

11111

例:用自然語言寫出求1-----H-------------HH-------的算法。

23499100

(1)sign二1/*數(shù)值的符號*/

(2)sum二1/*累加和*/

(3)deno=2/*分母值*/

(4)sign=(-1)*sign

(5)term=sign*(1/deno)/*某一項(xiàng)的值*/

(6)sum=sum+term

(7)deno=deno+l

(8)若denoW100返回第⑷步,否則轉(zhuǎn)第⑼步

(9)輸出sum

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)29

y

算法的描述計(jì)算機(jī)語言

用計(jì)算機(jī)語言表示算法實(shí)際上就是計(jì)算機(jī)程序。用計(jì)算機(jī)語言表示算法

必須嚴(yán)格遵守所使用的語言的語法規(guī)則。

例:用C語言表示求三個(gè)數(shù)的最大值的算法如下:

ttinclude<stdio.h>

voidmain()

inti,j,k,max;/*定義變量*/

printf("i,j,k二?\n〃);/*提示信息*/

scanf(〃%4d%4d%4d〃,&i,&j,&k);/*輸入函數(shù)*/

max=i>j?i:j;/*求兩數(shù)的最大值*/

max=max>k?max:k;

printf(,zThemaxmumvalueofthe3datais%d\n〃,max);/*輸出

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)30

?在計(jì)算機(jī)中,有時(shí)不區(qū)分大小寫字母,而

且很多高級語言也不區(qū)分大小寫字母,但

是在程序中,如果需要判斷字母是否一致

時(shí),則必須使用一種標(biāo)準(zhǔn),這時(shí)就必須將

大寫字母轉(zhuǎn)換成小寫字母,或?qū)⑿懽帜?/p>

轉(zhuǎn)換成大寫字母。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)31

問題的提出

?從鍵盤輸入一個(gè)小寫字母,要求在屏幕上

輸出對應(yīng)的大寫字母。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)32

y

問題的分析

?首先輸入一個(gè)字母(可能是大寫字母,也

可能是小寫字母);然后將輸入的字母轉(zhuǎn)

換成大寫字母,從字母的ASCH碼可知,大

寫字母的ASCH碼值比小寫字母ASCH碼值

小32,因此,小寫字母ASCH碼值減32就是

大寫字母;最后輸出大寫字母即可。

?這里涉及到字符數(shù)據(jù)的輸入輸出問題。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)33

y

回顧

?#include<stdio.h>

?voidmain()

?(

?chara,b;

?a=,x';

?b=,y';

?a=a-32;/*char與int數(shù)據(jù)間可進(jìn)行算術(shù)運(yùn)算7

?b=b-32;

',,,

?printf(%c,%c\n%d,%d\n,a,b,aJb);

?}

~?\J-*

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)34

y

?如何從鍵盤輸入字符呢?

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)35

y

標(biāo)準(zhǔn)字符輸出函數(shù)

格式:putchar(c)、putch(c)

參數(shù):參數(shù)c為字符常量、字符或整型變量、表達(dá)式

功能:把字符C輸出到標(biāo)準(zhǔn)輸出設(shè)備(即顯示器)上

返回值:正常返回,為顯示字符的代碼值;若出錯(cuò),返回為

EOF(即-1)

說明:

①此函數(shù)只能輸出單個(gè)字符數(shù)據(jù)。

②參數(shù)c可以是字符常量、轉(zhuǎn)義字符、字符變量、整型常量、

整型變量。

③從功能角度來看,printfO函數(shù)使用枇完全可以代替

putchar()函數(shù)和putch()函數(shù)。

④putchar()函數(shù)和putch()函數(shù)的功能完全一樣。

⑤該函數(shù)在stdio.h中聲明。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)36

標(biāo)準(zhǔn)字符輸入函數(shù)

格式:getchar()、getch()>getche()

功能:從標(biāo)準(zhǔn)的輸入設(shè)備(如鍵盤)讀一個(gè)字符

返回值:正常,返回讀取的字符代碼值;若出錯(cuò),返回為EOF(即-1)

說明:

①getchar()函數(shù)、getch()函數(shù)、getche()函數(shù),都只能接受一個(gè)字符。

②getcharO函數(shù)在輸入一個(gè)或若干個(gè)字符后,必須以回車鍵結(jié)束,否則字

符不被輸入。但只有第一個(gè)字符被接受。并且在屏幕上回顯全部輸入的字符。

③getch()和getche()函數(shù)在輸入一個(gè)字符后,立即被函數(shù)接受,不用回車

鍵。使用getch()接受字符時(shí),屏幕上不回顯原輸入的字符。使用getcheO接

受字符時(shí),要顯示原輸入的字符。

④利用回顯和不回顯的特點(diǎn),getch()和getcheO這兩個(gè)函數(shù)經(jīng)常用于交互

輸入的過程中完成暫停等功能。

⑤從功能角度來看,scanf()函數(shù)使用%(3完全可以代替getchar()、getch()

和getche()函數(shù)。

例4?5問題的實(shí)現(xiàn)

/*LI4_5.c*/

ttinclude<stdio.h>輸入字

voidmain()

不同數(shù)據(jù)之charcl,c2;

間的運(yùn)算cl=getchar()彳輸入小寫字母*/

printf(〃%c,%d\n”,cl,cl);

c2=cl-32;轉(zhuǎn)變?yōu)榇髮懽帜?/

printf(/z%c,%d\n/z,c2,c2);/*輸出*/

冢D:\tc\TC.EXE

a,97

同一數(shù)據(jù)不"65

同的輸出方

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)38

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

?通常的計(jì)算機(jī)程序總是由若干條語句組成,

從執(zhí)行方式上看,從第一條語句到最后一

條語句完全按順序執(zhí)行,就是簡單的順序

結(jié)構(gòu)。前面我們所編寫的程序都是順序結(jié)

構(gòu)程序。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)39

舉一反二

例4-7:雞兔同籠問題。已知雞兔總頭數(shù)為H,總腳數(shù)為F,求雞兔

各有多少只?

【分析】

設(shè)雞有x只,兔有y只,則有方程成立:

x+y=H(1)

2x+4y=F(2)

解上述(1)(2)式方程組有解:

x=(4H-F)/2

y=(F-2H)/2

本例只需要輸入總腳數(shù)F、總頭數(shù)H即可求出。需要用到scanf()和

printf()庫函數(shù)。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)40

y

例4-7程序

/*LI47.c*/

ttinclude<stdio.h>

voidmain(void)

intH,F,x,y;

scanf(%d,%d,&H,&F);/*輸入雞兔總頭數(shù)H,總腳數(shù)F*/

X4*H—F/2;/*計(jì)算雞的只數(shù)*/

y=(F-2*H)/2;/*計(jì)算兔的只數(shù)*/

print\chicken=%d,rabbit=%d\n,x,y);/*輸出雞兔只數(shù)*/

為什么沒有用顯示轉(zhuǎn)換數(shù)軟'D:\tc\TC.EXE

10,34

據(jù),或x=(4*H?F)/2?0chicken=3,rabbit=?

的形式?

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)41

例4?9:求ax2+bx+c=0方程的根

【分析】

-b+2-4ac—b—z—4ac

xl二x2=___

2a7a

-b2-4ac

令P二q二

xl=p+q,x2=p-q

只要保證b*b-4*a*c大于等于0,該方程就有實(shí)根。

例4-9程序

/*LI4_9.c*/

#include<stdio.h>

#include<math.h>

voidmain()

<

floata,b,c,disc,p,q,x1,x2;

n

printf("Pleaseenterthecoefficientsafbzc:);

scanf("%/*輸入a,b,c*/

disc=b*b-4*a*c;/*計(jì)算判別式6*/

p=-b/(2*a);

q=sqrt(disc)/(2*a);

xl=p+q;x2=p-q;/*計(jì)算方程的2個(gè)根*/

,,輸出>和

printf("xl=%f\nx2=%f\nfxlzx2);/*xlx2*/

問題:如果disc=b*b-4*a*c的值小于0呢?

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)43

?以上都是順序結(jié)構(gòu)程序。

?問題:如果disc=b*b?4*a*c的值小于0呢?

?如果要判斷,那么要用到選擇結(jié)構(gòu)程序。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)44

y

選擇結(jié)構(gòu)程序

?若在程序執(zhí)行過程當(dāng)中,根據(jù)用戶的輸入

或中間結(jié)果去執(zhí)行若干不同的任務(wù)則為選

擇結(jié)構(gòu)程序。

?c提供了一系列的分支語句來實(shí)現(xiàn)選擇結(jié)構(gòu)

程序設(shè)計(jì)。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)45

y

分支語句

?if語句

?if?else語句

?if-elseif語句

?switch語句

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)46

y

if語句

“if(表達(dá)式)語句”形式

語句格式的一般形式為:

if(表達(dá)式)

語句;

語句功能:執(zhí)行此語句時(shí),先求表達(dá)

式的值,若其值為“真”,則執(zhí)行語句;若

其值為“假”,則在if結(jié)構(gòu)體內(nèi)什么也不執(zhí)

行。而程序直接去執(zhí)行if語句后面的語句。

注窗①U后面的二表達(dá)式二二般用于表示?個(gè)條

例:if(x>y)真、假

printf(“%d”,x);

如果是復(fù)合語句,必須用一對花括號{}將語句括語句

起來。如果只有一條語句,則可不用{}括起來。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)47

例4?9程序

/*LI4_9_l.c*/

#include<stdio.h>

#include<math.h>

voidmain()

<

floata,b,c,disc,p,q,x1,x2;

scanf(-f%fW,&a,&b,&c);

disc=b*b-4*a*c;

p=-b/(2*a);

q=sqrt(disc)/(2*a);

xl=p+q;x2=p-q;

,<n

printf("xl=Vbf\nx2=%f\n,xlzx2);

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)48

if()~else~語句

語句格式的一般形式為:

if(表達(dá)式)

語句1;

else

語句2;

語句功能:執(zhí)行此語句時(shí),先求表達(dá)式

的值,若其值為“真”,則執(zhí)行語句1;若其

值為“假”,則執(zhí)行語句2。最后程序跳出if

語句執(zhí)行后面的語句

例:if(x>y)

注意:①if后面的“菜max=x;、條

件,它可以是關(guān)系表H達(dá)瓦/

達(dá)式、字符型表達(dá)式叫else

p真、/fi

可以只包含一個(gè)簡單語max=y;

如果是復(fù)合語句,必須用一對花括號{}將語句括語句1語句2

起來。如果只有一條語句,則可不用。括起來。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)49

例4?9程序

/*LI4_9_2.c*/

#include<stdio.h>

#include<math.h>

voidmain()

{

floata,b,c,disc,p,q,x1,x2;

scanf("f%fW,&a,&b,&c);

disc=b*b-4*a*c;

{p=-b/(2*a);

q=sqrt(disc)/(2*a);

xl=p+q;x2=p-q;

<<,,

printf("xl=Vbf\nx2=Vbf\n/xl/x2);

}

printf(<4norealroot!”);

“JY

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)50

?if(表達(dá)式)

?語句1;

?else

,語句2;

?由于語句1或語句2可以是各種形式的語句,

當(dāng)然也可以是分支語句,因此分支語句可

以嵌套。____________________________

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)51

y

/*LI4_9_3.c*/例4?9程序

#include<stdio.h>

#include<math.h>

voidmain()

floata,b,c,disc,p,q,xl,x2;

seanf("%f%f%f",&az&b,&c);在語句1嵌套

if(a!=O)

{disc=b*b-4*a*c;

if(disc>=0)

<p=-b/(2*a);

q=sqrt(disc)/(2*a);

if(disc==O)

printf(<<xl=x2=<ybf\n,,,xl=x2=p);

else

,,

printf("xl=%f\nx2=%f\nzxl=p+q,x2=p-q);

printf(unorealroot!”);

}

printf("eiror?”);

爭12621《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)52

y

例4?9程序

/*LI4_9_4.c*/

#include<stdio.h>

#include<math,h>———

voidmain()在語句2嵌套

<floata,b,c,disc,p,q,xl,x2;

seanf("%f%f%f"z&a,&b,&c);

if(a==O)

printf("eiror.”);

else

{disc=b*b-4*a*c;

if(disc<0)/

printf(unorealroot!”);

else

{p=-b/(2*a);q=sqrt(disc)/(2*a);

if(disc==O)

printf(<txl=x2=%f\n,\xl=x2=p);

else

,,,,

printf(xl=%f\nx2=%f\nzxl=p+qzx2=p-q);

:0d2-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)53

y

?條件嵌套語句容易出錯(cuò),其原因主要是不

知道哪個(gè)if對應(yīng)哪個(gè)else。例如:

if(x>20||x<-10)

if(y<=100&&y>x)

printfCGood");

else

printfCBad");

?對于上述情況,C編譯系統(tǒng)規(guī)定:else語句

與最近的一個(gè)if語句匹配。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)54

if()~elseif~語句

語句格式的一般

形式為:

if(表達(dá)式1)

語句1;

elseif(表達(dá)式2)

語?2;

elseif(表達(dá)式3)

語—3;

elseif(表達(dá)式n)

語In;

else

語句n+1;

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)55

例4?9程序

/*LI4_9_5.c*/

#include<stdio.h>

#include<math,h>

voidmain()

<floata,b,c,disc,p,q,xl,x2;

seanf("

if(a==O)

printf("eiror.”);

else

{disc=b*b-4*a*c;

if(disc<0)

printf(unorealroot!”);

elseif(disc==O)

<<,,

printf(xl=x2=%f\nzxl=x2=-b/(2*a));

else

{p=-b/(2*a);q=sqrt(disc)/(2*a);

printf(,,xl=%f\nx2=%f\n,,,xl=p+q,x2=p-q);

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)56

if語句的嵌套

:if(exprl)if(exprl)

、■

if(expr2)、

if(expr2)內(nèi)嵌if:

>*

statementl內(nèi)嵌if:statementl

elseelse

statementlJstatements

jif(exprl)

jif(exprl)

statementl

if(expr2)statement

:else]內(nèi)嵌if:

elsestatements

if(expr3)、

:else

statements

內(nèi)嵌ifif(expr3)statement

else,內(nèi)嵌if:

elsestatementsr

statement4,

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)57

if語句強(qiáng)調(diào)說明

?if后面的表達(dá)式類型任意

?o_ifYx==(b_______

口::?a==b&&x=;y)pr

小考慮下面程序的輸出結(jié)果:

if(3)

if('a')'printf("%d”,'a#include<stdio.h>

voidmain()

{intx,y;

scanf(66%d,%d5\&x,&y);

if(x>y)

{x=y;y=x;}

else

{x=x+l;y=y+l;}

printf(66%d,%d\n”,x,y);

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)58

4.3閏年問題

一年12個(gè)月,共365天,這是我們說得最多的。但事實(shí)上,每年不完全是365

天。在中國農(nóng)歷中有閏月的說法,而公歷也有閏年的說法。一般情況下,2月

是28天,而閏年時(shí)是29天,何年的2月是29天呢,這就是閏年問題。

例4-10:編程判斷一個(gè)年份是否為閏年。

【分析】

判斷閏年的條件是:能被4整除、但不能被100整除,或者能被400整除。

整除的表示:x能被y整除,則余數(shù)為0,即x%y=0。

因此,該問題需要邏輯判斷,涉及邏輯表達(dá)式與關(guān)系表達(dá)式、求余運(yùn)算符%、

選擇結(jié)構(gòu)等知識。

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)59

關(guān)系運(yùn)算符及其表達(dá)式

心關(guān)系運(yùn)算符<

不中類:<<=<=

?優(yōu)先級(高)

>6

?結(jié)合方向:自左向右

>=

?優(yōu)先級別:

優(yōu)先級7(低)

*!=

例c>a+b〃c〉(a+b)

?關(guān)系“真”或"假”,用1和0表

____

例inta=3,b=2,c=1,d,f;

a>b/*表達(dá)式值1*/

(a>b)==c/*表達(dá)式值1*/

b+c<a/*表達(dá)式值0*/

d=a>b/*d=l*/

f=a>b>c

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)60

y

關(guān)系運(yùn)算符注意事項(xiàng)

例應(yīng)避免對實(shí)數(shù)作相等或不等的判斷

如1?0/3.0*3.0==1.0結(jié)果為0

可改寫為:fabs(1.0/3.0*3.0-1.0)<le-6

例注意區(qū)分與"=="

inta=O,b=l;

if(a=b)

printf(66aequaltob");

else

printf(6ianotequaltob");

2012-6-2162

例4?10問題的實(shí)現(xiàn)

閏年的條件是:能被4整除、但不能被100整除,或者能被400整除。

(x能被y整除,則余數(shù)為0,即x%y=0)

輸入年份賦給yaer

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)63

MI4_1O.c*/例4?10程序

ttinclude<stdio.h>

voidmain()

intyear,leap;

printf("Pleaseinputtheyear:");

scanf(〃%d”,&year);

if(year%4==0)/*被4整除*/

if(year%100==0)量D:\tc\TC.EXE

Pleaseinputtheyear:2003

if(year%400==0)2003isnotaleapyear

Pleaseinputtheyear:2004

leap=1;2004isaleapyear

else

leap=0;

)

else

leap1;

}

else

leap0;/*不能被4整除*/

if(leap)

printf(〃%disaleapyear\n",year);

else

printf(//%disnotaleapyear\n",year);

}

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)64

技巧

?在程序中設(shè)置狀態(tài)標(biāo)志值。如程序中的

leap!

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)65

y

例440的另解

#include<stdio.h>

v<oidmain()

inty;

scanf(,,%d",&y);

if((y%4==0&ay%100!=0)||y%400==0)

printf("Leapyear.\n");

else#include<stdio.h>

printf("Noleapyear.\n");voidmain()

inty;

,,

scanf("%dz&y);

程序中用到了邏輯運(yùn)if(!(y%4)&ay%100||!(y%400))

算符,下面介紹之:printf("Leapyear.\n");

else

printf("Noleapyear.\n");

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)66

邏輯運(yùn)算符及其表達(dá)式

?:<邏輯運(yùn)算符

?不中類:!&&||

?邏輯運(yùn)算真值表

ab!a!ba&&ba||b

真真假假真真

真假假真假真

假真真假假真

假假真真假假

?C語言中,運(yùn)算量:0表示“假”,

非0表示“真”,

運(yùn)算結(jié)果:0表示“假”,

V1表示“真”,

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)67

邏輯運(yùn)算符

?優(yōu)先級:!(2)[-!:從右向左

&&(11)

?結(jié)合方向:&&:從左向右

II(12)低||:從左向右

a<=x&&x<=b/*(a<=x)&&(x<=b)*1

a>b&&x>y/*(a>b)&&(x>y)*/

a==b||x==y/*(a==b)||(x==y)*/

!a||a>b/*(!a)||(a>b)*/

2012-6-21《解析C程序設(shè)計(jì)》第4章控制結(jié)構(gòu)程序設(shè)計(jì)68

邏輯運(yùn)算符

?優(yōu)先級:(2)J!:從右向左

IWJ

&&(11)&&:從左向右

?結(jié)合方向:

II(12)低||:從左向右

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論