AVR單片機(jī)C語言編程PPT課件_第1頁
AVR單片機(jī)C語言編程PPT課件_第2頁
AVR單片機(jī)C語言編程PPT課件_第3頁
AVR單片機(jī)C語言編程PPT課件_第4頁
AVR單片機(jī)C語言編程PPT課件_第5頁
已閱讀5頁,還剩94頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第1頁/共99頁22022-5-23 1 C語言基礎(chǔ)語言基礎(chǔ) 2 數(shù)據(jù)類型、運(yùn)算符和表達(dá)式數(shù)據(jù)類型、運(yùn)算符和表達(dá)式 3 程序控制語句程序控制語句 4 函數(shù)及其調(diào)用函數(shù)及其調(diào)用 5 編譯預(yù)處理編譯預(yù)處理 6 數(shù)組及指針數(shù)組及指針第2頁/共99頁32022-5-23 第3頁/共99頁42022-5-23第4頁/共99頁52022-5-23 第5頁/共99頁62022-5-23/*給定半徑,求圓的面積*/#define PI 3.14159 /*編譯預(yù)處理宏替換*/#include /*編譯預(yù)處理文件包含*/#include /*編譯預(yù)處理文件包含*/main( ) /*主函數(shù)*/ float r,

2、s; /*定義變量r、s類型為單精度實(shí)型*/ r =1.0; /*變量r賦初值*/ s=PI * pow(r,2); /*計(jì)算圓面積s*/ printf (半徑R=%f 時(shí),面積S=%f n,r,s); /*輸出結(jié)果*/例例 4 求圓面積程序求圓面積程序第6頁/共99頁72022-5-23 #define PI 3.14159 -不帶參數(shù) #define S(a,b) a*b-帶參數(shù) #define 宏定義命令 PI 符號常量(宏名,最好用大寫,以區(qū)別一般變量) 3.14159 宏體(可以是一個表達(dá)式,如3+4) 作用:用簡單符號代表宏體部份內(nèi)容(編譯時(shí)會先自動替換) 意義:直觀/多次使用/便

3、于修改 注意: #define 可出現(xiàn)在程序的任一位置 (作用范圍:由此行到程序末尾) 宏定義不是C語句,不必在行未加分號,否則會連分號一起置換。 第7頁/共99頁82022-5-23 #include stdio.h“頭文件”(標(biāo)準(zhǔn)前導(dǎo)文件) C語言是一種“裝配式”語言,許多常規(guī)的工作如輸入、輸出、數(shù)學(xué)函數(shù)等,往往事先由人做成各種“程序模塊”(庫函數(shù)),存放在各種所謂“頭文件”(.h)中。使用時(shí)只需進(jìn)行以下處理 #include “頭文件名” 或 #include 在程序的執(zhí)行部分調(diào)用該庫函數(shù):函數(shù)名(參數(shù)) 文件包含的作用,就是根據(jù)需要把相應(yīng)的某個“頭文件”的內(nèi)容在編譯時(shí)先整體嵌入所編的程

4、序中。 用戶也可以將自己設(shè)計(jì)的程序模塊等做成“頭文件”,供其他程序“包含”。第8頁/共99頁92022-5-23標(biāo)識符被#define 命令定義過#ifdef 標(biāo)識符程序段1#else程序段2#endif標(biāo)識符未被#define 命令定義過#ifndef 標(biāo)識符程序段1#else程序段2#endif#if 表達(dá)式-表達(dá)式真執(zhí)行程序段1,假執(zhí)行程序段2程序段1#else程序段2#endif第9頁/共99頁102022-5-23 C語言是一種函數(shù)式語言,它的一個函數(shù)實(shí)際上就是一個功能模塊C程序的基本組成是函數(shù)。 一個C程序是由一個固定名稱為main的主函數(shù)和若干個其他函數(shù)(可沒有)組成。 一個C程

5、序必須有一個、也只能有一個主函數(shù)。 主函數(shù)在程序中的位置可以任意,但程序執(zhí)行時(shí)總是從主函數(shù)開始,在主函數(shù)內(nèi)結(jié)束。 主函數(shù)可以調(diào)用其他各種函數(shù)(包括用戶自己編寫的),但其他函數(shù)不能調(diào)用主函數(shù)。第10頁/共99頁112022-5-23主函數(shù)的一般形式:主函數(shù)的一般形式: main( ) 說明部分程序段(定義數(shù)據(jù)類型) 執(zhí)行部分程序段(給出操作指令) 說明部分(簡單程序可能沒有此部分): float r,s; /*定義變量r、s類型為單精度實(shí)型*/ int a,b; /*定義變量a、b類型為整型*/執(zhí)行部份:輸入、賦值、計(jì)算、控制、輸出等: r=1.0; /*變量r賦初值*/ s=PI*pow(r,

6、2); /*計(jì)算圓面積s*/ printf(半徑半徑R=%f 時(shí),面積時(shí),面積S=%f n,r,s); /*輸出結(jié)果*/第11頁/共99頁122022-5-23其他函數(shù)其他函數(shù) 標(biāo)準(zhǔn)庫函數(shù)只能調(diào)用 。使用方法: 先“包含”,即將該函數(shù)所在頭文件包含在程序中。 后調(diào)用。調(diào)用方式:函數(shù)名(參數(shù))#include #include main( ) s=PI*pow(r,2); printf(“半徑R=%f 時(shí),面積S=%fn”,r,s); 說明:pow(x,y) 求xy (中的標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)) 中的標(biāo)準(zhǔn)輸出函數(shù)) 第12頁/共99頁132022-5-23其他函數(shù)其他函數(shù) 自編(定義)函數(shù): 先定義(規(guī)

