新手學(xué)C語(yǔ)言之入門_第1頁(yè)
新手學(xué)C語(yǔ)言之入門_第2頁(yè)
新手學(xué)C語(yǔ)言之入門_第3頁(yè)
新手學(xué)C語(yǔ)言之入門_第4頁(yè)
新手學(xué)C語(yǔ)言之入門_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、學(xué)習(xí)C語(yǔ)言(新手入門)年輕的小榮子阿爾法和李世石的圍棋對(duì)弈讓我們感受到了計(jì)算機(jī)的強(qiáng)大,事實(shí)上計(jì)算不僅要靠硬件設(shè)備的支持,還需要在里面運(yùn)行代碼(很多種,包括c),這些代碼就是它的靈魂(譬如我們的思想)。介紹幾部通過(guò)在計(jì)算機(jī)里頭運(yùn)行代碼從而創(chuàng)造無(wú)限可能的電影,個(gè)人覺(jué)得不錯(cuò)的:黑客帝國(guó),超驗(yàn)駭客,創(chuàng)戰(zhàn)紀(jì),人工智能等。 正題,能編輯C語(yǔ)言的軟件非常多,比如visual c+ 6.0/7.0 ,turbo c等。理論總是離不開實(shí)踐,在要學(xué)習(xí)C語(yǔ)言理論之前先要找到屬于自己的能實(shí)現(xiàn)代碼結(jié)果的軟件。 這樣說(shuō),計(jì)算機(jī)語(yǔ)言和人的語(yǔ)言的區(qū)別在于,人通過(guò)各種發(fā)音實(shí)現(xiàn)交流,但是計(jì)算機(jī)主要是通過(guò)電流來(lái)傳達(dá)信息,所以只能用

