C程序設(shè)計(jì)案例教程(下)課件_第1頁(yè)
C程序設(shè)計(jì)案例教程(下)課件_第2頁(yè)
C程序設(shè)計(jì)案例教程(下)課件_第3頁(yè)
C程序設(shè)計(jì)案例教程(下)課件_第4頁(yè)
C程序設(shè)計(jì)案例教程(下)課件_第5頁(yè)
已閱讀5頁(yè),還剩120頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C程序設(shè)計(jì)案例教程(下)第1頁(yè),共125頁(yè)。第5章 函數(shù)第6章數(shù)組第7章 指針第8章結(jié)構(gòu)體第9章文件第2頁(yè),共125頁(yè)。第5章 函數(shù)5.1 計(jì)算機(jī)圓的面積 5.2 使用函數(shù)編寫(xiě)程序 5.3 變量與函數(shù)5.4 遞歸方法在函數(shù)中的應(yīng)用5.5 編譯預(yù)處理5.6 綜合應(yīng)用四則運(yùn)算測(cè)試系統(tǒng)第3頁(yè),共125頁(yè)。本章學(xué)習(xí)目標(biāo)熟練掌握函數(shù)的基本使用方法理解并熟練運(yùn)用函數(shù)中的幾種變量學(xué)習(xí)在函數(shù)中使用遞歸方法掌握宏定義與編譯預(yù)處理的相關(guān)知第4頁(yè),共125頁(yè)。5.1 計(jì)算圓的面積5.1.1 函數(shù)的定義C程序是由一個(gè)或多個(gè)C函數(shù)構(gòu)成, C函數(shù)是完成某個(gè)整體功能的最小程序單位,即函數(shù)是程序開(kāi)發(fā)中能夠完成一個(gè)相對(duì)獨(dú)立的特

2、定功能的模塊單元。C函數(shù)包括庫(kù)函數(shù)和自定義函數(shù)兩種。第5頁(yè),共125頁(yè)。在C函數(shù)中,自變量和因變量統(tǒng)稱為形式參數(shù),且放在圓括號(hào)中。根據(jù)抽象形式,C函數(shù)分為三種:l有參函數(shù) 在有參函數(shù)中,要善于區(qū)分形式參數(shù)中哪些是輸入形參,哪些是輸出形參,或兼而有之。l無(wú)參函數(shù) 該類型的函數(shù)只完成某個(gè)功能。l空函數(shù)這是一種特殊函數(shù)即無(wú)形式參數(shù)也無(wú)功能,只有一個(gè)函數(shù)框架,不完成任何功能。第6頁(yè),共125頁(yè)。C程序是由一個(gè)或多個(gè)函數(shù)組成,其中必須有且僅有一個(gè)函數(shù)名為main的主函數(shù)。在C語(yǔ)言中,函數(shù)是不可以嵌套定義的,但函數(shù)間卻可以互相調(diào)用,函數(shù)調(diào)用完畢就返回調(diào)用到它的斷點(diǎn)處。第7頁(yè),共125頁(yè)。 以純計(jì)算為功能的

3、函數(shù)。這種函數(shù)的調(diào)用目的就是求值。函數(shù)經(jīng)過(guò)一系列運(yùn)算,最終將計(jì)算的結(jié)果用return語(yǔ)句返回。 以純“執(zhí)行動(dòng)作”為功能的函數(shù)。這種函數(shù)的調(diào)用目的不是最終求個(gè)計(jì)算結(jié)果,而是更加強(qiáng)調(diào)過(guò)程,在函數(shù)的運(yùn)行過(guò)程中要執(zhí)行一些“動(dòng)作”(例如要在屏幕中顯示幾行星號(hào))。這種函數(shù)沒(méi)有返回值(一般省略return 語(yǔ)句,個(gè)別情況出現(xiàn)return語(yǔ)句,其目的也是為了提前結(jié)束函數(shù),return語(yǔ)句后不會(huì)跟數(shù)值表達(dá)式。函數(shù)返回值類型是void) 前兩種情況的組合,既強(qiáng)調(diào)過(guò)程又關(guān)心最終運(yùn)行結(jié)果的函數(shù)。針對(duì)函數(shù)調(diào)用有無(wú)返回值,可將函數(shù)功能分為以下三種不同的情況:第8頁(yè),共125頁(yè)。此類函數(shù)的一般定義形式為:函數(shù)類型 函數(shù)名(

4、形參表) /*函數(shù)首部*/ 函數(shù)計(jì)算過(guò)程; return (函數(shù)值表達(dá)式);函數(shù)定義包括函數(shù)首部和函數(shù)體兩部分,其中函數(shù)首部由函數(shù)類型、函數(shù)名和參數(shù)表組成;函數(shù)體由包含在大括號(hào)內(nèi)的一系列語(yǔ)句構(gòu)成,最后的return語(yǔ)句用于返回運(yùn)算結(jié)果,即函數(shù)值。1以純計(jì)算為功能的函數(shù)定義第9頁(yè),共125頁(yè)。函數(shù)類型一般與return語(yǔ)句中的函數(shù)值表達(dá)式類型一致;形參表中要給出函數(shù)所有形參的名稱和類型,格式為:類型1 形參1, 類型2 形參2,,類型n 形參n形參表中各形參之間用逗號(hào)分隔,每個(gè)形參前面的類型必須分別寫(xiě)明。形參數(shù)量根據(jù)需要,可以是1個(gè),可以是多個(gè),也可以沒(méi)有。 return語(yǔ)句只能返回一個(gè)值第10

5、頁(yè),共125頁(yè)。2以純“執(zhí)行動(dòng)作”為功能的函數(shù)定義純“執(zhí)行動(dòng)作”的函數(shù)最大特點(diǎn)是不返回結(jié)果,此類函數(shù)定義方法如下: void 函數(shù)名(參數(shù)表) /*函數(shù)首部*/ /*函數(shù)體*/動(dòng)作執(zhí)行過(guò)程;此類函數(shù)類型為void,表示的是函數(shù)無(wú)返回值,此void不可以省略。否則,函數(shù)類型將被默認(rèn)定義為int。見(jiàn)例5-1。 第11頁(yè),共125頁(yè)。3.前兩種情況組合的函數(shù)定義 此種函數(shù)也很容易理解,它的特點(diǎn)是在函數(shù)的執(zhí)行過(guò)程中會(huì)做一些具體的“動(dòng)作”,例如在屏幕顯示一些信息等,在函數(shù)運(yùn)行結(jié)束的時(shí)候還會(huì)有最終的函數(shù)返回值,如例5-2所示。 第12頁(yè),共125頁(yè)。在C語(yǔ)言中,調(diào)用函數(shù)分兩種情況:調(diào)用庫(kù)函數(shù)時(shí),只需要在程

6、序的最前面使用#include頭文件包含命令即可;調(diào)用用戶自定義函數(shù)時(shí),程序中必須有相應(yīng)函數(shù)定義的對(duì)應(yīng)代碼,并且,當(dāng)一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)時(shí),通常也對(duì)應(yīng)地把這兩個(gè)函數(shù)稱為主調(diào)函數(shù)和被調(diào)用函數(shù)。5.1.2 函數(shù)的調(diào)用第13頁(yè),共125頁(yè)。在調(diào)用函數(shù)時(shí),大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。這就是前面提到的有參函數(shù)。這種函數(shù)在定義時(shí)要在函數(shù)名后面括號(hào)中給出變量名,稱為“形式參數(shù)”(簡(jiǎn)稱“形參”),在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中的參數(shù)稱為“實(shí)際參數(shù)”(簡(jiǎn)稱“實(shí)參”)。 第14頁(yè),共125頁(yè)。函數(shù)調(diào)用的一般形式為:函數(shù)名(實(shí)參表);實(shí)參可以是常量、變量、和表達(dá)式,對(duì)于無(wú)參

