C語言課件第4章控制結構程序設計_第1頁
C語言課件第4章控制結構程序設計_第2頁
C語言課件第4章控制結構程序設計_第3頁
C語言課件第4章控制結構程序設計_第4頁
C語言課件第4章控制結構程序設計_第5頁
已閱讀5頁,還剩151頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章控制結構程序設計

X

?現實問題總是復雜的,面對各種需要解決

的問題,人們必須首先對各類問題進行分

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

再借助具體編程語言編制好一組讓計算機

執行的指令(即程序),讓計算機按人們

指定的步驟有效地工作。

2012-6-21《解析C程序設計》第4章控制結構程序設計2

?根據算法,依據某種編程語言的語法規則

編寫計算機執行的命令序列,就是程序設

計。

?著名計算機科學家沃思(NikiklausWirth)

提出了一個公式:“數據結構+算法=程

序”,即程序設計包括算法設計和數據存

儲。除此之外,還有結構化程序設計方法

和計算機語言。

2012-6-21《解析C程序設計》第4章控制結構程序設計3

問題的提出

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

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

365天。在中國農歷中有閏月的說法,而公

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

天,而閏年時是29天,何年的2月是29天呢,

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

為閏年。

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

2012-6-21《解析C程序設計》第4章控制結構程序設計4

y

本章內容

?算法的基礎知識

?大小寫字母轉換問題

-順序結構程序的概念

-字符數據的輸入輸出

?閏年問題

-選擇結構程序的概念

-if語句

-switch語句

?統計多名學生成績問題

-循環結構程序的概念

-自增自減運算符與逗號表達式

-while循環

-do—while循環

-for循環

-嵌套循環

4.1算法的基礎知識

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

述;數據結構是加工對象;語言是工具;

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

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

:是用具體的計算機語言來描述算法

碼,可以輸入計算機并產生結果。

2012-6-21《解析C程序設計》第4章控制結構程序設計6

y

常用算法

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

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

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

?有序數列的插入、刪除操作;

?存儲區的動態分配與釋放,單向線性鏈表的建立、查找、

插入、刪除操作;

?初等數論問題求解的有關算法(最大公約數、最小公倍數、

素數等);

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

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

接、比較等)。

2012-6-21《解析C程序設計》第4章控制結構程序設計7

y

算法的五個特性

?有窮性:對任何合法的輸入值,算法中每個步驟由計算

機執行的次數及時間都是有限的。

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

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

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

來實現。

?輸入:一個算法應具有零個或多個輸入。

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

?輸出:一個算法應具有一個或多個輸入。

——

2012-6-21《解析C程序設計》第4章控制結構程序設計8

算法的設計目標

?正確性:設計的算法應當滿足具有輸入、輸出和加工處理等明確的無歧

性的描述的具體問題的需求。驗證正確性通常有4個層次:

①程序不含語法錯誤;

②程序對于幾組輸入數據能夠得出滿足規格說明要求的結果;

③程序對于精心選擇的典型、苛刻而帶有刁難性的幾組輸入數

能夠得出滿足規格說明要求的結果;

④程序對于一切合法的輸入數據能夠得出滿足規格說明要求的

果。

一般謫況至少通過第③層的驗證。

?可讀性:算法主要是為了閱讀與交流,其次才是機器執行。可讀性好有

于人對算法的理解;難懂的程序易于隱藏較多錯誤,難以調試

修改「一二、

?健糖性:當輸入非法數據碑附巡也戳融觸情解反應或進行處理,而9

算法的描述方法

?自然語言

?流程圖

?N?S圖

?PAD圖

?偽代碼

2012-6-21《解析C程序設計》第4章控制結構程序設計10

y

用自然語言表示算法

?自然語言就是人們日常使用的語言,可以

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

示通俗易懂,但文字冗長,容易出現“歧

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

語言描述算法。例如:

2012-6-21《解析C程序設計》第4章控制結構程序設計11

?【例4?1】輸入三個數,然后輸出其中最大

的數。

?(1)輸入A,B,Co

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

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

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

2012-6-21《解析C程序設計》第4章控制結構程序設計12

y

11111

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

23499100

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

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

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

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

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

(6)sum〈二sum+term

(7)deno<=deno+l

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

(9)輸出sum

2012-6-21《解析C程序設計》第4章控制結構程序設計13

y

算法的描述——流程圖

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

易于理解。但流程圖占用篇幅較多,當算法較復雜時,畫流程圖既費時,又不

方便。但必須掌握。

美國國家標準化協會ANSI規定了一些常用的流程圖符號,并已被世界各國

程序工作者采用:

