




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章程序的控制結(jié)構(gòu)第4章本章學習內(nèi)容算法的描述方法常用算法(累加累乘、統(tǒng)計、遞推迭代、窮舉)選擇結(jié)構(gòu)及相關(guān)控制語句循環(huán)結(jié)構(gòu)及相關(guān)控制語句結(jié)構(gòu)化程序設(shè)計的基本思想Skill:MapproblemtosolutioninflowchartandpseudocodeformsBeabletodevelopaprogramcontainingselectionandloopcontrolstructure本章學習內(nèi)容算法的描述方法算法(Algorithm)的概念
數(shù)據(jù)結(jié)構(gòu)+算法=程序算法:為解決一個具體問題而采取的確定的有限的操作步驟,僅指計算機能執(zhí)行的算法Aspecificandstep-by-stepsetofinstructionsforcarryingoutaprocedureorsolvingaproblem,usuallywiththerequirementthattheprocedureterminateatsomepoint算法(Algorithm)的概念數(shù)據(jù)結(jié)構(gòu)+算法=算法的特性
有窮性在合理的時間內(nèi)完成確定性,無歧義
如果x≥0,則輸出Yes;如果x≤0,則輸出No;有效性
能有效執(zhí)行負數(shù)開平方?jīng)]有輸入或有多個輸入
有一個或多個輸出
算法的特性有窮性算法的分類
數(shù)值運算算法:解決求數(shù)值解問題非數(shù)值運算算法:需要用分析推理、邏輯推理才能解決的問題例如人工智能中的許多問題,查找、分類等算法的分類數(shù)值運算算法:算法的表示方法自然語言描述傳統(tǒng)流程圖(Flowchart)在1966年,Bohra與Jacopini提出N-S結(jié)構(gòu)化流程圖1973年,美國學者I.Nassi和B.Shneiderman提出偽碼(Pseudocode)表示算法的表示方法自然語言描述描述算法和實現(xiàn)算法注意:描述算法和實現(xiàn)算法是兩個不同的概念。描述算法只是用一種語言表示出來,但只有運行程序才能實現(xiàn)算法;實現(xiàn)算法:用計算機語言表示算法并在計算機上調(diào)試、運行、得出正確的結(jié)果。用計算機語言表示算法必須嚴格遵循所用語言的語法規(guī)則。描述算法和實現(xiàn)算法注意:描述算法和實現(xiàn)算法是兩個不同的概念。流程圖(Flowchart)Flowchartrepresentsalgorithmgraphically.Start/EndSymbolSemanticProcessInput/OutputTestConnectorFlowofactivities流程圖(Flowchart)Flowchartrepres問題求解步驟
(ProblemSolvingProcess)InputProcessOutputFirstidentifytheinputandoutputoftheproblem.問題求解步驟
(ProblemSolvingProcesExample1:買蘋果,計算價錢Calculateanddisplaythepriceofanumberofapplesifthequantityinkgandpriceperkgaregiven.
quantitypricePerkgpriceprice=quantity*pricePerkgInputProcessOutputExample1:買蘋果,計算價錢Calculatean流程圖(Flowchart):
CalculatePriceofApplesInputquantity
Startpricequantity*pricePperkgInputpricePerkgOutputpriceEndIfnecessary,use‘Divide&Conquer’strategytodecomposetheproblemintosmallerandmanageablesubproblems.流程圖(Flowchart):
CalculatePrimain(){scanf("%d",&quantity);scanf("%d",&pricePerkg);price=quantity*pricePerkg;printf("%d",price);}CProgram:CalculatePriceofApplesInputquantity
Startpricequantity*pricePperkgInputpricePerkgOutputpriceEndIt’snotcomplete!Declarethevariables…main()CProgram:CalculatePrmain(){intquantity,price_per_kg,price;scanf("%d",&quantity);scanf("%d",&pricePerkg);price=quantity*pricePerkg;printf("%d",price);}CProgram:CalculatePriceofApplesInputquantity
Startpricequantity*pricePperkgInputpricePerkgOutputpriceEndWelldone!But…whatarethey?main()CProgram:CalculatePrmain(){intquantity,price_per_kg,price;scanf("%d",&quantity);scanf("%d",&pricePerkg);price=quantity*pricePerkg;printf("%d",price);}CProgram:CalculatePriceofApplesInputquantity
Startpricequantity*pricePperkgInputpricePerkgOutputpriceEndStartDeclaration}InputProcessOutputEndmain()CProgram:CalculatePrAnoutlineofaprogram,writteninaformthatcaneasilybeconvertedintorealprogrammingstatements.Itresemblestheactualprogramthatwillbeimplementedlater.However,itcannotbecompilednorexecuted.偽碼(Pseudocode)1.Start2.Readquantity3.Readprice_per_kg4.
price
quantity*price_per_kg5.Printprice6.EndPseudocodenormallycodesthefollowingactions:
InitialisationofvariablesAssignmentofvaluestothevariablesArithmeticoperationsRelationaloperationsAnoutlineofaprogram,writt順序結(jié)構(gòu)ABab順序結(jié)構(gòu)ABab順序(Sequence)結(jié)構(gòu)的NS圖給變量賦值賦值表達式語句
賦值表達式;
price=quantity*pricePerkg;輸入輸出數(shù)據(jù)標準庫函數(shù)調(diào)用語句
scanf("%d",&pricePerkg);
printf("%d",price);NS圖BA順序(Sequence)結(jié)構(gòu)的NS圖給變量賦值NS圖BAExample2:
CalculatetheMinimum計算兩個數(shù)中的最小者.
num1num2min????InputProcessOutputExample2:
CalculatetheMini選擇結(jié)構(gòu)ABabpYN當p為“真”當p為“假”選擇結(jié)構(gòu)ABabpYN當p為“真”當p為“假”ABNY條件PBNAY條件P選擇結(jié)構(gòu)(分支結(jié)構(gòu))
(SelectionStructure)NS圖傳統(tǒng)流程圖ABNY條件PBNAY條件P選擇結(jié)構(gòu)(分支結(jié)構(gòu))
(SNoYesFlowchart:CalculatetheMinimumInputnum1Inputnum2Outputminnum1<num2?minnum2minnum1
StartEndNoYesFlowchart:Calculatethescanf("%d%d",&num1,&num2);if(num1<num2)min=num1;elsemin=num2;printf("%d",min);NoYesInputnum1Inputnum2Outputminnum1<num2?minnum2minnum1
StartEndCProgram:CalculatetheMinimumscanf("%d%d",&num1,&num2);if(main(){
intnum1,num2,min;scanf("%d%d",&num1,&num2);
if(num1<num2) min=num1;
else min=num2;printf("%d",min);}}
SelectionStructureCProgram:CalculatetheMinimummain()}SelectionStructureCif-elseSingleSelectionDoubleSelectionMultipleSelectionifif–else-if選擇結(jié)構(gòu)(分支結(jié)構(gòu))
(SelectionStructure)if-elseSingleSelectionDoubl單分支選擇結(jié)構(gòu)
(SingleSelection)StepaconditionStepmStepnStepxtruefalsestepaconditionstepmstepnstepbtruefalsePseudocodeStructurestepaif<conditionistrue>start stepm stepnend_ifstepb單分支選擇結(jié)構(gòu)
(SingleSelection)StepifStatementThestructureissimilartosingleselection(flowchart)Syntax:
if
(expression) statement;or
if
(expression){ statement1; statement2; }復合語句compoundstatement被當作一條語句看待ifStatementThestructureissifStatementThestructureissimilartosingleselection(flowchart)Syntax:
if
(expression) statement;or
if
(expression){ statement1; statement2; }Don’tforgetthebraces
!!Don’tforgettheparentheses
!!ifStatementThestructureissif
StatementThesimilaritybetweensingleselectionstructureandif
statement:SingleSelectionPseudocode
:if<conditionistrue>start step1 step2 … stepkend_ifif
Statement:if(expression){ statement1 statement2 … statementk}表達式非0為真ifStatementThesimilaritybetifStatementmain(){intnum1,num2,min;printf(“Input2numbers:“);scanf(“%d%d”,&num1,&num2);min=num1;
if(num1>num2) min=num2;printf(“Smallest:%d\n”,min);}Input2numbers:_num2?num1?min?Input2
numbers:2015_20152015Input2numbers:2015Smallest:15_20>15?ifStatementmain()Input2numifStatementExample:main(){ intmark;
scanf(“%d”,&mark); if(mark>=60) printf(“Pass\n”); printf(“Yourmarkis%d”,mark);}Whatwilltheoutputbeifthemarkis65?ifStatementExample:WhatwillifStatementExample:main(){ intmark;
scanf(“%d”,&mark); if(mark>=60) printf(“Pass\n”); printf(“Yourmarkis%d”,mark);}Whatwilltheoutputbeifthemarkis35?ifStatementExample:Whatwill雙分支選擇結(jié)構(gòu)
(DoubleSelection)PseudocodeStructureStepaif<conditionistrue>start Stepm Stepnend_ifelsestart Stepx Stepyend_elseStepzStepaconditionStepmStepnStepztruefalseStepxStepyStepaconditionStepmStepnStepbtruefalseStepxStepy雙分支選擇結(jié)構(gòu)
(DoubleSelection)Psif-else
StatementThestructureissimilartodoubleselection(flowchart)Syntax:
if(expression)
statement;
else
statement;or
if
(expression){ statement1; statement2; }
else
statement3;or
if
(expression)
{ statement1; statement2;}
else
{ statement3; statement4;}if-elseStatementThestructuif-else
StatementThesimilaritybetweendoubleselectionstructureandif-elsestatement:DoubleSelectionPseudocode:if<conditionistrue>start step1 … stepkend_ifelsestart step1 … stepnend_elseif
Statement:if(expression)
{ statement1 … statementk}else{ statement1 … statementn}if-elseStatementThesimilarif-elseStatementExample:if(num1<num2) min=num1;else min=num2;printf(“Smallest:%d\n”,min);num215num110min?10<15?_10Smallest:10_if-elseStatementExample:nuif-elseStatementExample:if(num1<num2) min=num1;else min=num2;printf(“Smallest:%d\n”,min);num215num120min?20<15?_15Smallest:15_if-elseStatementExample:nuif-elseStatementif(num1<num2){ min=num1; max=num2;}else{ min=num2; max=num1;}printf(“Min=%d,Max=%d\n”,min,max);num2125num1700min??700<125?_max??Min=125,Max=700_125700if-elseStatementif(num1<【例】:求一個整數(shù)的絕對值main(){inta,absa;
printf(“enteronenumber:”);
scanf(“%d”,&a);
absa=a;
if(a<0)absa=-a;
printf(“|%d|=%d”,a,absa);}{}【例】:求一個整數(shù)的絕對值main(){}if(x>0) printf("x>0\n"); x++;elseprintf("x<=0\n");看作是一條單獨的語句,而不把它作為if語句的一部分然后會認為else沒有所屬的ifif(x>0)看作是一條單獨的語句,而不把它作為if條件表達式含義:如果表達式1的值非0(為真),則該條件表達式的結(jié)果就是表達式2的值否則,是表達式3的值
表達式3N表達式2Y表達式1表達式1?表達式2:表達式3條件表達式含義:表達式3N表達式2Y表達式1表達式1?條件運算符計算最小值if(num1<num2) min=num1;else min=num2;printf(“Smallest:%d\n”,min);min=num1<num2
?
num1
:num2;printf(“Smallest:%d\n”,min);表達式1?表達式2:表達式3條件運算符計算最小值if(num1<num2)min[例]從鍵盤上輸入一個字符,如果它是大寫字母,則把它轉(zhuǎn)換成小寫字母輸出;否則,直接輸出。main(){charch;printf("Inputacharacter:");scanf("%c",&ch);ch=(ch>='A'&&ch<='Z')?(ch+32):ch;printf("ch=%c\n",ch);} [例]從鍵盤上輸入一個字符,如果它是大寫字母,則把它Let’srecap…SingleSelectionStatement stepa
if
(expression){ stepm stepn } stepbSingleSelectionLet’srecap…SingleSelectionLet’srecap…PseudocodeStructure stepa if<conditionistrue>start stepm stepn end_if stepbSingleSelectionDoubleSelectionStatement
stepa
if(expression){ stepm stepn }
else
{ stepx stepy } stepbDoubleSelectionGuess…h(huán)owdoesmultipleselectionlooklike?Let’srecap…PseudocodeStruct多分支選擇結(jié)構(gòu)(MultipleSelection)Multi-wayifStepaif
(expression1){ Stepm}if
(expression2)
{ Stepn}StepzStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepaexpression1StepmStepnStepztruefalseexpression2truefalse多分支選擇結(jié)構(gòu)(MultipleSelection)Mul多分支選擇結(jié)構(gòu)(MultipleSelection)CascadedifStepaif
(expression1){ Stepm}elseif(expression2){ Stepn}
else
{ Stepx}StepzStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepxStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepx多分支選擇結(jié)構(gòu)(MultipleSelection)Caselse-ifif的一種擴展形式——相當于else分支嵌套if(表達式1)
語句1;
elseif(表達式2)
語句2;
elseif(表達式3)
語句3;
…………
else
語句4;
語句5;表達式1
語句1語句2語句3語句4表達式2表達式3
圖4-9多分支選擇結(jié)構(gòu)語句1;語句2;語句3;語句4;else-ifif的一種擴展形式——相當于else分支嵌套表例:體型判斷按“體指數(shù)”對肥胖程度進行劃分:
體指數(shù)t=w/h2
(體重w單位為公斤,身高h單位為米)當t<18時,為低體重;當18≤t<25時,為正常體重;當25<t<27時,為超重體重;當t≥27時,為肥胖。編程從鍵盤輸入你的身高h和體重w,根據(jù)給定公式計算體指數(shù)t,然后判斷你的體重屬于何種類型。用3種方法編程:算法1:用不帶else子句的if語句編程算法2:用在if子句中嵌入if語句的形式編程算法3:用在else子句中嵌入if語句的形式編程例:體型判斷按“體指數(shù)”對肥胖程度進行劃分:例
用不帶else子句的if語句編程#include<stdio.h>main(){
floath,w,t; printf("Pleaseenterh,w:"); scanf("%f,%f",&h,&w); t=w/(h*h);
if(t<18) { printf("t=%f\tLowerweight!\n",t); }
if(t>=18&&t<25) { printf("t=%f\tStandardweight!\n",t); }
if(t>=25&&t<27) { printf("t=%f\tHigherweight!\n",t); }
if(t>=27) { printf("t=%f\tToofat!\n",t); }}當t<18時,為低體重;當18≤t<25時,為正常體重;當25<t<27時,為超重體重;當t≥27時,為肥胖。例用不帶else子句的if語句編程#include<s例
用在if子句中嵌入if語句的形式編程
#include<stdio.h>main(){
floath,w,t; printf("Pleaseenterh,w:"); scanf("%f,%f",&h,&w); t=w/(h*h);
if(t<27) {
if(t<25) {
if(t<18)printf("t=%f\tLowerweight!\n",t);
elseprintf("t=%f\tStandardweight!\n",t); }
elseprintf("t=%f\tHigherweight!\n",t); }
elseprintf("t=%f\tToofat!\n",t);}182527當t<18時,為低體重;當18≤t<25時,為正常體重;當25<t<27時,為超重體重;當t≥27時,為肥胖。例用在if子句中嵌入if語句的形式編程#include例
用在else子句中嵌入if語句的形式編程
#include<stdio.h>main(){
floath,w,t; printf("Pleaseenterh,w:"); scanf("%f,%f",&h,&w); t=w/(h*h);
if(t<18)
printf("t=%f\tLowerweight!\n",t);
elseif(t<25) printf("t=%f\tStandardweight!\n",t);
elseif(t<27) printf("t=%f\tHigherweight!\n",t);
else printf("t=%f\tToofat!\n",t);}當t<18時,為低體重;當18≤t<25時,為正常體重;當25<t<27時,為超重體重;當t≥27時,為肥胖。182527例用在else子句中嵌入if語句的形式編程#includif語句的嵌套if語句的各子句都可以又是if語句應(yīng)注意if-else的配對關(guān)系else總是與其上面最近的if配對可以用{}明確if-else的配對關(guān)系嵌套的層數(shù)不宜太多。在實際編程時,應(yīng)適當控制嵌套層數(shù)(2~3層)if語句的嵌套if語句的各子句都可以又是if語句if語句的嵌套if(expr1)if(expr2)語句1else語句2elseif(expr3)語句3
else語句4內(nèi)嵌if內(nèi)嵌if當內(nèi)嵌if語句不包含else語句時,容易出錯。if(expr1)if(expr2)語句1elseif(expr3)語句3
else語句4內(nèi)嵌if若if與else數(shù)目不一樣時,為實現(xiàn)程序設(shè)計者本來的意圖,可以加花括號來確定匹配關(guān)系if語句的嵌套if(expr1)內(nèi)嵌if內(nèi)嵌if當內(nèi)嵌if例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);實現(xiàn)if~else正確配對方法:加{}例:if(a==b)修改:if(a==b)實現(xiàn)ifIf…else…配對規(guī)則可能產(chǎn)生的“副作用”問題:有如下符號函數(shù),要求輸入不同的x的值能輸出正確的符號數(shù)。
算法思路1:先可以用簡單的if語句實現(xiàn),用三個if語句就可以。
算法思路2:要求用簡單的if…else…語句實現(xiàn),參閱以下幾個程序,請分析他的正確性,如果結(jié)果有錯,請分析出錯原因。
If…else…配對規(guī)則可能產(chǎn)生的“副作用”問題:有如下符號程序1:√程序2:√
if(x>=0)if(x<0)y=-1;if(x>0)y=1;elseif(x==0)y=0;elsey=0;elsey=1;elsey=-1;程序3:輸入x=0驗證程序4:輸入x=-5驗證
y=-1;y=0;if(x!=0)/*不滿足*/if(x>=0)/*不滿足*/if(x>0)y=1;if(x>0)y=1;elsey=0;elsey=-1;程序1:√補足程序段--1
輸入兩個整數(shù),按從小到大的順序輸出它們。t=a;a=b;b=t;#include<stdio.h>main(){inta,b,t;scanf("%d,%d",&a,&b);if(a>b){ }printf("%d,%d",a,b);}補足程序段--1輸入兩個整數(shù),按從小到大的a=a+b;b=a-b;a=a-b;條件語句舉例--1#include<stdio.h>main(){inta,b;scanf("%d,%d",&a,&b);if(a>b){ }printf("%d,%d",a,b);}a=a+b;b=a-b;a=a-b;條件語句舉例--1#條件語句舉例--1a>b?b:a,a>b?a:b#include<stdio.h>main(){inta,b;scanf("%d,%d",&a,&b);printf("%d,%d", );}條件語句舉例--1a>b?b:a,a>b?a:b#incl
輸入三個整數(shù),按從小到大的順序輸出它們。#include<stdio.h>main(){inta,b,c,t;scanf("%d,%d,%d",&a,&b,&c);if(a>b){
}if(a>c){
}if(b>c){
}printf("%d,%d,%d",a,b,c);}t=a;a=b;b=t;t=a;a=c;c=t;t=b;b=c;c=t;輸入三個整數(shù),按從小到大的順序#inclu61例:讀入一個整數(shù),判斷其能否被3整除。#include<stdio.h>main(){inta;printf("Enteraninteger");scanf("%d",&a);/*輸入一個整數(shù)*/if(a%3==0)/*判斷能否被3整除并輸出相應(yīng)信息*/printf("%d%%3==0\n",a);elseprintf("%d%%3!=0\n",a);}61例:讀入一個整數(shù),判斷其能否被3整除。#include例:輸入三角形的三個邊長,求出三角形的面積。#include”math.h”main(){floata,b,c;floatarea,s;/*s為三角形的半周長*/printf(“請輸入三角形的三邊a,b,c:”);scanf(“%f%f%f”,&a,&b,&c);if(a+b>c&&a+c>b&&b+c>a)/*判斷輸入的a,b,c能否構(gòu)成三角形*/{s=(a+b+c)/2.0;/*求出三角形的半周長*/area=sqrt(s*(s-a)*(s-b)*(s-c));printf(“三角形面積area=%f”,area);}}例:輸入三角形的三個邊長,求出三角形的面積。#includeif語句的說明1.表達式既可以是關(guān)系表達式、邏輯表達式,也可以是數(shù)值類型表達式。當為0時,為假值;非0為真值。2.關(guān)系運算符==不能寫成賦值運算符=。3.在if語句和else語句中若有多個操作語句,則應(yīng)用花括號{和}將它們括起成為一個復合語句。4.注意:一般情況下這樣使用if是錯誤的:
if(表達式);
語句序列;if語句的說明1.表達式既可以是關(guān)系表達式、邏輯表達式,也輸入星期中的某一天,顯示對應(yīng)的英文#include<stdio.h>main(){inti;printf(“Input1-7:”);scanf(“%d”,&i);if(i==1)printf(“TodayisMonday!\n”);elseif(i==2)printf(“TodayisTuesday!\n”);elseif(i==3)printf(“TodayisWednesday!\n”);elseif(i==4)printf(“TodayisThursday!\n”);elseif(i==5)printf(“TodayisFriday!\n”);elseif(i==6)printf(“TodayisSaturday!\n”);elseprintf(“TodayisSunday!\n”);}此例似顯復雜,是否有更好的辦法?輸入星期中的某一天,顯示對應(yīng)的英文#include<stdi功能開關(guān)語句就像多路開關(guān)一樣,程序可根據(jù)一個表達式可能產(chǎn)生的不同結(jié)果值,選擇其中一個——獨立分支結(jié)構(gòu),或幾個分支的語句——非獨立分支結(jié)構(gòu)去執(zhí)行。有了if語句,為什么還要switch語句?
功能開關(guān)語句就像多路開關(guān)一樣,程序可根據(jù)有了if語句,多路選擇(switch)
and
break
Thestructureissimilartomultipleselection(flowchart)switch(expression){
case
value1:
statement1; break;
case
value2:
statement2; break;
…
default:
statementX; break;}Don’tforgetthebraces!!Don’tforgetthecolons!!Don’tforgettheblank!!
多路選擇(switch)andbreakThestrImportantRule!!switch(expression){
case
value1:
statement1; break;
case
value2:
statement2; break;
…
default:
statementX; break;}Mustbeintorchar!多路選擇(switch)
and
break
ImportantRule!!switch(expre流程圖:表達式e?語句序列S1;
break;語句序列S2;
break;語句序列S3;
break;語句序列S;………a1defaulta3a2case流程圖:表達式e?語句序列S1;語句序列S2;語句序列S3;Example:switch(month){ case1: printf(“January\n”); break; case2: printf(“February\n”); break; case3: printf(“March\n”); break; default: printf(“Others\n”); break; } printf(“End”);Assumemonth=1,so……thisstepwillbeexecuted.Later……caseisterminatedhere.Jumpto…January_JanuaryEnd_多路選擇(switch)
and
break
Example:switch(month){AssumExample:switch(month){ case1: printf(“January\n”); break; case2: printf(“February\n”); break; case3: printf(“March\n”); break; default: printf(“Others\n”); break; } printf(“End”);…thisstepwillbeexecuted.Later…March_MarchEnd_Assumemonth=3,so……caseisterminatedhere.Jumpto…多路選擇(switch)
and
break
Example:switch(month){…thisExample:switch(month){ case1: printf(“January\n”); break; case2: printf(“February\n”); break; case3: printf(“March\n”); break; default: printf(“Others\n”); break;}printf(“End”);Now…whatwillhappenifthisbreakistakenoutfromtheprogram?多路選擇(switch)
and
break
Example:switch(month){Now…wExample:switch(month){ case1: printf(“January\n”); break; case2: printf(“February\n”);
case3: printf(“March\n”); break; default: printf(“Others\n”); break; } printf(“End”);Nomore!!多路選擇(switch)
and
break
Example:switch(month){NomoExample:switch(month){ case1: printf(“January\n”); break; case2: printf(“February\n”);
case3: printf(“March\n”); break; default: printf(“Others\n”); break; } printf(“End”);…thisstepwillbeexecuted.Later…February_March_Assumemonth=2,so……caseisterminatedhere.Jumpto…End_…executioncontinues.Thus,thisstepisexecuted.So…多路選擇(switch)
and
break
Example:switch(month){…thisExample:switch(month){ case1: printf(“January\n”); break; case2: printf(“February\n”);
case3: printf(“March\n”); break; default: printf(“Others\n”); break;} printf(“End”);Now…whatwillhappenifthesebreaksaretakenoutfromtheprogram?And…ifmonth=1?And…ifmonth=34?多路選擇(switch)
and
break
最好不省略Example:switch(month){Now…w特殊情況下,如果switch表達式的多個值都需要執(zhí)行相同的語句可以采用下面的格式:
switch(i){case1:case2:case3:語句1;break;case4:語句2;break;case5:case6:語句3;break;default:語句4;}執(zhí)行過程:當整型變量i的值為1、2或3時,執(zhí)行語句1;當整型變量i的值為4時執(zhí)行語句2;當整型變量i的值為5、6時,執(zhí)行語句3,否則執(zhí)行語句4?!纠枯斎朐路荽蛴?999年該月有多少天。#include<stdio.h>main()
{intmonth;
intday;
printf(“pleaseinputthemonthnumber:”);
scanf(“%d”,&month);特殊情況下,如果switch表達式的多個值都需要執(zhí)行相同的語switch(month){case1:case3:case5:case7:case8:case10:case12:day=31;break:case4:case6:case9:case11:day=30;break;case2:day=28;break;default:day=-1:
}if(day==-1)printf(“invalidmonthinput!\n”);elseprintf(“1999.%dhas%ddays\n”,month,day);}switch(month)if(day==-1)p例5-16main(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}printf(“\na=%d,b=%d”,a,b);}運行結(jié)果:a=2,b=1例5-16main()運行結(jié)果:a=2,b=1使用switch語句需要注意:(1)e必須是()括起來,而且不能為空。switch()非法。(2)每個case和default后可以有多個語句(是一個程序段)組成,并且可以包括條件分支語句和循環(huán)語句,且不需要使用{}括起來(復合語句形式)。(3)標號后的“:”不能省略,語句后的“;”分號也不能省略。(4)由于在執(zhí)行一個case語句之后,控制將自動轉(zhuǎn)移到語句序列后的下一個語句,因此在一個case結(jié)束后,下一個case開始之前,采用一個break語句或return語句退出switch語句是必要的。使用switch語句需要注意:(1)e必須是()括起來,而且什么時候用一條switch語句比用多條if語句更好?switch語句與if語句不同,switch語句只能對等式進行測試,而if語句可以計算關(guān)系表達式或邏輯表達式等。如果有兩條以上基于同一個變量的條件表達式,那么最好使用switch語句。例如:與其使用下述的if語句格式:if(x==1)
printf(”xisequaltoone.\n”);elseif(x==2)
printf(”xisequaltotwo.\n”);elseif(x==3)
printf(”xisequaltothree.\n”);elseprintf(”xisnotequaltoone,two,three.\n”);什么時候用一條switch語句比用多條if語句更好?不如使用如下switch代碼,它更易于閱讀和維護:
switch(x)
{case1:printf(”xisequaltoone.\n”);break;
case2:printf(”xisequaltotwo.\n”);break;
case3:printf(”xisequaltothree.\n”);break;
default:printf(”xisnotequaltoone,two,three.\n”);}注意:
使用switch語句的前提條件是條件表達式必須是基于同一個變量。不如使用如下switch代碼,它更易于閱讀和維護:注意:switch和else-if的比較else-if比switch的條件控制更強大一些else-if可以依照各種邏輯運算的結(jié)果進行流程控制switch只能進行==判斷,并且只能是整數(shù)判斷switch比else-if更清晰兩者都要盡量避免用得過多、過長,尤其不要嵌套得太多它們大大增加程序的分支,使邏輯關(guān)系顯得混亂,不易維護,易出錯switch和else-if的比較else-if比switc【例5-16】:閱讀下面程序:計算結(jié)果。
#include<stdio.h>main(){inta=2,b=7,c=5;
switch(a>0){case1:switch(b<0){
case0:printf(“@”);break;
case1:printf(“!”);break;}
case2:switch(c==5){case0:printf(“*”);break;case1:printf(“#”);break;default:printf(“$”);break;}
default:printf(“&”);
}
printf(“\n”);
}執(zhí)行結(jié)果:@#&在嵌入switch語句中,外層的switch與內(nèi)層的switch中的case語句中常量允許相同,此時不會發(fā)生沖突。不同的break也只使程序中斷本層的
switch,不會發(fā)生混亂?!纠?-16】:閱讀下面程序:計算結(jié)果。執(zhí)行結(jié)果:@#&在嵌例4.7:計算器程序編程設(shè)計一個簡單的計算器程序,要求根據(jù)用戶從鍵盤輸入如下形式的表達式:操作數(shù)1運算符op操作數(shù)2
然后,計算并輸出表達式的值指定的運算符為加(+)減(-)乘(*)除(/)例4.7:計算器程序編程設(shè)計一個簡單的計算器程序,要求根據(jù)用main(){
intdata1,data2;/*定義兩個操作符*/
charop;/*定義運算符*/ printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*輸入運算表達式*/
switch(op) {
case'+':/*處理加法*/ printf("%d+%d=%d\n",data1,data2,data1+data2);
break;
case'-':/*處理減法*/ printf("%d-%d=%d\n",data1,data2,data1-data2);
break;
case'*':/*處理乘法*/ printf("%d*%d=%d\n",data1,data2,data1*data2);
break;
case'/':/*處理除法*/
if(0==data2) printf("Divisionbyzero!\n");
else
printf("%d/%d=%d\n",data1,data2,data1/data2);
break;
default: printf("Unknownoperator!\n"); }}例4.7main()例4.7思考題語句if(0==data2)的必要性1998年11月《科學美國人》雜志,描述了美國導彈巡洋艦約克敦號上的一起事故,除零錯導致軍艦推進系統(tǒng)的關(guān)閉如果要求程序能進行浮點數(shù)的算術(shù)運算,語句if(0==data2)還能用于比較實型變量data2和常數(shù)0的大小嗎?if(fabs(data2)<=1e-7)如果要求輸入的算術(shù)表達式中的操作數(shù)和運算符之間可以加入任意多個空格符,那么程序如何修改?scanf("%d%c%d",&data1,&op,&data2);scanf("%d%c%d",&data1,&op,&data2);取絕對值函數(shù)空格思考題語句if(0==data2)的必要性取絕對值函作業(yè)習題4.5,4.6,4.7,4.8,4.9練習:判斷三角形的類型作業(yè)習題4.5,4.6,4.7,4.8,4.9第4章程序的控制結(jié)構(gòu)第4章本章學習內(nèi)容算法的描述方法常用算法(累加累乘、統(tǒng)計、遞推迭代、窮舉)選擇結(jié)構(gòu)及相關(guān)控制語句循環(huán)結(jié)構(gòu)及相關(guān)控制語句結(jié)構(gòu)化程序設(shè)計的基本思想Skill:MapproblemtosolutioninflowchartandpseudocodeformsBeabletodevelopaprogramcontainingselectionandloopcontrolstructure本章學習內(nèi)容算法的描述方法算法(Algorithm)的概念
數(shù)據(jù)結(jié)構(gòu)+算法=程序算法:為解決一個具體問題而采取的確定的有限的操作步驟,僅指計算機能執(zhí)行的算法Aspecificandstep-by-stepsetofinstructionsforcarryingoutaprocedureorsolvingaproblem,usuallywiththerequirementthattheprocedureterminateatsomepoint算法(Algorithm)的概念數(shù)據(jù)結(jié)構(gòu)+算法=算法的特性
有窮性在合理的時間內(nèi)完成確定性,無歧義
如果x≥0,則輸出Yes;如果x≤0,則輸出No;有效性
能有效執(zhí)行負數(shù)開平方?jīng)]有輸入或有多個輸入
有一個或多個輸出
算法的特性有窮性算法的分類
數(shù)值運算算法:解決求數(shù)值解問題非數(shù)值運算算法:需要用分析推理、邏輯推理才能解決的問題例如人工智能中的許多問題,查找、分類等算法的分類數(shù)值運算算法:算法的表示方法自然語言描述傳統(tǒng)流程圖(Flowchart)在1966年,Bohra與Jacopini提出N-S結(jié)構(gòu)化流程圖1973年,美國學者I.Nassi和B.Shneiderman提出偽碼(Pseudocode)表示算法的表示方法自然語言描述描述算法和實現(xiàn)算法注意:描述算法和實現(xiàn)算法是兩個不同的概念。描述算法只是用一種語言表示出來,但只有運行程序才能實現(xiàn)算法;實現(xiàn)算法:用計算機語言表示算法并在計算機上調(diào)試、運行、得出正確的結(jié)果。用計算機語言表示算法必須嚴格遵循所用語言的語法規(guī)則。描述算法和實現(xiàn)算法注意:描述算法和實現(xiàn)算法是兩個不同的概念。流程圖(Flowchart)Flowchartrepresentsalgorithmgraphically.Start/EndSymbolSemanticProcessInput/OutputTestConnectorFlowofactivities流程圖(Flowchart)Flowchartrepres問題求解步驟
(ProblemSolvingProcess)InputProcessOutputFirstidentifytheinputandoutputoftheproblem.問題求解步驟
(ProblemSolvingProcesExample1:買蘋果,計算價錢Calculateanddisplaythepriceofanumberofapplesifthequantityinkgandpriceperkgaregiven.
quantitypricePerkgpriceprice=quantity*pricePerkgInputProcessOutputExample1:買蘋果,計算價錢Calculatean流程圖(Flowchart):
CalculatePriceofApplesInputquantity
Startpricequantity*pricePperkgInputpricePerkgOutputpriceEndIfnecessary,use‘Divide&Conquer’strategytodecomposetheprobl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025云南茶葉種植收購合同范本
- 2025《店鋪租賃經(jīng)營合同示范文本》GF
- 2024年2月高層建筑消防無人機巡檢技術(shù)規(guī)范
- 《2025設(shè)備供應(yīng)與安裝合同》
- 產(chǎn)品維修協(xié)議合同樣本
- led平板燈購銷合同標準文本
- 二 房交易合同樣本
- 明神醫(yī)健康管理服務(wù)承諾書二零二五年
- 借款融資居間服務(wù)合同標準文本
- 物流公司環(huán)境保護協(xié)議
- 3.28百萬農(nóng)奴解放紀念日演講稿1500字2篇
- 員工節(jié)能環(huán)保培訓課件
- 《精益生產(chǎn)培訓》課件
- 學校招生工作培訓方案
- 訪談記錄表模板
- 初高中物理的區(qū)別以及如何學好高中物理課件
- 工程結(jié)構(gòu)靜力試驗
- MQL4命令中文詳解手冊
- 國家開放大學《人文英語3》章節(jié)測試參考答案
- 撤銷冒名登記(備案)申請表
- 牛排培訓大全課件
評論
0/150
提交評論