2、0/1來(lái)表示電流擁有的兩種狀態(tài),這樣最底層的計(jì)算運(yùn)作就是通過(guò)一段長(zhǎng)長(zhǎng)的0/1代碼,通過(guò)0和1的不同組合來(lái)表示文字或者信息。C語(yǔ)言當(dāng)然不是最底層的0/1代碼,他是一個(gè)溝通的中介,比如等于號(hào)在c語(yǔ)言里就是兩個(gè)等號(hào)“=”,這樣使得我們更容易和計(jì)算機(jī)交流了,只要學(xué)會(huì)了C語(yǔ)言,它就能把我們的語(yǔ)言翻譯成計(jì)算機(jī)的語(yǔ)言。 以下內(nèi)容從簡(jiǎn)單到困難,先來(lái)學(xué)會(huì)如何運(yùn)行c語(yǔ)言代碼(用vc 6.0中文版):1.按以下步驟打開界面(以后都可以這樣打開):2.一些常用的功能鍵:(1是compile編譯的意思,就是把這些我們能看懂的符號(hào)轉(zhuǎn)換成計(jì)算機(jī)代碼,同時(shí)按這個(gè)鍵可以檢查錯(cuò)誤和驗(yàn)證是否能運(yùn)行。2是build,建立一個(gè)可以運(yùn)行

3、的EXE類文件,就是把這些代碼弄成一個(gè)能運(yùn)行的東西。3就是run運(yùn)行,只有經(jīng)過(guò)查錯(cuò)和建立才可以按運(yùn)行。是不是很簡(jiǎn)單,自己動(dòng)手一遍就會(huì))3.輸入代碼并運(yùn)行(里面的代碼如下:#include<stdio.h>main()int a,b,c;a=1,b=2;c=a+b;printf("%d",c);Include的英文意思是包含、包括,顧名思義,#include<stdio.h>就是把stdio.h這個(gè)東西包含進(jìn)去,其實(shí)#include< >是c語(yǔ)言里的一種格式,就是把什么包含進(jìn)來(lái)的意思(這里是口語(yǔ)表達(dá))。stdio.h叫做頭文件,什么是頭文件

4、呢?打個(gè)比方,在C語(yǔ)言里我們要用到很多的比如開根號(hào)、乘方、階乘n!等等數(shù)學(xué)公式函數(shù),那么就可以把這些常用的同類型的函數(shù)放到一起形成一個(gè)函數(shù)庫(kù),然后給它取個(gè)名字比如叫math.h,這樣當(dāng)要用到這些函數(shù)的時(shí)候就不用自己的寫了,直接用#include<math.h>把整個(gè)庫(kù)包含進(jìn)來(lái),里面的函數(shù)就可以直接調(diào)用。同樣的,stdio.h也是這樣一個(gè)庫(kù),里面有輸入輸出函數(shù)(就是支持鍵盤輸入和屏幕輸出)可以調(diào)用。類似的還有g(shù)raphic.h圖形函數(shù)庫(kù),string.h字符串函數(shù)庫(kù)等等,調(diào)用格式一樣的。 Main() 代碼; 是C語(yǔ)言里必須有的一個(gè)格式,main翻譯是”主要“,main函數(shù)就是主函數(shù)

5、,相當(dāng)于程序從這里入口并開始運(yùn)行。運(yùn)行的內(nèi)容就是花括號(hào)里頭的代碼。 了解#include<stdio.h> main() 的功能之后,就真正的開始代碼實(shí)現(xiàn)的部分了。 上面有一條簡(jiǎn)單的代碼:int a,b,c;a=1,b=2;c=a+b;printf("%d",c);我們每句話結(jié)束用句號(hào)“?!眮?lái)結(jié)束,C語(yǔ)言里用的是分號(hào)“;”來(lái)結(jié)束一個(gè)語(yǔ)句,上面每個(gè)語(yǔ)句后面都有一個(gè)分號(hào)。a=1 表示賦值,把等號(hào)右邊的數(shù)值賦予給左邊,賦值之后a等于1,b等于2。同理可知c=a+b就是把a(bǔ)+b的結(jié)果數(shù)值賦予給c,這樣c的值就是3.print的翻譯是打印,printf()函數(shù)實(shí)現(xiàn)的功能是

6、輸出(打印在屏幕上)。而printf()函數(shù)是屬于stdio.h的,這就是為什么上面要寫#include<stdio.h>原因。int a,b,c; 定義a,b,c三個(gè)變量,int是數(shù)據(jù)類型里的一種,int是整型,就是說(shuō)a,b,c都是整數(shù)而不能是其他類型。另外float浮點(diǎn)型,如果用float a,b,c,那么a,b,c就能賦予小數(shù)值。還有char字符型,比如char a,b,,那么a,b只能賦予字符的值。這是因?yàn)樵诙xa,b,c變量的同時(shí),要在計(jì)算機(jī)內(nèi)存中分配給它們空間,整數(shù)占用2個(gè)字節(jié)而小數(shù)占4個(gè)字節(jié),所以int a后a分配到的空間就是能裝下2個(gè)字節(jié)的東西,然后如果用a=1.2

7、3,由于1.23是小數(shù)占用4個(gè)字節(jié)裝不下,那么這個(gè)賦值就出錯(cuò)。因此,int,float,char等數(shù)據(jù)類型定義的意義就在于給變量分配一個(gè)多大的內(nèi)存空間,存儲(chǔ)對(duì)應(yīng)類型大小的數(shù)據(jù)(任何沒(méi)有定義數(shù)據(jù)類型的變量是不會(huì)分配內(nèi)存空間所以是不能使用的?。?。 來(lái)看下運(yùn)行結(jié)果(print出結(jié)果c的值):所以這樣就實(shí)現(xiàn)了計(jì)算a+b賦值給c并輸出c的值。數(shù)據(jù)類型一覽(當(dāng)想要使用何種類型變量,直接用以下來(lái)定義即可):C語(yǔ)言和數(shù)學(xué)語(yǔ)言也還是有所區(qū)別的,比如數(shù)學(xué)里判斷a等于b用“a=b?”,但是C語(yǔ)言里“a=b?”就變成了賦值,它的等號(hào)是兩個(gè)數(shù)學(xué)等號(hào)組成“=”,所以C里正確的表達(dá)是“a=b?”(不要糾結(jié)為什么要用兩個(gè)等號(hào)

8、,這是大神們?cè)O(shè)定的),為了能讓計(jì)算機(jī)理解自己的代碼,下面來(lái)認(rèn)識(shí)C語(yǔ)言有哪些運(yùn)算符:+加-減*乘/除;不存在÷號(hào),表達(dá)式里“/”就是除號(hào)。%取余數(shù);17%5等于2,余數(shù)是2。>大于<小于>=大于等于<=小于等于!=不等于=等于=賦值,右邊值賦予左邊變量(a=a+1+2)。&&與;(1=1)&&(1!=2),判斷兩邊都真結(jié)果為真。|或;判斷有一邊為真結(jié)果為真。!非;!(1=1),判斷條件的相反。? :條件運(yùn)算; (2>1)?3:4,判斷為真,結(jié)果取3,否則取4.+自增;a+,相當(dāng)于a=a+1。-自減;a-,相當(dāng)于a=a-1。其

9、他經(jīng)歷一遍勝過(guò)深思千回,在軟件上嘗試幾遍便能熟記于心。#include<stdio.h>int main() int a,b,c,d; a=1; b=a+1; c=b*2; c+; d=c%3; printf(“%d”,d); /ps:輸出結(jié)果d。 return 0;寫一個(gè)能計(jì)算圓的周長(zhǎng)和面積的C代碼:定義三個(gè)浮點(diǎn)型float(含有小數(shù))變量s、l、r。scanf()是輸入函數(shù),scan是掃描的意思,從鍵盤掃描你的輸入,這個(gè)函數(shù)也是stdio.h頭文件里的一個(gè)函數(shù)。Scanf()括號(hào)里的是參數(shù),跟printf()一樣,格式有所不同。printf(“%d”,c)表示輸出結(jié)果c,c的數(shù)

10、據(jù)類型是整型(int),用“%d”格式。如果輸出結(jié)果是浮點(diǎn)型(float)則用“%f”格式,比如printf(“%f”,1.23)。如果是字符型(char),用printf(“%c”,s)等?!?_”類型Printf(“%_”,s);對(duì)應(yīng)數(shù)據(jù)類型格式d int,short以十進(jìn)制形式輸出帶符號(hào)整數(shù)(正數(shù)不輸出符號(hào))o 以八進(jìn)制形式輸出無(wú)符號(hào)整數(shù)(不輸出前綴0)x,X 以十六進(jìn)制形式輸出無(wú)符號(hào)整數(shù)(不輸出前綴Ox)u 以十進(jìn)制形式輸出無(wú)符號(hào)整數(shù)f float,double以小數(shù)形式輸出單、雙精度實(shí)數(shù)e,E 以指數(shù)形式輸出單、雙精度實(shí)數(shù)g,G 以%f或%e中較短的輸出寬度輸出單、雙精度實(shí)數(shù)c ch

11、ar輸出單個(gè)字符s 字符串輸出字符串Scanf(“%d“,&r)比printf(“%d“,r)多了個(gè)地址運(yùn)算符&,因?yàn)閟canf是輸入,把數(shù)據(jù)存入到r變量的地址空間,所以scanf()函數(shù)統(tǒng)一要加個(gè)地址運(yùn)算符。 (在代碼中添加備注用/備注,本行此符號(hào)之后的都為備注,也可以用/*備注*/,兩個(gè)符號(hào)之內(nèi)的是備注,可囊括多行。)上面代碼中:#include<stdio.h>int main()return 0;是標(biāo)準(zhǔn)主函數(shù)格式,int main()表示返回int型,return表示返回,返回值為0。不必深究。float s,l,r; /備注:面積s,周長(zhǎng)l,半徑r。sca

