第四章 C流程控制語句_第1頁
第四章 C流程控制語句_第2頁
第四章 C流程控制語句_第3頁
第四章 C流程控制語句_第4頁
第四章 C流程控制語句_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第四章C51流程控制語句4.1表達式語句及復(fù)合語句4.1.1表達式語句在表達式的后邊加一個分號“;”就構(gòu)成了表達式語句,如:a=b++;x=8;y=7;++k;

可以一行放一個表達式形成表達式語句,也可以一行放多個表達式形成表達式語句,這時每個表達式后面都必須帶“;”號,另外,還可以僅由—個分號“;”占一行形成一個表達式語句,這種語句稱為空語句。

空語句在程序設(shè)計中通常用于兩種情況:(1)在程序中為有關(guān)語句提供標號,用以標記程序執(zhí)行的位置。例如采用下面的語句可以構(gòu)成一個循環(huán)。repeat:;;gotorepeat;(2)在用while語句構(gòu)成的循環(huán)語句后面加一個分號,形成一個不執(zhí)行其它操作的空循環(huán)體。這種結(jié)構(gòu)通常用于對某位進行判斷,當不滿足條件則等待,滿足條件則執(zhí)行?!纠?-1】下面這段子程序用于讀取8051單片機的串行口的數(shù)據(jù),當沒有接收到則等待,當接收到,接收數(shù)據(jù)后返回,返回值為接收的數(shù)據(jù)。#include<reg51.h>chargetchar(){charc;while(!RI);//當接收中斷標志位RI為0則等待,當接收中斷標志位為1則結(jié)束等待c=SBUF;RI=0;return(c);}4.1.2復(fù)合語句復(fù)合語句是由若干條語句組合而成的一種語句,在C51中,用一個大括號“{}”將若干條語句括在一起就形成了一個復(fù)合語句,復(fù)合語句最后不需要以分號“;”結(jié)束,但它內(nèi)部的各條語句仍需以分號“;”結(jié)束。復(fù)合語句的一般形式為:{局部變量定義;語句1;語句2;}復(fù)合語句在執(zhí)行時,其中的各條單語句按順序依次執(zhí)行,整個復(fù)合語句在語法上等價于一條單語句,因此在C51中可以將復(fù)合語句視為一條單語句。通常復(fù)合語句出現(xiàn)在函數(shù)中,實際上,函數(shù)的執(zhí)行部分(即函數(shù)體)就是一個復(fù)合語句;復(fù)合語句中的單語句一般是可執(zhí)行語句,此外還可以是變量的定義語句(說明變量的數(shù)據(jù)類型)。在復(fù)合語句內(nèi)部語句所定義的變量,稱為該復(fù)合語句中的局部變量,它僅在當前這個復(fù)合語句中有效。利用復(fù)合語句將多條單語句組合在—起,以及在復(fù)合語句中進行局部變量定義是C51語言的一個重要特征。4.2C51程序基本結(jié)構(gòu)與相關(guān)語句4.2.1C51的基本結(jié)構(gòu)一.順序結(jié)構(gòu)順序結(jié)構(gòu)是最基本、最簡單的結(jié)構(gòu),在這種結(jié)構(gòu)中,程序由低地址到高地址依次執(zhí)行,圖4-1給出順序結(jié)構(gòu)流程圖,程序先執(zhí)行A操作,然后再執(zhí)行B操作。AB圖4-1順序結(jié)構(gòu)流程圖

