C語言復(fù)習(xí)資料4_第1頁
C語言復(fù)習(xí)資料4_第2頁
C語言復(fù)習(xí)資料4_第3頁
C語言復(fù)習(xí)資料4_第4頁
C語言復(fù)習(xí)資料4_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C++語言程序設(shè)計(4)第4章選擇結(jié)構(gòu)程序設(shè)計4.1關(guān)于算法算法的概念做任何事情都有一定的步驟。為解決一個問題而采取的方法和步驟,就稱為算法。計算機(jī)算法:計算機(jī)能夠執(zhí)行的算法。計算機(jī)算法可分為兩大類:數(shù)值運(yùn)算算法:求解數(shù)值;非數(shù)值運(yùn)算算法:事務(wù)管理領(lǐng)域。一個程序應(yīng)包括兩個方面的內(nèi)容:對數(shù)據(jù)的描述:數(shù)據(jù)結(jié)構(gòu)(datastructure)對操作的描述:算法(algorithm)著名計算機(jī)科學(xué)家沃思提出一個公式:數(shù)據(jù)結(jié)構(gòu)+算法=程序

數(shù)據(jù)結(jié)構(gòu)+算法+程序設(shè)計方法+語言工具完整的程序設(shè)計應(yīng)該是:簡單算法舉例

例1求1×2×3×4×5。最原始方法:步驟1:先求1×2,得到結(jié)果2。步驟2:將步驟1得到的乘積2乘以3,得到結(jié)果6。步驟3:將6再乘以4,得24。步驟4:將24再乘以5,得120。這樣的算法雖然正確,但太繁。

改進(jìn)的算法:S1:使t=1S2:使i=2S3:使t×i,乘積仍然放在在變量t中,可表示為t×i→tS4:使i的值+1,即i+1→iS5:如果i≤5,返回重新執(zhí)行步驟S3以及其后的S4和S5;否則,算法結(jié)束。如果計算100!只需將S5:若i≤5改成i≤100即可。如果求1×3×5×7×9×11,算法也只需做很少的改動:S1:1→tS2:3→iS3:t×i→tS4:i+2→tS5:若i≤11,返回S3,否則,結(jié)束。該算法不僅正確,而且是計算機(jī)較好的算法,因?yàn)橛嬎銠C(jī)是高速運(yùn)算的自動機(jī)器,實(shí)現(xiàn)循環(huán)輕而易舉。

例2

有50個學(xué)生,要求將他們之中成績在80分以上者打印出來。如果,n表示學(xué)生學(xué)號,ni表示第個學(xué)生學(xué)號;g表示學(xué)生成績,gi表示第個學(xué)生成績;則算法可表示如下:S1:1→iS2:如果gi≥80,則打印ni和gi,否則不打印S3:i+1→iS4:若i≤50,返回S2,否則,結(jié)束。如果包括這個輸入數(shù)據(jù)的部分,流程圖為

例3

判定2000—2500年中的每一年是否閏年,將結(jié)果輸出。閏年的條件:能被4整除,但不能被100整除的年份;能被100整除,又能被400整除的年份;

設(shè)y為被檢測的年份,則算法可表示如下:S1:2000→yS2:若y不能被4整除,則輸出y“不是閏年”,然后轉(zhuǎn)到S6S3:若y能被4整除,不能被100整除,則輸出y“是閏年”,然后轉(zhuǎn)到S6S4:若y能被100整除,又能被400整除,輸出y“是閏年”否則輸出y“不是閏年”,然后轉(zhuǎn)到S6S5:輸出y“不是閏年”。S6:y+1→yS7:當(dāng)y≤2500時,返回S2繼續(xù)執(zhí)行,否則,結(jié)束。算法的特性

有窮性:一個算法應(yīng)包含有限的操作步驟而不能是無限的。確定性:算法中每一個步驟應(yīng)當(dāng)是確定的,而不能應(yīng)當(dāng)是含糊的、模棱兩可的。有零個或多個輸入。有一個或多個輸出。有效性:算法中每一個步驟應(yīng)當(dāng)能有效地執(zhí)行,并得到確定的結(jié)果。怎樣表示一個算法

