單片機C程序設(shè)計3_第1頁
單片機C程序設(shè)計3_第2頁
單片機C程序設(shè)計3_第3頁
單片機C程序設(shè)計3_第4頁
單片機C程序設(shè)計3_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章:C程序入門單片機C程序設(shè)計(CProgrammingforMCU)2本章目標了解算法及控制結(jié)構(gòu)掌握使用選擇結(jié)構(gòu)及程序設(shè)計掌握使用循環(huán)結(jié)構(gòu)及程序設(shè)計3程序設(shè)計程序設(shè)計過程就是解決問題的過程。程序設(shè)計通常包括如下五個步驟:問題分析編碼算法設(shè)計程序設(shè)計步驟測試調(diào)試有問題無問題分析問題:功能:需要弄清楚軟件要完成的功能;輸入:如果問題有輸入,分析輸入是什么及輸入數(shù)據(jù)的類型;

處理:對輸入數(shù)據(jù)做什么處理;

輸出:如果有輸出,輸出什么數(shù)據(jù)及輸出數(shù)據(jù)的格式;對于復雜問題,可將問題分解為若干子問題,然后再進行上面的分析。算法設(shè)計:設(shè)計解決問題的具體方案(步驟)。編碼:將算法用高級語言實現(xiàn)。測試:運行編譯連接后得到的執(zhí)行程序,以驗證程序是否按要求解決了問題,并沒有產(chǎn)生副作用。即程序是否做了該做的事,同時沒有做不該做的事。調(diào)試:如果程序經(jīng)測試發(fā)現(xiàn)問題,則通過調(diào)試手段找到產(chǎn)生錯誤的代碼并修復它。4結(jié)構(gòu)化程序設(shè)計(structuredprogramming)將復雜問題分解為簡單問題的程序設(shè)計方法稱為結(jié)構(gòu)化程序設(shè)計,其特點為:自頂向下(top-down);逐步細化(stepwiserefinement);模塊化(modular);5算法任何計算問題的解決都是按指定的順序執(zhí)行一系列動作的結(jié)果。解決問題的動作及動作之間的順序稱為算法(algorithm)。6問題2.1問題:“判斷某學生成績是否及格”7問題2.1:問題分析輸入:學生成績;類型:整型;處理:學生成績值與60進行比較,大于或等于60,則及格,否則不及格;輸出:字符串“Pass”或“Fail”;變量:需要一個整型變量用于存放輸入的學生成績。8問題2.1:算法設(shè)計解決問題2.1的步驟可描述為(算法):讀入學生成績值如果該成績值大于或等于60

輸出信息“Pass”否則輸出信息“Fail”9算法表示算法即可以用自然語言表述(如前),也可用用半結(jié)構(gòu)化語言或結(jié)構(gòu)化圖形表示,如:read學生成績值if成績值>=60print“Pass”elseprint“Fail”讀學生成績值成績值>=60輸出”Fail”輸出”Pass”真假10控制結(jié)構(gòu)計算機語言提供三種方式來控制算法的執(zhí)行:順序(Sequence)、選擇(Selection)和循環(huán)(Loop)。語句1語句2語句n順序條件語句1語句2選擇真假條件語句真假循環(huán)11語句C語言語句分成簡單語句和構(gòu)造語句兩類。簡單語句1)表達式語句賦值表達式語句,如:*x++=y*=z+3;其它表達式語句,如:++x;--y;函數(shù)調(diào)用語句等。2)轉(zhuǎn)移語句goto標號;break; 間斷語句continue; 繼續(xù)語句return;return(表達式);3)空語句 ;12語句(續(xù))構(gòu)造語句1)復合語句(分程序){[<局部數(shù)據(jù)說明>]<語句>*}注意:}后沒有分號(;),這與單個語句不同。2)選擇(條件)語句if語句,if_else語句3)循環(huán)語句for語句while語句do_while語句4)開關(guān)語句switch語句(包括case語句)13選擇結(jié)構(gòu):if語句if(表達式)

語句

if(表達式)

語句1else

語句2表達式語句FT表達式語句1FT語句214選擇結(jié)構(gòu):if語句if(表達式1)語句1

elseif(表達式2)

語句2elseif(表達式3)

語句3……elseif(表達式m)