選擇結(jié)構(gòu)可使程序根據(jù)不同的情況,選擇執(zhí)行不同的分支,在選擇結(jié)構(gòu)中,程序先都對一個條件進行判斷。當條件成立,即條件語句為“真”時,執(zhí)行一個分支,當條件不成立時,即條件語句為“假”時,執(zhí)行另一個分支。如圖4-2,當條件S成立時,執(zhí)行分支A,當條件P不成立時,執(zhí)行分支B。二.選擇結(jié)構(gòu)條件P語句A語句B成立不成立在C51中,實現(xiàn)選擇結(jié)構(gòu)的語句為if/else,if/elseif語句。另外在C51中還支持多分支結(jié)構(gòu),多分支結(jié)構(gòu)既可以通過if和elseif語句嵌套實現(xiàn),可用swith/case語句實現(xiàn)。在程序處理過程中,有時需要某一段程序重復(fù)執(zhí)行多次,這時就需要循環(huán)結(jié)構(gòu)來實現(xiàn),循環(huán)結(jié)構(gòu)就是能夠使程序段重復(fù)執(zhí)行的結(jié)構(gòu)。循環(huán)結(jié)構(gòu)又分為兩種:當(while)型循環(huán)結(jié)構(gòu)和直到(do...while)型循環(huán)結(jié)構(gòu)。(1)當型循環(huán)結(jié)構(gòu)當型循環(huán)結(jié)構(gòu)如圖4-3,當條件P成立(為“真”)時,重復(fù)執(zhí)行語句A,當條件不成立(為“假”)時才停止重復(fù),執(zhí)行后面的程序。三.循環(huán)結(jié)構(gòu)圖4-3當型循環(huán)結(jié)構(gòu)