7、定函數(shù)類型、函數(shù)名和函數(shù)功能) 后調(diào)用(使用所定義的函數(shù)實(shí)現(xiàn)其功能) 定義函數(shù): 函數(shù)類型 函數(shù)名(形式參數(shù)) (函數(shù)體) 調(diào)用函數(shù):函數(shù)名(參數(shù))第13頁/共99頁142022-5-23關(guān)于語句:關(guān)于語句:數(shù)據(jù)類型定義語句數(shù)據(jù)類型定義語句v語句形式 變量類型關(guān)鍵字變量類型關(guān)鍵字 變量名; float r,s; 定義r、s為單精度實(shí)型變量 int r,s; 定義r、s為整型變量【注意】在C語言程序中,所有變量都要先定義后使用,否則就會出現(xiàn)編譯錯誤提示,如: Error: Undefined symbol a in function main Lets try變量類型關(guān)鍵字 字符型(描述文字性的

8、數(shù)據(jù)) char 數(shù)值型: 整型(在機(jī)內(nèi)是準(zhǔn)確表示的整型(在機(jī)內(nèi)是準(zhǔn)確表示的) int 實(shí)型(在機(jī)內(nèi)一般是近似表示的實(shí)型(在機(jī)內(nèi)一般是近似表示的) float (有效數(shù)字6位) double(有效數(shù)字16位)變量名 C語言(變量名、符號常量名、函數(shù)名等)命名: 組成:字母、數(shù)字、下劃線 開頭:字母、下劃線 長度:32字符【注意】大小寫為不同字符(變量名一般小寫,符號常量 名一般大寫),還要注意不得與關(guān)鍵字同名。第14頁/共99頁152022-5-23關(guān)于語句:關(guān)于語句: 賦值語句賦值語句 作用:使變量獲得具體的運(yùn)算值。 語句形式 變量名=表達(dá)式(常量、變量、函數(shù)、算式及其混合); r =; /

9、*變量r賦初值*/ s=PI*pow(r,2); /*計(jì)算圓面積s*/ 變量賦初值亦可在數(shù)據(jù)類型定義時(shí)進(jìn)行: float r =1.0, s; 把變量聲明語句與賦值結(jié)合在一起的語句,術(shù)語上稱為 “初始化語句”。第15頁/共99頁162022-5-23關(guān)于語句:關(guān)于語句: 輸出語句輸出語句 作用:將運(yùn)算結(jié)果送到顯示器屏幕顯示出來 語句形式 printf ( ) ; printf (半徑半徑R=%f 時(shí),面積時(shí),面積S=%fn,r,s); printf (“Hello,everyone!”); 【注意】C語言本身沒有輸入、輸出語句,其功能要借用有關(guān)函數(shù)來實(shí)現(xiàn)。 %f 格式字符串 n 控制字符(轉(zhuǎn)義

10、字符) n表示回車換行 引號中的其他部分照原樣輸出第16頁/共99頁172022-5-23關(guān)于格式字符串關(guān)于格式字符串 表示該處將用printf語句引號外對應(yīng)表達(dá)式的值替換后輸出 例:若 printf (“半徑半徑R=%f 時(shí),面積時(shí),面積S=%fn”,r,s); 輸出結(jié)果: 半徑R=1 時(shí),面積常用格式字符串: 字符型:%c 單字符 %s 字符串 數(shù)值型:%d 整數(shù)(十進(jìn)制) %f 實(shí)數(shù)(小數(shù)形式,默認(rèn)為6位小數(shù)) 例一例一 int x = 5; f loat y =3; printf (a=%d,b=%f,c=%s,x,y, abcdefg);輸出結(jié)果:輸出結(jié)果: a=5,b=3.0000

11、00,c=abcdefg 例二例二 int x = 5; f loat y =3; printf (a=%d,b=%f,c=%s,x+2,y*3, 123defg);輸出結(jié)果:輸出結(jié)果: a=7,b=9.000000,c=123defg第17頁/共99頁182022-5-23C C語言程序的基本結(jié)構(gòu)語言程序的基本結(jié)構(gòu) 一個C程序是由一個固定名稱為main的主函數(shù)和若干個其他函數(shù)(可缺?。┙M成。 其基本結(jié)構(gòu)一般形式如右圖所示。編譯預(yù)處理部分(可選)main( ) 說明部分 /*變量定義等*/執(zhí)行部分 /*輸入/輸出/計(jì)算*/ 其他函數(shù)(可選,位置任意)第18頁/共99頁192022-5-23第1

12、9頁/共99頁202022-5-23第20頁/共99頁212022-5-23 可知對不同數(shù)據(jù)類型占用的存儲空間可知對不同數(shù)據(jù)類型占用的存儲空間: : charshort=intlong =float = = = != 關(guān)系表達(dá)式: 含有關(guān)系運(yùn)算符的表達(dá)式 特別注意 aXb 之類算式的正確寫法 : a=x & x=b(錯誤寫法:a=X5) printf(“m5”); else printf(“m=%d”,m-); printf(“m=%d”,m-); 運(yùn)算結(jié)果運(yùn)算結(jié)果: m=6,m=5 【例二】main( ) int m=5; if (+m5) printf(“m5”); else printf

13、(“m=%d”,m-); printf(“m=%d”,m-); 運(yùn)算結(jié)果運(yùn)算結(jié)果: m5 第26頁/共99頁272022-5-23邏輯運(yùn)算邏輯運(yùn)算 &(與運(yùn)算符) 運(yùn)算符兩邊均為真時(shí),結(jié)果為真 | (或運(yùn)算符) 運(yùn)算符兩邊均為假時(shí),結(jié)果為假 !(非運(yùn)算符) 將運(yùn)算符右邊真假倒置 邏輯運(yùn)算符的任一端如果為非0數(shù),則視為“真”,為0則視為假。 【例】 printf(“%d”, !3+5) 結(jié)果為5 printf(“%d”, !0+5) 結(jié)果為6注意:! 優(yōu)先于關(guān)系運(yùn)算符,與+、-同級。【例一】 main( ) int a=1,b=2,m=2,n=2; (m=ab)&+n; printf(%dn,n

14、); 運(yùn)行結(jié)果:n=2 【例二】 main( ) int a=1,b=2,m=2,n=2; (m=ba)&+n; printf(%dn,n); 運(yùn)行結(jié)果:n=3 原因:在&和|的左邊如果能判斷出結(jié)果,則右邊不再作運(yùn)算。 結(jié)論:在邏輯表達(dá)式的求解中,并不是所有的邏輯運(yùn)算符都會被執(zhí)行。只是在必須執(zhí)行下一個邏輯運(yùn)算符才能求出表達(dá)式的解時(shí),才執(zhí)行該運(yùn)算符。第27頁/共99頁282022-5-23條件運(yùn)算條件運(yùn)算 ? : (三元運(yùn)算符,即需連接三個運(yùn)算量)一般形式: e1?e2:e3 (e1為條件表達(dá)式,e2,e3為任意類型表達(dá)式)功能: 如果e10(為真),運(yùn)算結(jié)果為e2的值。 如果e1=0(為假),

15、則取e3的值。【例】分別令x=3,x=0,x= -5,求運(yùn)行結(jié)果。main( ) int x,y; printf(“Input x=”); scanf(“%d”,&x); y=x0?1:x0)y= 0 (x=0) -1 (x0)第28頁/共99頁292022-5-23位操作運(yùn)算符位操作運(yùn)算符 &(與AND) |(或OR) (異或XOR) (非NOT) (右移) 第29頁/共99頁302022-5-23第30頁/共99頁312022-5-23ifif語句語句1、簡單if語句if(表達(dá)式表達(dá)式)程序段程序段 下面程序的功能是:如果輸入的數(shù)據(jù)大于等于60,則輸出You are passed!:sca

16、nf(“%d”,&x);if(x=60) printf(“You are passed!n”); 第31頁/共99頁322022-5-232、if-else語句if(表達(dá)式) 程序段 else 程序段如果輸入的數(shù)據(jù)大于等于60,則輸出 Y o u a r e passed!否則輸出You failed!scanf(“%d”,&x);if(x=60) printf(“You are passed!n”); else printf(“You failed!n”); ifif語句語句第32頁/共99頁332022-5-23#include main() int x,y=100,z=0; x=180;

17、 if(xy) /交換x和y z=x; x=y; y=z; rintf(x=%d,y=%dn,x,y);#include main() int x,y=100,z=0; x=180; if(x0&x10&x=20) printf(“ 10.20n); else printf(errorn); ifif語句語句第34頁/共99頁352022-5-23switchswitch語句語句switch(變量或表達(dá)式P) case 常量表達(dá)式C1:程序段S1 break; case 常量表達(dá)式C2:程序段S2 break; . case 常量表達(dá)式Cn:程序段Sn break; default: 程序段S

18、n+1 break; 第35頁/共99頁362022-5-23#include main() char ch; printf(input the mark(A,B,C,D,E or F); scanf(%c,&ch); switch(ch) case A:printf(100n); break; case B:printf(90n); break; case C:printf(80n); break; case D:printf(70n); break; case E:printf(60n); break; case F:printf(50n); break; default:printf(i

19、nput error!n); switchswitch語句語句運(yùn)行結(jié)果:input the mark(A,B,C,D,E or F) D 70第36頁/共99頁372022-5-23 break子句可以省略,但是否省略break子句,要根據(jù)算法的邏輯而定。因?yàn)闆]有了break語句,switch語句會被執(zhí)行到語句結(jié)束。switchswitch語句語句char ch=N;switch(ch) case Y:printf(Yesn); break; case N:printf(Non); break; case A:printf(Alln); break;char ch=N;switch(ch) c