12、nf("%f",&r);l = 2 * 3.14159 * r; s = 3.14159 * r * r;printf("周長(zhǎng)為:%f,面積為:%f n",l,s);相當(dāng)于一個(gè)能計(jì)算圓的周長(zhǎng)和面積的計(jì)算器,只要scanf()輸入r的值,就能printf()輸出l(周長(zhǎng))和s(面積)的值,結(jié)果圖示:可以通過(guò)輸入不同的半徑來(lái)得到其周長(zhǎng)和面積。 同理可以利用c語(yǔ)言來(lái)求得其他數(shù)學(xué)公式的結(jié)果:求y=x2+2x-3當(dāng)x取某個(gè)數(shù)時(shí)的值。代碼:int x,y;scanf("%d",&x); /這里輸入x的值。y=x*x+2*x-3;p

13、rintf("輸出結(jié)果y:%d",y); 對(duì)于這樣的函數(shù)式: x*x+2*x-3 (0<x<10)Y= x+2 (x>=10)要用到條件語(yǔ)句。(1)if語(yǔ)句if(表達(dá)式) 語(yǔ)句1;else語(yǔ)句2;(2)if語(yǔ)句的嵌套If(表達(dá)式1)語(yǔ)句1;/語(yǔ)句1也可以嵌套if語(yǔ)句。else if(表達(dá)式2) 語(yǔ)句2-1;else語(yǔ)句2-2;/這樣的嵌套可以多重.if()里的表達(dá)式如果正確則為真,執(zhí)行緊接著的語(yǔ)句1,否則執(zhí)行else下面的語(yǔ)句2。因此上面數(shù)學(xué)函數(shù)式的代碼:#include<stdio.h>int main()int x,y;scanf(&quo