(1)用自然語言表示算法除了很簡單的問題,一般不用自然語言表示算法。(2)用流程圖表示算法流程圖表示算法,直觀形象,易于理解。(3)用N-S流程圖表示算法

1973年美國學(xué)者提出了一種新型流程圖:N-S流程圖。順序結(jié)構(gòu):選擇結(jié)構(gòu):循環(huán)結(jié)構(gòu):N-S圖表示算法的優(yōu)點(diǎn)比文字描述直觀、形象、易于理解;比傳統(tǒng)流程圖緊湊易畫。尤其是它廢除了流程線,整個算法結(jié)構(gòu)是由各個基本結(jié)構(gòu)按順序組成的,N--S流程圖中的上下順序就是執(zhí)行時的順序。用N--S圖表示的算法都是結(jié)構(gòu)化的算法,因?yàn)樗豢赡艹霈F(xiàn)流程無規(guī)律的跳轉(zhuǎn),而只能自上而下地順序執(zhí)行。(4)用偽代碼表示算法

偽代碼使用介于自然語言和計算機(jī)語言之間的文字和符號來描述算法。4.2條件判斷

4.2.1關(guān)系運(yùn)算符和關(guān)系表達(dá)式1.關(guān)系運(yùn)算符及其優(yōu)先次序<(小于)<=(小于或等于)>(大于)>=(大于或等于)==(等于)!=(不等于)優(yōu)先級相同(高)優(yōu)先級相同(低)說明:關(guān)系運(yùn)算符的優(yōu)先級低于算術(shù)運(yùn)算符關(guān)系運(yùn)算符的優(yōu)先級高于賦值運(yùn)算符優(yōu)先級舉例c>a+b

等價于c>(a+b)a>b==c等價于(a>b)==ca==b<c等價于a==(b<c)a=b>c等價于a=(b>c)2.關(guān)系表達(dá)式用關(guān)系運(yùn)算符將兩個表達(dá)式(可以是算術(shù)表達(dá)式或關(guān)系表達(dá)式,邏輯表達(dá)式,賦值表達(dá)式,字符表達(dá)式)接起來的式子,稱關(guān)系表達(dá)式例:a>b,a+b>b+c,(a=3)>(b=5),’a’<‘b’,(a>b)>(b<c)關(guān)系表達(dá)式的值是一個邏輯值,即“真”或“假”。例:關(guān)系表達(dá)式a>b的值為“真”,那表達(dá)式的值就為1。C語言中沒有專用的邏輯值,1代表真,0代表假例子a=3,b=2,c=1;a>b值為1(a>b)==c值為1b+c<a值為0d=a>b;=>d值為1f=a>b>c;(“>”運(yùn)算符自左向右結(jié)合,“a>b”值為1,“1>c”值為0,f值為0)1.邏輯運(yùn)算符及其優(yōu)先次序(1)&&(邏輯與)相當(dāng)于其他語言中的AND(2)||(邏輯或)相當(dāng)于其他語言中的OR(3)!(邏輯非)相當(dāng)于其他語言中的NOT例:a&&b若a,b為真,則a&&b為真。

a||b若a,b之一為真,則a||b為真。!a若a為真,則!a為假。優(yōu)先次序:!(非)->&&()->||()邏輯運(yùn)算符中的“&&”和“||”低于關(guān)系運(yùn)算符,“!”高于算術(shù)運(yùn)算符

4.2.2邏輯運(yùn)算符和邏輯表達(dá)式2.邏輯表達(dá)式用邏輯運(yùn)算符將關(guān)系表達(dá)式或邏輯量連接起來的式子就是邏輯表達(dá)式。邏輯表達(dá)式的值應(yīng)該是一個邏輯量“真”或“假”。例:設(shè)a=4,b=5:!a的值為0a&&b的值為1a||b的值為1!a||b的值為14&&0||2的值為1任何非零的數(shù)值被認(rèn)作“真”例:5>3&&8<4-!0