20、ase Y:printf(Yesn); break; case N:printf(Non); case A:printf(Alln); break;輸出:輸出:NoNo輸出:輸出:NoNo All All第37頁/共99頁382022-5-23whilewhile語句語句while語句的形式: while(表達(dá)式P)程序段S int a; long sum;/sum should be long type sum=0; a=1; while(a=100) sum+=a; a+; printf(1+2+.+%d=%ldn,100,sum);whilewhile語句的例子:計(jì)算語句的例子:計(jì)算1+

21、2+3+1+2+3+100+100的值的值 通常情況下,程序中會利用通常情況下,程序中會利用一個一個變量變量來來控制控制whilewhile語句的表語句的表達(dá)式達(dá)式P P的值,這個變量被稱為的值,這個變量被稱為循循環(huán)控制變量環(huán)控制變量。在執(zhí)行。在執(zhí)行whilewhile語句語句之前,循環(huán)控制變量之前,循環(huán)控制變量必須初始化必須初始化,否則執(zhí)行的結(jié)果將是不可預(yù)知的。,否則執(zhí)行的結(jié)果將是不可預(yù)知的。上面的程序重新編寫,其運(yùn)行結(jié)果將是不可預(yù)知的,因?yàn)樯厦娴某绦蛑匦戮帉懀溥\(yùn)行結(jié)果將是不可預(yù)知的,因?yàn)閍 a未初始化:未初始化: int a; long sum;/sum should be long t

22、ype sum=0; /a should be initialized here while(a=100) sum+=a; a+; printf(1+2+.+%d=%ldn,100,sum);第38頁/共99頁392022-5-23whilewhile語句語句有關(guān)有關(guān)whilewhile語句的幾點(diǎn)說明語句的幾點(diǎn)說明 1、要在while語句的某處(表達(dá)式P或循環(huán)體內(nèi))改變循環(huán)控制變量的值,否則極易構(gòu)成死循環(huán)。下面的while語句便是死循環(huán):x=2;while(x100)break; sum+=a; a+; 第40頁/共99頁412022-5-23whilewhile語句語句有關(guān)有關(guān)whilewh

23、ile語句的幾點(diǎn)說明語句的幾點(diǎn)說明3、如果在執(zhí)行循環(huán)體過程中,遇到了continue語句,則循環(huán)體中continue語句后面的其他語句將被跳過,而直接進(jìn)入下一輪循環(huán)。a=1;while(a=10) printf(%d,a); a+; if(a%5=1) continue; printf(*); 運(yùn)行結(jié)果:12*3*4*5*67*8*9*10第41頁/共99頁422022-5-23do-whiledo-while語句語句do-while語句的形式:do 程序段Sdo-whiledo-while語句的例子:計(jì)算語句的例子:計(jì)算1+2+3+1+2+3+100+100的值的值 int a; long

