完整C語言基礎知識大全,推薦文檔_第1頁
完整C語言基礎知識大全,推薦文檔_第2頁
完整C語言基礎知識大全,推薦文檔_第3頁
完整C語言基礎知識大全,推薦文檔_第4頁
完整C語言基礎知識大全,推薦文檔_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、1.語言變量聲明和變量賦值1根本數(shù)據(jù)類型在C語言中,僅有4種根本數(shù)據(jù)類型一整型、浮點型、指針和聚合類型如 數(shù)組和結構等,所有其他的類型都是從這4種根本類型的某種組合派生而來.整型:整型家族包括字符、短整型、整型和長整型,它們都分為有符號signed 和無符號unsigned兩種版本.規(guī)定整數(shù)值相互之間大小的規(guī)那么很簡單:長整 型至少應該和整型一樣長,而整型至少應該和短整型一樣長.浮點類型:諸如3.14159和2.3X 1023這樣的數(shù)值無法根據(jù)整數(shù)存儲.第一個 數(shù)為非整數(shù),而第二個數(shù)遠遠超出了計算機整數(shù)所表達范圍,這樣的數(shù)就可以用浮點數(shù)的形式存儲.浮點數(shù)家族包括 float、double和lo

2、ng double類型.通常, 這些類型分別提供單精度、雙精度以及在某種擴展精度的機器上提供擴展精度.ANSI標準僅僅規(guī)定long double至少和double 一樣長,而double至少和float 一 樣長.標準同時規(guī)定了一個最小范圍:所有浮點類型至少能夠容納從10-37到1037 之間的任何值.指針:變量的值存儲于計算機內(nèi)存中,每個變量都占據(jù)一個特定的位置.每 個內(nèi)存的位置都由地址唯一確定并應用,就像一條街上的房子由他們的門牌號 標識一樣,指針知識地址的另一個名字.2變量聲明形式只知道根本的數(shù)據(jù)類型是遠遠不夠的, 你還應該知道怎樣聲明變量.變量的 根本形式是:說明符一個或多個聲明表達式

3、列表對于簡單的類型,聲明表達式列表就是被聲明的標識符的根本類型. 對于相 比照擬復雜的類型,聲明表達式列表的每個條目實際上是一個表達式, 顯示被聲 明的名字的可能用途.例如:int a, double b;該語句就是一條聲明語句,其中 a,b就是變量名,該語句指明了變量 a,b是 int數(shù)據(jù)類型.所有變量在使用前都必須寫在執(zhí)行語句之前,也就是變量聲明要 與執(zhí)行語句相別離,否那么就是出現(xiàn)編譯錯誤.3變量命名C語言中任何的變量名都是合法的標示符.所謂標識符就是由字母、數(shù)字和下劃線組成的但不以數(shù)字開頭的一系列字符.雖然C語言對標示符的長度沒有限制,但是根據(jù)ANSI標準,C編譯器必須要識別前31個字符

4、.C語言是對大 小寫敏感的,即C語言認為大寫字母和小寫字母的含義是不同的,因此a1和A1是不同的標識符.到目前為止,沒有一種命名規(guī)那么可以讓所有的程序員贊同, 程序設計教科書 一般都不指定命名規(guī)那么.常用的命名規(guī)那么有匈牙利命名法和駝峰命名法等, 在實 際操作中,我們會采取相對簡單方便的命名規(guī)那么, 即“類型首字母" + “_ + “變 量用途英文縮寫,其中英文縮寫首字母為大寫,例如int i_Num,char c_Name5.4)變量賦值在一個變量聲明中,你可以給一個標量變量指定一個初始值,方法是在變量名后面跟一個等號(賦信號),后面就是你想要給變量的值.例如:int i_Num=

5、10;char c_Name= " student ;上述語句聲明i_Num為一個整數(shù)變量,其初始值為 10,聲明c_Name為一 個字符數(shù)組,其初始也為“ student在C語言中,全局變量和靜態(tài)變量,如果沒有賦初值,那么默認初始值int,float, char分別為0,0.0, ' 0 '除了全局變量和靜態(tài)變量以外,其他變量如果沒 有賦初值,那么默認初始值為內(nèi)存中的垃圾內(nèi)容,對于垃圾內(nèi)容不能有任何假設. 注意:定義指針后,默認初始值不是0,而是隨機的一個值,故定義指針后,一 定要初始化.在實際操作中,變量的賦值都是以賦值語句的形式出現(xiàn),賦值語句是由賦值表達式再加上

6、分號構成的表達式語句.其一般形式為:變量=表達式;在賦值語句的使用中需要注意以下幾點:a)由于在賦值符“二右邊的表達式也可以又是一個賦值表達式.下述形式:變量=(變量=表達式);該語句是成立的,從而形成了嵌套的情形.具展開后的一般形式為:變量=變量=, =表達式;例如:a=b=c=d=e=5;根據(jù)賦值運算符的右結合性,因此實際上等效于:e=5;d=e;c=d;b=c;a=b;b)注意在變量聲明中給變量賦初值和賦值語句的區(qū)別給變量賦初值是變量說明的一局部,賦初值后的變量與其后的其他同類變量 之間仍必須用逗號隔開,而賦值語句那么必須用分號隔開.例如:int a=5,b,c;c)在變量聲明中,不允許