14、t;%d",&x); /scanf輸入x的值。if(x>0 && x<10) /x>0和x<10是與的關(guān)系,若同時(shí)為真則結(jié)果為真。y=x*x+2*x-3; elseif(x>=10)y=x+2;printf("輸出結(jié)果y:%d",y); /雙引號(hào)里的文字原樣輸出,%d輸出為y的值。return 0;ps:if()里的表達(dá)式常用到邏輯表達(dá)式“與或非”。(3)switch語(yǔ)句switch(表達(dá)式)case 常量1: 語(yǔ)句1case 常量2: 語(yǔ)句2case 常量3: 語(yǔ)句3case 常量.: 語(yǔ)句.case 常量n

15、: 語(yǔ)句ndefault :語(yǔ)句n+1 switch是匹配的意思,就是用表達(dá)式的值從常量1開始比較是否相等,如果相等,從相等的那條語(yǔ)句開始執(zhí)行,到default的語(yǔ)句結(jié)束。如果想執(zhí)行完這一句就結(jié)束,可以在其后加上break;語(yǔ)句來(lái)打斷跳出switch。下面是輸入小明同學(xué)的分?jǐn)?shù)判斷他的成績(jī)級(jí)別的代碼:假如小明的成績(jī)是a=76,那么十位數(shù)i=7,利用switch函數(shù)匹配,case 7符合,執(zhí)行之后的printf(“C n”)語(yǔ)句,又因?yàn)閎reak;語(yǔ)句打斷,所以不再執(zhí)行之后的case,直接跳出switch() 。如果是59到0,都只有一條語(yǔ)句可執(zhí)行。(4)while循環(huán)語(yǔ)句寫一個(gè)代碼,讓你輸入一個(gè)

16、數(shù)字,如果你輸入的數(shù)字不大于100則重新輸入,否則結(jié)束。這里就用到了循環(huán),循環(huán)必須要有判斷條件語(yǔ)句,循環(huán)不能是沒(méi)有結(jié)束條件的。格式:while(表達(dá)式)語(yǔ)句1如果表達(dá)式為真(判斷正確),則執(zhí)行語(yǔ)句1,直到表達(dá)式為假。代碼:#include<stdio.h>int main() int a; scanf(“%d”,&a); /輸入數(shù)字a。 while(a<=100) /判斷是否小于等于100,是則循環(huán),否則結(jié)束。 scanf(“%d”,&a); /重新輸入areturn 0;紅色部分是循環(huán)體,花括號(hào) 里可以寫多條語(yǔ)句,作為一個(gè)整體一并運(yùn)行。執(zhí)行的順序是,判斷wh

17、ile(表達(dá)式)真假,為真則執(zhí)行循環(huán)體,執(zhí)行完畢跳回到while(表達(dá)式)開始下一次的判斷,直到判斷為假結(jié)束循環(huán)。所以上面會(huì)不斷循環(huán)要輸入a,直到輸入的值大于100,表達(dá)式為假結(jié)束。 另一種是do-while語(yǔ)句,區(qū)別只是先執(zhí)行循環(huán)體,再判斷,直到判斷為假,while(表達(dá)式)后跟著一個(gè)分號(hào)!代碼如下:#include<stdio.h>int main() int a; do scanf(“%d”,&a); /輸入a while(a<=100); /判斷是否小于等于100,是則循環(huán),否則結(jié)束。return 0;(5)for循環(huán)語(yǔ)句for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