匚二InOII]或_o?……匚

起止框輸入輸出框判斷框處理框流程線連接點注釋框

三種基本結構:

為了解決程序設計混亂的問題,1966年提出了三種基本結構:順序結構、選

擇結構、循環結構,然后由這些基本結構按一定規律組成一個算法結構,整個

算法結構是由上而下將各個基本結構順序排列起來的。使用這三種基本結構順

序組成的算法結構,可以解決任何復雜的問題,并且是“結構化”的算法。

2012-6-21《解析C程序設計》第4章控制結構程序設計14

流程圖——順序結構

2012-6-21《解析C程序設計》第4章控制結構程序設計15

流程圖—選擇結構

選擇結構(或稱選取結構,或稱分支結構):

如下圖所示,虛線框內是一個選擇結構。此結構必包括一個判斷框,根據給

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

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

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

流程圖—當型循環結構

循環結構(或稱重復結構):

循環結構即反復執行某一部分的操作,分為當型(while型)循環結構和直到

型(until型)循環結構兩類。

當型(while型)循環結構:

如右圖所示,虛線框內是一

個while型結構。它的功能是當給

定的條件P成立時,執行A框操作,

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

如果仍然成立,再執行A框,如此

反復執行A框,直到某一次p條件

不成立為止,此時不執行A框,而

是從b點脫離循環結構。

2012-6-21《解析C程序設計》第4章控制結構程序設計17

流程圖——直到型循環結構

如右圖所示,虛線框內是一

個until型結構。它的功能是先執

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

否成立,如果條件p成立,再執

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

如果條件P仍然成立,又執行A

框,如此反復執行A框,直到某一

次P條件不成立為止,此時不執行b

A框,而是從b點脫離本循環結構。

直到型(until型)循環結構

一7

2012-6-21《解析C程序設計》第4章控制結構程序設計18

三種基本結構的共同特點

?只有一個入口

?只有一個出口

?結構內的每一部分都有機會執行到

?結構內不存在“死循環”(無終止的循環)

2012-6-21《解析C程序設計》第4章控制結構程序設計19

y

流程圖其他結構

事實上,基本結構不一定只限于上面三種,只要具有上述基本結構的4個

特點的結構都可以作為基本結構。人們可以運用三種基本結構定義自己派生

的基本結構,并由這些基本結構組成結構化程序。

如下兩圖所示。C語言就是采用的這種派生基本結構。

根據表達式的值P進行選擇

APn

ABN

成立

b

b

2012-6-21《解析C程序設計》第4章控制結構程序設計20

2012-6-21《解析C程序設計》第4章控制結構程序設計21

流程圖舉例

2012-6-21《解析C程序設計》第4章控制結構程序設計22

算法的描述—N?S圖

既然用基本結構的順序組合可以表示任何復雜的算法結構,那么,基本

結構之間的流程線就屬多余的了。1973年美國兩學者LNassi和

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

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

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

個大框。這種N—S流程圖十分適合結構化程序設計,因而很受歡迎。

三種基本結構對應的N—S圖符號:

A

直到P成立

順序結構選擇結構當(while)型循環結構直到(until)型循環結構

2012-6-21《解析C程序設計》第4章控制結構程序設計23

例4?4用N-S圖表示求素數的算法

讀入m

k=Ym

素數是指除了1和該數本身i=2

之外,不能被其他任何整數整當i?k

除的數。

m被i整除

真假

實際上,若要判斷一個正整

用break

數m是否為素數,只要將2到Y

m結束循環

間的每一個整數去除m,若有一

個能整除m,則m不是素數,若i=i+l

其間的所有整數都不能整除m,

則m為素數。真i>k+l假

輸出:m”是素數輸出:m”不是素數

2012-6-21《解析C程序設計》第4章控制結構程序設計25

算法的描述

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

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

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

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

二維的,它能展現算法的層次結構,更直觀易懂。

PAD圖表小的二種基本結構如卜所小:

WHILE〈條件》A

UNTIL/條件》

BA

b)

順序結構的選擇結構的循環結構的

PADPADPAD

2012-6-21《解析C程序設計》第4章控制結構程序設計26

例:求三個數的最大值的PAD圖

2012-6-21《解析C程序設計》第4章控制結構程序設計27

算法的描述偽代彳

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

設計一個算法時,可能要反復修改,而修改流程圖是比較麻煩的,因此,流

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

便,常使用偽代碼工具。

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

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

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

例:求三個數的最大值的偽代碼算法描述如下:

?定義三個變量i、j、k,用來存放三個數,定義變量max存放最大值;

?輸入三個變量的值;

?max=i>j?i:j;

