第三講C程序設計初步_第1頁
第三講C程序設計初步_第2頁
第三講C程序設計初步_第3頁
第三講C程序設計初步_第4頁
第三講C程序設計初步_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第三講 C 程序設計初步1主要內容 C語言概述 數(shù)據(jù)結構 程序設計流程(順序、選擇、循環(huán)) 函數(shù) 指針 文件參考資料 譚浩強,C 程序設計,第三版 B.W. Kernighan and D.M. Ritchie,The C Programming Language (C程序設計語言) , 第二版 H. Schildt,C語言大全, 第四版 2程序設計語言的發(fā)展CPU指令系統(tǒng),由0、1構成的指令碼組成;是計算機唯一能識別并直接執(zhí)行的語言用助記符號描述的指令系統(tǒng)如 ADD, SUB;需翻譯成機器語言,符號化的機器語言機器語言匯編語言高級語言面向過程面向對象面向應用效率高編程難3程序設計語言的發(fā)展5

2、254565860626466687072747678808284868890929496AdaALGOL60ALGOL68PascalModula-2BCPLBCC+JavaLISPPROLOGCOBOLFORTRAN77FORTRANPL/1Simula 67Smalltalk 80BASICANSI-BASICQBASICVBFORTRAN90CPL4程序設計語言的發(fā)展 FORTRAN:Formula Translation1956年,高級語言產(chǎn)生的標志,簡潔高效,是科學計算的主流語言 BASIC:Beginners All-purpose Symbolic Instruction Co

3、de1964年,面向大眾,特別是大學生 Pascal70年代,結構化程序設計,強調語言的可讀性 C70年代,通用的、過程式的編程語言,高效、靈活,主流的軟件開發(fā)語言5C 語言的發(fā)展 C語言的發(fā)展歷史 19691973,由 Dennis M. Ritchie 設計并實現(xiàn) 1973,UNIX的內核正式用C語言改寫 1978,B. Kernighan 和 D. RitchieC程序設計語言 19831989,ANSI C 標準形成 (C89) 1999, 發(fā)表新的標準 C99 常見的 C語言編譯器 GNU C Comipler (Linux): gcc Microsoft Visual C Comi

4、pler Borland Turbo C Intel C Comipler (Linux/Windows) PGI C Comipler (Linux/Windows)6一個簡單的編程實例/* example: calculate the sum of a and b */#include /* the main program */main() int a, b, sum; a=10; b=24; sum=add(a,b); printf(sum=%dn, sum);/* function: sum of two integers */int add(int x,int y) int z;

5、z=x+y; return(z);注解語句函數(shù)預處理7C 程序結構特點 源程序結構 一個 C 源程序由一個或多個源文件組成 每個源文件可由一個或多個函數(shù)組成 一個源程序有且只能有一個main 函數(shù),即主函數(shù) 程序執(zhí)行從 main 開始,在 main 中結束 源程序中可以有預處理命令,通常應放在源文件或 源程序的最前面8C 程序分析 每個說明和每個語句都必須以分號 “ ; ” 結尾, 但預處理命令,函數(shù)頭和花括號 “ ” 之后不能加分號 標識符,關鍵字之間必須至少加一個空格以示間隔, 若已有明顯的間隔符,也可不再加空格來間隔 一行可以寫多個語句,一個語句可以分幾行書寫 習慣用小寫字母,區(qū)分大小寫

