C語言程序設(shè)計教程課件:數(shù)組_第1頁
C語言程序設(shè)計教程課件:數(shù)組_第2頁
C語言程序設(shè)計教程課件:數(shù)組_第3頁
C語言程序設(shè)計教程課件:數(shù)組_第4頁
C語言程序設(shè)計教程課件:數(shù)組_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)組5.1一維數(shù)組5.2二維數(shù)組5.3字符數(shù)組5.4數(shù)組與函數(shù)本章小結(jié)

5.1一維數(shù)組

【問題】從鍵盤任意輸入N個數(shù),給這些數(shù)排序,排序后得到的數(shù)如何存放?【分析】從鍵盤輸入N個數(shù)并給這些數(shù)排序很簡單,但是,排序后得到的數(shù)如何存放就比較麻煩。在我們學(xué)了數(shù)組之后,解決這個問題就會很容易。

5.1.1一維數(shù)組的定義

在C語言中,使用數(shù)組前必須先進(jìn)行數(shù)組的定義。定義一個一維數(shù)組的一般形式為:

數(shù)據(jù)類型數(shù)組名[常量表達(dá)式];

例如:

inta[6];

定義了一個一維整型數(shù)組,數(shù)組名為a,有6個元素,這6個元素分別為a[0]、a[1]、a[2]、a[3]、a[4]、a[5]。

【說明】

(1)數(shù)組名與變量的命名方法相同,用合法的標(biāo)識符表示。

(2)方括號中的“常量表達(dá)式”又稱“數(shù)組長度”,用整型常量表達(dá)式表示,可以包括常量和符號常量,但不能包括變量。

(3)數(shù)組元素的下標(biāo)從0開始,最大為元素個數(shù)減1,不能越界。

(4)同一數(shù)組中所有元素的數(shù)據(jù)類型都是相同的。

5.1.2一維數(shù)組元素的引用

在定義了數(shù)組之后,就可引用其中的數(shù)組元素。其引用形式為:

數(shù)組名[下標(biāo)]

下標(biāo)可以為整型常量、符號常量,也可以包含變量。下標(biāo)值如果為小數(shù),C語言編譯時將自動取整。

C語言中只能逐個引用數(shù)組元素,而不能一次引用整個數(shù)組。

請注意區(qū)分?jǐn)?shù)組定義和數(shù)組元素的引用,兩者從形式上看有些相似,但含義卻完全

不同。例如:inta[5];是定義一個有5個元素的整型數(shù)組,而a[3]是對下標(biāo)為3的元素的引用。數(shù)組定義是說明語句,前面有類型關(guān)鍵字,而元素引用出現(xiàn)在表達(dá)式中,前面沒

有類型關(guān)鍵字。數(shù)組定義時,方括號中是常量表達(dá)式,而元素引用時,方括號中是一般表達(dá)式。

設(shè)計程序時,通常用循環(huán)變量控制數(shù)組元素的下標(biāo),來實現(xiàn)數(shù)組元素的引用。

【例5-1】將數(shù)字1~10存入一個整型數(shù)組a中并輸出。

運行結(jié)果如圖5-1所示。圖5-1例5-1運行結(jié)果

5.1.3一維數(shù)組的基本操作

一維數(shù)組定義后,系統(tǒng)將按數(shù)組類型和元素個數(shù)開辟一組連續(xù)的存儲單元,用于依次存放每個數(shù)組元素。數(shù)組名表示該連續(xù)存儲單元的首地址。例如定義inta[10];后,系統(tǒng)將在內(nèi)存中開辟10個連續(xù)的整型存儲單元,存放10個元素,數(shù)組名a表示該連續(xù)存儲單元的首地址&a[0]。

對數(shù)組元素賦值一般有兩種方式:一種是在數(shù)組定義時就給數(shù)組元素賦以初值;另一種方式是用賦值語句或輸入語句使數(shù)組元素取得值,這在程序運行中進(jìn)行。

對一維數(shù)組元素的初始化賦值通??梢圆捎靡韵路绞竭M(jìn)行。

(1)對數(shù)組的全部元素賦初值。

例如:inta[2]={1,2};

將數(shù)組元素的初值依次放在一對花括號內(nèi),經(jīng)過上述定義及初始化之后,a[0]=1,a[1]=2。