24、sum; sum=0; a=1; do sum+=a; a+; while(a=100); printf(1+2+.+%d=%ldn,100,sum); do-while語句與while語句大體相同,但要特別注意,while( )后面的分號不要漏掉。此外,while語句的循環(huán)體可能永遠(yuǎn)不被執(zhí)行,但do-while語句的循環(huán)體至少被執(zhí)行一次。第42頁/共99頁432022-5-23forfor語句語句for語句的形式: 必須是分號 必須是分號 for(表達(dá)式1 ; ; 表達(dá)式2 ; ; 表達(dá)式3) 程序段S 第43頁/共99頁442022-5-23forfor語句語句 int a; long s

25、um; sum=0; for(a=1;an2) nmax=n1; else nmax=n2; if(n3nmax) nmax=n3; printf(“max=%dn”,nmax); 輸入三個整數(shù),求三個整數(shù)中的最大值輸入三個整數(shù),求三個整數(shù)中的最大值不使用函數(shù)不使用函數(shù)(除除main外外)int max(int,int,int);main() int n1,n2,n3,nmax; scanf(“%d%d%d”,&n1,&n2,&n3); nmax=max(n1,n2,n3); printf(“max=%dn “,nmax); int max(int x,int y,int z) int m;

26、if(xy) m=x; else m=y; if(zm)m=z; return m;輸入三個整數(shù),求三個整數(shù)中的最大值輸入三個整數(shù),求三個整數(shù)中的最大值使用函數(shù)使用函數(shù)子函數(shù)定義第50頁/共99頁512022-5-23 形式參數(shù)與實(shí)際參數(shù)形式參數(shù)與實(shí)際參數(shù) 1、形式參數(shù)形式參數(shù)(形參):函數(shù)定義時(shí)設(shè)定的參數(shù)。(形參):函數(shù)定義時(shí)設(shè)定的參數(shù)。 前例中,函數(shù)頭前例中,函數(shù)頭int max(int x,int y,int z)中中x,y,z就是形參就是形參 它們的類型都是整型。它們的類型都是整型。 2、實(shí)際參數(shù)實(shí)際參數(shù)(實(shí)參):調(diào)用函數(shù)時(shí)所使用的實(shí)際的參數(shù)。(實(shí)參):調(diào)用函數(shù)時(shí)所使用的實(shí)際的參數(shù)。

27、前例中,主函數(shù)中調(diào)用前例中,主函數(shù)中調(diào)用max函數(shù)的語句是:函數(shù)的語句是:nmax=max(n1,n2,n3); 其中其中n1,n2,n3就是實(shí)參,它們的類就是實(shí)參,它們的類型都是整型。型都是整型。關(guān)于形參和實(shí)參的說明:關(guān)于形參和實(shí)參的說明: a、形參只有當(dāng)調(diào)用時(shí)才臨時(shí)分配存儲單元。、形參只有當(dāng)調(diào)用時(shí)才臨時(shí)分配存儲單元。 b、實(shí)參一定要有確定的值,可以是表達(dá)式。、實(shí)參一定要有確定的值,可以是表達(dá)式。 c、實(shí)參和形參的類型應(yīng)相同或賦值相容。、實(shí)參和形參的類型應(yīng)相同或賦值相容。第51頁/共99頁522022-5-23形式參數(shù)與實(shí)際參數(shù)形式參數(shù)與實(shí)際參數(shù) 第52頁/共99頁532022-5-23函數(shù)

28、的返回值函數(shù)的返回值 C語言可以從函數(shù)(被調(diào)用函數(shù))返回值給調(diào)用函數(shù)(這與語言可以從函數(shù)(被調(diào)用函數(shù))返回值給調(diào)用函數(shù)(這與數(shù)學(xué)函數(shù)相當(dāng)類似)。在函數(shù)內(nèi)是通過數(shù)學(xué)函數(shù)相當(dāng)類似)。在函數(shù)內(nèi)是通過return語句返回值的。語句返回值的。函數(shù)可以使用一個或者多個函數(shù)可以使用一個或者多個return語句返回值也可以不返回語句返回值也可以不返回值(此時(shí)函數(shù)類型是值(此時(shí)函數(shù)類型是void)。)。 return語句的格式:語句的格式: return 表達(dá)式表達(dá)式;或;或 return (表達(dá)式)(表達(dá)式); 說明:說明: 函數(shù)的類型就是返回值的類型,函數(shù)的類型就是返回值的類型,return語句中表達(dá)語句中

29、表達(dá)式的類型應(yīng)該與函數(shù)類型一致。如果不一致,以式的類型應(yīng)該與函數(shù)類型一致。如果不一致,以函數(shù)類型函數(shù)類型為為準(zhǔn)(賦值轉(zhuǎn)化)。準(zhǔn)(賦值轉(zhuǎn)化)。第53頁/共99頁542022-5-23 局部變量局部變量 概念:概念:是指在一定范圍內(nèi)有效的變量。是指在一定范圍內(nèi)有效的變量。C語言中,在以下各位置定義的語言中,在以下各位置定義的變量均屬于局部變量。變量均屬于局部變量。 在函數(shù)體內(nèi)定義的變量:在函數(shù)體內(nèi)定義的變量:在本函數(shù)范圍內(nèi)有效,作用域局限于函數(shù)體內(nèi)。在本函數(shù)范圍內(nèi)有效,作用域局限于函數(shù)體內(nèi)。 在復(fù)合語句內(nèi)定義的變量:在復(fù)合語句內(nèi)定義的變量:在本復(fù)合語句范圍內(nèi)有效,作用域局限于復(fù)在本復(fù)合語句范圍內(nèi)有

30、效,作用域局限于復(fù)合語句內(nèi)。合語句內(nèi)。 有參函數(shù)的形式參數(shù)也是局部變量:有參函數(shù)的形式參數(shù)也是局部變量:只在其所在的函數(shù)范圍內(nèi)有效。只在其所在的函數(shù)范圍內(nèi)有效。 第54頁/共99頁552022-5-23 全局變量全局變量 全局變量:全局變量:在函數(shù)之外定義的變量。(所有函數(shù)前,各個函數(shù)之間,在函數(shù)之外定義的變量。(所有函數(shù)前,各個函數(shù)之間,所有函數(shù)后)所有函數(shù)后) 全局變量作用域:全局變量作用域:從定義全局變量的位置起到本源程序結(jié)束為止。從定義全局變量的位置起到本源程序結(jié)束為止。 在引用全局變量時(shí)如果使用在引用全局變量時(shí)如果使用“externextern”聲明全局變量,可以擴(kuò)大全局聲明全局變量

