C語言難點及分析_第1頁
C語言難點及分析_第2頁
C語言難點及分析_第3頁
C語言難點及分析_第4頁
C語言難點及分析_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C語言難點分析整理!轉(zhuǎn)貼這篇文章主要是介紹一些在復習C語言的過程中筆者個人認為比較重點的地方,較好的學握這 些車點會使對C的運用更加得心應手。此外會包括一些細節(jié)、易錯的地方。涉及的主婆內(nèi)容包 括:變量的作用域和存儲類別、函數(shù)、數(shù)組、字符串、指針、文件、鏈表等。一些最基本的概念 此就不多作解釋了,僅希琨能有只吉片語給同是C語言初學者的學習和上機過用提供一點點 的幫助。變量作用域和存儲類別:局部變量前態(tài)變雖:(離開函數(shù),變雖:值仍保留)門動變量寄存器變量全局變就靜態(tài)變量(只能任本文件中用)非靜態(tài)變鼠(允許其他文件使用)靜態(tài)存儲變量靜態(tài)局部變量(函數(shù))形式參數(shù)靜態(tài)全局變戢(本文件)非靜態(tài)全周/外部變

2、屋(其他文件引用)動態(tài)存儲變量口動變星寄1?器變雖extern熨的儲變最在處理多文件問題時常能用到,在一個文件中定義extern 型的變量即說明這個變最用的是其他文件的。順便說一下,筆者在做課設(shè)時遇到 out of memory的錯謀,丁足改成做多文件,再把它include進來(注總I己寫 的th雯用“”不用),能起到一定的效用。static型的在讀程序'弓結(jié)果的試題 中是個考點。多數(shù)時候整個程序會出現(xiàn)多個定義的變暈在不同的函數(shù)中,考査在 不同位置同一變最的值是多少。主要是遵循一個原則,只耍木函數(shù)內(nèi)沒有定義的 變葩就用全周變M:(而不是main電的),全局變最和局部變戢重名時局部變最

3、起作用,當然還耍注意靜態(tài)與門動變彊的區(qū)別。函數(shù):對于函數(shù)最基木的理解是從那個叫main的單詞開始的,一開始總會覺得把語句 一并寫Amain里不是挺好的么,為什么偏擇出去。其實這是因為對函數(shù)還不夠 熟練,否則函數(shù)的運用會給我們編程帶來極大的便利。我們農(nóng)知道函數(shù)的返冋值 類型,參數(shù)的類熨,以及調(diào)用換數(shù)時的形式。爭先的西數(shù)說明也能起到一個提醍的好作用。所謂形參和實參,即在調(diào)用函數(shù)時嗎在括號里的就是實參,函數(shù)本身 用的就是形參,在価流程圖時用平行四邊形表小傳參。函數(shù)的另一個應用例子就是遞川了,筆者開始比較頭疼的問題,反應總是比較遲 鈍,按照老師的方法,把遞曠I的過程耐心準確的逐級畫出來,學習的效果還是

4、比 較好的,會覺得這種遞歸的運用是挺巧的,事實上,著名的八皐后、漢諾塔等問 題都用到了遞歸。例子:long fun(int n)long s;if(n=1|n=2) s=2;else s=n-fun(n-1);return s;main()printf(w%ldMtfun(4);數(shù)組:分為一維數(shù)組和多維數(shù)組,其“儲方式畫為表格的話就會一目了然,其實就是把 相同類熨的變最有序的放在一起。因此,在處理比較多的數(shù)據(jù)時(這也是大多數(shù) 的情況)數(shù)組的應用范嗣是非常廣的。具體的實際應用不便舉例,而且絕大多數(shù)是與指針相結(jié)介的,筆者個人認為學習 數(shù)組在更大程度上是為學習指針做一個鋪恨 作為基礎(chǔ)的棊礎(chǔ)要明片兒種

5、基本操 作:即數(shù)組賦值、打印、排序(冒泡排序法和選擇排序法)、査找。這些都不可 避免的用到循環(huán),如果覺得反應不過來,可以先一點點的把循環(huán)展開,就會越來 越熟悉,以后自己編寫一個功能的時候就會先找出內(nèi)在規(guī)律,較好的運用了。另 外數(shù)組做參數(shù)時,一維的Q里可以是空的,二維的第一個里可以是空的但是第 二個Q中必須規(guī)定大小。旨泡法排序函數(shù):void bubble(int aQjnt n)int IJ,k;for(i=1,i<n;i+)for(j=0;j<rH;j+)if(aQ>aO+1)k=aj;aD=afi+1;a0+1)=k;選卄法代序函數(shù):void sortfint a,int