(2)直到型循環(huán)結(jié)構(gòu)直到型循環(huán)結(jié)構(gòu)如圖4-4,先執(zhí)行語句A,再判斷條件P,當條件成立(為“真”)時,再重復(fù)執(zhí)行語句A,直到條件不成立(為“假”)時才停止重復(fù),執(zhí)行后面的程序。條件P語句A成立不成立圖4-4直到型循環(huán)結(jié)構(gòu)構(gòu)成循環(huán)結(jié)構(gòu)的語句主要有:while、dowhile、for、goto等。4.2.2if語句if語句是C51中的一個基本條件選擇語句,它通常有三種格式:(1)if(表達式){語句;}(2)if(表達式){語句1;}else{語句2;}(3)if(表達式1){語句1;}elseif(表達式2){語句2;}elseif(表達式3){語句3;}……elseif(表達式n-1){語句n-1;}else{語句n;}【例4-2】if語句的用法。(1)if(x!=y)printf(“x=%d,y=%d\n”,x,y);執(zhí)行上面語句時,如果x不等于y,則輸出x的值和y的值。(2)if(x>y)max=x;elsemax=y;執(zhí)行上面語句時,如x大于y成立,則把x送給最大值變量max,如x大于y不成立,則把y送給最大值變量max。使max變量得到x、y中的大數(shù)。(3)if(score>=90)printf(“YourresultisanA\n”);elseif(score>=80)printf(“YourresultisanB\n”);elseif(score>=70)printf(“YourresultisanC\n”);elseif(score>=60)printf(“YourresultisanD\n”);elseprintf(“YourresultisanE\n”);執(zhí)行上面語句后,能夠根據(jù)分數(shù)score分別打出A、B、C、D、E五個等級。4.2.3switch/case語句if語句通通過嵌套可可以實現(xiàn)多多分支結(jié)構(gòu)構(gòu),但結(jié)構(gòu)構(gòu)復(fù)雜。switch是C51中提供供的專門處處理多分支支結(jié)構(gòu)的多多分支選擇擇語句。它它的格式如如下:switch(表表達式){case常常量表達達式1:{語句1;;}break;case常常量表表達式2::{語句2;}break;……case常常量表表達式n::{語句n;}break;default:{語句n+1;}說明如下::(1)switch后面括號號內(nèi)的表達達式,可以以是整型或或字符型表表達式。(2)當該該表達式的的值與某一一“case”后面面的常量表表達式的值值相等時,,就執(zhí)行該該“case”后面面的語句,,然后遇到到break語句退退出switch語語句。若表表達式的值值與所有case后后的常量表表達式的值值都不相同同,則執(zhí)行行default后后面的語句句,然后退退出switch結(jié)結(jié)構(gòu)。(3)每一一個case常量表表達式的值值必須不同同否則會出出現(xiàn)自相矛矛盾的現(xiàn)象象。(4)case語句句和default語句的出出現(xiàn)次序?qū)?zhí)行過程程沒有影響響。(5)每個個case語句后面面可以有““break”,也也可以沒有有。有break語語句,執(zhí)行行到break則退退出switch結(jié)結(jié)構(gòu),若沒沒有,則會會順次執(zhí)行行后面的語語句,直到到遇到break或或結(jié)束。(6)每一一個case語句后后面可以帶帶一個語句句,也可以以帶多個語語句,還可可以不帶。。語句可以以用花括號號括起,也也可以不括括。(7)多個個case可以共用用一組執(zhí)行行語句。【例4-3】switch/case語句的的用法。對學生成績績劃分為A~D,對對應(yīng)不同的的百分制分分數(shù),要求求根據(jù)不同同的等級打打印出它的的對應(yīng)百分分數(shù)??梢砸酝ㄟ^下面面的switch/case語句實現(xiàn)現(xiàn)。……switch(grade)){case‘‘A’’:printf(““90~100\n”);break;case‘‘B’’:printf(““80~90\n””);break;;case‘‘C’’:printf(““70~80\n””);break;;case‘‘D’’:printf(““60~70\n””);break;;case‘‘E’’:printf(““<60\n”);;break;default:printf(“error””\n)}4.2.4while語語句while語句在C51中用用于實現(xiàn)當當型循環(huán)結(jié)結(jié)構(gòu),它的的格式如下下:while(表達式式){語句句;}/*循環(huán)環(huán)體*/while語句后面面的表達式式是能否循循環(huán)的條件件,后面的的語句是循循環(huán)體。當當表達式為為非0(真真)時,就就重復(fù)執(zhí)行行循環(huán)體內(nèi)內(nèi)的語句;;當表達式式為0(假假),則中中止while循環(huán)環(huán),程序?qū)?zhí)行循環(huán)環(huán)結(jié)構(gòu)之外外的下一條條語句。它它的特點是是:先判斷斷條件,后后執(zhí)行循環(huán)環(huán)體。在循循環(huán)體中對對條件進行行改變,然然后再判斷斷條件,如如條件成立立,則再執(zhí)執(zhí)行循環(huán)體體,如條件件不成立,,則退出循循環(huán)。如條條件第一次次就不成立立,則循環(huán)環(huán)體一次也也不執(zhí)行。。【例4-4】下下面程序是是通過while語語句實現(xiàn)計計算并輸出出1~100的累加加和。#include<reg51.h>//包含含特殊功能能寄存器庫庫#include<stdio.h>//包含含I/O函函數(shù)庫voidmain(void)//主函數(shù){inti,s=0;//定義義整型變量量x和yi=1;SCON=0x52;//串口初初始化TMOD=0x20;TH1=0xF3;TR1=1;while(i<=100)//累加加1~100之之和在在s中中{s=s+i;i++;}printf(“1+2+3………+100=%d\n””,s);while(1);}程序執(zhí)執(zhí)行的的結(jié)果果:1+2+3………+100=5050語語句dowhile語句句在C51中用用于實實現(xiàn)直直到型型循環(huán)環(huán)結(jié)構(gòu)構(gòu),它它的格格式如如下::do{語語句句;}/*循環(huán)環(huán)體*/while(表表達式式);;它的特特點是是:先先執(zhí)行行循環(huán)環(huán)體中中的語語句,,后判判斷表表達式式。如如表達達式成成立((真)),則則再執(zhí)執(zhí)行循循環(huán)體體,然然后又又判斷斷,直直到有有表達達式不不成立立(假假)時時,退退出循循環(huán),,執(zhí)行行dowhile結(jié)結(jié)構(gòu)的的下一一條語語句。。dowhile語語句在在執(zhí)行行時,,循環(huán)環(huán)體內(nèi)內(nèi)的語語句至至少會會被執(zhí)執(zhí)行一一次。?!纠?-5】通通過過dowhile語語句實實現(xiàn)計計算并并輸出出1~100的的累加加和。。#include<reg52.h>//包含含特殊殊功能能寄存存器庫庫#include<stdio.h>//包含含I/O函函數(shù)庫庫voidmain(void)//主函函數(shù){inti,s=0;//定義義整型型變量量x和和yi=1;SCON=0x52;//串串口初初始化化TMOD=0x20;TH1=0xF3;TR1=1;do//累加加1~100之之和在在s中中{s=s+i;i++;}while(i<=100);printf(“1+2+3……+100=%d\n”,s);while(1);}程序執(zhí)執(zhí)行的的結(jié)果果:1+2+3………+100=5050在C51語語言中中,for語句句是使使用最最靈活活、用用得最最多的的循環(huán)環(huán)控制制語句句,同同時也也最為為復(fù)雜雜。它它可以以用于于循環(huán)環(huán)次數(shù)數(shù)已經(jīng)經(jīng)確定定的情情況,,也可可以用用于循循環(huán)次次數(shù)不不確定定的情情況。。它完完全可可以代代替while語句句,功功能最最強大大。它它的格格式如如下::for(表表達式式1;;表達達式2;表表達式式3)){語句句;}/*循環(huán)環(huán)體*/for語句句后面面帶三三個表表達式式,它它的執(zhí)執(zhí)行過過程如如下::(1))先求求解表表達式式1的的值。。(2))求解解表達達式2的值值,如如表達達式2的值值為真真,則則執(zhí)行行循環(huán)環(huán)休中中的語語句,,然后后執(zhí)行行下一一步((3))的操操作,,如表表達式式2的的值為為假,,則結(jié)結(jié)束for循環(huán)環(huán),轉(zhuǎn)轉(zhuǎn)到最最后一一步。。(3))若表表達式式2的的值為為真,,則執(zhí)執(zhí)行完完循環(huán)環(huán)體中中的語語句后后,求求解表表達式式3,,然后后轉(zhuǎn)到到第四四步。。(4))轉(zhuǎn)到到(2)繼繼續(xù)執(zhí)執(zhí)行。。(5))退出出for循循環(huán),,執(zhí)行行下面面的一一條語語句。。在for循循環(huán)中中,一一般表表達式式1為為初值值表達達式,,用于于給循循環(huán)變變量賦賦初值值;表表達式式2為為條件件表達達式,,對循循環(huán)變變量進進行判判斷;;表達達式3為循循環(huán)變變量更更新表表達式式,用用于對對循環(huán)環(huán)變量量的值值進行行更新新,使使循環(huán)環(huán)變量量能不不滿足足條件件而退退出循循環(huán)。。4.2.6for語句【例4-6】用用for語句句實現(xiàn)計計算并輸輸出1~100的累加加和。#include<reg52.h>//包含含特殊功功能寄存存器庫#include<stdio.h>//包含含I/O函數(shù)庫庫voidmain(void)//主主函數(shù){inti,s=0;//定義整整型變量量x和ySCON=0x52;//串串口初始始化TMOD=0x20;TH1=0xF3;TR1=1;for(i=1;i<=100;i++)s=s+i;//累加1~100之和和在s中中printf(“1+2+3……+100=%d\n””,s);while(1);}程序執(zhí)行行的結(jié)果果:1+2+3………+100=5050在一個循循環(huán)的循循環(huán)體中中允許又又包含一一個完整整的循環(huán)環(huán)結(jié)構(gòu),,這種結(jié)結(jié)構(gòu)稱為為循環(huán)的的嵌套。。外面的的循環(huán)稱稱為外循循環(huán),里里面的循循環(huán)稱為為內(nèi)循環(huán)環(huán),如果果在內(nèi)循循環(huán)的循循環(huán)體內(nèi)內(nèi)又包含含循環(huán)結(jié)結(jié)構(gòu),就就構(gòu)成了了多重循循環(huán)。在C51中,允允許三種種循環(huán)結(jié)結(jié)構(gòu)相互互嵌套。?!纠?-7】用用嵌套結(jié)結(jié)構(gòu)構(gòu)造造一個延延時程序序。voiddelay(unsignedintx){unsignedcharj;while(x--){for(j=0;j<125;j++);}}這里,用用內(nèi)循環(huán)環(huán)構(gòu)造一一個基準準的延時時,調(diào)用用時通過過參數(shù)設(shè)設(shè)置外循循環(huán)的次次數(shù),這這樣就可可以形成成各種延延時關(guān)系系。循循環(huán)的的嵌套break和continue語句句通常用用于循環(huán)環(huán)結(jié)構(gòu)中中,用來來跳出循循環(huán)結(jié)構(gòu)構(gòu)。但是是二者又又有所不不同,下下面分別別介紹。。1.break語句前面已介介紹過用用break語語句可以以跳出switch結(jié)結(jié)構(gòu),使使程序繼繼續(xù)執(zhí)行行switch結(jié)構(gòu)后后面的一一個語句句。使用用break語語句還可可以從循循環(huán)體中中跳出循循環(huán),提提前結(jié)束束循環(huán)而而接著執(zhí)執(zhí)行循環(huán)環(huán)結(jié)構(gòu)下下面的語語句。它它不能用用在除了了循環(huán)語語句和switch語語句之外外的任何何其它語語句中。?!纠?-8】下下面一段段程序用用于計算算圓的面面積,當當計算到到面積大大于100時,,由break語句跳跳出循環(huán)環(huán)。for(r=1;r<=10;r++){area=pi*r*r;if(area>100)break;printf(“%f\n””,area);}和和continue語語句continue語句句用在循循環(huán)結(jié)構(gòu)構(gòu)中,用用于結(jié)束束本次循循環(huán),跳跳過循環(huán)環(huán)體中continue下面面尚未執(zhí)執(zhí)行的語語句,直直接進行行下一次次是否執(zhí)執(zhí)行循環(huán)環(huán)的判定定。continue語句句和break語句的的區(qū)別在在于:continue語句句只是結(jié)結(jié)束本次次循環(huán)而而不是終終止整個個循環(huán);;break語語句則是是結(jié)束循循環(huán),不不再進行行條件判判斷。【例4-9】輸輸出出100~200間不不能被3整除的的數(shù)。for(i=100;i<=200;i++){if(i%3==0)continue;printf(“%d””,i);}在程序中中,當i能被3整除時時,執(zhí)行行continue語語句,結(jié)結(jié)束本次次循環(huán),,跳過printf(()函數(shù)數(shù),只有有能被3整除時時才執(zhí)行行printf()函函數(shù)。2.continue語句return語語句一般般放在函函數(shù)的最最后位置置,用于于終止函函數(shù)的執(zhí)執(zhí)行,并并控制程程序返回回調(diào)用該該函數(shù)時時所處的的位置。。返回時時還可以以通過return語語句帶回回返回值值。return語句句格式有有兩種::(1)return;;(2)return(表達達式);;如果return語句句后面帶帶有表達達式,則則要計算算表達式式的值,,并將表表達式的的值作為為函數(shù)的的返回值值。若不不帶表達達式,則則函數(shù)返返回時將將返回一一個不確確定的值值。通常常我們用用return語句把把調(diào)用函函數(shù)取得得的值返返回給主主調(diào)用函函數(shù)。4.3.9return語句Anyquestion??Thanks!!上機練習習:1、各自自建立工工程,輸輸入例4-4,,4-5,4-6源程程序,鏈鏈接,編編譯,調(diào)調(diào)試,用用keil串行行口窗口口觀察輸輸出結(jié)果果。2、建立立工程,,將例4-2中中的三個個程序補補充完整整,鏈接接,編譯譯,調(diào)試試。用keil串行口口窗口觀觀察輸出出結(jié)果。。要求::(1))、輸入入x和y,如果果x不等等于y,,輸出x和y的的值,相相等則不不輸出。。反過來來,改動動

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論