31、,可以擴(kuò)大全局變量的作用域。例如,擴(kuò)大到整個源文件(模塊),對于多源文件變量的作用域。例如,擴(kuò)大到整個源文件(模塊),對于多源文件(模塊)可以擴(kuò)大到其它源文件(模塊)。(模塊)可以擴(kuò)大到其它源文件(模塊)。 全局變量和局部變量同名的全局變量和局部變量同名的“屏蔽屏蔽”。第55頁/共99頁562022-5-23全局變量和局部變量的應(yīng)用全局變量和局部變量的應(yīng)用局部變量局部變量輸出結(jié)果輸出結(jié)果。count is 100第56頁/共99頁572022-5-23變量(局部/全局)兩大屬性: 數(shù)據(jù)類型 存儲類別1、數(shù)據(jù)類型(復(fù)習(xí)) 通過變量說明(定義)來規(guī)定其數(shù)據(jù)類型: 格式 數(shù)據(jù)類型關(guān)鍵字 變量名 如

32、char a; int b,c ; float x,y; 為什么使用變量前要先對其數(shù)據(jù)類型進(jìn)行“說明”好比看電影前先買票訂座 預(yù)留存儲空間(如char型為1個字節(jié),int型為2個字節(jié)) 確定存儲方式(如char型存放ASCII值,int型存放補(bǔ)碼值)第57頁/共99頁582022-5-23變量(局部/全局)兩大屬性: 數(shù)據(jù)類型 存儲類別2、存儲類別 規(guī)定了變量在計(jì)算機(jī)內(nèi)部的存放位置決定變量的“壽命”(何時(shí)“生”,何時(shí)“滅”) 一個完整的變量說明格式如下: 存儲類別 數(shù)據(jù)類型 變量名 如 static int x , y ;C程序的存儲類別有: register型(寄存器型) auto型(自動變

33、量型) static型(靜態(tài)變量型) extern型(外部變量型)第58頁/共99頁592022-5-23C C程序的變量存儲位置程序的變量存儲位置變量的生存期 靜態(tài)存儲區(qū)中的變量:與程序“共存亡” 動態(tài)存儲區(qū)中的變量:與函數(shù)“共存亡” 寄存器中的變量:同靜態(tài)存儲區(qū)第59頁/共99頁602022-5-23C C程序的變量存儲類別程序的變量存儲類別 register型(寄存器型)型(寄存器型) 變量值存放在運(yùn)算器的寄存器中存取速度快,一般只允許存23個變量,且限于char型和int型,通常用于循環(huán)變量。 auto型(自動變量型)型(自動變量型) 變量值存放在主存儲器的動態(tài)存儲區(qū)(堆棧方式);優(yōu)點(diǎn)

34、同一內(nèi)存區(qū)可被不同變量反復(fù)使用。 以上兩種變量均屬于“動態(tài)存儲型”,即調(diào)用函數(shù)時(shí)才為這些變量分配單元,函數(shù)調(diào)用結(jié)束其值自動消失。第60頁/共99頁612022-5-23C C程序的變量存儲類別程序的變量存儲類別 static型(靜態(tài)變量型)型(靜態(tài)變量型)變量值存放在主存儲器的靜態(tài)存儲區(qū)程序執(zhí)行開始至結(jié)束,始終占用該存儲空間 extern型(外部變量型)型(外部變量型)同上,其值可供其他源文件使用以上兩種均屬于“靜態(tài)存儲”性質(zhì),即從變量定義處開始,在整個程序執(zhí)行期間其值都存在(都可用!)第61頁/共99頁622022-5-23 auto(默認(rèn)) 所在函數(shù)調(diào)用結(jié)束時(shí),其值自動消失局部變量 reg