18、;循環(huán)體語(yǔ)句實(shí)例: 以上加入了一個(gè)for循環(huán)(/* 多行備注 */),表達(dá)式1 “a=1” 是for循環(huán)的入口,是進(jìn)入for循環(huán)第一個(gè)運(yùn)行的語(yǔ)句,而且只運(yùn)行一次。 表達(dá)式1之后就到表達(dá)式2,表達(dá)式2 “a>b”后面雖然沒(méi)有問(wèn)號(hào),但是它是一個(gè)判斷語(yǔ)句,就像if語(yǔ)句或者while語(yǔ)句的判斷表達(dá)式一樣,在這里如果a>b判斷為真,則繼續(xù)執(zhí)行循環(huán)體語(yǔ)句,否則結(jié)束跳出for循環(huán)。 如果表達(dá)式2為真,接下來(lái)執(zhí)行循環(huán)體語(yǔ)句,再接下來(lái)是表達(dá)式3,然后開始下一次的循環(huán):表達(dá)式2(先判斷是否為真)> 循環(huán)體語(yǔ)句 > 表達(dá)式3 ,表達(dá)式1會(huì)且只會(huì)運(yùn)行一次,之后的循環(huán)都不再執(zhí)行,而且以上的表達(dá)式

19、和循環(huán)體都可以是多個(gè)語(yǔ)句的組合,比如表達(dá)式1可以是“a=2,b+,”。(3,4,5為一個(gè)循環(huán))讓我們來(lái)輸出一個(gè)星號(hào)*構(gòu)成的正方形:表達(dá)1賦值使得i=1,j=4,判斷i<=j為真,執(zhí)行循環(huán)體后輸出五個(gè)星號(hào)和換行,然后i=i+1(即i變成了2,j不變),繼續(xù)下一次的循環(huán):判斷2<4為真,繼續(xù)執(zhí)行循環(huán)體語(yǔ)句,再輸出一行星號(hào)并換行,如此重復(fù)到i=5大于j判斷為假,結(jié)束for循環(huán),這時(shí)共執(zhí)行了4次循環(huán)體,打印出了4行星號(hào),如上圖。事實(shí)上for循環(huán)里還可以套用for循環(huán),也可以套用while循環(huán),前者最為常見(jiàn)和好用。 假如要輸出3次上面的矩形星號(hào),那么把上面的for循環(huán)嵌入到另一個(gè)for循環(huán)中

20、即可:這樣就把里面的for當(dāng)成了外面for循環(huán)的循環(huán)體語(yǔ)句,按步驟執(zhí)行即可!興趣是最好的老師,實(shí)踐是最好的證明,如果有哪些記不住的地方,上機(jī)寫代碼運(yùn)行處結(jié)果,讓事實(shí)來(lái)讓自己信服,這樣不單更容易記住,而且還能提高動(dòng)手能力。 如果遇到有疑問(wèn)的地方,上網(wǎng)尋找答案,或者上機(jī)調(diào)試(就是對(duì)代碼的執(zhí)行結(jié)果有疑問(wèn),認(rèn)為可能出現(xiàn)多種結(jié)果),看結(jié)果是否如自己所想,也是驗(yàn)證和解疑的一種好辦法。問(wèn)題:輸入兩個(gè)正整數(shù)m和n,求其最大公約數(shù)解題算法:輾轉(zhuǎn)相除法, 又名歐幾里德算法(Euclidean algorithm)乃求兩個(gè)正整數(shù)之最大公約數(shù)的算法。算法思路:假如求m和n的最大公約數(shù)(m>n),設(shè)y為m

21、7;n的余數(shù),繼續(xù)用除數(shù)n除以余數(shù)y,直到余數(shù)為0。比如求99和21的最大公約數(shù),有:99÷21余1521÷15余6(這里的被除數(shù)和除數(shù)分別是上面的除數(shù)和余數(shù),相當(dāng)于后移一位)15÷6余36÷3余0(整除)那么最后一個(gè)除數(shù)3就是一開始兩個(gè)數(shù)99和21的最大公約數(shù),此算法可以應(yīng)用到任何兩個(gè)正整數(shù)上,這就是輾轉(zhuǎn)相處求公約數(shù)的算法。算法應(yīng)用:1、直接用scanf("%d%d", &m, &n) 輸入需要求公約數(shù)的兩個(gè)正整數(shù);2、m%n的余數(shù)為c3、把n的值賦給m,把余數(shù)c的值賦給n(除數(shù)變成被除數(shù),余數(shù)變成除數(shù))4、判斷c是