語句melse語句m+115選擇結(jié)構(gòu):if語句(續(xù))注意:在if嵌套中,省略else會產(chǎn)生二義性。如:if(n>0)if(a>b)z=a;elsez=b;即else與前面最接近的不帶else的if相對應(yīng)。若要使上面的else與第一個if相匹配,可使用{}。如:if(n>0){if(a>b)z=a;}elsez=b;16問題2.1:代碼實現(xiàn)與測試根據(jù)其算法描述,我們很容易將問題“判斷學生成績是否及格”的解決轉(zhuǎn)換為相應(yīng)的程序。例2-1/*判斷學生成績是否及格*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=60)printf(“Pass\n”);elseprintf(“Fail\n”);}程序程序設(shè)計的常用方法為首先給出問題的算法描述,然后將其編程序?qū)崿F(xiàn)。read學生成績值if成績值

>=60print“及格”elseprint“不及格”算法if選擇(條件)語句如何判斷程序解決了相應(yīng)問題?可用下面輸入數(shù)據(jù)來測試(檢驗):75(輸出應(yīng)為“Pass”)30(輸出應(yīng)為“Fail”)60(輸出應(yīng)為“Pass”)--特殊數(shù)據(jù)17問題2.2問題:“判斷某學生成績對應(yīng)的五級評分成績”問題分析:輸入:學生成績;類型:整型;處理:學生成績值分別與90,80,70,60進行比較,以判斷其為優(yōu)、良、中、及格和不及格中哪一等級;輸出:A(優(yōu))、B(良)、C(中)、D(及格)、F(不及格);變量:需要一個整型變量用于存放輸入的學生成績。18問題2.2:算法設(shè)計解決該問題的算法如下:得到學生成績值如果該成績值大于或等于90

輸出信息“優(yōu)”否則如果該成績值大于或等于80

輸出信息“良”否則如果該成績值大于或等于70

輸出信息“中”否則如果該成績值大于或等于60

輸出信息“及格”否則輸出信息“不及格”學生成績值優(yōu)>=90良中及格不及格>=80>=70>=60<60多路選擇19問題2.2:代碼實現(xiàn)與測試得到學生成績值如果該成績值大于或等于90

輸出信息“優(yōu)”否則如果該成績值大于或等于80

輸出信息“良”否則如果該成績值大于或等于70

輸出信息“中”否則如果該成績值大于或等于60

輸出信息“及格”否則輸出信息“不及格”算法例2-2/*判斷學生成績對應(yīng)的五級評分*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=90)printf(“A\n”);elseif(score>=80)printf(“B\n”);elseif(score>=70)printf(“C\n”);elseif(score>=60)printf(“D\n”);elseprintf(“F\n”);}嵌套if結(jié)構(gòu)測試數(shù)據(jù)為:95908580757065605520多路選擇:if_elseif例2-2a/*判斷學生成績對應(yīng)的五級評分*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=90)printf(“A\n”);elseif(score>=80)printf(“B\n”);elseif(score>=70)printf(“C\n”);elseif(score>=60)printf(“D\n”);elseprintf(“F\n”);}一種更好的風格!21多路選擇:if_elseif(續(xù))注意:不當?shù)呐袛囗樞蚩赡茉斐沙绦蝈e誤的執(zhí)行結(jié)果,如:#include<stdio.h>main(){intscore;scanf(“%d”,&score);

if(score>=60)printf(“D\n”);elseif(score>=80)printf(“B\n”);elseif(score>=70)printf(“C\n”);elseif(score>=90)printf(“A\n”);elseprintf(“F\n”);}下面程序?qū)崿F(xiàn)與例2-2a程序完成一樣的功能,但效率要低。/*判斷學生成績對應(yīng)的五級評分*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=90&&score<=100)printf(“A\n”);if(score>=80&&score<90)printf(“B\n”);if(score>=70&&score<80)printf(“C\n”);if(score>=60&&score<70)printf(“D\n”);if(score<60)printf(“F\n”);}22多路選擇:switch語句基本形式:switch(表達式){case常量表達式1:語句1或空;case常量表達式2:語句2或空;…case常量表達式n:語句n或空;default:語句n+1或空;}語義動作為:先計算表達式的值;該值與每一個case后的常量進行比較;若匹配,則控制就轉(zhuǎn)向該常量后的語句;若不匹配,若有default,則轉(zhuǎn)向default后的語句,否則什么也不做;S1S2SnSn+1EC1C2…Cndefault23多路選擇:switch語句(續(xù))注意:常量表達式必須是整型(if_elseif可能根據(jù)任意條件來進行多路選擇);在同一個switch中不應(yīng)出現(xiàn)兩個具有同樣的情況常量;default語句如果有,只允許出現(xiàn)一次,default可出現(xiàn)在switch中的任何位置,通常放在最后;case和default本身不改變控制流,中斷離開switch要用break;case后的語句可以是單個語句,也可以是復合語句(但不帶開頭和結(jié)尾的花括號);多個case可共用一條執(zhí)行語句。因此,switch語句特別適合于依據(jù)一組常量值來進行判斷的多路選擇。24多路選擇:switch語句(續(xù))例如:打印學生成績#include<stdio.h>main(){charscore;score=getchar();switch(score){case‘F’:printf(“nopass\n”);break;case‘D’:printf(“pass\n”);break;case‘C’:printf(“better\n”);break;case‘B’:printf(“right\n”);break;case‘A’:printf(“allright\n”);break;default:printf(“inputerror!\n”);break;}}case‘C’:printf(“better\n”);將出現(xiàn)什么問題?如果輸入為‘C’,則輸出為:betterright25多路選擇:switch語句(續(xù))問題2.2的另一種解決方式。例2-2b/*判斷學生成績對應(yīng)的五級評分*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=0&&score<=100)switch(score/10){case10:case9:printf(“A\n”);break;case8:printf(“B\n”);break;case7:printf(“C\n”);break;case6:printf(“D\n”);break;default:printf(“F\n”);break;}elseprintf(“inputerror!\n”);}26問題2.3問題:“某班有30名學生,輸入每個學生成績并判斷其是否及格”。問題分析:輸入:學生成績;類型:整型;處理:學生成績值與60進行比較,大于或等于60,則輸出及格(”Pass”),否則輸出不及格(”Fail”);輸出:字符串“Pass”或“Fail”;依次對每個學生重復上面步驟,重復次數(shù)為30次。變量:需要一個整型變量用于存放輸入的學生成績,一個整型變量用于記錄重復次數(shù)。27問題2.3:算法設(shè)計算法:1.設(shè)置變量n為12.讀入一學生成績值到變量score中3.判斷score值,如果大于或等于60,則輸出“Pass”,否則輸出”Fail”;4.變量n加15.重復步驟2至4,直到n等于3028問題2.3:算法設(shè)計(續(xù))設(shè)置變量n為1n<=30讀入一學生成績值到變量score中判斷score值,輸出“Pass”或“Fail”變量n加1真假結(jié)束算法流程圖29問題2.3:代碼實現(xiàn)程序:例2-3/*判斷某班學生成績是否及格*/#include<stdio.h>main(){intn,score;n=1;while(n<=30){scanf(“%d”,&score);printf(“%d:“,n);if(score>=60)printf(“Pass\n”);elseprintf(“Fail\n”);n++;}}算法:1.設(shè)置變量n為12.讀入一學生成績值到變量score中3.如果score>=60