7、函數(shù)則實(shí)參表為空。 1函數(shù)調(diào)用形式及過(guò)程第15頁(yè),共125頁(yè)。按函數(shù)在程序中出現(xiàn)的位置,有3種函數(shù)調(diào)用方式:(1) 函數(shù)語(yǔ)句把函數(shù)調(diào)用作為一個(gè)語(yǔ)句,如例5-1中的“star(8);”,這時(shí)不要求函數(shù)帶返回值,只要求函數(shù)完成一定的操作。(2) 函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。例如:c=2*max(a,b);(3) 函數(shù)參數(shù)函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。例如:printf(“%d”,max(a,b);2函數(shù)調(diào)用方式第16頁(yè),共125頁(yè)。3. 參數(shù)傳遞對(duì)于有參函數(shù),函數(shù)定義中的“形參”和函數(shù)調(diào)用中的“實(shí)參”必須在順序上一一對(duì)應(yīng)

8、,且數(shù)量相同,類型一致。函數(shù)的形參必須是變量,實(shí)參可以是變量、常量或表達(dá)式,其作用是把常量、變量或表達(dá)式的值傳遞給形參。在參數(shù)傳遞過(guò)程中,將實(shí)參的值復(fù)制給形參,這種參數(shù)傳遞是單向的。第17頁(yè),共125頁(yè)。4. 函數(shù)的結(jié)果返回 被調(diào)函數(shù)執(zhí)行后,都會(huì)返回到主調(diào)函數(shù)中的調(diào)用位置。此時(shí)有兩種情況:一種是返回一個(gè)運(yùn)算結(jié)果給主調(diào)函數(shù),例如求圓的面積;另一種是執(zhí)行一系列“動(dòng)作”,沒(méi)有確定的運(yùn)算結(jié)果返回給主調(diào)函數(shù),此時(shí)被調(diào)函數(shù)類型為void,如例5-1。第18頁(yè),共125頁(yè)。5.1.2 函數(shù)的原型聲明 在一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)需要具備如下條件: (1) 被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(庫(kù)函數(shù)或用戶自己定義

9、的函數(shù))。但只有這一點(diǎn)是不夠的。(2) 如果使用庫(kù)函數(shù),還應(yīng)該在文件開(kāi)頭用#include命令將調(diào)用有關(guān)庫(kù)函數(shù)時(shí)所用到的頭文件包含進(jìn)來(lái)。(3) 如果使用用戶自定義的函數(shù),而該函數(shù)的位置在主調(diào)函數(shù)的后面,應(yīng)該在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)作聲明。第19頁(yè),共125頁(yè)?!纠?-4】 輸入圓的半徑,求圓的面積,area = r2。要求定義和調(diào)用函數(shù)circle(r)計(jì)算圓的面積。 源程序略,見(jiàn)教材P93。5.1.3 程序解析第20頁(yè),共125頁(yè)。5.2.1 函數(shù)的應(yīng)用舉例【例5-5】一個(gè)三位的十進(jìn)制數(shù),如果它的三個(gè)數(shù)位的數(shù)字之立方和等于這個(gè)數(shù)本身,那么就把它稱為一個(gè)“水仙花數(shù)”。要求定義一個(gè)函數(shù)用來(lái)判斷某數(shù)

10、是否為水仙花數(shù),并利用這個(gè)函數(shù)求出所有的水仙花數(shù)。源程序略,見(jiàn)教材P93?!纠?-5】給定某個(gè)年份,求出此年二月份的天數(shù)。要求編寫(xiě)判斷閏年的函數(shù)及計(jì)算二月份天數(shù)的函數(shù)。源程序略,見(jiàn)教材P94。5.2 使用函數(shù)編寫(xiě)程序第21頁(yè),共125頁(yè)。5.3 變量與函數(shù)5.3.1 局部變量與全局變量C言中把定義在函數(shù)內(nèi)部的變量稱為局部變量,也叫做自動(dòng)變量。局部變量的有效作用范圍局限于所在的函數(shù)內(nèi)部或復(fù)合語(yǔ)句內(nèi)。而在函數(shù)之外定義的變量稱為外部變量。外部變量是全局變量。外部變量定義的作用域是整個(gè)程序。注意:main函數(shù)里定義的變量不可以在其他函數(shù)里使用,因?yàn)閺淖饔糜蚪嵌瓤?,main也是一個(gè)普通函數(shù),其內(nèi)部定義同

11、樣也是局部的,不能在main函數(shù)體外使用。理解局部變量與全局變量見(jiàn)P96【例5-7】 。第22頁(yè),共125頁(yè)。當(dāng)局部變量與全局變量同名時(shí),全局變量會(huì)被函數(shù)里面的同名局部變量遮蔽,即在函數(shù)體內(nèi)部外部定義的全局變量失效。外部變量-在一個(gè)源文件里定義而在其他文件里使用。也應(yīng)先定義后使用。但若想后定義先使用,或者在某源文件中使用其他源文件定義好的變量,此時(shí)就需要在使用變量之前給出有關(guān)的“外部變量聲明”。即需要在原定義前面增加關(guān)鍵字“extern”。例如,可以聲明如下: extern int a,b;5.3.2 程序解析第23頁(yè),共125頁(yè)。5.3.3 變量作用域與生存期 作用域與生存期存在聯(lián)系但又有不

12、同: 作用域關(guān)注的是變量定義的作用范圍,說(shuō)的是源程序中的一段,可以在代碼中劃清界限,是一個(gè)靜態(tài)概念。生存期是一個(gè)動(dòng)態(tài)的概念,指的是程序執(zhí)行過(guò)程中的一段時(shí)間。外部變量的作用域是整個(gè)程序;而在各個(gè)函數(shù)內(nèi)部定義的變量,它們的作用域是各自的函數(shù)內(nèi)部。對(duì)于生存期,外部變量的生存期是整個(gè)程序,而局部變量的生存期是相應(yīng)的復(fù)合結(jié)構(gòu)內(nèi)部。理解變量的作用域與生存期見(jiàn)教材P8【例5-8】。 第24頁(yè),共125頁(yè)。5.3.4 靜態(tài)局部變量、寄存器變量及外部靜態(tài)變量靜態(tài)局部變量 有些現(xiàn)實(shí)應(yīng)用,我們會(huì)需求這樣一種變量:這種變量的作用域是局部的,定義在函數(shù)體內(nèi),從而保證信息的私密性,避免其它函數(shù)越權(quán)訪問(wèn);而其存在期是全局的

13、,可以起到“效果積累”的作用,函數(shù)在第二次被調(diào)用的時(shí)候,能夠引用此變量第一次被調(diào)用結(jié)束時(shí)的值,實(shí)現(xiàn)了在兩次調(diào)用中傳遞信息。第25頁(yè),共125頁(yè)。#includevoid test()static int m=1;/定義靜態(tài)局部變量if(m%10 = 0)putchar(n);elseputchar( );m+;int main()int i;for(i=1;i=21;i+) /利用循環(huán)生成1至21測(cè)試數(shù)據(jù)printf(%d,i);test();return 0; 【例5-8】編寫(xiě)一個(gè)函數(shù),每調(diào)用它一次就輸出一個(gè)空格,但每到第十次的時(shí)候改為輸出一個(gè)換行。第26頁(yè),共125頁(yè)。2. 寄存器變量 一