6、n)int i,j,k,t;for(i=0,i<n-1 ;i+)k=i;for(j=k1;j<n;j+)if(a【k<aO) k=j;if(k!=i)ai=a(kj;ak=t;折半査找函數(shù)(原數(shù)組有序):void search(int aQ.int x)int left=O,right=n-1 .mid.flag-O;while(flag=O)&&(left<=right)mid=(left*right)/2;if(x=amid)printf(M%d%dx.mid);flag =1;else if(x<amid) right=mid1;

7、else left=mid+1;相關(guān)常用的算法還有判斷回文,求階乘,F(xiàn)ibanacci數(shù)列,任意進制轉(zhuǎn)換,楊輝 三角形計算答等。字符串:字符串其實就是一個數(shù)組(指針),在scant的輸入列中是不需更在前而加“&” 符號的,因為字符數(shù)組劣本身即代表地址。值得注意的是字符串末尾的'0',如 果沒有的話,字符串很有可能會不正常的打卬。另外就是字符串的定義和賦值問 題了,筆者有一次的比較綜合的上機作業(yè)就是字符串打印老是亂碼,上上下下找 了一圈問題,瑕后發(fā)現(xiàn)是因為char 5ame;而不是char name(10);前者沒有說明指向哪兒,更沒有確定大小,導致了亂碼的錯誤,印象挺深

8、刻的。另外,字符吊的賦值也是需耍注意的,如果是用字符指針的話,既可以定義的時候賦初值,即char 怡二"Abcdefg"也可以在賦值語句中賦值,即char ea;a=MAbcdefgH;但如果是用字符數(shù)組的話,就只能在定義時整體賦初值,即char a二“abed”; 而不能在賦值語句屮整體賦值。常用字符串函數(shù)列表如下,耍會門己實現(xiàn):字符串拷貝函數(shù)strcpy(char*,char *)后者拷貝到前者字符串追加西數(shù)strcat(char*,char *)后者追加到前者屁 返冋前者.因此前者空間要足夠大字符串比較函數(shù)strcmp(charchar *)詢者等于、小丁 =人于后者

9、時.返回0、止值、負值。注總,不是比較長度是比較字符ASCII碼的大小,可用于按姓名字母排序等。字符串長度strlen(char )返回字符串的長度,不包括2轉(zhuǎn)義字符算一字符串型整吃atoi(char *)整申"字符串空itoa(int,char int)做課設(shè)時挺有用的sprintf(char 化輸賦給字符串,而不打印出來。課設(shè)時用也比入)較方便注:對字符巾是不允許做=或!二的運算的,只能用字符串比較函數(shù)指針:指針可以說是C語言中最關(guān)鍵的地方其實這個“指針”的名字對于這個概念的 理解是十分形彖的。首先要知道,指針變量的值(即指針變量中存放的值)是指 針(即地址)。指針變量定義形式中

10、:基本類型少指針變最名中的“"代表的是這是一個指向該基木類型的指針變量,而不是內(nèi)容的意思。在以后使用的時候,ill*ptr=a時,從”才表示ptr所指向的地址甲.放的內(nèi)容是a。指針比較典型乂簡單的一應用例子是兩數(shù)互換,看下面的程序,swap(int c,int d)int t;main()int a=2,b=3;swap(a,b);printfr%d.%d".a,b);這是不能實現(xiàn)m和b的數(shù)值斤換的,實際I:只是形參右:這個函數(shù)中換來換公,對實參沒什么影響?,F(xiàn)在,用指針類型的數(shù)據(jù)做為參數(shù)的話,更改如下:swap(#3333FF *p1,int *p2)int t;t=*p1

11、;*p1=*p2;#p2=t;main()int a=2,b=3;int eptr1,*ptr2;ptr1=&a;ptr2=&b;swap(prt1.ptr2);printfdd:a,b);這樣在swap中就把p1,p2的內(nèi)容給換了,即把a, b的值互換了。指針可以執(zhí)行增、減運算,結(jié)介+運算符的法則,我們可以看到:指針和數(shù)組實際上兒乎是一樣的,數(shù)組名可以看成是一個常最指針,一維數(shù)組中 ptr=&bO則K面的表示法是等價的:a3等價于(a+3)ptr3等價于 *(ptr+3)下而看一個用指針來I'l己實現(xiàn)atoi (字符串型亠整型)函數(shù):int atoi(char

12、 *s)int sign=1,m=0;/*判斷是否有符號*sign=Cs+*=,+l)?1 :-1;廣川到三 II運算符/whiles!JO)廠對毎一個7符進行操作m=mM0*Cs-,0,);sr廣指向下一個字符/return m*sign;指向多維數(shù)組的指針變最也是一個比較廣泛的運用。例如數(shù)組a34, a代表的 實際是整個二維數(shù)紐的首地11卜,即第0行的首地址,也就是一個指針變量。而m +1就不是簡單的在數(shù)值上加上1 了,它代表的不是a01,而是第1行的首地 址,&a10o指針變応常用的用途還有把指針作為參數(shù)傳遞給其他函數(shù),即指向函數(shù)的指針??聪旅娴膬盒写a:void lnput(S

13、T );void Output(ST *);void Bubble(ST );void Find(ST *);void Failure(ST *);廣函數(shù)聲明:這五個函數(shù)都是以一個指向ST型(事先定義過)結(jié)構(gòu)的指針變量作為參數(shù),無返回值。7void (*process5)(ST Input.Output.Bubble.Find.Failure;fprocess被調(diào)用時提供5種功能不同的旳數(shù)共選擇(指向醺數(shù)的指針數(shù)纟|) /printf(MnChoose:n?M);scanf(H%dM,&choice);if(chcice>=0&&choice<=4)(*pr

14、ocesschoice)(a); /*調(diào)用相應的臥數(shù)實現(xiàn)不同功能;/總之,指針的應用是非常靈活和廣泛的,不是三言兩語能說完的,上面兒個小例 子只是個引子,實際編程中,會逐漸發(fā)現(xiàn)運用指針所能帶來的便利和尚效率。文件:函數(shù)調(diào)用形式說明fopen(M路徑”打開方式”)打開文件fclose(FILE *)防止之后被謀用fgetc(FILE *)從文件中讀取一個字符fputc(ch,FILE *)把ch代表的字符寫入這個文件里fgets(FILE *)從文件中讀取一行fputs(FILE *)把一行寫入文件中fprintf(FILE ,”格式字符串",輸出表列)把數(shù)據(jù)寫入文件fscanf(FI

15、LE T格式字符串”,輸入表列)從文件中讀取fwrite (地址,sizeof () , n» FILE*)把地址中n個sizeof大的數(shù)據(jù)寫入文件里fread (地址,sizeof () , n, FILE*)把文件中n個sizeof大的數(shù)據(jù)讀到地址里rewind (FILE *)把文件指針撥回到文件頭fseek (FILE *, x, 0/1/2)移動文件指針.第二個參數(shù)是位移星,0代表從頭移,1代表從當前位魚移,2代表從文件尾移。feof(FILE *)判斷是否到了文件末用注:以上用丁文本文件的操作,如果足二進制文件就在上述字母后加“b”。我們用文件最大的目的就是能讓數(shù)據(jù)保心下

16、來。因此在耍用文件中數(shù)據(jù)的時候, 就是要把數(shù)據(jù)讀到一個結(jié)構(gòu)(一般保存數(shù)據(jù)多用結(jié)構(gòu),便r管理)中去,再對結(jié) 構(gòu)進行操作即可。例如,文件aa.data中存儲的是30個學生的成績等信息,耍 遍歷這些信息,對其進行成績輸出、排序、査找等匸作時,我們就把這些信息先 讀入到一個結(jié)構(gòu)數(shù)組中,再對這個數(shù)組進行操作。如下例:#in clude<stdio.h>#include<stdlib.h>#define N 30typedef struct student /*定義儲存學工成績信息的ftffl*/char Fame;int chinese;int maths;int phy;int