6、 注釋:/* */ 為注釋符, 不能嵌套 不使用行號,無程序行概念 常用鋸齒形書寫格式 源程序書寫書寫漂亮的 C 程序的基本要求: 對齊 一行寫寫一個語句,一個語句寫一行使用 TAB 縮進有足夠的注釋有合適的空行9C 語言字符集 字母(大小寫共 52 個) 數(shù)字 空白符(空格符、制表符、換行符) 標點和特殊字符10C 語言詞匯 六類:標識符,關鍵字,運算符,分隔符,常量,注釋符 標識符:用來標識變量名、函數(shù)名等的字符序列 由字母、數(shù)字、下劃線組成,第一個字符必須是字母或下劃線 區(qū)分大小寫,不能用關鍵字 標準 C 不限制標識符的長度,實際長度與編譯器有關 命名原則:見名知意、不宜混淆 關鍵字 (

7、32個):具有特定意義的字符串,通常也稱為保留字 類型說明符、語句定義符(控制命令)、預處理命令字 運算符 分隔符:逗號和空格 常量:數(shù)字、字符、字符串、轉義字符、符號常量等 注釋符:以“ /* ”開頭并以“ */ ”結尾11編輯與運行 (Linux) 編寫源程序,以 .c 為擴展名(可使用任何文本編輯器) 編譯并連接源文件 (可以一步完成) 運行編譯生成的可執(zhí)行文件gcc o 輸出文件 源文件-o :指定輸出文件名,缺省為 a.out-c :只編譯不鏈接,即只生產(chǎn)目標文件(.o 文件)-Ipath :指定或增加包含文件(如 *.h)的搜索路徑-Lpath :指定(增加)庫文件的搜索路徑-ln

8、ame:與庫文件 libname.a 鏈接-O, -O1, -O2, -O3 :優(yōu)化開關-g :在目標碼中加入更多信息,用于程序調試12算法 學習程序設計的目的不只是學習一種特定的語言,而是學習進行程序設計的一般方法 掌握了算法就是掌握了程序設計的靈魂,再學習有關的計算機語言,就能順利編寫出程序 脫離了具體的語言去學習程序設計是困難的,但學習語言只是為了程序設計,它本身并不是目的程序 = 算法 + 數(shù)據(jù)結構 + 程序設計方法 + 語言工具和環(huán)境 算法:為解決一個問題而采取的方法和步驟 結構化程序設計方法程序結構規(guī)范、清晰、模塊化13主要內容 C語言概述 數(shù)據(jù)結構 程序設計流程(順序、選擇、循環(huán)

9、) 函數(shù) 指針 文件14數(shù)據(jù)結構指針類型空類型(void)定義類型(typedef)整型實型字符型 (char)整型 (int)短整型 (short)長整型 (long)單精度 (float)雙精度 (double)基本類型C 數(shù)據(jù)類型 數(shù)組結構體 (struct)枚舉型 (enum)構造類型無符號 (unsigned)有符號數(shù)據(jù)類型決定:1. 數(shù)據(jù)占內存字節(jié)數(shù)2. 數(shù)據(jù)取值范圍3. 可參與的運算與操作公用體 (union)15基本數(shù)據(jù)類型類型關鍵字所占字節(jié)數(shù)表示范圍整型int2-215 215 -1short2-215 215 -1long4-231 231 -1unsigned int2

10、0 216 -1unsigned short2 0 216 -1unsigned long4 0 232 -1實型float 4 (6-7) 10-38 1038double 8 (15-16) 10-308 10308long double 16 (18-19) 10-4932 104932字符型char1 例:example_datatype.c (long double與系統(tǒng)及編譯器有關)16常量 整型常量:整數(shù),后面加 l 或 L 表示長整型 實型常量:雙精度實數(shù),后面加 f 或 F 表示單精度 字符型常量:用單引號括起來的單個字符 字符串常量:用雙引號括起來的字符序列 在程序運行中值

11、不能改變的量 符號常量:用標識符代表常量#define PRICE 30 一般使用大寫字母 是宏定義預處理命令,不是 C 語句17變量 變量名:要求與標識符相同 變量類型:整型、實型、字符型 變量必須先聲明,后使用 值可以改變的量 變量的聲明類型關鍵字 變量名列表int i, j, k=0;double a,b=3.1415,c;char c; 變量聲明時可以進行初始化18類型轉換 自動轉換 強制轉換 不同類型的數(shù)據(jù)進行運算,需先轉換成同一類型 轉換按數(shù)據(jù)長度增加的方向進行,以保證精度不降低 所有的浮點運算都是以雙精度進行的 char 型和 short 型參與運算時,必須先轉換成 int 型

