




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第3章 算法與程序設(shè)計(jì)基礎(chǔ)3.1算法的概述3.2 算法的常用表示方法3.3 結(jié)構(gòu)化程序設(shè)計(jì)方法3.4 語句概述3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)退出13.1 算法3.1.1 算法的概念 編寫一個(gè)程序的時(shí)候,總要首先想好:程序是干什么的?應(yīng)該如何實(shí)現(xiàn)這些目標(biāo)?(應(yīng)該先進(jìn)行什么處理、后進(jìn)行什么處理?)所處理的數(shù)據(jù)的類型是什么?遇到一些復(fù)雜的問題,我們可能還需要考慮采用什么數(shù)學(xué)方法。這一切都涉及一個(gè)專業(yè)名詞“算法”。算法就是程序處理問題的步驟與方法。很多時(shí)候,程序設(shè)計(jì)者所面臨的問題就是尋找一個(gè)合適的算法。因此,算法在軟件設(shè)計(jì)中具有重要的地位。程序=數(shù)據(jù)結(jié)構(gòu)+算法23.1 算法P57 例3.1:求1+2+3+4
2、+100=?算法1:步驟1:1+2=3步驟2:3+3=6步驟3:6+4=10步驟99:4950+100=5050算法2:步驟1:0+100=100步驟2:1+99=100步驟3:2+98=100步驟50:49+51=100步驟51:10050=5000步驟52:5000+50=505033.1 算法P52 例3.1:求1+2+3+4+100=?算法3:步驟1:k=1,s=0 (k表示加數(shù),s存放和)步驟2:如果 k100 則 算法結(jié)束,S即為所求的和步驟3:否則 s=s+k,k=k+1步驟4:轉(zhuǎn)向步驟2執(zhí)行算法的優(yōu)劣:方法簡單、運(yùn)算步驟少。43.1.2算法的特性 一個(gè)方法要成為我們可以在程序設(shè)
3、計(jì)中所使用的算法,需要具備如下五個(gè)特征。1、有窮性一個(gè)算法要在有限的步驟內(nèi)解決問題。 例如,求某一自然數(shù)N的階乘: N!=1*2*3*. .*N但是,以下計(jì)算公式則不能作為算法,因?yàn)槠溆?jì)算步驟是無限的: SUM=1+1/1+1/2+1/3+. .+1/n+. 3.1 算法52、確定性 算法中操作步驟的順序和每一個(gè)步驟的內(nèi)容都應(yīng)當(dāng)是確定的,不應(yīng)當(dāng)是含糊不清的。3、可執(zhí)行性一個(gè)算法應(yīng)當(dāng)是可以由計(jì)算機(jī)執(zhí)行的,算法中描述的操作都是可以通過計(jì)算機(jī)的運(yùn)行來實(shí)現(xiàn)。(例如:b=0,執(zhí)行a/b)4、有零個(gè)或多個(gè)輸入 輸入就是從外界取得必要的數(shù)據(jù)。一個(gè)算法可以有零個(gè)或多個(gè)輸入。例如:計(jì)算半徑為r的圓的周長和面積。
4、同時(shí)一個(gè)算法可以沒有輸入,例如:計(jì)算出5!是多少。3.1 算法65、有一個(gè)或多個(gè)輸出算法的目的就求解,“解”就是我們想要得到的最終結(jié)果。輸出是同輸入有著某些特定關(guān)系的量。一個(gè)算法得到的最終結(jié)果就是輸出。沒有輸出的算法是沒有意義的。3.1 算法73.1.3 算法設(shè)計(jì)的要求 什么樣的算法是好的算法呢?設(shè)計(jì)算法時(shí)應(yīng)向哪些方面努力呢?一般包括以下這幾個(gè)方面。1、正確性一個(gè)算法應(yīng)當(dāng)能夠解決具體問題。其“正確性”可分為以下幾個(gè)方面:不含邏輯錯(cuò)誤;對(duì)于幾組輸入數(shù)據(jù)能夠得出滿足要求的結(jié)果;對(duì)于精心選擇的典型、苛刻的輸入數(shù)據(jù)都能得到要求的結(jié)果;對(duì)于一切合法的輸入都能輸出滿足要求的結(jié)果;3.1 算法82、可讀性算
5、法應(yīng)該可以用能夠被人理解的形式表示。太復(fù)雜的、不能被程序員所理解的算法難以在程序設(shè)計(jì)中采用。3、健壯性指算法具有抵御“惡劣”輸入信息的能力。當(dāng)輸入數(shù)據(jù)非法時(shí),算法也能適當(dāng)?shù)淖鞒龇磻?yīng)或進(jìn)行處理,而不會(huì)產(chǎn)生莫明其妙的輸出結(jié)果。例如,當(dāng)輸入三個(gè)邊的長度值來計(jì)算三角形的面積時(shí),一個(gè)有效的算法在三個(gè)輸入數(shù)據(jù)不能構(gòu)成一個(gè)三角形時(shí),應(yīng)報(bào)告輸入的錯(cuò)誤,應(yīng)返回一個(gè)表示錯(cuò)誤或錯(cuò)誤性質(zhì)的值并中止執(zhí)行。3.1 算法概述94、效率與低存儲(chǔ)量的需求效率指的是算法執(zhí)行時(shí)間,對(duì)于一個(gè)問題如果有多個(gè)算法可以解決,執(zhí)行時(shí)間短的算法效率高。存儲(chǔ)量需求指算法執(zhí)行進(jìn)程所需要的最大存儲(chǔ)空間。高效率和低存儲(chǔ)量是優(yōu)秀程序員追求的目標(biāo)。效率與
6、低存儲(chǔ)量需求這兩者都與問題規(guī)模有關(guān)。占用存儲(chǔ)量最小、運(yùn)算時(shí)間最少的算法就是最好的算法。3.1 算法概述103.2 算法的常用表示方法算法可以用多種方式來表達(dá)。常用的有自然語言、傳統(tǒng)的流程圖、偽代碼、N-S流程圖、計(jì)算機(jī)語言等。113.2.1 自然語言表示算法(P58)自然語言就是指人們在日常生活中使用的語言,如漢語、英語等。例如:編程計(jì)算圓周長和面積編程思路:輸入圓的半徑rscanf(%f,&r);如果r0)使2*3.14*r,得到的積放在c中 c=2*3.14*r; 使3.14*r*r,得到的積放在area area=3.14*r*r; 3.2 算法的表示方法123.2.2 流程圖(P59)
7、用圖形的方式來表示算法。用一些幾何圖形來代表不同性質(zhì)的操作。常用的流程圖符號(hào): 3.2 算法的表示方法結(jié)構(gòu)化程序設(shè)計(jì)中采用三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),其共同特點(diǎn):P59131、順序結(jié)構(gòu)2、選擇結(jié)構(gòu)3、循環(huán)結(jié)構(gòu)3.2 算法的表示方法14編程計(jì)算圓周長和面積,用流程圖表示的算法如下:3.2 算法的表示方法開始輸入半徑rr0c=2*3.14*r;area=3.14*r*r輸出r,c,area結(jié)束noyes153.2.3 N-S結(jié)構(gòu)流程圖(P61)把流程圖中的流程線完全去掉,全部算法寫在一個(gè)矩形框內(nèi)。 3.2 算法的表示方法 A BAPBP成立AA當(dāng)P成立16編程計(jì)算圓周長和面積,用N
8、-S圖表示的算法如下:3.2 算法的表示方法輸入半徑r r0 yesnoc=2*3.14*r;area=3.14*r*r輸出r,c,area173.2.4 偽代碼表示法(P58)指用介于自然語言和計(jì)算機(jī)語言(語句關(guān)鍵字)之間的文字和符號(hào)來表示算法。例如:編程計(jì)算圓周長和面積編程思路:輸入圓的半徑rscanf(%f,&r);if (r0) 計(jì)算:if (r0) c=2*3.14*r; c=2*3.14*r; area=3.14*r*r area=3.14*r*r; 3.2 算法的表示方法183.2.5 用計(jì)算機(jī)實(shí)現(xiàn)算法用計(jì)算機(jī)解決一個(gè)問題,包括設(shè)計(jì)算法和實(shí)現(xiàn)算法兩個(gè)部分。用自然語言表示了算法,還
9、要將它轉(zhuǎn)換成計(jì)算機(jī)語言程序。 用計(jì)算機(jī)語言描述算法必須嚴(yán)格遵循所用語言的語法規(guī)則。例如:編程計(jì)算圓的周長和面積3.2 算法的表示方法193.2.5 用計(jì)算機(jī)實(shí)現(xiàn)算法#include #define PI 3.14main()float r;double c,area;scanf(%f,&r);c=2*PI*r;area=PI*r*r;printf(r=%f,area=%f,c,area);如果對(duì)一個(gè)問題設(shè)計(jì)好了算法,再用計(jì)算機(jī)語言來表示就非常容易,所以用計(jì)算機(jī)來解決問題,算法設(shè)計(jì)是非常關(guān)鍵的。對(duì)于程序員在編寫解決一較復(fù)雜的問題的程序時(shí),往往要先設(shè)計(jì)解決該問題的算法。203.3 結(jié)構(gòu)化程序設(shè)計(jì)方
10、法要解決實(shí)際問題,編寫程序的步驟是:確定數(shù)學(xué)模型設(shè)計(jì)算法編寫源程序程序編譯運(yùn)行進(jìn)行結(jié)構(gòu)化的程序設(shè)計(jì),采用的方法是(P64):1、自頂向下2、逐步細(xì)化3、模塊化4、結(jié)構(gòu)化編碼 模塊化:是將一個(gè)大任務(wù)分成若干個(gè)較小的任務(wù),較小的任務(wù)又細(xì)分為更小的任務(wù),直到更小的任務(wù)只能解決功能單一的任務(wù)為止,一個(gè)小任務(wù)稱為一個(gè)模塊。213.3 結(jié)構(gòu)化程序設(shè)計(jì)方法在C語言中,模塊化由函數(shù)來實(shí)現(xiàn)?!白皂斚蛳?,逐步細(xì)化”:這種把大任務(wù)分成小任務(wù)的方例例:工資管理系統(tǒng)分解成的模塊結(jié)構(gòu)如下:223.4 C語句概述一個(gè)C語言程序的執(zhí)行部分由語句組成。程序的各種功能(如輸入、輸出、計(jì)算、打印等)也由語句實(shí)現(xiàn)的。C語言的語句可分
11、為:說明語句、表達(dá)式語句、函數(shù)調(diào)用語句、控制語句、復(fù)合語句以及不執(zhí)行任何操作的空語句。1、聲明語句聲明語句用來定義變量的數(shù)據(jù)類型,如:int s,i; /* 說明s,i是整型變量 */2、函數(shù)調(diào)用語句由一個(gè)函數(shù)調(diào)用加一個(gè)分號(hào)構(gòu)成。例:printf(“n Please input an integer to n:”); scanf(“%d”,&n); 233.4 C語句概述3、表達(dá)式語句由一個(gè)表達(dá)式加上一個(gè)分號(hào)構(gòu)成。任何表達(dá)式都可以加上分號(hào)而成為語句。例:s=0;i=1;s=s+i;i=i+2;4、空語句只有分號(hào)的語句。空語句不執(zhí)行任何操作; 245、復(fù)合語句把多個(gè)邏輯上相關(guān)的一組語句用大括號(hào)“
12、”括起來組成的一個(gè)語句稱復(fù)合語句。C語言的編譯系統(tǒng)把復(fù)合語句作為是單條語句對(duì)待。如下所示就是一個(gè)復(fù)合語句:b=c+d; a=e-f; printf(%d%d,b,a); 復(fù)合語句中的各條語句都以分號(hào)“;”結(jié)尾。注意:在大括號(hào)“”之后不要加分號(hào)。3.4 C語句概述256、控制語句用來規(guī)定語句執(zhí)行的順序,共有9種控制語句:if (條件) else 條件語句for (條件) 循環(huán)語句while (條件) 循環(huán)語句do while(條件) 循環(huán)語句continue 結(jié)束本次循環(huán)語句break 結(jié)束循環(huán)語句或結(jié)束switch語句switch (表達(dá)式) 多分支選擇語句goto 標(biāo)號(hào); 轉(zhuǎn)向語句retur
13、n (表達(dá)式)3.4 C語句概述26順序結(jié)構(gòu)舉例bch2_1.c:輸入圓半徑,計(jì)算周長和面積。編程思路:輸入圓的半徑rc=2*3.14*r;area=3.14*r*r選擇結(jié)構(gòu)舉例:改進(jìn)上例,如果輸入的半徑為負(fù),就輸出一段信息,說明輸入數(shù)據(jù)錯(cuò)誤。編程思路:輸入圓的半徑r如果:r0 則c=2*3.14*r;area=3.14*r*r;輸出c,area否則:則輸出“數(shù)據(jù)輸入錯(cuò)誤”,程序結(jié)束;3.3 結(jié)構(gòu)化程序設(shè)計(jì)方法273.3 結(jié)構(gòu)化程序設(shè)計(jì)方法N-S流程圖如下:輸入半徑r r0 yesnoc=2*3.14*r;area=3.14*r*r輸出r,c,area輸出:“輸入數(shù)據(jù)錯(cuò)誤”28源程序ch3_6
14、8.c#include #define PI 3.14main()float r;double c,area;printf(r=);scanf(%f,&r);if (r0) c=2*PI*r;area=PI*r*r;printf(c=%f,area=%fn,c,area);else printf(輸入數(shù)據(jù)必須大于0n);3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)選擇結(jié)構(gòu)的特點(diǎn)是:根據(jù)所給出的條件,決定從給出的操作中選擇一組去執(zhí)行。293.5.1關(guān)系運(yùn)算符和關(guān)系表達(dá)式(描述條件)關(guān)系運(yùn)算符用來比較兩個(gè)操作數(shù)大小關(guān)系的運(yùn)算符。利用關(guān)系運(yùn)算符寫出關(guān)系表達(dá)式,用這種表達(dá)式的結(jié)果去控制計(jì)算的進(jìn)程。1、關(guān)系運(yùn)算符及優(yōu)先級(jí)高
15、:=低:=!=可以對(duì)數(shù)值類型使用這些運(yùn)算符,構(gòu)造出關(guān)系表達(dá)式關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符,高于賦值運(yùn)算符例如:3.24a+b相當(dāng)于c(a+b)a=bc相當(dāng)于a=(bc相當(dāng)于a=(bc)2.關(guān)系表達(dá)式用關(guān)系運(yùn)算符連接起來的表達(dá)式稱為關(guān)系表達(dá)式,C規(guī)定:如果關(guān)系成立,表達(dá)式值為1;關(guān)系不成立表達(dá)式值為0。例: 3.24a+b 若:a=3,b=4,c=9則結(jié)果為:1a=bc若:b=4,c=9 則結(jié)果為:0aA 結(jié)果為:13.5 選擇結(jié)構(gòu)程序設(shè)計(jì)31一個(gè)關(guān)系表達(dá)式不連續(xù)寫一個(gè)以上的關(guān)系運(yùn)算符,例:數(shù)學(xué)關(guān)系:5=3=2判斷變量c的值是否為字母:c=a & c=A & cb)&(xy)ab&xy(a=
16、b)|(x=y)a=b|x=y(!a)|(ab)!a|ab2.邏輯表達(dá)式用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來的式子稱邏輯表達(dá)式.例如:若a=4,b=2,x=6,y=7,則:ab&xy結(jié)果為:0a=b|x=y結(jié)果為:0!a|ab結(jié)果為:13.5 選擇結(jié)構(gòu)程序設(shè)計(jì)34注意:非零為“真”,用1表示;零為“假”,用0表示。例:a&b結(jié)果為:1!5.34結(jié)果為:0例:要判斷某一年是否是閏年,閏年的條件是符合下面二者之一:能被4整除,但不能被100整除;或能被4整除,又能被400整除。若用變量year表示年份,則C語言的表達(dá)式:(year%4=0 & year%100!=0) | year%400=0
17、 注意: P70(2)并不是所有的邏輯運(yùn)算符都被執(zhí)行,只是在必須執(zhí)行下一個(gè)邏輯運(yùn)算符才能求出表達(dá)式的解時(shí),才執(zhí)行該運(yùn)算符。例:x!=0.0 & y=1.0(當(dāng)x=0時(shí),不執(zhí)行y=1.0)3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)35例(p70):求表達(dá)式:a & b & c的解。(1)若a為假,則b和c不必計(jì)算,表達(dá)式的值為假(2)若a為真,b為假,則c不必計(jì)算,表達(dá)式的值為假(3)若a為真,b為真,則計(jì)算c的值例:求表達(dá)式:a | b | c(1)若a為真,則b,c不必計(jì)算,表達(dá)式值為真(2)若a為假,b為真,則c不必計(jì)算,表達(dá)式值為真(3)若a,b為假,則計(jì)算c,若c為真,表達(dá)式值為真。例3-6(P71 c
18、h3_65.c)3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)36#include main()int a,b,c;scanf(%d%d%d,&a,&b,&c);printf(“e=%d,a=%d,b=%d,c=%dn”,+a & b- &+c ,a,b,c);printf(a=%d,b=%d,c=%d,e=%dn,a,b,c, +a & b- & +c);c=a|(a=c)b);printf(a=%d,b=%d,c=%dn,a,b,c);printf(e=%d,a=%d,b=%d,c=%dn, -c|b-|+a ,a,b,c);printf(a=%d,b=%d,c=%d,e=%dn,a,b,c, -c|b-|+a
19、 );3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)輸入數(shù)據(jù):0 0 0373.5.3 if 語句(條件語句)if語句用于描述在一些操作中選擇執(zhí)行。它以一個(gè)邏輯條件的成立與否為條件:區(qū)分兩種不同的執(zhí)行方式;或決定一個(gè)操作的做或者不做;一般格式格式1: if (條件表達(dá)式) 語句;語句的執(zhí)行過程:首先計(jì)算條件表達(dá)式的值值為非0時(shí),執(zhí)行語句;否則什么都不做,執(zhí)行后續(xù)語句。3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)表達(dá)式語句真(非0)假(0)38問題:編程輸入圓半徑,計(jì)算周長和面積(ch3_68.c)。#include #define PI 3.14main()float r;double c,area;printf(r=);scanf(
20、%f,&r);if (r0) c=2*PI*r;area=PI*r*r;printf(c=%f,area=%fn,c,area);3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)表達(dá)式語句真(非0)假(0)39例3.7(CH3_71.C)輸入一個(gè)字符c,若c是字母,則輸出“Yes!”(按F10單步執(zhí)行)#include main()char c;c=getchar();if (c=a & c=A & c=Z)printf(Yes!n);3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)是C是字母?不是輸出“Yes”40課本P73頁例(ch3_67.c):#include main() int s; printf(nInput your sco
21、re:); /*輸入提示信息*/ scanf(%d,&s); printf( n your score=%d ,s); if (x=60) printf(,pass!); /*if x=60,輸出pass!*/3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)413.5 選擇結(jié)構(gòu)程序設(shè)計(jì)例3-10(CH3_69.C)輸入一個(gè)整數(shù),若該數(shù)不為0,則輸出。#include main()int x;scanf(%d,&x);if (x)printf(n x=%d,x);42例3.8(教材P73 ch3_73a.c)編寫程序,求下列分段函數(shù)的值。#include #include void main() float x; do
22、uble z; printf(nx=); scanf(%f,&x); if(x0)z=log(x); printf(z=%fn,z);3.5 選擇結(jié)構(gòu)程序設(shè)計(jì) -1 (x0)43例3.8(3.5):編寫求一元二次方程ax2+bx+c=0的實(shí)數(shù)解的程序。d=b*b-4*a*cd0 否 輸出兩個(gè)不等的實(shí)根是 否 輸出兩個(gè)相等的實(shí)根d=0是 否d0輸出無實(shí)根提示3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)是44#include #include main() int a,b,c; int d; printf(n a=); scanf(%d,&a); printf(n b=); scanf(%d,&b); printf(
23、n c=); scanf(%d,&c); d=b*b-4*a*c; 3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)45if (d0) printf(n x1=%f,(-b+sqrt(d)/(2*a); printf(n x2=%f,(-b-sqrt(d)/(2*a);if (d=0)printf(n x1=x2=%f,(float)(-b)/(2*a);if (d0,則求得兩實(shí)根后,還進(jìn)行后續(xù)判斷嗎?3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)46格式2(P73): if (條件表達(dá)式) 語句1; else 語句2;執(zhí)行過程:先計(jì)算條件表達(dá)式的值值為非0,則執(zhí)行“語句1”,繼續(xù)執(zhí)行下一條語句;否則執(zhí)行“語句2”,結(jié)束。注意:語句1或語
24、句2為多條語句時(shí),要用復(fù)合語句 。例:if (h1.1) price=0; else price=50;3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)473.5 選擇結(jié)構(gòu)程序設(shè)計(jì)例3-9(ch3_9a.c)輸入兩個(gè)數(shù),判斷兩數(shù)是否相等?#include main()int a,b;printf(a=);scanf(%d,&a);printf(b=);scanf(%d,&b);if (a=b)printf(a=bn);elseprintf(a!=bn);說明:P74483.5 選擇結(jié)構(gòu)程序設(shè)計(jì)改進(jìn)求圓周長和面積的源程序ch3_68.c#include #define PI 3.14main()float r;doub
25、le c,area;printf(r=);scanf(%f,&r);if (r0) c=2*PI*r;area=PI*r*r;printf(c=%f,area=%fn,c,area);else printf(輸入數(shù)據(jù)必須大于0n);if (條件表達(dá)式) 語句1; else 語句2;語句1的判斷:條件表達(dá)式后,else之前的所有語句;語句2的判斷:else之后的一條語句。49補(bǔ)例3.6(ch3_6.c):判斷一個(gè)數(shù)是奇數(shù)還是偶數(shù),并把結(jié)果顯示出來.算法設(shè)計(jì):#includemain() int x; printf(nPlease input a integer to x:); scanf(%d,
26、&x); if (x%2=0) /*x是偶數(shù) */ printf(“n%d 是偶數(shù)!,x); else printf(“n %d 是奇數(shù)!,x); 3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)X%2=0503.5 選擇結(jié)構(gòu)程序設(shè)計(jì)練習(xí):(ch3_68a.c)輸入一個(gè)整數(shù),判斷該數(shù)是否為3的倍數(shù),并把結(jié)果顯示出來。#include main()int x;printf(n輸入一個(gè)整數(shù):);scanf(%d,&x);if (x%3=0) printf(n%d是3的倍數(shù)!n,x);elseprintf(n%d不是3的倍數(shù)!n,x);51補(bǔ)例ch3_74.c:由鍵盤輸入兩個(gè)數(shù),編程輸出大者。#include main()
27、float a,b,max;printf(a,b=);scanf(%f%f,&a,&b);if (ab) max=a;elsemax=b;printf(最大者:%fn,max);3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)52補(bǔ)例ch3_74a.c:由鍵盤輸入三角形的三條邊,編程輸出它的面積。#include #include main()float a,b,c;double s,area;printf(a,b,c=);scanf(%f%f%f,&a,&b,&c);if (a+b)c & (a+c)b & (b+c)a) s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c);pr
28、intf(Area:%fn,area);elseprintf(輸入數(shù)據(jù)不能構(gòu)成三角形!n);3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)測試數(shù)據(jù)1:3 4 5測試數(shù)據(jù)2:1 2 153當(dāng)語句部分為復(fù)合語句時(shí),常用的寫法有兩種:if (*) 或*else *3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)if (*) *else * 54 if語句中應(yīng)注意的問題分支語句的復(fù)雜性關(guān)鍵在于表達(dá)式,表達(dá)式通常是邏輯表達(dá)式或關(guān)系表達(dá)式,但是也可以是其它表達(dá)式,甚至也可以是一個(gè)變量。例如: if (a=8); if (c);只要表達(dá)式的值為非0,即為“真”,就執(zhí)行其后的語句。在if語句中的表達(dá)式必須用括號(hào)括起來;如果要想在if語句中滿足條件時(shí)執(zhí)行一
29、組(多個(gè))語句,則必須把這一組語句用括起來組成一個(gè)復(fù)合語句。注意復(fù)合語句的之后不能加分號(hào);else總是與它前面最接近的if配對(duì)。3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)553.5.2 if語句的嵌套問題的提出:改進(jìn)的求一元二次方程ax2+bx+c=0的實(shí)數(shù)解的程序(P81 ch3_7.c)。編程思路:首先求出判別式的值:d=b*b-4*a*c若d0,輸出兩個(gè)實(shí)根,結(jié)束;否則若d=0,輸出兩個(gè)相等的實(shí)根,結(jié)束;否則:輸出沒有實(shí)根,結(jié)束3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)56#include #include main() float a,b,c,d; printf(na,b,c=); scanf(%f%f%f,&a,&b,
30、&c); d=b*b-4*a*c; if (d0) printf(nx1=%f,(-b+sqrt(d)/(a*2); printf(nx2=%f,(-b-sqrt(d)/(a*2); /*語句1*/else if (d=0) printf( n x1=x2=%f,(-b)/(a*2);else printf(n The equation has no real root!);3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)57當(dāng)一個(gè)條件語句的else部分又是一個(gè)條件語句時(shí),通過連續(xù)判斷完成三種情況的分別處理。有多個(gè)分支選擇時(shí),可采用if-else-if語句,其一般形式為(嵌套發(fā)生在else后面):if (條件表達(dá)式1
31、) 語句1; else if(表達(dá)式2) 語句2; else 語句序列3; 3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)語句1223583.5 選擇結(jié)構(gòu)程序設(shè)計(jì)例3.11(P75 CH3_73.C)編程思路: -1 (x0)輸入x x0 真 假z=log(x)z=0593.5 選擇結(jié)構(gòu)程序設(shè)計(jì)#include #include void main() float x; double z; printf(nx=); scanf(%f,&x); if(x0) z=log(x); /*語句2*/ else z=0; /* 語句3*/ printf(z=%fn,z); 603.5.2 if語句的嵌套嵌套發(fā)生在if后面(條
32、件之后直接出現(xiàn)條件語句):if (表達(dá)式1) if (表達(dá)式2) 語句1;else 語句2;else語句1;else總是與它前面最接近的if配對(duì)。P76 另解例3.11(ch3_73b.c)3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)613.5 選擇結(jié)構(gòu)程序設(shè)計(jì)#include #include void main() float x; double z; printf(nx=); scanf(%f,&x); if(x=0) if(x0) z=-1; /*語句1*/ else z=0;/*語句2*/ else z=log(x); /*語句3*/ printf(z=%fn,z);輸入x x=0假 真z=log(x)
33、 x0 真 假Z=-1z=062#include #include main() float a,b,c,d; printf(na,b,c=); scanf(%f%f%f,&a,&b,&c); d=b*b-4*a*c; if (d=0) /*若d=0*/ if (d0) /*若d0*/ printf(nx1=%f,(float)(-b+sqrt(d)/(a*2); printf(nx2=%f,(float)(-b-sqrt(d)/(a*2); else /*否則d=0*/ printf( n x1=x2=%f,(float)(-b)/(a*2);else/*否則d0)if (y1) z=1;e
34、lse z=2; /*這個(gè)else屬于哪個(gè)if?*/C規(guī)定:每個(gè)else部分總屬于前面最近的那個(gè)缺省對(duì)應(yīng)的else部分的if語句。若需要else與第一個(gè)if配對(duì),可以采用下面的寫法:if (x0) if (y1) z=1;else z=2; /*這個(gè)else屬于哪個(gè)if?*/ 3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)64例3-12(P77)寫出下列程序的運(yùn)行結(jié)果。#include main()int a,b,c;a=5;b=3;c=0;if (c)if (ab)printf(n max=%d,a);elseprintf(n max=%d,b);elseprintf(n c=%d,c);3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)
35、653.5.5 條件運(yùn)算符和條件表達(dá)式條件表達(dá)式的一般形式為:表達(dá)式1?表達(dá)式2:表達(dá)式3表達(dá)式的執(zhí)行順序:計(jì)算表達(dá)式1的值,若為非0(條件成立),則計(jì)算表達(dá)式2的值,作為條件表達(dá)式的結(jié)果;若為0(條件不成立),則計(jì)算表達(dá)式3的值,作為條件表達(dá)式的結(jié)果。例:x0?2:3當(dāng)x0時(shí),表達(dá)式的值為2,否則為3表達(dá)式的值依賴于x當(dāng)時(shí)的值,得到的結(jié)果也依賴于x的值說明:P783.5 選擇結(jié)構(gòu)程序設(shè)計(jì)66優(yōu)先級(jí):高于賦值運(yùn)算符,低于算術(shù)和關(guān)系運(yùn)算符例:max=(ab)?a:b相當(dāng)于 max=(ab)?a:b) ab?a:b+1相當(dāng)于 ab?a:(b+1)C規(guī)定:如果有多個(gè)條件表達(dá)式嵌套出現(xiàn),后續(xù)的每個(gè):符
36、號(hào)總與前面最近的沒有配對(duì)的那個(gè)?符號(hào)相匹配。條件運(yùn)算符的結(jié)合方向?yàn)椤白杂抑磷蟆崩簒0?1:x=0?0:-1相當(dāng)于:x0?1:(x=0?0:-1)例:ab?a:cd?c:d相當(dāng)于ab?a:(cd?c:d)if (ab) max=a;else max=b;可以用條件運(yùn)算符來表示為:max=(ab) ? a:b例:求x,y中大者,可使用條件表達(dá)式:xy?x:y3.5 選擇結(jié)構(gòu)程序設(shè)計(jì)673.5.7 選擇結(jié)構(gòu)程序設(shè)計(jì)舉例例3.13(P77ch3_72.c)閱讀下面程序,若輸入為59,則輸出結(jié)果是什么?#include main()int score;char grade;printf(請(qǐng)輸入成績:n
37、);scanf(%d,&score);grade=score=90?A: (score=60?B:C);printf(%d 屬于%cn,score,grade);683.5.7 選擇結(jié)構(gòu)程序設(shè)計(jì)舉例補(bǔ)例(ch3_9.c):編寫程序,求下列分段函數(shù)的值。 ex+y x0,y0 Z= e2*x-y 0 x1,y0 ln x x1程序清單如下:#include #include main() float x,y,z; printf(nx=); scanf(%f,&x); printf(ny=); scanf(%f,&y); if (x0)&(y=0)&(x=0) z=exp(2*x-y); if(x
38、=1) z=log(x); printf(z=%5.2fn,z);69例3.17(ch3_10.c) 輸入兩個(gè)正整數(shù)a,b。b最大不超過三位數(shù),a不大于31。使a在左,b在右,拼成一個(gè)新的數(shù)c。例如a=23,b=30,則c為2330。若a=1,b=15,則c為115。算法分析:抽象分析出以下數(shù)學(xué)模型,決定c的值的計(jì)算公式如下:當(dāng)b為一位數(shù)(b10)時(shí),b作為個(gè)位,c=a*10+b當(dāng)b為二位數(shù)(10=b100 )時(shí),b作為個(gè)位、十位,c=a*100+b當(dāng)b為三位數(shù)(100=b1000)時(shí),c=a*1000+b求c的公式:c=a*k+b。(k的取值可以為:10,100,1000) 3.5.7 選擇
39、結(jié)構(gòu)程序設(shè)計(jì)舉例70算法流程圖 :3.5.7 選擇結(jié)構(gòu)程序設(shè)計(jì)舉例if (b10) k=10;else if (k100) k=100;else if(b1000) k=1000;71程序清單如下:#includemain() int a,b,c,k; printf(nInput two positive integer number:); scanf(%d,%d,&a,&b); if (b10)k=10; else if (b100)k=100; else if (b0,是5位數(shù),否則:b0,是4位數(shù)3、是否回文數(shù):從最高位依次與最低位比較,都相同,是回文數(shù)。 3.5.7 選擇結(jié)構(gòu)程序設(shè)計(jì)舉
40、例73main()int a,b,c,d,e;long x;do printf(請(qǐng)輸入一個(gè)正整數(shù)x:);scanf(%ld,&x);while (x100000);a=x/10000;b=x%10000/1000;c=x%1000/100;d=x%100/10;e=x%10;if (a0) printf(這是5位數(shù),%d %d %d %d %dn,e,d,c,b,a);if (e=a & b=d) printf(這是一個(gè)回文數(shù)n);elseprintf(這不是一個(gè)回文數(shù)n); 74else if (b0) printf(這是4位數(shù),%d %d %d %d n,e,d,c,b);if (e=b
41、& d=c) printf(這是一個(gè)回文數(shù)n);elseprintf(這不是一個(gè)回文數(shù)n); else if (c0) printf(這是3位數(shù),%d %d %dn,e,d,c);if (e=c) printf(這是一個(gè)回文數(shù)n);elseprintf(這不是一個(gè)回文數(shù)n);elseif (d0) printf(這是2位數(shù),%d %dn,e,d);if (e=d) printf(這是一個(gè)回文數(shù)n);elseprintf(這不是一個(gè)回文數(shù)n);elseif (e0) printf(這是1位數(shù),%dn,e); 75習(xí)題3.8(P104)#include #define PI 3.14159main
42、()float x;double z;printf(請(qǐng)輸入x的值:);scanf(%f,&x);if (xb),則a與b中的保存的數(shù)互換。z=a;a=b;b=z再比較a,c的大小,從而找出三個(gè)數(shù)中最小的if (ac),則a與c中的保存的數(shù)互換。z=a;a=c;c=z最后比較b,c的大小,較小者存入b,大者存入cif (bc),則b與c中的保存的數(shù)互換。z=b;b=c;c=z3.5.7 選擇結(jié)構(gòu)程序設(shè)計(jì)舉例77#include main()float a,b,c,w;printf(請(qǐng)輸入a,b,c的值:);scanf(%f%f%f,&a,&b,&c);if (ab)w=a;a=b;b=w;if
43、(ac)w=a;a=c;c=w;if (bc)w=b;b=c;c=w;printf(na,b,c從小到大為%f,%f,%f,a,b,c);3.5.7 選擇結(jié)構(gòu)程序設(shè)計(jì)舉例783.5.6 switch語句(P73)if判斷語句可以實(shí)現(xiàn)兩個(gè)分支的程序流程。但編程中往往要求實(shí)現(xiàn)多個(gè)分支(3個(gè)以上)的程序流程。例3.14 編寫一個(gè)程序,要求輸入學(xué)生的分?jǐn)?shù),輸出其成績的分?jǐn)?shù)段,用A、B、C、D、E分別表示90分以上、8089、7079、6069分和不及格(059分)5個(gè)分?jǐn)?shù)段。793.5.6 switch語句(P73)其一般形式為:switch (表達(dá)式) case 常量表達(dá)式1: 語句1; case
44、常量表達(dá)式2: 語句2; . . default: 語句n+1; 執(zhí)行過程是:首先計(jì)算表達(dá)式的值,然后把該值與各case常量表達(dá)式值逐個(gè)相比較。當(dāng)遇到值相等時(shí),程序就從那里執(zhí)行下去;如找不到,則執(zhí)行default后的語句。若沒有default語句,則退出此開關(guān)語句。注意:switch要求case表達(dá)式的值互不相同80程序代碼段如下(CH3_79A.C):scanf(%d,&score);grade=score/10;switch (grade)case 0:case 1:case 2:case 3:case 4:case 5: printf(grade=E!n); break;case 6:
45、printf(grade=D!n); break;case 7: printf(grade=C!n); break;case 8: printf(grade=B!n); break;case 9: case 10:printf(grade=A!n); break;default: printf(the score is out of range!n);81例:3.8(14):某幼兒園只收26歲的小孩.23歲入小班,4歲入中班,56歲入大班.輸入年齡,要求輸出應(yīng)入什么班.算法分析:1、輸入小孩年齡age2、age=23、4、56,進(jìn)入小、中、大班82程序代碼段如下:scanf(%d,&age);
46、 switch (age) case 2: case 3: printf(n Enter Lower class!); break; /*age=2,3時(shí),共享此代碼段*/ case 4: printf(n Enter Middle class!); break;case 5:case 6: printf(n Enter Higher class!) break; default: printf(n Cant enter!); 83說明(P80)程序在執(zhí)行完畢相應(yīng)的case語句后不能退出,而是繼續(xù)執(zhí)行其后的其它語句。switch中的表達(dá)式的作用為控制程序的流程。它的類型必須與case語句中常量
47、表達(dá)式的類型一致(整型、字符型、枚舉型)。所有常量表達(dá)式的類型必須相同,而它們的值必須不同。若要執(zhí)行完一個(gè)case的語句后,轉(zhuǎn)到switch后的語句去執(zhí)行,則要在該case語句的最后加上break語句(跳轉(zhuǎn)語句),跳轉(zhuǎn)到switch后的語句去執(zhí)行。 3.5.6 switch語句84switch (n) case 1:break;case 2:break;default:break;3.5.6 switch語句85補(bǔ)例(bch3_4.c):輸入年份和月份,顯示該月的天數(shù)。提示:月份為1、3、5、7、8、10、12時(shí),天數(shù)為31天;月份為4、6、9、11時(shí),天數(shù)為30天;月份為2時(shí),如果為閏年天數(shù)為29天,否則為28天(閏年能被4整除,不能被100整除,或年份能被400整除)。編程思路:1、輸入年份(year),月份(month)2、如果month=1,3,5,7,8,10,12,則天數(shù)day=31 如果month=4,6,9,11,則天數(shù)day=30 如果month=2, 如果是閏年:day=29 否則day=28天86main()int year,month,day;printf(輸入年、月);scanf(%d%d,&year,&month);switch (month) case 1:case 3:case 5:case 7:case 8:case 10:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45169-2025增材制造金屬制件殘余應(yīng)力聲束控制法
- GB/T 45142-2025海洋溢油污染生態(tài)修復(fù)監(jiān)測和效果評(píng)估技術(shù)指南
- GB/T 45221-2025化學(xué)品EASZY試驗(yàn)利用轉(zhuǎn)基因tg(cyp19a1b:GFP)斑馬魚胚胎通過雌激素受體檢測內(nèi)分泌活性物質(zhì)
- 鄉(xiāng)村地基出售合同范本
- 2025年鐵嶺考貨運(yùn)從業(yè)資格證
- 2025年永州貨運(yùn)從業(yè)資格證怎么考試
- 加工合同范本道客
- 買車庫出售合同范本
- it購銷合同范本
- 醫(yī)院業(yè)務(wù)合同范本
- 基于核心素養(yǎng)的學(xué)習(xí)觀和教學(xué)觀
- 感染性腹瀉及其防控措施
- 第二篇-安全操作規(guī)程
- 《多維度兒童智力診斷量表》MIDSC的編制
- 罪犯教育學(xué)課程
- 紀(jì)檢監(jiān)察辦案談話應(yīng)注意的問題研討
- 超實(shí)用工程結(jié)算單excel模板
- 一年級(jí)小學(xué)生新學(xué)期開學(xué)計(jì)劃
- ISO9001-2015質(zhì)量手冊和全套程序文件
- 醫(yī)療器械產(chǎn)品放行程序
- 07j306排水溝圖集標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論