(2)對數(shù)組的部分元素賦初值。

例如:intb[4]={2,4,6};

只給前3個元素賦初值,其余1個元素的值為0。如果數(shù)組定義時沒有進(jìn)行初始化賦值,則所有元素的值都是隨機(jī)的。

(3)對全部數(shù)組元素賦初值時,可以不指定數(shù)組的長度。

例如:inta[]={1,2,3};

(4)當(dāng)數(shù)組指定的元素個數(shù)少于初值的個數(shù)時,作語法錯誤處理。

例如:intc[3]={1,2,3,4,5};

是不合法的,因為c數(shù)組只能有3個元素,卻給了5個初始值。

5.1.4一維數(shù)組的應(yīng)用

【例5-2】利用數(shù)組計算fibonacci數(shù)列的前10個數(shù),即1,1,2,3,5,…,并按每行打印5個數(shù)的格式輸出。

運行結(jié)果如圖5-2所示。圖5-2例5-2運行結(jié)果

【例5-3】從鍵盤輸入10個數(shù),求平均數(shù)并輸出所有大于平均數(shù)的數(shù)。

運行結(jié)果如圖5-3所示。圖5-3例5-3運行結(jié)果

【例5-4】輸入一個正整數(shù)n(1<n≤10),再輸入n個整數(shù),用選擇法將它們從小到大排序后輸出。

選擇排序法的基本思路為:對于給定的一組數(shù)據(jù),每次選擇最小的數(shù)據(jù)放在數(shù)組的當(dāng)前位置,直至最大的數(shù)據(jù)結(jié)束。

運行結(jié)果如圖5-4所示。圖5-4例5-4運行結(jié)果

【例5-5】在數(shù)組中查找一個給定的數(shù)。

輸入5個整數(shù),將它們存入數(shù)組a中,再輸入1個數(shù)x,然后在數(shù)組中查找x,如果找到,輸出相應(yīng)的下標(biāo),否則,輸出“NotFound”。

運行結(jié)果如圖5-5所示。圖5-5例5-5運行結(jié)果

5.2二維數(shù)組

在實際應(yīng)用中,很多問題的數(shù)據(jù)是二維或多維陣列,如矩陣、二維表格等。C語言允許使用二維或多維數(shù)組,多維數(shù)組的元素有多個下標(biāo)。多維數(shù)組最具代表形式的是二維數(shù)組,它由數(shù)組名及表明行數(shù)和列數(shù)的下標(biāo)構(gòu)成,即數(shù)組元素有兩個下標(biāo)。

5.2.1二維數(shù)組的定義與初始化

二維數(shù)組定義的一般形式為:

數(shù)據(jù)類型數(shù)組名[行數(shù)][列數(shù)];

例如:

intb[1][2]; /*定義b為1行2列的整型數(shù)組*/

chara[3][4]; /*定義a為3行4列的字符型數(shù)組*/

floatd[5][6]; /*定義d為5行6列的實型數(shù)組*/

數(shù)組b有1*2=2個元素,數(shù)組a有3*4=12個元素,數(shù)組d有5*6=30個元素。與一維數(shù)組定義中元素個數(shù)必須為常量表達(dá)式相同,二維數(shù)組定義中的行數(shù)和列數(shù)也必須為常量表達(dá)式,不能包含變量。

像一維數(shù)組元素一樣,二維數(shù)組元素的行下標(biāo)和列下標(biāo)均從0開始。例如,上面定義的數(shù)組a有3行4列,其元素有:

實質(zhì)上,二維數(shù)組可以看做由一維數(shù)組嵌套而成,即當(dāng)一維數(shù)組的每個元素又是一個類型相同的一維數(shù)組時,就組成了二維數(shù)組。例如,inta[3][4]可以看成:一維數(shù)組inta[3]的三個元素a[0]、a[1]、a[2]又都是有四個元素的一維數(shù)組(行數(shù)組),a[0]、a[1]、a[2]分別是它們的數(shù)組名。數(shù)組a[0]的元素有a[0][0]、a[0][1]、a[0][2]和a[0][3];數(shù)組a[1]的元素有a[1][0]、a[1][1]、a[1][2]和a[1][3];數(shù)組a[2]的元素有a[2][0]、a[2][1]、a[2][2]和a[2][3]。

