C語言程序設(shè)計第五章_第1頁
C語言程序設(shè)計第五章_第2頁
C語言程序設(shè)計第五章_第3頁
C語言程序設(shè)計第五章_第4頁
C語言程序設(shè)計第五章_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

會計學(xué)1C語言程序設(shè)計第五章課件本章學(xué)習(xí)內(nèi)容算法的描述方法用于單分支控制的if語句用于雙分支控制的if-else語句用于多路選擇的switch語句

break語句在switch語句中的作用關(guān)系運算符條件運算符邏輯運算符程序測試第1頁/共56頁生活中的問題求解:Problem:

烤蛋糕(BakingaCake)Howtosolve:

Start

將烤箱預(yù)熱

準(zhǔn)備一個盤子

在盤子上抹上一些黃油

將面粉、雞蛋、糖和香精混合在一起攪拌均勻?qū)嚢韬玫拿娣蹐F(tuán)放在盤子上

將盤子放到烤箱內(nèi)End5.1生活中與計算機(jī)中的問題求解

(ProblemSolvingProcess)第2頁/共56頁

分治策略

("DivideandConquer"Strategy)Problem:

準(zhǔn)備早餐(PrepareaBreakfast)

1. Start2. 準(zhǔn)備早餐3. End第3頁/共56頁1.Start2.準(zhǔn)備早餐

2.1準(zhǔn)備一個金槍魚三明治2.2準(zhǔn)備一些薯條2.3沖一杯咖啡3.End

分治策略

("DivideandConquer"Strategy)第4頁/共56頁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)第5頁/共56頁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)