輸出”Pass”

否則輸出“Fail”4.變量n加15.重復步驟2至4,直到n等于30while循環(huán)語句測試數(shù)據(jù)考慮:依次輸入30個成績值,這些值中應(yīng)包括100,60,0等特殊值。30循環(huán)結(jié)構(gòu):while語句

while(表達式)語句“先判后循環(huán)”例如:k=1;

while(k<=100){s=s+k;k++;}循環(huán)前,循環(huán)變量必須賦初值;循環(huán)體中,必須有改變循環(huán)變量的語句(結(jié)束循環(huán));循環(huán)體可以為空。例如:while((c=getchar())!=‘A’);表達式語句FT計算表達式語句結(jié)束31循環(huán)結(jié)構(gòu):while語句(續(xù))例:從鍵盤讀入字符并輸出#include<stdio.h>#defineEOF-1main(){intc;while((c=getchar())!=EOF)putchar(c);}算法分析:讀入一個字符while不是輸入結(jié)束符輸出字符;讀入下一個字符;1)程序如何結(jié)束?

Ctr+z2)為何程序運行:

hello<enter>hello32循環(huán)結(jié)構(gòu):while語句(續(xù))例:/*輸入某班30名學生成績,求總分及平均分*/#include<stdio.h>main(){inti,score,sum,ave;sum=0;i=1;while(i<=30)

{ scanf("%d",&score); sum=sum+score;

i++;

}ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}33循環(huán)結(jié)構(gòu):do_while語句do語句while(表達式);

