C語(yǔ)言課件:第8章 數(shù)組_第1頁(yè)
C語(yǔ)言課件:第8章 數(shù)組_第2頁(yè)
C語(yǔ)言課件:第8章 數(shù)組_第3頁(yè)
C語(yǔ)言課件:第8章 數(shù)組_第4頁(yè)
C語(yǔ)言課件:第8章 數(shù)組_第5頁(yè)
已閱讀5頁(yè),還剩67頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第8章數(shù)組本章要點(diǎn)數(shù)組的由來(lái)一維數(shù)組數(shù)組的初始化多維數(shù)組常量數(shù)組2例子:計(jì)算10個(gè)同學(xué)的成績(jī):計(jì)算平均成績(jī)、輸出低于平均成績(jī)的同學(xué)成績(jī)。#include void main() float grade1,grade2,grade3, grade10; /*定義10個(gè)變量*/ float average; scanf(“%f”,&grade1); /*輸入10個(gè)數(shù)據(jù)*/ scanf(“%f”,&grade2); scanf(“%f”,&grade10); average=(grade1+grade2+grade10)/10; /*求平均值*/ /*打印低于平均成績(jī)的同學(xué)成績(jī)*/ if (gra

2、de1average) printf(“%fn”,grade1); if (grade2average) printf(“%fn”,grade2); if (grade10average) printf(“%fn”,grade10); 數(shù)據(jù)類(lèi)型相同的若干個(gè)數(shù)#include void main() float grade10; /*定義一個(gè)實(shí)型數(shù)組存放10個(gè)成績(jī)*/ float average; int i; for (i=0;i10;i+) /*輸入10個(gè)數(shù)據(jù)*/ scanf(%f,&gradei); for(i=1,average=0;i10;i+) /*求平均值*/ average=av

3、erage+gradei; average=average/10; for (i=0;i10;i+) /*打印低于平均成績(jī)的同學(xué)成績(jī)*/ if (gradeiaverage) printf(“grade=%d=%fn”,i+1,gradei); 從上面兩個(gè)例子的比較中,我們可以看到用數(shù)組解決這類(lèi)問(wèn)題:程序簡(jiǎn)潔、思路清楚明了。這就是數(shù)組帶給我們的好處。標(biāo)量與聚合變量標(biāo)量(scalar):具有保存單一數(shù)據(jù)項(xiàng)能力的變量。C語(yǔ)言也支持聚合(aggregate)變量,這類(lèi)變量可以存儲(chǔ)數(shù)值的集合。C語(yǔ)言中有兩種常用的聚合類(lèi)型:數(shù)組(array)和結(jié)構(gòu)(structure) 。5一維數(shù)組數(shù)組(array)是

4、含有多個(gè)數(shù)據(jù)值的數(shù)據(jù)結(jié)構(gòu),并且每個(gè)數(shù)據(jù)值具有相同的數(shù)據(jù)類(lèi)型。這些數(shù)據(jù)值被稱(chēng)為元素(element),數(shù)組內(nèi)可以根據(jù)元素所處的位置對(duì)其進(jìn)行單獨(dú)選擇。最簡(jiǎn)單的數(shù)組類(lèi)型就是一維數(shù)組。一維數(shù)組中的元素一個(gè)接一個(gè)地編排在單獨(dú)一行(或者一列)內(nèi):6一維數(shù)組的定義一維數(shù)組的定義形式: 數(shù)據(jù)類(lèi)型 數(shù)組名常量表達(dá)式合法標(biāo)識(shí)符數(shù)組元素個(gè)數(shù),數(shù)組長(zhǎng)度數(shù)組元素的類(lèi)型2004 a0 a1 a2 a920002008內(nèi)存2036例 int a10;一批相同類(lèi)型的變量使用同一個(gè)數(shù)組名,用下標(biāo)來(lái)相互區(qū)分。一維數(shù)組為了聲明數(shù)組,需要說(shuō)明數(shù)組元素的類(lèi)型和數(shù)量:int a10;數(shù)組的元素可以是任何類(lèi)型;數(shù)組的長(zhǎng)度可以用任何(整數(shù))