35、ister 如不賦初值,取不確定值為初值 static 所有函數(shù)調(diào)用結(jié)束,其值仍保留 如不賦初值,取初值為0(數(shù)值型)或空字符0(字符型) extern(默認(rèn))允許本源文件中其他函數(shù)及其他全局變量 源文件使用 static 只限本源文件中使用 第62頁/共99頁632022-5-23求程序運(yùn)行結(jié)果求程序運(yùn)行結(jié)果main() int a=2,i; clrscr( );/清楚屏幕,內(nèi)部函數(shù) for (i=0;i3;i+) printf(%4d,f(a);f(int a) int b=0; static int c=3; b+;c+; return a+b+c; 變量跟蹤變量跟蹤 mainmain(

36、 )( ) f f函數(shù)函數(shù) a i a i b b f(a) f(a) 2 0 01 4 7 2 0 01 4 7 1 01 5 8 1 01 5 8 2 01 6 9 2 01 6 9 【結(jié)果結(jié)果】 7 8 9 7 8 9 如果去掉如果去掉staticstatic呢?呢?【結(jié)果結(jié)果】 7 7 7第63頁/共99頁642022-5-23求程序運(yùn)行結(jié)果求程序運(yùn)行結(jié)果main() int k=4,m=1,p; clrscr(); p=func(k,m); printf(%d,p); p=func(k,m); printf(%d,p);func(int a,int b) static int m=0

37、,i=2; i+=m+1; m=i+a+b; return m; 變量跟蹤變量跟蹤 main( ) func函數(shù) k m a b m i 4 1 4 1 08 23 4 1 4 1 817 312 【結(jié)果】 8, 17 如果去掉如果去掉staticstatic呢?呢?【結(jié)果】 8, 8第64頁/共99頁652022-5-23求程序運(yùn)行結(jié)果求程序運(yùn)行結(jié)果#include main() int a=3, b=2, c=1; /注意應(yīng)用范圍 int b=5, c=12;/注意應(yīng)用范圍 c-=b*2; printf(a=%d,b=%d,c=%dn, a, b, c); a+=c; printf(a=%

38、d,b=%d,c=%dn, a, b, c);【結(jié)果】 a=3,b=5,c=2 a=5,b=2,c=1 第65頁/共99頁662022-5-23int a=3,b=5;max(int a,int b) int c; c=ab?a:b; return c; main() int a=8; printf(%dn,max(a,b); 求程序運(yùn)行結(jié)果求程序運(yùn)行結(jié)果【結(jié)果】 8如果主函數(shù)中沒有int a=8,結(jié)果? 【結(jié)果】 5如果讓主函數(shù)中int a=4或a=-1,結(jié)果? 【結(jié)果】 均為 5第66頁/共99頁672022-5-23求程序運(yùn)行結(jié)果求程序運(yùn)行結(jié)果void num() extern int

39、x,y; int a=15,b=10; x=a-b; y=a+b;int x,y;main() int a=7,b=5; x=a+b; y=a-b; num(); printf(%d,%dn,x,y);【結(jié)果】 5,25如果第二行不加上如果第二行不加上externextern呢?呢? 【結(jié)果】 12,2 第67頁/共99頁682022-5-23求程序運(yùn)行結(jié)果求程序運(yùn)行結(jié)果int a=0;fun(int i) a+=2*i; return a; main() int a=10; clrscr( ); printf(%d,%dn,fun(a),a); 【結(jié)果】 20,10 第68頁/共99頁692

40、022-5-23 預(yù)處理 在編譯之前對源程序進(jìn)行“預(yù)處理” 預(yù)處理命令不是C語句,末尾沒有分號 預(yù)處理命令不在可執(zhí)行文件中執(zhí)行 預(yù)處理命令都以#開始 包括宏定義、文件包含、條件編譯等 舉例 #define MAX 1000 #include 第69頁/共99頁702022-5-23 無參數(shù)的宏定義 帶參數(shù)的宏定義第70頁/共99頁712022-5-23無參數(shù)的宏定義無參數(shù)的宏定義 一般形式 #define 標(biāo)識符 字符串 說明 把源程序中相應(yīng)標(biāo)識符予以替換 僅是簡單的字符串替換,沒有任何語法正確性檢查 有效范圍從定義處開始,到文件結(jié)束,或者由#undef命令終止作用域 行末沒有分號,如有分號將

41、會被一起替換#define L 2*PI*R#define begin #define end #define forever for(;)int main()begin /* */ printf(L=%f, L);#undef PI /* 取消對PI的宏定義 */ forever; /* for(;); 無限循環(huán) */end /* */第71頁/共99頁722022-5-23帶參數(shù)的宏定帶參數(shù)的宏定義義 一般形式 #define 宏名(參數(shù)表) 字符串 說明 宏定義僅是把參數(shù)作為字符串做簡單替換,而不做任何運(yùn)算求值和語法檢查 宏名與參數(shù)表的括號之間不應(yīng)有空格 應(yīng)注意參數(shù)替換后可能出現(xiàn)的語法錯

42、誤和意料之外的運(yùn)算 應(yīng)在宏定義內(nèi)容及其中參數(shù)兩邊加上括號#define S1(a,b) a*b#define S2(a,b) (a)*(b)#define max(a,b) (a)(b)?(a):(b)int main() int x=3, y=4, i=5, j=6, s, z; s=S1(x+y, x-y); /* s=x+y*x-y; s=11 */ s=S2(x+y, x-y); /* s=(x+y)*(x-y); s=-7 */ z=max(i+, j+); /* z=(i+)(j+)?(i+):(j+); */ /* z=7, i=6, j=8 */第72頁/共99頁732022-

43、5-23 一般形式 #include filename #include 說明 把另一個源文件的全部內(nèi)容包含進(jìn)來 預(yù)編譯后,它們已成為一個文件 頭文件的擴(kuò)展名一般用.h,但并非規(guī)定 調(diào)用庫函數(shù)一般使用,也可以使用 調(diào)用用戶編寫的頭文件應(yīng)使用第73頁/共99頁742022-5-23 條件編譯 對某些部分的源程序指定編譯的條件 可以減少被編譯的語句,減少目標(biāo)程序的長度,減少運(yùn)行時(shí)間 有利于移植程序,增加程序的靈活性 命令形式 #ifdef.#else.#endif #ifndef.#else.#endif #if.#else.#endif第74頁/共99頁752022-5-23 如果標(biāo)識符被定義過

44、* 如果標(biāo)識符未被定義過 #ifdef 標(biāo)識符 #ifndef 標(biāo)識符 程序段1 程序段1 /*編譯此程序段*/ #else #else/*#else部分可省略*/ 程序段2 程序段2 /*反之,編譯此程序段*/ #endif #endif *此處指標(biāo)識符用#define等命令定義過。 #if 表達(dá)式 /*如果表達(dá)式為真*/ 程序段1 /*編譯程序段1*/ #else 程序段2 /否則*編譯程序段2*/ #endif第75頁/共99頁762022-5-23#define DEBUG 0main() int a=10,b=20,c; clrscr(); c=a/b; #ifdef DEBUG p

45、rintf(a=%d,b=%dn,a,b); #endif printf(c=%dn,c);結(jié)果:a=10,b=20c=0如果沒有#define行呢? 只輸出c=0 第76頁/共99頁2022-5-2377 C 語言可以根據(jù)用戶需要,用基本數(shù)據(jù)類型定義語言可以根據(jù)用戶需要,用基本數(shù)據(jù)類型定義特殊性質(zhì)的數(shù)據(jù)類型,稱為特殊性質(zhì)的數(shù)據(jù)類型,稱為。構(gòu)造類型有:。構(gòu)造類型有:數(shù)組、結(jié)構(gòu)體、共同體。數(shù)組、結(jié)構(gòu)體、共同體。 數(shù)組數(shù)組:相同數(shù)據(jù)類型變量的有序集合。有序表現(xiàn):相同數(shù)據(jù)類型變量的有序集合。有序表現(xiàn)在數(shù)組元數(shù)在內(nèi)存中連續(xù)存放。在數(shù)組元數(shù)在內(nèi)存中連續(xù)存放。 數(shù)組用一個名字作為標(biāo)識。為區(qū)分各元素,每個數(shù)

46、組用一個名字作為標(biāo)識。為區(qū)分各元素,每個元素有一個用整型表示的序號,稱之為下標(biāo)。下標(biāo)可元素有一個用整型表示的序號,稱之為下標(biāo)。下標(biāo)可以有多個,下標(biāo)的個數(shù)稱為數(shù)組的維數(shù)。以有多個,下標(biāo)的個數(shù)稱為數(shù)組的維數(shù)。第77頁/共99頁2022-5-23781.1.一維數(shù)組的定義一維數(shù)組的定義type array1常量表達(dá)式常量表達(dá)式, , arrayn常量表達(dá)式常量表達(dá)式;類型說明符,說明數(shù)組的類型。類型說明符,說明數(shù)組的類型。數(shù)組名,用標(biāo)識符命名。數(shù)組名,用標(biāo)識符命名。數(shù)組的元素的個數(shù),數(shù)組的下標(biāo)數(shù)組的元素的個數(shù),數(shù)組的下標(biāo)從從0變化到常量達(dá)式的值減一。變化到常量達(dá)式的值減一。 例:例:int a5;i

47、nt a5; float b20,c15; float b20,c15;a0a1a2a3a4分配內(nèi)存分配內(nèi)存第78頁/共99頁2022-5-2379一維數(shù)組定義的幾點(diǎn)說明:一維數(shù)組定義的幾點(diǎn)說明:v 數(shù)組名命名規(guī)則和變量名相同,遵循標(biāo)識符定名規(guī)則。數(shù)組名命名規(guī)則和變量名相同,遵循標(biāo)識符定名規(guī)則。v 數(shù)組名后是用數(shù)組名后是用方括弧方括弧括起來的常量表達(dá)式,不能用圓括括起來的常量表達(dá)式,不能用圓括 弧弧. . 如:如: int a (10); ERROR!int a (10); ERROR!v 常量表達(dá)式表示元素的個數(shù),即數(shù)組長度。常量表達(dá)式表示元素的個數(shù),即數(shù)組長度。 如如: : a10a10有

48、有1010個元素分別為:個元素分別為: a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;注意不能使用數(shù)組元素注意不能使用數(shù)組元素a10a10。v 常量表達(dá)式中可以包括常量和符號常量,常量表達(dá)式中可以包括常量和符號常量,不能包含變量不能包含變量。也就是說,也就是說,C C語言不允許對數(shù)組的大小作動態(tài)定義。例如,語言不允許對數(shù)組的大小作動態(tài)定義。例如,下面這樣定義數(shù)組是不行的:下面這樣定義數(shù)組是不行的: int nint n; scanf(%d scanf(%d,&n)&n); int an; int an; ERROR!ER

49、ROR!第79頁/共99頁2022-5-23802.2.一維數(shù)組的引用一維數(shù)組的引用原原 則:則:只能引用數(shù)組元素,而不能引用整個數(shù)組只能引用數(shù)組元素,而不能引用整個數(shù)組。引用方式:引用方式:數(shù)組名數(shù)組名 下標(biāo)下標(biāo) 下標(biāo)可以是整型常量或整型表達(dá)式。下標(biāo)可以是整型常量或整型表達(dá)式。每個數(shù)組元素,可以出現(xiàn)在簡單變量能夠出現(xiàn)的任何地方。每個數(shù)組元素,可以出現(xiàn)在簡單變量能夠出現(xiàn)的任何地方。例:例: main () main () int i,a10; int i,a10; for (i for (i0 0;ii9 9;i+)i+) ai aii;i; for(i for(i9 9;i i0 0;i-)

50、i-) printf printf(%d,ai);%d,ai); 第80頁/共99頁2022-5-23813.3.一維數(shù)組的初始化一維數(shù)組的初始化對數(shù)組元素的初始化可以用以下方法實(shí)現(xiàn):對數(shù)組元素的初始化可以用以下方法實(shí)現(xiàn):v在定義數(shù)組時(shí)對數(shù)組元素賦以初值。例如在定義數(shù)組時(shí)對數(shù)組元素賦以初值。例如 int a10=0 int a10=0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,99;v只給一部分元素賦值。例如只給一部分元素賦值。例如 int a10 int a1000,1 1,2 2,3 3,44; 這表示這表示只給前面只給前面5 5個元素賦初值個元素賦初值, ,后后5