作用類似于while,但do_while是否終止,其判定條件是在循環(huán)體之后,即它總是先執(zhí)行一次循環(huán)體,再判斷表達式的值是否為真。表達式語句FT計算表達式語句結(jié)束34循環(huán)結(jié)構(gòu):do_while語句(續(xù))while循環(huán)是在頂上測試循環(huán)終止條件;do_while是在每次通過循環(huán)體之后,在底部進行測試,所以循環(huán)體至少要進行一次。例如:do{s=s+k;k++;}while(k<=100);35循環(huán)結(jié)構(gòu):do_while語句(續(xù))*例:/*輸入某班30名學生成績,求總分及平均分*/#include<stdio.h>main(){inti,score,sum,ave;sum=0;i=1;do{ scanf("%d",&score); sum=sum+score; i++;}while(i<=30);ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}一般來說,不管do_while中是單個語句還是復合語句,都用一對{}將其括起來,以使不致把while部分誤認為是while循環(huán)的開始。36循環(huán)結(jié)構(gòu):do_while語句(續(xù))*例:/*輸入某班任意名學生成績,求總分及平均分*/#include<stdio.h>main(){inti,score,sum,ave;sum=0;scanf("%d",&i);while(i<=30)

{ scanf("%d",&score); sum=sum+score; i++;

}ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}#include<stdio.h>main(){inti,score,sum,ave;sum=0;scanf("%d",&i);do{ scanf("%d",&score); sum=sum+score; i++; }while(i<=30);ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}這兩個程序有什么區(qū)別?37循環(huán)結(jié)構(gòu):for語句for(表達式1;表達式2;表達式3)語句

其等價于:表達式1;while(表達式2){語句;表達式3;}表達式2語句FT計算表達式2語句結(jié)束計算表達式1計算表達式338循環(huán)結(jié)構(gòu):for語句(續(xù))例2-3a/*判斷某班學生成績是否及格*/#include<stdio.h>main(){intn,score;

for(n=0;n<30;n++){scanf(“%d”,&score);if(score>=60)printf(“Pass\n”);elseprintf(“Fail\n”);}}

39循環(huán)結(jié)構(gòu):for語句(續(xù))for特別適合于循環(huán)次數(shù)固定或有固定步長的循環(huán),如下面是一個循環(huán)十次的循環(huán):for(i=0;i<10;i++)…當然也可以用于其它方面。40循環(huán)結(jié)構(gòu):for語句(續(xù))例2-3a/*輸入某班30名學生成績,求總分及平均分*/#include<stdio.h>main(){inti,score,sum,ave;sum=0;for(i=1;i<=30;i++)

{scanf("%d",&score); sum=sum+score;

}ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}41循環(huán)結(jié)構(gòu):for語句(續(xù))注意:從語法上講,表達式中任一個都允許省略,但分號不能省。如:for(;(c=getchar())!=EOF;)語句;for(;;)語句;當表達式2不出現(xiàn)時,則認為條件為真,循環(huán)永遠下去(無窮循環(huán)),退出它只能用break或return語句。因此,while(A)B;等價于for(;A;)B;42循環(huán)結(jié)構(gòu)三種循環(huán)主要的用途:

for通常用于固定步長的循環(huán)

while通常用于循環(huán)條件在頭部判斷的循環(huán)

do_while通常用于至少循環(huán)一次的循環(huán)43問題2.4問題:“某班有30名學生,輸入每個學生成績并判斷其成績是否及格,在判斷學生成績過程中,如果輸入的學生成績不合法(如大于100或為負數(shù))則給出錯誤提示,并終止程序運行”。問題分析:與問題2.3不同的是在處理學生成績時,首先要判斷所讀入的成績值是否非法,如果非法,則給出錯誤信息并退出處理;否則繼續(xù)處理。算法:1.設(shè)置變量n為02.whilen小于302.1讀入一學生成績值到變量score中2.2如果變量score值大于100或小于0:a.輸出錯誤信息b.退出循環(huán)2.3判斷score值,輸出“Pass”或“Fail”2.4變量n加13.結(jié)束如何中途退出循環(huán)?break語句44break和continue語句(goto語句)例2-4/*判斷某班學生成績是否及格*/#include<stdio.h>main(){intn,score;for(n=0;n<30;n++){scanf(“%d”,&score);

if(score>100||sorce<0){printf(“Inputerror!\n”);break;}if(score>=60)printf(“Pass\n”);elseprintf(“Fail\n”);}}

退出循環(huán)45break和continue語句(goto語句)(續(xù))break:迫使程序從包含它的最內(nèi)層循環(huán)體或開關(guān)語句中跳出(循環(huán)只能跳出一層)。conti

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論