5、常量表達(dá)式說(shuō)明。較好的方法是用宏來(lái)定義數(shù)組的長(zhǎng)度:#define N 10int aN;8數(shù)字訪問(wèn)利器-數(shù)組下標(biāo)為了存取特定的數(shù)組元素,可以在寫(xiě)數(shù)組名的同時(shí)在后邊加上一個(gè)用方括號(hào)圍繞的整數(shù)值。這被稱(chēng)為對(duì)數(shù)組進(jìn)行下標(biāo)(subscripting)或索引(indexing)。長(zhǎng)度為n的數(shù)組,其元素的索引是從0到 n-1。如果a 是一個(gè)長(zhǎng)為10的數(shù)組,則其元素可標(biāo)記為 a0, a1, , a9:9數(shù)字訪問(wèn)利器-數(shù)組下標(biāo)ai的表達(dá)式格式是左值,所以數(shù)組元素可以和普通變量一樣使用。a0 = 1;printf(%dn, a5);+ai;一般來(lái)說(shuō),如果一個(gè)數(shù)組所包含元素的類(lèi)型為T(mén),則數(shù)組的每個(gè)元素都可以被當(dāng)做

6、一個(gè)類(lèi)型為T(mén)的變量來(lái)對(duì)待。int a3;/a0,a1,a2可以看做3個(gè)int 型變量10數(shù)組下標(biāo)許多程序所采用for循環(huán)對(duì)數(shù)組中的每個(gè)元素執(zhí)行一些操作。下面是關(guān)于長(zhǎng)度為N的數(shù)組的一些典型操作示例:for (i = 0; i N; i+) ai = 0; /* clears a */for (i = 0; i N; i+) scanf(%d, &ai); /* reads data into a */for (i = 0; i N; i+) sum += ai; /* sums the elements of a */11數(shù)組下標(biāo)C語(yǔ)言不要求檢查下標(biāo)的范圍;當(dāng)下標(biāo)超出范圍時(shí),程序可能執(zhí)行不可預(yù)知

7、的行為。一個(gè)典型的錯(cuò)誤:忘記了對(duì)n個(gè)元素?cái)?shù)組的索引是從0到n-1,而不是從1到n。 int a10, i;for (i = 1; i = 10; i+) ai = 0;12數(shù)組下標(biāo)數(shù)組下標(biāo)可以是任何整數(shù)表達(dá)式:ai+j*10 = 0;表達(dá)式甚至可能會(huì)有副作用:i = 0;while (i N) ai+ = 0;13數(shù)組下標(biāo)當(dāng)數(shù)組下標(biāo)有副作用時(shí)一定要注意:i = 0;while (i N) ai = bi+;表達(dá)式 ai = bi+ 訪問(wèn)了 i的值并且修改了 i,結(jié)果導(dǎo)致不可預(yù)知的行為。通過(guò)從下標(biāo)中移走自增操作的方法可以很容易避免此類(lèi)問(wèn)題的發(fā)生:for (i = 0; i N; i+) ai =

8、 bi;14程序:數(shù)列反向reverse.c 程序要求用戶(hù)錄入一串?dāng)?shù),然后按反向順序輸出這些數(shù):Enter 10 numbers: 34 82 49 102 7 94 23 11 50 31In reverse order: 31 50 11 23 94 7 102 49 82 34程序在讀入數(shù)時(shí)將其存儲(chǔ)在一個(gè)數(shù)組中,然后通過(guò)數(shù)組反向開(kāi)始一個(gè)接一個(gè)地顯示出數(shù)組元素。15reverse.c/* Reverses a series of numbers */#include #define N 10int main(void) int aN, i; printf(Enter %d numbers:

9、 , N); for (i = 0; i = 0; i-) printf( %d, ai); printf(n); return 0;16數(shù)組初始化像其他變量一樣,數(shù)組也可以在聲明時(shí)獲得一個(gè)初始值。數(shù)組初始化式(array initializer)最通用的格式是一個(gè)常量表達(dá)式列表,列表用大括號(hào)括起來(lái),并且內(nèi)部數(shù)值用逗號(hào)進(jìn)行分隔:int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;17數(shù)組初始化如果初始化式比數(shù)組短,那么數(shù)組中剩余的元素賦值為0:int a10 = 1, 2, 3, 4, 5, 6;/* initial value of a is 1, 2, 3, 4

10、, 5, 6, 0, 0, 0, 0 */利用這一特性,可以很容易地給全部數(shù)組元素初始化為零:int a10 = 0;/* initial value of a is 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 */初始化式完全為空是非法的,所以要在大括號(hào)內(nèi)放上一個(gè)單獨(dú)的0。初始化式長(zhǎng)過(guò)要初始化的數(shù)組也是非法的。18數(shù)組初始化如果顯示一個(gè)初始化式,那么可以忽略掉數(shù)組的長(zhǎng)度:int a = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;編譯器利用初始化式的長(zhǎng)度來(lái)確定數(shù)組的大小。19程序:檢查數(shù)中重復(fù)出現(xiàn)的數(shù)字程序repdigit.c用來(lái)檢查數(shù)中是否有出現(xiàn)多于一次的數(shù)字