14、般的局部變量存儲(chǔ)在內(nèi)存中,但有時(shí)編程者期望某個(gè)變量的訪問(wèn)速度可以進(jìn)一步提高,可以選擇使用寄存器變量,這種變量存儲(chǔ)在CPU的寄存器中。使用寄存器變量只需要在變量前加入關(guān)鍵字register。寄存器是CPU里的臨時(shí)數(shù)據(jù)存儲(chǔ)單元,特點(diǎn)是速度最快數(shù)量最少,是最緊缺的存儲(chǔ)資源。因此,除非特別需要,一般作為開(kāi)發(fā)者不過(guò)多考慮使用寄存器變量。 第27頁(yè),共125頁(yè)。3. 外部靜態(tài)變量全局變量的作用域很大,是整個(gè)程序集。當(dāng)項(xiàng)目由多人開(kāi)發(fā)時(shí),不同的開(kāi)發(fā)人員在自己的源文件中定義的全局變量都可以被其他人編寫(xiě)的源文件中使用,這就可能出現(xiàn)問(wèn)題。比如,在兩個(gè)源文件中出現(xiàn)同名全局變量,這樣程序在運(yùn)行時(shí)就會(huì)相互干擾而出錯(cuò)。為了

15、解決這一問(wèn)題,適當(dāng)限制一下全局變量的作用域,就出現(xiàn)了靜態(tài)外部變量。靜態(tài)外部變量的作用域局限在當(dāng)前源程序(而不是程序集)。這種變量是外部變量(定義在函數(shù)之外),定義時(shí)類似一般的全局變量的定義方法,只是需要在前面加上關(guān)鍵字static。 第28頁(yè),共125頁(yè)。這里的static與前面提到的靜態(tài)局部變量的意義不同。在靜態(tài)局部變量中,static的意義是全程存在,一次初始化;而外部靜態(tài)變量中static的意義是只在其定義的源文件里有效,在其他的源文件里無(wú)效。第29頁(yè),共125頁(yè)。 5.4 遞歸方法在函數(shù)中的應(yīng)用5.4.1 遞歸法前面學(xué)習(xí)循環(huán)的時(shí)候,我們計(jì)算過(guò)求n的階乘,當(dāng)時(shí)采用的算法是遞推法。用遞推的

16、方式計(jì)算n!,可以定義如下的計(jì)算式子:n ! = 123n用循環(huán)結(jié)構(gòu)編寫(xiě)代碼如下: result=1; for(i=1;i0 即如果n的值是0,那么其階乘就是1;當(dāng)n的值大于0時(shí),其階乘就等于n-1的階乘再乘以n。語(yǔ)言允許在被定義的函數(shù)體內(nèi)部調(diào)用該函數(shù)本身。利用遞歸法定義的階乘計(jì)算方法可非常方便寫(xiě)成如下語(yǔ)言函數(shù):int fact (int n)if(n = = 0) return 1; else return n * fact(n-1); 第31頁(yè),共125頁(yè)。構(gòu)建有效合理的遞歸一定要注意以下兩個(gè)關(guān)鍵點(diǎn): 遞歸出口:正如使用數(shù)學(xué)歸納法證明命題一樣,要驗(yàn)證第一項(xiàng)成立。在使用遞歸法解決問(wèn)題時(shí),必須

17、給出“出口”,也就是說(shuō)要明確遞歸什么時(shí)候結(jié)束,遞歸到終點(diǎn)一定要給出明確的值。例如,在計(jì)算階乘時(shí),要明確的給出的階乘值是。遞歸式子:遞歸項(xiàng)公式,前后遞歸項(xiàng)之間的關(guān)系式。例如,計(jì)算階乘時(shí),關(guān)系式fact(n) = n * fact (n-1)。第32頁(yè),共125頁(yè)。5.4.3 漢諾塔問(wèn)題【例5-10】漢諾塔問(wèn)題。古代某寺廟有一座塔,塔內(nèi)有3個(gè)柱子A、B和C,共有64個(gè)大小不等中心有圓孔的金盤(pán)套在柱子A上,金盤(pán)按照大盤(pán)在下小盤(pán)在上的順序依次排列。僧侶們有一項(xiàng)工作,即把這64個(gè)金盤(pán)從柱子A移動(dòng)到柱子B上,但一次只能搬動(dòng)一個(gè)金盤(pán),搬動(dòng)的金盤(pán)只允許放在其他兩個(gè)柱子上,且大盤(pán)不能壓在小盤(pán)之上?,F(xiàn)要求用C語(yǔ)言

18、編程,模擬搬動(dòng)步驟。 問(wèn)題分析及源程序見(jiàn)教材P102-P104。第33頁(yè),共125頁(yè)。5.5 編譯預(yù)處理 5.5.1 文件包含命令在前面的程序樣例中反復(fù)出現(xiàn)了以#include開(kāi)始的行,這就是文件包含命令,其作用是把指定文件的內(nèi)容包含到當(dāng)前源文件里。文件包含命令有兩種形式:#include #include “文件名”第34頁(yè),共125頁(yè)。5.5.2 宏定義由#define開(kāi)始的行稱為宏定義命令行。一般宏定義的格式是:#define 宏名字 替代內(nèi)容宏名字是一個(gè)標(biāo)識(shí)符,替代內(nèi)容可以是任意一段文字,可以包括程序中可能出現(xiàn)的任何字符。如果替代內(nèi)容需要寫(xiě)多行,可以在行末寫(xiě)一個(gè)反斜杠符號(hào)“”。宏定義的

19、作用就是可以在程序編寫(xiě)的過(guò)程中在任意一個(gè)位置使用宏名字替換替代內(nèi)容。 第35頁(yè),共125頁(yè)。5.5.3條件編譯 條件編譯的作用是在源程序里劃出一些片斷,使預(yù)處理程序可以根據(jù)條件保留或丟掉一段,或者從幾段中選擇一段保留下來(lái)。條件編譯命令共有個(gè),如下: #if、 #else 、 #ifdef 、 #endif第36頁(yè),共125頁(yè)。5.6 綜合應(yīng)用小學(xué)生四則運(yùn)算測(cè)試系統(tǒng) 解題方法及源程序見(jiàn)教材P107-P108。第37頁(yè),共125頁(yè)。第6章 數(shù)組本章要點(diǎn)目標(biāo)掌握如何定義數(shù)組和引用數(shù)組元素掌握一維數(shù)組的使用及冒泡排序法掌握二維數(shù)組的使用及在內(nèi)存中的存放掌握用字符數(shù)組實(shí)現(xiàn)字符串的存儲(chǔ)和操作第38頁(yè),共1

20、25頁(yè)。6.1 冒泡排序 6.1.1 一維數(shù)組的定義和引用1一維數(shù)組的定義數(shù)組在使用之前必須先定義。定義的作用就是通知C語(yǔ)言編譯程序在內(nèi)存當(dāng)中分配連續(xù)的存儲(chǔ)空間來(lái)儲(chǔ)存數(shù)組中的各個(gè)元素。一維數(shù)組定義形式為:類型說(shuō)明符 數(shù)組名常量表達(dá)式; 第39頁(yè),共125頁(yè)。2一維數(shù)組的引用定義數(shù)組之后就可以引用數(shù)組中的元素進(jìn)行相應(yīng)計(jì)算。對(duì)數(shù)組的引用就是對(duì)數(shù)組中元素值的引用。C語(yǔ)言規(guī)定只能逐個(gè)引用數(shù)組元素而不能一次引用整個(gè)數(shù)組。數(shù)組元素的引用形式為:數(shù)組名下標(biāo) 第40頁(yè),共125頁(yè)?!纠?-1】數(shù)組元素的引用int main(void) int i, a10;for(i=0; i=0; i-)printf(%c

21、 , ai);return 0; 第41頁(yè),共125頁(yè)。6.1.2 一維數(shù)組的初始化定義數(shù)組時(shí)給數(shù)組元素賦值,這稱為數(shù)組的初始化。 第42頁(yè),共125頁(yè)。6.1.3 程序解析冒泡排序的思想是:從第一個(gè)數(shù)開(kāi)始,用第一個(gè)數(shù)同第二個(gè)數(shù)進(jìn)行比較,如果前一個(gè)數(shù)大于后一個(gè)數(shù),則交換兩個(gè)數(shù),否則不進(jìn)行交換。再用第二個(gè)數(shù)同第三個(gè)數(shù)進(jìn)行比較,如果前一個(gè)數(shù)小于后一個(gè)數(shù),則不交換,否則進(jìn)行交換。這樣比較下去就將數(shù)組中的最大數(shù)交換到最后位置。如果有n個(gè)數(shù),要比較n-1次。然后,再進(jìn)行下一遍比較,共比較n-2次,將第二大的數(shù)放到了倒數(shù)第二個(gè)位置,這樣繼續(xù)執(zhí)行下去直至整個(gè)數(shù)組排序完畢為止。第43頁(yè),共125頁(yè)?!纠?-2

22、】冒泡排序int main(void) int i, j, num, t;int a100;printf(How many numbers:n);scanf(%d, &num);printf(Input %d numbers:n, num);for(i=0; inum; i+)scanf(%d, &ai);for(i=0; inum-1; i+)for(j=0; jaj+1) t=aj+1;aj+1=aj;aj=t;printf(The sorted number:n);for(i=0; inum; i+)printf(%d , ai);return 0;第44頁(yè),共125頁(yè)。6.1.4 使用

23、一維數(shù)組編程【例7-3】統(tǒng)計(jì)整型數(shù)組中元素分別是正數(shù)、負(fù)數(shù)和0的個(gè)數(shù)。 int main(void) int i,m,n,z;int num10;m=n=z=0; printf(Input 10 numbers:n);for(i=0; i 0) m+;if(numi 0) n+;if(numi = 0) z+;printf(Positive Numbers=%d, Negative Numbers=%d, Zero=%dn, m, n, z);return 0;第45頁(yè),共125頁(yè)。6.2 矩陣轉(zhuǎn)置6.2.1 二維數(shù)組的定義和引用具有兩個(gè)下標(biāo)的數(shù)組稱為二維數(shù)組。在許多實(shí)際應(yīng)用中需要使用二維數(shù)組

24、,以更方便地解決問(wèn)題。二維數(shù)組的形式類似數(shù)學(xué)中的矩陣。第46頁(yè),共125頁(yè)。1二維數(shù)組的定義二維數(shù)組定義形式為:類型說(shuō)明符 數(shù)組名常量表達(dá)式常量表達(dá)式; 第47頁(yè),共125頁(yè)。2二維數(shù)組的引用二維數(shù)組元素引用形式為:數(shù)組名下標(biāo)1下標(biāo)2; 第48頁(yè),共125頁(yè)。6.2.2 二維數(shù)組的初始化二維數(shù)組初始化的方法如下:(1)按行給二維數(shù)組元素賦初值。例如:int a23=1,2,3, 4,5,6;(2)將所有數(shù)據(jù)寫(xiě)在一個(gè)花括號(hào)內(nèi),按數(shù)組排列的順序?qū)Ω髟刭x初值。例如:int a23=1,2,3,4,5,6;(3)可以只對(duì)部分?jǐn)?shù)組元素賦初值。例如:int b34=1,4,3,2,1,2;(4)若對(duì)全部

