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

下載本文檔

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

文檔簡介

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

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

3、個鍵可以檢查錯誤和驗證是否能運行。 2 是 build ,建立一個可以運行的EXE類文件,就是把這些代碼弄成一個能運行的東西。 3 就是 run 運行,只有經(jīng)過查錯和建立才可以按運行。是不是很簡單,自己動手一遍就會)3.輸入代碼并運行(里面的代碼如下:#include<stdio.h>main()int a,b,c;a=1,b=2;c=a+b;printf("%d",c);Include 的英文意思是包含、包括,顧名思義,#include<stdio.h>就是把 stdio.h這個東西包含進去,其實 #include< >是 c 語言里的

4、一種格式,就是把什么包含進來的意思(這里是口語表達) 。stdio.h 叫做頭文件 ,什么是頭文件呢?打個比方,在 C 語言里我們要用到很多的比如開根號、乘方、階乘 n!等等數(shù)學(xué)公式函數(shù),那么就可以把這些常用的同類型的函數(shù)放到一起形成一個函數(shù)庫, 然后給它取個名字比如叫 math.h,這樣當(dāng)要用到這些函數(shù)的時候就不用自己的寫了,直接用 #include<math.h>把整個庫包含進來, 里面的函數(shù)就可以直接調(diào)用。同樣的, stdio.h 也是這樣一個庫,里面有輸入輸出函數(shù)(就是支持鍵盤輸入和屏幕輸出)可以調(diào)用。類似的還有 graphic.h 圖形函數(shù)庫, string.h 字符串函

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

6、 a 等于 1,b 等于 2。同理可知 c=a+b就是把 a+b 的結(jié)果數(shù)值賦予給 c,這樣 c 的值就是 3.print 的翻譯是打印, printf()函數(shù)實現(xiàn)的功能是輸出 (打印在屏幕上)。而 printf ()函數(shù)是屬于 stdio.h 的,這就是為什么上面要寫 #include<stdio.h>原因。int a,b,c; 定義 a,b,c 三個變量, int 是數(shù)據(jù)類型里的一種, int 是整型,就是說 a,b,c 都是整數(shù)而不能是其他類型。另外 float 浮點型,如果用 float a,b,c,那么 a,b,c 就能賦予小數(shù)值。 還有 char 字符型,比如 char

7、 a,b,,那么 a,b 只能賦予字符的值。這是因為在定義 a,b,c 變量的同時,要在計算機內(nèi)存中分配給它們空間,整數(shù)占用 2 個字節(jié)而小數(shù)占 4 個字節(jié),所以 int a 后 a 分配到的空間就是能裝下 2 個字節(jié)的東西,然后如果用 a=1.23,由于 1.23 是小數(shù)占用 4 個字節(jié)裝不下,那么這個賦值就出錯。因此, int ,float ,char 等數(shù)據(jù)類型定義的意義就在于給變量分配一個多大的內(nèi)存空間, 存儲對應(yīng)類型大小的數(shù)據(jù) (任何沒有定義數(shù)據(jù)類型的變量是不會分配內(nèi)存空間所以是不能使用的! )。來看下運行結(jié)果( print 出結(jié)果 c 的值):所以這樣就實現(xiàn)了計算a+b 賦值給 c

8、 并輸出 c 的值。數(shù)據(jù)類型 一覽(當(dāng)想要使用何種類型變量,直接用以下來定義即可):C 語言和數(shù)學(xué)語言也還是有所區(qū)別的,比如數(shù)學(xué)里判斷a 等于 b 用“ a=b?”,但是 C 語言里“ a=b?”就變成了賦值,它的等號是兩個數(shù)學(xué)等號組成“=,”所以 C 里正確的表達是“ a=b?”(不要糾結(jié)為什么要用兩個等號,這是大神們設(shè)定的),為了能讓計算機理解自己的代碼,下面來認識 C 語言有哪些 運算符 :+ 加- 減* 乘/ 除;不存在÷號,表達式里“ / ”就是除號。% 取余數(shù); 17%5 等于 2,余數(shù)是 2。> 大于< 小于>=大于等于<=小于等于!=不等于=

9、等于= 賦值,右邊值賦予左邊變量( a=a+1+2)。&& 與;(1=1)&& (1!=2),判斷兩邊都真結(jié)果為真。| 或;判斷有一邊為真結(jié)果為真。! 非;?。?=1),判斷條件的相反。? :條件運算; (2>1)?3:4,判斷為真,結(jié)果取 3,否則取 4.+自增; a+,相當(dāng)于 a=a+1。- 自減; a-,相當(dāng)于 a=a-1。其他經(jīng)歷一遍勝過深思千回,在軟件上嘗試幾遍便能熟記于心。#include<stdio.h>int main() int a,b,c,d; a=1; b=a+1; c=b*2; c+; d=c%3; printf( ps