11、。用戶(hù)輸入數(shù)后,程序顯示信息Repeated digit 或者 No repeated digit:Enter a number: 28212Repeated digit數(shù)28212有一個(gè)重復(fù)的數(shù)字(2);而數(shù)9357則沒(méi)有。20程序:檢查數(shù)中重復(fù)出現(xiàn)的數(shù)字如何剝離出每一個(gè)數(shù)字?不知道用戶(hù)輸入幾位數(shù)!剝離數(shù)字可以采用除10取余數(shù),從低位開(kāi)始剝離;下次再使用除10后的商重新進(jìn)行剝離;21如何記錄下來(lái)數(shù)字出現(xiàn)與否?可以給每個(gè)數(shù)碼設(shè)置一個(gè)標(biāo)志位,出現(xiàn)過(guò)為1,否則為零。程序:檢查數(shù)中重復(fù)出現(xiàn)的數(shù)字程序采用布爾型值的數(shù)組跟蹤數(shù)中出現(xiàn)的數(shù)字。最初的時(shí)候,digit_seen中每個(gè)元素的值都為假。當(dāng)給出數(shù)n

12、時(shí),程序一次一個(gè)地檢查n的數(shù)字,并且把每次的數(shù)字存儲(chǔ)在變量digit中。如果digit_seendigit為真,那么表示 digit至少在n中出現(xiàn)了兩次。如果digit_seendigit為假,那么表示digit那么表示,因此程序會(huì)把 digit_seendigit設(shè)置為真并且繼續(xù)執(zhí)行。220000000000230123456789digit_seen10數(shù)組28212%10001000000001100000002821%10282%100110000000開(kāi)始repdigit.c/* Checks numbers for repeated digits */#include /* C99

13、 only */#include int main(void) bool digit_seen10 = false; int digit; long n; printf(Enter a number: ); scanf(%ld, &n); while (n 0) digit = n % 10; if (digit_seendigit) break; digit_seendigit = true; n /= 10; 24 if (n 0) printf(Repeated digitn); else printf(No repeated digitn); return 0;25思考:如何統(tǒng)計(jì)數(shù)字在

14、輸入的數(shù)中出現(xiàn)的次數(shù)?對(duì)數(shù)組使用sizeof運(yùn)算符運(yùn)算符sizeof可以確定數(shù)組的大小(字節(jié)數(shù))。如果數(shù)組a有10個(gè)整數(shù),那么sizeof(a)可以代表40(假設(shè)每個(gè)整數(shù)用4字節(jié)存儲(chǔ))。還可以用sizeof來(lái)計(jì)算數(shù)組元素的大小,比如a0。26對(duì)數(shù)組使用sizeof運(yùn)算符用數(shù)組的大小除以數(shù)組元素的大小可以得到數(shù)組的長(zhǎng)度: sizeof(a) / sizeof(a0)當(dāng)需要數(shù)組長(zhǎng)度時(shí),可采用上述這個(gè)表達(dá)式。數(shù)組a的清零操作可以寫(xiě)成:for (i = 0; i sizeof(a) / sizeof(a0); i+) ai = 0;數(shù)組長(zhǎng)度在日后需要改變,也不需要改變循環(huán)。27對(duì)數(shù)組使用sizeof運(yùn)