7、連續(xù)給多個變量賦初值.如下述說明就是錯誤的:int a=b=c=5;正確寫法為:int a=5,b=5,c=5;但是,賦值語句允許連續(xù)賦值.d)注意賦值表達式和賦值語句的區(qū)別.賦值表達式是一種表達式,它可以出現(xiàn)在任何允許表達式出現(xiàn)的地方,而賦值語句那么不能.下述語句是合法的:If(x=y+7)>0) z=x;語句功能為假設表達式x=y+5大于0那么z=xo但是,下述語句是錯誤的:If(x=y+7;)>0) z=x;由于x=y+7;是語句,不能出現(xiàn)在表達式中.實例:#include“stdafx.h "void main()(int i_Tmp,i_Type=8;float

8、 f_Tmp;double d_Tmp;char c_Tmp;d_Tmp=d_Tmp=f_Tmp=12;f_Tmp=i_Type;i_Tmp=i_Type+3;printf("a=%d,b=%d,c=%.3f,d=%.6lf",i_Tmp,i_Type,f_Tmp,d_Tmp);參考書目:1 .(美)Kebbeth A.reek.?C 與指針?29-402 . H.M.Deitel P.J.Deitel 等?how to program Second Edition19-233 .算術運算符及使用方式c語言提供了最根本的算術運算符,如下表:運算符含義舉例結果+加法運算符a+

9、ba和b的和-減法運算符a-ba和b的差*乘法運算符a*ba和b的乘積/除法運算符a/ba除b的商%求余運算符a%ba除b的余數(shù)+自加運算符a+,+aa自加1-自減運算符a-,- aa自減11、+、-、*、/都適用于浮點類型和整數(shù)類型,當兩個操作數(shù)都為整數(shù)時進 行整數(shù)運算,其余情況那么進行 double型運算;當/除法運算符的兩個操作數(shù)為整 數(shù)時,結果為整數(shù),舍去小數(shù)局部,例如5/3的結果為1; %求余運算符只接受兩個整型操作數(shù)的運算,結果為余數(shù)2、+、-:作用是使變量自加1或自減1,例如i+、+i,都是使i的值加 1,但其執(zhí)行的步驟是不同的.例如:int i=3, j;j=i+ ; / i的

10、值為4 , j的值為3int i=3, j;j=+i; /i的值為4, j的值為4可見當變量在左側時,先進行賦值運算再進行自加1操作,當變量在右側時, 先進行自加1操作再進行賦值運算.3、在賦值運算符之前加上算術運算符既構成復合運算符,例如: a+=b,等 價于a=a+b.-=、*=、/=也是如此.4 .位運算符及使用方式 、|、&、A位運算符是用來對二進制位進行操作,如下表:運算符含義<<左移>>右移取反|按位或&按為與A按為異或<< >>:移位運算符,例如左移運算符:int i=3; i=i<<4;3的二進制位為0

11、0000011,左移4位的結果為00110000,其操作中高位舍 棄、低位補0,既i=48,等同于i乘以2的4次方.右移運算符那么有所不同,操作中是低位舍棄,高位那么有兩種補位方式.一種 為邏輯移位,高位補0;另一種為算術移位,當符號位為1時高位全部補1,當 符號位為0時那么高位全部補0.具體使用哪種移位方式那么取決于當前的編譯環(huán)境.:取反運算符,為單目運算符,其操作是對操作數(shù)的二進制位按位求反,既1變0,0變1.例如i=5,二進制位為00000101,取反的結果為1111101Q在計算機系統(tǒng)中,數(shù)值一律用補碼來表示和存儲,其中最高位為符號位,用 0表示正,1表示負.補碼的規(guī)定如下:a)對正數(shù)

12、來說,最高位為 0,其余各位代表數(shù)值本身,例如 14的補碼為 00001110;對負數(shù)而言,那么將該數(shù)絕對值的補碼按位取反,再加 1,得 該數(shù)的補碼,既-i=i+1.例如-14的補碼為14的二進制00001110取反 加 1 得 1111001Qb) |、&、八:均為雙目運算符,對操作數(shù)的二進位進行運行,且操作數(shù)以 補碼的方式出現(xiàn).c) |按位或,兩個對應的二進位至少有一個為1那么為1,否那么為0; &按位與,兩個對應的二進位都為1那么為1,否那么為0; A按位異或,兩個對應 的二進位不同那么為1,否那么為0o例如:a=5;(00000101)b=14;(00001110)a|

13、b=15; (00001111)a&b=4; (00000100)aAb=11; (00001011)4 .關系運算符及使用方式(>、>=、<、<=、=、!=)運算符含義>> =<小于< =小于或等于=!=不等于關系運算符用于比較兩個數(shù)值之間的關系,例如:a>3為關系表達式,大于號為關系運算符,當表達式成立時,“a>3的值為“真",當“a>3不成立時,“a3的值為“假.其中應當注意的是關系表達式的返回值為整型值, 而不是布爾型.表達式為 真時返回值為1,表達式為假時返回值為005 .邏輯運算符及使用方式&

