C語言詳解筆記_第1頁
C語言詳解筆記_第2頁
C語言詳解筆記_第3頁
C語言詳解筆記_第4頁
C語言詳解筆記_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言詳解(ProblemSolvingandProgramDesigninC)筆記摘要前言本書主要講述兩大部分:程序設(shè)計思想的介紹和C語言語法。第一章C概述C是一種高級程序設(shè)計語言,它是由DennisRitche于1972年在AT&TBell實驗室開發(fā)出來的,起初是作為在UNIX操作系統(tǒng)下編程的工具而設(shè)計的,它的最初使用者就是理解操作系統(tǒng)和底層機器復(fù)雜性的程序員。C語言要素預(yù)處理指令一般程序包括兩部分:預(yù)處理指令和主函數(shù)。預(yù)處理指令(prepeocessordirective)是為C預(yù)處理器(preprocessor)提供指令的命令,預(yù)處理器的工作是在C程序編譯前修改程序文本。常用的指令:#include和#define。每個C實現(xiàn)中都包含了一些實用函數(shù)和符號的集合,稱之為庫。C的ANSI(AmericanNationalStandardInstitute,美國國家標(biāo)準(zhǔn)學(xué)會)標(biāo)準(zhǔn)要求在每個C實現(xiàn)中提供特定的標(biāo)準(zhǔn)庫。例如:#includevstdio.h>,它使預(yù)處理器在編譯前將標(biāo)準(zhǔn)頭文件的定義插入到程序中°#defineK1.069,將常量宏(constantmacro)K與1.069關(guān)聯(lián)起來,該指令讓預(yù)處理器在編譯開始之前,用1.069代替C程序文本中的每一個K。在執(zhí)行中C程序不能改變用常量宏定義的數(shù)值。主函數(shù)每個C程序都有一個主函數(shù),其余行組成了函數(shù)體,函數(shù)體包含兩部分:聲明和可執(zhí)行語句。聲明(declaration):程序的一部分,告知編譯器程序中的存儲單元名稱??蓤?zhí)行語句(executablestament):被轉(zhuǎn)換為機器語言指令,并由計算機執(zhí)行的程序行。Intmain(void){函數(shù)體}Int表明函數(shù)執(zhí)行完成時向操作系統(tǒng)返回一個整數(shù)值,void表示函數(shù)執(zhí)行前不向操作系統(tǒng)接受數(shù)據(jù)。保留字保留字(reservedword):C中有特殊含義的字。例如:intvoiddoublereturn0標(biāo)準(zhǔn)標(biāo)識符標(biāo)準(zhǔn)標(biāo)識符(standardidentifier)擁有特殊含義的字,但程序員可以重新定義(但不建議重新定義)。用戶自己定義的標(biāo)識符遵從以下原則:標(biāo)識符只能由字母、數(shù)字和下劃線組成。標(biāo)識符不能以數(shù)字開頭。C保留字不能用作標(biāo)識符。在C標(biāo)準(zhǔn)庫中定義的標(biāo)識符不能被重新定義。大小寫字母C編譯器區(qū)分大小寫。編程風(fēng)格為用戶定義的標(biāo)識符選擇一個有意義的名稱,這樣標(biāo)識符在使用時就比較容易理解。如果一個標(biāo)識符由兩個以上的單詞組成,那么他們之間用下劃線連接。為了避免混淆不適用名稱相似的標(biāo)識符,尤其應(yīng)該避免選擇兩個僅有大小寫字母區(qū)別的標(biāo)識符,也不要用兩個僅有下劃線區(qū)別的標(biāo)識符。變量聲明和數(shù)據(jù)類型變量聲明變量聲明將程序中使用的所有變量名告知編譯器,同時告訴編譯器,在每個變量中將會存儲什么類型的信息以及信息在內(nèi)存中如何表示。數(shù)據(jù)類型int型表示的數(shù)值范圍從-32767到+32767。double型1.23e5表示1.23乘以10的5次冪。char型Char型可以表示數(shù)字、字母和專用符號??蓤?zhí)行語句函數(shù)中的可執(zhí)行語句跟在聲明之后,他們用于編寫算法及其細(xì)化的C語句。C編譯器將可執(zhí)行語句翻譯為機器語言。當(dāng)程序運行時,計算機會執(zhí)行語句的機器語言版本。輸入/輸出操作和函數(shù)輸入函數(shù)scanf和輸出函數(shù)printf,printf("格式字符串",輸出列表),舉個例子:printf(“thatequals%fkilometers.\n",kms),%f是占位符。多個占位符格式字符串可以擁有多個占位符。如果調(diào)用printf的輸出列表有多個變量,那么格式字符串將包含同樣數(shù)量的占位符。C以從左到右的順序?qū)φ嘉环妥兞窟M行匹配。舉個例子:printf(”Hi %C%C%C_yourageis%d\n”,letter_1,letter_2,letter_3,age);scanf函數(shù)格式:scanf(“%c%d”,&letter-l,&age);在程序執(zhí)行時,函數(shù)將用戶在鍵盤上輸入的數(shù)據(jù)復(fù)制到內(nèi)存中。格式字符串中的占位符對應(yīng)輸入列表中的變量,變量前面有取地址符號&。占位符的順序必須與變量列表中的變量順序一致。return(0)語句將控制由程序交給操縱系統(tǒng)。小括號中的0被認(rèn)為是函數(shù)main的執(zhí)行結(jié)果,該值表明執(zhí)行的程序沒有錯誤。算術(shù)表達(dá)式運算符/和%當(dāng)操作數(shù)是兩個正整數(shù)時,/計算除法運算的整數(shù)部分;當(dāng)操作數(shù)是double型時,/計算運算的真實值。%取余運算?;旌项愋唾x值語句同時擁有int型和double型操作數(shù)的表達(dá)式是混合類型表達(dá)式,其結(jié)果的數(shù)據(jù)類型是double型。將double型賦給int型時,小數(shù)部分會丟失。強制類型轉(zhuǎn)換將希望的數(shù)據(jù)類型放在表達(dá)式前面的括號內(nèi),從而轉(zhuǎn)換表達(dá)式的類型。要注意整數(shù)除法的使用。多個運算符的表達(dá)式一元運算符:擁有一個操作數(shù)的運算符;二元運算符:需要兩個運算符。在程序輸出中格式化數(shù)值格式化int型%數(shù)字d,數(shù)字表示輸出整數(shù)所用的列數(shù)。格式化double型%m.nf其中m表示整個域?qū)挼臄?shù),包括小數(shù)點在內(nèi),n是希望的小數(shù)位數(shù),以四舍五入的方式舍去。在格式字符串占位符中忽略總的域?qū)捠呛戏ǖ模纾焊袷綖?3.2d3.14159=3.14采用%.nf的格式可以消除數(shù)據(jù)前面的前導(dǎo)空白。交互模式、批處理模式和數(shù)據(jù)文件交互模式(interactivemode):用戶通過輸入(鍵入)數(shù)據(jù)來響應(yīng)提示符的一種程序運行模式。批處理模式(batchmode):程序從預(yù)先準(zhǔn)備好的數(shù)據(jù)文件中得到數(shù)據(jù)的一種程序運行模式。第二章函數(shù)的自頂向下設(shè)計自頂向下設(shè)計(top_downdesign):將問題分解為主要的子問題,然后解決子問題以得到最初問題的解決方案。無參函數(shù)函數(shù)原型Ftypefname(void) ftype表示函數(shù)的返回值類型,void為無返回值;fname表示函數(shù)名。函數(shù)定義寫函數(shù)體幾個不常用的數(shù)學(xué)函數(shù):Ceil(x):返回不小于x的最小整數(shù) fabs(x):返回double型參數(shù)的絕對值Floor(x):返回不大于x的最大整數(shù)pow(x,y):返回x的y次幕帶輸入?yún)?shù)的函數(shù)每當(dāng)執(zhí)行函數(shù)調(diào)用語句時,系統(tǒng)就會為該函數(shù)分配內(nèi)存空間作為數(shù)據(jù)存儲空間。包含在函數(shù)數(shù)據(jù)域中的是用于存儲形參和任何在函數(shù)中聲明的局部變量的存儲單元。當(dāng)函數(shù)終止時,函數(shù)數(shù)據(jù)域就丟失了,當(dāng)函數(shù)再次被調(diào)用時會重新產(chǎn)生新的數(shù)據(jù)域。第三章選擇結(jié)構(gòu):if語句和switch語句控制結(jié)構(gòu)控制結(jié)構(gòu):單個指令結(jié)合成的具有一個入口點和一個出口點的邏輯單元。邏輯運算符&&:與 ||:或!:非C語言認(rèn)為任何非零值為true.運算符優(yōu)先級從高到低:函數(shù)調(diào)用——>!、+、-、&(一元運算符)——>*/%——>+-——><<=>=>——>==!=——>&&——>||——>=比較字符先比較字符長度,長度相同看第一個字符,第一個字符相同再看第二個;if語句一個選項形式: if(條件)語句;兩個選項形式:if(條件)語句;else語句;具有復(fù)合語句的if語句也就是由多條執(zhí)行語句,此時要有大括號;內(nèi)聚函數(shù):執(zhí)行單個操縱的函數(shù)。使用常量宏來增強程序的可讀性和可維護性。if嵌套格式:if(條件1)語句1;elseif(條件2)語句2;elseif(條件n)語句n;else語句;swtich語句格式:swtich(條件表達(dá)式){case1:語句1;break;case2:語句12;break;casen:語句nbreak;default:語句n;第四章循環(huán)暫跳過第五章模塊化編程當(dāng)函數(shù)調(diào)用執(zhí)行時,計算機將在該函數(shù)數(shù)據(jù)區(qū)為每一個形式參數(shù)分配內(nèi)存空間,每個實參的值都存儲在其對應(yīng)的形參的內(nèi)存空間中,并且函數(shù)體可以對該值進行操作。存根:不是所有函數(shù)都能夠在同一時間完成,存根的使用使我們能夠調(diào)試和測試主程序流程和已經(jīng)完成的部分。單元測試:對單個函數(shù)進行測試。第六章簡單數(shù)據(jù)類型強制類型轉(zhuǎn)換:例如:有int型的dl=4.nl=5,有double型的frac,表達(dá)式frac=dl/nl,先計算dl/nl的值為0,然后再將結(jié)果轉(zhuǎn)化成double型為0.0,而表達(dá)式frac=(double)dl/(double)nl,先將dl轉(zhuǎn)換為4.0,nl轉(zhuǎn)換為5.0再進行計算,結(jié)果為0.8。枚舉類型:程序員在類型聲明中制定列表值的一種數(shù)據(jù)類型。/*枚舉聲明的格式如下:*/typedefenum{monday,tuesday,wednesday,thursday,friday,saturday,sunday}day_t;枚舉常量Monday表示為整數(shù)0,常量Tuesday表示為1等等。注意:只有標(biāo)識符可以出現(xiàn)在這種類型的值的列表中。注意不要在其他類型中再次使用這些標(biāo)識符。第七章數(shù)組數(shù)據(jù)結(jié)構(gòu)(datastructure):在同一個名稱下存儲的相關(guān)數(shù)據(jù)項的組合;數(shù)組(array):相同類型數(shù)據(jù)項的集合;數(shù)組聲明和引用聲明格式:元素類型aname[size];元素類型aname[size]={初始化列表};數(shù)組引用:aname[下標(biāo)],下標(biāo)可以是int型任意表達(dá)式。數(shù)組參數(shù)形參數(shù)組:數(shù)組位于子函數(shù)的參數(shù)列表中當(dāng)一個沒有下標(biāo)的數(shù)組名出現(xiàn)在函數(shù)調(diào)用的實參列表中時實際存儲在函數(shù)相應(yīng)的形參中的是數(shù)組元素的起始地。例如:voidfill_array(intlist[],intn,intin_value){},實際調(diào)用函數(shù)fill_array()時,形參list[]實際存儲了實參數(shù)組的首地址,所以這樣調(diào)用函數(shù)也是正確的:fill_array(&x[0],10,l),表示給10個元素的數(shù)組x的每個元素賦值為1。數(shù)組作為輸入?yún)?shù)在形參數(shù)組聲明時加上限定詞const用于通知C編譯器該數(shù)組只是函數(shù)的一個輸入,函數(shù)不能修改該數(shù)組。例如:intget_max(constintlist[],intn),表示找到用n個元素數(shù)組中的最大元素。返回數(shù)組結(jié)果例如:voidadd_arrays(constdoublear1[],constdoublear2[],doublearson[],intn){intn;for(i=0;ivn;i++)arsum[i]=ar1[i]+ar[i];},調(diào)用函數(shù)add_arrays(x,y,x_plus_y,n)仔細(xì)觀察會發(fā)現(xiàn),調(diào)用add_arrays時,在訪問輸入?yún)?shù)數(shù)組x和y,以及訪問輸出數(shù)組x_plus_y之間的表示方法上沒有不同。具體地說,不需要在輸出數(shù)組闡述名前面加上&運算符。前面討論過,C語言總是將數(shù)組元素首地址存儲在相應(yīng)的形參中,以便將整個數(shù)組作為闡述傳遞。由于輸出參數(shù)arsum在聲明時沒有帶const限定詞,因此函數(shù)add_arrays會自動擁有存取和改變相應(yīng)參數(shù)組的權(quán)限。棧棧是一個只有頂端元素可以被訪問的數(shù)據(jù)結(jié)構(gòu)。出棧(pop):從棧中移走頂端元素。壓棧(push),在棧中插入一個新元素。7.3數(shù)組搜索與數(shù)組排序略第八章字符串8.1字符串基礎(chǔ)聲明并初始化字符串字符串時作為數(shù)組實現(xiàn)的,因此聲明字符串變量和聲明char型數(shù)組一樣。例如:charstring_var[20],聲明了一個可以容納0到29個字符長的字符串,其中一位被空字符\0占據(jù),空字符標(biāo)記字符串結(jié)束。8.1.2使用printf和scanf進行輸入和輸出例如:printf(“***%8s***%3s***\n”,"short”,'strings'),第一個字符串在一個8列字段右對齊顯示。第二個字符串比指定的字段寬度長,因此字段被擴展到剛好容納該字符串而沒有填充空白。要想左對齊,在占位符前面加上“-”號。Scanf使用注意,為字符串?dāng)?shù)組輸入數(shù)據(jù)時,由于本身傳遞的就是字符串?dāng)?shù)組的首地址,所以無需加取地址符號。字符串庫函數(shù)字符串賦值函數(shù)strcpy將第二個參數(shù)對應(yīng)的字符串復(fù)制到第一個參數(shù)。函數(shù)strncpy()可以指定賦值字符的個數(shù)。其他函數(shù)Strcat()將第二個參數(shù)追加到第一個參數(shù)的末尾。Strcmp()按字母順序比較s1和s2:如果s1超前s2返回負(fù)數(shù)(s1中字母在字母順序表中排在s2的前面),相等返回零,否則返回正數(shù)。Strlen()返回字符串的長度較長的字符串:拼接和整行輸入8.3.1拼接字符串庫函數(shù)strcat和strncat將第二個字符串參數(shù)的全部或部分添加到第一個字符串參數(shù)之后,從而改變第一個參數(shù)。字符和字符串注意區(qū)分字符'a'和字符串”a”。8.3.3輸入一個完整的行函數(shù)fgets()接受三個參數(shù)一一輸出字符串參數(shù)、將要存儲的最大的字符數(shù)和數(shù)據(jù)源文件指針。函數(shù)fgets不會從數(shù)據(jù)文件中讀取超過n-1個字符,并且存儲的最終字符總是“\0”。但是,最后一個字符前一個字符不一定是“\n”。字符串比較函數(shù)strcmp(strl,str2),比較兩個字符串,最從下面兩條原則:如果str1,str2前n個字符匹配并且str1[n]和str2[n]是第一對不匹配的字符,如果且str1[n]vstr2[n],那么strl小于str2,函數(shù)返回-1,反之返回+1,如果兩個字符串各個字符相同,那么返回0.如果str1比str2段,并且str1所有字符與str2的對應(yīng)字符相同,那么str1vstr2。指針數(shù)組聲明方法:數(shù)據(jù)類型*數(shù)組名稱[數(shù)組大小]字符操作C提供了字符輸入輸出程序作為stdio庫的一部分,并且還在庫中提供了用于字母分析和轉(zhuǎn)換的擴展函數(shù)集合,這個哭通過包含頭文#<ctype.h>引用。字符輸入輸出Stdio庫包含了一個名為getchar()的程序,它用于從標(biāo)準(zhǔn)輸入源獲得下一個字符,該標(biāo)準(zhǔn)輸入源和scanf用的輸入源一樣。Getchar()不接受任何參數(shù)并返回輸入的字符作為結(jié)果。實際上getchar()返回值的類型是into8.6.2字符分析和轉(zhuǎn)換Isalpha()參數(shù)是不是字母表中的一個字母Isdigit()參數(shù)是不是一個數(shù)字Islower()參數(shù)是不是一個小寫字母Isupper()參數(shù)是不是一個大寫字母Ispunct()參數(shù)是不是一個標(biāo)點符號Isspace()參數(shù)是不是空格、執(zhí)行或制表符等空白字Tolower()大寫字母轉(zhuǎn)換成小寫字母Toupper()小寫字母轉(zhuǎn)換成大寫字母結(jié)果為真時返回非零值,結(jié)果為假時返回0。遞歸(recursive)函數(shù)調(diào)用自身稱為遞歸。結(jié)構(gòu)體和共同體用戶自定義結(jié)構(gòu)體類型數(shù)據(jù)庫是存儲在計算機內(nèi)存或硬盤文件中的信息集合,可以細(xì)分為記錄結(jié)構(gòu)體類型定義語法:typedefstrcut{Type1id_list1;Type2id_list2;Typenin_listn;}struct_type;為了避免混淆,自定義結(jié)構(gòu)體的名字以_t結(jié)束。Typedef語句本身不分配內(nèi)存,為了給結(jié)構(gòu)化的數(shù)據(jù)對象分配存儲空間需要聲明變量。分層結(jié)構(gòu)體(hierarchicalstructure):成員是機構(gòu)體類型的結(jié)構(gòu)體。操作結(jié)構(gòu)化數(shù)據(jù)對象的單個成員可以通過直接成員選擇運算符來引用一個結(jié)構(gòu)體的成員。直接成員選擇運算符(directcomponentselectionoperator)為實現(xiàn)對成員的引用,介于結(jié)構(gòu)類型變量和成員之間的句點符號。運算符的優(yōu)先級與結(jié)合性優(yōu)先級符號運算符名稱結(jié)合性最咼A[]f().下標(biāo)、函數(shù)調(diào)用、成員運算符左++--自加自減的后綴形式左+—!—+&*自加自減的前綴形式、邏輯非、一兀正負(fù)、取地址、指針運算符右(類型名)強值類型轉(zhuǎn)換右*/%乘法、除法、取余左+-二元關(guān)系運算符加減左<><=>=關(guān)系運算符左1r==!=相等性、不等性運算符左&&邏輯與左II邏輯或左最低=+=-=*=/=%=賦值運算符右操作整個結(jié)構(gòu)體整個結(jié)構(gòu)體可以直接進行賦值操作。10.2結(jié)構(gòu)體類型數(shù)據(jù)作為輸入/輸出參數(shù)當(dāng)結(jié)構(gòu)體變量作為輸入?yún)?shù)傳遞給一個函數(shù)時,結(jié)構(gòu)體所有成員的值均復(fù)制給函數(shù)相應(yīng)形參的成員;當(dāng)這樣的變量用作輸出參數(shù)時,必須使用取地址運算符。例如:Voidprint_planet(planet_tpl){Printf(“%s\n,);Printf(“Equatorialdiameter:%.0fkm\n”,pl.diameter);}也可以定義指向結(jié)構(gòu)體的指針,例如:planet_t*plnp;plnp為指向結(jié)構(gòu)的指針,可以利用(*plnp).成員變量來訪問結(jié)構(gòu)體的數(shù)據(jù)成員。也可以利用間接成員選擇運算符->來訪問結(jié)構(gòu)體的成員變量,例如:plnp->name返回值為結(jié)構(gòu)體類型的函數(shù)C處理結(jié)構(gòu)體的方法和處理簡單數(shù)據(jù)類型的機制非常一致,而與處理數(shù)組的方式大大不同。指的是傳遞參數(shù)時直接傳遞結(jié)構(gòu)體,不用加取地址符。結(jié)構(gòu)體數(shù)組數(shù)組的組成元素為結(jié)構(gòu)體。聲明方式為:結(jié)構(gòu)體名稱數(shù)組名稱[元素個數(shù)];注意:結(jié)構(gòu)體數(shù)組作為出入?yún)?shù)或者返回值時,傳遞的還應(yīng)該是指針。共同體共同體(union):一種數(shù)據(jù)結(jié)構(gòu),所有成員共用一塊內(nèi)存,允許把一塊內(nèi)存解釋成多種方式。定義方式:typedefunion{變量類型變量名;變量類型變量名;}共同體名稱;聲明共同體以后,當(dāng)前只有一個成員變量有效,分配內(nèi)存空間的大小由共同體中最大的成員決定。第11章文本文件和二進制文件輸入\輸出文件C可以處理兩種文件:文本文件和二進制文件。文本文件是在輔助存儲器(例如磁盤)中保存的一個已命名的字符集合。為標(biāo)記文本文件結(jié)束,計算機會在文件的最后一個字符之后放置一個特殊的文件結(jié)束符標(biāo)記為<EOF>。鍵盤和屏幕作為文本流Stdin:指向鍵盤輸入流的系統(tǒng)文件指針Stdout、stderr:指向屏幕輸出流的系統(tǒng)文件指針。轉(zhuǎn)義序列'W換行 ’\t'制表’\f'換頁它回車W退格C中的用'\\'表示printf輸出占位符 說明%O 將整數(shù)轉(zhuǎn)換為八進制輸出%X 將整數(shù)轉(zhuǎn)換為十六進制輸出%e/E 科學(xué)技術(shù)法表示的小數(shù)輸出%% 一個%號符號每個占位符都可以與一個數(shù)值域?qū)捊Y(jié)合,用于指定該數(shù)值顯示時所占據(jù)的最小列數(shù)。如果數(shù)值為正,那么要顯示的數(shù)值在該域中是右對齊;如果數(shù)值為負(fù)值,那么要顯示的數(shù)值在該域中是左對齊。文件指針變量將一個非標(biāo)準(zhǔn)的文本文件用于輸入和輸出之前,必須聲明一個文件指針變量,并給它一個值。系統(tǒng)必須在允許存取之前準(zhǔn)備好輸入或輸出的文件。文件指針變量的聲明和初始化如下:FILE*infilep;FILE*outfilep;Infilep=fopen(“b:data.txt”,”r”);Outfilep=fopen(“b:results.txt”,”w”);文件指針是FILE結(jié)構(gòu)類型的地址,它包含了存取由fopen打開的文件的必要信息,而且必須存儲在FILE*類型的變量中??罩羔槪褐禐镹ULL的指針。11.1.4獲取文件指針參數(shù)的函數(shù)比較標(biāo)準(zhǔn)文件的I/O與用戶定義的文件指針的I/O行存取stdin和stdout的函數(shù)可以存取任何文本文件的函數(shù)1Scanf(“%d",&num);Fscanf(infilep,"%d",&num);2Printf(“Number=%d\n”,num);Fprintf(outfilep,"Number=%d\n",num);3Ch=getchar();Ch=getc(infilep);4Putchar(ch);Putc(ch,outfilep);11.1.5關(guān)閉文件當(dāng)程序不再使用一個文件時,應(yīng)當(dāng)通過調(diào)用帶有文件指針的庫函數(shù)fclose關(guān)閉該文件。二進制文件當(dāng)使用文本文件存儲數(shù)據(jù)時,程序必須花費相當(dāng)多的精力將輸入文件中的字符流轉(zhuǎn)換為二進制整數(shù)、double型的尾數(shù)和指數(shù),以及字符串,這是它們在內(nèi)存中的表示形式。為了將數(shù)據(jù)存儲在一個輸出文本文件中,程序還必須在一次地花費時間將內(nèi)部數(shù)據(jù)轉(zhuǎn)換為字符流。Sizeof:確定存儲某個數(shù)據(jù)類型所需字節(jié)數(shù)的運算符。注意:在一臺計算機上產(chǎn)生的二進制文件在另一種型號的計算機上幾乎是不可讀的;使用fwrite產(chǎn)生的二進制文件必須使用fread讀取,使用fprintf產(chǎn)生的文本文件必須使用fscanf這樣的文本文件輸入函數(shù)讀取。關(guān)于文件操作的幾點注意:處理文件之前先聲明文件指針變量;fscanffprintfgetcputc只用于文本I/O,而函數(shù)fread和fwtite只用于二進制文件;使用文件名的唯一文件操作是調(diào)用fopen;第十二章大型程序設(shè)計使用抽象處理復(fù)雜問題過程抽象:主函數(shù)由一系列函數(shù)調(diào)用組成,每個函數(shù)分別實現(xiàn)的編程技術(shù)。強大的函數(shù)庫的存在對于降低大型系統(tǒng)的復(fù)雜性非常有益。一旦一個函數(shù)的目標(biāo)和參數(shù)表明確了,這個函數(shù)可以被所有程序員共享,而每個程序員不必關(guān)心程序?qū)崿F(xiàn)的具體細(xì)節(jié)。數(shù)據(jù)抽象:通常我們只關(guān)心數(shù)據(jù)對象的類型和在這些數(shù)據(jù)對象上執(zhí)行的操作,而不必過多關(guān)心數(shù)據(jù)對象是如何表示和存儲在內(nèi)存當(dāng)中的。數(shù)據(jù)抽象是指將數(shù)據(jù)對象的邏輯視圖(存儲的內(nèi)容)與物理視圖(信息如何存儲)分開。信息隱藏在設(shè)計頂層,設(shè)計者將重點放在如何使用數(shù)據(jù)對象和運算符上;在設(shè)計的底層,設(shè)計者解決實現(xiàn)細(xì)節(jié)。防止高層模塊直接訪問底層模塊的實現(xiàn)細(xì)節(jié)的過程稱為信息隱藏??芍赜么a主要是封裝的概念(encapsulate),將數(shù)據(jù)對象及其運算符作為一個單元進行包裝。個人庫:頭文件使用C語言預(yù)處理指令#include使得個人庫也稱為可利用的庫。產(chǎn)生個人庫必須先產(chǎn)生頭文件——包含關(guān)于一個庫的所有信息的文本文件,頭文件常見內(nèi)容包括:總結(jié)庫效用的注釋塊(就是注釋說明);常量宏定義;類型定義(比如說結(jié)構(gòu)體);4.說明每個庫函數(shù)目的的塊注釋和如下的函數(shù)聲明格式:externprototype。個人庫:實現(xiàn)文件頭文件和實現(xiàn)文件是個人庫中兩個基本的源文件。頭文件描述庫函數(shù)做什么,而實現(xiàn)文件給出函數(shù)如何完成。五種存儲類auto存儲類形參和函數(shù)的局部變量屬于auto存儲類,在函數(shù)調(diào)用時自動分配存儲空間到棧上,在函數(shù)返回時釋放存儲空間。extern存儲類這意味著他們對于連接器是可見的,編譯器為了翻譯函數(shù)調(diào)用,需要知道有關(guān)函數(shù)的重要信息:它的返回類型、它有多少個參數(shù)、以及參數(shù)的數(shù)據(jù)類型,語句externprototype的目的就是提供這類信息。該語句不產(chǎn)生extern存儲類的函數(shù),它僅僅通知編譯器存在這樣的函數(shù),并告知編譯器連接器去哪里找到它。全局變量全局變量的作用域從變量聲明處一直到源文件結(jié)束(除非是在函數(shù)中將同樣的名稱聲明為形參或局部變量),可由程序中的多個程序訪問。static類型在程序執(zhí)行之前只分配一次存儲空間的變量的存儲類,知道整個程序終止以前,該空間始終不會被釋放。register類型它與auto很接近,并且只能用于局部變量和參數(shù)。聲明為register是為了通知編譯器存儲單元將會被頻繁使用。該存儲類的一個較好的應(yīng)用場合是作為大型數(shù)組下標(biāo)的變量。函數(shù)退出Exit(O):使用數(shù)值0調(diào)用exit函數(shù)表示沒有故障,函數(shù)執(zhí)行成功。Exit(1):使用數(shù)值1調(diào)用exit函數(shù)表示是一些故障導(dǎo)致了退出。條件編譯由于C語言禁止頭文件的重復(fù)說明,因此要為頭文件設(shè)計條件編譯,格式為:#if!defined(NAME_H)#defineNAME_H頭文件#endif12.7定義帶參數(shù)的宏定義的形式為:#definemacro_name(parameterlist)macrobody;第十三章動態(tài)數(shù)據(jù)結(jié)構(gòu)是在程序執(zhí)行時擴展和收縮的結(jié)構(gòu)。節(jié)點:動態(tài)分配內(nèi)存的結(jié)構(gòu),連接在一起形成一個復(fù)合結(jié)構(gòu)。13.1指針13.1.1作為函數(shù)參數(shù)的指針主要是研究了函數(shù)輸出參數(shù)的指針的使用,通過將變量地址傳遞給函數(shù),就給函數(shù)提供了將某個結(jié)果存儲在該變量中的一種方法。此時,在函數(shù)體中操作的不應(yīng)該是指針而是指針的間接數(shù)值即指針指向的變量。13.1.2表示數(shù)組和字符串的指針牢牢記?。簲?shù)組和字符串(實際上也是數(shù)組)在作為參數(shù)使用時,只能通過傳遞數(shù)組和字符串指針(首地址)來實現(xiàn),使用沒有下標(biāo)的數(shù)組名也可以作為指針使用。13.1.3指向結(jié)構(gòu)體的指針結(jié)構(gòu)體作為輸入?yún)?shù)時,可以將整個結(jié)構(gòu)體作為形參;結(jié)構(gòu)體作為輸出參數(shù)時,必須使用指針來傳遞。13.2動態(tài)內(nèi)存分配這里介紹指針的另一種應(yīng)用環(huán)境——作為一種訪問內(nèi)存塊的方法,該內(nèi)存塊是為了相應(yīng)一個明確的程序要求而分配的。可以調(diào)用C語言的內(nèi)存分配函數(shù)malloc()為變量動態(tài)分配空間,返回指向分配塊的指針,此時的指針類型為void*型,需要強制轉(zhuǎn)換為所需的數(shù)據(jù)類型。堆(heap):malloc函數(shù)在其中動態(tài)分配存儲塊的內(nèi)存區(qū)域;棧(stack):在其中分配和收回函數(shù)數(shù)據(jù)區(qū)的內(nèi)存區(qū)域;使用calloc動態(tài)分配數(shù)組使用函數(shù)calloc可以為任何內(nèi)部或用戶定義類型分配單個內(nèi)存塊。為動態(tài)產(chǎn)生一個數(shù)組,使用函數(shù)calloc,函數(shù)有兩個參數(shù):所需的數(shù)組元素和每個元素的大小。函數(shù)返回的也是指針,同樣也要對指針進行強制類型轉(zhuǎn)換。舉一個例子:Char*string1;Intstr_size;String1=(char*)calloc(str_size,sizeof(char));13.3鏈表鏈表(Linkedlist):一個節(jié)點序列,其中除了最后一個節(jié)點外的每個節(jié)點都包含下一個節(jié)點的地址。帶指針成員的結(jié)構(gòu)體為了建立一個動態(tài)鏈表,需要使用帶有指針成員的節(jié)點。適合鏈表節(jié)點的類型定義為:Typedefstructnode_s{Charcurrent[3];Intvolts;Structnode_s*linkp;}node_t;Structnode_s和node_t是等效的,由于定義指針時編譯器還沒有看到node_t,所以要用stuctnode_s。鏈表節(jié)點帶指針的結(jié)構(gòu)體定義好以后,可以聲明任意多個鏈表節(jié)點:node_s*n1_p,node_s*n_2,node_s*n3_p;再通過賦值語句nl_p->linkp=n2_p;n2_p->linkp=n3_p;來形成類表結(jié)構(gòu)。然而在末端任然有一個未定義的linkp成員,鏈表在此處需要結(jié)束,在C語言中,空表由指針NULL表示,空表指沒有結(jié)點的表,在C中由指針NULL表示,NULL的值為0。指向第一個結(jié)點的指針稱為表頭,通過表頭可以訪問鏈表中每個元素。13.3.3鏈表的優(yōu)點可以很容易刪除和插入一個結(jié)點,插入結(jié)點時需要修改插入點前點的指針指向,并將新點的指針指向它后面的結(jié)點。刪除結(jié)點應(yīng)該改變結(jié)點前一點指針的指向。13.4鏈表運算符遍歷鏈表(traversingalist)從表頭開始,順序處理鏈表中的每個結(jié)點??梢岳眠f歸調(diào)用或者是循環(huán)實現(xiàn)。用鏈表表示棧棧:一種數(shù)據(jù)結(jié)構(gòu),最后入棧的數(shù)據(jù)項最先處理。用鏈表表示隊列隊列:元素在一端插入,而在另一段移出的數(shù)據(jù)結(jié)構(gòu)。隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu)。我們需要跟蹤隊列的首個結(jié)點和最后一個結(jié)點,他們分別是隊列的前端和末端。這是因為隊列中移出結(jié)點時需要訪問前端,而加入一個結(jié)點需要訪問末端。另外,我們需要能夠找出隊列大小,最好不遍歷所有表結(jié)點。有序表每個元素的位置由其關(guān)鍵成員的值所決定的一個數(shù)據(jù)結(jié)構(gòu),關(guān)鍵值構(gòu)成了一個升序或降序的序列。二叉樹幾個基本概念:葉子結(jié)點(leafnode):沒有后繼結(jié)點的二叉樹結(jié)點;根結(jié)點(rootnode):二叉樹中的第一個結(jié)點;左子樹(leftsubtree):數(shù)中根結(jié)點的左指針?biāo)赶虻哪遣糠?;右子?rightsubtree):樹中跟幾點的右指針?biāo)赶虻哪遣糠郑欢娌檎覙鋵?shù)據(jù)用一種可以非常有效地實現(xiàn)檢索的方法進行存儲的樹結(jié)構(gòu)。在二叉查找樹中存儲的每一項都擁有唯一的關(guān)鍵碼值。二叉查找樹或為空,或其特性為:根結(jié)點中的數(shù)據(jù)項的關(guān)鍵碼值大于其左子樹中每項的

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論