25、數(shù)組元素賦初值,則數(shù)組的第一個(gè)下標(biāo)可省略,但第二個(gè)下標(biāo)不能省略。例如:int a23=1,2,3,4,5,6;。第49頁(yè),共125頁(yè)。6.2.3程序解析【例7-4】將2行3列的矩陣A轉(zhuǎn)置為3行2列的矩陣B。 int main(void) int i, j;int a23=1, 2, 3, 3, 2, 1, b32;printf(Array A:n);for(i=0; i2; i+) for(j=0; j3; j+) printf(%5d , aij);bji=aij; printf(n);printf(Array B:n);for(i=0; i3; i+) for(j=0; j2; j+)pr

26、intf(%5d, bij);printf(n);return 0;第50頁(yè),共125頁(yè)。6.2.4 使用二維數(shù)組編程【例7-5】求出二維數(shù)組中元素的最大值,以及該元素所在的行號(hào)和列號(hào)。int main(void) int i, j, max, r=0, c=0;int a34=1, 2, 3, 4, 4, 6, 7, 8, 9, 0, 1, 2;max=a00;for(i=0; i3; i+)for(j=0; j max) max = aij;r = i;c = j;printf(max=%d row=%d column=%dn, max, r, c);return 0;第51頁(yè),共125頁(yè)

27、。6.3 統(tǒng)計(jì)一行英文句子中單詞個(gè)數(shù)6.3.1 一維字符數(shù)組的定義、初始化和引用若數(shù)組元素的數(shù)據(jù)類型是字符型,則稱這種數(shù)組為字符數(shù)組。1一維字符數(shù)組定義char 數(shù)組名常量表達(dá)式;例如:char c5;。由于字符型和整型可以互相通用,因此前面數(shù)組定義語(yǔ)句也可以定義成int c5;第52頁(yè),共125頁(yè)。2字符數(shù)組的初始化字符型數(shù)組的初始化方法與數(shù)值型數(shù)組的初始化方法類似。例如:char c7=p, r, o, g, r, a, m;說(shuō)明:(1)若大括號(hào)中的初值個(gè)數(shù)大于數(shù)組的長(zhǎng)度,則語(yǔ)法錯(cuò)誤。(2)若大括號(hào)中的初值個(gè)數(shù)小于數(shù)組的長(zhǎng)度,其余的元素的值默認(rèn)為空字符0。(3)若字符數(shù)組元素的個(gè)數(shù)與初值個(gè)

28、數(shù)相同,可以在定義時(shí)省略長(zhǎng)度,編譯程序?qū)⒏鶕?jù)初值的個(gè)數(shù)確定數(shù)組的長(zhǎng)度。例如:char c=I, , a, m, , a, , b, o, y;,編譯程序?qū)⒆詣?dòng)定義字符數(shù)組c的長(zhǎng)度為10。第53頁(yè),共125頁(yè)。字符數(shù)組引用的方法與數(shù)值型數(shù)組相同。字符數(shù)組引用形式為:數(shù)組名下標(biāo)。3字符數(shù)組的引用第54頁(yè),共125頁(yè)。6.3.2 字符串在C語(yǔ)言中用字符數(shù)組存放字符串。在定義數(shù)組時(shí)可以用字符串為字符數(shù)組賦初值。例如:char c=“Hello world”;或char c=“Hello world”;。數(shù)組c的長(zhǎng)度為12,在字符d后面的字節(jié)中編譯程序?qū)?huì)自動(dòng)添加上空字符0。若字母的個(gè)數(shù)小于數(shù)組的定義長(zhǎng)

29、度,則在數(shù)組的后面以一個(gè)空字符0填充。例如:char f8=“China”;。這里0是在字符串后出現(xiàn)的字符,認(rèn)為該字符串到此為止。 第55頁(yè),共125頁(yè)。6.3.3字符串處理函數(shù)C語(yǔ)言函數(shù)庫(kù)中提供了字符串處理函數(shù),這些函數(shù)定義在string.h頭文件中,用戶可以使用預(yù)編譯命令#include 將頭文件string.h包含到程序中,然后,就可以直接引用頭文件中包含的字符串處理函數(shù)。下面介紹幾種常用的函數(shù)。 第56頁(yè),共125頁(yè)。6.3.4 程序解析【例7-6】輸入一行英文,統(tǒng)計(jì)其中單詞數(shù)。#include int main(void) char line200;int i, count=0;ge

30、ts(line);for(i=0; istrlen(line); i+)if(linei = ) count+;count+; printf(%d, count);return 0;第57頁(yè),共125頁(yè)。6.4綜合應(yīng)用學(xué)生成績(jī)統(tǒng)計(jì)與分析【例7-7】輸入10名學(xué)生的英語(yǔ)、C語(yǔ)言、計(jì)算機(jī)文化基礎(chǔ)成績(jī),統(tǒng)計(jì)每名學(xué)生三科成績(jī)的平均分,分析三門(mén)課程的優(yōu)秀率,85分以上為優(yōu)秀。 源程序略,見(jiàn)教材P122-P123。第58頁(yè),共125頁(yè)。本章學(xué)習(xí)目標(biāo)熟練掌握指針的基本概念和基本使用方法熟練掌握指針作函數(shù)參數(shù)的方法理解指針與數(shù)組的關(guān)系掌握字符串的使用掌握動(dòng)態(tài)內(nèi)存分配的原理和方法掌握函數(shù)與指針相結(jié)合的使用方法了