?max=max>k?max:k;

?輸出max。

2012-6-21《解析C程序設計》第4章控制結構程序設計28

y

11111

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

23499100

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

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

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

(4)sign=(-1)*sign

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

(6)sum=sum+term

(7)deno=deno+l

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

(9)輸出sum

2012-6-21《解析C程序設計》第4章控制結構程序設計29

y

算法的描述計算機語言

用計算機語言表示算法實際上就是計算機程序。用計算機語言表示算法

必須嚴格遵守所使用的語言的語法規則。

例:用C語言表示求三個數的最大值的算法如下:

ttinclude<stdio.h>

voidmain()

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

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

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

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

max=max>k?max:k;

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

2012-6-21《解析C程序設計》第4章控制結構程序設計30

?在計算機中,有時不區分大小寫字母,而

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

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

時,則必須使用一種標準,這時就必須將

大寫字母轉換成小寫字母,或將小寫字母

轉換成大寫字母。

2012-6-21《解析C程序設計》第4章控制結構程序設計31

問題的提出

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

輸出對應的大寫字母。

2012-6-21《解析C程序設計》第4章控制結構程序設計32

y

問題的分析

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

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

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

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

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

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

?這里涉及到字符數據的輸入輸出問題。

2012-6-21《解析C程序設計》第4章控制結構程序設計33

y

回顧

?#include<stdio.h>

?voidmain()

?(

?chara,b;

?a=,x';

?b=,y';

?a=a-32;/*char與int數據間可進行算術運算7

?b=b-32;

',,,

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

?}

~?\J-*

2012-6-21《解析C程序設計》第4章控制結構程序設計34

y

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

2012-6-21《解析C程序設計》第4章控制結構程序設計35

y

標準字符輸出函數

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

參數:參數c為字符常量、字符或整型變量、表達式

功能:把字符C輸出到標準輸出設備(即顯示器)上

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

EOF(即-1)

說明:

①此函數只能輸出單個字符數據。

②參數c可以是字符常量、轉義字符、字符變量、整型常量、

整型變量。

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

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

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

⑤該函數在stdio.h中聲明。

2012-6-21《解析C程序設計》第4章控制結構程序設計36

標準字符輸入函數

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

功能:從標準的輸入設備(如鍵盤)讀一個字符

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

說明:

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

②getcharO函數在輸入一個或若干個字符后,必須以回車鍵結束,否則字

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

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

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

受字符時,要顯示原輸入的字符。

④利用回顯和不回顯的特點,getch()和getcheO這兩個函數經常用于交互

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

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

和getche()函數。

例4?5問題的實現

/*LI4_5.c*/

ttinclude<stdio.h>輸入字

voidmain()

不同數據之charcl,c2;

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

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

c2=cl-32;轉變為大寫字母*/

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

冢D:\tc\TC.EXE

a,97

同一數據不"65

同的輸出方

2012-6-21《解析C程序設計》第4章控制結構程序設計38

順序結構程序

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

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

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

結構。前面我們所編寫的程序都是順序結

構程序。

2012-6-21《解析C程序設計》第4章控制結構程序設計39

舉一反二

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

各有多少只?

【分析】

設雞有x只,兔有y只,則有方程成立:

x+y=H(1)

2x+4y=F(2)

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

x=(4H-F)/2

y=(F-2H)/2

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

printf()庫函數。

2012-6-21《解析C程序設計》第4章控制結構程序設計40

y

例4-7程序

/*LI47.c*/

ttinclude<stdio.h>

voidmain(void)

intH,F,x,y;

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

X4*H—F/2;/*計算雞的只數*/

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

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

為什么沒有用顯示轉換數軟'D:\tc\TC.EXE

10,34

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

的形式?

2012-6-21《解析C程序設計》第4章控制結構程序設計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,該方程就有實根。

例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;/*計算判別式6*/

p=-b/(2*a);

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

xl=p+q;x2=p-q;/*計算方程的2個根*/

,,輸出>和

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

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

2012-6-21《解析C程序設計》第4章控制結構程序設計43

?以上都是順序結構程序。

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

?如果要判斷,那么要用到選擇結構程序。

2012-6-21《解析C程序設計》第4章控制結構程序設計44

y

選擇結構程序

?若在程序執行過程當中,根據用戶的輸入

或中間結果去執行若干不同的任務則為選

擇結構程序。

?c提供了一系列的分支語句來實現選擇結構

程序設計。

2012-6-21《解析C程序設計》第4章控制結構程序設計45

y

分支語句

?if語句

?if?else語句

?if-elseif語句

?switch語句

2012-6-21《解析C程序設計》第4章控制結構程序設計46

y

if語句

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

語句格式的一般形式為:

if(表達式)

語句;

語句功能:執行此語句時,先求表達

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

其值為“假”,則在if結構體內什么也不執

行。而程序直接去執行if語句后面的語句。

注窗①U后面的二表達式二二般用于表示?個條

例:if(x>y)真、假

printf(“%d”,x);

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

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

2012-6-21《解析C程序設計》第4章控制結構程序設計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程序設計》第4章控制結構程序設計48

if()~else~語句

語句格式的一般形式為:

if(表達式)

語句1;

else

語句2;

語句功能:執行此語句時,先求表達式

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

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

語句執行后面的語句

例:if(x>y)

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

件,它可以是關系表H達瓦/

達式、字符型表達式叫else

p真、/fi

可以只包含一個簡單語max=y;

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

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

2012-6-21《解析C程序設計》第4章控制結構程序設計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程序設計》第4章控制結構程序設計50

?if(表達式)

?語句1;

?else

,語句2;

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

當然也可以是分支語句,因此分支語句可

以嵌套。____________________________

2012-6-21《解析C程序設計》第4章控制結構程序設計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程序設計》第4章控制結構程序設計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程序設計》第4章控制結構程序設計53

y

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

知道哪個if對應哪個else。例如:

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

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

printfCGood");

else

printfCBad");

?對于上述情況,C編譯系統規定:else語句

與最近的一個if語句匹配。

2012-6-21《解析C程序設計》第4章控制結構程序設計54

if()~elseif~語句

語句格式的一般

形式為:

if(表達式1)

語句1;

elseif(表達式2)

語?2;

elseif(表達式3)

語—3;

elseif(表達式n)

語In;

else

語句n+1;

2012-6-21《解析C程序設計》第4章控制結構程序設計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程序設計》第4章控制結構程序設計56

if語句的嵌套

:if(exprl)if(exprl)

、■

if(expr2)、

if(expr2)內嵌if:

>*

statementl內嵌if:statementl

elseelse

statementlJstatements

jif(exprl)

jif(exprl)

statementl

if(expr2)statement

:else]內嵌if:

elsestatements

if(expr3)、

:else

statements

內嵌ifif(expr3)statement

else,內嵌if:

elsestatementsr

statement4,

2012-6-21《解析C程序設計》第4章控制結構程序設計57

if語句強調說明

?if后面的表達式類型任意

?o_ifYx==(b_______

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

小考慮下面程序的輸出結果:

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程序設計》第4章控制結構程序設計58

4.3閏年問題

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

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

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

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

【分析】

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

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

因此,該問題需要邏輯判斷,涉及邏輯表達式與關系表達式、求余運算符%、

選擇結構等知識。

2012-6-21《解析C程序設計》第4章控制結構程序設計59

關系運算符及其表達式

心關系運算符<

不中類:<<=<=

?優先級(高)

>6

?結合方向:自左向右

>=

?優先級別:

優先級7(低)

*!=

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

?關系“真”或"假”,用1和0表

____

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

a>b/*表達式值1*/

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

b+c<a/*表達式值0*/

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

f=a>b>c

2012-6-21《解析C程序設計》第4章控制結構程序設計60

y

關系運算符注意事項

例應避免對實數作相等或不等的判斷

如1?0/3.0*3.0==1.0結果為0

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

例注意區分與"=="

inta=O,b=l;

if(a=b)

printf(66aequaltob");

else

printf(6ianotequaltob");

2012-6-2162

例4?10問題的實現

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

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

輸入年份賦給yaer

2012-6-21《解析C程序設計》第4章控制結構程序設計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程序設計》第4章控制結構程序設計64

技巧

?在程序中設置狀態標志值。如程序中的

leap!

2012-6-21《解析C程序設計》第4章控制結構程序設計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);

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

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

else

printf("Noleapyear.\n");

2012-6-21《解析C程序設計》第4章控制結構程序設計66

邏輯運算符及其表達式

?:<邏輯運算符

?不中類:!&&||

?邏輯運算真值表

ab!a!ba&&ba||b

真真假假真真

真假假真假真

假真真假假真

假假真真假假

?C語言中,運算量:0表示“假”,

非0表示“真”,

運算結果:0表示“假”,

V1表示“真”,

2012-6-21《解析C程序設計》第4章控制結構程序設計67

邏輯運算符

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

&&(11)

?結合方向:&&:從左向右

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程序設計》第4章控制結構程序設計68

邏輯運算符

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

IWJ

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

?結合方向:

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

溫馨提示

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

評論

0/150

提交評論