12、賦值號兩邊的數(shù)據(jù)類型不同時,右邊的類型將轉換為左邊的char, short int unsigned long double float(類型說明符) 表達式 將表達式的值轉換成指定的類型19運算符 算術運算符:+、-、*、/、%、+ (自增)、- (自減) 關系運算符:用于比較運算,、=、=、!= 邏輯運算符:用于邏輯運算,&、|、! 位操作運算符:按二進制位進行運算, &、|、 (異或)、 (右移) 賦值運算符: =、+=、-=、*=、/=、%= 、&=、|=、=、=、 .! + (type) * & sizeof* / %+ = !=&|&|? := += = *= /= 等,高低21數(shù)

13、組變量 一維數(shù)組的聲明類型關鍵字 數(shù)組名常量表達式int a10;double b12+21, c16;char ch3*4; 一維數(shù)組的引用例:example03.c數(shù)組名常量表達式 C 語言中數(shù)組的下標是從 0 開始的22數(shù)組變量 二維數(shù)組的聲明類型關鍵字 數(shù)組名常量表達式1常量表達式2double A88, B88; 二維數(shù)組的引用例:example02.c數(shù)組名常量表達式1常量表達式2 C 語言中二維數(shù)組是按行排列的23字符變量 字符變量的聲明char c1, c210, c86; 每個字符變量只能存放一個字符 字符是按 ASCII 碼的形式存放在內存中的 字符串和字符串結束標志 字符

14、串是以雙引號括起來的字符序列 通常用字符數(shù)組存放字符串 字符串結束標志“0”是系統(tǒng)自動生成的 常用的字符串函數(shù)有(在頭文件 string.h 中): puts、gets、strcat、strcpy、strcmp、strlen 例:example04.c24主要內容 C語言概述 數(shù)據(jù)結構 程序設計流程(順序、選擇、循環(huán)) 函數(shù) 指針 文件25C 程序結構C 程序源程序文件 1源程序文件 2源程序文件 n 預處理命令變量聲明函數(shù) 1函數(shù) n 函數(shù)首部函數(shù)體局部變量聲明執(zhí)行語句26語句 表達式語句 函數(shù)調用語句 控制語句 復合語句 空語句 C 語句可分為以下五類函數(shù)名(實際參數(shù)表);條件、循環(huán)等將多

15、個語句用 括起來組成的一個語句只有分號表達式;27賦值語句 賦值語句變量 = 表達式; 左端只能是變量名 當表達式的數(shù)據(jù)類型與左邊的變量不一致時,系統(tǒng)自動將表達式的值轉換為左端變量的數(shù)據(jù)類型 可以多重賦值(初始化時不能多重賦值)x=y=z=0;28輸出printfC 語言的輸入輸出函數(shù)包含在頭文件 “stdio.h” 中 輸入/輸出三要素:對象(數(shù)據(jù))、格式、設備 輸出函數(shù):printf 格式控制字符串:格式字符串轉義字符普通字符串printf(“格式控制字符串”,輸出表列); 格式字符串:以“”開頭,后面跟各種 格式字符 普通字符串:原樣輸出printf(“k=%d, a=%fn”,k, a

16、);29格式字符串%標志輸出最小寬度.精度長度類型 printf(pi= %-12.6lf, n, pi)以 % 開頭標志精度格式字符- :左對齊+ :輸出符號空格、# 輸出最小寬度小數(shù)點后輸出位數(shù)長度30 %d、%o、%x、%X、%u ( 整數(shù) ) %e (實數(shù):采用科學計數(shù)法形式 ) %f (實數(shù):采用浮點數(shù)形式) %g ( 由系統(tǒng)自動選取上述兩種格式之一) %c ( 輸出單個字符) %s ( 輸出字符串) 轉義字符n (換行) t (制表符) b (退格) r (回車) f (走紙換頁) (單引號) ” (雙引號) (反斜桿) % (百分號) a (響鈴 )格式字符串%標志輸出最小寬度.

