C語言基本教程-數(shù)組(內(nèi)含“簡易學(xué)生成績查詢系統(tǒng)”算法)_第1頁
C語言基本教程-數(shù)組(內(nèi)含“簡易學(xué)生成績查詢系統(tǒng)”算法)_第2頁
C語言基本教程-數(shù)組(內(nèi)含“簡易學(xué)生成績查詢系統(tǒng)”算法)_第3頁
C語言基本教程-數(shù)組(內(nèi)含“簡易學(xué)生成績查詢系統(tǒng)”算法)_第4頁
C語言基本教程-數(shù)組(內(nèi)含“簡易學(xué)生成績查詢系統(tǒng)”算法)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、5.1 一維數(shù)組5.2 二維數(shù)組5.3 多維數(shù)組5.4 數(shù)組的初始化5.5 應(yīng)用程序舉例數(shù)組是一個由若干同類型變量組成的集合,引用這些變量時可用同一名字。數(shù)組均由連續(xù)的存儲單元組成,最低地址對應(yīng)于數(shù)組的第一個元素,最高地址對應(yīng)于最后一個元素,數(shù)組可以是一維的,也可以是多維的。5.1 一維數(shù)組一維數(shù)組的一般說明形式如下:type-specifier var_name size;在C語言中,數(shù)組必須顯示地說明,以便編譯程序?yàn)樗鼈兎峙鋬?nèi)存空間。在上式中,類型說明符指明數(shù)組的類型,也就是數(shù)組中每一個元素個數(shù),一維數(shù)組的總字節(jié)數(shù)可按下式計算:sizeof( 類型) *數(shù)組長度 總字節(jié)數(shù)例5-1 將數(shù)字0