14、;&、|、!運算符含義舉例結果&&邏輯與a&&ba,b都為真那么結果為真,否那么為假|邏輯或a|ba,b至少有一個為真那么結果為真,否那么為假!邏輯非!a當a為真那么結果為假,當 a為假那么結果為真其中應當注意邏輯或,例如a|b,當a為真時,C諦言中直接跳過對b的判 斷,其返回值為“真.個表達式包括幾種運算符時,那么以運算符的優(yōu)先級對表達式進行運算,表達式的優(yōu)先級如下:優(yōu)先級運算符類型說明1初等運算符、-、.2單目運算符!、+、-、*指針運算符、&取地址運算符3算術運算符先乘除后加減4關系運算符、=、=、=、!=5邏輯運算符&&、

15、|6條件運算符三目運算符,例如:7賦值運算符=8逗號運算符6 .指針的概念與使用1指針的定義指針就是變量的地址,是一個常量.定義指針的目的就是為了通過指針訪問 內(nèi)存單元.在c語言中,允許用一個變量來存放指針,這種變量稱為指針變量.指針變量定義的一般形式為:存儲類型數(shù)據(jù)類型*指針變量名2指針變量運算符1、取地址運算符:&該運算符表示的是對&后面的變量進行取地址運算.例:int a;那么&a表示取變量a的地址,該表達式的值為變量 a的首地址.2、指針運算符:*該運算符也稱為“取內(nèi)容運算符,后面接一個指針變量.表示的是訪問該 指針變量所指向的變量,即訪問指針所指向的存儲空間中

16、的數(shù)據(jù).例:int a=7;int *p;p=&a;那么*p表示指針變量p指向變量a,即*p就是a,所以*p=7 o 一個指針變量p在程序中通常有如下表示形式:p:指針變量,它的內(nèi)容是地址量;*p:指針所指向的變量,是指針所指向的內(nèi)存空間中的數(shù)據(jù);&p:指針變量所占存儲空間的地址;【例11分析程序的運行結果源程序如下:#include<stdio.h>void Locateint i_a;int *pst_a;printf"n 請輸入 i_a 的值:"scanf"%d",&i_a;pst_a =&i_a;pri

17、ntf"i_a 的值為:%dn",i_a;printf"pst_a 的值為:xn", pst_a;printf"&i_a 的值為:xn",&i_a;printf"*pst_a 的值為:dn",* pst_a;printf"&pst_a 的值為:%xn",& pst_a;printf"n"運行結果:請輸入i_a的值:3i_a的值為:3pst_a 的值為:12fe8c&i_a 的值為:12fe8c*pst_a的值為:3&pst_a

18、的值為:12fe80以上實例中,12fe8c是pst_a的值,也就是i_a的地址;12fe80是pst_a的地 址;兩者有區(qū)別,不能混為一談.3地址與指針的概念指針可以有效地表示復雜的數(shù)據(jù)結構;動態(tài)分配內(nèi)存;方便的使用字符串; 有效而方便地使用數(shù)組;能直接處理內(nèi)存地址.如果在程序中定義了一個變量,在編譯時就給這個變量分配內(nèi)存單元.系統(tǒng)根據(jù)程序中定義的變量的類型,分配一定長度的空間.例如,一般微機使用的C系統(tǒng)為整形變量分配兩個字節(jié),為實型變量分配4個字節(jié).內(nèi)存區(qū)的每一個字節(jié) 有一個編號,這就是“地址,它相當于旅館中的房間號.在地址所標志的內(nèi)存 單元中存放數(shù)據(jù),這相當于旅館中各個房間中居住旅客一樣

19、.在程序中一般通過變量名對內(nèi)存單元進行存取操作,這稱作“直接訪問 , 還可以采用 另一種“間接訪問方式,將變量的地址存放在另一個變量中.所 謂“指向就是通過地址來表達的,由于通過地址能找到所需的變量單元,我們 可以說,地址“指向該變量單元,因此在 C語言中,將地址形象化的稱為“指針.意思是通過它能找到以它為地址的內(nèi)存單元.一個變量的地址成為該變量 的“指針.如果有一個變量專門用來存放另一個變量的地址,那么稱它為“指針 變量.4變量的指針和指向變量的指針變量變量的指針就是變量的地址.存放變量地址的變量是指針變量,用來指向另 一個變量.為了表示指針變量和它指向的變量之間的關系, 用符號表示“指 向