15、算符有些編譯器會(huì)對(duì)i sizeof(a) / sizeof(a0)表達(dá)式給出一條警告信息。變量 i的類(lèi)型可能是 int (有符號(hào)類(lèi)型),而 sizeof返回值的類(lèi)型是size_t (一種無(wú)符號(hào)類(lèi)型)。將有符號(hào)整數(shù)和無(wú)符號(hào)整數(shù)比較是很危險(xiǎn)的,盡管在本例中這樣做沒(méi)問(wèn)題。28對(duì)數(shù)組使用sizeof運(yùn)算符為避免這一警告,可以把 sizeof(a) / sizeof(a0) 強(qiáng)制轉(zhuǎn)化成有符號(hào)整數(shù):for (i = 0; i (int) (sizeof(a) / sizeof(a0); i+) ai = 0;定義一個(gè)宏來(lái)表示上述表達(dá)式常常是很有幫助的:#define SIZE (int) (sizeof(

16、a) / sizeof(a0)for (i = 0; i SIZE; i+) ai = 0;29程序:計(jì)算利息程序interest.c打印出一個(gè)表格,這個(gè)表格顯示了在幾年時(shí)間內(nèi)100美金投資在不同利率上的價(jià)值。用戶(hù)將輸入利率和要投資的年數(shù)。假設(shè)整合利息一年一次,表格將顯示出一年間在此輸入利率下和后邊4個(gè)更高利率下投資的價(jià)值。30程序:計(jì)算利息下面是程序運(yùn)行時(shí)的情況:Enter interest rate: 6Enter number of years: 5Years 6% 7% 8% 9% 10% 1 106.00 107.00 108.00 109.00 110.00 2 112.36 11

17、4.49 116.64 118.81 121.00 3 119.10 122.50 125.97 129.50 133.10 4 126.25 131.08 136.05 141.16 146.41 5 133.82 140.26 146.93 153.86 161.0531程序:計(jì)算利息第二行的數(shù)值要依賴(lài)于第一行的數(shù),解決方案是把第一行的數(shù)存儲(chǔ)在數(shù)組中。數(shù)組中的這些值將用于計(jì)算第二行的內(nèi)容。從第三行到最后一行可以重復(fù)這個(gè)過(guò)程。程序使用了嵌套的for語(yǔ)句。外層循環(huán)將從1計(jì)數(shù)到用戶(hù)要求的年數(shù)。內(nèi)層循環(huán)將從利率的最低值自增到最高值。32interest.c/* Prints a table of

18、compound interest */#include #define NUM_RATES (int) (sizeof(value) / sizeof(value0)#define INITIAL_BALANCE 100.00int main(void) int i, low_rate, num_years, year; double value5; printf(Enter interest rate: ); scanf(%d, &low_rate); printf(Enter number of years: ); scanf(%d, &num_years);33 printf(nYea

19、rs); for (i = 0; i NUM_RATES; i+) printf(%6d%, low_rate + i); valuei = INITIAL_BALANCE;/矩陣初始化 printf(n); for (year = 1; year = num_years; year+) printf(%3d , year); for (i = 0; i 38,交換位置原數(shù)據(jù)和序號(hào)序號(hào)12345678數(shù)據(jù)4938659776132749第一趟排序的步驟:序號(hào)12345678數(shù)據(jù)3849659776132749序號(hào)12345678數(shù)據(jù)3849659776132749序號(hào)12345678數(shù)據(jù)384

20、9659776132749序號(hào)12345678數(shù)據(jù)3849657697132749序號(hào)12345678數(shù)據(jù)3849657613972749序號(hào)12345678數(shù)據(jù)3849657613279749序號(hào)12345678數(shù)據(jù)3849657613274997經(jīng)過(guò)第一趟排序,把最大的數(shù)沉到最底了!4965, 保持不變6576, 交換位置9713, 交換位置9727, 交換位置9749, 交換位置經(jīng)過(guò)第二趟排序,實(shí)現(xiàn)了什么目的?經(jīng)過(guò)第二趟排序,把第二大的數(shù)沉到倒數(shù)第二個(gè)位置了!9749271376654938數(shù)據(jù)87654321序號(hào)3849,保持不變第一趟排序后的數(shù)據(jù)和序號(hào)第二趟排序的步驟:序號(hào)12345

21、678數(shù)據(jù)38496576132749974965, 保持不變6513, 交換位置7627, 交換位置7649, 交換位置序號(hào)12345678數(shù)據(jù)3849657613274997序號(hào)12345678數(shù)據(jù)3849657613274997序號(hào)12345678數(shù)據(jù)3849657613274997序號(hào)12345678數(shù)據(jù)3849651376274997序號(hào)12345678數(shù)據(jù)3849651327764997序號(hào)12345678數(shù)據(jù)38496513274976977697, 保持不變序號(hào)12345678數(shù)據(jù)3849651327497697觀察原數(shù)據(jù)與第一、二趟排序后的數(shù)據(jù)序號(hào)12345678數(shù)據(jù)3849

22、657613274997序號(hào)12345678數(shù)據(jù)3849651327497697序號(hào)12345678數(shù)據(jù)4938659776132749按照此法,不斷將當(dāng)前剩余數(shù)中最大者“沉底,”重復(fù)下去,最后就得到了一個(gè)從小到大的排列。數(shù)組編程實(shí)例冒泡排序從算法原理可見(jiàn),冒泡排序需要對(duì)數(shù)組掃描許多遍,每趟讓一個(gè)數(shù)“沉底”,那么要掃描多少遍? 答:N-1遍。那么每一遍都需要掃描整個(gè)數(shù)組嗎? 答:不需要。因?yàn)橐呀?jīng)沉底的元素不需要再掃描。41數(shù)組編程實(shí)例冒泡排序從實(shí)現(xiàn)來(lái)看:既然要掃描N-1遍,顯然要使用循環(huán);而在每一次掃描中,需要將相鄰元素兩兩比較,顯然這個(gè)也需要使用循環(huán);因此,需要使用兩層循環(huán)來(lái)實(shí)現(xiàn)冒泡排序。4