2、到9裝入一個整型數(shù)組。main( )int x10; /* 定義包含1 0個整型數(shù)的數(shù)組,引用為x 0 ,x 1 . . . x 9 * /int t ;for (t=0; t<10;+t) xt=t;C語言并不檢驗(yàn)數(shù)組邊界,因此,數(shù)組的兩端都有可能越界而使其它變量的數(shù)組甚至程序代碼被破壞。在需要的時候,數(shù)組的邊界檢驗(yàn)便是程序員的職責(zé)。例如,當(dāng)使用gets( )接收字符輸入時,必須確認(rèn)字符數(shù)組的長度足以存放最長的字符串。一維數(shù)組在本質(zhì)上是由同類數(shù)據(jù)構(gòu)成的表,例如,對下列數(shù)組a : char a7圖5 - 1說明了數(shù)組a在內(nèi)存中的情形,假定起始地址為1000。將一維數(shù)組傳遞給函數(shù)時,把數(shù)組

3、名作為參數(shù)直接調(diào)用函數(shù)即可,無需任何下標(biāo)。這樣,數(shù)組的第一個元素的地址將傳遞給該函數(shù)。C語言并不是將整個數(shù)組作為實(shí)參來傳遞,而是用指針來代替它。例如,下面的程序?qū)?shù)組i的第一個元素的地址傳遞給函數(shù)func1( )。main( )int i10;func1(i); /*函數(shù)調(diào)用,實(shí)參是數(shù)組名* /. . .函數(shù)若要接收一維數(shù)組的傳遞,則可以用下面的二種方法之一來說明形式參數(shù); 1) 有界數(shù)組;2) 無界數(shù)組。例如,函數(shù)func1 ( )要接收數(shù)組i可如下說明:func1(str)char str10; /* 有界數(shù)組,數(shù)組的下標(biāo)只能小于或等于傳遞數(shù)組的大小。* /. .也可說明為:func1(s

4、tr)char str ; / * 無界數(shù)組* /. .這二種說明方法的效果是等價的,它們都通知編譯程序建立一個字符指針。第一種說明使用的是標(biāo)準(zhǔn)的數(shù)組說明;后一種說明使用了改進(jìn)型的數(shù)組說明,它只是說明函數(shù)將要接收一個具有一定長度的整型數(shù)組。細(xì)想就會發(fā)現(xiàn),就函數(shù)而言,數(shù)組究竟有多長并無關(guān)緊要,因?yàn)镃語言并不進(jìn)行數(shù)組的邊界檢驗(yàn)。事實(shí)上,就編譯程序而言,下面的說明也是可行的。func1 (str);int str32;. . .因?yàn)榫幾g程序只是產(chǎn)生代碼使函數(shù)func1( )接收一個指針,并非真正產(chǎn)生一個包含3 2個元素的數(shù)組。顯然,一維數(shù)組的最普通的用法是作為字符串。在C語言中,字符串被定義為一個以

5、空字符終結(jié)的字符數(shù)組??兆址?0來標(biāo)識,它通常是不顯示的。因此,在說明字符數(shù)組時,必須比它要存放的最長字符串多一個字符。例如,假如要定義一個存放長度為1 0的字符串的數(shù)組s,可以寫成:char s11;這樣就給字符串末尾的空字符保留了空間。盡管C語言并不把字符串定義為一種數(shù)據(jù)類型,但卻允許使用字符串常量。字符串常量是由雙引號括起來的字符表。例如,下面兩個短語均為字符串常量: "hello there""this is a test"不必向字符串的末尾加空字符, C編譯程序會自動完成這一工作。 C語言支持多串操作函數(shù),最常用的有:名字功能strcpy(s

6、1 s2) 將s2拷貝到s1strcat(s1 s2) 將s 2連接到s 1的末尾strlen(s1) 返回s1的長度strcmp(s1,s2) 若s1與s2相等,返回值為若s1 < s2,返回值小于若s1 > s2,返回值大于例5 - 2說明了這些函數(shù)的用法。例5 - 2 #includemain( )char s180,s280; /*定義字符數(shù)組* /gets (s1); /*輸入字符串* /gets (s2);printf ("lengthsf: %d %dn" ,strlen(s1),strlen(s2);if (!strcmp(s1,s2)print

7、f ("the strings are equal n");strcat(s1,s2);printf ("%sn",s1);切記,當(dāng)兩個串相等時,函數(shù)strcmp( )將返回Fa l s e,因而當(dāng)測試串的等價性時,要像前例中的那樣,必須用邏輯運(yùn)算符!將測試條件取反。當(dāng)程序運(yùn)行并以“hello”和“hello”這兩個串作為輸入時,其輸出為: hellohellolengths:5 5The strings are equalhellohello5.2 二維數(shù)組C語言允許使用多維數(shù)組,最簡單的多維數(shù)組是二維數(shù)組。實(shí)際上,二維數(shù)組是以一維數(shù)組為元素構(gòu)成的數(shù)組

8、,要將d說明成大小為(10,20)的二維整型數(shù)組,可以寫成:int d1020請留心上面的說明語句, C不像其它大多數(shù)計算機(jī)語言那樣使用逗號區(qū)分下標(biāo),而是用方括號將各維下標(biāo)括起,并且,數(shù)組的二維下標(biāo)均從0計算。 與此相似,要存取數(shù)組d中下標(biāo)為( 3,5)的元素可以寫成:d 3 5 在例5 - 3中,整數(shù)到12被裝入一個二維數(shù)組。例5 - 3 main ( )int t,i,num34for (t=0; t<3; +t)for (i=0;i<4;+i)numti = (t * 4) + i + 1;在此例中, num00的值為1,num02的值為, . . . . . .,num23

9、的值為1 2??梢詫⒃摂?shù)組想象為如下表格:二維數(shù)組以行列矩陣的形式存儲。第一個下標(biāo)代表行,第二個下標(biāo)代表列,這意味著按照在內(nèi)存中的實(shí)際存儲順序訪問數(shù)組元素時,右邊的下標(biāo)比左邊的下標(biāo)的變化快一些。圖5 - 2是一個二維數(shù)組在內(nèi)存中的情形,實(shí)際上,第一下標(biāo)可以認(rèn)為是行的指針。記住,一旦數(shù)組被證明,所有的數(shù)組元素都將分配相應(yīng)的存儲空間。對于二維數(shù)組可用下列公式計算所需的內(nèi)存字節(jié)數(shù):行數(shù)×列數(shù)×類型字節(jié)數(shù)總字節(jié)數(shù)因而,假定為雙字節(jié)整型,大小為( 10,5)的整型數(shù)組將需要:10×5×2=100 字節(jié),當(dāng)二維數(shù)組用作函數(shù)的參數(shù)時,實(shí)際上傳遞的是第一個元素(如 0

10、0 )的指針。不過該函數(shù)至少得定義第二維的長度,這是因?yàn)镃編譯程序若要使得對數(shù)組的檢索正確無誤,就需要知道每一行的長度。例如,將要接收大小為( 10,10)的二維數(shù)組的函數(shù),可以說明如下:func1(x)int x 10. .第一維的長度也可指明,但沒有必要。C編譯程序?qū)瘮?shù)中的如下語句:X24處理時,需要知道二維的長度。若行長度沒定義,那么它就不可能知道第三行從哪兒開例5-4 用一個二維數(shù)組存放某一教師任教的各班學(xué)生的分?jǐn)?shù)。假定教師有三個班,每班最多有三十名學(xué)生。注意各函數(shù)存取數(shù)組的方法。 #define classes 3#define grades 30#includemain( )vo

11、id enter_grades();void disp_grades( );int get_grade( );int aclasses grades;/* 定義二維數(shù)組,每行存放一個班學(xué)生成績* / char ch;for( ; ;)do /*菜單顯示* /printf("(E)nter gradesn");printf("(R)eport gradesn");printf("(Q)uitn");ch=toupper(getchar(); /* 將鍵盤輸入字符轉(zhuǎn)換為大寫* / while(ch!='E' &&a

12、mp; ch!='R' && ch!='Q');switch(ch)case 'E':enter_grades( );break;case 'R':disp_grades(grade);break;case 'Q':exit(0);void enter_grades(a)int agrades;int t, i;for (t=0;t<CLASSES;T+)printf("class #%d:n",t+1);for(i=0; iati = get_grade(i);int g

13、et_grades(num)int num;char s80;printf("enter grade for student # %d:n" ,n u m + 1 ) ; gets(s);/ *輸入成績* /return(atoi(s);void disp_grades(g) /*顯示學(xué)生成績* /int g grades;int t,i;for(t=0; tprintf("class # %d:n" ,t + 1);for(i = 0 ; i < grades; +i)printf("grade for student #%d is %

14、dn" ,i + 1 ,gti); 我們將實(shí)際問題簡化為共有2個班,每班兩個學(xué)生,即將程序中的常量定義修改如下:#define classes 2#define grades 2運(yùn)行程序:(E)nter grades(R)eport grades(Q)uit: eclass #1:enter grade for student #1: 7 8enter grade for student #2: 8 9class #2enter grade for student #1: 9 8enter grade for student #2: 9 0(E)nter grades(R)eport

15、 grades(Q)uit: rclass #1grade for student #1 is 78grade for student #2 is 89class #2grade for student #1 is 98grade for student #2 is 90(E)nter grades(R)eport grades(Q)uit :q運(yùn)行程序,我們首先看到一個菜單,選擇“ e”輸入成績,選擇“ r”顯示成績,選擇“q”退出。atoi( )函數(shù)用于將實(shí)參字符串轉(zhuǎn)換為整型。程序設(shè)計中經(jīng)常要用到字符串?dāng)?shù)組。例如,數(shù)據(jù)庫的輸入處理程序就要將用戶輸入的命令與存在字符串?dāng)?shù)組中的有效命令相比較,

16、檢驗(yàn)其有效性??捎枚S字符數(shù)組的形式建立字符串?dāng)?shù)組,左下標(biāo)決定字符串的個數(shù),右下標(biāo)說明串的最大長度。例如,下面的語句定義了一個字符串?dāng)?shù)組,它可存放3 0個字符串,串的最大長度為8 0個字符:char str_array3080;要訪問單獨(dú)的字符串是很容易的,只需標(biāo)明左下標(biāo)就可以了。例如,下面的語句以數(shù)組str_array中的第三個字符串為參數(shù)調(diào)用函數(shù)gets( )。 gets(str_array2);該語句在功能上等價于:gets(&str_array20);但第一種形式在專業(yè)程序員編制的C語言程序中更為常見。為幫助理解字符串?dāng)?shù)組的用法,研究例5 - 5。它以一個字符串?dāng)?shù)組為基礎(chǔ)做簡單

17、的文本編輯。例5 - 5 #include#define MAX 100#define LEN 80char text MAXLEN/* 一個非常簡單的文本編輯器* /main( )register int t,i,j;for(t=0;tprintf("%d:",t);gets(textt);if(! textt0)break; /* 空行退出*/for(i = 0 ; i < t,i+) /*按行,逐個字符輸出字符串* /for(j=0; text ij;j+)putchar(text ij);putchar( 'n');該程序輸入文本行直至遇到一個

18、空行為止,而后每次一個字符地重新顯示各行。5.3 多維數(shù)組C語言允許有大于二維的數(shù)組,維數(shù)的限制(如果有的話)是由具體編譯程序決定的。多維數(shù)組的一般說明形式為:Type-specifier name abc.z;由于大量占有內(nèi)存的關(guān)系,二維或更多維數(shù)組較少使用。如前所述,當(dāng)數(shù)組定義之后,所有的數(shù)組元素都將分配到地址空間。例如,大小為( 10,6,9,4)的四維字符數(shù)組需要10×6×9×4即2160字節(jié)。如果上面的數(shù)組是兩字節(jié)整型的,則需要4320字節(jié),若該數(shù)組是雙字型的(假定每個雙字為8字節(jié))則需要34560字節(jié),存儲量隨著維數(shù)的增加呈指數(shù)增長。關(guān)于多維數(shù)組,需要

19、注意一點(diǎn):計算機(jī)要花大量時間計算數(shù)組下標(biāo),這意味著存取多維數(shù)組中的元素要比存取一維數(shù)組的元素花更多的時間。由于這些和其它原因,大量的多維數(shù)組一般采用C語言動態(tài)分配函數(shù)及指針的方法,每次對數(shù)組的一部分動態(tài)地分配存儲空間。多維數(shù)組傳遞給函數(shù)時,除第一維外,其它各維都必須說明。例如,將數(shù)組m定義成:int m4365;那么接收m的函數(shù)應(yīng)寫成:func1 (d)int d365;當(dāng)然,如果愿意,也可加上第一維的說明。5.4 數(shù)組的初始化C語言允許在說明時對全局?jǐn)?shù)組和靜態(tài)局部數(shù)組初始化,但不能對非靜態(tài)局部數(shù)組初始化。與其它變量相似,數(shù)組初始化的一般形式如下:type-specifier array_na

20、mesize1.sizen=value-list;數(shù)值表是一個由逗號分隔的常量表。這些常量的類型與類型說明相容,第一個常量存入數(shù)組的第一個單元,第二個常量存入第二個單元,等等,注意在括號“ ”后要加上分號。下列中一個1 0元素整型數(shù)組被初始化裝入數(shù)字1到10:int i10=1,2,3,4,5,6,7,8,9,10 ;這意味著i0的值為1,而i9的值為10。存放字符串的字符數(shù)組的初始化可采用如下簡化的形式:char array_namesize = "string"例如,以下代碼段將str 初始化為”hello”。char str6 = "hello"上

21、面代碼產(chǎn)生和下面代碼相同的結(jié)果:char str6='h',' e ' ,' l ' ,' l ' ,' o ' ,'o '因?yàn)镃語言中的字符串都以空( NULL)字符為終結(jié),故要確認(rèn)定義的數(shù)組足夠長以存放空字符。這就是為什么h ello只有5個字符,而str 要有6個字符長的原因。使用字符串常量時,編譯程序自動地在末尾加上空字符。多維數(shù)組初始化的方法與一維數(shù)組相同,例如,下式將sqrs初始化為從1到1 0及它們各自的平方數(shù)。int sqrs102=1,1,2,4,3,9,4,1 6 ,5,2 5

22、,6,3 6,7,4 9 ,8,6 4 ,9,8 1,1 0,1 0 0 , ;設(shè)想用數(shù)組初始化的方法建立一個如下錯誤信息表:char e112 = "read errorn"char e213 = "write errorn"char e318 = "cannot open filen"可以想象,如果用手工去計算每一條信息的字符數(shù)以確定數(shù)組的長度是何等的麻煩。利用變長數(shù)組初始化的方法可以使C自動地計算數(shù)組的長度。變長數(shù)組初始化就是使C編譯程序自動建立一個不指明長度的足夠大的數(shù)組以存放初始化數(shù)據(jù)。使用這種方法,以上信息表變?yōu)椋篶har

23、 e1 = "read errorn"char e2 = "write errorn"char e3 = "cannot open filen"給定上面的初始化,下面的語句printf("%s has length %dn" ,e2,sizeof(e2);將打印出:write errorhas length 13除了減少麻煩外,應(yīng)用變長數(shù)組初始化使程序員可以修改任何信息,而不必?fù)?dān)心隨時可能發(fā)生的計算錯誤。變長數(shù)組初始化的方法不僅僅限于一維數(shù)組。但在對多維數(shù)組初始化時,必須指明除了第一維以外其它各維的長度,以使編譯程

24、序能夠正確地檢索數(shù)組。其方法與數(shù)組形式參數(shù)的說明類似。這樣就可以建立變長表,而編譯程序自動地為它們分配存儲空間。例如,下面用變長數(shù)組初始化的方法定義數(shù)組sqrs:int sqrs 2=1,1,2,4,3,9,4,1 6,5,2 5,6,3 6,7,4 9,8,6 4,9,8 1,1 0,1 0 0 ;相對定長數(shù)組的初始化而言,這種說明的優(yōu)點(diǎn)在于可以在不改變數(shù)組各維長度的情況下,隨時增加或縮短表的長度。5.5 應(yīng)用程序舉例例5-6 為比賽選手評分。計算方法:從1 0名評委的評分中扣除一個最高分,扣除一個最低分,然后統(tǒng)計總分,并除以8,最后得到這個選手的最后得分(打分采用百分制)。 #includ

25、emain( )int score10; / * 10 個評委的成績* /float mark; /* 最后得分* /int i;int max = -1; / *最高分* /int min = 101; /*最低分* /int sum = 0; /*10個評委的總和* /for( i = 0 ; i < 10 ; i +)printf("Please Enter the Score of No. %d",i + 1 ) ; scanf("%dn",&scorei);sum = sum + scorei;for(i = 0 ; i <

26、 10 ; i+)if(scorei > max)max = scorei;for(i = 0;i < 10 ; i+)if(scorei<MIN)min = scorei;mark = ( sum - min - max ) / 8.0;printf("The mark of the player is %.1fn" ,mark);例5-7 數(shù)列排序,采用選擇法實(shí)現(xiàn)對有5個數(shù)的數(shù)列進(jìn)行排序。選擇法的算法思想是:(降序)1. 將待排序的n個數(shù)放入數(shù)組num中,即num0、num1、. . . numn-1。2. 讓num 0 與后續(xù)num1 . . . n

27、um n - 1 依次比較,保證大數(shù)在前、小數(shù)在后。此次比較,num0是數(shù)組中最大。3. 余下n - 1個元素4. num1與num 2 . . . num n - 1依次比較,大數(shù)在前、小數(shù)在后,此次num 1 是全部元素的最大。num n - 2 與num n - 1 比較,num n - 2 存大數(shù)。num n - 1 存小數(shù),比較結(jié)束,整理有序。例:待排序5個數(shù)為: 44 76 82 63 71一趟排序: 1次比較:76 44 82 63 712次比較:82 44 76 63 713次比較:82 44 76 63 714次比較:82 44 76 63 71最大#includemain(

28、 )int num5;int i,j ;int temp;num0=94; num1=76; num2=82; num3=63; num4=71;for(i=0; i<4; i+)for(j=i+1; j<5; j+)if(numi>numj)temp = numi;numi = numj;numj = temp;for(i=0; i<5; i+)printf("%4d" ,numi);printf("okn");這是一個非常簡單的排序程序,我們只需稍加擴(kuò)展就可以編制出很多功能強(qiáng)大的管理程序,如學(xué)生統(tǒng)計總分、平均排列年級名次等。例5-8 簡易學(xué)生成績查詢系統(tǒng)。圖5 - 3為學(xué)生成績登記表,下例程序完成如下功能:1) 根據(jù)輸入的學(xué)生學(xué)號,給出各次考試成績及平均成績;2) 根據(jù)輸入考試的次數(shù),打印出該次考試中每個學(xué)生的成績,并給出平均分;3) 根據(jù)學(xué)號查出學(xué)生某次考試成績;4) 錄入考試成績。#includemain( )int select;int i,j ;int score57;int average=0;int sum=0;doprintf("本程序有4項(xiàng)功能n");printf("1、根據(jù)學(xué)號查詢學(xué)生成績n");printf(

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論