第6頁/共56頁分治策略("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.End第7頁/共56頁5.2算法的概念及其描述方法面向?qū)ο蟪绦?對象+消息面向過程的程序=數(shù)據(jù)結(jié)構(gòu)+算法計算機(jī)中的算法(Algorithm)為解決一個具體問題而采取的、確定的、有限的操作步驟,僅指計算機(jī)能執(zhí)行的算法Aspecificandstep-by-stepsetofinstructionsforcarryingoutaprocedureorsolvingaproblem,usuallywiththerequirementthattheprocedureterminateatsomepoint第8頁/共56頁5.2算法的概念及其描述方法算法的特性有窮性在合理的時間內(nèi)完成確定性,無歧義如果x≥0,則輸出Yes;如果x≤0,則輸出No有效性能有效執(zhí)行負(fù)數(shù)開平方?jīng)]有輸入或有多個輸入有一個或多個輸出第9頁/共56頁5.2算法的概念及其描述方法算法的描述方法自然語言描述傳統(tǒng)流程圖(Flowchart)在1966年,Bohra與Jacopini提出N-S結(jié)構(gòu)化流程圖1973年,美國學(xué)者I.Nassi和B.Shneiderman提出偽碼(Pseudocode)表示第10頁/共56頁流程圖(Flowchart)Flowchartrepresentsalgorithmgraphically.Start/EndSymbolSemanticProcessInput/OutputTestConnectorFlowofactivities第11頁/共56頁計算機(jī)中的問題求解過程Example:買蘋果,計算價錢Calculateanddisplaythepriceofanumberofapplesifthequantityinkgandpriceperkgaregiven.

quantitypricePerkgpriceprice=quantity*pricePerkgInputProcessOutputFirstidentifytheinputandoutputoftheproblem.第12頁/共56頁順序結(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第13頁/共56頁【例5.1】計算兩整數(shù)的最大值

num1num2max????InputProcessOutput第14頁/共56頁if-elseSingleSelectionDoubleSelectionMultipleSelectionifif-else-if選擇結(jié)構(gòu)(分支結(jié)構(gòu))

(SelectionStructure)第15頁/共56頁5.3關(guān)系運算符與關(guān)系表達(dá)式RelationalOperationDescriptionExamplesofExpressionValue<Lessthan6<91(true)<=Lessthanorequalto5<=51(true)>Greaterthan2>60(false)>=Greaterthanorequalto9>=51(true)==Equalto7==50(false)!=Notequalto6!=51(true)第16頁/共56頁5.4用于單分支控制的條件語句

(SingleSelection)StepaconditionStepmStepnStepxtruefalsestepaconditionstepmstepnstepbtruefalsePseudocodeStructurestepaif<conditionistrue>start stepm stepnend_ifstepb第17頁/共56頁ifStatementThestructureissimilartosingleselection(flowchart)Syntax:

if

(expression) statement;or

if

(expression){ statement1; statement2; }復(fù)合語句compoundstatement被當(dāng)做一條語句看待表達(dá)式非0為真第18頁/共56頁ifStatementThestructureissimilartosingleselection(flowchart)Syntax:

if

(expression) statement;or

if

(expression){ statement1; statement2; }Don’tforgetthebraces

!!Don’tforgettheparentheses

!!第19頁/共56頁#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ù)的最大值第20頁/共56頁PseudocodeStructureStepaif<conditionistrue>start Stepm Stepnend_ifelsestart Stepx Stepyend_elseStepzStepaconditionStepmStepnStepztruefalseStepxStepyStepaconditionStepmStepnStepztruefalseStepxStepy5.5用于雙分支控制的條件語句(

Double

Selection)第21頁/共56頁if-else

StatementThestructureissimilartodoubleselection(flowchart)Syntax:

if

(expression)

statement1;

else

statement2;or

if

(expression)

{ statement1; statement3;}

else

{ statement2; statement4;}第22頁/共56頁NoYesFlowchart:CalculatetheMaximumInputaandbOutputmaxa>b?maxbmaxaStartEnd【例5.2】計算兩整數(shù)的最大值第23頁/共56頁scanf("%d,%d",&a,&b);if(a>b)max=a;elsemax=b;TurnFlowcharttoCProgramNoYesInputaandbOutputmaxa>b?maxbmaxaStartEnd【例5.2】計算兩整數(shù)的最大值printf("max=%d\n",max);第24頁/共56頁#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ù)的最大值第25頁/共56頁#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條件運算符和條件表達(dá)式【例5.3】第26頁/共56頁5.7用于多分支控制的條件語句

(MultipleSelection)Multi-wayifStepaif

(expression1){ Stepm}if

(expression2)

{ Stepn}StepzStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepaexpression1StepmStepnStepztruefalseexpression2truefalse第27頁/共56頁5.7用于多分支控制的條件語句

(MultipleSelection)CascadedifStepaif

(expression1){ Stepm}elseif

(expression2){ Stepn}

else{ Stepx}StepzStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepxStepaexpression1StepmStepnStepztruefalseexpression2truefalseStepx第28頁/共56頁5.8用于多路選擇的switch語句

Thestructureissimilartomultipleselection(flowchart)switch(expression){

case

value1:

statement1; break;

case

value2:

statement2; break;

……

default

:

statementX; break;}Don’tforgetthebraces!!Don’tforgetthecolons!!Don’tforgettheblank!!

第29頁/共56頁ImportantRule!switch(expression){

case

value1:

statement1; break;

case

value2:

statement2; break;

……

default

:

statementX; break;}Mustbeintorchar!5.8用于多路選擇的switch語句

注意!第30頁/共56頁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語句

第31頁/共56頁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語句

第32頁/共56頁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語句

第33頁/共56頁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語句

第34頁/共56頁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語句

第35頁/共56頁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語句

最好不省略!第36頁/共56頁【例5.5】計算器程序編程設(shè)計一個簡單的計算器程序,要求用戶從鍵盤輸入如下形式的表達(dá)式:操作數(shù)1運算符op操作數(shù)2

然后,計算并輸出表達(dá)式的值指定的運算符為 加(+) 減(-) 乘(*) 除(/)第37頁/共56頁main(){

intdata1,data2;/*定義兩個操作符*/

charop;/*定義運算符*/ printf("Pleaseentertheexpression:"); scanf("%d%c%d",&data1,&op,&data2);/*輸入運算表達(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?注釋掉會怎樣?第38頁/共56頁思考題語句if(0==data2)的必要性——避免“除零錯誤”1998年11月,《科學(xué)美國人》雜志描述了美國導(dǎo)彈巡洋艦約克敦號上的一起事故,除零錯導(dǎo)致軍艦推進(jìn)系統(tǒng)的關(guān)閉為什么不用if(data2==0)?如果要求輸入的算術(shù)表達(dá)式中的操作數(shù)和運算符之間可以加入任意多個空格符,那么程序如何修改?第39頁/共56頁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】空格第40頁/共56頁思考題如果要求對浮點數(shù)進(jìn)行運算,那么程序如何修改?修改例5.5程序,使其能進(jìn)行浮點數(shù)的算術(shù)運算,同時允許使用字符*、x與X作為乘號,并且允許輸入的算術(shù)表達(dá)式中的操作數(shù)和運算符之間加入任意多個空格符。第41頁/共56頁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ù)與0比較*/ printf("Divisionbyzero!\n");

else

printf("%f/%f=%f\n",data1,data2,data1/data2);

break;

default: printf("Invalidoperator!\n"); }}【例5.6】取絕對值函數(shù)第42頁/共56頁Symbol