20、.定義指針變量的一般形式為:基類型*指針變量名;5數(shù)組與指針一個變量有地址,一個數(shù)組包含假設干元素,每個數(shù)組元素都在內(nèi)存中占有存 儲單元,它們都有相應的地址.指針變量也可以指向數(shù)組元素.6) 空間操作函數(shù)malloc、freeC語言提供了兩個函數(shù),malloc與free,分別用于執(zhí)行動態(tài)內(nèi)存分配與釋放. 這些函數(shù)維護一個可用內(nèi)存池.當一個程序另外需要一些內(nèi)存時,它就調(diào)用 malloc函數(shù)從內(nèi)存池中提取一塊適宜的內(nèi)存,并返回一個指向這塊內(nèi)存的指針. 這塊內(nèi)存此時并沒有以任何方式進行初始化,使用時需手動初始化.這兩個函數(shù)的原型如下所示,它們都在頭文件stdio.h中聲明.void *mallloc

21、 size_t size;Void *free viod* pointer;malloc的參數(shù)就是需要分配的內(nèi)存字節(jié)數(shù).如果內(nèi)存池中的可用內(nèi)存可以滿 足這個需要,malloc就返回一個指向被分配的內(nèi)存塊起始位置的指針,如果系統(tǒng)無法向malloc提供更多的內(nèi)存,malloc就會返回一個NULL指針.free的參數(shù)必須要么是NULL ,要么是一個先前從 malloc或其他空間申請函 數(shù)返回的值.malloc的一般用法基類型*=基類型*Malloc 數(shù)量*sizeof 基類型;7動態(tài)數(shù)組動態(tài)數(shù)組是指在聲明時沒有確定數(shù)組大小的數(shù)組,即忽略方括號中的下標; 當使用時可用malloc語句重新指出數(shù)組的大小

22、.使用動態(tài)數(shù)組的優(yōu)點是可以根 據(jù)用戶需要,有效利用存儲空間.動態(tài)數(shù)組的內(nèi)存空間是從堆上分配的. 是通過 執(zhí)行代碼而為其分配空間.當程序執(zhí)行到這些語句時,才為其分配空間.程序員 自己釋放內(nèi)存.遵循原那么:申請的時候從外層往里層,逐層申請;釋放的時候從里層往外層,逐層釋放.【例2】:一維數(shù)組的動態(tài)開辟與釋放:£n+*i_Arra.y ;指向一維數(shù)組的指鐘int"數(shù)組個數(shù)i_Array=(int*)mallQC (3.Ravstsizecaf ;for (i_CouTL-t=D;i_Count<50 : i_Count-H-)w (i_f> Tup Ar i?ajN-

23、i_C cunt = i_C aunt :門網(wǎng) 門對); “數(shù)組的釋放|【例3】:二維數(shù)組的動態(tài)開辟:irrt *.i_ArEy:"指向二維救組的指殲int i_Rovs;“二維數(shù)組行.nt i_Cclums;二錐數(shù)組列print £i看輸入行數(shù)與列數(shù)5* ):scanf (“荽冊d, .l_Kcws3 &i_Colums);._Arry=(zLirt*貪)j1rall匚 Cl_R01Meof (int*);fou (ini i=0;i<i_Rcws;i+)i_Arryi = (ini *)inalloc(i_CDluns*sizeof(int),for (i