17、精度長度類型 例:example_printf.c31輸入scanf 輸入函數(shù):scanf 地址運算符為 “ & ” 格式控制字符串只含“格式字符串”,一般格式為scanf(“格式控制字符串”,地址表列);scanf(“%d%f”,&k,&a);%*輸入數(shù)據(jù)寬度長度類型 “*” 表示跳過該輸入值 輸入多個數(shù)據(jù)時,如果格式字符串之間沒有間隔符,則輸入數(shù)據(jù)以空格或回車隔開;如果有間隔符,則用間隔符隔開scanf(“%d,%f”,&k,&a);32關系運算與邏輯運算 關系運算符 關系運算優(yōu)先級低于算術運算,第一排高于第二排 運算結果為:真 “1” 或 假 “0” = = != 邏輯運算符 優(yōu)先級:!

18、 高于算術運算,|低于&低于算術運算 運算結果為:真 “1” 或 假 “0” 邏輯運算時,所有非零值均表示真| & !33if 語句 if 語句的三種形式 表達式可以是任意表達式 (關系、邏輯、賦值、算術等) 語句可以是復合語句 else if 中間必須要留空格 if 語句可以嵌套 else 可以省略if(表達式) 語句;if(表達式) 語句1;else 語句2;if(表達式1) 語句1;else if(表達式2) 語句2; else if(表達式n) 語句n;else 語句n+1;34switch 語句 switch 語句的三種形式執(zhí)行過程:先計算表達式的值,并逐個與 case 后的常量相比

19、較,當其與某個常量相等時, 即執(zhí)行其后的語句,然后不再進行判斷,繼續(xù)執(zhí)行后面所有case后的語句。如表達式的值與所有case 后的常量表達式均不相同時,則執(zhí)行 default 后的語句switch(表達式) case 常量1: 語句1; case 常量2: 語句2; case 常量n: 語句n; default : 語句n+1; 表達式是對整數(shù)或字符作運算 語句可以是復合語句 switch 語句可以嵌套 通常每個語句后面要加 break35for 循環(huán) for 語句for(表達式1;表達式2;表達式3) 循環(huán)體執(zhí)行過程: 1) 先求解表達式1 2) 求解表達式2,若其值為真(非0),則執(zhí)行循環(huán)

20、體中的語句; 若其值為假(0),則結束循環(huán) 3) 計算解表達式3,并回到上面的第 2) 步 循環(huán)體可以是單個語句,也可以是復合語句 表達式1、2、3均可省略,但分號不能省 3個表達式都省略時,構成無限循環(huán)for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增量) 循環(huán)體36while 循環(huán) while 語句while(表達式) 循環(huán)體 循環(huán)體可以是單個語句,也可以是復合語句 dowhile 語句do 循環(huán)體 while(表達式) 無論條件是否成立,至少執(zhí)行一次循環(huán)37跳轉語句 break 語句 跳出循環(huán)體 continue 語句 跳過本次循環(huán)中剩余的語句,強行執(zhí)行下一次循環(huán) return 語句 從函數(shù)返

21、回 函數(shù)的返回值通過 return 返回return 表達式return(表達式)38主要內容 C語言概述 數(shù)據(jù)結構 程序設計流程(順序、選擇、循環(huán)) 函數(shù) 指針 文件39函數(shù)分類 從函數(shù)定義的角度:庫函數(shù)和用戶定義函數(shù) 從有無返回值角度:有返回值函數(shù)和無返回值函數(shù) 從數(shù)據(jù)傳送角度:無參函數(shù)和有參函數(shù) 函數(shù)分類數(shù)學函數(shù)、輸入輸出函數(shù)、字符串操作函數(shù)等 庫函數(shù)參見課程主頁40數(shù)學函數(shù)int abs(int i) double fabs(double x) long labs(long n) double exp(double x) double log(double x) double log1

22、0(double x) double pow(double x,double y) double pow10(int p) double sqrt(double x) double acos(double x) double asin(double x) double atan(double x) double cos(double x) double sin(double x) double tan(double x) double cosh(double x) double sinh(double x) double tanh(double x) double ceil(double x)

