版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024酒店廚房托管合同范本
- 新課標(biāo) 高中英語語法系統(tǒng)全解進(jìn)行時(shí)
- 信訪隱患排查化解工作方案
- 新學(xué)期計(jì)劃書300字初二(7篇)
- 護(hù)士節(jié)衛(wèi)計(jì)委主任發(fā)言稿(5篇)
- 工作細(xì)心的表揚(yáng)信
- 川渝商會(huì)監(jiān)事會(huì)上半年工作總結(jié)(5篇)
- JS復(fù)合保溫板施工方案
- 感恩母校演講稿
- 平安暑假安全教育觀后感(15篇)
- 吊裝方法與吊裝方案全
- 口腔頜面部損傷-口腔頜面部軟組織損傷(口腔頜面外科課件)
- 管理經(jīng)濟(jì)學(xué)考試試題及答案
- 新大氣污染防治法培訓(xùn)專題培訓(xùn)課件
- 2023年4月自考04747Java語言程序設(shè)計(jì)一試題及答案含評分標(biāo)準(zhǔn)
- 公務(wù)員晉升職級現(xiàn)實(shí)表現(xiàn)材料三篇
- Unit 7 《Chinese festivals》教學(xué)設(shè)計(jì)-優(yōu)秀教案
- 八年級上冊英語電子課本可點(diǎn)讀
- 中國書法-英文 chinese calligraphy
- 大班社會(huì)領(lǐng)域《走進(jìn)新疆》
- 共青團(tuán)光輝歷史簡潔版
評論
0/150
提交評論