22、否為0,是則最后一個(gè)除數(shù)n(已經(jīng)賦值給m)就是最大公約數(shù),并輸出最大公約數(shù)m即可(printf("m和n的最大公約數(shù)是:%dn",m);)。5、如果c不為0,繼續(xù)執(zhí)行步驟2,直到符合步驟4結(jié)束。代碼:#include<stdio.h> int main() /* 輾轉(zhuǎn)相除法求最大公約數(shù) */ int m, n, c; printf("輸入兩個(gè)正整數(shù):n"); scanf("%d%d", &m, &n); c=n; while(c!=0) /* 余數(shù)不為0,繼續(xù)相除,直到余數(shù)為0 */ c=m%n;m=n;

23、n=c; printf("m和n的最大公約數(shù)是:%dn",m); return 0; 自定義函數(shù) 下面代碼顯示1個(gè)錯(cuò)誤,0個(gè)警告,雙擊錯(cuò)誤提示,會(huì)在錯(cuò)誤的當(dāng)行出現(xiàn)一個(gè)箭頭標(biāo)識(shí):原來(lái)是math.h前把<寫成(,在printf()后漏了分號(hào);。在math.h中有一個(gè)求平方根的函數(shù)sqrt(x)用于求實(shí)數(shù)x的平方根,比如sqrt(1.21)的值等于1.1。int main() return 0;是代碼中僅有的一個(gè)主函數(shù),其實(shí)sqrt(),printf()都是函數(shù),只是其他的非主函數(shù)一般都是在主函數(shù)中“調(diào)用”。也就是說(shuō)可以在主函數(shù)main()的外面自己定義一個(gè)函數(shù)如love(

24、),在花括號(hào)中寫這個(gè)函數(shù)實(shí)現(xiàn)的功能,然后在main()函數(shù)中調(diào)用自己定義的love()函數(shù),它就能實(shí)現(xiàn)其功能。好比sqrt()就是定義在math.h庫(kù)中的一個(gè)函數(shù),然后在主函數(shù)main()中直接調(diào)用就可以求平方根,這里只需要調(diào)用名稱,不用管怎么實(shí)現(xiàn)的,功能實(shí)現(xiàn)只寫在定義函數(shù)的花括號(hào)內(nèi)。 自定義函數(shù)主要有三個(gè)點(diǎn),函數(shù)的入口,內(nèi)部代碼實(shí)現(xiàn),出口(返回值的輸出)。int And(int a, int b) int c; c=a+b; return c;上面是一個(gè)計(jì)算a+b的自定義函數(shù)And(),其中()里的int a, int b是入口,表示到時(shí)將會(huì)有兩個(gè)int型的數(shù)進(jìn)來(lái),然后里面的代碼是實(shí)現(xiàn)a+b

25、,最后的return用來(lái)返回這個(gè)函數(shù)的結(jié)果值c,并且在And前面的int是規(guī)定這個(gè)返回值c的數(shù)據(jù)類型的。 因此,在主函數(shù)main()中可以這樣用:main() int d; d=And(3,5); printf(“%d”,d); (ps:運(yùn)行時(shí)不接受任何中文輸入法符號(hào))那么輸出的d的值是多少呢?由于3和5都是int型符合And()函數(shù)的“入口”,事實(shí)上3和5叫做實(shí)參(實(shí)際的參數(shù)),a和b叫做形參(形式上的參數(shù)),在調(diào)用這個(gè)函數(shù)之后,會(huì)把實(shí)參的值傳遞給形參,所以a=3,b=5。計(jì)算之后得出c的值為8,這就是And()內(nèi)部代碼的實(shí)現(xiàn),然后通過(guò)return提供int型的返回值c,所以最終整個(gè)And(

26、3,5)的值就是8。這樣,就可以把實(shí)現(xiàn)某個(gè)功能的代碼自定義為一個(gè)獨(dú)立的函數(shù),然后在主函數(shù)中調(diào)用,好處是可以多次調(diào)用,而且調(diào)用只需要寫一次調(diào)用的函數(shù)名和寫入實(shí)參,簡(jiǎn)便許多。 另外自定義函數(shù)的函數(shù)名可以自己隨便起,但是不能使用中文等,只能是標(biāo)識(shí)符,大小寫有別,不能跟int,for這些關(guān)鍵字相同,標(biāo)識(shí)符由字母,數(shù)字,下劃線組合而成,不能以數(shù)字開頭。一般使用英語(yǔ)單詞或簡(jiǎn)稱比較好記。下面用自定義函數(shù)實(shí)現(xiàn)a+b:截圖自定義函數(shù)一般寫在main函數(shù)后面或者放到其他地方,然后把定義函數(shù)的名稱那一行照搬到main()函數(shù)的前面加個(gè)分號(hào)進(jìn)行“聲明”,聲明之后的自定義函數(shù)才能在main()函數(shù)中合法被調(diào)用。所以,自

27、定義函數(shù)就這樣,根據(jù)需要,自己設(shè)定返回值的類型,自己設(shè)定函數(shù)名,自己設(shè)定有多少個(gè)形參和各個(gè)形參的類型,函數(shù)里就像main()里一樣實(shí)現(xiàn)各種功能,然后return后寫上想返回的值,返回值可以是一個(gè)數(shù)字如10,可以是一個(gè)存在的變量如c,也可以是一個(gè)表達(dá)式如(2*c+a),以此返回值作為整個(gè)定義函數(shù)的結(jié)果。把上一節(jié)求最大公約數(shù)的解法寫成一個(gè)自定義函數(shù),返回值類型是int,取函數(shù)名為gcd,入口有兩個(gè)形參設(shè)為(int m,int n),所以聲明部分為:int gcd(int m,int n); /這里加分號(hào)(定義過(guò)形參m,n后在函數(shù)內(nèi)部就不用重復(fù)定義了,直接用,其他沒(méi)有定義的如果需要必須定義。)定義函

28、數(shù)為:int gcd(int m,int n) /這里不能加分號(hào) int c; printf("輸入兩個(gè)正整數(shù):n"); scanf("%d%d", &m, &n); /這一句去掉,通過(guò)入口傳遞進(jìn)形參m和n的值c=n; while(c!=0) /* 余數(shù)不為0,繼續(xù)相除,直到余數(shù)為0 */ c=m%n;m=n; n=c; return m;主函數(shù)為:int main() /主函數(shù) int a,b,d;scanf("%d%d", &a, &b); d=gcd(a,b); /調(diào)用定義的函數(shù)gcd()prin

29、tf("%d n",d); return 0; 有興趣可以寫幾個(gè)自定義函數(shù):分別求最大公約數(shù),a+b,求1+2+3+n,然后在同一個(gè)主函數(shù)中調(diào)用它們。自定義函數(shù)與遞歸: 遞歸,顧名思義就是傳遞過(guò)去,然后歸來(lái)。比如階乘5!,傳遞過(guò)去成為5×4!,再傳遞過(guò)去成為5×4×3!直到變成5×4×3×2×1!之后,再倒過(guò)來(lái)歸回來(lái),因?yàn)?是直接已知的,然后歸來(lái)乘以2,再歸來(lái)乘以3遞歸的前提條件是下一步的形式跟原來(lái)的是一致的,比如n!變成n×(n-1)! ,(n-1)!變成(n-1)×(n-2)!。另