Description

&& 與(AND)當(dāng)且僅當(dāng)兩者都為真,則結(jié)果為真|| 或(OR)只要兩者中有一個為真,結(jié)果就為真! 非(NOT)aba&&ba||b!a!b0000110101101001011111005.9邏輯運算符和邏輯表達(dá)式

(LogicOperatorsandLogicExpression)!&&||高低第43頁/共56頁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邏輯運算符和邏輯表達(dá)式

(LogicOperatorsandLogicExpression)第44頁/共56頁Example:(a>=1)&&(b++==5)

(0>=1)&&(b++==5)

0&&(b++==5)

0a0b5c15d17復(fù)合表達(dá)式(CompoundExpression)的值盡量使用最少的操作數(shù)來確定表達(dá)式的值,這就意味著表達(dá)式中的某些操作數(shù)可能不會被計算

第45頁/共56頁5.10本章擴(kuò)充內(nèi)容測試的主要方式給定特定的輸入,運行被測軟件檢查軟件的輸出是否與預(yù)期結(jié)果一致測試用例的選取方法盡量覆蓋所有分支,減少重復(fù)覆蓋測試的目的通過運行測試用例找出軟件中的Bug成功的測試在于發(fā)現(xiàn)迄今為止尚未發(fā)現(xiàn)的Bug測試人員的主要任務(wù)是站在使用者的角度,通過不斷使用和攻擊,盡可能多地找出Bug測試的過程就像黑客的攻擊過程,專門找軟件漏洞第46頁/共56頁5.10本章擴(kuò)充內(nèi)容采用測試用例,通過運行程序查找程序錯誤的方法實質(zhì)是一種抽樣檢查,徹底的測試是不可能的徹底的測試不現(xiàn)實,要考慮時間、費用等限制,不允許無休止的測試測試只能證明程序有錯,不能證明程序無錯——E.W.Dijkstra測試能提高軟件質(zhì)量,但提高軟件質(zhì)量不能依賴于測試第47頁/共56頁軟件測試方法的分類白盒測試(結(jié)構(gòu)測試)在完全了解程序的結(jié)構(gòu)和處理過程的情況下,按照程序內(nèi)部的邏輯測試程序,檢驗程序中的每條邏輯路徑是否都能按預(yù)定要求正確工作主要用于測試的早期黑盒測試(功能測試)把系統(tǒng)看成一個黑盒子,不考慮程序內(nèi)部的邏輯結(jié)構(gòu)和處理過程,只根據(jù)需求規(guī)格說明書的要求,設(shè)計測試用例,檢查程序的功能是否符合它的功能說明主要用于測試的后期通常結(jié)合使用選擇有限數(shù)量的重要路徑進(jìn)行白盒測試,對重要的功能需求進(jìn)行黑盒測試第48頁/共56頁#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】判斷三角形的類型第49頁/共56頁【例5.7】判斷三角形的類型一般三角形不是三角形等邊等腰直角等腰直角有交叉關(guān)系的用并列的if非此即彼的用if-else注意!第50頁/共56頁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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論