24、ni 1=0: i<i_Rr)ws : i+)( 一for Cint j=0 ; j<i_Colujis ; j+t) (i_ArryiJ j=i.+j : *中意索*!1!*東*!|£比*索二限數(shù)組的孱池*選京*第*址*加第隼4裳/for (int i=0:i<i_Rows:i+)frte(i Arryi): "free=(i_Arry) ; | fr7.數(shù)組數(shù)組是構造類型,是一組具有相同類型數(shù)據(jù)的有序集合.每個數(shù)據(jù)成為數(shù)組的元素,用一個統(tǒng)一的數(shù)組名和下標來唯一地確定數(shù)組中的元素.一維數(shù)組的聲明方式為:<類型標識符 >< 數(shù)組名 >

25、;常量表達式類型標識符是任一種根本數(shù)據(jù)類型或構造數(shù)據(jù)類型;數(shù)組名由用戶自定義 表示存儲空間的地址;常量表達式表示數(shù)組元素的個數(shù),也是數(shù)組的長度.例:inta6;表示一個整型、數(shù)組名為a、長度為6的一維數(shù)組.(2) 一維數(shù)組的引用形式:下標法:數(shù)組名下標 例如:ai;或pi; a為數(shù)組名,p為指向數(shù)組的指針變量.注:C語言中不能依次引用整個數(shù)組,只能逐個引用數(shù)組中的各個元素.下 標就是被訪問的數(shù)組元素在所定義的數(shù)組中的相對位置.下標為0表示的是數(shù)組元素在數(shù)組的第一個位置上,下標等于1表示的是數(shù)組元素在數(shù)組的第二個位置 上,依次類推.例如:int a10;a0=100;正確a10=100;/不正確

26、,下標越界例如:下標法:int main()(int a10;for(int i=0;i<10;i+)ai=2*i;for(int i=0;i<10;i+)printf( "dt",ai);return 0;指針法:* (a+i)或*(p+i) ; a是數(shù)組名,p為指向數(shù)組的指針變量.例如:指針法:int main()(int *p=a;int i;for(i=0;i<10;i+)ai=2*i;for(i=0;i<10;i+)printf( "dt",* (p+i);return 0;二維數(shù)組的聲明方式為:<類型標識符 &g

27、t;< 數(shù)組名 >常量表達式1常量表達式2:二維數(shù)組與一維數(shù)組的區(qū)別在于多出常量表達式2.常量表達式1是第一維,常稱為行;常量表達式2是第二維,也就是列.例:int a35;表示一個3行5列的二維數(shù)組;數(shù)組元素的個數(shù)為:3*5=15 個.二維數(shù)組的引用形式:下標法:數(shù)組名下標下標注:二維數(shù)組在引用時和一維數(shù)組一樣,只能逐個引用數(shù)組中的各個元素.例如:sz_A56下標可以是整數(shù)表達式,如 sz_A8-52*3-1.不要寫成sz_A2,3、sz_A8-5,2*3-1形式.注意:嚴格區(qū)分定義數(shù)組時用的sz_A56和引用元素時用的sz_A56 的區(qū)別.前者sz_A56用來定義數(shù)組的維數(shù),后

28、者 sz_A56的5和6是下 標,代表的是數(shù)組中的某一個元素.【例2】分析程序的運行結果源程序如下:#include<stdio.h>void main()int sz_Array6;/ 一維數(shù)組int sz_DlArray35;/ 二維數(shù)組int i_a;int i_dla;int i_dlb;一維數(shù)組for (i_a=0;i_a<6;i_a+)sz_Arrayi_a=i_a*2+2;printf("n輸出一維數(shù)組元素為:n");for(i_a=0;i_a<6;i_a+) printf("%dt",sz_Arrayi_a);二維

29、數(shù)組for(i_dla=0;i_dla<3;i_dla+)for(i_dlb=0;i_dlb<5;i_dlb+)sz_DlArrayi_dlai_dlb=i_dla+i_dlb; printf("n輸出二維數(shù)組元素為:n");for(i_dla=0;i_dla<3;i_dla+)for(i_dlb;i_dlb<5;i_dlb+)printf("%d ",sz_DlArrayi_dlai_dlb); printf("n"); 運行結果為:輸出一維數(shù)組元素為:24681012輸出二維數(shù)組元素為:0123412345

30、234563456745678指針法:可以通過行指針來引用二維數(shù)組元素.定義行指針變量:int (*p)3,指針p是指向一個由3個元素所組成的整型數(shù)組指針 例如:void main()(int a34=1,2,3,4,5,6,7,8,9,10,11,12int (*p)4=a;for(int i=0;i<3;i+)for(int j=0;i<4;j+)printf( "%dt",pij);printf("n );參考書目:1. C+語言程序設計教程與實驗(第二版)溫秀梅丁學鈞李建華主編2. C/C+程序設計教程 張世民主編8.字符數(shù)組1)字符數(shù)組的定義

31、與賦值字符數(shù)組是一用字符的集合,其數(shù)組元素為字符型.字符數(shù)組的賦值形式:char數(shù)組名常量表達式="字符串;或char數(shù)組名常量表達式=“字符串 ;例:char sz_A5='s' ,'t' ,'u' ,'d' ,'y' , ;定義數(shù)組sz_A,包含5個元素,其在內(nèi)存中的存放情況為:sz_A0sz_A1sz_A2sz_A3sz_A4study那么各元素賦值如下:sz_A0= ';s'sz_A1= :t'sz_A2= 'u'sz_A3= 'dSz_A4 =&#

32、39;y'如林括號中的字符個數(shù)大于數(shù)組k度,編譯系統(tǒng)就會報錯,I口果花括號中的字符個數(shù)小于數(shù)組長度,其余元素那么由系統(tǒng)自動定義為空字符,即' 0.''昨為字符串的結束標志,因此在定義數(shù)組長度時,應在字符串原有的長 度上加1,為字符串結束標志預留空間.例:char sz_A6='s' ,'t' ,'u' ,'d' ,'y' , ;定義數(shù)組sz_A,包含6個元素,其在內(nèi)存中的存放情況為:sz_A0sz_A1sz_A2sz_A3sz_A4sz_A5study0那么各元素賦值如下:sz_A0

33、= ';s'sz_A1= 't ' sz_A2= 'u'sz_A3= R' sz_A4='y' sz_A5=' 0 '【例3】分析程序的運行結果源程序如下:#include<stdio.h>void main()char sz_A10="work hard"int i;for(i=0;i<9;i+)printf("%c",sz_Ai);運行結果:work hard以上實例中,逐個顯示字符數(shù)組的各個元素,但需注意的是在定義字符數(shù)組 的下標時,至少比后面

34、的字符串長度大 1.其中,字符串長度應包括其中空格的 長度.2)字符用操作函數(shù):a)字符串復制函數(shù)strcpy()格式:strcpy (字符數(shù)組1,字符數(shù)組2)功能:是將字符數(shù)組2中字符串復制到字符數(shù)組1中去.注:字符數(shù)組1的長度必須大于字符數(shù)組2,從而能夠容納復制的字符數(shù)組2的字符串;字符數(shù)組1必須寫成數(shù)組名形式,字符數(shù)組2既可以是字符數(shù)組名, 也可以是字符串;字符數(shù)組之間不能相互賦值.例如:char sz_str110,sz_str26="work hard"Strcpy(sz_str1,sz_str2);printf("%sn",sz_str1);

35、運行結果:work hardb)字符串連接函數(shù)strcat()strcat華符數(shù)組1,字符數(shù)組2)功能:將字符數(shù)組1和字符數(shù)組2中的字符串連接起來,字符數(shù)組2中的字 符串2接到字符數(shù)組1中的字符串后面.注:字符數(shù)組1的長度必須足夠大,能夠同時容納字符數(shù)組1中的字符串和 字符數(shù)組2中的字符串.字符數(shù)組名2中的字符串連接到字符數(shù)組1的字符串時,刪除字符數(shù)組1 中的字符串后面的標志0',只在新用的最后保存“ 0.例如:char sz_str110="work",sz_str26="hard"strcat(sz_str1,sz_str2);printf(

36、"%sn",sz_str1);運行結果:workhardc)字符串比較函數(shù)strcmp()strcmp (字符數(shù)組1,字符數(shù)組2)功能:比較字符數(shù)組1和字符數(shù)組2中字符串,通過函數(shù)返回值得出比較結 果.假設字符數(shù)組1中的字符用 假設字符數(shù)組1中的字符用,函數(shù)返回值0;假設字符數(shù)組1中的字符串 假設字符數(shù)組1中的字符用,函數(shù)返回值0;假設字符數(shù)組1中的字符用=假設字符數(shù)組1中的字符用,函數(shù)返回值=0;注:比較規(guī)那么:比較過程中,根據(jù)從左到右的順序,逐個比較字符的ASCII碼值,直到遇到不相同的字符或“0,即結束比較.例如:char sz_str110="work&q