自左向右運(yùn)算

1&&0邏輯值為08<3邏輯值為04-1值為3!0邏輯值為15>3邏輯值為1表達(dá)式值為0在邏輯表達(dá)式的求解中,并不是所有的邏輯運(yùn)算符都要被執(zhí)行。(1)a&&b&&c只有a為真時,才需要判斷b的值,只有a和b都為真時,才需要判斷c的值。(2)a||b||c只要a為真,就不必判斷b和c的值,只有a為假,才判斷b。a和b都為假才判斷c例:(m=a>b)&&(n=c>d)當(dāng)a=1,b=2,c=3,d=4,m和n的原值為1時,由于“a>b”的值為0,因此m=0,而“n=c>d”不被執(zhí)行,因此n的值不是0而仍保持原值1。用邏輯表達(dá)式來表示閏年的條件能被4整除,但不能被100整除。能被4整除,又能被400整除。?答

(year%4==0&&year%100!=0)||year%400==0案

值為真(1)是閏年,否則為非閏年。

4.3if語句1.if語句的三種基本形式(1)if(表達(dá)式)語句例:

if(x>y)printf(“%d”,x);表達(dá)式語句真(非0)假(0)(2)if(表達(dá)式)語句1else語句2例:

if(x>y)printf(“%d”,x);elseprintf(“%d”,y);

條件

語句1

語句2YN

(3)if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2elseif(表達(dá)式3)語句3……elseif(表達(dá)式m)語句melse語句n

例:

if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)cost=0.075;elseif(number>50)cost=0.05;elsecost=0;

4.3if語句

說明:(1)3種形式的if語句中在if后面都有表達(dá)式,一般為邏輯表達(dá)式或關(guān)系表達(dá)式。(2)第二,第三種形式的if語句中,在每個

else前面有一個分號,整個語句結(jié)束處有一個分號。

(3)else不是一個獨(dú)立的語句,一定要和if配合使用;(4)在if和else后面可以只含有一個內(nèi)嵌的操作語句,也可以由多個操作語句,此時用花括號將幾個語句括起來成為一個復(fù)合語句。if(…){…}(無需加分號)else{…}

例子例4.1輸入兩個實(shí)數(shù),按代數(shù)值由小到大的順序輸出這兩個數(shù)。

#include<stdio.h>

voidmain()

{floata,b,t;

scanf(″%f,%f″,&a,&b);

if(a>b)

{t=a;

a=b;

b=t;}

printf(″%5.2f,%5.2f\n″,a,b);}

yna>bT=aA=bB=t

運(yùn)行結(jié)果:3.6,-3.2回車-3.20,_3.60

例4.2輸入三個數(shù)a,b,c,要求按由小到大的順序輸出。Ifa>b將a和b對換Ifa>c將a和c對換Ifb>c將b和c對換a>ba>cb>ca和b交換a和c交換c和b交換yyynn

#include<stdio.h>

voidmain()

{

floata,b,c,t;

scanf(″%f,%f,%f″,&a,&b,&c);

if(a>b)

{t=a;a=b;b=t;}

if(a>c)

{t=a;a=c;c=t;}

if(b>c)

{t=b;b=c;c=t;}

printf("%5.2f,%5.2f,%5.2f\n",a,b,c);

}

2.if語句的嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套。形式:if()

if()語句1 else語句2else

if()語句3 else語句4內(nèi)嵌if

匹配規(guī)則:else總是與它上面的,最近的,統(tǒng)一復(fù)合語句中的,未配對的if語句配對。例:if()

if()語句1else

if()語句2else語句3例:if() {if()語句1}else

if()語句2else語句3當(dāng)if和else數(shù)目不同時,可以加花括號來確定配對關(guān)系。

-1(x<0)例4.3有一個函數(shù)y=0(x=0),編一程序,輸入一個x值,輸出y值。1(x>0)算法1:算法1:

輸入x輸入x

