c学习篇.docx
《c学习篇.docx》由会员分享,可在线阅读,更多相关《c学习篇.docx(115页珍藏版)》请在冰豆网上搜索。
c学习篇
C語言學習教程
多數情況下,現下的編程高手都是從學習C
語言入門的,在學校裡,計算機相關專業中最基礎的課程也包括C
語言,因此,掌握好這門課程對每一位立志成為優秀程式員的初學人來說是大有裨益的﹗另外,對想透過參加全國計算機等級考試獲得證書的同學來說,學好C
語言也非常關鍵。
下面,是我整理出來的若干文章,總體上按照三個大的方向進行分類,希望能好好閱讀,相信對你是很有幫助的﹗
一、基礎性問題(點擊下面文字鏈接即可打開頁面)
1、C語言學習︰如何由dos向windows轉變
2、二級C語言實例解答
3、等級考試︰C程式設計
4、備戰C語言上機考試
5、C語言程式設計技巧
6、C語言初級講座
7、寫好C程式的10條秘籍
8、強大的語言──C入門之一
9、強大的語言──C入門之二
二、實例開發(點擊下面文字鏈接即可打開頁面)
1、用C語言解決鬼谷算題
2、用C語言實現的鬧鐘程式
3、C程式開發經典實例之一
4、C程式開發經典實例之二
5、C程式開發經典實例之三
6、C程式開發經典實例之四
7、C程式開發經典實例之五
8、C程式開發經典實例之六
9、C程式開發經典實例之七
10、C程式開發經典實例之八
三、綜合提升(點擊下面文字鏈接即可打開頁面)
1、C語言︰黑客學員必修課之一
2、C語言︰黑客學員必修課之二
3、C程式設計基礎之一
4、C程式設計基礎之二
5、C程式設計基礎之三
6、C程式設計基礎之四
7、C程式設計基礎之五
8、C程式設計基礎之六
9、C語言高效編程的的四大絕招
(1)
10、C語言高效編程的的四大絕招
(2)
C語言學習︰如何由dos向windows轉變
很多人學C語言很長一段時間了,還不知C究竟能幹什麼,以為學習c語言沒什麼用,純粹是為了應付學校的考試.更有人說"學C語言?
別做如此愚蠢的行為了!
趕快學C++吧!
"這種看法是不對的,不應該把c跟c++之間劃起絕對的界限,過分看重c++而把c貶得一無是處,這是很片面的.C++功能雖然強大,但它畢竟是c的"超集",在c++裡有哪一處找不到c的影子呢?
沒有c的支持,c++只能是無本之木。
一般情況下,c++編程模式編寫的程式源代碼量小,但編譯后的代碼量較大,營運的速度略低,不過開發時的工作量和工作難度較小;而c編程模式編寫的源代碼量較大,但可執行的效率高.如果一些對速度要求高,尤其是對硬體操作較多的程式,大多數還是用c編程模式開發的(用C又比用彙編簡單,易于實現).另外,學Win32
C程式設計還有助于更深入地了解Windows的內幕和Win32API。
任何的編程語言都是一種工具,學習語言的目是要使用它來編寫出實際需要的軟體來,而軟體作為一個用戶程式,營運時要倚賴作業系統,大多數人使用什麼作業系統,我們就要編寫出基于哪一種平台上的程式來.這樣,軟體才會有更大的市場。
現下市面上出現的有關c語言方面的書大多是教授DOS下的c,上機實習也是在Turbo
C2.0(簡稱Tc)環境下轉來轉去.編程環境的單調總使人感到不爽.這也沒辦法,dos
下的c是最簡單的,初學人當然要從最簡單的入門啦.連比較有名的計算機專家譚浩強編的書也都是贊成從dos下的c學起的.再說,一個剛剛入門的人想在windows
這樣的多進程,多線程的作業系統下用c編程,那似乎又不太現實.(那要了解在windows下,一個win32程式大體上是怎樣執行的.要對系統有比較多的了解才行,一個初學人暫時還不具備那么多的知識)但我們的腳步又不能夠只停留在dos裡,應該積極地從dos向windows轉變.在dos的時代,我們可以對dos下的編程迷戀,但現下都是windows橫行霸道的時代了,我們就應用c語言編寫windows平台上的程式,因時而變,學以致用.是時代使然!
如果現下還是dos雄霸天下的話,那我就不會寫這篇狗屁不通的文章來遺笑大方了,不被臭雞蛋扔死才怪呢!
"變法"是大勢所趨的了,關鍵是怎么變,不單單是學習c語言的人如此,就連學c++的人都這樣,筆者曾經在QQ上碰到一個學了c++將近一年的小伙,居然問我,他想編一個windows窗口,該怎么下手,如果學一門語言用了一年時間,只是學了一點語法知識,卻沒有編過一道程式,那實在是一種悲哀.下面我談談從dos向windows轉變的一些個人見解,(這純屬個人觀點,僅供參考,如果您已是高手,完全不必要在此浪費時間):
一.拓寬視野,改變偏見
別老以為c只是dos特有的東西,一提到c語言就認為c只能在dos下編程.其實,這是被tc束縛了意識,我們在學校裡平時就只在dos的tc裡面用c編程,很少用到"圖形模式",整天面對?
quot;烏黑黑"的螢幕,也難怪有些人一看到一個用c語言描繪出來的像windows的窗口便以為是c++的手筆.其實,作為一種語言,可以在任何一種平台上編程,只是界面不同而已,只要找到適合該平台的編程工具即可,c語言當然也能在windows下大放異彩.眼界放寬點,改變偏見,必有精彩發現.
二.選擇優秀的編程工具.
“有好的工具,做起事來就事半功倍”.在dos下我們常用tc或bc(borland
c).在windows下可以用c++builder或者visualc++來編程,最好用visualc++
畢竟是微軟的東西嘛!
微軟一天不垮台,編程者的飯碗就不會掉的啦^_^
.再說,windows作業系統是微軟出的,其內幕微軟是最清楚不過的了,在應用程式界面上,相信vc也是做得最好的.不過用vc++6來編c程式會恨煩的,大家要有心理準備.同時可以選擇多種編程工具,例如彙編,可以加強對windows的了解,是成為高手的好方法。
三.加強對windows的了解.
可以說編一個程式,就是用一種語言的語法形式將數據架構和表面的執行過程描述出來.在不同的作業系統下,其程式的執行過程是不同的.我們應該對windows的系統機製最起碼有個大體的了解,才有可能編寫windows的程式.dos是單進程單線程的系統,進程從頭到尾的順序執行,而windows是多進程、多線程的作業系統,是基于事件的,消息驅動的作業系統.明白這些是在windows下編程必不可少的,多學學它,你會發現windows
和dos有很多的不同之處。
四.採取靈活多變的學習方法.
在不同的時期,學習不同的東西?
可是有些人學習像word,excel這類操作性極強的辦公軟體時,總是先看書,看到尾巴忘了頭,到上機時卻不知所措.這種學習模式是被動的,看這些軟體操作的書,裡面說的都是具體的操作,不親手又怎能接受新知識?
五.多進行比較.
dos和windows有許多共同和不同的地方,如果是從dos學過來的話,在學習過程中不妨多進行比較,把不同的地方記下,相同的地方可以跳過,這可以快速地了解系統的不同之處,迅速地學到東西﹗
學習程式設計,我主張"實踐->理論->再實踐"的模式,在編程的初期,不管你會不會寫程式,都應先實踐,(這裡的實踐是指編程工具操作方面的實踐),學會操作編程工具.也許有些人會說:
"廢話!
沒有理論,又怎么實踐?
"不錯,當你坐在一台電腦面前不知所措時,你就會想方設法使自己學會操作它,主動看書,看線上幫助,請教別人,忙得個"不亦樂乎",這不是變"被動"為"主動"了嗎?
邊學習邊操作,以實踐來帶動理論的學習,接著達到"理論與實踐同步",就可闖過第一關,學會了編程工具的基本操作,可以為以後上機實踐打下鋪墊.
光學會操作像vc這類的工具還不行,工具是死的,人才是活的,不會編程只能是空操作,你還會說:
"廢話!
沒有理論,怎么實踐?
"的,這時就要學習編程的真功夫了,也就是我說的第二階段--學"理論"階段,深入研究前輩們的著作,吸取前人的智慧精華為我所用,扎扎實實打好編程內功,功夫到家了就應該"再實踐",將學到的東西運用于實際,編寫出我們需要的軟體來.學以致用嘛,呵呵~~這種模式總比"先學好語法的條條框框,再上機實踐"的效果好得多啦.
關於向windows轉變的個人觀點就只談這些,希望初學人早日踏上windows的光明大道!
由於我也是一個菜鳥,水準有限,寫得不好,還請各位多多包涵!
二級C語言實例解答
C語言牽涉的概念比較複雜,規範繁多,使用靈活,容易出錯,不少初學人感到困難,下面透過幾個實例的分析來說明c語言學習中容易混淆的幾個問題,以期拋磚引玉,對初學人有所幫助。
問題1︰下面的程式
inta=3,b=4;
charstr=’c’;
printf(“%d,%d”,a,b,str);
執行后,輸出結果為︰
(A)3,4,c(B)34c
(C)3,4(D)程式出錯
分析︰在格式輸出時一般要求格式說明符與輸出項相一致,當輸出項多餘格式說明符時多餘的輸出項不輸出,所以答案為C。
問題2︰有下面的程式段
chara[3],b[]=“china”;
a=b;
printf(“%s”,a);
則輸出結果為︰
(A)營運后輸出china(B)營運后輸出ch(C)營運后輸出chi(D)編譯出錯
分析︰這個題容易錯選a?
?
實際答案為d,由於定義了字符數組后,數組名作為數組的首位址,是一個常量,給一個常量賦值的語句是錯誤的,換句話說,不能用賦值語句將一個字符常量或字符數組直接賦值給一個字符數組,以答案選D。
問題3︰下列說明不正確的是︰
(A)chara[10]=“china”(B)chara[10],?
?
p=a;p=“china”(C)char
?
?
p;p=“china”(D)chara[10],?
?
p;p=a=“china”;
分析︰此題易知A是正確的,D是錯誤的,對于B、C就很難選擇了。
有人認為p是一個字符變量,以為把”china”賦給該字符變量是不對的,實際上它是一個指針變量,只能指向一個字符變量或其他字符類型數據,不是把”china”存放到p中(指針變量只存放位址),只是把
“china”的首位址賦給指針變量p,所以B,C也是正確的。
問題4︰下面的程式執行結果是︰
main()
{intx[5]={2,4,6,8,10},?
?
p?
?
?
?
?
?
pp;
p=x;
pp=&&p;
printf(“%d”,?
?
(p++));
printf(“%d\n”,?
?
?
?
pp);
}
(A)44(B)24(C)22(D)46
分析︰在此題中p++是后加模式,先輸出?
?
p的值,p再自加,pp是二級指針,指向一級指針p,執行第一條輸出語句前后,存在下列指向關係︰
所以本題應選b
問題5︰下列輸出語句執行后結果為︰
inti=3;
printf(“%d”,-i++);
(A)3(B)4(C)-3(D)-4
分析︰此題考查運算符的優先級,負號運算符和++運算符同優先級,而結合方向為“自左至右”,即-i++相當于-?
?
i++?
?
,所以先取出i的值3,輸出-i的值-3,然後i增值為4,而不是i先增值為4,然後輸出-4,所以答案選擇C。
問題6︰設有以下語句,
structst
{intn;
structst?
?
next;
};
staticstructsta[3]={5,&&a[1],7,&&a[2],9,’\0’},?
?
p;
則以下表達式的值為6的是︰
(A)p++→n(B)p→n++(C)(?
?
p).n++(D)++p→n
分析︰此題也是考查運算符的優先級,→優先級高于++,結合方向為自左至右,而后者結合方向為自右至左,A答案相當于?
?
p++?
?
→n?
?
B答案相當于?
?
p→n?
?
++?
?
所以A、B、C表達式值均為5,D答案相當于++?
?
p→n?
?
?
?
自加模式為前加模式,所以其值為6。
上面是我在教學過程中學生一些比較集中的問題,只要認真的體會和總結,加強上機實踐,對自己C語言的學習會大有裨益。
等級考試︰C程式設計
計算機等級考試改革后,三級考試由A、B兩類改為PC技術、數據庫技術、網路技術、訊息管理技術四類。
其后三類的上機考試內容均為C語言程式設計。
三級上機不同于二級,它只有一道編程題,風險更大。
但只要能達到題目的要求,一般都能拿到3分。
參加過考試的人都應該知道一本書──南開大學出版的《全國計算機等級考試‧上機考試習題集》,這本書基本上包含了所有的上機考試題目類型。
這本書裡一共有100道題,都很經典。
但也許有人會覺得太多了,沒時間看完所有的題目。
下面我給大家介紹一個複習技巧。
簡化問題
每道試題的程式都很長,而且涉及的知識點很多。
實際上,在考試時看完全部程式並沒有必要。
每次只用把主要精力放在次程序的編製上,認真思考其“功能要求”。
所以平時我們只用關注需要編製的次程序。
試題歸類
要學會找出題目之間的規律,複習起來就會事半功倍。
在一百道題目中,實際上只需要仔細分析其中的二十多道題就足夠了,其他的只用看一下就行。
因為大部分的題目都是類似的,總結出規律來之后,我們可以舉一反三。
例如下面兩類題目︰
例1.
(占題庫10%)已知在文件IN.DAT中存有100個產品銷售記錄,每個產品銷售記錄由產品代碼dm(字符型4位)、產品名稱mc(字符型10位)、單價dj(整型)、數量sl(整型)、金額je(長整型)幾部分組成。
其中︰金額=單價×數量可計算得出。
函數ReadDat()的功能是讀取這100個銷售記錄並存入架構數組sell中。
請編製函數SortDat(),其功能要求︰按產品代碼從大到小進行排列,若產品代碼相同,則按金額從大到小進行排列,最終排列結果仍存入架構數組sell中,最後調用函數WriteDat()把結果輸出到文件OUT10.DAT中。
程式︰voidSortDat()
{intI,J;
PROxy;
for(I=0;I<100;I++)
{if(strcmp(sell[I].dm,sell[J].dm)<0)
{xy=sell[I];
sell[I]=sell[J];
sell[J]=xy;}
elseif(strcmp(sell[I].dm,sell[J].dm)==0)
if(sell[I].je
{xy=sell[I];
sell[I]=sell[J];
sell[J]=xy;}
}
}
分析︰這類程式題目的關鍵部分在于、、三句上。
它們的作用就是給出調換記錄次序的條件。
與其類似的題目只是在功能要求上有所不同(例如把“從大到小”改為“從小到大”,把“產品代碼”換成“產品名稱”等),所以我們只需要修改這三句。
如果我們抽到的題目是“金額從小到大,如相同,則產品名稱從大到小”,我們就將
改為︰if(sell[I].je>sell[J].je)
改為︰elseif(sell[I].je==sell[J].je)
改為︰if(strcmp(sell[I].mc,sell[J].mc)<0)
而對于將記錄次序進行調換的程式xy=sell[I]、sell[I]=sell[J]、sell[J]=xy,我們只需要套用就行。
例2.
(占題庫10%)函數ReadDat()的功能是實現從文件ENG.IN中讀取一篇英文文章,存入大字元串數組xx中;請編製函數encryptChar(),按給定的代替關係對數組xx中的所有字符進行代替,仍存入數組xx的對應的位置上,最後調用函數WriteDat()把結果xx輸出到文件PS1.DAT中。
代替關係︰f(p)=p*11mod
256。
其中p是數組xx中某一個字符的ASCII值,f(p)是計算后的新字符的ASCII值,如果計算后f
(p)的值小于等于32或大于130,則該字符不變,否則將f(p)所對應的字符進行代替。
程式︰voidencryptChar()
{intI;
char*pf;
for(I=0;I
{pf=xx[I];
while(*pf!
=0)
{if(*pf*11%256>130||*pf*11%256<=32)
{pf++;
continue;}
*pf=*pf*11%256;
pf++;
}
}
}
分析︰這一類題目較例1更為簡單,其關鍵只有一句,它是對條件“如果計算后f(p)的值小于等于32或大于130”的描述。
上機考試中類似的題目可能只對這個條件作少許變動。
例如︰“如果原字符是大寫字母或計算后f(p)的值小于等于32”,則只需把改為︰if
((*pf>=`A`&&&&*pf<=`Z`)||*pf*11%256<=32)
其他試題也可以按照上述方法進行總結。
總而言之,對于三級上機考試,我們不僅要提升編程能力,還應該注意分析試題,尋找規律,用更少的時間和精力解決更多的問題﹗
備戰C語言上機考試
C語言是目前最常用的軟體開發語言之一,其功能強大,具有悠久的歷史,從C、C++發展到現下的C#,不斷地得以更新繁衍。
在全國計算機等級考試中有,五個類別使用C語言作為上機考試內容,為各編程語言中應用最多的。
理論先行
[被屏蔽廣告]
雖是上機考試,仍需以理論知識為基礎,所以必須將C語言教材從頭到尾學習一遍(應選擇威權教材),對C語言的基本概況做到心中有數。
學完教材后,選取一些有代表性的編程範例,將其語句逐條理解透徹。
同時還須注意一點,看的懂未必等于自己就會編寫,應當自己嘗試默寫,從而找出知識薄弱點、思惟盲點。
要養成一些良好習慣,比如,代碼書寫格式使用規範的鋸齒形,盡量使用完整表達。
如果採用簡化模式,雖然不一定影響運算結果,但有的考試評分標準是按答題要點給分,所以還是不省為妙。
以下是學習C語言過程中容易出現的問題︰
1.函數、變量使用前未定義。
2.混淆“=”和“==”。
3.語句后或預定義的函數名后漏掉分號。
4.將else拼寫成esle、continue拼寫成contiune。
5.括號搭配錯誤。
6.首位址理解為1。
7.p++與++p區別不清。
8.break、continue運用不當。
9.誤將單引號用于字元串常量,將雙引號用于字符常量。
10.else分句中巢狀條件語句時,漏掉了“if”。
上機實踐
雖然考點、培養訓練點一般都提供類比上機,但畢竟時間、地點受到限制,不能保證充分的練習時間,因此很多考生都希望能在自家電腦上進行操作實踐,下面具體談談如何實現下個人電腦上進行練習的方法。
一、簡易環境練習
系統要求︰Windows系統
需用軟體︰TurboC2.0
TC軟體雖然不是標準的Windows程式,但在Windows環境下依然可以使用。
為使軟體處于理想營運狀態,營運tc.exe后需要做一些設置︰
1.按“漢”按鈕,否則會出現部分亂碼。
2.點擊屬性按鈕,在程式選項卡的“工作目錄”欄中根據上一命令行填入程式所在目錄,“營運”欄選擇最大化,選擇“退出時關閉”。
設置好后即可依照練習冊輸入習題,進行編譯調試。
編程中用到的處理數據一般需自建。
為了提升效率,可從網上下載習題。
這裡應留意一些下載習題中的問題,比如遺漏字符、錄入錯誤等,還有一些不易發現的情況,像雙引號的字體不標準、文件擴展名前的句號成了逗號、甚至一些看似無內容的空行中包含著某些ASCII碼,都會影響編程結果。
二、全真環境練習
系統要求︰DOS系統
需用軟體︰TurboC2.0、UCDOS、上機類比軟體
經過基礎階段學習后,再來進行針對等級考試的練習,這就需要用到類比軟體了。
市面上類比軟體很容易買到,其操作界面與正式考試完全一樣,還往往匯集了豐富的題庫和答案、源程式、輸入數據,並可進行自我評分。
有的還提供筆試題知識點查詢,介紹考試技巧等。
使用類比軟體前,應先安裝UCDOS(這與真實考試要求一樣,須選5.0以上版本,而且最好採用正式版,否則可能影響軟體使用)。
通常情況下在Windows環境下是無法使用類比軟體的,經過一些專業設置后雖可實現,但僅限于Windows
9X作業系統,而且設置不當易使系統崩潰,所以筆者建議還是在純DOS環境下使用為妥。
實戰心得
筆者參加的今年上半年考試題目大意如下︰要求將一篇英文文章中每個字符的ASCII值按公式f(p)=p
17%256計算,如f(p)的ASCII值小于32或為奇數,則原字符不變,否則予以替代。
這道題目需要編寫的程式代碼沒幾行,我寫好后調試營運,一切正常,複查幾遍也看不出有哪兒不妥。
正打算離開考場時,忽然覺得運算結果值得懷疑,根據題意,經過ASCII值計算后的結果不大可能仍都是常規字符,因此回過頭來再逐字審查題目,反覆對照編好的程式,焦點集中在了存放f(p)值的變量定義上,難道應將“char”改為“unsigned
char”?
一試,結果果然不同。
事后查知,char變量值的範圍為-128至+127,unsigned
char變量值的範圍為0至255。
比如字符“x”的ASCII值為120,按上述公式運算后值為248,字符應予以替代;如果存放f(p)值的變量定義為char型,值則轉換為-8,字符因而不被替代,難怪剛才運算結果顯出全篇常規字符了。
所以說,仔細嚴謹的應考作風能彌補一些技術上的不足,有助于臨場發揮。
友情提示
1.由於使用UCDOS,當螢幕下方顯示其狀態條時,Turbo
C中的快捷鍵Alt+F9(調試編譯)、Alt+F5(查看營運結果)等提示會被屏蔽掉,解決的辦法為按一下右Shift鍵,隱藏UCDOS狀態條后即可正常使用。
值得一提的是,Alt+F9雖然是Turbo
C菜單中的Run/Run命令的快捷鍵,但兩者不完全相同︰菜單命令包括自動編譯、連接和營運程式;而快捷鍵模式卻不包括營運程式,自然也就無運算結果,所以即使程式代碼編寫正確,考試成績仍有可能為零分。
2.雖然一些類比軟體的習題也是從國家考試中心發行的《全國計算機等級考試上機考試習題集》中選取,但正式考試時如遇到練習過的題目,仍應看仔細,其中可能會有“小于”與“大于”之類的一字之別。
C語言程式設計技巧
在許多應用軟體營運時都帶有命令行參數,其實這些命令行參數在C語言編寫的程式中也可以實現,靈活地運用命令行參數進行處理可以有效地提升程式的營運效率,收到事半功倍的效果。
C語言中有關命令行參數涉及到程式的主函數main(intargc,char
*argv[]這樣兩個參數,其中,int
argc表示命令行參數的個數(包括可執行程式名本身),char
*argv[]表示每個參數的具體內容,argv[0]為命令行中可執行程式名本身,argv[1]為命令行中第二個參數的內容,依次類推。
如下例輸出命令行參數的個數及參數的內容︰
main(intargc,char*argv[],
{intI;
printf("\n命令行中可執行文件名為︰%s",argv[0]);
printf("\n總共有%d個參數︰",argc);
I=0;
while(argc>=1)
{printf