10、:輸出“結(jié)%d果”,d);。 / return 0;寫一個能計算圓的周長和面積的C 代碼:定義三個浮點型float (含有小數(shù))變量s、l、r 。scanf()是輸入函數(shù), scan 是掃描的意思,從鍵盤掃描你的輸入,這個函數(shù)也是 stdio.h 頭文件里的一個函數(shù)。 Scanf()括號里的是參數(shù),跟 printf ()一樣,格式有所不同。 printf ( “%d”, c)表示輸出結(jié)果 c, c 的數(shù)據(jù)類型是整型( int ),用 “%d”格式。如果輸出結(jié)果是浮點型( float )則用 “%f格”式,比如 printf (“%f,” 1.23)。如果是字符型( char),用 printf

11、 (“ %c,”)s等?!?_” 類型Printf( “%_”,s);對應(yīng)數(shù)據(jù)類型格式dint,short以十進制形式輸出帶符號整數(shù)(正數(shù)不輸出符號 )o以八進制形式輸出無符號整數(shù)(不輸出前綴 0)x,X以十六進制形式輸出無符號整數(shù)(不輸出前綴 Ox)u以十進制形式輸出無符號整數(shù)ffloat,double以小數(shù)形式輸出單、雙精度實數(shù)e,E以指數(shù)形式輸出單、雙精度實數(shù)g,G以 %f 或 %e 中較短的輸出寬度輸出單、雙精度實數(shù)cchar輸出單個字符s字符串輸出字符串Scanf(“%d“,&r )比 printf (“%d“,r)多了個地址運算符 &,因為 scanf 是輸入,把數(shù)

12、據(jù)存入到 r 變量的地址空間,所以 scanf()函數(shù)統(tǒng)一要加個地址運算符。(在代碼中添加備注用 / 備注 ,本行此符號之后的都為備注,也可以用 /* 備注 */ ,兩個符號之內(nèi)的是備注,可囊括多行。 )上面代碼中:#include<stdio.h>int main()return 0;是標(biāo)準(zhǔn)主函數(shù)格式, int main()表示返回 int 型,return表示返回,返回值為 0。不必深究。float s,l,r; / 備注:面積 s,周長 l,半徑 r。scanf("%f",&r);l = 2 * 3.14159 * r;s = 3.14159 *

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

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

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

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

17、行。( 4) while 循環(huán)語句寫一個代碼, 讓你輸入一個數(shù)字, 如果你輸入的數(shù)字不大于100 則重新輸入, 否則結(jié)束。這里就用到了循環(huán), 循環(huán)必須要有判斷條件語句,循環(huán)不能是沒有結(jié)束條件的。格式:while (表達式)語句 1如果表達式為真(判斷正確) ,則執(zhí)行語句 1,直到表達式為假。代碼:#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)體,花括號

18、 里可以寫多條語句,作為一個整體一并運行。執(zhí)行的順序是,判斷 while (表達式)真假,為真則執(zhí)行循環(huán)體,執(zhí)行完畢跳回到 while (表達式)開始下一次的判斷,直到判斷為假結(jié)束循環(huán)。所以上面會不斷循環(huán)要輸入 a,直到輸入的值大于 100,表達式為假結(jié)束。另一種是 do-while語句,區(qū)別只是先執(zhí)行循環(huán)體,再判斷,直到判斷為假,while( 表達式 ) 后跟著一個分號!代碼如下:#include<stdio.h>int main()int a;doscanf( “%d”,&a); /輸入 a while(a<=100) ; /判斷是否小于等于 100,是則循環(huán),否

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