30、外遞歸必須有個(gè)出口,不能無(wú)限的遞下去卻沒(méi)有歸回來(lái),要有個(gè)終止點(diǎn)(具體的),比如階乘最后的2×1。 用知乎作者M(jìn)emoria的話來(lái)說(shuō)就是:假設(shè)你在一個(gè)電影院,你想知道自己坐在哪一排,但是前面人很多,你懶得去數(shù)了,于是你問(wèn)前一排的人你坐在哪一排?,這樣前面的人 (代號(hào) A) 回答你以后,你就知道自己在哪一排了,因?yàn)橹灰?A 的答案加一,就是自己所在的排了。不料 A 比你還懶,他也不想數(shù),于是他也問(wèn)他前面的人 B你坐在哪一排?,這樣 A 可以用和你一模一樣的步驟知道自己所在的排。然后 B 也如法炮制。直到他們這一串人問(wèn)到了最前面的一排,第一排的人告訴問(wèn)問(wèn)題的人我在第一排。最后大家就都知道

31、自己在哪一排了。 就是這樣,以同樣的形式向前傳遞問(wèn)題,到第一排有具體的答案后向后一層層返回答案。這里的第一排就是遞歸的出口。int Digui(int i) /求i的階乘,返回值為i!int m = 0;if (0 = i)return (1);elsem = i * Digui(i-1);return m; (ps:也可以用單詞來(lái)做變量,比如int sum,number;)假如輸入實(shí)參i的值為4,不等于0,執(zhí)行else之后語(yǔ)句m = i * Digui(i-1),這樣就變成了求4*Digui(3),調(diào)用了自身Digui(3),然后Digui(3)又變成了3* Digui(2),直到參數(shù)等于0