23、 double floor(double x) int rand() double modf(double x,double *iptr) double fmod(double x,double y) 頭文件 “math.h” 編譯時加 lm 選項 更多函數(shù)參見課程主頁例:example_math.c41函數(shù)的定義 函數(shù)的一般定義形式類型標識符 函數(shù)名(形式參數(shù)列表) 聲明部分 語句 類型標識符指明了本函數(shù)的類型,即函數(shù)返回值的類型 形參要指定數(shù)據(jù)類型,有多個形參時,用逗號隔開 如果函數(shù)不帶參數(shù),則形式參數(shù)可以省略,但括號不能省函數(shù)頭函數(shù)體int max(int a, int b) if (a

24、b) return a; else return b;例:42函數(shù)調用main() int max(int a, int b); int x,y,z; printf(input two numbers:n); scanf(%d%d,&x,&y); z=max(x,y); printf(maxmum=%d,z);int max(int a, int b) if(ab) return a; else return b;例:example_fun1.c43形參與實參 函數(shù)的形參和實參 形參只在被調用時才分配內存單元,調用結束即被釋放 形參只有在函數(shù)內部有效 實參可以是常量、變量、表達式、函數(shù)等,但它

25、們必須具有確定的值,以便把這些值傳送給形參 實參和形參在數(shù)量上,類型上,順序上應嚴格一致 參數(shù)是變量時,傳遞的是數(shù)值,即數(shù)據(jù)傳遞是單向的44數(shù)組參數(shù) 數(shù)組作為函數(shù)參數(shù) 數(shù)組的元素作為實參 數(shù)組名作為參數(shù) 形參與實參的類型必須相同 函數(shù)調用時,傳遞的是數(shù)組的首地址(地址傳遞) 形參與實參的長度可以不一致 多維數(shù)組也可以作為函數(shù)的參數(shù) 在形參表中,可以不指定形參數(shù)組的長度,或用一個變量來表示形參數(shù)組元素的個數(shù)void nzp(int a);void nzp(int a, int n);void nzp(int A5, int m);45函數(shù)返回值 函數(shù)的返回值(函數(shù)值) 返回值只能通過 retur