同樣,三維數(shù)組可以看成是一維數(shù)組的各元素由二維數(shù)組構(gòu)成。

5.2.2二維數(shù)組元素的引用

二維數(shù)組元素的引用形式如下:

數(shù)組名[行下標(biāo)][列下標(biāo)]

下標(biāo)用來標(biāo)識數(shù)組元素在數(shù)組中的位置。下標(biāo)可以是整型常數(shù)、有值變量或表達(dá)式,如:s[2][n+3],a[i][j]等,但不能寫成s[2,1+3],a[i,j]的形式。與一維數(shù)組相似,二維數(shù)組也只能逐個訪問數(shù)組元素,而不能訪問整體數(shù)組、整行或整列。程序設(shè)計時通常用兩重循環(huán)的循環(huán)變量分別控制數(shù)組元素的行下標(biāo)和列下標(biāo),實現(xiàn)對二維數(shù)組元素的引用。

【例5-6】定義1個3*2的二維數(shù)組a,數(shù)組元素的值由下式給出,按矩陣的形式輸出a:

運行結(jié)果如圖5-6所示。圖5-6例5-6運行結(jié)果

5.2.3二維數(shù)組的基本操作

1.二維數(shù)組的存儲

二維數(shù)組定義后,系統(tǒng)也將為二維數(shù)組按其類型和元素個數(shù)開辟連續(xù)的存儲單元。由于二維數(shù)組有行列結(jié)構(gòu),而內(nèi)存單元是順序(線性)排列的,因此必須按一定的規(guī)律存放二維數(shù)組的元素。C語言規(guī)定:二維數(shù)組元素按行存儲,即一行接一行存儲。例如,整型數(shù)組a[3][2]共有6個整型存儲單元。

2.二維數(shù)組的初始化

二維數(shù)組可以在數(shù)組定義時,給數(shù)組元素賦以初值。操作方法如下:

(1)分行給二維數(shù)組賦初值。

(2)按存儲順序連續(xù)賦初值。

(3)分行對部分元素賦初值,未賦初值的元素自動取0值(對實數(shù)是0.0,對字符型是'\0')。

(4)按存儲順序?qū)θ炕虿糠衷刭x初值,省略行數(shù),系統(tǒng)將自動計算行數(shù)。

5.2.4二維數(shù)組的應(yīng)用

【例5-7】將矩陣a轉(zhuǎn)置后存入矩陣b。

矩陣轉(zhuǎn)置是行列互換,其關(guān)鍵語句為b[i][j]=a[j][i];。

運行結(jié)果如圖5-7所示。圖5-7例5-7運行結(jié)果

【例5-8】不借助另外的矩陣,將矩陣a轉(zhuǎn)置。

【分析】不借助另外的矩陣,將一個矩陣轉(zhuǎn)置,要求是一個方陣,即將i行j列的元素與j行i列的元素互換。但應(yīng)注意,下標(biāo)i、j不能完全遍歷,否則矩陣將轉(zhuǎn)置兩次等于還原。

運行結(jié)果如圖5-8所示。圖5-8例5-8運行結(jié)果

【例5-9】自定義一個函數(shù)day_of_year(year,month,day),計算并返回year(年)、month(月)和day(日)對應(yīng)的是該年的第幾天。

【分析】先判斷是否為閏年,然后再計算具體天數(shù)。

運行結(jié)果如圖5-9所示。圖5-9例5-9運行結(jié)果

5.3字符數(shù)組

5.3.1字符數(shù)組與字符串字符數(shù)組即用來存放字符或字符串的數(shù)組。

1.字符數(shù)組的定義一維字符數(shù)組的定義、引用、初始化與其他類型的一維數(shù)組一樣。如:charstr[80];定義一個含有80個字符型元素的數(shù)組str。

2.字符數(shù)組的初始化

(1)字符數(shù)組初始化的基本方法:逐個給字符數(shù)組中的各元素賦值,這與數(shù)值數(shù)組的初始化方法相同。

例如:chart[5]={'H','a','p','p','y'};

staticchars[6]={'H','a','p','p','y',0};

0代表字符'\0',也就是ASCII碼為0的字符

staticchars[6]={'H','a','p','p','y','\0'};

(2)如果對全體元素賦初值,則可以省略長度說明。