若x<0,則y=-1若x<0,則y=-1

若x=0,則y=0否則: 若x>0,則y=1若x=0,則y=0

輸出y若x>0,則y=1

輸出y

#include<stdio.h>voidmain(){

intx,y;

scanf(“%d”,&x);{

程序段}

printf(“x=%d,y=%d\n”,x,y);}

上例中的程序段有四個,請判斷哪個是正確的?程序1:程序2:

if(x<0)if(x>=0)y=-1;if(x>0)y=1;elseelsey=0;

if(x==0)y=0;elsey=-1;elsey=1;程序3:程序4:y=-1;y=0;

if(x!=0)if(x>=0)

if(x>0)y=1;if(x>0)y=1;elsey=0;elsey=-1;正確正確程序3和4錯誤,本意與實(shí)際配對關(guān)系不符合4.4.3條件運(yùn)算符格式:表達(dá)式1?表達(dá)式2∶表達(dá)式3功能:判斷表達(dá)式1的值,如果成立就執(zhí)行表達(dá)式2,否則就執(zhí)行表達(dá)式3使用場合:若在if語句中,當(dāng)被判別的表達(dá)式的值為“真”或“假”時,都執(zhí)行一個賦值語句且向同一個變量賦值時,可以用一個條件運(yùn)算符來處理。

例:

if(a>b)max=a;elsemax=b;當(dāng)a>b時將a的值賦給max,當(dāng)a≤b時將b的值賦給max,可以看到無論a>b是否滿足,都是向同一個變量賦值??梢杂孟旅娴臈l件運(yùn)算符來處理:max=(a>b)?a∶b;

說明:(1)條件運(yùn)算符的執(zhí)行順序:先求解表達(dá)式1,若為非0(真)則求解表達(dá)式2,此時表達(dá)式2的值就作為整個條件表達(dá)式的值。若表達(dá)式1的值為0(假),則求解表達(dá)式3,表達(dá)式3的值就是整個條件表達(dá)式的值。

(2)條件運(yùn)算符優(yōu)先級高于賦值運(yùn)算符,低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符。

max=(a>b)?a:b

max=a>b?a:b

a>b?a:b+1a>b?a:(b+1)

(3)條件運(yùn)算符的結(jié)合方向?yàn)椤白杂抑磷蟆薄?/p>

a>b?a:c>d?c:d相當(dāng)于a>b?a:(c>d?c:d)(4)“表達(dá)式2”和“表達(dá)式3”不僅可以是數(shù)值表達(dá)式,還可以是賦值表達(dá)式或函數(shù)表達(dá)式。a>b?(a=100):(b=100)a>b?printf(“%d”,a):printf(“%d”,b)

(5)條件表達(dá)式中,表達(dá)式1的類型可以與表達(dá)式2和表達(dá)式3的類型不同。x?’a’:’b’表達(dá)式2和表達(dá)式3類型也可以不一樣,例如x>y?1:1.5當(dāng)x≤y,表達(dá)式值為1.5,當(dāng)x>y時,值應(yīng)為1,但由于1.5為實(shí)型,所以將1轉(zhuǎn)換為1.0

例4.4輸入一個字符,判別它是否大寫字母,如果是,將它轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。然后輸出最后得到的字符。

#include<stdio.h>

voidmain()

{charch;

scanf("%c",&ch);

ch=(ch>='A'&&ch<='Z')?(ch+32):ch;

printf("%c\n",ch);

}

如果字符變量ch的值為大寫字母,則條件表達(dá)式的值為(ch+32),即相應(yīng)的小寫字母。如果ch的值不是大寫字母,則條件表達(dá)式的值為ch,即不進(jìn)行轉(zhuǎn)換。

4.4switch語句switch語句的格式:switch

(表達(dá)式){case常量表達(dá)式1:語句1

case常量表達(dá)式2:語句2

…case常量表達(dá)式n:語句n

default:語句n+1}

例:要求按照考試成績的等級輸出百分制分?jǐn)?shù)段,用switch語句實(shí)現(xiàn):