31、解const指針第8章 指針第59頁(yè),共125頁(yè)。8.1 通過(guò)收發(fā)室尋找學(xué)生公寓中的某位同學(xué) 8.1.1 地址和指針你房間號(hào)?A406同學(xué)指針地址第60頁(yè),共125頁(yè)。 8.1.2 指針變量的定義 int * ptrI; char * ptrC; 語(yǔ)法: int * ptrI; 或int* ptrI;或 int *ptrI; 所占內(nèi)存容量:sizeof(ptrI) int *ptra, *ptrb; ptra和ptrb都是指向整型數(shù)的指針,int *ptr1, a;ptr1為指針,而a為整型變量。 第61頁(yè),共125頁(yè)。 8.1.3 指針變量的初始化 int *ptrIa=&a; /聲明的同時(shí)

32、初始化int *ptrIb;ptrIb=&b; /聲明之后再賦值12ff7c12ff741012ff7cptrIaa注意不同的系統(tǒng)中分配的地址的具體值可能有不同。在指針初始化的時(shí)候,不可以用其他類型的地址賦值。第62頁(yè),共125頁(yè)。 8.1.4 指針的間接引用 int *ptrIa=&a;*ptrIa=20; /指針的間接引用聲明“int *ptrIa”中的”*”表示這是一個(gè)指針類型的變量,但在后面語(yǔ)句中的“*ptrIa”中的“*”表示的是指針ptrIa的間接引用,所謂的間接引用就是指針ptrIa所指向的內(nèi)容. 第63頁(yè),共125頁(yè)。 1指針的算術(shù)運(yùn)算指針與整數(shù)的算術(shù)運(yùn)算只有加與減 指針的增量

33、運(yùn)算是按所指向的數(shù)據(jù)類型所占內(nèi)存字節(jié)數(shù)為單位進(jìn)行增加的。設(shè)指針變量為ptr,adptr表示其中所存放的地址,如果要進(jìn)行操作“ptr=ptrd;”,其中d為一個(gè)整數(shù),有如下公式:adptr=adptrdsizeof(*ptr)指針與指針間的算術(shù)運(yùn)算只有減法運(yùn)算設(shè)ptra和ptrb為兩個(gè)指針,其減法運(yùn)算ptra-ptrb的公式如下:d=(ptra-ptrb)/sizeof(*ptra),其中d表示兩個(gè)指針間以數(shù)據(jù)類型所占字節(jié)數(shù)為單位的距離。 8.1.5 指針的基本運(yùn)算第64頁(yè),共125頁(yè)。兩個(gè)相同類型的指針可以進(jìn)行關(guān)系運(yùn)算,其結(jié)果反映的是兩個(gè)指針?biāo)赶虻牡刂分g的前后位置關(guān)系, ptraptrb當(dāng)

34、結(jié)果為true的時(shí)候,表示ptra在ptrb之前,否則表示在相等或在其后。 ptra=NULL如果結(jié)果為true說(shuō)明是空指針。2指針的關(guān)系運(yùn)算第65頁(yè),共125頁(yè)。8.2 貍貓換太子 8.2.1 指針作為函數(shù)的參數(shù) void f (int *pa, int *pb);其參數(shù)列表中的pa與pb均為整型指針。f(&a,&b); 當(dāng)以指針為參數(shù)時(shí),實(shí)參傳遞的時(shí)候是以相應(yīng)類型的地址傳遞的,比如a的地址復(fù)制給pa,而b的地址復(fù)制給pb, 第66頁(yè),共125頁(yè)。a:12ff7c10b:12ff7820a:12ff7c10b:12ff7820pa:12ff2412ff7cpb:12ff2812ff78ta:

35、12ff7c20b:12ff7810pa:12ff2412ff7cpb:12ff2812ff78t10(a)(b)(c)貍貓換太子 第67頁(yè),共125頁(yè)。8.3 選擇排序8.3.1 指向數(shù)組元素的指針 1指向一維數(shù)組元素的指針 int a10=9,8,7,6,5,4,3,2,1,0;int *p;p=a; 數(shù)組名a實(shí)際上是一個(gè)指針,它代表的是數(shù)組的首地址。當(dāng)經(jīng)過(guò)前面的賦值語(yǔ)句“p=a”后,用p代替a去完成同樣的操作,得到的結(jié)果完全相同,p完全可以代替a,但要注意C語(yǔ)言中沒(méi)有提供數(shù)組下標(biāo)超界的檢查,對(duì)指針同樣也沒(méi)有,這樣會(huì)存在著風(fēng)險(xiǎn),使用時(shí)要注意界限。 第68頁(yè),共125頁(yè)。2指向二維數(shù)組元素的

36、指針int a34;int *p=a0; /用二維數(shù)組中的第一行的首地址賦值a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a30 a31 a32 a33aa0a1p注意,二維數(shù)組名是行指針,一維數(shù)組名是列指針。二維數(shù)組的存儲(chǔ)也是順序存儲(chǔ),但邏輯關(guān)系上有所不同。 第69頁(yè),共125頁(yè)。 int a10;int *p;p=a;max=p0; loc=0; /max及l(fā)oc的初始化for (i=0;imax)max=pi,loc=i; /比較數(shù)組元素與當(dāng)前找到的最大值并記錄8.3.2 通過(guò)指針引用數(shù)組元素第70頁(yè),共125頁(yè)。 int a34;int *p

37、=a0;int i,j;int max,loci,locj;max=p0; loci=0; locj=0; /max等變量的初始化for (i=0;i3;i+)for(j=0;jmax)max=pi*4+j;loci=i;locj=j;printf(max=%dtloci=%dtlocj=%dn,max,loci,locj);第71頁(yè),共125頁(yè)。8.3.3 用數(shù)組名作函數(shù)參數(shù) int sum1(int array, int n); /數(shù)組名作形參int sum2(int *pa, int n) ; /指針作形參主函數(shù)中調(diào)用: int a10;sum=sum1(a,10); /傳遞數(shù)組名sum

38、=sum2(a,10); /傳遞數(shù)組名第72頁(yè),共125頁(yè)。8.3.4 程序解析 排序方法有多種,選擇排序是一種簡(jiǎn)單的排序方法,原始數(shù)據(jù)是無(wú)序的,要求排成升序,其原理如圖8-4所示,第一趟選擇所有元素中最小的元素,將之與第一個(gè)位置的值進(jìn)行交換,這樣第一個(gè)位置將是其中的最小值,第二趟選擇其余元素中最小的,與第二個(gè)位置交換,依次重復(fù)同樣的操作,如果有n個(gè)元素,當(dāng)執(zhí)行完n-1趟的選擇后,數(shù)組元素成為升序排列的數(shù)組。 第73頁(yè),共125頁(yè)。8.4 加密變換 8.4.1 字符串的表示形式 事實(shí)上字符數(shù)組也是字符串,在最后一個(gè)字符后要有一個(gè)0來(lái)結(jié)尾。char *p=”hello”;語(yǔ)句即是將字符串的首地址

39、賦值給指針p 例子: char *pc1=one world!;char *pc2=one world!;char c1=one dream!; char c2=one dream!; int a=(c1=c2); /字符數(shù)組的比較int b=(pc1=pc2); /字符指針的比較第74頁(yè),共125頁(yè)。當(dāng)c1與c2進(jìn)行比較時(shí),結(jié)果為假,而pc1與pc2比較時(shí)結(jié)果為真。從前兩句的輸出中,可以看出,pc1和pc2的地址相同,這是由于他們兩個(gè)字符串的內(nèi)容相同,那么在內(nèi)存的常量區(qū)內(nèi)就只存儲(chǔ)一份,用的是同一個(gè),因此地址相同。而因?yàn)閏1和c2是局部數(shù)組名,比較的也是數(shù)組名,即比較的是兩個(gè)數(shù)組的首地址,他們