如:charch[]={'h','e','l','l','o'};

這時數(shù)組ch的長度自動定為5。

字符數(shù)組初始化的基本方法一般都沒有存儲?'\0'?字符,這樣的字符數(shù)組不能作為字符串處理。要想使得初始化以后的字符數(shù)組可以作為字符串處理,要么指出并增加字符數(shù)組的長度,以便在數(shù)組尾部自動存儲?'\0'?作為字符串結(jié)束標(biāo)志(在'\0'較多的情況下,以第一個'\0'作為字符串結(jié)束標(biāo)志);要么在初值之后加上?'\0'?字符。

如:charch[]={'h','e','l','l','o','\0'};

3.字符串的初始化存儲

字符串的初始化存儲是指用字符串直接給字符數(shù)組賦初值。

(1)一維字符數(shù)組的字符串的初始化存儲。

如:charch[]={"happy"};

也可以省去花括號,直接寫成:

charch[]="happy";

這種方式比逐個字符賦初值書寫起來方便得多。此時,數(shù)組ch實際有6個而不是5個元素,因為編譯程序在處理字符串時,自動在字符串的末尾加上'\0',以表示字符串的結(jié)束,'\0'會占用一個字節(jié)的空間。我們在程序中可以依靠檢測'\0'來判定字符串是否結(jié)束。

通常,字符數(shù)為n的字符串需占用n+1個字符空間。與上例等價的形式為:

charch[6]={"happy"};

(2)二維字符數(shù)組的字符串的初始化存儲。

例如:chars[3][6]={"happy","hello","hi"};

結(jié)果是每行存儲一個字符串。

5.3.2字符串的輸入輸出

1.逐個輸入、輸出字符串中的字符

字符串的輸入、輸出一般有兩種方法:一種方法是使用scanf和printf函數(shù)的格式符"%c";另一種方法是使用getchar和putchar函數(shù)逐個輸入和輸出字符數(shù)組中字符。它們的不同點在于:使用scanf和printf函數(shù)可以一次輸入和輸出多個字符,而使用getchar和putchar函數(shù)一次只能輸入和輸出一個字符。

【例5-10】使用scanf和printf函數(shù)輸入、輸出字符數(shù)組中的字符。

運行結(jié)果如圖5-10所示。圖5-10例5-10運行結(jié)果

2.字符串函數(shù)

C語言提供了除已介紹的用于輸入、輸出的scanf、printf、gets和puts函數(shù)外,還提供了字符串拷貝、連接、比較等字符串處理函數(shù)。應(yīng)當(dāng)指出的是,使用這些函數(shù)前應(yīng)在程序中包含頭文件“string.h”。

1)字符串拷貝函數(shù)strcpy

函數(shù)strcpy的調(diào)用格式為:

strcpy(字符數(shù)組名,字符串)

【功能】將一個字符串復(fù)制到一個字符數(shù)組中,字符串結(jié)束標(biāo)志'\0'也一同拷貝,字符串將覆蓋字符數(shù)組的相應(yīng)部分。本函數(shù)的返回值為字符數(shù)組的首地址。

【說明】

(1)字符數(shù)組必須定義得足夠大,以便能存入指定的字符串。字符數(shù)組名若換成字符數(shù)組元素地址,將從該元素處開始復(fù)制。

(2)字符串可以是字符串常量、字符數(shù)組名、字符數(shù)組元素地址等,代表源字符串。

(3)??strcpy(字符數(shù)組名,字符串,整數(shù))形式只將字符串前整數(shù)個字符和?'\0'?復(fù)制到字符數(shù)組。

【例5-11】將一個字符串復(fù)制到另外一個字符串中。

運行結(jié)果如圖5-11所示。圖5-11例5-11運行結(jié)果

2)字符串連接函數(shù)strcat

函數(shù)strcat的調(diào)用格式為:

strcat(字符數(shù)組名,字符串)

【功能】把字符串連同'\0'?連接到字符數(shù)組的后面,字符數(shù)組的'\0'?取消,結(jié)果存放在字符數(shù)組中。本函數(shù)的返回值為字符數(shù)組的首地址。

【說明】

(1)字符數(shù)組必須定義得足夠大,以便能存入指定的字符串。字符數(shù)組名若換成字符數(shù)組元素地址,將從該元素處開始復(fù)制。