26、n 語句返回主調函數(shù) 函數(shù)中允許有多個 return 語句, 但每次調用只能有一個return 語句被執(zhí)行 返回值的類型和函數(shù)定義時的類型應一致, 否則以函數(shù)定義時的類型為準,自動進行類型轉換 如果返回值為整型,在函數(shù)定義時可以省去類型說明 沒有返回值的函數(shù),可以定義為“空類型”(void)46函數(shù)調用 函數(shù)調用的一般形式函數(shù)名(實參列表) 函數(shù)調用的方式 函數(shù)表達式 函數(shù)語句 函數(shù)實參z=max(x,y);scanf(%d,&a);printf(%d,max(x,y);47函數(shù)調用 如果被調函數(shù)是整型或字符型時,可以不作說明 當被調函數(shù)定義在主調函數(shù)之前時,可以不作說明 庫函數(shù)不需作說明,但

27、必須包含該函數(shù)所在的頭文件類型標識符 被調函數(shù)名(類型 形參,類型 形參, )類型標識符 被調函數(shù)名(類型,類型, ) 函數(shù)調用前需聲明可以在所有函數(shù)定義之前,在函數(shù)外預先說明各個函數(shù)的類型,則在以后的調用中,不需要作說明48函數(shù)調用 函數(shù)可以嵌套調用 函數(shù)可以遞歸調用49局部變量 在函數(shù)內作定義說明,作用域僅限于該函數(shù)內 主函數(shù)中定義的變量也只能在主函數(shù)中使用 主函數(shù)中也不能使用其它函數(shù)中定義的變量 形參是被調函數(shù)的局部變量,實參是主調函數(shù)的局部變量 在不同函數(shù)中可定義相同的變量名, 但它們代表的是不同的對象,分配不同的內存單元 復合語句中也可定義變量,其作用域只在復合語句范圍內 局部變量(

28、內部變量)根據(jù)作用域的不同,變量可分為全局變量與局部變量50全局變量 在函數(shù)外部定義的變量,其作用域是整個源程序 在函數(shù)中使用全局變量,一般應作全局變量說明 (extern) 在函數(shù)之前定義的全局變量,可不作說明 如果外部變量與局部變量同名,則使用局部變量 全局變量(外部變量)51變量存儲類別 動態(tài)存儲,函數(shù)調用結束后即被釋放 所有的局部變量缺省為自動變量 自動變量(auto)變量的存儲方式有:動態(tài)存儲與靜態(tài)存儲 靜態(tài)存儲,函數(shù)調用后不釋放,保留原來的值 靜態(tài)局部變量在編譯時賦初值,即只賦初值一次 若沒有賦初值,靜態(tài)局部變量的值為0或空字符; 而自動變量的值不定 靜態(tài)局部變量(關鍵字:stat

29、ic) 將局部變量存放在CPU的寄存器中,提供執(zhí)行效率 只有自動變量可作為寄存器變量,存放個數(shù)有限 寄存器變量(關鍵字:register)52主要內容 C語言概述 數(shù)據(jù)結構 程序設計流程(順序、選擇、循環(huán)) 函數(shù) 指針 文件53指針 指針極大地豐富了C語言的功能 運用指針編程是C語言最主要的風格之一 運用指針可以很方便地使用數(shù)組和字符串 指針能使C語言象匯編語言一樣處理內存地址,提高效率 指針是C語言中最重要的一環(huán),也是最為困難的一部分 能否正確理解和使用指針是掌握C語言的一個標志54指針定義與引用 用來存放某個變量的地址的變量稱為指針變量, 通常稱為指向該變量的指針 指針變量的定義 指針變量

30、(指針)類型標識符 *指針變量名; 指針的類型是該指針所指向的變量的數(shù)據(jù)類型 指針變量的引用& :取地址運算符* :指針運算符(或稱“間接訪問” 運算符)a=3; p=&a; *p=5;55指針運算 指針作為函數(shù)參數(shù):傳遞變量的地址 指針運算 賦值運算int a,*pa,b5,*pb;pa=&a; pb=b;int a,*pa=&a,b5,*pb=b; 加減運算:主要針對指向數(shù)組的指針變量int b5,*pb0=b,*pb3;pb3=pb0+3; 空指針:值為 0 的指針變量例:example_pointer1.c例:example_pointer2.c56數(shù)組指針 C語言中,數(shù)組名代表該數(shù)組

31、所在的內存單元的首地址 數(shù)組元素的引用方式:下標法、指針法 指向一維數(shù)組的指針變量 數(shù)組名作為函數(shù)參數(shù):傳遞數(shù)組的首地址*pb=b; b3; *(pb+3); *(b+3); 指向二維數(shù)組的指針變量 二維數(shù)組的數(shù)組名代表整個數(shù)組的首地址 二維數(shù)組可分解為多個一維數(shù)組來處理int a34;a; a0; *a; &a00;a+1; a1; &a1;例:example_pointer3.c57數(shù)組指針 指向二維數(shù)組的指針變量int (*p)4, A34; p=a;類型標識符 (*指針變量名)長度;(*p+i)+j&Aij數(shù)組的列數(shù)例:example_pointer4.c58字符串指針 指向字符串的指針變量 訪問字符串的兩種方式:字符數(shù)組、字符串指針 字符串指針的定義與普通變量指針定義一樣,但賦值不一樣char c,*p=&c;char *s=Hello world;char *ps; ps=Hello world; 字符串指針變量與字符數(shù)組的區(qū)別 賦值不一樣char *ps, str20; ps=Hello world;str=Hello world;59函數(shù)指針等 指向函數(shù)入口的指針變量略(詳見講義或參考書籍)類型標識符 (*指針變量名)(); 指針型函數(shù)(略) 指針數(shù)組和指向指針的指針(略) main函數(shù)的參數(shù)main (int argc, char *argv);60主

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論