




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第五章數組1.教學內容:§ 5.1 維數組5.1.1 維數組的定義5.1.2 維數組的初始化5.1.3 數組元素的引用5.1.4 數組作為函數參數5.1.5 一維數組應用舉例§ 5.2 維數組和多維數組5.2.1 二維數組和多維數組的概念及其定義5.2.2 二維數組和多維數組的引用5.2.3 二維數組和多維數組的初始化5.2.4 二維數組程序舉例§ 5.3 符數組和字符串5.3.1 字符串和字符串的存儲方法5.3.2 字符數組的初始化5.3.3 字符串的輸入5.3.4 字符串的輸出5.3.5 字符串運算函數5.3.6 二維的字符數組5.3.7 字符數組應用舉例2
2、.教學目的及要求:1)掌握數組的概念和使用2)掌握數組初始化的方法3)掌握字符數組和字符串的應用3 .教學重點:1) 一維數組2)二維數組和多維數組3)字符數組第五章數組數組是指一組具有相同數據類型的有序數據 的集合。用一個統一的名字標識這組數據,用下 標來指示數組中元素的序號。一個數組元素也稱 一個下標變量,其用法與普通的變量使用方法相 同。§ 5.1 維數組一維數組是只有一個下標變量的數組。5.1.1 一維數組的定義定義方式:|類型標識符 數組名下標常量表達式 【例】:int a10定義一個數組,數組名a,有10個元素,每個 元素的類型均為int。這10個元素分別是:a0、 a1
3、 、 a2、a3 , ,a8 、 a9。注意:(1) C語言中,數組下標從 0開始。(2) C語言不允許對數組的大小做動態定義,如:int n;scanf("%d",&n);int an;/*x */因為,在編譯時,C編譯器根據已知數組大 小分配內存。5.1.2 維數組的初始化在定義數組時對各元素指定初始值,稱為數 組的初始化。1、一般初始化用花括號把要賦給各元素的初始值括起來, 數據間用逗號分隔。【例】:static int a9 =1,2,3,4,5,67,8,9a0=1,a1=2,a2=3, , , a8=92、部分元素初始化【例】:static int a1
4、0 = 1,2,3,4,5;只對前5個元素賦初值,后5個元素未指定初值,系統默認為0。3、全部元素均初始化為 0,不允許簡寫。【例】:static int a10 = 0,0,0,0,0,0,0,0,0,0; 不能簡寫為:static int a10 = 0*10; x 注意:當程序不給數組指定初始值時,編譯器作如下處理:(1)編譯器自動把靜態數組的各元素初始化為0或空字符。(2)編譯器不為動態數組自動指定初始值,其初值不可預料。4、如果全部元素均指定初值,定義中可以省略 元素的個數。【例】:static int a5 = 1,2,3,4,5;可寫成:static int a口 = 1,2,3
5、,4,5;5.1.3 數組元素的引用C語言規定,不能引用整個數組,只能逐個 引用元素。引用形式:數組名下標【例】:使數組元素a0a9的值為0-9,然 后逆序輸出。main() int i,a10;for (i=0;i<=9;i+)ai = i;for(i=9;i>=0; i-) printf("%d ",ai);運行輸出:9 8 7 6 5 4 3 2 1 0注意:下標可用整常數或整型表達式,其起始值 為0。在引用時應注意下標的值不要超過數組的 范圍。C編譯不檢查下標是否超界,即不指出“下標超界”的錯誤。5.1.4 數組作為函數參數1、數組元素用作函數實參,其用
6、法與普通變量完 全相同:在發生函數調用時,把數組元素的值傳 送給形參,實現單向值傳送。【例】:寫一函數,統計字符串中字母的個數。/*功能:數組元素作為函數實參*/int isalp(char c)if (c>='a'&&c<='z'|c>='A'&&c<=Z)return(1);else return(0);main() int i,num=0;char str255;printf("Input a string:");gets(str); /*從標準設備讀入字符串,并放
7、入 str指向的數組*/ for(i=0;stri!='0'i+)if (isalp(stri) num+;puts(str); /*把str指向的字符串輸由到標準設備 */printf("num=%dn",num);getch(); /*從標準輸入設備讀入下一個字符*/)說明:用數組元素作實參時,只要數組類型和函數 的形參類型一致即可,并不要求函數的形參也是 下標變量。換句話說,對數組元素的處理是按普 通變量對待的。2、數組名作函數參數時,既可以作形參,也可以 作實參。數組名作函數參數時,要求形參和相對應的 實參都必須是類型相同的數組(或指向數組的指 針變
8、量),都必須有明確的數組說明【例】:已知某個學生5門課程的成績,求平均 成績。float aver(float a ) /*求平均值函數 */ int i ;float av,s=a0;for(i=1 ; i<5 ; i+) s += ai ;av=s/5 ;return av ;main() float sco5,av ;int i ;printf("ninput 5 scores:n");for(i=0 ; i<5 ; i+) scanf("%f”,&scoi)av=aver(sco) ;/*調用函數,實參為數組名*/printf(&quo
9、t;average score is %5.2fn",av);getch();/*從標準輸入設備讀入下一個字符*/說明:組名作函數參數,應該在調用函數和被調用函 數中分別定義數組,且數據類型必須一致,否 則結果將出錯。C編譯系統對形參數組長度不作檢查,所以形 參數組可以不指定長度。例如,本例中的形參 數組a口 。如果指定形參數組的長度,則實參數組的長度 必須大于等于形參數組,否則因形參數組的部 分元素沒有確定值而導致計算結果錯誤。以數組名作參數時,采取的不是“值傳送”方 式,而是“地址傳送”方式,即把實參數組的 起始地址傳給形參數組,這樣形參數組就和實 參數組共占一段內存單元。如上例
10、可表示為:5.1.5 一維數組應用舉例【例】:輸入10個數,用“起泡法”對10個數排 序(由小到大)。“起泡法”算法:以六個數 9、8、5、4、2、0為 例。第1趟比較第2趟比較895428594854985428542584205482054285420第1次第2次第2:次第4次第5次結果第1次第2次第3次第4次結果算法過程:第1趟比較后,剩5個數未排好序;兩兩比較5次第2趟比較后,剩4個數未排好序;兩兩比較4次第3趟比較后,剩3個數未排好序;兩兩比較3次第4趟比較后,剩2個數未排好序;兩兩比較2次第5趟比較后,全部排好序;兩兩比較 1次算法結論:對于n個數的排序,需進行 n-1趟比 較,第
11、j趟比較需進行n-j次兩兩比較。程序流程圖:(用兩層嵌套循環實現)輸入n個數給a 1an for j=l to n-1for i=l to n-jai與 ai+l 交換輸出ala10程序:設需排序的數有 10個,定義數組大小為11,使用a1a10存放10個數,a0不用c main()int a11;/* 用 a1a10, a0 不用 */int i,j,t ;/* i,j作循環變量,t作兩兩比較的臨時變量*/printf("input 10 numbers:n");for(i=1;i<11;i+)scanf("%d”,&ai);printf(&quo
12、t;n");for(j=1;j<=9;j+)for(i=1;i<=10-j; i+)if (ai > ai+1)/*輸入10個整數*/*第j趟比較*/*第j趟中兩兩比較10-j次*/*交換大小*/ t = ai; ai = ai+1; ai+1= t; printf("the sorted numbers:n");for(i=1;i<11;i+)printf("%d",ai);)§ 5.2 維數組和多維數組5.2.1 二維數組和多維數組的概念及其定義如果一維數組的每一個元素是類型相同的一 維數組時,就形成了二維
13、數組。二維數組是有二個下標變量的數組。第一個下標 稱為行下標,第二個下標稱為列下標,因此,二 維數組可看成是一個二維表。二維數組的一般定義形式為:類型標識符 數組名常量表達式1常量表達式2 二維數組的理解:【例】:a34二維數組a34 理解為:有三個元素 a0、a1、a2,每 一個元素是一個包含4 個元素的數組。二維數組的元素在內存中的存放循序:即:先順序存再存放飛/嶺航沖【例】:a34放第一行的元素, 第二行的元素。按行存放二維數組的元素a皿在數組中的位置計算公式:設有一個m< n的二維數組,元素aij 在 數組中的位置計算公式為:i x n+j+1多維數組是有多個下標變量的數組。多維
14、數組的一般定義形式為:類型標識符2-常量表達式n三維數組:float a234 在內存中的存放順a000- a01- a02- a03一a010- a- a012- a13一a020- a21- a022- a23一a100- a101- a12- a103一a110- a111- a112- a113一a120- a121- a122-a1235.2.2 二維數組和多維數組的引用二維數組元素的引用形式為:數組名下標1下標2【例】:float a23;有6個元素,按如下方式引用各元素:a00 、a01 、a2、a10、a11 、a12注意:數組float a23 中無元素 a23(下標從05.
15、2.3 二維數組和多維數組的初始化二維數組的初始化1、分行對各元素賦值,如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;2、全部數據寫在一個花括號內,如:static int a34=1,2,3,4,5,6,7,8,9,10,11,12;3、只對部分元素賦值。如:static int a34 = 1,5,9;僅對 a00 、a10 、a20賦值,其 余元素未賦值(對于靜態數組,未賦值元素指定 初值0;對于動態數組,未賦值元素的初值是隨 機的)。4、如果對全部元素賦初值,則第一維的長度可以 不指定,但必須指定第二維的長度。【例】:static inta34
16、=1,2,3,4,5,6,7,8,9,10,11,12;與下面定義等價:static inta 4=1,2,3,4,5,6,7,8,9,10,11,12;多維數組的初始化與二維數的初始化相似。5.2.4 二維數組程序舉例【例1:將一個二維數組行和列交換,存到另 一個二維數組中。如:a=1 2 3_4 5 6_3算法:bji = a皿程序:main() static int a23 = 1,2,3,4,5,6;static int b32, i,j;printf("array a:n");for(i=0;i<=1;i+)/* 0 1 行 */ for(j=0;j<
17、=2;j+)/* 0 2 歹U */ printf("%5d",aij);bji= aij;/* 行、列交換 */printf("n");/*輸由一行后換行*/printf("array b:n"); for(i=0;i<=2;i+) for(j=0;j<=1;j+) printf("%5d",bij); printf("n");【例2】:有一個3X4的矩陣,編程序求出其中 值最大的那個元素的值及其所在的行號和列號。 算法:把第一個元素a作為臨時最大值max;把臨時最大值max與每一
18、個元素aij 進行 比較,若aij>max ,把aij作為新的臨時最大值,并記錄下其下標i和j。當全部元素比 較完后,max是整個矩陣全部元素的最大值。流程:max = a00for i=0 to 2for j=0 to 3max=aij row=i colum=j輸出:max和row、colum程序:main()int i,j,row=0,colum=0,max;static inta34=123,4,9,8,7,6,-10,10,-5,2;max = a00;for(i=0; i<=2; i+)/*用兩重循環遍歷全部元素 */for(j=0; j<=3; j+) if (
19、aij > max ) max = aij;row = i;colum = j;printf("max=%d, row=%d, colum=%dn",max,row,colum);注意:本例中得到的行列值從0始。§ 5.3 符數組和字符串字符數組:存放字符數據的數組。每一個元素 數組存放一個字符。5.3.1 字符串和字符串的存儲方法字符串是指若干有效字符(指系統允許使用的 字符)的序列。C語言允許的字符串可包括字母、 數字、專用字符、轉字符等。它用雙引號括起來。 C語言中沒有字符串變量。字符串存放在一個字 符型數組中。【例】:將字符串“ computer”存
20、入字符數組str定義字符數組:Char str8;采用賦值運算,將字符一個一個地賦給字符數組 各元素:Str0= ' c' ; Str1= ' o' ; Str2= ' M ;,.,Str7= ' r' ; str8= '0'存儲字符串示意圖:Str0 Str1 Str2 , Str7 Str8c 0mp ut e R 0C語言規定:以“ 0”字符作為字符串結束標志, “0”是指ASCII為0的字符,它不是一個普韭的可顯示字符,而是一個“空操作”字符,它不 進行任何操作,只是作為一個標志。5.3.2 字符數組的初始化1、逐
21、個為數組元素指定初值如:static char c10 = 'I',' ','a','m','','h','a','p','p', 'y'2、初始化數據少于數組長度,多余元素自動為 “空”。如:static char c10 = 'c',' ','p','r','o','g','r','a','m
22、9;c。皿 c2 c3 c4 c可購 c7 c8 c9CPr0gram3、指定初值時,若未指定數組長度,則長度等 于初值個數。如:static char c = 'I',' ','a','m','','h','a','p','p','y'4、對字符數組指定一個字符串初值如:static char c = " I am happy ” 注意:字符數組的元素個數應該足夠大,能容納 所存的字符和“ 0”。5.3.3 字符數組的引用引
23、用一個元素,得到一個字符。【例】:輸出一個字符串。main()static char c10='I',' ','a','m','','a',' ','b','o','y'int i;for(i=0;i<10;i+)printf("%c",ci);printf("n");輸出結果:I am a boy5.3.4 字符串的輸入輸出兩種方法:1、用" c'格式符逐個輸入輸出。2、
24、用" %S'格式符按字符串輸入輸出【例】static char c6; scanf("%s",c); printf("%s",c);注意:(1)輸入時,遇回車鍵結束,但獲得的字符中不 包含回車鍵本身,而是在字符串末尾添'0' 因此,定義的字符數組必須有足夠的長度, 以容納所輸入的字符。(如,輸入5個字符, 定義的字符數組至少應有 6個元素)。(2) 一個scanf函數輸入多個字符串,輸入時以“空格”鍵作為字符串間的分隔。【例1】:static char str15,str25,str35;scanf("%s%s
25、%s",str1,str2,str3);輸入數據:How are you?strl、str2、str3獲得的數據見下圖:【例2】:static char str13;scanf("%s",str);輸入: How are you?結果:僅“ HoW被輸入數組str如要想str獲得全部輸入(包含空格及其以后的字符),程序應設計為:static char c13;int i;for(i=0;i<13;i+) ci = getchar();(3) C語言中,數組名代表該數組的起始地址, 因此,scanf() 函數中不需要地址運算符 &。(在Turbo C中
26、,加上 碗算符也可以)。static char str13;scanf("%s",str);scanf("%s", &str); /* 錯誤 */(4) gets()函數:輸入字符串到數組。【例】:static char str12;gets(str);注意:gets() 一次只能輸入一個字符串。而scanf()可以輸入幾個字符串。(5)輸出時,遇0結束,且輸出字符中不包含'0'。(6) "S格式輸出字符串時,printf() 函數的 輸出項是字符數組名,而不是數組元素名。【例】:static char c6 = &qu
27、ot;China"printf("%s",c); printf("%c",c0);printf("%s",c0);/*b */(7) "s格式輸出時,即使數組長度大于字符 串長度,遇'0'也結束。【例】:static char c10 = "China"printf("%s",c);/* 只輸出 5 個字符 */(8) "s格式輸出時,若數組中包含一個以上 '0',遇第一個0'時結束。(9) puts()函數:輸出字符串(以&
28、#39;0'結尾)。注意:puts() 一次只能輸出一個字符串。而printf()可以輸入輸出幾個字符串。【例】:static char c6="China"/*printf、puts 均以''0'結尾*/printf("%sn",c); /*printf 需要格式控制符 %s*/puts(c);/*puts不需要格式控制符,且自動換行 */5.3.5字符串運算函數1、strcat():連接字符串。格式:Strcat( 字符串1,字符串2)把“字符串2”連接到“字符串1”的后面。2、strcpy():字符串拷貝。格式:St
29、rcpy(字符串1,字符串2)7把“字符串2”的值拷貝到“字符串1”中。3、strcmp():字符串比較。格式:|int strcmp( 字符串1,字符串2);比較規則:逐個字符比較 ASCII碼,直到遇到 不同字符或'0',比較結果是該函數的返回值。strcmp()返回值字符串1 字符串2<0字符串1 =字符串2=0字符串2 字符串20長度不同的字符串也可以進行比較, 比較 結果當然是“不同”。注意:字符串只能用strcmp函數比較,不能用關系運算符“二=”比較。【例】:if (strcmp(str1,str2) = 0)printf("yes");
30、if (!strcmp(str1,str2)printf("equal");if (strl = str2) printf("yes"); /*x */4、trlen():測試字符串長度函數格式:strlen( 字符串);【例】:strlen("computer") 結果:85、strlwr():將字符串中的大寫字母轉換為小寫 字母(lwr : lowercase 小寫)。6、strupr():將字符串中的小寫字母轉換為大寫 字母(upr: uppercase 大寫)。注意:以上函數均是庫函數,使用時必須用#include 語句包含頭
31、文件。5.3.6 二維的字符數組二維數組可認為是由若干個一維數組所組成的,也知道一個一維數組可存放一個字符串,因 此,一個NX M的二維數組可存放 N個最大長度為 M-1的字符串。其中要留一個位置存放“0【例】:static char str36=" China 丁“Japan”,“Korea” 存放在str中的字符串示意圖:ChIna0JaPan0Korea0Str Str1 Str2 維字符數組元素的 引用與二維數組的引用相同。【例】:一個班級中有若干名學生。今輸入一個學生名,要求查詢該學生是否屬于該班,輸出相應 的信息。程序:#define MAX 3#define LEN 1
32、0 main() int I,flag=0;char nameLEN;static char li stMAXLEN= "Zhang”, “Wang, “Li ”;printf(" Enter your name: “ );gets(name);for (I=0,I<MAX;I+)if (strcmp(listI,name)=0) flag=1;if (flag=1)printf( "s is in our class n" ,name); elseprintf( "s is not in our class n”,name);5.3.7 字符數組應用舉例【例1】:輸入一行字符,統計其中有多少個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 虛擬時尚搭配直播教學考核試卷
- 服務流程標準化客戶溝通規范考核試卷
- 虛擬時尚產品設計趨勢考核試卷
- 健康與心血管疾病康復咨詢考核試卷
- 價值投資在資產配置中的定位考核試卷
- 節能環保優勢考核試卷
- 水產養殖品種養殖密度與生長性能關系考核試卷
- 心理治療輔助反饋系統考核試卷
- 2025年中國PVC勞防用品數據監測報告
- 2025年中國GPS便攜機數據監測報告
- 2025年育嬰師職業資格考試試題及答案
- 2023年三種人試題附答案
- 北京市八十中學2025屆八年級英語第二學期期中經典試題含答案
- 2024年 金澤鎮專職村務工作者招錄考試真題試題含答案
- 哇哈哈品牌管理制度
- 2025年內蒙古自治區包頭市東河區第二中學英語八年級第二學期期末復習檢測模擬試題含答案
- 2025年四川省達州市中考英語真題(原卷版)
- 2024年證券市場基本法律法規真題及答案
- 湖南省2025年高考公安院校公安專業考生檔案審核表
- 2025年第十屆“學憲法、講憲法”網絡知識競賽題庫(含答案)
- 歷史●湖北卷丨2021年湖北省普通高中學業水平選擇性考試歷史試卷及答案
評論
0/150
提交評論