




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
數組5.1一維數組5.2二維數組5.3字符數組5.4數組與函數本章小結
5.1一維數組
【問題】從鍵盤任意輸入N個數,給這些數排序,排序后得到的數如何存放?【分析】從鍵盤輸入N個數并給這些數排序很簡單,但是,排序后得到的數如何存放就比較麻煩。在我們學了數組之后,解決這個問題就會很容易。
5.1.1一維數組的定義
在C語言中,使用數組前必須先進行數組的定義。定義一個一維數組的一般形式為:
數據類型數組名[常量表達式];
例如:
inta[6];
定義了一個一維整型數組,數組名為a,有6個元素,這6個元素分別為a[0]、a[1]、a[2]、a[3]、a[4]、a[5]。
【說明】
(1)數組名與變量的命名方法相同,用合法的標識符表示。
(2)方括號中的“常量表達式”又稱“數組長度”,用整型常量表達式表示,可以包括常量和符號常量,但不能包括變量。
(3)數組元素的下標從0開始,最大為元素個數減1,不能越界。
(4)同一數組中所有元素的數據類型都是相同的。
5.1.2一維數組元素的引用
在定義了數組之后,就可引用其中的數組元素。其引用形式為:
數組名[下標]
下標可以為整型常量、符號常量,也可以包含變量。下標值如果為小數,C語言編譯時將自動取整。
C語言中只能逐個引用數組元素,而不能一次引用整個數組。
請注意區分數組定義和數組元素的引用,兩者從形式上看有些相似,但含義卻完全
不同。例如:inta[5];是定義一個有5個元素的整型數組,而a[3]是對下標為3的元素的引用。數組定義是說明語句,前面有類型關鍵字,而元素引用出現在表達式中,前面沒
有類型關鍵字。數組定義時,方括號中是常量表達式,而元素引用時,方括號中是一般表達式。
設計程序時,通常用循環變量控制數組元素的下標,來實現數組元素的引用。
【例5-1】將數字1~10存入一個整型數組a中并輸出。
運行結果如圖5-1所示。圖5-1例5-1運行結果
5.1.3一維數組的基本操作
一維數組定義后,系統將按數組類型和元素個數開辟一組連續的存儲單元,用于依次存放每個數組元素。數組名表示該連續存儲單元的首地址。例如定義inta[10];后,系統將在內存中開辟10個連續的整型存儲單元,存放10個元素,數組名a表示該連續存儲單元的首地址&a[0]。
對數組元素賦值一般有兩種方式:一種是在數組定義時就給數組元素賦以初值;另一種方式是用賦值語句或輸入語句使數組元素取得值,這在程序運行中進行。
對一維數組元素的初始化賦值通??梢圆捎靡韵路绞竭M行。
(1)對數組的全部元素賦初值。
例如:inta[2]={1,2};
將數組元素的初值依次放在一對花括號內,經過上述定義及初始化之后,a[0]=1,a[1]=2。
(2)對數組的部分元素賦初值。
例如:intb[4]={2,4,6};
只給前3個元素賦初值,其余1個元素的值為0。如果數組定義時沒有進行初始化賦值,則所有元素的值都是隨機的。
(3)對全部數組元素賦初值時,可以不指定數組的長度。
例如:inta[]={1,2,3};
(4)當數組指定的元素個數少于初值的個數時,作語法錯誤處理。
例如:intc[3]={1,2,3,4,5};
是不合法的,因為c數組只能有3個元素,卻給了5個初始值。
5.1.4一維數組的應用
【例5-2】利用數組計算fibonacci數列的前10個數,即1,1,2,3,5,…,并按每行打印5個數的格式輸出。
運行結果如圖5-2所示。圖5-2例5-2運行結果
【例5-3】從鍵盤輸入10個數,求平均數并輸出所有大于平均數的數。
運行結果如圖5-3所示。圖5-3例5-3運行結果
【例5-4】輸入一個正整數n(1<n≤10),再輸入n個整數,用選擇法將它們從小到大排序后輸出。
選擇排序法的基本思路為:對于給定的一組數據,每次選擇最小的數據放在數組的當前位置,直至最大的數據結束。
運行結果如圖5-4所示。圖5-4例5-4運行結果
【例5-5】在數組中查找一個給定的數。
輸入5個整數,將它們存入數組a中,再輸入1個數x,然后在數組中查找x,如果找到,輸出相應的下標,否則,輸出“NotFound”。
運行結果如圖5-5所示。圖5-5例5-5運行結果
5.2二維數組
在實際應用中,很多問題的數據是二維或多維陣列,如矩陣、二維表格等。C語言允許使用二維或多維數組,多維數組的元素有多個下標。多維數組最具代表形式的是二維數組,它由數組名及表明行數和列數的下標構成,即數組元素有兩個下標。
5.2.1二維數組的定義與初始化
二維數組定義的一般形式為:
數據類型數組名[行數][列數];
例如:
intb[1][2]; /*定義b為1行2列的整型數組*/
chara[3][4]; /*定義a為3行4列的字符型數組*/
floatd[5][6]; /*定義d為5行6列的實型數組*/
數組b有1*2=2個元素,數組a有3*4=12個元素,數組d有5*6=30個元素。與一維數組定義中元素個數必須為常量表達式相同,二維數組定義中的行數和列數也必須為常量表達式,不能包含變量。
像一維數組元素一樣,二維數組元素的行下標和列下標均從0開始。例如,上面定義的數組a有3行4列,其元素有:
實質上,二維數組可以看做由一維數組嵌套而成,即當一維數組的每個元素又是一個類型相同的一維數組時,就組成了二維數組。例如,inta[3][4]可以看成:一維數組inta[3]的三個元素a[0]、a[1]、a[2]又都是有四個元素的一維數組(行數組),a[0]、a[1]、a[2]分別是它們的數組名。數組a[0]的元素有a[0][0]、a[0][1]、a[0][2]和a[0][3];數組a[1]的元素有a[1][0]、a[1][1]、a[1][2]和a[1][3];數組a[2]的元素有a[2][0]、a[2][1]、a[2][2]和a[2][3]。
同樣,三維數組可以看成是一維數組的各元素由二維數組構成。
5.2.2二維數組元素的引用
二維數組元素的引用形式如下:
數組名[行下標][列下標]
下標用來標識數組元素在數組中的位置。下標可以是整型常數、有值變量或表達式,如:s[2][n+3],a[i][j]等,但不能寫成s[2,1+3],a[i,j]的形式。與一維數組相似,二維數組也只能逐個訪問數組元素,而不能訪問整體數組、整行或整列。程序設計時通常用兩重循環的循環變量分別控制數組元素的行下標和列下標,實現對二維數組元素的引用。
【例5-6】定義1個3*2的二維數組a,數組元素的值由下式給出,按矩陣的形式輸出a:
運行結果如圖5-6所示。圖5-6例5-6運行結果
5.2.3二維數組的基本操作
1.二維數組的存儲
二維數組定義后,系統也將為二維數組按其類型和元素個數開辟連續的存儲單元。由于二維數組有行列結構,而內存單元是順序(線性)排列的,因此必須按一定的規律存放二維數組的元素。C語言規定:二維數組元素按行存儲,即一行接一行存儲。例如,整型數組a[3][2]共有6個整型存儲單元。
2.二維數組的初始化
二維數組可以在數組定義時,給數組元素賦以初值。操作方法如下:
(1)分行給二維數組賦初值。
(2)按存儲順序連續賦初值。
(3)分行對部分元素賦初值,未賦初值的元素自動取0值(對實數是0.0,對字符型是'\0')。
(4)按存儲順序對全部或部分元素賦初值,省略行數,系統將自動計算行數。
5.2.4二維數組的應用
【例5-7】將矩陣a轉置后存入矩陣b。
矩陣轉置是行列互換,其關鍵語句為b[i][j]=a[j][i];。
運行結果如圖5-7所示。圖5-7例5-7運行結果
【例5-8】不借助另外的矩陣,將矩陣a轉置。
【分析】不借助另外的矩陣,將一個矩陣轉置,要求是一個方陣,即將i行j列的元素與j行i列的元素互換。但應注意,下標i、j不能完全遍歷,否則矩陣將轉置兩次等于還原。
運行結果如圖5-8所示。圖5-8例5-8運行結果
【例5-9】自定義一個函數day_of_year(year,month,day),計算并返回year(年)、month(月)和day(日)對應的是該年的第幾天。
【分析】先判斷是否為閏年,然后再計算具體天數。
運行結果如圖5-9所示。圖5-9例5-9運行結果
5.3字符數組
5.3.1字符數組與字符串字符數組即用來存放字符或字符串的數組。
1.字符數組的定義一維字符數組的定義、引用、初始化與其他類型的一維數組一樣。如:charstr[80];定義一個含有80個字符型元素的數組str。
2.字符數組的初始化
(1)字符數組初始化的基本方法:逐個給字符數組中的各元素賦值,這與數值數組的初始化方法相同。
例如: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'};
這時數組ch的長度自動定為5。
字符數組初始化的基本方法一般都沒有存儲?'\0'?字符,這樣的字符數組不能作為字符串處理。要想使得初始化以后的字符數組可以作為字符串處理,要么指出并增加字符數組的長度,以便在數組尾部自動存儲?'\0'?作為字符串結束標志(在'\0'較多的情況下,以第一個'\0'作為字符串結束標志);要么在初值之后加上?'\0'?字符。
如:charch[]={'h','e','l','l','o','\0'};
3.字符串的初始化存儲
字符串的初始化存儲是指用字符串直接給字符數組賦初值。
(1)一維字符數組的字符串的初始化存儲。
如:charch[]={"happy"};
也可以省去花括號,直接寫成:
charch[]="happy";
這種方式比逐個字符賦初值書寫起來方便得多。此時,數組ch實際有6個而不是5個元素,因為編譯程序在處理字符串時,自動在字符串的末尾加上'\0',以表示字符串的結束,'\0'會占用一個字節的空間。我們在程序中可以依靠檢測'\0'來判定字符串是否結束。
通常,字符數為n的字符串需占用n+1個字符空間。與上例等價的形式為:
charch[6]={"happy"};
(2)二維字符數組的字符串的初始化存儲。
例如:chars[3][6]={"happy","hello","hi"};
結果是每行存儲一個字符串。
5.3.2字符串的輸入輸出
1.逐個輸入、輸出字符串中的字符
字符串的輸入、輸出一般有兩種方法:一種方法是使用scanf和printf函數的格式符"%c";另一種方法是使用getchar和putchar函數逐個輸入和輸出字符數組中字符。它們的不同點在于:使用scanf和printf函數可以一次輸入和輸出多個字符,而使用getchar和putchar函數一次只能輸入和輸出一個字符。
【例5-10】使用scanf和printf函數輸入、輸出字符數組中的字符。
運行結果如圖5-10所示。圖5-10例5-10運行結果
2.字符串函數
C語言提供了除已介紹的用于輸入、輸出的scanf、printf、gets和puts函數外,還提供了字符串拷貝、連接、比較等字符串處理函數。應當指出的是,使用這些函數前應在程序中包含頭文件“string.h”。
1)字符串拷貝函數strcpy
函數strcpy的調用格式為:
strcpy(字符數組名,字符串)
【功能】將一個字符串復制到一個字符數組中,字符串結束標志'\0'也一同拷貝,字符串將覆蓋字符數組的相應部分。本函數的返回值為字符數組的首地址。
【說明】
(1)字符數組必須定義得足夠大,以便能存入指定的字符串。字符數組名若換成字符數組元素地址,將從該元素處開始復制。
(2)字符串可以是字符串常量、字符數組名、字符數組元素地址等,代表源字符串。
(3)??strcpy(字符數組名,字符串,整數)形式只將字符串前整數個字符和?'\0'?復制到字符數組。
【例5-11】將一個字符串復制到另外一個字符串中。
運行結果如圖5-11所示。圖5-11例5-11運行結果
2)字符串連接函數strcat
函數strcat的調用格式為:
strcat(字符數組名,字符串)
【功能】把字符串連同'\0'?連接到字符數組的后面,字符數組的'\0'?取消,結果存放在字符數組中。本函數的返回值為字符數組的首地址。
【說明】
(1)字符數組必須定義得足夠大,以便能存入指定的字符串。字符數組名若換成字符數組元素地址,將從該元素處開始復制。
(2)字符串可以是字符串常量、字符數組名、字符數組元素地址等,代表字符串。
【例5-12】連接兩個字符串。
運行結果如圖5-12所示。圖5-12例5-12運行結果
3)字符串比較函數strcmp
函數strcmp的調用格式為:
strcmp(字符串x,字符串y)
【功能】比較兩個字符串,返回值為比較結果:
當字符串x=?字符串y時,函數返回值為0;
當字符串x?>?字符串y時,函數返回值為一正數;
當字符串x?<?字符串y時,函數返回值為一負數。
4)測字符串的長度函數strlen
函數strlen的調用格式為:
strlen(字符串)
【功能】測字符串中字符的實際個數(不含'\0'標志),返回值為整數。
例5-13】測字符串的長度。
運行結果如圖5-13所示。圖5-13例5-13運行結果
5.3.3二維字符數組的應用
前面已經介紹,二維數組的每一行都是一個一維數組,第i行一維數組的數組名就是a[i],也就是第i行首地址,用它就可以訪問第i行字符串。因此,用二維字符數組可以處理多個字符串問題,訪問這些字符串就變成了訪問一維數組。
【例5-14】輸入一個字符串,分別統計其中的大寫字母、小寫字母、數字字符和其他字符的個數。
運行結果如圖5-14所示。圖5-14例5-14運行結果
5.4數?組?與?函?數
1.數組元素作為函數參數數組元素即下標變量,它的使用與普通變量并無區別。數組元素只能用作函數實參,其用法與普通變量完全相同:在發生函數調用時,把數組元素的值傳送給形參,實現單向值傳送。
【例5-15】寫一函數,統計字符串中字母的個數。
運行結果如圖5-15所示。圖5-15例5-15運行結果
說明:
(1)用數組元素作實參時,只要數組元素類型和函數的形參類型一致即可,并不要求函數的形參也是下標變量。換句話說,對數組元素的處理是按普通變量對待的。
(2)使用普通變量或下標變量作函數參數時,編譯系統為形參變量和實參變量分配兩個獨立的內存單元。在函數調用時發生的值傳送,是把實參變量的值賦予形參變量單元。
2.數組名作為函數的參數
數組名作函數參數時,既可以作形參,也可以作實參。
數組名作函數參數時,要求形參和相對應的實參都必須是類型相同的數組,都必須有明確的數組說明。這種方式是把實參數組的起始地址傳給形參數組,形參數組的改變也是對實參數組的改變,稱這種參數傳遞方式為“地址傳遞”。
【例5-16】已知某個學生5門課程的成績,求出平均成績。
運行結果如圖5-16所示。圖5-16例5-16運行結果
說明:
(1)用數組名作函數參數,應該在調用函數和被調用函數中分別定義數組,且數組類型必須一致,否則結果將出錯。例如,在本例中,形參數組為a[],實參數組為sco[],它們的類型相同。
(2)用數組名作函數實參時,并不是把數組元素的值傳遞給形參,而是把實參數組的首地址傳給形參數組,這樣形參數組與實參數組共用同一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 表格式北師大版六年級數學上冊教案
- 設備供貨進度計劃和保證項目完成的具體措施
- 從職業規劃到崗位發展的全流程指導
- 2025年android下載!Android基礎面試常常死在這幾個問題上值得收藏!-android 批量下載 面試
- 建筑施工特種作業-橋(門)式起重機司機真題庫-9
- 山東英語寫作題目及答案
- 溶液稀釋類題目及答案
- 2023-2024學年云南省昆明市高二下學期期末質量檢測數學試題(解析版)
- 2023-2024學年山東省日照市高二下學期期末考試數學試題(解析版)
- 2025屆貴州省安順市高三適應性檢測(三模)語文試題(解析版)
- 抖音直播帶貨合作協議書范本
- GB 44246-2024家用和類似用途電器、體育用品的電氣部分及電玩具安全技術規范
- 起重吊車吊裝施工方案
- 教育咨詢員合同范本樣本
- DL∕T 1474-2021 交、直流系統用高壓聚合物絕緣子憎水性測量及評估方法
- 勞動合同中止執行協議
- 2024年四川省樂山市中考地理試卷(含答案)
- 貨運車輛駕駛員安全教育培訓(3篇模板)
- 基于排隊網絡理論的集裝箱碼頭設備配置優化研究
- 2024CSCO結直腸癌診療指南解讀
- 食品購銷合同模板
評論
0/150
提交評論