23、2數(shù)組編程實(shí)例冒泡排序那么循環(huán)的次數(shù)如何確定?對(duì)于外層循環(huán),顯然次數(shù)為N-1次。對(duì)于內(nèi)層循環(huán),次數(shù)為多少? 此時(shí)的思路是考慮一般化的情況:設(shè)當(dāng)前是第j次掃描(即外循環(huán)正處于j次時(shí)),那么此時(shí)已經(jīng)有j-1個(gè)元素沉底了,所以只需在剩下的N-(j-1)個(gè)元素中做相鄰兩兩比較操作,共需比較N-(j-1)-1=N-j次。43數(shù)組編程實(shí)例冒泡排序因此得到核心的循環(huán)結(jié)構(gòu)及操作描述: for(j=0;jN-1;j+) for(k=0;kk+1號(hào)元素) 交換k號(hào)元素和k+1號(hào)元素位置;注意:由于循環(huán)變量j,k是從0開(kāi)始,所以?xún)?nèi)循環(huán)結(jié)束條件為kN-j-1,或?qū)憺閗=N-j-2亦可。44完整程序冒泡排序(10個(gè)數(shù)為

24、例)void main() int a10,k,j,t; printf(輸入10個(gè)整數(shù):n); for( k = 0; k 10; k + ) scanf(%d,&a k ); /依次輸入10個(gè)整數(shù) for( j = 0; j 9; j + ) /進(jìn)行9輪排序 即n1次 for( k = 0; k a k + 1 ) t=ak; ak=ak+1; ak+1=t; /小的沉底,大的上浮 printf(排序結(jié)果:); for( k = 0; k 10; k + ) /依次輸出排序結(jié)果 printf(%dt,a k ); printf(n); 45思考:程序的改進(jìn)可以使用#define N 10這種

25、方式,使得程序可以處理任意個(gè)數(shù)的元素排序,或者在C99中使用變長(zhǎng)數(shù)組;46思考:程序的改進(jìn)程序算法本身的改進(jìn): 冒泡排序中最基本的操作是比較和交換。在某些(甚至是很多)情況下,并不需要掃描完N-1次,數(shù)組就已經(jīng)有序了(極端情況:數(shù)組一開(kāi)始就是由小到大排好的)。如果這時(shí)仍舊繼續(xù)掃描,顯然不明智。 所以,需要有一種方法,能自動(dòng)地察覺(jué)到數(shù)組已經(jīng)有序的狀態(tài)。怎么做?47思考:程序的改進(jìn)48假設(shè)當(dāng)某一次掃描完成后,數(shù)組中的所有元素都沒(méi)有交換過(guò)位置,這時(shí)就意味著數(shù)組已經(jīng)有序了!此時(shí)就可以退出,不用再進(jìn)行后續(xù)掃描了。因此,可以定義一個(gè)變量flag,在每一趟掃描之前,令其為0,在這趟掃描中一旦出現(xiàn)交換操作,那