51、5個元素值為個元素值為0 0。v使一個數(shù)組中全部元素值為使一個數(shù)組中全部元素值為0 0 int a10=0,0,0,0,0,0,0,0,0,0 int a10=0,0,0,0,0,0,0,0,0,0; 或或 int a10=0;int a10=0; 不能寫成不能寫成: :int a10=0int a10=0* *1010; 第81頁/共99頁2022-5-23823.3.一維數(shù)組的初始化一維數(shù)組的初始化v在對全部數(shù)組元素賦初值時(shí),可以不指定數(shù)組長度。在對全部數(shù)組元素賦初值時(shí),可以不指定數(shù)組長度。 例如:例如: int int a5=a5=1, 21, 2,3 3,4 4,55; 可以寫成可以寫

52、成: : int int aa1, 21, 2,3 3,4 4,5;5; 如想定義數(shù)組長度為如想定義數(shù)組長度為1010,就不能省略數(shù)組長度的定義,就不能省略數(shù)組長度的定義,而必須寫成而必須寫成: : int a10 int a1011,2 2,3 3,4 , 5;4 , 5; 只初始化前只初始化前5 5個元素,后個元素,后5 5個元素為個元素為0 0。 第82頁/共99頁2022-5-2383例:輸入例:輸入1010個整數(shù),分別按個整數(shù),分別按順序順序和和逆序逆序輸出。輸出。#include main()int i;static int a10; printf(input 10 numbers