32、,執(zhí)行if之后的return 1,不再調(diào)用自身函數(shù),最終計(jì)算出4*3*2*1。遞歸的好處顯而易見(jiàn):變化成一個(gè)跟自身形式相同但是更加簡(jiǎn)單的問(wèn)題,從而可以再利用自身求解,直到這個(gè)問(wèn)題最終變成一個(gè)具體的值,然后再逆推回來(lái)得到結(jié)果。 遞歸的基本思想無(wú)非就是把規(guī)模大的問(wèn)題轉(zhuǎn)化為規(guī)模小的相似的子問(wèn)題來(lái)解決。另外遞歸跟循環(huán)有些相似,計(jì)算的方向剛好相反。有興趣可以上各大高校acm、oj題庫(kù)做題(網(wǎng)搜oj):題庫(kù):選ID1000題進(jìn)去可以看到問(wèn)題的描述:按summit鍵提交自己的代碼:然后看到系統(tǒng)的判斷(通過(guò)與否):(分別給出所提交題的代碼類型,運(yùn)行時(shí)間,代碼量和提交時(shí)間)水題:一、題目要求:求具有abcd=(

33、ab+cd)2 性質(zhì)的4位數(shù)。編寫一個(gè)程序求出具有所有這樣性質(zhì)的4位數(shù)。示例:3025 這個(gè)數(shù)字是 (30 + 25) 的平方輸入要求:無(wú)輸入輸出要求:輸出所有的具有所有這樣性質(zhì)的4位數(shù)。提示:設(shè)abcd四個(gè)數(shù),變成4位數(shù)是a*1000+b*100+c*10+d。 幾層循環(huán),a從19,b、c、d從0到9。二、題目要求:階梯式打印出九九乘法表:提示:用嵌套的for循環(huán),外層for決定輸出幾個(gè)等式,內(nèi)層的for決定當(dāng)行的具體內(nèi)容。三、題目要求:輸入任意一個(gè)正整數(shù),將其各位數(shù)字反序輸出(例如輸入123,輸出321)【循環(huán)】1、int n;2、輸入正整數(shù)n.3、輸出n%10(n除以10的余數(shù),即n的個(gè)

34、位數(shù))4、令n=n/10.(除以10去掉個(gè)位,使得十位變成個(gè)位)5、回到步驟3循環(huán)6、直到n最后為0.這樣最終輸出的就是n的反向。數(shù)組 數(shù)組名表達(dá)式 習(xí)慣上用a,b,c,d來(lái)表示變量,但是如果要表示100個(gè)變量,就太過(guò)繁瑣了,數(shù)組的使用大大方便了多個(gè)變量的定義,最重要的是數(shù)組定義的多個(gè)變量之間是有順序關(guān)系的,非常的條理清晰整齊。char a10;定義了10個(gè)字符變量,但是只有一個(gè)數(shù)組名標(biāo)識(shí)符a,用來(lái)區(qū)分各個(gè)變量。比如int b3定義了3個(gè)整型變量,分別是b0,b1,b2,使用上跟a,b,c是一樣的。里的數(shù)字是數(shù)組的下標(biāo),所有數(shù)組的第一個(gè)變量都是從0下標(biāo)開始,不是從1開始。int a3;a0=1,a1=2;a2=a0+a1;printf(“%d”,a2);數(shù)組的數(shù)字標(biāo)識(shí)使得同名數(shù)組的各個(gè)變量之間有了順序關(guān)系,不再是一個(gè)個(gè)獨(dú)立的變量,這樣我可以用for循環(huán)來(lái)有次序的改變數(shù)組變量的值:int i;int a10;for(i=0;i<=9;i+) ai=i+1;那么for循環(huán)之后,a0=0+1=1,a1=2,a2=3直接用下標(biāo)數(shù)字來(lái)確認(rèn)變量。注意的是定義的時(shí)候數(shù)組的里面的必須是常量數(shù)字1,2,3,不能是變量。如此

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論