20、下一次的循環(huán):表達式 2(先判斷是否為真) > 循環(huán)體語句 > 表達式 3 ,表達式 1 會且只會運行一次, 之后的循環(huán)都不再執(zhí)行, 而且以上的表達式和循環(huán)體都可以是多個語句的組合,比如表達式 1 可以是“ a=2,b+, ”。(3,4,5 為一個循環(huán))讓我們來輸出一個星號 * 構(gòu)成的正方形:表達 1 賦值使得 i=1,j=4 ,判斷 i<=j 為真,執(zhí)行循環(huán)體 后輸出五個星號和換行,然后 i=i+1 (即 i 變成了 2,j 不變),繼續(xù)下一次的循環(huán):判斷 2<4 為真,繼續(xù)執(zhí)行循環(huán)體語句,再輸出一行星號并換行, 如此重復(fù)到 i=5 大于 j 判斷為假,結(jié)束 for

21、循環(huán),這時共執(zhí)行了 4 次循環(huán)體,打印出了 4 行星號,如上圖。事實上 for 循環(huán)里還可以套用for 循環(huán),也可以套用 while 循環(huán),前者最為常見和好用。假如要輸出3 次上面的矩形星號,那么把上面的for循環(huán)嵌入到另一個for循環(huán)中即可:這樣就把里面的for 當(dāng)成了外面 for 循環(huán)的循環(huán)體語句,按步驟執(zhí)行即可!興趣是最好的老師, 實踐是最好的證明, 如果有哪些記不住的地方, 上機寫代碼運行處結(jié)果, 讓事實來讓自己信服, 這樣不單更容易記住, 而且還能提高動手能力。如果遇到有疑問的地方, 上網(wǎng)尋找答案, 或者上機調(diào)試 (就是對代碼的執(zhí)行結(jié)果有疑問,認為可能出現(xiàn)多種結(jié)果) ,看結(jié)果是否如自

22、己所想,也是驗證和解疑的一種好辦法。問題:輸入兩個正整數(shù)m和 n,求其最大公約數(shù)解題算法 :輾轉(zhuǎn)相除法, 又名歐幾里德算法( Euclidean algorithm )乃求兩個正整數(shù)之最大公約數(shù)的算法。算法思路 :假如求 m和 n 的最大公約數(shù)( m>n),設(shè) y 為 m÷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(整除)那么最后一個除數(shù) 3 就是一開始兩個數(shù)

23、99 和 21 的最大公約數(shù),此算法可以應(yīng)用到任何兩個正整數(shù)上,這就是輾轉(zhuǎn)相處求公約數(shù)的算法。算法應(yīng)用:1、直接用scanf("%d%d", &m, &n)輸入需要求公約數(shù)的兩個正整數(shù);2、m%n的余數(shù)為c3、把 n 的值賦給 m,把余數(shù) c 的值賦給 n(除數(shù)變成被除數(shù),余數(shù)變成除數(shù))4、判斷 c 是否為 0,是則最后一個除數(shù) n(已經(jīng)賦值給 m)就是最大公約數(shù),并輸出最大公約數(shù) m即可( printf("m 和 n 的最大公約數(shù)是 :%dn",m); )。5、如果 c 不為 0,繼續(xù)執(zhí)行步驟2,直到符合步驟 4 結(jié)束。代碼:#incl