40、在內(nèi)存中分屬不同的地址,因此結(jié)果為假。 第75頁(yè),共125頁(yè)。8.4.2 字符指針做函數(shù)參數(shù) 字符指針同其他基本類型指針一樣可以作函數(shù)的參數(shù),傳遞的也是字符串的首地址。 8.4.3 常用字符串函數(shù) 見(jiàn)教材8.4.4 程序解析 加密變換是將一個(gè)字符數(shù)組中的元素通過(guò)一定的加密方式進(jìn)行加密,使得原本有意義的一句話,變得不知所云。本算法利用隨機(jī)函數(shù)來(lái)產(chǎn)生加密數(shù)字,如果產(chǎn)生的是數(shù)字是4,而原字符為c,那么變換的結(jié)果為字符c后的g,即在原字符的基礎(chǔ)上加上4,但如果原字符為y,則加密后的結(jié)果取c,即為循環(huán)方式加密,而且加密的只有其中的英文字符。 第76頁(yè),共125頁(yè)。8.5 動(dòng)態(tài)內(nèi)存分配 函數(shù)malloc(

41、)是C語(yǔ)言中獲得堆內(nèi)存的一種方法,它在頭文件malloc.h中聲明。函數(shù)原型為:void * malloc(size_t size);其中size_t=unsigned long; 此函數(shù)從堆內(nèi)存中分配一塊size大小的一塊連續(xù)內(nèi)存空間,size是指空間中的字節(jié)數(shù),并將這塊內(nèi)存的首地址返回給調(diào)用它的函數(shù),其返回值為void *。 由malloc所分配的內(nèi)存空間,當(dāng)使用完畢后,必須人工返還給系統(tǒng),函數(shù)free()返還由函數(shù)malloc()分配的內(nèi)存空間, 它也在頭文件malloc.h中聲明。函數(shù)原型為:void free(void *);第77頁(yè),共125頁(yè)。8.6 字符串排序 8.6.1 指針

42、數(shù)組的概念 指針數(shù)組其中所有元素都是同一類型的指針,如:int *pI10;其中包括了10個(gè)元素,每一個(gè)元素都是指向整型數(shù)的指針。利用一個(gè)指針數(shù)組,可以使其中每個(gè)指針?biāo)赶虻膬?nèi)容長(zhǎng)度不同,這與二維數(shù)組中每行元素必須相同是不同的,更加靈活。 8.6.2 指向指針的指針 int a=10;int *p=&a;int *pp=&p;pp:12ff7412ff78p:12ff7812ff7ca:12ff7c10第78頁(yè),共125頁(yè)。8.6.3 程序解析 采用選擇排序方法,但由于是字符串的排序,且是利用指針數(shù)組,因此,并不需要真正的字符串的交換,只需要指向這些字符串的指針的交換即可,如圖所示。 p0p1

43、p2p3p4p5420044michael42003cbarris420034barney420fb4wilma420facbetty420024420020williamstomp642004442003c420034420fb4420fac420024420020p0p1p2p3p4p5p642003442003c420fac420044420020420024420fb4初始態(tài) 字符數(shù)組 終止態(tài)第79頁(yè),共125頁(yè)。8.7 函數(shù)與指針 8.7.1 指針作為函數(shù)的返回值 因?yàn)榫植孔兞吭趦?nèi)存的棧區(qū)分配空間,在函數(shù)調(diào)用結(jié)束后,會(huì)釋放所占用的空間,這樣所返回的地址將不再歸該函數(shù)所用,里面的內(nèi)容會(huì)

44、有變化。而由于全局變量和靜態(tài)變量存儲(chǔ)在數(shù)據(jù)區(qū)中,只有當(dāng)整個(gè)程序執(zhí)行結(jié)束時(shí),才會(huì)釋放,它們的作用域會(huì)延伸至程序結(jié)束,因此返回它們的地址是安全的。 第80頁(yè),共125頁(yè)。8.7.2 指向函數(shù)的指針 函數(shù)指針的定義形式:int (*func)(char a, char b);其中(*func)的括號(hào)表明這是一個(gè)函數(shù)指針,int表示的是所指向的函數(shù)的返回值類型,而后面的(char a, char b)所指向的函數(shù)的參數(shù)列表,即指針func是指向int f(char,char)這一類的函數(shù)指針。 函數(shù)名其實(shí)就是函數(shù)的首地址,用函數(shù)名來(lái)給函數(shù)指針來(lái)賦值。注意:不同的函數(shù)類型不能給函數(shù)指針賦值,即用函數(shù)名給

45、指針賦值時(shí),一定要類型相符。第81頁(yè),共125頁(yè)。8.7.3 函數(shù)指針作為函數(shù)的參數(shù) 函數(shù)指針既然是指針,也可以同其他指針一樣用作函數(shù)的參數(shù).8.7.4 程序解析結(jié)合指針作返回值與指針數(shù)組作函數(shù)參數(shù),將指針數(shù)組中每個(gè)指針?biāo)赶虻淖址牡谝粋€(gè)字符提取出來(lái),并連接成一個(gè)新的字符串返回到調(diào)用處,實(shí)現(xiàn)了英文藏頭詩(shī)的解密。 第82頁(yè),共125頁(yè)。8.8 const指針 8.8.1 指向常量的指針 形式:const int *iPtr;表示指向的對(duì)象是常量,即指針?biāo)竷?nèi)存中的內(nèi)容是常量,不允許更改。但仍然可以用變量的地址來(lái)賦值。 定義指針常量的指針,只限制指針的間接訪問(wèn)操作,而當(dāng)指針指向的值本身不是常量

46、時(shí),不能限制指針指向的值本身的操作 第83頁(yè),共125頁(yè)。8.8.2 指針常量 形式:int * const iPtr;表示指針本身是常量,而不是所指向的內(nèi)容。值得注意的是,在定義指針常量時(shí)必須初始化,初始化的值是變量地址,不能是常量的地址。 指針常量是指指針本身是常量,但指針?biāo)赶虻膬?nèi)存當(dāng)中的內(nèi)容不是常量。 第84頁(yè),共125頁(yè)。8.2.3 指向常量的指針常量 形式:const int *const iPtr;注意:在定義時(shí)必須初始化,初始化值可以是常量地址,可以是變量地址,當(dāng)用變量進(jìn)行初始化時(shí),變量本身的操作是允許的,但不允許指針的間接引用。 指向常量的指針常量是指指針與指針?biāo)赶虻膬?nèi)容都

47、是常量,不允許被修改。 第85頁(yè),共125頁(yè)。第八章 結(jié)構(gòu)體本章學(xué)習(xí)目標(biāo)掌握結(jié)構(gòu)體的概念和特點(diǎn)熟練定義結(jié)構(gòu)體數(shù)據(jù)類型掌握結(jié)構(gòu)體變量的定義及初始化方法了解結(jié)構(gòu)體數(shù)組的特點(diǎn)能使用結(jié)構(gòu)體數(shù)組解決簡(jiǎn)單的問(wèn)題了解鏈表的概念、特點(diǎn)及鏈表的基本操作第86頁(yè),共125頁(yè)。概 述本章主要內(nèi)容結(jié)構(gòu)體的基本概念、結(jié)構(gòu)體的定義和使用方法結(jié)構(gòu)體數(shù)據(jù)類型及結(jié)構(gòu)體變量的定義、使用方法 和初始化 結(jié)構(gòu)體數(shù)據(jù)類型的典型應(yīng)用鏈表結(jié)構(gòu)體綜合應(yīng)用構(gòu)建手機(jī)通訊錄 第87頁(yè),共125頁(yè)。8.1 職工工資管理8.1.1 結(jié)構(gòu)體的概念與定義有時(shí)我們需要將不同類型的數(shù)據(jù)組合成一個(gè)有機(jī)的整體來(lái)表達(dá)一種復(fù)合結(jié)構(gòu),而且這種復(fù)合結(jié)構(gòu)中的數(shù)據(jù)是存在著某

