C語言學習教程_第1页
C語言學習教程_第2页
C語言學習教程_第3页
C語言學習教程_第4页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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程式開發經典實例之ハ三、綜合提升(點擊下面文字鏈接即可打開頁面)I、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又比用彙編簡單,易于實現).另外,學Win32C程式設計還有助于更深入地了解Windows的內幕和Win32API。任何的編程語言都是一種工具,學習語言的目是要使用它來編寫出實際需要的軟體來,而軟體作為ー個用戶程式,營運時要倚賴作業系統,大多數大使用什麼作業系統,我們就要編寫出基于哪一種平台上的程式來.這樣,軟體オ會有更大的市場。現下市面上出現的有關c語言方面的書大多是教授DOS下的c,上機實習也是在TurboC2.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只能在dos下編程.其實,這是被tc束縛了意識,我們在學校裡平時就只在dos的tc裡面用c編程,很少用到"圖形模式",整天面對?quot;烏黑黑"的螢幕,也難怪有些大一看到一個用c語言描繪出來的像windows的窗口便以為是C++的手筆.其實,作為一種語言,可以在任何一種平台上編程,只是界面不同而已,只要找到適合該平台的編程工具即可,c語言當然也能在windows下大放異彩.眼界放寬點,改變偏見,必有精彩發現.二.選擇優秀的編程工具.“有好的工具,做起事來就事半功倍”.在dos下我們常用tc或bc(borlandc).在windows下可以用C++Builder或者visualC++來編程,最好用visualC++畢竟是微軟的東西嘛!微軟ー天不垮台,編程者的飯碗就不會掉的啦A_A.再說,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語言學習中容易混淆的幾個問題,以期拋磚引玉,對初學人有所幫助。問題!:下面的程式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:下列輸出語句執行后結果爲:printf("%d,^,-i++);(A)3(B)4(C)-3(D)-4分析:此題考查運算符的優先級,負號運算符和++運算符同優先級,而結合方向爲“自左至右”,即-i++相當于ー??i++??,所以先取出i的値3,輸出一i的値ー3,然後i增値爲4,而不是i先增値爲4,然後輸出ー4,所以答案選擇Co問題6:設有以下語句,structst{intn;structst??next;};staticstructsta[3]={55&&a[l],7,&&a[2],9,'、〇'},??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中存有!00個產品銷售記錄,每個產品銷售記錄由產品代碼dm(字符型4位)'產品名稱me(字符型!0位)'單價dj(整型)'數量si(整型)'金額je(長整型)幾部分組成。其中:金額=單價x數量可計算得出。函數ReadDat。的功能是讀取這100個銷售記錄並存入架構數組sell中。請編製函數SortDatO>其功能要求:按產品代碼從大到小進行排列,若產品代碼相同,則按金額從大到小進行排列,最終排列結果仍存入架構數組sell中,最後調用函數WriteDat。把結果輸出到文件OUTI0.DAT中。程式:voidSortDat(){intI,J;PROxy;for(I=0;I<100;I++){if(strcmp(sell[I].dm,sell[J].dm)<O){xy=sell[I];sell[I]=sell[J];sell[Jl=xy;}elseif(strcmp(sell[I].dm,sell[J].dm)==O)if(seliri].je{xy=sell[I];sell[I]=sell[J];sell[J]=xy;})I分析:這類程式題目的關鍵部分在于、、三句上。它們的作用就是給出調換記錄次序的條件。與其類似的題目只是在功能要求上有所不同(例如把“從大到小”改為“從小到大”,把“產品代碼”換成“產品名稱”等),所以我們只需要修改這三句。如果我們抽到的題目是“金額從小到大,如相同,則產品名稱從大到小”,我們就將改為:if(sell[Il,je>sell[J].je)改為:elseif(seliri].je==sell[J].je)改為:if(strcmp(sell[I].mc,sell[J].mc)<O)而對于將記錄次序進行調換的程式xy=sell[I]、sell[I]=sell[J]、sell[J]=xy>我們只需要套用就行。例2.(占題庫10%)函數ReadDatO的功能是實現從文件ENGIN中讀取ー篇英文文章,存入大字元串數組xx中;請編製函數encryptChar()>按給定的代替關係對數組xx中的所有字符進行代替,仍存入數組xx的對應的位置上,最後調用函數WriteDat()把結果xx輸出到文件PS1.DAT中。代替關係:f(p)=p*llmod256。其中p是數組xx中某一個字符的ASCII値,f(p)是計算后的新字符的ASCI!値,如果計算后f(p)的値小于等于32或大于!30,則該字符不變,否則將f(p)所對應的字符進行代替。程式:voidencryptChar(){intI;char*pf;for(I=0;I{pf=xx[I];while(*pf!=0){if(*pf*ll%256>130ll*pf*ll%256<=32){pf++;continue;}*pf=*pf*ll%256;pf++;}})分析:這一類題目較例1更爲簡單,其關鍵只有一句,它是對條件“如果計算后f(p)的値小于等于32或大于130”的描述。上機考試中類似的題目可能只對這個條件作少許變動。例如:"如果原字符是大寫字母或計算后f(p)的値小于等于32”,則只需把改爲:if((*pf>='A'&&&&*pf<=N)ll*pf*11%256<=32)其他試題也可以按照上述方法進行總結。總而言之,對于三級上機考試,我們不僅要提升編程能力,還應該注意分析試題,尋找規律,用更少的時間和精力解決更多的問題!備戰C語言上機考試C語言是目前最常用的軟體開發語言之一,其功能強大,具有悠久的歷史,從c、C++發展到現下的C#,不斷地得以更新繁衍。在全國計算機等級考試中有,五個類別使用c語言作為上機考試內容,爲各編程語言中應用最多的。理論先行[被屏蔽廣告]雖是上機考試,仍需以理論知識爲基礎,所以必須將C語言教材從頭到尾學習一遍(應選擇威權教材),對C語言的基本槪況做到心中有數。學完教材后,選取一些有代表性的編程範例,將其語句逐條理解透徹。同時還須注意ー點,看的懂未必等于自己就會編寫,應當自己嘗試默寫,從而找出知識薄弱點、思惟盲點。要養成一些良好習慣,比如,代碼書寫格式使用規範的鋸齒形,盡量使用完整表達。如果採用簡化模式,雖然不一定影響運算結果,但有的考試評分標準是按答題要點給分,所以還是不省爲妙。以下是學習C語言過程中容易出現的問題:.函數、變量使用前未定義。.混淆和“=="。.語句后或預定義的函數名后漏掉分號。.將else拼寫成esle、continue拼寫成contiune°.括號搭配錯誤。.首位址理解爲1。.p++與++p區別不清。.break'continue運用不當。.誤將單引號用于字元串常量,將雙引號用于字符常量。.else分句中巢狀條件語句時,漏掉了“i『。上機實踐雖然考點、培養訓練點一般都提供類比上機,但畢竟時間、地點受到限制,不能保證充分的練習時間,因此很多考生都希望能在自家電腦上進行操作實踐,下面具體談談如何實現下個人電腦上進行練習的方法。一'簡易環境練習系統要求:Windows系統需用軟體:TurboC2.0TC軟體雖然不是標準的Windows程式,但在Windows環境下依然可以使用。爲使軟體處于理想營運狀態,營運tc.exe后需要做ー些設置:.按“漢”按鈕,否則會出現部分亂碼。.點擊屬性按鈕,在程式選項卡的“工作目錄”欄中根據上一命令行塡入程式所在目錄,“營運”欄選擇最大化,選擇“退出時關閉”。設置好后即可依照練習冊輸入習題,進行編譯調試。編程中用到的處理數據一般需自建。為了提升效率,可從網上下載習題。這裡應留意一些下載習題中的問題,比如遺漏字符,錄入錯誤等,還有一些不易發現的情況,像雙引號的字體不標準、文件擴展名前的句號成了逗號、甚至ー些看似無內容的空行中包含著某些ASCI!碼,都會影響編程結果。二'全真環境練習系統要求:DOS系統需用軟體:TurboC2.0ヽUCDOS、上機類比軟體經過基礎階段學習后,再來進行針對等級考試的練習,這就需要用到類比軟體了。市面上類比軟體很容易買到,其操作界面與正式考試完全ー樣,還往往匯集了豐富的題庫和答案、源程式、輸入數據,並可進行自我評分。有的還提供筆試題知識點查詢,介紹考試技巧等。使用類比軟體前,應先安裝UCDOS(這與真實考試要求一樣,須選5.0以上版本,而且最好採用正式版,否則可能影響軟體使用)。通常情況下在Windows環境下是無法使用類比軟體的,經過一些專業設置后雖可實現,但僅限于Windows9X作業系統,而且設置不當易使系統崩潰,所以筆者建議還是在純DOS環境下使用為妥。實戰心得筆者參加的今年上半年考試題目大意如下:要求將一篇英文文章中每個字符的ASCII値按公式f(p)=p17%256計算,如f(p)的ASCII値小于32或為奇數,則原字符不變,否則予以替代。這道題目需要編寫的程式代碼沒幾行,我寫好后調試營運,一切正常,複查幾遍也看不出有哪兒不妥。正打算離開考場時,忽然覺得運算結果値得懷疑,根據題意,經過ASCII値計算后的結果不大可能仍都是常規字符,因此回過頭來再逐字審查題目,反覆對照編好的程式,焦點集中在了存放f(p)値的變量定義上,難道應將“char”改為"unsignedchar”?ー試,結果果然不同。事后查知,char變量値的範圍為一128至+127,unsignedchar變量値的範圍為0至255。比如字符“x”的ASCII値為!20,按上述公式運算后値為248,字符應予以替代;如果存放f(p)値的變量定義為char型,値則轉換為一8,字符因而不被替代,難怪剛才運算結果顯出全篇常規字符了。所以說,仔細嚴謹的應考作風能彌補ー些技術上的不足,有助于臨場發揮。友情提示.由於使用UCDOS,當螢幕下方顯示其狀態條時,TurboC中的快捷鍵Alt+F9(調試編譯)、Alt+F5(查看營運結果)等提示會被屏蔽掉,解決的辦法為按一下右Shift鍵,隱藏UCDOS狀態條后即可正常使用。値得一提的是,AU+F9雖然是TurboC菜單中的Run/Run命令的快捷鍵,但兩者不完全相同:菜單命令包括自動編譯、連接和營運程式;而快捷鍵模式卻不包括營運程式,自然也就無運算結果,所以即使程式代碼編寫正確,考試成績仍有可能為零分。.雖然ー些類比軟體的習題也是從國家考試中心發行的《全國計算機等級考試上機考試習題集》中選取,但正式考試時如遇到練習過的題目,仍應看仔細,其中可能會有“小于”與“大于”之類的一字之別。C語言程式設計技巧在許多應用軟體營運時都帶有命令行參數,其實這些命令行參數在C語言編寫的程式中也可以實現,靈活地運用命令行參數進行處理可以有效地提升程式的營運效率,收到事半功倍的效果。C語言中有關命令行參數涉及到程式的主函數main(intargc,char*argvU這樣兩個參數-其中,intargc表示命令行參數的個數(包括可執行程式名本身),char*argvU表示每個參數的具體內容,argv⑼為命令行中可執行程式名本身,argv[l]為命令行中第二個參數的內容,依次類推。如下例輸出命令行參數的個數及參數的內容:main(intargc,char*argv[],{intI;printf("\n命令行中可執行文件名為:%s",argv[0]);printf("\n總共有%d個參數:",argc);1=0;while(argc>=l){printf(*%s",argv[I++]);argc ;}命令行參數用的最多還是在諸如DIRA:等之類帶有盤符、路徑或文件名這樣的命令行中,所以說靈活處理這一類參數オ能有效地提升程式的營運效果。譬如DIR命令,其后可以是盤符,可以是路徑,也可以是文件名,如何區分這ー參數呢?請看下例(此程式類比DIR命令,程式要求在命令行輸入一個參數:盤符或路徑或文件名,若無參數或參數多于一個都將取默認的參數ゆ.*”)。功能:類比DIR命令進行處理命令行參數ワ#includeincludeincludeinchludeintj,num=O;charss[20],path[50],path2[50];voidmain(intargc,char*argv[])(structffblkf;intdone;if(argc==2) /・取命令行參數到數組中・/strcpy(ss,argv[l]);elsestrcpy(ss,**.*");/・給數組賦値缺省參數・/if(((ss[strlen(ss)—1]=""II((ss[strlen(ss)—1]=':'))strcat(ss,〃・.・〃);/・若參數為路徑或盤符,則加上〃*.*" */getcwd(path1,50);/・取當前路徑・/if(chdir(ss)==0)/・判斷參數是否為路徑・/strcat(ss,"\\*.*");/・若路徑末沒有帶ヾ,則加上"*.*"*/chdir(path1);/・恢復原來路徑・/strcpy(path2,ss);for(j=strlen(path2);j>0;j レ・提取參數中的路徑到path2*/{if((path2[jl=='\\'))ll(path2[j]==':')){path2[j+l]='\0';gotosenull;}}path2r01='\0';senull:if(strlen(path2)==0)/・若給出的參數中沒帶路徑,則取當前路徑・/strcpy(path2,path1);printf("\n*・類比DIR**\n命令目錄路徑%s",path2);done=findfirst(ss,&f,55);/・查找第一個配匹的文件*/j=l;while(!done){if(f.ff_attrib!=OxlO)/・若文件屬性不是目錄・/printf("\n%15s%201d",f.ff_name,f.ff_fsize);elseprintf("\n&Ils",f.ff_name);num-r+;j++;if(j=23)printf("\n More(按任意鍵繼續) ");getch();j=0;printf(*\n(目錄路徑%s)”,path2);}done=findnext(&f);/・查找下一個配匹的文件*/)printf("\n當前目錄中總共有%d個文件An”,num);C語言初級講座我們已經看到程式中使用的各種變量都應預先加以說明,即先說明,后使用。對變量的說明可以包括三個方面:•數據類型•存儲類型•作用域在本講中,我們只介紹數據類型說明。其它說明在以後陸續介紹。所謂數據類型是按被說明量的性質,表示形式,佔據存儲空間的多少,構造特點來劃分的。在C語言中,數據類型可分為:基本數據類型,構造數據類型,指針類型,空類型四大類。.基本數據類型基本數據類型最主要的特點是,其値不可以再分解為其它類型。也就是說,基本數據類型是自我說明的。.構造數據類型構造數據類型是根據已定義的一個或多個數據類型用構造的方法來定義的。也就是說,一個構造類型的値可以分解成若干個“成員”或“元素”。每個“成員”都是一個基本數據類型或又是一個構造類型。在C語言中,構造類型有以下幾種:•數組類型•架構類型•聯合類型.指針類型指針是一種特殊的,同時又是具有重要作用的數據類型。其値用來表示某個量在內存儲器中的位址。雖然指針變量的取値類似于整型量,但這是兩個類型完全不同的量,因此不能混為一談。4.空類型在調用函數値時,通常應向調用者返回一個函數値。這個返回的函數値是具有一定的數據類型的,應在函數定義及函數說明中給以說明,例如在例題中給出的max函數定義中,函數頭為:intmax(inta,intb);其中“int”類型說明符即表示該函數的返回値為整型量。又如在例題中,使用了庫函數sin,由於系統規定其函數返回値為雙精度浮點型,因此在賦値語句s=sin(x);中,s也必須是雙精度浮點型,以便與sin函數的返回値一致。所以在說明部分,把s說明為雙精度浮點型。但是,也有一類函數,調用后並不需要向調用者返回函數値,這種函數可以定義為“空類型”。其類型說明符為void。在本講中,我們先介紹基本數據類型中的整型、浮點型和字符型。其餘類型在以後各講中陸續介紹。對于基本數據類型量,按其取値是否可改變又分為常量和變量兩種。在程式執行過程中,其値不發生改變的量稱為常量,取値可變的量稱為變量。它們可與數據類型結合起來分類。例如,可分為整型常量、整型變量、浮點常量、浮點變量、字符常量、字符變量、枚舉常量、枚舉變量。在程式中,常量是可以不經說明而直接引用的,而變量則必須先說明后使用。整型量整型量包括整型常量、整型變量。整型常量就是整常數。在C語言中,使用的整常數有八進製、十六進製和十進製三種。整型常量.八進製整常數八進製整常數必須以〇開頭,即以〇作為八進製數的前綴。數碼取値為〇〜7。ハ進製數通常是無符號數。以下各數是合法的八進製數:015(十進製為13)0101(十進製為65)0177777(十進製為65535)以下各數不是合法的八進製數:256(無前綴0)03A2(包含了非八進製數碼)-0127(出現了負號).十六進製整常數十六進製整常數的前綴為0X或Ox。其數碼取値為0-9,A-F或a~f。以下各數是合法的十六進製整常數:0X2A(十進製為42) OXAO(十進製為!60) OXFFFF(十進製為65535)以下各數不是合法的十六進製整常數:5A(無前綴OX) 0X3H(含有非十六進製數碼).十進製整常數十進製整常數沒有前綴。其數碼為〇〜9。以下各數是合法的十進製整常數:237-568655351627以下各數不是合法的十進製整常數:023(不能有前導〇)23D(含有非十進製數碼)在程式中是根據前綴來區分各種進製數的。因此在書寫常數時不要把前綴弄錯造成結果不正確。4.整型常數的后綴在!6位字長的機器上,基本整型的長度也為16位,因此表示的數的範圍也是有限定的。十進製無符號整常數的範圍為〇〜65535,有符號數為一32768〜+32767。ハ進製無符號數的表示範圍為。〜0177777。十六進製無符號數的表示範圍為0X〇〜OXFFFF或Ox〇〜OxFFFF。如果使用的數超過了上述範圍,就必須用長整型數來表示。長整型數是用后綴“ビ或T來表示的。例如:十進製長整常數158L(十進製為158)358000L(十進製為一358000)ハ進製長整常數012L(十進製為10)077L(十進製為63)0200000L(十進製為65536)十六進製長整常數0X15L(十進製為21)0XA5L(十進製為165)0X10000L(十進製為65536)長整數158L和基本整常數158在數値上並無區別。但對158L-因為是長整型量,C編譯系統將為它分發4個位元組存儲空間。而對158,因為是基本整型,只分發2個位元組的存儲空間。因此在運算和輸出格式上要予以注意,避免出錯。無符號數也可用后綴表示,整型常數的無符號數的后綴為“U”或"u”。例如:358u,0x38Au,235Lu均為無符號數。前綴,后綴可同時使用以表示各種類型的數。如0XA5LU表示十六進製無符號長整數A5>其十進製為165。寫好C程式的10條秘籍神乎其技,惟C程式,功到自成,十大建議!!、汝應頻繁催動!int工具,據其語法聲明修習內カ,此事皆因lint之思慮決斷實遠在君上。2、不可依隨NULL指針,如若不然,混沌痴顛必俟君于彼岸。3'縱有天賦大智慧,知曉其事無礙,汝亦當盡數強製挪移函數參數為原型所期之數據類型,以免一時疏忽,致使數據類型向汝討還血債。4、若頭文件未于函數原型之中聲明返回値類型,汝當親為此事,更須謹慎再三,以防不測降臨汝身。5'汝須親核字元串、數組操作之越界與否。古之聖人有言:嘗祈門人對答“然也”,不意門人答曰“吾了然于胸無須多慮盡請寬心他日趨庭必當重謝”——所期者短,所獲者長,此于數組,實最險要處也。6、若函數聲明內提及,于異常時將返回錯誤代碼雲雲,汝當謹慎校核該返回値。或有校核語句使汝之代碼增大數倍,令汝之手指因敲鍵而痛楚莫名之事,汝亦當如此。不然,汝固以爲此異常之事難得一見,上蒼亦必借此懲戒汝之傲慢。7、汝應硏習庫函數,不當親筆重寫之。如是,汝之代碼必短小易讀,汝之心境必清爽恬淡。8、縱汝不願,汝亦應借括號、縮進之屬,使汝之代碼間架清晰,可爲后者借鏡。汝之大智慧施于決疑解難則可,施于敷設謎團、淆亂文體則萬萬不可。9、外部標識符之前六字符當與眾不同。此律法看似粗陋,和者寥寥,然其效用自能延續永遠。汝若不從此言,他日,汝欲連接程式于舊作之上時,必抓耳撓腮、蓬頭垢面,野狼狽之相盡現矣。10'或有族類,大言炎炎,雲“普天之下,莫非VAX”。于此等異端,汝當摒棄之、斷絕之、遠避之。更有異大,篤信魔道,以爲縱汝所用電腦頻繁換代,汝之程式亦能長久適用。汝亦不可與此類惡大來往,謹記謹記。強大的語言"C入門之ー一'C語言的特點C語言是美國的DennisRitchie在1972年設計發明的。它由早期的編程語言BCPL(BasicCombinedProgrammingLanguage)發展演變而來。C語言之所以發展迅速,成爲最受歡迎的語言之一,主要因爲它具有強大的功能。歸納起來,C語言具有下列特點:1•C語言是“中級語言”它把高階語言的基本架構和語句與低級語言的實用性結合起來。C語言可以像組合語言ー樣對位、位元組和位址進行操作,而這三者是計算機最基本的工作單元。2,C語言是架構式語言所謂架構式語言的顯著特點是代碼及數據的分隔化,即程式的各個部分除了必要的訊息交流外彼此獨立。這種架構化模式可使程式層次清晰,便于使用、維護以及調試。C語言是以函數形式提供給用戶的,這些函數可方便地調用,並具有多種循環、條件語句控制程式流向,從而使程式完全架構化。3-C語言功能齊全C語言具有各種各樣的數據類型,並引入了指針槪念,可使程式效率更高。另外c語言也具有強大的圖形功能,支持多種顯示器和驅動器,而且計算功能、邏輯判斷功能也比較強大,可以實現決策目的。4-C語言適用範圍廣C語言還有一個突出的優點就是適合多種作業系統,如DOSヽWindowsヽUNIX,也適用于多種機型。二'C語言基礎介紹隨著微型計算機的日益普及,出現了許多C語言版本。由於沒有統一的標準,使得這些C語言之間出現了一些不一致的地方。爲了改變這種情況,美國國家標準硏究所(ANSI)爲C語言製定了一套ANSI標準,成爲現行的C語言標準。而在這裡我們將主要以美國Borland公司的產品TurboC2.0作為介紹對象,簡要介紹一下C語言的基本知識。.數據類型在C語言中,每個變量在使用之前必須定義其數據類型。TurboC有以下幾種類型:整型(int)、浮點型(float)、字符型(char)、指針型(*)、無値型(void)以及架構(struct)和聯合(union)。其中前五種是C語言的基本數據類型、后兩種數據類型(架構和聯合)則是C語言的擴展數據類型。.關鍵字和標識符、運算符所謂關鍵字就是已被C語言本身使用、不能作其它用途的字。例如關鍵字else>就再不能用作變量名、函數名等。所謂標識符是指常量、變量、語句標號以及用戶自定義函數的名稱。C標識符的定義十分靈活。C的運算符非常豐富,主要分為三大類:算術運算符、關係與邏輯運算符、按位運算符。.變量C規定所有變量在使用前都必須加以說明。一條變量說明語句由數據類型和其后的一個或多個變量名組成,例如"intx”。變量可以在程式中三個地方說明:函數內部、函數的參數定義中或所有的函數外部。根據所定義位置的不同,變量可分爲局部變量、形式參數和全程變量。C像其它高階語言ー樣也使用數組變量。所謂數組就是指具有相同數據類型的變量集,並擁有共同的名字。數組中的每個特定元素都使用下標來訪問。4•控制流程語句C提供了豐富、靈活的控制流程語句,主要有:條件語句、循環語句和開關語句。條件語句的一般形式為if-else。C提供三種基本的循環語句:for語句、while語句和do-while語句。而在編寫程式時,經常會碰到按不同情況分轉的多路問題,這時可用巢狀if-else-if語句來實現,但if-else-if語句使用不方便,並且容易出錯。對這種情況,C提供了一個switch開關語句。強大的語言一C入門之ニ上接:強大的語言一C入門之一・指針(point)學習C語言,指針是較難理解的一個槪念。我們知道變量在計算機內佔有一塊儲存區域(也就是有一個“位址”),變量的値就存放在這塊區域之中,在計算機內部,透過訪問或修改這塊區域的內容來訪問或修改相應的變量。C語言中,對于變量的訪問形式之一,就是先求出變量的位址,然後再透過位址對它進行訪問,這就是指針及指針變量。指針變量的一般定義為“類型標識符・標識符”,其中標識符是指針變量的名字,標識符前加了“*”號,表示該變量是指針變量,而最前面的“類型標識符”表示該指針變量所指向的變量的類型。一個指針變量只能指向同一種類型的變量,也就是說,我們不能定義一個指針變量,既能指向一整型變量又能指向雙精度變量。三、C程式設計初步C語言是一種中級語言,用戶用C語言編寫的程式稱為源程式,源程式文件的后綴一般必須為“ザ。計算機硬體不能直接執行源程式,必須將源程式翻譯成二進製目標程式。翻譯工作是由編譯程式完成的,翻譯的過程稱為編譯,編譯的結果稱為目標程式,目標程式文件后綴一般為“.OBJ”。程式翻譯成目標程式后,便可進行連接。“連接”的目的是使程式變成在計算機上可以執行的最終形式。在這ー階段,系統程式庫中的程式要與目標程式連接,連接的結果稱為執行程式,執行程式文件名字一般以“.EXE”結尾。正如所有利用計算機語言所編寫的的第一個程式ー樣,下面,我們也試著建立一個名為“HELLO.C”的源程式,這個程式將在螢幕上面打印出“你好,《電腦報》軟體世界!”這個短語。透過鍵盤輸入程式:includemain()printf(〃你好,《電腦報》軟體世界!\n〃);這個最簡單的程式,也包括了C語言的ー些基本的內容,它有一個主函數main(),使用到了標準的輸出函數printf(),同時爲了能夠讓程式營運時包含這個標準函數,我們首先要在程式的最開始寫上include,“stdio.h”是C語言提供的標準輸入輸出函數庫頭文件,我們可以直接引用裡面的一些函數,來完成我們所要實現的功能。現下,讓我們來編譯、連接並營運一下這個最簡單的程式,我們將看到,在螢幕上打印出了“你好,《電腦報》軟體世界!”四、參考資料首先是ー些C語言相關的書籍:(C語言》譚浩強,《C語言編程寶典》王大剛,《數據架構與算法一面向對象的C++設計模式》BrunoR.Preiss,《C/C++語言與硏究開發實踐》伍曉宇、辛勇・(BorlandC++Builder3.0/4.0類參考詳解》張濟、袁野、王秀娟,(BorlandC++Builder3.0/4.0高級類參考詳解》王秀娟、孫悅、黎華,《C++語言命令詳解(第二版)》BrianOverland,《C++程式設計實驗指導》錢能。二'實例開發用C語言解決鬼谷算題在鬼谷算題中有這樣一個著名的題目:“今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?”這屬于高等數學中的數論。我國宋代學人對這類題目鑽硏已頗為精深,總結出了“三人同行七十稀,五樹梅花廿ー枝,七子團圓正半月,去百零五便得知。”這樣的口訣,意思是說“以三三數之,餘數乘以七十;五五數之,餘數乘以二十一;七七數之,餘數乘十五。三者相加,如不大于ー百零五,即爲答數;否則須減去ー百零五或其倍數。”這道算題的答案爲23。計算起來比較繁瑣,但如果用我們所熟悉的C語言來編寫ー小段程式的話,很快就能解決。這段程式如下:#include"stdio.h"mainintxforx=0x<100x++??ifx%3==2&&x%5==3&&x%7==2printf〃Thisnumberis%d\n"x用C語言實現的鬧鐘程式#include<graphics.h>#include<conio.h>#include<math.h>#include<dos.h>#include<stdio.h>voidmain()(intgd=DETECT,gm;intx=320,y=240,r=200,i,h,m,s,thetamin,thetasec;structtimet;charn[12][3]={“3“J2“jr',“12“JU*“10T9Y'8*”7*”6*“5“J4”};initgraph(&gd,&gm,"g:\\tc\\bgi");〃圖形驅動器路徑,根據自己的系統更換。circle(x,y,210);setcolor(4);settextstyle(4,0,5);for(i=0;i<12;i++)(if(i!=3)outtextxy(x+(r-14)*cos(M_PI/6*i)-10,y-(r-14)*sin(M_PI/6*i)-26,n[i]);elseouttextxy(x+(r-14)*cos(M_PI/6*i)-20,y-(r-14)*sin(M_PI/6*i)-26,n[i]);}gettime(&t);printf(MThecurrenttimeis:%2d:%02d:%02d.%02d\n",t.ti_hour,t.ti_min,t.ti_sec,t.ti_hund);while(!kbhit())(setcolor(5);setfillstyle(l,5);circle(x,y,10);floodfill(x,y,5);gettime(&t);if(t.ti_min!=m){setcolor(O);line(x,y,x+(r-60)*cos(thetamin*(M_PI/180)),y-(r-60)*sin(thetamin*(M_PI/180)));circle(x+(r-80)*cos(thetamin*(M_PI/180)),y-(r-80)*sin(thetamin*(M_PI/180)),10);line(x,y,x+(r-l10)*cos(M_PI/6*h-((m/2)*(M_PI/l80))),y-(r-l10)*sin(M_PI/6*h-((m/2)*(M_PI/180))));circle(x+(r-l30)*cos(M_PI/6*h-((m/2)*(M_PI/180))),y-(r-l30)*sin(M_PV6*h-((m/2)*(M_PI/180))),10);}if(t.ti_hour>12)t.ti_hour=t.ti_hour-12;if(t.ti_hour<4)h=abs(t.ti_hour-3);else h=15-t.ti_hour;m=t.ti_min;if(t.ti_min<=15)thetamin=(l5-t.ti_min)*6;elsethetamin=450-t.ti_min*6;if(t.ti_sec<=15)thetasec=(15-t.ti_sec)*6;elsethetasec=450-t.ti_sec*6;setcolor(4);line(x,y,x+(r-l10)*cos(M_PI/6*h-((m/2)*(M_PI/l80))),y-(r-l10)*sin(M_PI/6*h-((m/2)*(M_PV180))));circle(x+(r-130)*cos(M_PI/6*h-((m/2)*(M_PI/l80))),y-(r-130)*sin(M_PV6*h-((m/2)*(M_PI/180))),10);line(x,y,x+(r-60)*cos(thetamin*(M_PI/180)),y-(r-60)*sin(thetamin*(M_PI/180)));circle(x+(r-80)*cos(thetamin*(M_PI/180)),y-(r-80)*sin(thetamin*(M_PI/180))JO);setcolor(15);line(x,y,x+(r-70)*cos(thetasec*(M_PI/180)),y-(r-70)*sin(thetasec*(M_PI/180)));delay(lOOO);setcolor(O);line(x,y,x+(r-70)*cos(thetasec*(M_PI/180)),y-(r-70)*sin(thetasec*(M_PI/180)));該程式已在TurboC++3.0中透過編譯.C程式開發經典實例之一【程式1】題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?1.程式分析:可塡在百位、十位、個位的數字都是1、2、3、4。組成所有的排列后再去掉不滿足條件的排列。2.程式源代碼:main()|inti,j,k;printf("\n");for(i=l;i<5;i++) /・以下爲三重循環・/for(j=l;j<5;j++)for(k=l;k<5;k++){if(i!=k&&i!=j&&j!=k) /・確保i'j'k三位互不相同・/printf("%d,%d,%d\n",i,j,k);【程式2】題目:企業發放的加菜金根據利潤提成。利潤⑴低于或等于10萬元時,加菜金可提10%;利潤高于10萬元,低于20萬元時,低于10萬元的部分按10%提成,高于10萬元的部分,可可提成?.5%;20萬到40萬之間時,高于20萬元的部分,可提成5%;40萬到60萬之間時高于40萬元的部分,可提成3%;60萬到100萬之間時,高于60萬元的部分,可提成1.5%,高于100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求應發放加菜金總數?.程式分析:請利用數軸來分界,定位。注意定義時需把加菜金定義成長整型。.程式源代碼:main(){longinti;intbonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ldn,&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;elseif(i<=200000)bonus=bonusl+(i-100000)*0.075;elseif(i<=400000)bonus=bonus2+(i-200000)*0.05;elseif(i<=600000)bonus=bonus4+(i-400000)*0.03;elseif(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf(nbonus=%d'\bonus);)【程式3】題目:一個整數,它加上100后是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?.程式分析:在10萬以內判斷,先將該數加上!00后再開方,再將該數加上268后再開方,如果開方后的結果滿足如下條件,即是結果。請看具體分析:.程式源代碼:#include"math.h"main()(longinti,x,y,z;for(i=l;i<100000;i++){x=sqrt(i+100); /*x為加上!00后開方后的結果・/y=sqrt(i+268); /*y為再加上!68后開方后的結果・/if(x*x==i+100&&y*y==i+268)/・如果一個數的平方根的平方等于該數,這說明此數是完全平方數・/printf("\n%ld\n",i);))【程式4】題目:輸入某年某月某日,判斷這一天是這一年的第幾天?L程式分析:以3月5日為例,應該先把前兩個月的加起來,然後再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大于3時需考慮多加一天。.程式源代碼:main(){intday,month,year,sum,leap;printf("\npleaseinputyear,month,day\n");scanf("%d,%d,%d”,&year,&month成day);switch(month)/・先計算某月以前月份的總天數・/|casel:sum=0;break;case2:sum=31;break;case3:sum=59;break;case4:sum=90;break;case5:sum=120;break;case6:sum=151;break;case7:sum=181;break;case8:sum=2i2;break;case9:sum=243;break;case10:sum=273;break;casell:sum=304;break;case12:sum=334;break;default:printf(ndataerrorn);break;sum=sum+day; /・再加上某天的天數・/if(year%400==0ll(year%4==0&&year%100!ニ〇))/・判斷是不是閏年・/leap=l;elseleap=O;if(leap==l&&month>2)/*如果是閏年且月份大于2,總天數應該加一天・/sum++;printf(nItisthe%dthday.n,sum);}【程式5】題目:輸入三個整數x,y,z請把這三個數由小到大輸出。.程式分析:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的値進行交換,然後再用x與z進行比較,如果x>z則將x與z的値進行交換,這樣能使x最小。.程式源代碼:main()intx,y,z,t;scanfC'%d%d%d';&x,&y,&z);if(x>y){t=x;x=y;y=t;}/・交換x,y的値・/if(x>z){t二z;z二x;x=t;}/・交換x,z的値*/if(y>z){t=y;y=z;z=t;}/・交換z,y的値*/printf('*smalltobig:%d%d%d\nn,x,y,z);)【程式6】題目:用・號輸出字母C的圖案。.程式分析:可先用'*'號在紙上寫出字母C,再分行輸出。.程式源代碼:#include"stdio.h"main(){printf("HelloC-world!\n");printf("****\n");printf("*\n");printf("*\n");printf("****\n");)【程式7】題目:輸出特殊圖案,請在c環境中營運,看一看,VeryBeautiful!.程式分析:字符共有256個。不同字符,圖形不一樣。.程式源代碼:#include"stdio.h”main()chara=176,b=219;printf(M%c%c%c%c%c\n",b,a,a,a,b);printf(M%c%c%c%c%c\nn,a,b,a,b,a);printf(n%c%c%c%c%c\nn,a,a,b,a,a);printf(u%c%c%c%c%c\nn,a,b,a,b,a);printf(n%c%c%c%c%c\nM,b,a,a,a,b);}【程式8】題目:輸出9*9口訣。.程式分析:分行與列考慮,共9行9列,i控制行-j控制列。.程式源代碼:#include"stdio.h"main()(inti,j,result;printf("\n");for(i=l;i<10;i++){forG=l;j<10;j++){result=i*j;printf("%d*%d=%-3d”,i,j,result);/*-3d表示左對齊,占3位・/}printf("\n");/・每一行后換行・/}}【程式9】題目:要求輸出西洋棋棋盤。.程式分析:用i控制行,j來控制列,根據i+j的和的變化來控制輸出黑方格,還是白方格。.程式源代碼:#include"stdio.h"main()Iinti,j;for(i=0;i<8;i++){for(j=0;j<8;j++)if((i+j)%2==0)printf("%c%c",219,219);elseprintf("");printf("\n");【程式!0]題目:打印樓梯,同時在樓梯上方打印兩個笑臉。.程式分析:用i控制行,j來控制列,j根據i的變化來控制輸出黑方格的個數。.程式源代碼:#include"stdio.h"main(){inti,j;printf("\l\l\n");/*輸出兩個笑臉・/for(i=l;i<ll;i++)Ifor(j=l;j<=i;j++)printf("%c%c",219,219);printf("\n");)C程式開發經典實例之二【程式11]題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?.程式分析:兔子的規律為數列1,1,2,3,5,8,13,21.....程式源代碼:main(){longfl,f2;inti;fl=f2=l;for(i=l;i<=20;i++){printf("%121d%121d",fl,f2);if(i%2==0)printf("\n");/*控制輸出,每行四個・/fl=fl+⑵/・前兩個月加起來賦値給第三個月・/f2=fl+f2;/・前兩個月加起來賦値給第三個月・/【程式12]題目:判斷101-200之間有多少個素數,並輸出所有素數。1.程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。.程式源代碼:#include"math.h"main(){intm,i,k,h=O,leap=l;printf(M\nn);for(m=l01;m<=200;m++){k=sqrt(m+l);for(i=2;i<=k;i++)if(m%i==O){leap=O;break;}if(leap){printf(,,%-4d',,m);h++;if(h%10==0)printf(n\nn);}leap=l;)printf(H\nThetotalis%d”,h);【程式13]題目:打印出所有的“水仙花數”,所謂“水仙花數”是指一個三位數,其各位數字立方和等于該數本身。例如:153是一個“水仙花數”,因爲153=1的三次方+5的三次方+3的三次方。.程式分析:利用for循環控制!00-999個數,每個數分解出個位,十位,百位。.程式源代碼:main()(inti,j,k,n;printf(,Hwaterflower'numberis:");for(n=100;n<l〇00;n++)i=n/1。0;/・分解出百位・/j=n/10%!〇;/・分解出十位*/k=n%l〇;/・分解出個位*/if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)(printf("%-5d",n);))printf("\n");【程式14]題目:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。程式分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成:(1)如果這個質數恰等于〇,則說明分解質因數的過程已經結束,打印出即可。⑵如果nok,但n能被k整除,則應打印出k的値,並用n除以k的商,作為新的正整數你n,重複執行第一步。(3)如果n不能被k整除,則用k+!作為k的値,重複執行第一步。.程式源代碼:/*zhengintisdividedyinshu*/main()intn,i;printf("\npleaseinputanumber:\n");scanf("%d",&n);printf("%d=",n);for(i=2;i<=n;i++)Iwhile(n!=i){if(n%i==O){printf("%d*",i);n=n/i;}elsebreak;))printf("%d",n);}【程式15]題目:利用條件運算符的巢狀來完成此題:學習成績>=90分的同學用A表示,60-89分之間的用B表示,60分以下的用C表示。.程式分析:(a>b)?a:b這是條件運算符的基本例子。.程式源代碼:main(){intscore;chargrade;printf(Hpleaseinputascore\nn);scanf("%dn,&score);grade=score>=90?,A,:(score>=60?,B,:,C,);printf(M%dbelongsto%cM,score,grade);【程式!6]題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。.程式分析:利用輾除法。.程式源代碼:main(){inta,b,num1,num2,temp;printf(npleaseinputtwonumbers:\n");scanf("%d,%d",&numl,&num2);if(numl{temp=num1;numl=num2;num2=temp;)a=numl;b=num2;while(b!=0)/・利用輾除法,直至!Jb爲。爲止・/{temp=a%b;a=b;b=temp;)printf(ngongyueshu:%d\nn,a);printf(ngongbeishu:%d\nM,num1*num2/a);【程式17]題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。1.程式分析:利用while語句,條件爲輸入的字符不為,;#include"stdio.h"main(){chare;intIetters=0,space=0,digit=0,others=0;printf(upleaseinputsomecharacters\nH);while((c=getchar())!=,\n,){if(c>='a'&&c<="z'llc>='A'&&c<='Z')letters++;elseif(c=='')space++;elseif(c>=,0,&&c<=,9,)digit++;elseothers++;)printf(nallinall:char=%dspace=%ddigit=%dothers=%d\n",letters,space,digit,others);【程式!8]題目:求s=a+aa+aaa+aaaa+aa...a的値,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。.程式分析:關鍵是計算出每一項的値。.程式源代碼:main()inta,n,count=l;longintsn=0,tn=0;printf(*'pleaseinputaandn\n");scanf("%d,%dM,&a,&n);printf(,,a=%d,n=%d\nn,a,n);while(count<=n){tn=tn+a;sn=sn+tn;a=a*10;++count;)printf(,,a+aa+...=%ld\n,',sn);【程式19]題目:一個數如果恰好等于它的因子之和,這個數就稱為“完數”。例如6=1+2+3.編程找出1000以內的所有完數。.程式分析:請參照程式(ー上頁程式14..程式源代碼:main()(staticintk[10];inti,j,n,s;for(j=2;j<1000;j++)(n=-l;s=j;for(i=l;i{if((j%i)==O){n++;s=s-i;k[n]=i;}if(s==O){printf("%disawanshu",j);for(i=0;iprintf("%d,",k[i]);printf("%d\n",k[n]);【程式20】題目:ー球從100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地時,共經過多少米?第10次反彈多高?.程式分析:見下面註釋.程式源代碼:main(){floatsn=100.0,hn=sn/2;intn;for(n=2;n<=1〇;n++)(sn=sn+2*hn;/・第n次落地時共經過的米數・/hn=hn/2;/・第n次反跳高度・/}printf(Mthetotalofroadis%f\n",sn);printf(nthetenthis%fmeter\nn,hn);)C程式開發經典實例之三【程式21]題目:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個,第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第!0天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。.程式分析:採取逆向思惟的方法,從后往前推斷。.程式源代碼:main()(intday,xl,x2;day=9;x2=l;while(day>0){xl=(x2+l)*2;/*第一天的桃子數是第2天桃子數加1后的2倍・/x2=xl;day—;)printf(Mthetotalis%d\n'\xl);【程式22]題目:兩個桌球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程式找出三隊賽手的名單。.程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數<反之是素數。{charij,k;/*i是a的對手,j是b的對手,k是c的對手・/for(i='x';i<='z';i++)for(j='x";j<='z';j++)!if(i!=j)for(k='x';k<='z';k++){if(i!=k&&j!=k){if(i!="x'&&k!="x'&&k!="z')printf("orderisa-%c\tb-%c\tc—%c\n",i,j,k);)}【程式23]題目:打印出如下圖案(菱形)*******1.程式分析:先把圖形分成兩部分來看待,前四行一個規律,后三行一個規律,利用雙重for循環,第一層控制行,第二層控制列。.程式源代碼:inti,j,k;for(i=0;i<=3;i++)for(j=0;j<=2-i;j++)printf("");for(k=0;k<=2*i;k++)printf("*");printf("\n");for(i=0;i<=2;i++)for(j=0;j<=i;j++)printf("");for(k=0;k<=4-2*i;k++)printf("*");printf("\n");}【程式24]題目:有一分數序列:2/1-3/2,5/3,8/5-13/8,21/13...求出這個數列的前20項之和。.程式分析:請抓住分子與分母的變化規律。.程式源代碼:main(){intn,t,number=20;floata=2,b=l,s=0;for(n=l;n<=number;n++)s=s+a/b;t=a;a=a+b;b=t;/・這部分是程式的關鍵,請讀者猜猜t的作用・/)printf("sumis%9.6f\n",s);【程式25]題目:求1+2!+3!+...+20!的和.程式分析:此程式只是把累加變成了累乘。.程式源代碼:main()(floatn,s=0,t=l;for(n=1;n<=20;n++){t*=n;s+=t;}printf("1+2!+3!...+20!=%e\n",s);}【程式26]題目:利用遞歸方法求5!。.程式分析:遞歸公式:fn=fn_l*4!.程式源代碼:#include"stdio.h"inti;intfact();for(i=0;i<5;i++)printf(u\40:%d!=%d\nn,i,fact(i));}intfact(j)intj;(intsum;if)sum=l;elsesum=j*fact(j-l);returnsum;【程式27]題目:利用遞歸函數調用模式,將所輸入的5個字符,以相反順序打印出來。.程式分析:.程式源代碼:#include"stdio.h"main()(inti=5;voidpalin(intn);printf("\40:");palin(i);printf("\n");voidpalin(n)intn;charnext;if(n<=l)(next=getchar();printf(、、〇:”);putchar(next);)else(next=getchar();palin(n-l);putchar(next);【程式28]題目:有5個人坐在ー起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最後問第一個人,他說是10歲。請問第五個人多大?1.程式分析:利用遞歸的方法,遞歸分為

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论