24、ude<stdio.h>int main()/*輾轉(zhuǎn)相除法求最大公約數(shù)*/int m, n, c;printf("輸入兩個正整數(shù): n");scanf("%d%d", &m, &n);c=n;while(c!=0) /*余數(shù)不為 0,繼續(xù)相除,直到余數(shù)為0 */c=m%n;m=n;n=c;printf("m和 n 的最大公約數(shù)是 :%dn",m);return 0;自定義函數(shù)下面代碼顯示 1 個錯誤, 0 個警告,雙擊錯誤提示,會在錯誤的當(dāng)行出現(xiàn)一個箭頭標(biāo)識:原來是 math.h 前把 <寫成(,在

25、printf ()后漏了分號;。在 math.h 中有一個求平方根的函數(shù) sqrt (x)用于求實數(shù) x 的平方根,比如 sqrt (1.21 )的值等于 1.1 。intmain() return0; 是代碼中僅有的一個主函數(shù),其實sqrt (), printf()都是函數(shù),只是其他的非主函數(shù)一般都是在主函數(shù)中“調(diào)用” 。也就是說可以在主函數(shù) main() 的外面自己定義一個函數(shù)如 love () ,在花括號中寫這個函數(shù)實現(xiàn)的功能,然后在 main()函數(shù)中調(diào)用自己定義的 love ()函數(shù),它就能實現(xiàn)其功能。好比 sqrt ()就是定義在 math.h 庫中的一個函數(shù),然后在主函數(shù) mai

26、n()中直接調(diào)用就可以求平方根,這里只需要調(diào)用名稱,不用管怎么實現(xiàn)的,功能實現(xiàn)只寫在定義函數(shù)的花括號 內(nèi)。自定義函數(shù)主要有三個點, 函數(shù)的入口,內(nèi)部代碼實現(xiàn),出口(返回值的輸出)。 intAnd(int a, int b)int c;c=a+b;returnc;上面是一個計算a+b 的自定義函數(shù) And() ,其中()里的int a, int b是入口,表示到時將會有兩個int 型的數(shù)進來,然后里面的代碼是實現(xiàn)a+b,最后的 return用來返回這個函數(shù)的結(jié)果值c,并且在 And 前面的 int是規(guī)定這個返回值據(jù)類型的。因此,在主函數(shù) main()中可以這樣用:main()c 的數(shù)int dd

27、=Andprintf;(3,5 );(“%d”, d);(ps:運行時不接受任何中文輸入法符號)那么輸出的 d 的值是多少呢?由于 3 和 5 都是 int 型符合 And()函數(shù)的“入口”,事實上 3 和 5 叫做實參(實際的參數(shù)),a 和 b 叫做形參(形式上的參數(shù)) ,在調(diào)用這個函數(shù)之后,會把實參的值傳遞給形參,所以 a=3,b=5 。計算之后得出 c 的值為 8,這就是 And()內(nèi)部代碼的實現(xiàn),然后通過 return 提供 int 型的返回值c,所以最終整個 And( 3,5 )的值就是 8。這樣,就可以把實現(xiàn)某個功能的代碼自定義為一個獨立的函數(shù), 然后在主函數(shù)中調(diào)用, 好處是可以多

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

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

30、加分號int c;printf("輸入兩個正整數(shù):scanf("%d%d",&m, &n);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()printf("%d n",d);return 0;int m

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

32、-2 )!。另外遞歸必須有個出口,不能無限的遞下去卻沒有歸回來,要有個終止點(具體的),比如階乘最后的2×1。用知乎作者 Memoria 的話來說就是:假設(shè)你在一個電影院,你想知道自己坐在哪一排,但是前面人很多,你懶得去數(shù)了,于是你問前一排的人你坐在哪一排?,這樣前面的人 ( 代號 A) 回答你以后,你就知道自己在哪一排了,因為只要把 A 的答案加一,就是自己所在的排了。不料A 比你還懶,他也不想數(shù),于是他也問他前面的人 B 你坐在哪一排?,這樣A 可以用和你 一模一樣的步驟知道自己所在的排。然后 B 也如法炮制。直到他們這一串人問到了最前面的一排,第一排的人告訴問問題的人 我在第一

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

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

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

36、321)【循環(huán)】1、int n;2、輸入正整數(shù) n.3、輸出 n%10(n 除以 10 的余數(shù),即 n 的個位數(shù))4、令 n=n/10. (除以 10 去掉個位,使得十位變成個位)5、回到步驟 3 循環(huán)6、直到 n 最后為 0.這樣最終輸出的就是n 的反向。數(shù)組數(shù)組名 表達式 習(xí)慣上用 a,b,c,d 來表示變量,但是如果要表示100 個變量,就太過繁瑣了,數(shù)組的使用大大方便了多個變量的定義,最重要的是數(shù)組定義的多個變量之間是有順序關(guān)系的,非常的條理清晰整齊。char a10; 定義了 10 個字符變量,但是只有一個數(shù)組名標(biāo)識符a,用 來區(qū)分各個變量。比如 int b3 定義了 3 個整型變量

37、,分別是 b0,b1,b2 ,使用上跟 a,b,c 是一樣的。 里的數(shù)字是數(shù)組的下標(biāo), 所有數(shù)組的第一個變量都是從 0 下標(biāo)開始,不是從 1 開始。int a3;a0=1,a1=2;a2=a0+a1;printf(“%d”,a2);數(shù)組的數(shù)字標(biāo)識使得同名數(shù)組的各個變量之間有了順序關(guān)系, 不再是一個個獨立的變量,這樣我可以用 for 循環(huán)來有次序的改變數(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ù)字來確認變量。注意的是 定義的時候 數(shù)組的 里面的必須是常量數(shù)字 1,2,3 ,不能是變量。如此,可以用啊 an=an-1+an-2

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論