switch(grade){case′A′∶printf(″85~100\n″);

case′B′∶printf

(″70~84\n″);

case′C′∶printf

(″60~69\n″);

case′D′∶printf

(″<60\n″);

default∶(printf″error\n″);}

說明:

switch后面括弧內(nèi)的“表達(dá)式”,ANSI標(biāo)準(zhǔn)允許它為任何類型。(2)

當(dāng)表達(dá)式的值與某一個case后面的常量表達(dá)式的值相等時,就執(zhí)行此case后面的語句,若所有的case中的常量表達(dá)式的值都沒有與表達(dá)式的值匹配的,就執(zhí)行default后面的語句。(3)每一個case的常量表達(dá)式的值必須互不相同,否則就會出現(xiàn)互相矛盾的現(xiàn)象(對表達(dá)式的同一個值,有兩種或多種執(zhí)行方案)。

(4)各個case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。例如,可以先出現(xiàn)“default:…”,再出現(xiàn)“case′D′:…”,然后是“case′A′:…”。(5)

執(zhí)行完一個case后面的語句后,流程控制轉(zhuǎn)移到下一個case繼續(xù)執(zhí)行。“case常量表達(dá)式”只是起語句標(biāo)號作用,并不是在條件判斷。在執(zhí)行switch語句時,根據(jù)switch后面表達(dá)式的值找到匹配的入口標(biāo)號,就從此標(biāo)號開始執(zhí)行下去,不再進(jìn)行判斷。應(yīng)該在執(zhí)行一個case分支后,可以用一個

break語句來終止switch語句的執(zhí)行。

(6)多個可以共用一組執(zhí)行語句。

程序舉例例4.5寫程序,判斷某一年是否閏年。 用下圖來表示判斷閏年的算法。

4.5程序舉例#include<stdio.h>

voidmain()

{intyear,leap;

scanf("%d",&year);

if(year%4==0)

{if(year%100==0)

{if(year%400==0)leap=1;

elseleap=0;}

elseleap=1;}

elseleap=0;

if(leap)printf("%dis",year);

elseprintf("%disnot",year);

printf("aleapyear.\n");}if(year%4!=0)leap=0;elseif(year%100?。剑埃欤澹幔穑剑保唬澹欤螅澹椋妫ǎ澹幔颍ィ矗埃埃。剑埃欤澹幔穑剑?;elseleap=1;運(yùn)行情況:

1989↙

1989isnotaleapyear.

2000↙

2000isaleapyear.程序舉例例4.6求ax2+bx+c=0方程的解?;镜乃惴ǎ孩伲幔剑埃皇嵌畏匠?。②b2-4ac=0,有兩個相等實(shí)根。③b2-4ac>0,有兩個不等實(shí)根。④b2-4ac<0,有兩個共軛復(fù)根。

#include<stdio.h>

#include<math.h>

voidmain()

{floata,b,c,disc,x1,x2,realpart,imagpart;

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

printf("theequation");

if(fabs(a)<=1e-6)

printf("isnotaquadratic\\n");

else

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

if(fabs(disc)<=1e-6)

printf("hastwoequalroots:%8.4f\n",-b/(2*a));

elseif(disc>1e-6)

{x1=(-b+sqrt(disc))/(2*a);

x2=(-b-sqrt(disc))/(2*a);

printf(″hasdistinctrealroots:%8.4fand%8.4f\n″,x1,x2);

}

else

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

imagpart=sqrt(-disc)/(2*a);

printf(″hascomplexroots∶\n″);

printf(″%8.4f+%8.4fi\n″,realpart,imagpart);

printf(″%8.4f-%8.4fi\n″,realpart,imagpart);

}

}}

程序舉例例4.7運(yùn)輸公司對用戶計算運(yùn)費(fèi)。路程(s)越遠(yuǎn),每公里運(yùn)費(fèi)越低。標(biāo)準(zhǔn)如下:s<250km沒有折扣250≤s<500

溫馨提示

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

評論

0/150

提交評論