17、 total;ST;main()ST a(N); r存儲N個學生伯息的數(shù)組/FILE *fp;void (-process)(ST 戶Output,Bubble,Find; /*實現(xiàn)相關(guān)功能的三個函數(shù)/ int choice,i=0;Show();printf(MnChoose:n?M);scanf(H%(Tv&choice);while(choice>=0&&choice<=2)fp=fopen(Maa.dar.e,rbH);for(i=0;i<N;i+)fread(&ai,sizeof(ST),1,fp); r把文件中儲存的信息逐個讀到MI

18、'Pfdose(fp);(*processchoice)(a); /*諭面提到的指向因數(shù)的折針,選擇操作/ printf(W);Show();printf(An?H);scanf(M%d&choice);void Show()printf(Hn*w*Choices:*nO.Display the data formn1.Bubble it according to the total scoren2.Searchn3 QuitH);void Output(ST *a)廣將文件中存儲的信息逐個輸出/int i.t=0;printf(MName Chinese Maths Phys

19、ics TotalVrT);fbr(i=0;i<N;i+)t=ai.chinese*ai.maths*ai.phy;ai.total=t;printf(M%4s%8d%8d%8d%8dnM,,ai.chinese,ai.maths>a(i.phy,ai.total);void Bubble(ST *a)廠對數(shù)組進疔排序,并輸出結(jié)果/int i.pass;ST m;for(pass=0;pass<N-1 ;pass*)for(i=0;i<N-1;H+)if(ai.total<ai*1.total)m=ai;廠結(jié)構(gòu)互換/ai+1=m;Output(a);

20、void Find(ST ea)int i,t=1;char m20;printf(MnEnter the name you want:*);scanfor(i=0;i<N;i+)if(!strcmp(m,) /根據(jù)姓名匹配怙況輸出査找結(jié)果/printfCAnThe result is:n%s, Chinese:%d, Maths:%d, Physics:%d,Total:%dn".m.ai.chinese,ai.maths,ai.phy,ai.total);t=0:if(t)printf("nThe name is not in the list!n&

21、quot;);鏈表:鏈表是C語言中另外一個難點。牽扯到結(jié)點、動態(tài)分配空間等等。用結(jié)構(gòu)作為鏈表的結(jié)點是非常適合的,例如:struct nodeint data;struct node 'next;英中next是指向Fl身所在結(jié)構(gòu)類型的指針,這樣就可以把一個個結(jié)點相連,構(gòu) 成鏈表。鏈表結(jié)構(gòu)的一大優(yōu)勢就是動態(tài)分配存儲,不會像數(shù)組一樣必須在定義時確定大 小,造成不必耍的浪費。用malloc和free函數(shù)即可實現(xiàn)開辟和釋放儲單元。 其中,malloc的參數(shù)多用sizeof運算符計算得到。鏈表的皋本操作仃:正、反向建立鏈表;輸出鏈表;刪除鏈表中結(jié)點;在鏈表中插入結(jié)點等等,都是要熟練學握的,初學者通

22、過畫圖的方式能比較形象地理解建 立、插入等實現(xiàn)的過程。typedef struct nodechar data;struct node Fext;NODE;廣結(jié)點/正向建立鏈表:NODE wcreate()char ch=*a*;NODE ep?h=NULL?q=NULL;while(ch<'z*)p=(NODE *)malloc(sizeof(NODE); /鎖制類型轉(zhuǎn)換為折針*/p->data=ch;if(h=NULL) h=p;else q->next=p;ch*;q=p;q->next=NULL;廣鏈表結(jié)束+ return h;逆向建立:NODE *create()char ch=*a*;NODE *p?h=NULL;while(ch<='z*)p=(NODE *)malloc(sizeof(NODE); p->

溫馨提示

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

評論

0/150

提交評論