37、uot;,sz_str210="hard"if (strcmp(sz_str1,sz_str2)0)printf("大于 n");if (strcmp(sz_str1,sz_str2)0)printf("小于 n");if (strcmp(sz_str1,sz_str2)=0)printf("相等 n");運行結果:大于d) sprintf()sprintf (s, " s%d%c, “ text “,1, ; char'將輸出結果寫入數(shù)組S中;其函數(shù)返回值為字符串長度,相當于 strlen;計

38、算長度時不計算“ 0,而sizeof計算時是加上“ 0的.例如:char sz_str;sprintf(sz_str,"%s%d%c","work",6,"hard");i_Tmp=sprintf(sz_str,"%s%d%c","work",6,"hard");printf("sprintf 結果輸出:%sn",sz_str);printf("sprintf 函數(shù)返回值輸出:%dn",i_Tmp);e) sscanf()sscanf(

39、s, " d%f%s ,&a,&b,&c;從一個字符串中讀進與指定格式相同的數(shù)據(jù);其返回值為讀入有效數(shù)據(jù)的個數(shù);從數(shù)組S中,以固定格式向a,b,c輸入,sscan環(huán)識別空格.char sz_str11="work6hard"char sz_str111;sscanf(sz_str,"%4s",sz_str1);i_Tmp=sscanf(sz_str,"%4s",sz_str1);printf("輸出結果:sn",sz_str1);printf("sscanf 函數(shù)返回值:

40、%dn",i_Tmp);運行結果:輸出結果:worksscanf函數(shù)返回值:19,全局變量與局部變量的定義和區(qū)別變量的作用域指變量所起的作用范圍,變量的定義位置決定了變量的作用域, 它可分為全局變量和局部變量.1)全局變量全局變量是指在函數(shù)外部定義的變量,它不屬于哪一個函數(shù),它屬于一個源程序文件,它的作用范圍從定義變量定義的位置開始到根源文件的結束.在函數(shù)中使用全局變量,一般應做全局變量聲明.只有在函數(shù)內(nèi)部經(jīng)過聲明的全局變量 才能使用.但在一個函數(shù)之前定義全局變量,在該函數(shù)內(nèi)使用可不加以聲明.全局變量的作用是增加函數(shù)間數(shù)據(jù)聯(lián)系的渠道.同一個文件中的所有函數(shù)都能引用全局變量的值,當一個

41、函數(shù)改變了全局變量的值,就會影響到其它函數(shù), 有利于函數(shù)之間信息的傳遞.2)局部變量在函數(shù)中或者復合語句中定義的變量稱為局部變量,它的作用范圍只限于該函數(shù)或者該復合語句中,在其它位置無效.如果全局變量和局部變量重名,在定義局部變量中的子程序中局部變量起作 用,全局變量失效.程序在編譯過程中,系統(tǒng)并不會為局部變量分配存儲單元,而在程序的運行 過程中,當局部變量所在函數(shù)被調(diào)用時,系統(tǒng)才會為變量分配臨時內(nèi)存,函數(shù)調(diào) 用結束后,釋放空間.3)全局變量和局部變量的區(qū)別1全局變量的有效范圍從定義該變量的位置開始到根源文件的結束,局部變量只在定義該變量的函數(shù)中有效,在函數(shù)外部無效.2局部變量是程序運行到該函