(2)字符串可以是字符串常量、字符數(shù)組名、字符數(shù)組元素地址等,代表字符串。

【例5-12】連接兩個字符串。

運行結(jié)果如圖5-12所示。圖5-12例5-12運行結(jié)果

3)字符串比較函數(shù)strcmp

函數(shù)strcmp的調(diào)用格式為:

strcmp(字符串x,字符串y)

【功能】比較兩個字符串,返回值為比較結(jié)果:

當(dāng)字符串x=?字符串y時,函數(shù)返回值為0;

當(dāng)字符串x?>?字符串y時,函數(shù)返回值為一正數(shù);

當(dāng)字符串x?<?字符串y時,函數(shù)返回值為一負(fù)數(shù)。

4)測字符串的長度函數(shù)strlen

函數(shù)strlen的調(diào)用格式為:

strlen(字符串)

【功能】測字符串中字符的實際個數(shù)(不含'\0'標(biāo)志),返回值為整數(shù)。

例5-13】測字符串的長度。

運行結(jié)果如圖5-13所示。圖5-13例5-13運行結(jié)果

5.3.3二維字符數(shù)組的應(yīng)用

前面已經(jīng)介紹,二維數(shù)組的每一行都是一個一維數(shù)組,第i行一維數(shù)組的數(shù)組名就是a[i],也就是第i行首地址,用它就可以訪問第i行字符串。因此,用二維字符數(shù)組可以處理多個字符串問題,訪問這些字符串就變成了訪問一維數(shù)組。

【例5-14】輸入一個字符串,分別統(tǒng)計其中的大寫字母、小寫字母、數(shù)字字符和其他字符的個數(shù)。

運行結(jié)果如圖5-14所示。圖5-14例5-14運行結(jié)果

5.4數(shù)?組?與?函?數(shù)

1.?dāng)?shù)組元素作為函數(shù)參數(shù)數(shù)組元素即下標(biāo)變量,它的使用與普通變量并無區(qū)別。數(shù)組元素只能用作函數(shù)實參,其用法與普通變量完全相同:在發(fā)生函數(shù)調(diào)用時,把數(shù)組元素的值傳送給形參,實現(xiàn)單向值傳送。

【例5-15】寫一函數(shù),統(tǒng)計字符串中字母的個數(shù)。

運行結(jié)果如圖5-15所示。圖5-15例5-15運行結(jié)果

說明:

(1)用數(shù)組元素作實參時,只要數(shù)組元素類型和函數(shù)的形參類型一致即可,并不要求函數(shù)的形參也是下標(biāo)變量。換句話說,對數(shù)組元素的處理是按普通變量對待的。

(2)使用普通變量或下標(biāo)變量作函數(shù)參數(shù)時,編譯系統(tǒng)為形參變量和實參變量分配兩個獨立的內(nèi)存單元。在函數(shù)調(diào)用時發(fā)生的值傳送,是把實參變量的值賦予形參變量單元。

2.?dāng)?shù)組名作為函數(shù)的參數(shù)

數(shù)組名作函數(shù)參數(shù)時,既可以作形參,也可以作實參。

數(shù)組名作函數(shù)參數(shù)時,要求形參和相對應(yīng)的實參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明。這種方式是把實參數(shù)組的起始地址傳給形參數(shù)組,形參數(shù)組的改變也是對實參數(shù)組的改變,稱這種參數(shù)傳遞方式為“地址傳遞”。

【例5-16】已知某個學(xué)生5門課程的成績,求出平均成績。

運行結(jié)果如圖5-16所示。圖5-16例5-16運行結(jié)果

說明:

(1)用數(shù)組名作函數(shù)參數(shù),應(yīng)該在調(diào)用函數(shù)和被調(diào)用函數(shù)中分別定義數(shù)組,且數(shù)組類型必須一致,否則結(jié)果將出錯。例如,在本例中,形參數(shù)組為a[],實參數(shù)組為sco[],它們的類型相同。

(2)用數(shù)組名作函數(shù)實參時,并不是把數(shù)組元素的值傳遞給形參,而是把實參數(shù)組的首地址傳給形參數(shù)組,這樣形參數(shù)組與實參數(shù)組共用同一

溫馨提示

  • 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

提交評論