48、種聯(lián)系,簡(jiǎn)單的說(shuō),結(jié)構(gòu)體就是個(gè)可以包含區(qū)別數(shù)據(jù)類型的一個(gè)結(jié)構(gòu),它是種可以由用戶自己定義的數(shù)據(jù)類型.列舉職工工資管理實(shí)例,指定了一個(gè)的結(jié)構(gòu)體類型struct employee 第88頁(yè),共125頁(yè)。8.1.2 結(jié)構(gòu)體的嵌套定義當(dāng)結(jié)構(gòu)體的成員是結(jié)構(gòu)體類型時(shí)稱之為結(jié)構(gòu)體的嵌套.列舉職工工資管理實(shí)例,外層結(jié)構(gòu)體struct employee嵌套了內(nèi)層結(jié)構(gòu)體struct date 第89頁(yè),共125頁(yè)。8.1.3 結(jié)構(gòu)體變量一個(gè)結(jié)構(gòu)體的對(duì)象或?qū)嵗Q為該結(jié)構(gòu)體類型的結(jié)構(gòu)體變量。結(jié)構(gòu)體變量的定義有不同的方法,一般可分為三種形式: 1.先定義結(jié)構(gòu)體類型再定義結(jié)構(gòu)體變量列舉職工工資管理實(shí)例, struct em

49、ployee employee1,employee2;2. 定義結(jié)構(gòu)體類型同時(shí)定義結(jié)構(gòu)體類型變量 struct employee employee1,employee2 ; 3.不定義結(jié)構(gòu)體類型名,直接定義結(jié)構(gòu)體類型變量 typedef struct employee emp; emp employee1,employee2; 職工工資管理,結(jié)構(gòu)體變量實(shí)例程序.第90頁(yè),共125頁(yè)。結(jié)構(gòu)體數(shù)組是其元素都是結(jié)具有相同結(jié)構(gòu)體類型的結(jié)構(gòu)體變量組。 結(jié)構(gòu)體數(shù)組的定義分為兩種。 1.先定義結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體數(shù)組。 struct employee ; struct employee emp3; 2.

50、定義結(jié)構(gòu)體類型的同時(shí),定義結(jié)構(gòu)體數(shù)組。 struct employee emp3 ; 練習(xí)8-1 練習(xí)8-28.1.4 結(jié)構(gòu)體數(shù)組第91頁(yè),共125頁(yè)。8.2.1結(jié)構(gòu)體指針的概念可以用指針指向結(jié)構(gòu)體變量。指向結(jié)構(gòu)體的指針?lè)Q為結(jié)構(gòu)體指針。一個(gè)結(jié)構(gòu)體型的指針就是該變量所占的內(nèi)存的起始地址,指針變量也可以用來(lái)指向結(jié)構(gòu)體數(shù)組中的元素。結(jié)構(gòu)體類型指針定義的格式有三種:1.在聲明結(jié)構(gòu)體類型之后定義結(jié)構(gòu)體指針變量 例:struct employee *p2.在聲明結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體指針變量 例:struct work *pwk ;3.聲明一個(gè)無(wú)名結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量 例:struct *p

51、wk ;結(jié)構(gòu)體指針實(shí)例程序.第92頁(yè),共125頁(yè)。8.2 模擬社會(huì)關(guān)系 8.2.2 結(jié)構(gòu)體指針作為函數(shù)參數(shù) 把一個(gè)結(jié)構(gòu)體類型的變量或者一個(gè)結(jié)構(gòu)體類型的數(shù)組傳給函數(shù),有三種方法: 1.用結(jié)構(gòu)體成員變量作函數(shù)的參數(shù)。這與把一個(gè)普通變量傳給函數(shù)是一樣的,遵循的是值傳遞方式。 2.用結(jié)構(gòu)體變量作實(shí)參。傳遞時(shí)采用的也是值傳遞的方式,即把各個(gè)成員變量依次傳遞給形參,這就要求形參是同樣類型的結(jié)構(gòu)體變量。 3.用指向結(jié)構(gòu)體變量的指針作實(shí)參,將結(jié)構(gòu)體變量的地址傳遞給形參。結(jié)構(gòu)體指針實(shí)例程序: 把上一節(jié)中的例子改為利用結(jié)構(gòu)體數(shù)組的指針作為函數(shù)的參數(shù) 第93頁(yè),共125頁(yè)。8.3 學(xué)生成績(jī)管理的單向鏈表實(shí)現(xiàn)8.3.

52、1 鏈表的概念鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過(guò)鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。每個(gè)結(jié)點(diǎn)包括兩個(gè)部分:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域。 鏈表是利用動(dòng)態(tài)存儲(chǔ)空間進(jìn)行數(shù)據(jù)存儲(chǔ)的一種結(jié)構(gòu)。 第94頁(yè),共125頁(yè)。 C語(yǔ)言編譯系統(tǒng)的庫(kù)函數(shù)為動(dòng)態(tài)的申請(qǐng)和釋放空間提供了以下有關(guān)函數(shù): 1.內(nèi)存分配函數(shù)calloc() ,程序舉例 2. 釋放內(nèi)存函數(shù)free() ,程序舉例 3.內(nèi)存分配函數(shù)malloc () ,程序舉例 4. 內(nèi)存重分配函數(shù)realloc() ,程

53、序舉例 第95頁(yè),共125頁(yè)。8.3.2 單向動(dòng)態(tài)鏈表的建立建立動(dòng)態(tài)鏈表的過(guò)程就是,在程序執(zhí)行過(guò)程中一個(gè)一個(gè)的開(kāi)辟空間,生成新結(jié)點(diǎn),然后再將結(jié)點(diǎn)一個(gè)個(gè)連接起來(lái)。具體步驟五步.實(shí)例程序舉例.第96頁(yè),共125頁(yè)。8.3 學(xué)生成績(jī)管理的單向鏈表實(shí)現(xiàn)8.3.3 插入結(jié)點(diǎn)對(duì)鏈表的插入是指將一個(gè)結(jié)點(diǎn)插入到一個(gè)已有的鏈表中。實(shí)例程序舉例.8.3.4 刪除結(jié)點(diǎn)主要操作是讓待刪結(jié)點(diǎn)之前的結(jié)點(diǎn)指向其后的結(jié)點(diǎn),這樣再?gòu)膆ead開(kāi)始訪問(wèn)鏈表時(shí)就知道到該結(jié)點(diǎn)了。 實(shí)例程序舉例.第97頁(yè),共125頁(yè)。8.3.5 遍歷鏈表遍歷(Traversal)是指沿著某條搜索路線,依次對(duì)樹(shù)中每個(gè)結(jié)點(diǎn)均做一次且僅做一次訪問(wèn)。 實(shí)例程序

54、舉例.8.3.6 解析程序與總結(jié)實(shí)例程序解析及運(yùn)行結(jié)果練習(xí) 9-4第98頁(yè),共125頁(yè)。8.4 綜合應(yīng)用構(gòu)建手機(jī)通訊錄利用構(gòu)建手機(jī)通訊錄這個(gè)例子來(lái)對(duì)上面所講的內(nèi)容進(jìn)行一個(gè)綜合的應(yīng)用。實(shí)例程序解析及運(yùn)行結(jié)果第99頁(yè),共125頁(yè)。習(xí)題九 1選擇題2程序填空3寫(xiě)出程序運(yùn)行結(jié)果第100頁(yè),共125頁(yè)。第9章 文件本章要點(diǎn)目標(biāo)將字符串寫(xiě)入文件中從文件中讀取學(xué)生基本信息復(fù)制文件內(nèi)容管理個(gè)人收支記賬本第101頁(yè),共125頁(yè)。9.1 將字符串“Welcome to study C program!”寫(xiě)入文件 9.1.1 文件的概念 文件是程序設(shè)計(jì)中一個(gè)重要的概念。所謂“文件”一般指存儲(chǔ)在外部介質(zhì)上數(shù)據(jù)的集合。