26、么就改變其值為1。每次掃描結(jié)束后,判斷flag值還是不是0。如果是0,意味著這趟掃描壓根沒(méi)有做交換操作,所以你懂的。請(qǐng)大家仔細(xì)體會(huì)flag變量的作用。flag被稱(chēng)之為標(biāo)志變量,這種用法是很常見(jiàn)的一個(gè)編程技巧。程序代碼的改進(jìn),同學(xué)們自己完成。5個(gè)學(xué)生,5門(mén)課程,求每個(gè)學(xué)生的5門(mén)課程的平均成績(jī),求每門(mén)課程的5個(gè)同學(xué)的平均成績(jī),如何處理? int stu15,stu25,stu45;思考:求每門(mén)課程的平均成績(jī)遇到什么問(wèn)題? 二維數(shù)組問(wèn)題的提出多維數(shù)組數(shù)組可以有任意維數(shù)。下面的聲明產(chǎn)生了一個(gè)二維數(shù)組(或者按數(shù)學(xué)概念稱(chēng)為矩陣matrix):int m59;m有5行9列。數(shù)組的行和列下標(biāo)都是從0開(kāi)始索引:

27、50多維數(shù)組為了存取數(shù)組i行j列的元素,需要寫(xiě)成mij的形式。表達(dá)式mi指明了數(shù)組m的第i行,mij才是選擇了此行中的第j個(gè)元素。抵制把mij替換寫(xiě)成mi,j的誘惑。在此處,C語(yǔ)言把逗號(hào)看成是逗號(hào)運(yùn)算符,所以mi,j等同于 mj。51多維數(shù)組雖然以表格形式顯示二維數(shù)組,但是實(shí)際上它們?cè)谟?jì)算機(jī)的內(nèi)存中不是這樣存儲(chǔ)的。C語(yǔ)言是按照行主序存儲(chǔ)數(shù)組的,也就是從第0行開(kāi)始,接著第1行,如此下去。下面顯示了數(shù)組m是如何存儲(chǔ)的:52多維數(shù)組嵌套的for循環(huán)是處理多維數(shù)組的理想選擇。考慮用作單位矩陣(identity matrix)的數(shù)組的初始化問(wèn)題。一對(duì)嵌套的for循環(huán)可以很好地完成這項(xiàng)工作:#define

28、 N 10double identNN;int row, col;for (row = 0; row N; row+) for (col = 0; col N; col+) if (row = col) identrowcol = 1.0; else identrowcol = 0.0;53多維數(shù)組初始化通過(guò)嵌套一維初始化式的方法可以產(chǎn)生二維數(shù)組的初始化式:int m59 = 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1,

29、 1, 0, 1, 0, 0, 1, 1, 1;構(gòu)造高維數(shù)組的初始化式采用類(lèi)似的方法。54多維數(shù)組初始化如果初始化式不大到足以填滿(mǎn)整個(gè)多維數(shù)組,那么把數(shù)組中剩余的元素賦值為0。下面的初始化式只填滿(mǎn)了數(shù)組m的前三行;后邊的兩行將賦值為0:int m59 = 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0;55多維數(shù)組初始化如果內(nèi)層的列表不大到足以填滿(mǎn)數(shù)組的一行,那么把此行剩余的元素初始化為0:int m59 = 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1

30、, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1;56多維數(shù)組初始化甚至可以忽略掉內(nèi)層的大括號(hào):int m59 = 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1;因?yàn)橐坏┚幾g器發(fā)現(xiàn)足夠的數(shù)值填滿(mǎn)一行,它就開(kāi)始填充下一行。在多維數(shù)組中忽略掉內(nèi)層的大括號(hào)可

