




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章選擇控制結(jié)構(gòu)
1本章學(xué)習(xí)內(nèi)容算法的描述方法用于單分支控制的if語句用于雙分支控制的if-else語句用于多路選擇的switch語句
break語句在switch語句中的作用關(guān)系運(yùn)算符條件運(yùn)算符邏輯運(yùn)算符程序測試生活中的問題求解:Problem:
烤蛋糕(BakingaCake)Howtosolve:
Start
將烤箱預(yù)熱
準(zhǔn)備一個盤子
在盤子上抹上一些黃油
將面粉、雞蛋、糖和香精混合在一起攪拌均勻?qū)嚢韬玫拿娣蹐F(tuán)放在盤子上
將盤子放到烤箱內(nèi)End5.1生活中與計算機(jī)中的問題求解
(ProblemSolvingProcess)
分治策略
("DivideandConquer"Strategy)Problem:
準(zhǔn)備早餐(PrepareaBreakfast)
1. Start2. 準(zhǔn)備早餐3. End1.Start2.準(zhǔn)備早餐
2.1準(zhǔn)備一個金槍魚三明治2.2準(zhǔn)備一些薯?xiàng)l2.3沖一杯咖啡3.End
分治策略
("DivideandConquer"Strategy)1.Start2.準(zhǔn)備早餐
2.1準(zhǔn)備一個金槍魚三明治2.1.1拿來兩片面包2.1.2準(zhǔn)備一些金槍魚醬
2.2準(zhǔn)備一些薯片2.3沖一杯咖啡3.End
分治策略
("DivideandConquer"Strategy)1.Start2.準(zhǔn)備早餐2.1準(zhǔn)備一個金槍魚三明治2.1.1拿來兩片面包2.1.2準(zhǔn)備一些金槍魚醬
2.2準(zhǔn)備一些薯片
2.2.1將土豆切成片2.2.2油炸這些土豆片
2.3沖一杯咖啡3.End分治策略
("DivideandConquer"Strategy)
分治策略("DivideandConquer"Strategy)1.Start2.準(zhǔn)備早餐2.1準(zhǔn)備一個金槍魚三明治2.1.1拿來兩片面包2.1.2準(zhǔn)備一些金槍魚醬
2.2準(zhǔn)備一些薯片2.2.1將土豆切成片2.2.2油炸這些土豆片
2.3沖一杯咖啡2.3.1燒些開水放入杯中2.3.2在水杯中加入一些咖啡和糖3.End5.2算法的概念及其描述方法面向?qū)ο蟪绦?對象+消息面向過程的程序=數(shù)據(jù)結(jié)構(gòu)+算法計算機(jī)中的算法(Algorithm)為解決一個具體問題而采取的、確定的、有限的操作步驟,僅指計算機(jī)能執(zhí)行的算法Aspecificandstep-by-stepsetofinstructionsforcarryingoutaprocedureorsolvingaproblem,usuallywiththerequirementthattheprocedureterminateatsomepoint5.2算法的概念及其描述方法算法的特性有窮性在合理的時間內(nèi)完成確定性,無歧義如果x≥0,則輸出Yes;如果x≤0,則輸出No有效性能有效執(zhí)行負(fù)數(shù)開平方?jīng)]有輸入或有多個輸入有一個或多個輸出5.2算法的概念及其描述方法算法的描述方法自然語言描述傳統(tǒng)流程圖(Flowchart)在1966年,Bohra與Jacopini提出N-S結(jié)構(gòu)化流程圖1973年,美國學(xué)者I.Nassi和B.Shneiderman提出偽碼(Pseudocode)表示流程圖(Flowchart)Flowchartrepresentsalgorithmgraphically.Start/EndSymbolSemanticProcessInput/OutputTestConnectorFlowofactivities計算機(jī)中的問題求解過程Example:買蘋果,計算價錢Calculateanddisplaythepriceofanumberofapplesifthequantityinkgandpriceperkgaregiven.
quantitypricePerkgpriceprice=quantity*pricePerkgInputProcessOutputFirstidentifytheinputandoutputoftheproblem.順序結(jié)構(gòu)(Sequence
Structure)給變量賦值賦值表達(dá)式語句
賦值表達(dá)式;
price=quantity*pricePerkg;輸入輸出數(shù)據(jù)標(biāo)準(zhǔn)庫函數(shù)調(diào)用語句
scanf("%d",&pricePerkg);
printf("%d",price);ABC【例5.1】計算兩整數(shù)的最大值
num1num2max????InputProcessOutputif-elseSingleSelectionDoubleSelectionMultipleSelectionifif-else-if選擇結(jié)構(gòu)(分支結(jié)構(gòu))
(SelectionStructure)5.3關(guān)系運(yùn)算符與關(guān)系表達(dá)式RelationalOperationDescriptionExamplesofExpressionValue<Lessthan6<91(true)<=Lessthanorequalto5<=51(true)>Greaterthan2>60(false)>=Greaterthanorequalto9>=51(true)==Equalto7==50(false)!=Notequalto6!=51(true)5.4用于單分支控制的條件語句
(SingleSelection)StepaconditionStepmStepnStepxtruefalsestepaconditionstepmstepnstepbtruefalsePseudocodeStructurestepaif<conditionistrue>start stepm stepnend_ifstepbifStatementThestructureissimilartosingleselection(flowchart)Syntax:
if
(expression) statement;or
if
(expression){ statement1; statement2; }復(fù)合語句compoundstatement被當(dāng)作一條語句看待表達(dá)式非0為真ifStatementThestructureissimilartosingleselection(flowchart)Syntax:
if
(expression) statement;or
if
(expression){ statement1; statement2; }Don’tforgetthebraces
!!Don’tforgettheparentheses
!!#include<stdio.h>main(){inta,b,max;printf("Inputa,b:");scanf("%d,%d",&a,&b);
if(a>b) max=a;if(a<=b) max=b;printf("max=%d\n",max);}Inputa,b:_Inputa,b:2015_Inputa,b:2015max=20_【例5.1】計算兩整數(shù)的最大值PseudocodeStructureStepaif<conditionistrue>start Stepm Stepnend_ifelsestart Stepx Stepyend_elseStepzStepaconditionStepmStepnStepztruefalseStepxStepyStepaconditionStepmStepnStepztruefalseStepxStepy5.5用于雙分支控制的條件語句(
Double
Selection)if-else
StatementThestructureissimilartodoubleselection(flowchart)Syntax:
if
(expression)
statement1;
else
statement2;or
if
(expression)
{ statement1; statement3;}
else
{ statement2; statement4;}NoYesFlowchart:CalculatetheMaximumInputaandbOutputmaxa>b?maxbmaxaStartEnd【例5.2】計算兩整數(shù)的最大值scanf("%d,%d",&a,&b);if(a>b)max=a;elsemax=b;TurnFlowcharttoCProgramNoYesInputaandbOutputmaxa>b?maxbmaxaStartEnd【例5.2】計算兩整數(shù)的最大值printf("max=%d\n",max);#include<stdio.h>main(){inta,b,max;
printf("Inputa,b:");scanf("%d,%d",&a,&b);
if(a>b) max=a;
else max=b;printf("max=%d",max);}}
if(a>b) max=a;
if(a<=b) max=b;【例5.2】計算兩整數(shù)的最大值#include<stdio.h>main(){inta,b,max;
printf("Inputa,b:");scanf("%d,%d",&a,&b);
if(a>b) max=a;
else max=b;printf("max=%d",max);}}
max=a>b?a:b;表達(dá)式1?表達(dá)式2:表達(dá)式35.6條件運(yùn)算符和條件表達(dá)式【例5.3】5.7用于多分支控制的條件語句
(MultipleSelection)Multi-wayifStepaif
(expression1){ Stepm}if
(expression2)
{ Stepn}StepzStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepaexpression1StepmStepnStepztruefalseexpression2truefalse5.7用于多分支控制的條件語句
(MultipleSelection)CascadedifStepaif
(expression1){ Stepm}elseif
(expression2){ Stepn}
else{ Stepx}StepzStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepxStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepx5.8用于多路選擇的switch語句
Thestructureissimilartomultipleselection(flowchart)switch(expression){
case
value1:
statement1; break;
case
value2:
statement2; break;
……
default
:
statementX; break;}Don’tforgetthebraces!!Don’tforgetthecolons!!Don’tforgettheblank!!
ImportantRule!switch(expression){
case
value1:
statement1; break;
case
value2:
statement2; break;
……
default
:
statementX; break;}Mustbeintorchar!5.8用于多路選擇的switch語句
注意!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_5.8用于多路選擇的switch語句
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");…thisstepwillbeexecuted.Later…March_MarchEnd_Assumemonth=3,so……caseisterminatedhere.Jumpto…5.8用于多路選擇的switch語句
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");Now…whatwillhappenifthisbreakistakenoutfromtheprogram?5.8用于多路選擇的switch語句
Example:switch(month){ case1: printf("January\n"); break; case2: printf("February\n");
case3: printf("March\n"); break; default: printf("Others\n"); break; } printf("End");Nomore!5.8用于多路選擇的switch語句
Example: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…5.8用于多路選擇的switch語句
Example: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?5.8用于多路選擇的switch語句
最好不省略!【例5.5】計算器程序編程設(shè)計一個簡單的計算器程序,要求用戶從鍵盤輸入如下形式的表達(dá)式:操作數(shù)1運(yùn)算符op操作數(shù)2
然后,計算并輸出表達(dá)式的值指定的運(yùn)算符為 加(+) 減(-) 乘(*) 除(/)main(){
intdata1,data2;/*定義兩個操作符*/
charop;/*定義運(yùn)算符*/ printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*輸入運(yùn)算表達(dá)式*/
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("Invalidoperator!\n"); }}【例5.5】Why?注釋掉會怎樣?思考題語句if(0==data2)的必要性——避免"除零錯誤"1998年11月,《科學(xué)美國人》雜志描述了美國導(dǎo)彈巡洋艦約克敦號上的一起事故,除零錯導(dǎo)致軍艦推進(jìn)系統(tǒng)的關(guān)閉為什么不用if(data2==0)?如果要求輸入的算術(shù)表達(dá)式中的操作數(shù)和運(yùn)算符之間可以加入任意多個空格符,那么程序如何修改?main(){
intdata1,data2;
charop; printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*%c前有一個空格*/
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("Invalidoperator!\n"); }}【例5.5】空格思考題如果要求對浮點(diǎn)數(shù)進(jìn)行運(yùn)算,那么程序如何修改?修改例5.5程序,使其能進(jìn)行浮點(diǎn)數(shù)的算術(shù)運(yùn)算,同時允許使用字符*、x與X作為乘號,并且允許輸入的算術(shù)表達(dá)式中的操作數(shù)和運(yùn)算符之間可以加入任意多個空格符。main(){
floatdata1,data2;
charop; printf("Pleaseentertheexpression:"); scanf("%f%c%f",&data1,&op,&data2);
switch(op) {
case'+': printf("%f+%f=%f\n",data1,data2,data1+data2);
break;
case'-': printf("%f-%f=%f\n",data1,data2,data1-data2);
break;
case'*':
case'x': case'X': printf("%f*%f=%f\n",data1,data2,data1*data2);
break;
case'/':
if(fabs(data2)<=1e-7)/*實(shí)數(shù)與0比較*/ printf("Divisionbyzero!\n");
else
printf("%f/%f=%f\n",data1,data2,data1/data2);
break;
default: printf("Invalidoperator!\n"); }}【例5.6】取絕對值函數(shù)Symbol
Description
&& 與(AND)當(dāng)且僅當(dāng)兩者都為真,則結(jié)果為真|| 或(OR)只要兩者中有一個為真,結(jié)果就為真! 非(NOT)aba&&ba||b!a!b0000110101101001011111005.9邏輯運(yùn)算符和邏輯表達(dá)式
(LogicalOperators)!&&||高低ch是大寫英文字母(ch>='A')&&(ch<='Z')判斷某一年year是否是閏年的條件是滿足下列二者之一能被4整除,但不能被100整除;能被400整除;
year%4==0&&year%100!=0||year%400==0優(yōu)先級:%
==(!=)
&&
||
((year%4==0)&&(year%100!=0))||(year%400==0)5.9邏輯運(yùn)算符和邏輯表達(dá)式
(LogicalOperators)Example:(a>=1)&&(b++==5)
(0>=1)&&(b++==5)
0&&(b++==5)
0a0b5c15d17復(fù)合表達(dá)式(CompoundExpression)的值盡量使用最少的操作數(shù)來確定表達(dá)式的值,這就意味著表達(dá)式中的某些操作數(shù)可能不會被計算
5.10本章擴(kuò)充內(nèi)容測試的主要方式給定特定的輸入,運(yùn)行被測軟件檢查軟件的輸出是否與預(yù)期結(jié)果一致測試用例的選取方法盡量覆蓋所有分支,減少重復(fù)覆蓋測試的目的通過運(yùn)行測試用例找出軟件中的Bug成功的測試在于發(fā)現(xiàn)迄今為止尚未發(fā)現(xiàn)的Bug測試人員的主要任務(wù)是站在使用者的角度,通過不斷使用和攻擊,盡可能多地找出Bug測試的過程就像黑客的攻擊過程,專門找軟件漏洞5.10本章擴(kuò)充內(nèi)容采用測試用例,通過運(yùn)行程序查找程序錯誤的方法實(shí)質(zhì)是一種抽樣檢查,徹底的測試是不可能的徹底的測試不現(xiàn)實(shí),要考慮時間、費(fèi)用等限制,不允許無休止的測試測試只能證明程序有錯,不能證明程序無錯——E.W.Dijkstra測試能提高軟件質(zhì)量,但提高軟件質(zhì)量不能依賴于測試軟件測試方法的分類白盒測試(結(jié)構(gòu)測試)在完全了解程序的結(jié)構(gòu)和處理過程的情況下,按照程序內(nèi)部的邏輯測試程序,檢驗(yàn)程序中的每條邏輯路徑是否都能按預(yù)定要求正確工作主要用于測試的早期黑盒測試(功能測試)把系統(tǒng)看成一個黑盒子,不考慮程序內(nèi)部的邏輯結(jié)構(gòu)和處理過程,只根據(jù)需求規(guī)格說明書的要求,設(shè)計測試用例,檢查程序的功能是否符合它的功能說明主要用于測試的后期通常結(jié)合使用選擇有限數(shù)量的重要路徑進(jìn)行白盒測試,對重要的功能需求進(jìn)行黑盒測試#include<stdio.h>#include<math.h>main(){
floata,b,c;
printf("Inputthethreeedgelength:"); scanf("%f,%f,%f",&a,&b,&c);
if(a+b>c&&b+c>a&&a+c>b) /*三角形的基本條件*/ {
if(a==b||b==c||c==a) printf("等腰三角形");
else
if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) printf("直角三角形");
else printf("一般三角形"); }
else { printf("不是三角形\n"); }}錯在哪里?【例5.7】判斷三角形的類型【例5.7】判斷三角形的類型一般三角形不是三角形等邊等腰直角等腰直角有交叉關(guān)系的用并列的if非此即彼的用if-else注意!main(){
floata,b,c;
intflag=1; ……
if(a+b>c&&b+c>a&&a+c>b) /*三角形的基本條件*/ {
if(a==b|
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物業(yè)公司整體外包管理合同
- 2024年門店轉(zhuǎn)讓合同
- 社團(tuán)代表發(fā)言稿
- 詩經(jīng)小雅甫田的原文
- 公司員工加班審批流程表
- 供應(yīng)商信息與報價對比表
- 你我金融服務(wù)協(xié)議
- 企業(yè)品牌推廣實(shí)戰(zhàn)指南
- 全友家具買賣合同
- 實(shí)驗(yàn)動物購銷合同
- 2024年黑龍江林業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫完整答案
- 2025中國華電校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 住宅建筑室內(nèi)裝飾裝修設(shè)計管理研究
- 四級人工智能訓(xùn)練師(中級)職業(yè)技能等級認(rèn)定考試題庫(含答案)
- 教育部《中小學(xué)校園食品安全和膳食經(jīng)費(fèi)管理工作指引》專題講座
- 2024年江蘇省中小學(xué)生金鑰匙科技競賽(高中組)考試題庫(含答案)
- 理療課件教學(xué)課件
- 2024解析:第十二章滑輪-講核心(解析版)
- 《非精密進(jìn)近》課件
- 2024 年下半年數(shù)學(xué)一年級數(shù)學(xué)思維挑戰(zhàn)試卷
- 網(wǎng)絡(luò)試運(yùn)行方案
評論
0/150
提交評論