55、一批數(shù)據(jù)是以文件的形式存放在外部介質(zhì)(如磁盤(pán))上的。操作系統(tǒng)是以文件為單位對(duì)數(shù)據(jù)進(jìn)行管理的,也就是說(shuō),如果想找存在外部介質(zhì)上的數(shù)據(jù),必須先按文件名找到所指定的文件,然后再?gòu)脑撐募凶x取數(shù)據(jù)。要向外部介質(zhì)上存儲(chǔ)數(shù)據(jù)也必須先建立一個(gè)文件,才能向它輸出數(shù)據(jù)。第102頁(yè),共125頁(yè)。9.1.2 文本文件和二進(jìn)制文件C語(yǔ)言把文件看作是一個(gè)字符或字節(jié)的序列,即由一個(gè)一個(gè)字符或字節(jié)的數(shù)據(jù)順序組成。根據(jù)數(shù)據(jù)的存儲(chǔ)形式,文件分為文本文件和二進(jìn)制文件。文本文件又稱ASCII文件,文件中的每一個(gè)字節(jié)存放一個(gè)字符對(duì)應(yīng)的ASCII碼,即每一個(gè)字節(jié)代表一個(gè)字符。二進(jìn)制文件是把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲(chǔ)形式原樣保存到磁

56、盤(pán)文件中。一個(gè)整數(shù)10000在內(nèi)存中占2個(gè)字節(jié),按ASCII碼輸出,將占5個(gè)字節(jié)的空間,而按二進(jìn)制輸出,只占2個(gè)字節(jié)的空間。用ASCII碼輸出與字符一一對(duì)應(yīng),一個(gè)字節(jié)代表一個(gè)字符,因而便于對(duì)字符進(jìn)行逐個(gè)處理,也便于輸出字符。但占存儲(chǔ)空間較多,而且要花費(fèi)一定轉(zhuǎn)換時(shí)間(二進(jìn)制形式與ASCII碼間的轉(zhuǎn)換)。C語(yǔ)言源程序是文本文件,其內(nèi)容完全由ASCII碼構(gòu)成,通過(guò)記事本等編輯工具可以對(duì)文件內(nèi)容進(jìn)行查看、編輯等。C程序的目標(biāo)文件和可執(zhí)行文件是二進(jìn)制文件,它包含的是計(jì)算機(jī)才能識(shí)別的機(jī)器代碼,若文本編輯工具打開(kāi),則顯示稀奇古怪的符號(hào),即通常所說(shuō)的亂碼。對(duì)于具體的數(shù)據(jù)應(yīng)該選擇哪一類文件進(jìn)行存儲(chǔ),由需要解決的

57、問(wèn)題來(lái)決定,并在程序的一開(kāi)始就確定下來(lái)。 第103頁(yè),共125頁(yè)。9.1.3 文件結(jié)構(gòu)與文件類型指針1文件結(jié)構(gòu)每個(gè)被使用的文件都在內(nèi)存中開(kāi)辟一個(gè)區(qū)域,用來(lái)存放文件的有關(guān)信息,例如文件的名字、文件的狀態(tài)及文件的當(dāng)前位置等。這些信息是保存在一個(gè)結(jié)構(gòu)體變量中的。該結(jié)構(gòu)體類型是由系統(tǒng)定義的,取名為FILE。第104頁(yè),共125頁(yè)。2文件類型指針文件緩沖區(qū)是內(nèi)存中用于數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)塊,在文件處理過(guò)程中,程序需要訪問(wèn)該緩沖區(qū)實(shí)現(xiàn)數(shù)據(jù)的存取。因此,如何定位其中的具體數(shù)據(jù),是文件操作類程序解決的首要問(wèn)題。還有,文件緩沖區(qū)由系統(tǒng)自動(dòng)分配,并不像數(shù)組那樣可以通過(guò)數(shù)組名加下標(biāo)來(lái)定位。為此,C語(yǔ)言引進(jìn)FILE文件結(jié)構(gòu)

58、,其成員指針指向文件的緩沖區(qū),通過(guò)移動(dòng)指針對(duì)文件的操作。除此之外,在文件操作中還需用到文件的名字、狀態(tài)、位置等信息。 第105頁(yè),共125頁(yè)。9.1.4 文件的打開(kāi)與關(guān)閉和其他高級(jí)語(yǔ)言一樣,程序中要對(duì)文件進(jìn)行操作必須首先打開(kāi)文件,打開(kāi)操作由函數(shù)fopen()完成。在使用完文件之后應(yīng)關(guān)閉該文件,關(guān)閉操作由函數(shù)fclose()完成。 第106頁(yè),共125頁(yè)。1文件打開(kāi)函數(shù)fopen()打開(kāi)文件功能用于建立系統(tǒng)與要操作的某個(gè)文件之間的關(guān)聯(lián),指定這個(gè)文件名并請(qǐng)求系統(tǒng)分配相應(yīng)的文件緩沖區(qū)內(nèi)存單元。ANSI C規(guī)定了標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù),用函數(shù)fopen()來(lái)實(shí)現(xiàn)打開(kāi)文件操作。使用函數(shù)fopen()之前應(yīng)在

59、主函數(shù)之前引入標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù)對(duì)應(yīng)的頭文件stdio.h,即#include 。函數(shù)fopen()的原型如下:FILE * fopen(const char * filename, const char * mode);。函數(shù)以常量字符指針指向的字符作為打開(kāi)文件的方式打開(kāi)常量字符指針給出的文件。函數(shù)將返回filename指定文件的文件指針,當(dāng)發(fā)生錯(cuò)誤時(shí)將返回空指針。函數(shù)需要兩個(gè)形式參數(shù),常量字符指針filename為將要打開(kāi)文件的名字,常量字符指針mode為訪問(wèn)文件的方式。 第107頁(yè),共125頁(yè)。2文件關(guān)閉函數(shù)fclose()當(dāng)文件操作完成后應(yīng)及時(shí)關(guān)閉它,以防止不正常的操作。對(duì)于緩沖文件系

60、統(tǒng)來(lái)說(shuō),文件的操作是通過(guò)緩沖區(qū)進(jìn)行的,如果把數(shù)據(jù)寫(xiě)入文件,首先是寫(xiě)到文件緩沖區(qū)里,只有當(dāng)寫(xiě)滿512B,才會(huì)由操作系統(tǒng)真正寫(xiě)入磁盤(pán)扇區(qū)。如果寫(xiě)入的數(shù)據(jù)不到512B,發(fā)生程序異常終止,那么這些緩沖區(qū)中的數(shù)據(jù)將會(huì)丟失。當(dāng)文件操作結(jié)束時(shí),即使未寫(xiě)滿512B,通過(guò)文件關(guān)閉,能強(qiáng)制把緩沖區(qū)中的數(shù)據(jù)寫(xiě)入磁盤(pán)扇區(qū),確保寫(xiě)文件的正常完成。使用函數(shù)fclose()之前應(yīng)在主函數(shù)之前引入標(biāo)準(zhǔn)輸入輸出函數(shù)庫(kù)對(duì)應(yīng)的頭文件stdio.h,即#include 。函數(shù)fclose()的原型如下:int fclose(FILE * fp);。函數(shù)關(guān)閉文件指針fp指向的文件。當(dāng)文件指針fp指向的文件被成功關(guān)閉時(shí)返回0,否則,發(fā)生

溫馨提示

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

評(píng)論

0/150

提交評(píng)論