




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
語言程序設計基礎第1頁,共144頁,2023年,2月20日,星期日2.1C51數(shù)據(jù)類型及存儲類型第2頁,共144頁,2023年,2月20日,星期日數(shù)據(jù)與數(shù)據(jù)類型
數(shù)據(jù):具有一定格式的數(shù)字或數(shù)值。數(shù)據(jù)是計算機的操作對象。不管使用何種語言、算法進行程序設計,最終在計算機中運行的只有數(shù)據(jù)流。
數(shù)據(jù)類型:數(shù)據(jù)的不同格式叫數(shù)據(jù)類型。
數(shù)據(jù)結構:數(shù)據(jù)按一定的數(shù)據(jù)類型進行排列、組合及架構稱為數(shù)據(jù)結構。第3頁,共144頁,2023年,2月20日,星期日數(shù)據(jù)類型表示方法長度數(shù)值范圍無符號字符型unsignedchar1字節(jié)0~255有符號字符型signedchar1字節(jié)-128~127無符號整型unsignedint2字節(jié)0~65535有符號整型signedint2字節(jié)-32768~32767無符號長整型unsignedlong4字節(jié)0~4294967295有符號長整型signedlong4字節(jié)-2147483648~2147483647浮點型float4字節(jié)±1.1755E-38~±3.40E+38特殊功能寄存器型sfrsfr161字節(jié)2字節(jié)0~2550~65535位類型bit、sbit1位0或1
C51數(shù)據(jù)類型及存儲第4頁,共144頁,2023年,2月20日,星期日2.1.2常量和變量
常量程序運行過程中不能被改變的量。1、整型常量及其表示方式三種表現(xiàn)形式:十進制形式:與數(shù)學上的整數(shù)表示相同。例:12,-100,0八進制形式:在數(shù)碼前加數(shù)字0。例:0123,07633,07十六進制形式:在數(shù)碼前加0X(數(shù)字0和字母X,大小寫均可)。例:0x123,0x5d,0x99f第5頁,共144頁,2023年,2月20日,星期日2、實型(浮點型)常量及其表示方式兩種表示形式十進制小數(shù)形式,由小數(shù)點和數(shù)字構成
如:0.126,523.64等指數(shù)形式:由“十進制小數(shù)”
+“e(或E)”+“十進制數(shù)整數(shù)”三部分組成。
如:12.5e-6表示12.5×10-6注意:e或E的兩邊必須有數(shù),且其右邊必須為整數(shù)如:.6E712.e56E-6十進制小數(shù)e(或E)十進制數(shù)整數(shù)第6頁,共144頁,2023年,2月20日,星期日3、字符型常量及其表示方式二種表現(xiàn)形式:用英文單引號括起來的單個字符
如:'H'、'1'、'*'等。用單引號括起來的由反斜杠(\)開頭,后接一個或n個字符代表的一種特殊字符常量——轉義字符。
如:‘\n’
––換行
‘\t’
––橫向跳格4、字符串型常量及其表示方式
用雙引號括起來的字符串。如:"GoodMorning!","A"字符串存放時,在最后加上“\0”
––
空字符。
如:"GoodMorning!""A":但'A':
GoodMorning!\0A\0A第7頁,共144頁,2023年,2月20日,星期日5、符號常量概念:是用標識符來表示一個數(shù)據(jù)。特點:只能在程序開頭賦值,在程序中不能賦值。定義形式:#define標識符常量數(shù)據(jù)如:#definePI3.14159
如:2*2.3*PI等價于2*2.3*3.14159。使用符號常量的好處:⑴含義清楚——
使用“見名知義”的符號常量名。⑵一改全改——
在define命令行改動,在程序中就全改。例:
在后續(xù)程序中出現(xiàn)PI的地方都將用數(shù)據(jù)3.14159來替換。#definePI3.14…….PI……PI………………PIPI…………………….3.14……3.14………………3.143.14………………第8頁,共144頁,2023年,2月20日,星期日變量
程序運行過程中其值可以改變的量。1、整型變量(int)及其存儲無論是unsignedint數(shù)據(jù)還是signedint數(shù)據(jù),均為2個字節(jié),其存儲方法是高位字節(jié)保存在低地址,低位字節(jié)保存在高地址。不管是unsignedlong數(shù)據(jù)還是signedlong均為4個字節(jié),其存儲方法同樣遵循“低對高、高對低”原則。地址低高…0x120x34…例:intx=0x1234;longinty=0x12345678…0x120x340x560x78…第9頁,共144頁,2023年,2月20日,星期日字節(jié)地址0123浮點數(shù)內容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM符號和階碼尾數(shù)高位尾數(shù)低位2、浮點型變量及其存儲浮點型變量(fload)占4個字節(jié),用指數(shù)方式表示。具有24位精度,尾數(shù)的最高位始終為1,不保存。具體分布:1位符號位,8位階碼位,23位尾數(shù)二進制實數(shù)X表示格式:符號位S:1表示負數(shù),0表示正數(shù)。階碼:用移碼表示,即實際階碼數(shù)加上127得到階碼的表達數(shù)。如:實際階碼-126用1表示,實際階碼0用127表示例如:浮點數(shù)-12.5X=±M×2±E尾符尾數(shù)階符階碼第10頁,共144頁,2023年,2月20日,星期日例如:浮點數(shù)-12.5⑴符號位為1,⑵
12.5的二進制數(shù)為1100.1=1.1001E+0011,⑶階碼數(shù)值為3+127=130=10000010B,⑷尾數(shù)為1001。因此,其十六進制數(shù)為0xC1480000地址低高…0xC10x480x000x00…第11頁,共144頁,2023年,2月20日,星期日3、字符變量(char)及其存儲無論是unsignedchar數(shù)據(jù)還是signedchar數(shù)據(jù),均為1個字節(jié),能夠被直接存儲在RAM中。unsignedchar:可直接被MSC-51接受signedchar:用補碼表示。需要額外的操作來測試、處理符號位,代碼量大,運算速度低。4、位變量(bit)的存儲與MCS-51硬件特性操作有關的可以定義成位變量,即
bit和sbit型位變量,直接存于RAM的位尋址空間,包括位尋址區(qū)的128位和特殊功能寄存器位。第12頁,共144頁,2023年,2月20日,星期日數(shù)據(jù)在MCS-51中的存儲方式MCS-51單片機只有bit和unsignedchar兩種數(shù)據(jù)類型支持機器指令,而其它類型的數(shù)據(jù)都需要轉換成bit或unsignedchar型后再存儲。為了減少單片機的存儲空間和提高運行速度,要盡可能地使用unsignedchar型數(shù)據(jù)。書寫方便
#defineuintunsignedint#defineucharunsignedchar第13頁,共144頁,2023年,2月20日,星期日關鍵字對應的存儲空間及范圍codeROM空間,64KB全空間data片內RAM,直接尋址,低128字節(jié)bdata片內RAM,位尋址區(qū)0x20~0x2F,可字節(jié)訪問idata
片內RAM,間接尋址,256字節(jié),與@Ri對應pdata片外RAM,分頁尋址的256字節(jié),與MOVX@Ri對應xdata片外RAM,64KB全空間2.1.3C51變量的存儲類型第14頁,共144頁,2023年,2月20日,星期日復習知識點:存儲器
MCS-51單片機中的程序存儲器(ROM)和數(shù)據(jù)存儲器(RAM),在物理空間上是相互獨立的結構。對存儲器的管理,是分為3個的邏輯地址空間進行的:片內片外統(tǒng)一編址的64KB程序存儲器地址空間;片內獨立編址的256B數(shù)據(jù)存儲器地址空間;片外獨立編址的64KB數(shù)據(jù)存儲器地址空間。訪問這3個不同的邏輯空間,要采用不同形式的指令。RAM片內RAM片外RAMROM片內ROM片外ROM第15頁,共144頁,2023年,2月20日,星期日一、數(shù)據(jù)存儲器
1、編址與訪問
51單片機片內、外數(shù)據(jù)存儲器是兩個獨立的地址空間,應單獨編址片內數(shù)據(jù)存儲器包括:RAM塊、特殊功能寄存器(SFR)塊
片內編址空間:
RAM占128個字節(jié),空間為00H~7FH;
存儲類型為data。
SFR占128個字節(jié),其編址為80H~FFH
片外數(shù)據(jù)存儲器編址方式:按8位編址:占256個字節(jié)空間為00H~FFH,存儲類型為pdata。按16位編址:占64KB
空間為0000H~FFFFH,
存儲類型為xdata。存儲類型為idata第16頁,共144頁,2023年,2月20日,星期日
2、片內數(shù)據(jù)存儲器
MCS-51單片機的內部數(shù)據(jù)存儲器空間共256字節(jié),分為工作寄存器區(qū)、位尋址區(qū)、數(shù)據(jù)緩沖區(qū)3個區(qū)域。⑴
工作寄存器區(qū)(通用寄存器)空間:00H~1FH,分為4組,每工作寄存器組含8個寄存器,用R0~R7來表示。功能:用于臨時寄存8位數(shù)據(jù)信息注意:程序運行時,只允許一個寄存器組工作,其它各組不工作,把這組寄存器稱為當前工作寄存器組,所以每組之間不會因為名稱相同而混淆出錯。由程序狀態(tài)字PSW中的PSW.3和PSW.4選擇使用哪一組寄存器工作第17頁,共144頁,2023年,2月20日,星期日
⑵
位尋址區(qū)(存儲類型為bdata)
空間:
20H~2FH。這16個字節(jié)單元的128位每一位都有一個位地址,位地址范圍為00H~7FH。功能:每一位既可作為一般的RAM使用,進行字節(jié)操作,也對單元中的每一位進行位操作,通常可以把各種程序狀態(tài)標志、位控制變量存于位尋址區(qū)內,由程序直接進行位處理。⑶數(shù)據(jù)緩沖區(qū)
空間:
30H~7FH
功能:這80個單元只能以存儲單元的形式來使用,用戶可以根據(jù)需要自由安排,被稱為通用RAM區(qū)。第18頁,共144頁,2023年,2月20日,星期日3、特殊功能寄存器(SFR,SpecialFunctionRegisters)
又稱為專用寄存器,專用于控制、管理片內算術邏輯部件、并行I/O口、串行I/O口、定時器/計數(shù)器、中斷系統(tǒng)等功能模塊的工作。
51子系列有18個專用寄存器,其中3個為雙字節(jié)寄存器,共占用21個字節(jié)
注意:
在SFR塊的地址空間80H~FFH中,除定義的21個(51子系列)字節(jié)作為特殊功能寄存器外,其余字節(jié)無定義,但用戶不能對這些字節(jié)進行讀/寫操作。第19頁,共144頁,2023年,2月20日,星期日第20頁,共144頁,2023年,2月20日,星期日C51變量的定義定義的格式:變量(非位變量)的定義由4部分組成,即在變量定義時,指定變量4種屬性。常用數(shù)據(jù)類型[存儲類型]變量名1[=初值],變量名2[=初值]…或:[存儲類型]數(shù)據(jù)類型變量名1[=初值],變量名2[=初值]…第21頁,共144頁,2023年,2月20日,星期日存儲區(qū)介紹1、data區(qū)片內RAM低128字節(jié),尋址最快,供經常使用的變量存放,但空間有限。如: ①chardatax=‘a’;
②
unsignedintdatavar[2];
③unsignedchardatavector[]=“parame”;2、bdata區(qū)片內RAM中16字節(jié)的位尋址區(qū),可進行位操作。如: ①unsignedcharbdatauxt;
②
unsignedintbdatasd;注意:該區(qū)中不允許定義浮點型變量 第22頁,共144頁,2023年,2月20日,星期日3、idata區(qū)片內RAM全256字節(jié),也可供經常使用的變量存放,但必須設定指針間接尋址,速度較慢。如: ①charidatax;
②
unsignedintidatavar[2];4、pdata區(qū)和xdata區(qū)pdata:片外RAM低256字節(jié)的尋址區(qū),訪問速度較快。xdata:片外RAM全64K字節(jié)的尋址區(qū),訪問速度較慢。如: ①unsignedcharpdatauxt;
②
unsignedintxdatasd;注意:該區(qū)中除存儲器地址外,還包含IO器件的地址
第23頁,共144頁,2023年,2月20日,星期日二、程序存儲器1、編址與訪問
由只讀存儲器ROM或EPROM組成,用來存放已編好的程序和表格常數(shù)。通過內部總線與CPU聯(lián)接,地址存放在PC中。物理配置:片內片外統(tǒng)一按16位編址,共64KB,存儲類型為code2、code區(qū)ROM中全64K字節(jié)的位尋址區(qū)。如: unsignedcharcodea[]={0x00,0x01,0x02};
第24頁,共144頁,2023年,2月20日,星期日C51變量的存儲模式若存儲類型被省略,則變量會被自動定義為默認存儲類型,其由存儲模式指令加以限制存儲模式(編譯模式)
:決定了存儲器類型、參數(shù)傳遞方法和無明確存儲區(qū)的說明。分為:small(小模式)、compact(緊湊模式)和large(大模式)一、small模式概念:在small模式下,變量的默認存儲區(qū)域是“data”、“idata”,即未指出存儲區(qū)域的變量保存到片內數(shù)據(jù)存儲器中,并且堆棧也安排在該區(qū)域中。特點:存儲容量小,但速度快。參數(shù)的傳遞:通過寄存器、堆?;蚱瑑葦?shù)據(jù)存儲區(qū)完成的第25頁,共144頁,2023年,2月20日,星期日
二、compact模式概念:在compact模式下,變量的默認存儲區(qū)域是“pdata”,即未指出存儲區(qū)域的變量保存到片外RAM低256字節(jié)里,并且堆棧也安排在該區(qū)域中。特點:是存儲容量較small模式大,速度較small模式稍慢,但比large模式要快。參數(shù)的傳遞:通過片外數(shù)據(jù)區(qū)的一個固定頁完成的。三、large模式概念:在large模式下,變量的默認存儲區(qū)域是“xdata”,即未指出存儲區(qū)域的變量保存到片外數(shù)據(jù)存儲器,最大變量數(shù)可達64KB,并且堆棧也安排在該區(qū)域中。特點:存儲容量大,速度慢參數(shù)的傳遞:通過片外數(shù)據(jù)存儲器完成的。第26頁,共144頁,2023年,2月20日,星期日表7.4存儲模式說明存儲模式說明SMALL默認的存儲類型是data,參數(shù)及局部變量放入可直接尋址片內RAM的用戶區(qū)中(最大128字節(jié))。另外所有對象(包括堆棧),都必須嵌入片內RAM。棧長很關鍵,因為實際棧長依賴于函數(shù)嵌套調用層數(shù)COMPACT默認的存儲類型是pdata,參數(shù)及局部變量放入分頁的外部數(shù)據(jù)存儲區(qū),通過@R0或@R1間接訪問,??臻g位于片內數(shù)據(jù)存儲區(qū)中LARGE默認的存儲類型是xdata,參數(shù)及局部變量直接放入片外數(shù)據(jù)存儲區(qū),使用數(shù)據(jù)指針DPTR來進行尋址。用此數(shù)據(jù)指針進行訪問效率較低,尤其對兩個或多個字節(jié)的變量,這種數(shù)據(jù)類型的訪問機制直接影響代碼的長度第27頁,共144頁,2023年,2月20日,星期日說明:1、C51支持混合模式即可以對函數(shù)設置編譯模式,所以在large模式下,可以對某些函數(shù)設置為compact模式或small模式,從而提高運行速度。2、默認編譯模式如果文件或函數(shù)未指明編譯模式,則編譯器按small模式處理。3、編譯模式控制命令
“#pragmasmall(或compact、large)”應放在文件的開始。
第28頁,共144頁,2023年,2月20日,星期日2.2C51對單片機資源的控制第29頁,共144頁,2023年,2月20日,星期日2.2.1C51特殊功能寄存器的定義21個特殊功能寄存器不連續(xù)地分布在地址為80H-FFH的128個字節(jié)的存儲空間中。特殊功能寄存器在各功能機構的分布:中央處理器(CPU):A、B、PSW、SP、DPTR;并行口:P0、P1、P2、P3;串行口:SCON、SBUF、PCON;中斷系統(tǒng):IE、IP;定時/計數(shù)器:TMOD、TCON、TH0、TL0、TH1、TL1。第30頁,共144頁,2023年,2月20日,星期日1、使用關鍵字sfr定義:格式:sfr特殊功能寄存器名=地址常數(shù)地址常數(shù)范圍:0x80~0xFF。且不允許為算數(shù)表達式例:
sfr P0=0x80; //定義P0寄存器
sfr P1=0x90; //定義P1口寄存器
sfr PSW=0xd0; //定義PSW sfr IE=0xa8; //定義IE特殊的16位特殊功能寄存器:
sfr16DPTR=0x82;說明:⑴用sfr或sfr16每次只能定義一個特殊功能寄存器。⑵定義特殊功能寄存器,必須放在函數(shù)外作為全局變量。第31頁,共144頁,2023年,2月20日,星期日2、使用頭文件訪問SFR為用戶處理方便,C51將單片機中常用的特殊功能寄存器和特殊位進行了定義,存放在reg51.h或reg52.h中用戶在使用時只需在程序開頭使用預處理命令即:#include<reg51.h>
或#include“reg51.h”就可以方便的使用它們。第32頁,共144頁,2023年,2月20日,星期日第33頁,共144頁,2023年,2月20日,星期日3、SFR中的位定義可單獨訪問特殊功能寄存器中的可尋址位格式:sbit 位變量名=位地址表達式位地址表達式有三種形式:⑴特殊功能寄存器名帶位號定義(常用)定義格式:sbit位變量名=特殊功能寄存器名^位號常數(shù)位號常數(shù)為0~7。例如:sbit P0_3=P0^3; sbit P1_4=P1^4; sbit OV=PSW^2; sbit ES=IE^4; 第34頁,共144頁,2023年,2月20日,星期日⑵
寄存器地址帶位號定義位變量定義格式:sbit位變量名=SFR的字節(jié)地址^位號常數(shù)例如:sbit P0_6=0x80^6; sbit P1_7=0x90^7; sbit AC=0xd0^6;//定義PSW的第6位
sbit EA=0xa8^7; //定義IE的第7位
⑶用直接位地址定義位變量定義格式:sbit位變量名=位地址常數(shù)位地址范圍為0x80~0xFF,是特殊功能寄存器的位地址范圍例如:sbit P0_0=0x80; sbit P1_1=0x91; sbit RS0=0xd3; //定義PSW的第3位
sbit ET0=0xa9; //定義IE的第1位
第35頁,共144頁,2023年,2月20日,星期日說明
①用sbit定義的位變量,必須能夠按位操作,而不能夠對無位操作功能的位定義位變量。
②
用sbit定義位變量,必須放在函數(shù)外面作為全局位變量,而不能在函數(shù)內部定義。
③用sbit每次只能定義一個位變量。
④用sbit定義的是一種絕對定位的位變量(因為名字是與確定位地址對應的),具有特定的意義,在應用時不能像bit型位變量那樣隨便使用。第36頁,共144頁,2023年,2月20日,星期日2.2.3C51位變量的定義1、位變量定義的一般格式:bit[存儲類型]位變量名1[=初值][,位變量名2[=初值][,…]bit位變量被保存在片內RAM中的位尋址區(qū)域(字節(jié)地址為0x20~0x2F,16字節(jié))如:
bit flag_run,receive_bit=0;
bit send_bit;2、bit型位變量與其它變量一樣,可以作為函數(shù)的形參,也可以作為函數(shù)的返回值,即函數(shù)的類型可以是位型的如:bitfunc(bitb0,bitb1){……return(b1);}3、位變量不能定義指針,不能定義數(shù)組。如:bit*bitpointer;(錯誤)bitbitarray[5];(錯誤)第37頁,共144頁,2023年,2月20日,星期日4、可位尋址對象bdata型變量(字節(jié)型、整型、長整型)可保存在RAM中的位尋址區(qū),因此可以對bdata型變量各位作位變量定義。這樣,既可以對bdata型變量作字節(jié)(或整型、長整型)操作,也可以作位操作。bdata型變量的位定義格式:
sbit位變量名=bdata型變量名^位號常數(shù)bdata型變量為在此之前應該是定義過的,位號常數(shù)可以是0~7,或0~15,或0~31。若有:unsigned char bdata operate;即可對operate的低4位作位變量定義:
sbitflag_key=operate^0; sbitflag_dis=operate^1; sbitflag_mus=operate^2; sbitflag_run=operate^3; 第38頁,共144頁,2023年,2月20日,星期日2.2.2絕對地址的訪問包括片內RAM、片外RAM以及IO的訪問兩種方法一、絕對宏用戶在使用時需在程序開頭使用預處理命令即:#include<absacc.h>或#include“absacc.h”用一組宏定義來對各個區(qū)域進行訪問CBYTE以字節(jié)形式訪問code區(qū)CWORD以字形式訪問code區(qū)DBYTE以字節(jié)形式訪問data區(qū)DWORD以字形式訪問data區(qū)XBYTE以字節(jié)形式訪問xdata區(qū)XWORD以字形式訪問xdata區(qū)PBYTE以字節(jié)形式訪問pdata區(qū)PWORD以字形式訪問pdata區(qū)第39頁,共144頁,2023年,2月20日,星期日例如:#include<absacc.h>#definePORTAXBYTE[0XFFC0]#defineNRAMDBYTE[0X40]main(){PORTA=0x3A;NRAM=0x01;}第40頁,共144頁,2023年,2月20日,星期日二、_at_關鍵字格式:[存儲類型]數(shù)據(jù)類型變量名_at_地址常數(shù)地址常數(shù)用于指定變量的絕對地址使用_at_定義的變量必須為全局變量如:dataunsignedcharx1_at_0x40xdataunsignedintx2_at_0x2000 main() {x1=0xff; x2=0x1234;
…… }第41頁,共144頁,2023年,2月20日,星期日2.3
C51的基本運算與流程控制語句第42頁,共144頁,2023年,2月20日,星期日運算符:
運算的符號表示。運算符的分類 算術運算符賦值運算符關系運算符 邏輯運算符位運算符表達式:是由操作數(shù)和運算符組成的序列。C51的基本運算符與表達式第43頁,共144頁,2023年,2月20日,星期日一、基本算術運算符+,–,,/,%①+:
加法或正值3+6,+3
②
–
:減法或負值
5–2,–3③
:
乘法35
④/:
除法5/3⑤
%
:求余7%4的值為3注意:
兩個整型數(shù)據(jù)相除,結果為整(一般向零靠攏)。如:–5/3–1“/”
中,有一個為浮點型,則結果為浮點型,使用時注意int/int出現(xiàn)數(shù)據(jù)丟失。如:5/2=25/2.0=2.5或5.0/2=2.5
“%”求余運算,兩個數(shù)都必須為整數(shù)如:x為float,則x%3不合法。1、算數(shù)運算符與算數(shù)表達式第44頁,共144頁,2023年,2月20日,星期日二、自增,自減運算符
++變量值自增1如a++,++n
–
–
變量值自減1如a--,--n區(qū)別:①intj,i=3;j=++i;
結果為:i=4 j=4②intj,i=3;j=i++;
結果為:i=4j=3①intj,i=3;j=--i;
結果為:i=2 j=2②intj,i=3;j=i--;
結果為:i=2j=3第45頁,共144頁,2023年,2月20日,星期日注意:1、++i對應–
–i,都是自增(減)運算符在前,表示先做自增(減)運算,然后再使用i值
i++對應i–
–,都是自增(減)運算符在后,表示先使用i值,然后再做自增(減)運算2、++和–
–運算符只能用于變量,不得用于常量和表達式.
如:
i++,y–
–是合法的
5++,(a+b)++均為不合法.3、不要在同一個在表達式中,隊同一個變量進行多次的i++或++i。
如:
i++*++i+i;不同的編譯系統(tǒng)有不同的答案
要慎用++、–
–運算符。第46頁,共144頁,2023年,2月20日,星期日三、數(shù)據(jù)類型轉換⑴自動轉換轉換規(guī)則是向高精度數(shù)據(jù)類型轉換、向有符號數(shù)據(jù)類型轉換。如字符型變量與整型變量相加時,則位變量先轉換字符型或整型數(shù)據(jù),然后相加。⑵強制轉換像ANSIC一樣,通過強制類型轉換的方式進行轉換。形式:(類型名)(表達式)如: floatx=3.6; inti; i=(int)x;doublefloat高低longintchar第47頁,共144頁,2023年,2月20日,星期日一、賦值運算符:符號“
=”為賦值運算符。二、賦值表達式形式:
變量=表達式功能:將一個表達式的值賦給一個變量。結合性:從右至左例:①x=10②y=a+3③a=5+(c=6)注意:賦值時,兩邊類型若不一致,則按以下規(guī)則轉換:⑴將浮點型數(shù)據(jù)(無論單,雙精度)賦給整型變量時,舍棄小數(shù).
例:inti;i=3.56;i=3⑵整型數(shù)據(jù)賦給浮點型變量,數(shù)值不變,但按浮點數(shù)形式存放.
例:floatf;f=23;f=23.000002、賦值運算符與賦值表達式第48頁,共144頁,2023年,2月20日,星期日三、復合賦值運算符
復合賦值運算符:在“=”號之前加一個算術運算符。如:+=,-=,=,/=,%=
例:a+=3;相當于a=a+3x=y+8;相當于x=x(y+8)x%=3;相當于x=x%3已知:
ints=0;inta=5;s+=a++;求:s=?第49頁,共144頁,2023年,2月20日,星期日比較運算,比較兩個操作數(shù),看是否滿足給定的關系。
如:
a>3為一關系運算
當a=5時,結果稱為“真”;當a=1時,結果稱為“假”
一、關系運算符
<:小于,a<3,b<5
<=:小于等于,a<=3,b<=5,與數(shù)學上(≤)不同
>:大于,a>3,b>5
>=:大于等于,a>=3,b>=5,與數(shù)學上(≥)不同
==:等于,a==3,與數(shù)學上(=)不同
!=:不等于,a!=3,與數(shù)學上(≠)不同3、關系運算符與關系表達式第50頁,共144頁,2023年,2月20日,星期日二、關系表達式表達式的值:關系成立,即為真,結果為1;如:5!=3,8>7
關系不成立,即為假,結果為0;如:5<3,6<=10
另外,C語言中,關系成立、非0值真比如:3、5、8-4關系不成立、0值假比如:0、8-8三、優(yōu)先級例:當a=3,b=2,c=1時
表達式c>a+b
值為?
算術運算符高低<<=>>===!=高低高低賦值運算符第51頁,共144頁,2023年,2月20日,星期日一、邏輯運算符①?。哼壿嫹?/p>
②&&:邏輯與
③||:邏輯或注意
①邏輯表達式的值與關系表達式值一樣,真為1,假為0。并且在邏輯運算中,非0值參加邏輯運算時,被看成1處理.例:如果a=4、b=5、c=0,則有:
a&&b4&&5
1&&1
1②一個邏輯表達式中的邏輯運算符并不是一定全部執(zhí)行.
例1:a&&b&&c.
如a,b,c中一者為0,則不需判斷,表達式為0。例2:a||b||c.
如a,b,c中一者為1,則不需判斷,表達式為1。4、邏輯運算符與邏輯表達式第52頁,共144頁,2023年,2月20日,星期日一、位運算符①&:按位邏輯與 ②|:按位邏輯或
③^:按位邏輯異或 ④~:按位取反⑤<<:按位左移 ⑥>>:按位右移二、操作對象只能是整型數(shù)據(jù)和字符型數(shù)據(jù),不能是浮點型數(shù)據(jù)三、運算法則如:①3&5
;6|7;6^7;~6
②已知字符型a=15(移位規(guī)則:移出位舍棄,空白位補0)
a<<2a>>25、位運算符與位運算第53頁,共144頁,2023年,2月20日,星期日例:對a進行循環(huán)右移兩位。main(){unsignedchara=0xc3,b,c;intn=2;b=a<<(8-n);c=a>>n;a=c|b;}第54頁,共144頁,2023年,2月20日,星期日高低
!,~邏輯非取反四、各運算符的優(yōu)先級
算術運算符
關系運算符
&&邏輯與||邏輯或
賦值運算符<<,>>移位高低高低高低高低高低高低&,|,^按位邏輯運算第55頁,共144頁,2023年,2月20日,星期日C51流程控制語句1、順序結構2、選擇結構3、循環(huán)結構第56頁,共144頁,2023年,2月20日,星期日是C語言中使用得最多的一種輸出函數(shù),它可一次按格式輸出多個不同類型的數(shù)據(jù)。printf的一般形式
printf(格式控制,輸出表列)
;
例如:printf("%d,%o\n",a,b);格式控制用雙引號“
...”括起來的格式符序列。將輸出的數(shù)據(jù)轉換為指定格式輸出輸出表列用“
,”號隔開的變量或表達式序列,其變量的值按對應的格式控制符所指定的格式輸出。格式輸出函數(shù)–printfprintf("%d,%o\n",a,b);第57頁,共144頁,2023年,2月20日,星期日格式控制由普通字符和格式說明符組成。1.普通字符普通字符包括可打印和不可打印的字符設:
a=6,b=4
例:printf("a=%d,
a+b=%d\n",a,a+b);顯示的結果是:
a=6,a+b=102.格式說明符:由%接一格式字符組成,如:%f,%d等例:printf("a=%d,
a+b=%d\n",a,a+b);
格式字符規(guī)定了變量輸出的具體格式常用的格式字符包括:整型數(shù)據(jù)格式字符、浮點型數(shù)據(jù)格式字符和字符型數(shù)據(jù)格式字符第58頁,共144頁,2023年,2月20日,星期日數(shù)據(jù)格式字符
①d
——十進制整數(shù)輸出
②f
——以小數(shù)形式輸出單、雙精度數(shù),并輸出6位小數(shù)(單精度有效數(shù)字7位,雙精度16位)
③C
——
輸出單個字符
④
S
——
輸出字符串如:
inta=12,b=7,c=56;floatx=123.123;charc='a';printf("%d,%d,%d",a,b,c);printf("%f",x);printf("%c,%s",c,"china");則結果:12,7,56123.123000a,china第59頁,共144頁,2023年,2月20日,星期日功能:按指定格式把鍵盤上輸入的數(shù)據(jù)傳給對應的變量形式:scanf(格式控制,地址表列)
例如:
scanf("%d,%d",&a,&b);注意:1、格式控制字符串中各格式說明與地址表列中的各變量地址必須在個數(shù)、次序、類型上必須一一對應。2、在格式控制中除格式說明符外若還有其它字符,則應在輸入數(shù)據(jù)時按順序原樣輸入。
例:
scanf("%d,%d",&a,&b);
則必須輸入:12,24↙
輸入其它形式非法
又如:
scanf("a=%d,b=%d,c=%d",&a,&b,&c);
則輸入:
a=12,b=24,c=36↙
輸入其它形式非法格式輸入函數(shù)–scanf第60頁,共144頁,2023年,2月20日,星期日3、如果格式控制中除格式說明符外,沒有其它字符,則輸入數(shù)據(jù)時,數(shù)據(jù)之間使用一個或多個空格符、Tab符或回車符作為間隔。
例:
scanf("%d%d%d",&a,&b,&c);
則有多種輸入方法:12↙24↙36↙
12ㄩ24ㄩ36↙
12ㄩㄩ24ㄩ36ㄩ↙
但在輸入字符型數(shù)據(jù)時有異
如:
scanf("%c%c%c",&c1,&c2,&c3);
如輸入:aㄩbㄩc↙第61頁,共144頁,2023年,2月20日,星期日2.3.2選擇結構流程控制語句第62頁,共144頁,2023年,2月20日,星期日1、單分支選擇if語句
形式:
if(表達式)
語句;
功能:
當表達式值為真時,執(zhí)行語句,
否則不執(zhí)行語句.例如:
if(x>y)printf("%d",x)2、雙分支選擇if語句形式:
if(表達式)
語句1;
else語句2;功能:
表達式為真,執(zhí)行語句1
表達式為假,執(zhí)行語句2例:
if(x>y)printf("%d",x);elseprintf("%d",y);表達式語句Yif語句N表達式語句1YN語句2第63頁,共144頁,2023年,2月20日,星期日注意:
1、if語句自動結合第一個語句,當滿足條件需要執(zhí)行多個語句時,應用一對{}將需要執(zhí)行的多個語句括起,形成復合語句。
例:if(a>b){t=a;a=b;b=t;}printf("a=%d,b=%d\n",a,b);2、if語句中表達式形式很靈活,可以是常量、變量、任何類型表達式、函數(shù)、指針等。只要表達式的值為非零值,條件就為真,反之條件為假。
例:①if(5)……②if(a)……
③if(!a&&b)……
3、if語句表達式寫完后沒有分號,整個if語句寫完后再加分號
例:if(a>b);i++;應寫為:if(a>b)i++;第64頁,共144頁,2023年,2月20日,星期日例:從鍵盤輸入一個年份,判斷其是否為閏年。
分析:
閏年的判斷條件當年號能被4整除但不能被100整除時,它為閏年。例如:1996年,2004年當年號能被400整除時,它為閏年。如:1600年#include"stdio.h"main()intyear;scanf("%d",&year);if()
printf("%disaleapyear\n",year);elseprintf("%disnotaleapyear\n",year);}(||year%4==0year%100!=0&&)year%400==0)({第65頁,共144頁,2023年,2月20日,星期日
3、多分支選擇if語句形式:
if(表達式1)
語句1;
elseif(表達式2)
語句2;
…
…elseif(表達式n)
語句n;
else語句n+1;表達式1語句1語句2是否表達式2語句3否是特殊形式:三分支選擇if語句形式:
if(表達式1)
語句1;
elseif(表達式2)
語句2;
else語句3;第66頁,共144頁,2023年,2月20日,星期日例:計算分段函數(shù):假輸入xX<1真X<10y=3x-9y=2x+1y=x假真y=xx<12x+11≤x<103x-9x≥10輸出y第67頁,共144頁,2023年,2月20日,星期日#include"stdio.h"main()
floatx,y;printf("enterx:");
scanf("%f",&x);
if(x<1)y=x;elseif(x<10)y=2*x+1;else y=3*x-9;printf("x=%.2f,y=%.2f\n",x,y);}程序運行情況如下:enterx:3.2↙輸出:x=3.20,y=7.40{第68頁,共144頁,2023年,2月20日,星期日例2.4:IO口定義控制,已知P1.4為開關輸入,P1.5接LEDsfrP1=0x90;sfrP3=0xB0;sbitDIPS=P1^4;sbitgreenled=P1^5;main(){unsignedchardatainval;inval=0;while(1){P1=0xff;if(DIPS==1){inval=P1&0x0f;greenled=0;}elsegreenled=1;P3=(P3&0xf0)|(P1&0x0f)}}第69頁,共144頁,2023年,2月20日,星期日一般形式:
switch(整型表達式exp){case常量表達式1:語句1
case常量表達式2:語句2
…
case常量表達式n:語句ndefault:語句n+1}
功能:
根據(jù)表達式exp的取值,判斷其與哪一個常量表達式相等。如=表達式i,則自語句i開始執(zhí)行,直到語句n+1止。若與所有常量表達式值不相等,則從default后的語句開始執(zhí)行。switch語句第70頁,共144頁,2023年,2月20日,星期日例1:設用0、1、2....6分別表示星期日、星期一....星期六。現(xiàn)輸入一數(shù)字,輸出對應的星期幾。
程序運行情況:輸入:3↙
輸出:
Wednesday
#include"stdio.h"main(){intn;scanf("%d",&n);switch(n){case0:printf("Sunday\n");break;case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;case3:printf("Wednesday\n");break;case4:printf("Thursday\n");break;case5:printf("Friday\n");break;case6:printf("Saturday\n");break;default:printf("Error");break;}}第71頁,共144頁,2023年,2月20日,星期日注意:
1、常表值必須互不相等。
例如:switch(n){case0:printf("Sunday\n");break;case1:printf("Monday\n");break;case0:printf("Tuesday\n");break;}2、case與其后面的常量表達式間至少有一個空格。
例如:
caseㄩㄩ'A':printf("85~100\n");break;
case0:printf("Sunday\n");break;3、case順序無關緊要。例如:switch(n){case0:printf("Sunday\n");break;case1:printf("Monday\n");break;case2:printf("Tuesday\n");break;}等價于:switch(n){case2:printf("Tuesday\n");break;case0:printf("Sunday\n");break;case1:printf("Monday\n");break;}第72頁,共144頁,2023年,2月20日,星期日4、default語句可以省略不用。
5、不一定非用break不可,有時幾種情況合并執(zhí)行一組語句。
例如:switch(grade){case'A':printf(">60\n");break;case'B':printf(">60\n");break;case'C':printf(">60\n");break;case'D':printf("<60\n");break;}
等價于:switch(grade){case'A':case'B':case'C':printf(">60\n");break;case'D':printf("<60\n");break;}第73頁,共144頁,2023年,2月20日,星期日例2.11:單片機P1.0和P1.1接有兩個按鍵,其四種組合分別控制P2.0~P2.3的4盞LED點亮(高電平點亮)。
#include“reg51.h"main(){chara;do{P1=0xff;a=P1;a=a&0x03;P2=P2&0xf0;switch(a){case0:P2=P2|0x01;break;case1:P2=P2|0x02;break;case2:P2=P2|0x04;break;case3:P2=P2|0x08;break;}}while(1);}第74頁,共144頁,2023年,2月20日,星期日循環(huán)結構流程控制語句第75頁,共144頁,2023年,2月20日,星期日1、語句形式:
goto語句標號;2、語句執(zhí)行流程:
在程序執(zhí)行過程中,如果遇到goto語句,則程序執(zhí)行流程無條件地轉向語句標號后的語句繼續(xù)執(zhí)行。例如:gotolabel;
……label:…...1、goto語句及與if語句構成循環(huán)第76頁,共144頁,2023年,2月20日,星期日例:
求sum=1+2+3+…+100#include"stdio.h"main()inti=1,sum=0;if(i<=100){sum=sum+i;i++;gotoloop;printf("%d",sum);}loop:}{說明:1、同一程序中,不允許有同名標號。2、goto語句通常與條件語句配合使用??捎脕韺崿F(xiàn)條件轉移、構成循環(huán)、跳出循環(huán)體等功能。但不提倡使用。第77頁,共144頁,2023年,2月20日,星期日1、專門的當型循環(huán)語句––while語句while語句的形式:
while(表達式)循環(huán)體;2、專門的“直到型”循環(huán)語句。
do--while的形式:
do
{
循環(huán)體;}
while(表達式);2、while和do-while語句AabpYNAabpYN第78頁,共144頁,2023年,2月20日,星期日例:統(tǒng)計從鍵盤輸入的一行字符,統(tǒng)計其中字母的個數(shù)(以回車鍵作為輸入結束標記)。#include"stdio.h"main(){charch;intnum=0;ch=getchar();
do{if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')num++;ch=getchar();}
while(ch!='\n');printf("num=%d\n",num);}
while(ch!='\n'){if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')num++;ch=getchar();}第79頁,共144頁,2023年,2月20日,星期日例:流水燈試驗
chari; P1=0xfe; i=0; while(i<8) { P1<<=1; i++; }第80頁,共144頁,2023年,2月20日,星期日
一種形式更為靈活的循環(huán)語句。1、for的形式:
for(表達式1;表達式2;表達式3){循環(huán)體}表達式1:在循環(huán)開始前為循環(huán)變量設置初始值。表達式2:控制循環(huán)執(zhí)行的條件,決定循環(huán)次數(shù)。表達式3:循環(huán)控制變量修改表達式。for語句計算表達式1真循環(huán)體表達式3假for的下一條語句判斷表達式2流程:第81頁,共144頁,2023年,2月20日,星期日2、for語句完全可以用while代替,并且for語句更為直觀、簡單、方便for(初始表達式1;條件表達式2;循環(huán)表達式3){循環(huán)體}相當于while代替的流程為:
表達式1;
while(表達式2){
循環(huán)體表達式3;
}第82頁,共144頁,2023年,2月20日,星期日sum=0;for(i=1;i<=100;i++)sum=sum+i;sum=0;
i=1;for(;i<=100;i++)sum=sum+i;3、for語句的三個表達式都可以是任選項,都可以省略,但要注意省略表達式后,分號間隔符不能省略。⑴for語句“表達式1”省略
for(;條件表達式2;循環(huán)表達式3)
但必須在for之前就得賦初值給循環(huán)變量
如:⑵表達式2省略,即不判斷循環(huán)條件,循環(huán)無限運行
for(初始表達式1;;循環(huán)表達式3)sum=0;i=1;while(1){sum=sum+i;i++;}如:
sum=0;for(i=1;;i++)sum=sum+i;i<=100第83頁,共144頁,2023年,2月20日,星期日
sum=0;for(i=1;i<=100;){sum=sum+i;
i++;}sum=0;for(i=1;i<=100;i++)sum=sum+i;⑶for語句“表達式3”
省略
for(初始表達式1;條件表達式2;)但在循環(huán)體中須有語句修改循環(huán)變量;以使表達式2在某一時刻為0,而正常結束循環(huán)。⑷省略表達式1和表達式3,只有表達式2。
for(;條件表達式2;)須在for之前給循環(huán)變量賦初值,且循環(huán)體中須修改循環(huán)變量⑸
三個表達式均省略,即for(;;),相當于while(1)語句.i=1;sum=0;for(;i<=100;){sum=sum+i;i++;i++i=1i=1;sum=0;while(i<=100){sum=sum+i;
i++;}}第84頁,共144頁,2023年,2月20日,星期日例:有1、2、3、4個數(shù)字,能組成多少個互不相同且無重復數(shù)字的三位數(shù)?都是多少?main(){inti,j,k;for(i=1;i<5;i++)/*以下為三重循環(huán)*/
for(j=1;j<5;j++)
for(k=1;k<5;k++)
{
if(i!=k&&i!=j&&j!=k)/*確保i、j、k三位互不相同*/
printf("%d,%d,%d\n",i,j,k);
}}第85頁,共144頁,2023年,2月20日,星期日例:延時程序voiddelay_ms(unsignedinttime){unsignedinti,j
for(i=time;i>0;i--)
for(j=112;j>0;j--)
{;}}第86頁,共144頁,2023年,2月20日,星期日例2.7:將片外RAM6000H開始的連續(xù)10個字節(jié)清零解法1:xdataunsignedcharbuffer[10]_at_0x6000voidmain(void){unsignedcharindex;
for(index=0;index<10;index++)
buffer[index]=0;}第87頁,共144頁,2023年,2月20日,星期日說明1、while語句與do-while語句的區(qū)別:
如果第一次執(zhí)行條件為真,while和do-while等價
①#include"stdio.h"main(){intx;scanf("%d",&x);
while(x!=0){if(x>0)printf("+\n");elseprintf("-\n");scanf("%d",&x);}}②
#include"stdio.h"main(){intx;scanf("%d",&x);do{if(x>0)printf("+\n");elseprintf("-\n");scanf("%d",&x);}while(x!=0);}第88頁,共144頁,2023年,2月20日,星期日
①#include"stdio.h"main(){intx=1,y=4;
while(x>3)y=y+3;
printf("%d\n",y);}②
#include"stdio.h"
main(){intx=1,y=4;
doy=y+3;while(x>3);printf("%d\n",y);}如果條件為假時,二者不同,do-while執(zhí)行一次后面的語句,而while不執(zhí)行。2、死循環(huán)的實現(xiàn)
①while(1){
…}②
do{…
}w
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- LY/T 3408-2024林下經濟術語
- 【假期提升】五升六語文暑假作業(yè)(七)-人教部編版(含答案含解析)
- 緊急任務 面試題及答案
- 2025年軍隊文職人員招聘之軍隊文職法學考前沖刺模擬試卷A卷含答案
- 2019-2025年消防設施操作員之消防設備中級技能題庫綜合試卷A卷附答案
- 遺產繼承房產過戶合同
- 汽車運輸合同協(xié)議書
- 語言學與文化差異閱讀理解題
- 信息技術支持下的農業(yè)智能生產合作協(xié)議
- 陜西省渭南市富平縣2024-2025學年八年級上學期期末生物學試題(含答案)
- 中考心理減壓輔導 中考前心理健康教育主題班會
- 小學四年級心理健康教育課
- 【上市公司的財務風險的分析和防范:以三只松鼠為例10000字(論文)】
- 部編版小學語文四年級下冊教師教學用書(教學參考)完整版
- 幼兒園消防安全知識競賽試題及答案
- 莫高窟群文閱讀教學設計
- 樂理視唱練耳簡明教程課后習題答案
- 2023年10月自考試題02398土力學及地基基礎
- 農業(yè)領域的服務禮儀
- 高壓旋噴樁加固工程施工方案
- 【鹽津鋪子公司成本管理現(xiàn)狀、問題及對策】10000字
評論
0/150
提交評論