42、數(shù)時給變量分配內(nèi)存空間, 函數(shù)運行結束后釋 放空間,全局變量在程序運行時先分配內(nèi)存空間, 直到根源文件執(zhí)行完以后釋放 空間.4)程序實例#include "stdafx.h"int x=6,y=8;void plus()(printf( "x=%dt,y=%dn" ,x,y);x+;y+;)void main()(void plus();int x=2,y;x=2,y=3;printf( "x=%dt,y=%dn" ,x,y);plus();printf( "x=%dt,y=%dn" ,x,y);plus();S3

43、 _: . ir d o stem i2c md. exebe =2T=?K=b?卷缶意蠹統(tǒng)一.參考書目:1. «C語言程序設計?作者 張書云 姜淑菊 朱雷P89-P9110 .文件操作以處理1) FILE類型文件:存儲在外部介質上數(shù)據(jù)的集合.聲明 FILE結構體類型的信息須聲明 #inclu<stdio.h>議案不能定義指向FILE類型變量的指針變量FILE *fp ;2) fopen 函數(shù)調(diào)用方式:fopen 文件名,使用文件方式,文件翻開成功那么返回一個FILE 類型指針,否那么返回NULL.表10-1文件翻開方式文件使用方式含義“r'只讀為輸入打將-個文本

44、文件“w只寫為輸出打將個文本文件“a追加向文本文件尾部增加數(shù)據(jù)“rb只讀為輸入打心個二進制文件“wb只寫為輸入打心個二進制文件“ab追力口向二進制文件尾增加數(shù)據(jù)“ r+ 讀寫為讀/寫打心個文本文件“w+讀寫為讀/寫建立一個新的文本文件“a+讀寫為讀/寫打心個文本文件“ rb+ 讀寫為讀/寫打心個二進制文件“wb+"(讀寫)為讀/寫建立一個新的二進制文件“ab+讀寫為讀/寫打心個二進制文件fopen("a1","r");FILE *fp ; fp=fopen("a1","r");將fopen函數(shù)的返回值賦給

45、指針變量fp.常用下面方法翻開一個文件:if(fp=fopen("file1","r")=NULL)(printf("cannot open this filen");exit(0);3) fclose函數(shù)(文件的關閉)關閉fclose(i件指針);當順利關閉文件,那么返回0值,否那么返回EOF(-1).4) fprintf函數(shù)與fscanf函數(shù)fprintf函數(shù)、fscanf函數(shù)與printf函數(shù)、scanf函數(shù)相仿都是格式化讀寫函數(shù). 只有一點不同:fprintf和fscanf函數(shù)的讀寫對象不是終端而是磁盤文件.它們的一 般調(diào)用方

46、式為:fprintf(文件指針,格式化字符串,輸出列表);fscanf(文件指針,格式化字符串,輸入列表);例如:fprintf(fp, " d,%6.2f",I,t);它的作用是將變量i與t的值按與6.2£的格式輸出到fp指向的文件上.用fprintf函數(shù)和fscanf函數(shù)對磁盤文件讀寫,使用方便,容易理解,但由于 在輸入時要將ASCII碼轉換為二進制形式,在輸出時又要講二進制形式轉換成 字符,花費時間較多.因此,在內(nèi)存與磁盤頻繁交換數(shù)據(jù)的情況下,最好不要使 用 fprintf 和 fscanf 函數(shù).5) fread 與 fwrite 函數(shù)ANSI C標準提出

47、設置兩個函數(shù)(fread與fwrite ),用來讀寫一個數(shù)據(jù)塊,它 們的一般調(diào)用形式為fread (buffer, size, count, fp);fwrite (buffer, size, count, fp);其中:buffer:是一個指針.對于fread來說,它是讀入數(shù)據(jù)的存放地址.對 fwrite 來說,是要輸出的數(shù)據(jù)的地址.Size:要讀寫的字節(jié)數(shù).Count:要進行讀寫多少個size字節(jié)的數(shù)據(jù)項.fp:文件型指針.如果fread與fwrite調(diào)用成功,那么函數(shù)返回值為 count的值,即輸入輸出數(shù) 據(jù)項的完整個數(shù).常用fread與fwrite函數(shù)進行文件的讀寫操作例:Uviod

48、Rtade ('IFILE*fp.(fxfcpen期生級工施與方式以=NULL)當文件無法正常翻開也比崛pLeHfeK(fp)/t (f ?)xiMiiSMua 否那么返回零值 typ*XKXX;士5e*R1R工三七沙&*nall口c (eit2of ftypw):f re ad puffer j汽S1而;"勰磁此求聰At如否那么退回零;)1Jelse wIpriirtH"戲翻開文件rO;)JIEivind ¥riteC)FILE*fp:if (or尸寫方式NL=皿)/ (vrhile (buffer(=NULU(f read (buffer,自工

49、 5i工e, 1, fp);)else:(primfC瑙翻開文件g“);11 .冒泡排序與折半排序1冒泡排序冒泡排序Bubble Sort,是一種計算機科學領域的較簡單的排序算法.它 重復地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們 交換過來.走訪數(shù)列的工作是重復地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成.冒泡排序算法的運作如下:從后往前a比較相鄰的元素.如果第一個比第二個大,就交換他們兩個.b對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對.在 這一點,最后的元素應該會是最大的數(shù).c針對所有的元素重復以上的步驟,除了最后一個.d持續(xù)每次對越來越少的元