53、:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n);for(i=0;i=0;i-) printf(%d,ai);程序的運(yùn)行情況:input 10 numbers:1 2 3 4 5 6 7 8 9 101 2 3 4 5 6 7 8 9 1010 9 8 7 6 5 4 3 2 1 第83頁/共99頁2022-5-23841.1.二維數(shù)組的定義二維數(shù)組的定義 定義方式: 類型 數(shù)組名表達(dá)式1表達(dá)式2;行數(shù)列數(shù)例:float a34,b510;不能寫成float a3,4,b5,10;第84頁/共99頁2022-5-2385說明:說明:v二維數(shù)組可看作特殊

54、的一維數(shù)組;二維數(shù)組可看作特殊的一維數(shù)組;v元素在內(nèi)存排列順序?yàn)榘葱写娣?;元素在?nèi)存排列順序?yàn)榘葱写娣牛籿多維數(shù)組定義亦類似于二維數(shù)組多維數(shù)組定義亦類似于二維數(shù)組 如:如:floata234;floata234;1.1.二維數(shù)組的定義二維數(shù)組的定義a00 a01 a02a10a11a12例: int a23; 它的存儲情況:按行存放第85頁/共99頁2022-5-2386把二維數(shù)組看作是把二維數(shù)組看作是一種特殊的一維數(shù)組一種特殊的一維數(shù)組:它的元素又是一個它的元素又是一個一維數(shù)組一維數(shù)組。例如,可以把。例如,可以把a(bǔ)34a34看作是一個一維數(shù)組,它看作是一個一維數(shù)組,它有有3 3個個元素,元素

55、,每個元素又是一個包含每個元素又是一個包含4 4個元素的一維數(shù)組個元素的一維數(shù)組: a0a0 a00 a01 a02 a03a00 a01 a02 a03 a1a1 a10 a11 a12 a13a10 a11 a12 a13 a2a2 a20 a21 a22 a23a20 a21 a22 a23 上面定義的二維數(shù)組可以理解為定義了三個一維數(shù)組,即上面定義的二維數(shù)組可以理解為定義了三個一維數(shù)組,即相當(dāng)于相當(dāng)于 f1oat a04,a14,a24f1oat a04,a14,a24此處把此處把a(bǔ)0,a1,a2a0,a1,a2看作一維數(shù)組名看作一維數(shù)組名。c c語言的這種處理語言的這種處理方法在數(shù)組

56、初始化和用指針表示時(shí)顯得很方便,這在以后會方法在數(shù)組初始化和用指針表示時(shí)顯得很方便,這在以后會介紹。介紹。 第86頁/共99頁2022-5-23872.2.二維數(shù)組的引用二維數(shù)組的引用數(shù)組名行下標(biāo) 列下標(biāo); 如:a23,數(shù)組元素可出現(xiàn)在表達(dá)式中,也可被賦值如: a12= a02/2。 注意:下標(biāo)值應(yīng)在已定義的數(shù)組大小的范圍內(nèi)。 如:a23錯了,其最大下標(biāo)為1和2。第87頁/共99頁2022-5-23883.3.二維數(shù)組的初始化二維數(shù)組的初始化1 1)分行初始化。如:)分行初始化。如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;static int a34

57、=1,2,3,4,5,6,7,8,9,10,11,12;2 2)按數(shù)組排列的順序?qū)⑺袛?shù)據(jù)寫在一個花括號內(nèi)。如:)按數(shù)組排列的順序?qū)⑺袛?shù)據(jù)寫在一個花括號內(nèi)。如:static inta34=1,2,3,4,5,6,7,8,9,10,11,12;static inta34=1,2,3,4,5,6,7,8,9,10,11,12;3 3)部分元素初始化。如:)部分元素初始化。如:static int a34=1,0,6,0,0,11;static int a34=1,0,6,0,0,11;4 4)如果對全部元素都賦初值,則定義數(shù)組時(shí)可以不指定)如果對全部元素都賦初值,則定義數(shù)組時(shí)可以不指定 第一維的

58、長度。如:第一維的長度。如:static int a4=1,2,3,4,5,6,7,8,9,10,11,12;static int a4=1,2,3,4,5,6,7,8,9,10,11,12;第88頁/共99頁2022-5-2389 C語言沒有字符串變量,語言沒有字符串變量,可以定義字符數(shù)組,每可以定義字符數(shù)組,每個元素存放一個字符個元素存放一個字符,從而達(dá)到存放字符串的目的。,從而達(dá)到存放字符串的目的。字符數(shù)組的定義字符數(shù)組的定義char 數(shù)組名數(shù)組名下標(biāo)下標(biāo);char a10,b212;字符數(shù)組的初始化字符數(shù)組的初始化一維數(shù)組賦初值一維數(shù)組賦初值: :用單個字符對每一個元數(shù)賦值用單個字符對

59、每一個元數(shù)賦值。char str15= h, e, l, l, o;把把5個字符分別賦給個字符分別賦給str10str4這這5個元素個元素第89頁/共99頁2022-5-2390注意:注意:v如果花括弧中提供的初值個數(shù)(即字符個數(shù))大于數(shù)組長如果花括弧中提供的初值個數(shù)(即字符個數(shù))大于數(shù)組長度,則作語法錯誤處理。如:度,則作語法錯誤處理。如: char str14= char str14= h h, , e e, , l l, , l l, , o o; ; ERROR!ERROR!v如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中前面那些元

60、素,前面那些元素,其余的元素自動為空字符其余的元素自動為空字符( (即即00) )。 char str110= char str110= h h, , e e, , l l, , l l, , o o;v如果初值個數(shù)與預(yù)定的數(shù)組長度相同,在定義時(shí)可以省略如果初值個數(shù)與預(yù)定的數(shù)組長度相同,在定義時(shí)可以省略數(shù)組的長度,系統(tǒng)會自動根據(jù)初值個數(shù)確定數(shù)組長度。數(shù)組的長度,系統(tǒng)會自動根據(jù)初值個數(shù)確定數(shù)組長度。 char str1= char str1= h h , ,e e , ,l l , ,l l, , o o;等價(jià)于:等價(jià)于:char str15= char str15= h h, , e e, ,

溫馨提示

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

最新文檔

評論

0/150

提交評論