




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C語言難點分析整理這篇文章主要是介紹一些在復(fù)習(xí)C語言的過程中筆者個人認為比較重點的地方,較好的掌握這些重點會使對C的運用更加得心應(yīng)手。此外會包括一些細節(jié)、易錯的地方。涉及的主要內(nèi)容包括: 變量的作用 域和存儲類別、函數(shù)、數(shù)組、字符串、指針、文件、鏈表等。一些最基本的概念在 此就不多作解釋了,僅希望能有只言片語給同是C語言初學(xué)者的學(xué)習(xí)和上機過程提供一點點的幫助。E靜態(tài)變量(允許其他文件使用)變量作用域和存儲類別:了解了基本的變量類型后,我們要進一步了解它的存儲類別和變量作用域問題。自動變量 寄存器變量換一個角度extern型的存儲變量在處理多文件問題時常能用到,在一個文件中定義extern型的變
2、量即說明這個變量用的是其他文件的。順便說一下,筆者在做課設(shè)時遇到out of memory的錯誤,于是改成做多文件,再把它 in elude進來(注意自己 寫的*.h要用“”不用 <>),能起到一定的效用。static 型的在讀程序?qū)懡Y(jié)果 的試題中是個考點。多數(shù)時候整個程序會出現(xiàn)多個定義的變量在不同的函數(shù)中, 考查在不同位置同一變量的值是多少。主要是遵循一個原則,只要本函數(shù)內(nèi)沒有定義的變量就用全局變量(而不是 main里的),全局變量和局部變量重名時 局部變量起作用,當(dāng)然還要注意靜態(tài)與自動變量的區(qū)別。函數(shù):對于函數(shù)最基本的理解是從那個叫 main的單詞開始的,一開始總會覺得把語句
3、一并寫在main里不是挺好的么,為什么偏擇出去。其實這是因為對函數(shù)還不夠 熟練,否則函數(shù)的運用會給我們編程帶來極大的便利。我們要知道函數(shù)的返回值類型,參數(shù)的類型,以及調(diào)用函數(shù)時的形式。事先的函數(shù)說明也能起到一個提醒 的好 作用。所謂形參和實參,即在調(diào)用函數(shù)時寫在括號里的就是實參,函數(shù)本 身用的就是形參,在畫流程圖時用平行四邊形表示傳參。函數(shù)的另一個應(yīng)用例子就是遞歸了, 筆者開始比較頭疼的問題,反應(yīng)總是比較遲鈍,按照老師的方法,把遞歸的過程耐心準確的逐級畫出來,學(xué)習(xí)的效果還是比較好的,會覺得這種遞歸的運用是挺巧的,事實上,著名的八皇后、漢諾塔等問 題都用到了遞歸。例子:long fun( int
4、 n)long s;if (n=1|n=2) s=2;else s=n-fun(n-1);return s;mai n()printf(" %ld",fu n);結(jié)果呈3T返回1TVs=£返回2數(shù)組:分為一維數(shù)組和多維數(shù)組,其存儲方式畫為表格的話就會一目了然, 其實就是把 相同類型的變量有序的放在一起。因此, 在處理比較多的數(shù)據(jù)時(這也是大多數(shù) 的情況)數(shù)組的應(yīng)用范圍是非常廣的。具體的實際應(yīng)用不便舉例,而且絕大多數(shù)是與指針相結(jié)合的,筆者個人認為學(xué)習(xí) 數(shù)組在更大程度上是為學(xué)習(xí)指針做一個鋪墊。作為基礎(chǔ)的基礎(chǔ)要明白幾種基本操作:即數(shù)組賦值、打印、排序(冒泡排序法和選擇排
5、序法)、查找。這些都不 可避免的用到循環(huán),如果覺得反應(yīng)不過來,可以先一點點的把循環(huán)展開,就會越來越熟悉,以后自己編寫一個功能的時候就會先找出內(nèi)在規(guī)律,較好的運用了。另外數(shù)組做參數(shù)時,一維的里可以是空的,二維的第一個里可以是空的但是 第二個中必須規(guī)定大小。冒泡法排序函數(shù):void bubble( int a, int n)int i,j,k;for (i=1,i<n;i+)for (j=0;j<n-i-1;j+)if (aj>aj+1)k=aj;aj=aj+1; aj+1=k; 選擇法排序函數(shù):void sort( int a, int n)int i,j,k,t;for (i
6、=0,i<n-1;i+)k=i;for (j=i+1;j<n;j+)ifif(ak<aj) k=j; (k!=i) t=a; a=ak; ak=t; 折半查找函數(shù) void search( int left=0,right=n-1,mid,flag=0; while (flag=0)&&(left<=right)mid=(left+right)/2;if (x=amid) printf(" flag =1;else if原數(shù)組有序):int a, int n, int x)%d%"d,x,mid);(x<amid) right=
7、mid-1;else left=mid+1;相關(guān)常用的算法還有 三角形計算 等等 。 字符串:判斷回文,求階乘, Fibanacci 數(shù)列,任意進制轉(zhuǎn)換,楊輝字符串其實就是一個數(shù)組(指針),在scanf的輸入列中是不需要在前面加“ & 符號的,因為字符數(shù)組名本身即代表地址。值得注意的是字符串末尾的,如果沒有的話,字符串很有可能會不正常的打印。另外就是字符串的定義和賦值 問題了,筆者有一次的比較綜合的上機作業(yè)就是字符串打印老是亂碼,上上下下找了一圈問題,最后發(fā)現(xiàn)是因為char *n ame;而不是char n ame10;前者沒有說明指向哪兒,更沒有確定大小,導(dǎo)致了亂碼的錯誤,印象挺深刻
8、的。 另外,字符串的賦值也是需要注意的,如果是用字符指針的話,既可以定義的時候賦初值,即char *a="Abcdefg"也可以在賦值語句中賦值,即char *a;a="Abcdefg"但如果是用字符數(shù)組的話,就只能在定義時整體賦初值,即char a5="abcd" 而不能在賦值語句中整體賦值。常用字符串函數(shù)列表如下,要會自己實現(xiàn):注:對字符串是不允許做= 或!=的運算的,只能用字符串比較函數(shù)指針:指針可以說是C語言中最關(guān)鍵的地方了,其實這個“指針”的名字對于這個概念 的理解是十分形象的。首先要知道,指針變量的值(即指針變量中存放的值
9、)是 指針(即地址)。指針變量定義形式中:基本類型 *指針變量名 中的“ * ”代 表的是這是一個指向該基本類型的指針變量,而不是內(nèi)容的意思。在以后使用的時候,如*ptr=a時,“*”才表示ptr所指向的地址里放的內(nèi) 容是a。 指針比較典型又簡單的一應(yīng)用例子是兩數(shù)互換,看下面的程序,swap(int c, int d)int t;t=c;c=d;d=t;mai n()int a=2,b=3;swap( a,b);printf( “d,%d ,a,b);這是不能實現(xiàn)a和b的數(shù)值互換的,實際上只是形參在這個函數(shù)中換來換去,對實參沒什么影響?,F(xiàn)在,用指針類型的數(shù)據(jù)做為參數(shù)的話,更改如下:swap(#
10、3333FF *p 1, int *p2)int t;t=*p1;*p 1=* p2;*p 2=t;mai n()int a=2,b=3;int *ptr1,*ptr2;p tr1= &a;ptr2=&b;swap(p rt1, ptr2);printf( “%d,%d ,a,b); 這樣在swap中就把p1,p2的內(nèi)容給換了,即把a, b的值互換了。 指針可以執(zhí)行增、減運算,結(jié)合+運算符的法則,我們可以看到:*+s*s+ (*s)+取指針變量加1以后的內(nèi)容 取指針變量所指內(nèi)容后s再加1指針變量指的內(nèi)容加1 指針和數(shù)組實際上幾乎是一樣的,數(shù)組名可以看成是一個常量指針,一維數(shù)組中
11、 ptr=&b0則下面的表示法是等價的:a3等價于 *(a+3)ptr3等價于 *(p tr+3)下面看一個用指針來自己實現(xiàn) atoi (字符串型->整型)函數(shù):int atoi( char *s)int sign=1,m=0;if (*s='+'|*s='-')/* 判斷是否有符號 */sign=(*s+='+')?1:-1;/* 用到三目運算符 */while (*s匸”)/*對每一個字符進行操作*/m=m*10+(*s-'0');s+; /*指向下一個字符*/return m*sign;指向多維數(shù)組的指針變量也
12、是一個比較廣泛的運用。例如數(shù)組a34 ,a代表的實際是整個二維數(shù)組的首地址,即第0行的首地址,也就是一個指針變量。而a+1就不是簡單的在數(shù)值上加上1 了,它代表的不是a01,而是第1行的首 地址,&a10。指針變量常用的用途還有把指針作為參數(shù)傳遞給其他函數(shù),即指向函數(shù)的指針??聪旅娴膸仔写a:Inp ut(ST *); Out put(ST *); Bubble(ST *);Fin d(ST *); Failure(ST *);voidvoidvoidvoidvoid/*函數(shù)聲明:這五個函數(shù)都是以一個指向ST型(事先定義過)結(jié)構(gòu)的指針變量作為參數(shù),無返回值。*/ void (*p ro
13、cess5)(ST *)= Inp ut,Out pu t,Bubble,Fi nd,Failure;/*process被調(diào)用時提供5種功能不同的函數(shù)共選擇(指向函數(shù)的指針數(shù)組)*/ printf( "nChoose:n?");scanf( "%d",&choice);if (choice>=0&&choice<=4)(*processchoice)(a);/*調(diào)用相應(yīng)的函數(shù)實現(xiàn)不同功能*;/總之,指針的應(yīng)用是非常靈活和廣泛的,不是三言兩語能說完的,上面幾個小例子只是個引子,實際編程中,會逐漸發(fā)現(xiàn)運用指針?biāo)軒淼谋憷?/p>
14、和高效率。文件:函數(shù)調(diào)用形式說明fopen("路徑","打開方式") 打開文件 fclose(FILE *)防止之后被誤用fgetc(FILE *)從文件中讀取一個字符Fputc(ch,FILE *)fgets(FILE *)fputs(FILE *)fprin tf(FILE *,"格式字符串",輸出表列)fscanf(FILE *,"格式字符串",輸入表列)fwrite (地址,sizeof (),n,F(xiàn)ILE *)fread (地址,sizeof (), n,F(xiàn)ILE *)ewind (FILE * )把ch
15、代表的字符寫入這個文件里 從文件中讀取一行把一行寫入文件中把數(shù)據(jù)寫入文件從文件中讀取把地址中n個sizeof大的數(shù)據(jù)寫入文件里把文件中n個sizeof大的數(shù)據(jù)讀到地址里fseek (FILE *feof(FILE *)把文件指針撥回到文件頭) 移動文件指針。第二個參數(shù)是位移量,0代表從 ,X,) 頭移,1代表從當(dāng)前位置移,2代表從文件尾移。判斷是否到了文件末尾文件打開方式a”+w+a+說明打開只能讀的文件建立供寫入的文件,如果已存在就抹去原有數(shù)據(jù)打開或建立一個把數(shù)據(jù)追加到文件尾的文件 打開用于更新數(shù)據(jù)的文件建立用于更新數(shù)據(jù)的文件,如果已存在就抹去原有數(shù)據(jù) 打開或建立用于更新數(shù)據(jù)的文件,數(shù)據(jù)追加
16、到文件尾注:以上用于文本文件的操作,如果是二進制文件就在上述字母后加“b”。我們用文件最大的目的就是能讓數(shù)據(jù)保存下來。因此在要用文件中數(shù)據(jù)的時候, 就是要把數(shù)據(jù)讀到一個結(jié)構(gòu)(一般保存數(shù)據(jù)多用結(jié)構(gòu),便于管理)中去,再對結(jié) 構(gòu)進 行操作即可。例如,文件aa.data中存儲的是30個學(xué)生的成績等信息,要 遍歷這些信息,對其進行成績輸出、排序、查找等工作時,我們就把這些信息先 讀入到一個結(jié)構(gòu)數(shù)組中,再對這個數(shù)組進行操作。如下例:#include <stdio.h>#include <stdlib.h>#define N 30 typedef structstudent /*定義
17、儲存學(xué)生成績信息的數(shù)組*/char *n ame;chi nese;maths;phy;int int int int ST mai n() ST aN ; /*存儲N個學(xué)生信息的數(shù)組*/total;FILE *fp ;/* 實現(xiàn)相關(guān)功能的三個函void (*process3)(ST *)=Output,Bubble,Find; 數(shù)*/ int choice,i=0;Show();printf( "nChoose:n?" ); scanf( "%d",&choice);while (choice>=0&&choice<
18、=2)fp=fopen( "aa.dat" ,"rb" );for (i=0;i<N;i+)fread(&a, sizeof (ST),1,fp); /* 把文件中儲存的信息逐個讀到數(shù)組中去*/* 前面提到的指向函數(shù)的指針,選擇操作 */fclose(fp); (*processchoice)(a); printf( "n" );Show();printf( "n?" ); scanf( "%d",&choice); Show()voidprintf( "n*Ch
19、oices:*n0.Display the data formn1.Bubble it according to the total scoren2.Searchn3.Quit!n" );void Output(ST *a) /* 將文件中存儲的信息逐個輸出 */int i,t=0;printf( "Name Chinese Maths Physics Totaln" );for(i=0;i<N;i+)t=a.chinese+a.maths+a.phy; a.total=t;printf( "%4s%8d%8d%8d%8d,an."nam
20、e,a.chinese,a.maths,a.phy,a.tota l);Bubble(ST *a) /* 對數(shù)組進行排序,并輸出結(jié)果 */voidint i,pass; ST m;for (pass=0;pass<N-1;pass+)for (i=0;i<N-1;i+)if (a.total<ai+1.total)m=a; /* 結(jié)構(gòu)互換 */ a=ai+1; ai+1=m;Output(a);void Find(ST *a)int i,t=1; char m20; printf( "nEnter the name you want:" ); scanf(
21、 "%s",m);for (i=0;i<N;i+)"nThe result is:n%s, Chinese:%d,Physics:%d,Total:%dn" ,m,a.chinese,a.maths,a.phy,a.if (!strcmp(m,) /* 根據(jù)姓名匹配情況輸出查找結(jié)果 */ printf(Maths:%d, total);t=0;if (t);"nThe name is not in the list!n"printf(鏈表:鏈表是c語言中另外一個難點。牽扯到結(jié)點、動態(tài)分配空間等等。用結(jié)構(gòu)作為鏈 表的結(jié)
22、點是非常適合的,例如:struct nodeint data;struct node *next;其中 next 是指向自身所在結(jié)構(gòu)類型的指針,這樣就可以把一個個結(jié)點相連,構(gòu) 成鏈表。鏈表結(jié)構(gòu)的一大優(yōu)勢就是動態(tài)分配存儲,不會像數(shù)組一樣必須在定義時確定大 小,造成不必要的浪費。用 malloc 和 free 函數(shù)即可實現(xiàn)開辟和釋放存儲單元。 其中, malloc 的參數(shù)多用 sizeof 運算符計算得到。鏈表的基本操作有: 正、反向建立鏈表;輸出鏈表;刪除鏈表中結(jié)點;在鏈表中 插入結(jié)點 等等,都是要熟練掌握的, 初學(xué)者通過 畫圖 的方式能比較形象地理解建 立、插入等實現(xiàn)的過程。typedef s
23、truct nodechar data; struct node *n ext;NODE; /* 結(jié)點 */正向建立鏈表:NODE *create()char ch= 'a'NODE *p ,*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;1逆向建立:NODE *create()char ch= 'a'NODE *p ,*h=NULL;while (ch<='z')p=(NODE *)malloc( sizeof (NODE);p->data=ch;p->next=h; /*不斷地把head往前挪*/ h=p;ch+; return h;用遞歸實現(xià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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 特價房買賣合同模板
- 會議音響租賃合同
- 食品供應(yīng)鏈服務(wù)合同范文
- 搪瓷化工容器的安全標(biāo)準考核試卷
- 戶外帳篷批發(fā)考核試卷
- 助動車行車記錄儀使用與維護考核試卷
- 摩托車ABS系統(tǒng)傳感器檢測考核試卷
- 工業(yè)機器人的智能電源管理考核試卷
- 體育運動心理承受能力測試考核試卷
- 家裝整裝合同范本
- 新版人教版七年級下冊數(shù)學(xué)全冊教案教學(xué)設(shè)計含教學(xué)反思
- 《中國古代寓言》導(dǎo)讀(課件)2023-2024學(xué)年統(tǒng)編版語文三年級下冊
- 硬筆書法全冊教案共20課時
- 中醫(yī)針灸治療肋間神經(jīng)痛病案分析專題報告
- 防止化學(xué)污染管理制度
- 小學(xué)夢想開《去遠方》教學(xué)設(shè)計
- Q∕SY 06349-2019 油氣輸送管道線路工程施工技術(shù)規(guī)范
- CEO自戀及其經(jīng)濟后果研究:以格力電器為例
- 六鑫伺服刀塔說明書LS系列
- 19.骨折術(shù)后內(nèi)固定取出臨床路徑
- 腎內(nèi)科臨床診療規(guī)范(南方醫(yī)院)
評論
0/150
提交評論