31、能是很危險(xiǎn)的,因?yàn)轭~外的元素(或者甚至更糟的是丟失的元素)將會(huì)影響剩下的初始化式。57多維數(shù)組初始化C99的指定初始化式對(duì)多維數(shù)組也有效。例如:可以這樣創(chuàng)建 2 2 的單位矩陣:double ident22 = 00 = 1.0, 11 = 1.0;像通常一樣,沒(méi)有指定值的元素都默認(rèn)置為0。58常量數(shù)組無(wú)論一維數(shù)組還是多維數(shù)組,可以通過(guò)把單詞const作為數(shù)組聲明開(kāi)始這種方法,將任何數(shù)組變?yōu)椤俺A俊保篶onst char hex_chars = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F;程序不應(yīng)該對(duì)聲明為const的數(shù)組進(jìn)行修改。59常量數(shù)組

32、聲明數(shù)組是const的好處:它表明程序不會(huì)改變數(shù)組。對(duì)編譯器發(fā)現(xiàn)錯(cuò)誤也很有幫助。Const的使用不僅限于數(shù)組,但用于定義數(shù)組是特別有用的。60程序:發(fā)牌程序deal.c說(shuō)明了二維數(shù)組和常量數(shù)組的用法。程序負(fù)責(zé)隨機(jī)發(fā)一副標(biāo)準(zhǔn)紙牌。標(biāo)準(zhǔn)紙牌的花色有梅花、方塊、紅桃或黑桃(clubs, diamonds, hearts, or spades) ,而且紙牌的等級(jí)有2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K或A)。61程序:發(fā)牌程序需要用戶(hù)指明手里應(yīng)該握有幾張牌:Enter number of cards in hand: 5Your hand: 7c 2s 5d as 2h

33、需要解決的問(wèn)題有:如何從一副牌中隨機(jī)抽取紙牌?如何避免兩次抽到同一張牌?62程序:發(fā)牌為了隨機(jī)抽取紙牌,可以采用一些C語(yǔ)言的庫(kù)函數(shù):time (來(lái)自于) 返回當(dāng)前的時(shí)間,且這個(gè)時(shí)間是被編碼成單獨(dú)的數(shù)。srand (來(lái)自于) 初始化C語(yǔ)言的隨機(jī)數(shù)生成器。rand (來(lái)自于) 在每次調(diào)用時(shí)會(huì)產(chǎn)生一個(gè)明顯隨機(jī)的數(shù)。通過(guò)采用運(yùn)算符%,可以標(biāo)量來(lái)自rand函數(shù)的返回值,這樣可以使得這個(gè)值落在03(為了表示牌的花色)的范圍內(nèi),或者是落在012(為了表示紙牌的等級(jí))的范圍內(nèi)。63程序:發(fā)牌程序中采用一個(gè)二維數(shù)組in_hand來(lái)跟蹤已經(jīng)選擇好的牌。數(shù)組有4行(每行表示一種紙牌的花色)和13列(每一列表示紙牌的

34、一種等級(jí))。在程序開(kāi)始時(shí),所有數(shù)組元素都將為0(假)。每次隨機(jī)抽取一張紙牌時(shí),將檢查數(shù)組in_hand的元素與此牌是否相對(duì)應(yīng),對(duì)應(yīng)就為真,不對(duì)應(yīng)則為假。如果判定結(jié)果為真,那么就需要抽取其他紙牌;如果判定結(jié)果為假,則將把數(shù)值1(真)存儲(chǔ)到與此張紙牌相對(duì)應(yīng)的數(shù)組元素中,這樣做是為了以后提醒此張紙牌已經(jīng)抽取過(guò)了。64程序:發(fā)牌一旦證實(shí)紙牌是“新”的,也就是說(shuō)還沒(méi)有選取過(guò)此張紙牌,就需要把牌的等級(jí)和花色數(shù)值翻譯成字符,然后顯示出來(lái)。為了把紙牌的等級(jí)和花色翻譯成字符格式,程序?qū)⒃O(shè)置兩個(gè)字符數(shù)組,一個(gè)用于紙牌的等級(jí),而另一個(gè)用于紙牌的花色,然后利用數(shù)對(duì)數(shù)組進(jìn)行下標(biāo)。這兩個(gè)字符數(shù)組在程序執(zhí)行期間不會(huì)發(fā)生改變,所以可以把它們聲明為const。65deal.c/* Deals a random hand of cards */#include /* C99 only */#include #include #include #define NUM_SUITS 4#define NUM_RANKS 13int main(void) bool in_handNUM_SUITSNUM_RANKS = false; int num_cards, r

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論