50、素重復上面的步驟,直到?jīng)]有任何一對數(shù)字需 要比較.實例:#include<stdio.h>#defineSIZE8Void Bubble_Sort(int a,int n);Void Bubble_Sort(int a,int n) /n 為數(shù)組 a 的元素個數(shù) int i,j,temp;for(j=0;j<n -1;j+)for(i=0;i<n -1-j;i+) if(ai>ai+1)數(shù)組元素大小按升序排列 temp=ai;ai=ai+1;ai+1=temp; int main() int i_NumSIZE=95,45,15,78,84,51,24,12;in

51、t i;Bubble_Sort(i_Num,SIZE);for(i=0;i<SIZE;i+) printf("%d", i_Num i); printf("n");2)折半排序折半排序實質上是不斷地對有序數(shù)據(jù)集進行對半分割,并且獲取每個分區(qū)的 中間元素,用中間元素與待排序元素進行比較,最終確定數(shù)據(jù)集順序.折半排序算法思想:折半排序的重點是查找待排序元素Ai在有序數(shù)據(jù)集中的位置.在處理Ai時,A0Ai-1已經(jīng)按關鍵碼值排好序.所謂折半比較, 就是在插入Ai時,取Ai -"2的關鍵碼值與Ai的關鍵碼值進行比較,如果Ai 的關鍵碼值小于Ai-1

52、/2的關鍵碼值,那么說明Ai只能插入A0到Ai-"2之間, 故可以在A0到Ai -1/2-1之間繼續(xù)使用折半比較;否那么只能插入Ai -"2到Ai-1 之間,故可以在Ai-1/2+1到Ai-1之間繼續(xù)使用折半比較.如此重復,直到最 后能夠確定插入的位置為止.算法的根本過程:a)計算0 i-1的中間點,用i索引處的元素與中間值進行比較,如果 i 索引處的元素大,說明要插入的這個元素應該在中間值和剛參加i索引之間,反之,就是在剛開始的位置 到中間值的位置,這樣很簡單的完 成了折半;b)在相應的半個范圍里面找插入的位置時,不斷的用(1)步驟縮小范圍,不停的折半,范圍依次縮小為1/

53、2 1/4 1/8 .快速確實定出第i個元素 要插在什么地方;c)確定位置之后,將整個序列后移,并將元素插入到相應位置;d)對形成的新的有序序列再次進行插入,重復步驟 a), b), c),直到所有 數(shù)據(jù)完成排序.數(shù)組實例:void BisSort(int p_Num,int i_Len)(int i_Left,i_Right,i_Middle;int i_Loop,i_Subloop;int i_Buffer;/ 臨時變量if (p_Num0>p_Num1)(i_Buffer=p_Num0;p_Num0=p_Num1;p_Num1=i_Buffer;for (i_Loop=2;i_Lo

54、op<i_Len;i_Loop+)(i_Left=0;i_Right=i_Loop -1;i_Buffer=p_Numi_Loop;if (i_Buffer<=p_Num0|i_Buffer>=p_Numi_Right)(if (i_Buffer<=p_Num0)i_Middle=0;elsei_Middle=i_Right+1;elsewhile(i_Left<=i_Right)(i_Middle=(i_Left+i_Right)/2;/ 折半中數(shù)if(i_Buffer>=p_Numi_Middle)i_Left=i_Middle+1;elsei_Righ

55、t=i_Middle -1;確定要插入的位置for (i_Subloop=i_Loop;i_Subloop>i_Middle;i_Sub100P -)/生成新的有序數(shù)組(p_Numi_Subloop=p_Numi_Subloop -1;p_Numi_Midd1e=i_Buffer;)鏈表實例:struct _Road* RoadOrder(struct _Road *pst_Road )(struct _Road *pst_Road_Head;pst_Road_Head=pst_Road;struct _Road *p_Low,*p_Hight,*p_Mid,*p_Current;p_L

56、ow=pst_Road;p_Hight=pst_Road ->pst_Next;int i_Low,i_Hight,i_Mid;/ 中數(shù)int i_Len=RoadListLength(pst_Road);if (pst_Road_Head->i_GeoLength>p_Hight ->i_GeoLength)(pst_Road_Head->pst_Next=p_Hight ->pst_Next;p_Hight->pst_Next=pst_Road_Head;pst_Road_Head=p_Hight;)for (int i=3;i<=i_Len;i+)(p_Low=p_Mid=p_Hight=pst_Road_Head;i_Low=1,i_Hight=i -1;for(int j=1;j<i -1;j+)(p_Hight=p_Hight ->pst_Next;)p_Current=p_Hight ->pst_Nex

溫馨提示

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

評論

0/150

提交評論