




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第 7章 數(shù)組 主要內(nèi)容7.1 數(shù)組概念7.2 一維數(shù)組7.3 二維數(shù)組7.4 字符與字符串處理*7.5 指針數(shù)組及應(yīng)用*7.6 動態(tài)數(shù)組7.1 數(shù)組概念#includeint main(void)int score,max=-1,k; for(k=0;k50;k+) scanf(“%d”,&score); if(maxscore) max=score;printf(“The maximum score is: %d”,max);return 0;例7.1 從鍵盤輸入50個學(xué)生的考試成績,找出其中的最高分(保留一位小數(shù))。改成從鍵盤輸入50個學(xué)生的考試成績,按照輸入的順序倒序輸出 ?7.1 數(shù)
2、組概念7.1 數(shù)組概念數(shù)組(array)是存放在一片連續(xù)存儲單元中的、有序非空的、有相同數(shù)據(jù)類型并有一個名字以供識別的數(shù)據(jù)集合。這個集合中的成員稱為數(shù)組元素。根據(jù)數(shù)組元素的排列方式分:一維數(shù)組(最基本的數(shù)組)多維數(shù)組7.2 一維數(shù)組7.2.1 一維數(shù)組聲明7.2.2 引用一維數(shù)組元素7.2.3 一維數(shù)組的初始化7.2.4 使用指針間接引用一維數(shù)組元素7.2.5 一維數(shù)組作函數(shù)參數(shù)7.2.6 一維數(shù)組應(yīng)用7.2.1 一維數(shù)組聲明類型說明符數(shù)組名整型常量表達(dá)式;例: float f_array 10 ; 其中:類型說明符是每個數(shù)組元素的數(shù)據(jù)類型數(shù)組名遵循標(biāo)識符的命名規(guī)則“ ”內(nèi)的整常量表達(dá)式表示數(shù)
3、組中元素的個數(shù),可以使用宏來指定 例:#define ARRAY_NUM 10 float f_arrayARRAY_NUM;數(shù)組占用的存儲空間大小:sizeof(類型說明符)整常量表達(dá)式如: float f_array10; 占用的存儲空間為410=40在程序中數(shù)組名代表分配給數(shù)組的連續(xù)存儲區(qū)域的起始地址,是個地址常量 7.2.1 一維數(shù)組聲明錯誤1:int n;scanf(“%d”,&n);int an; 錯誤2:float f_array10;f_array =123.1,12; 7.2.1 一維數(shù)組聲明7.2.2 引用一維數(shù)組元素一般形式為:數(shù)組名下標(biāo)下標(biāo)表示該數(shù)組元素在數(shù)組中排列的序
4、號,是一個整型表達(dá)式,可以含有整型變量。在C語言中,數(shù)組的下標(biāo)從0開始排列。如: float f_array10;不存在數(shù)組元素f_array10 7.2.2 引用一維數(shù)組元素“ ”:變址運(yùn)算符 “數(shù)組名下標(biāo)”表達(dá)式代表數(shù)組起始地址偏移“sizeof(數(shù)組元素類型)下標(biāo)”個字節(jié)為起始地址的連續(xù)sizeof(數(shù)組元素類型)個字節(jié)的存儲空間中的內(nèi)容數(shù)組名下標(biāo) *(數(shù)組名+下標(biāo)) #include #define ARRAY_NUM 10int main(void) int scoreARRAY_NUM,k; for(k=0;k=0;k-) printf(“%5d”,scorek); return
5、0;例7.2 從鍵盤輸入10個學(xué)生的考試成績,按照輸入的順序倒序輸出。scorek的用法與普通的整型變量一樣 7.2.2 引用一維數(shù)組元素7.2.2 引用一維數(shù)組元素引用數(shù)組元素的下標(biāo)應(yīng)是在維界范圍內(nèi)的整型值,C語言并沒有這個限制數(shù)組元素的下標(biāo)可以是任何表達(dá)式負(fù)值浮點(diǎn)數(shù):轉(zhuǎn)換方法將小數(shù)部分去掉編譯程序并不識別數(shù)組越界錯誤7.2.3 一維數(shù)組的初始化 初始化數(shù)組的所有元素。例如:int a10=0,1,2,3,4,5,6,7,8,9; 部分元素賦初值。例如:int a10=0,1,2,3,4; 全部元素置0值。例如:int a10=0,0,0,0,0,0,0,0,0,0; 或 int a10=0
6、; 在聲明數(shù)組時如果給出初始化值,可以不指定數(shù)組長度,此時數(shù)組大小由提供的初值個數(shù)確定。例如:int a =1,2,3,4,5; 7.2.3 一維數(shù)組的初始化數(shù)組初始化數(shù)據(jù)個數(shù)不能多于數(shù)組的大小。例如:int a5=1,2,3,4,5,6; 錯誤給數(shù)組提供的初始化值只能是常量表達(dá)式,不能含有變量或函數(shù)調(diào)用形式。例如:int a=3, x10=1, 2*2 , a , 4 , 5 , 6 , 7 , 8 , 9 , 10+1 ; 其中含有變量a是錯誤的。不能以“int a5 = 1 , 2 , , 4 , 5 ;”形式初始化數(shù)組元素。 聲明數(shù)組時若未給出初始化值全局?jǐn)?shù)組、靜態(tài)全局?jǐn)?shù)組、靜態(tài)局部數(shù)
7、組的元素初始化為0值動態(tài)局部數(shù)組的元素初值不確定。數(shù)組初始化注意:7.2.4 使用指針間接引用一維數(shù)組元素數(shù)組元素也可以使用指針引用數(shù)組元素。指向數(shù)組元素的指針變量的聲明與指向變量的指針變量聲明相同。例如: int a10; /* 聲明a為包含10個整型數(shù)據(jù)的數(shù)組 */int *p; /* 聲明p為指向整型變量的指針變量 */p=&a0; /* 對指針變量賦值,與p=a作用等價*/可以在聲明指針變量的同時指定其初始化值。如: int *p=&a0; 或 int *p=a; 等效于:int *p;p=&a0; /* 注意,不是 *p=&a0; */7.2.4 使用指針間接引用一維數(shù)組元素通過指針
8、變量可以引用數(shù)組元素例如:int a10, *p =&a0;*p=2; /* 表示對p當(dāng)前所指向的數(shù)組元素賦值2,與a0=2等價*/當(dāng)指針變量指向一維數(shù)組的某個元素時p+1表示將p的地址值增加一個元素長度,指向數(shù)組的下一個元素。p-1表示將p的地址值減小一個元素長度,指向數(shù)組的前一個元素。 7.2.4 使用指針間接引用一維數(shù)組元素int a10,k,*p =&a0;p+k和a+k都表示a數(shù)組的第k號元素的地址 *(p+k)*(a+k)ak,都是p+k或a+k所指向的數(shù)組元素“ ”是一個運(yùn)算符,pk *(p+k)指針變量p與數(shù)組名a的值均為數(shù)組的起始地址,但是這兩者在引用時并不等同。for(p=
9、a;a(p+10);a+)/*a+錯誤*/ printf(“%d”,*a); 7.2.4 使用指針間接引用一維數(shù)組元素7.2.4 使用指針間接引用一維數(shù)組元素例7.3 從鍵盤輸入a數(shù)組的10個元素,然后順序輸出。#include #define ARRAY_NUM 10int main(void)int aARRAY_NUM,*p,k;p=a;for(k=0;k ARRAY_NUM;k+) scanf(“%d”,p+); /* 循環(huán)結(jié)束后,p的值已為 (a+10) */ /* 添加 p=a; 可改正錯誤 */for(k=0;k10;k+,p+) printf(“%d”,*p); return
10、0;7.2.4 使用指針間接引用一維數(shù)組元素通過對指向數(shù)組元素的指針變量進(jìn)行+或-運(yùn)算運(yùn)算可以靈活地引用數(shù)組元素。若p=a+k; 則可以靈活運(yùn)用下列表達(dá)式引用數(shù)組元素:p+*p+等價于*(p+)(*p)+*(p+)與*(+p)*(p-) *(+p) *(-p)7.2.5 一維數(shù)組作函數(shù)參數(shù)數(shù)組元素作函數(shù)的實(shí)參數(shù)組名作函數(shù)的參數(shù)數(shù)組元素的地址作函數(shù)的參數(shù)。7.2.5 一維數(shù)組作函數(shù)參數(shù)1數(shù)組元素作函數(shù)的實(shí)參 數(shù)組元素作函數(shù)的實(shí)參的用法與變量一樣,被調(diào)函數(shù)中對應(yīng)的形參為與數(shù)組元素類型相同的變量。實(shí)參的值“單向傳遞”給形參 。 例7.4 輸入一個一維數(shù)組的所有元素,用0替換其中所有的非素數(shù),將變換后
11、的數(shù)組及素數(shù)個數(shù)輸出。 先定義一個判斷素數(shù)的函數(shù),遍歷數(shù)組中所有元素,對每個元素調(diào)用該函數(shù)判斷是否素數(shù),將非素數(shù)重新用0賦值,最后輸出全部數(shù)組元素。7.2.5 一維數(shù)組作函數(shù)參數(shù)#include #include #define ARRAY_NUM 10int isprime(int n)/*/int main(void)int aARRAY_NUM,k,prime_num=0;for(k=0;kARRAY_NUM;k+)scanf(“%d”,&ak);for(k=0;kARRAY_NUM;k+) if(isprime(ak) /* 數(shù)組元素作實(shí)參*/prime_num+; else ak=0
12、;7.2.5 一維數(shù)組作函數(shù)參數(shù)2數(shù)組名與數(shù)組元素的地址作為函數(shù)參數(shù) 在C語言中,調(diào)用函數(shù)時不能把全部數(shù)組元素的值傳遞給形參,只能通過數(shù)組名將數(shù)組的起始地址傳遞給形參。因一維數(shù)組的數(shù)組名就是第0個元素的地址,所以數(shù)組名作為函數(shù)參數(shù)與數(shù)組元素的地址作為函數(shù)參數(shù)本質(zhì)上一樣 。例7.5編寫函數(shù)將數(shù)組a中的n個整數(shù)按相反順序存放。反序存放即首尾數(shù)組元素交換,再將第二個數(shù)組元素與倒數(shù)第二個交換,直至數(shù)組中間為止。#include #define ARRAY_NUM 10void inv(int x ,int n) int t,i=0,j=n-1; while(i=j) t=xi;xi=xj;xj=t;
13、i+;j-; 7.2.5 一維數(shù)組作函數(shù)參數(shù)int main(void)int i,aARRAY_NUM=3,7,9, 11,0,6,7,5,4,2; inv(a, ARRAY_NUM); 7.2.5 一維數(shù)組作函數(shù)參數(shù) 本例調(diào)用inv函數(shù)時,用數(shù)組名a作為實(shí)參,傳遞給對應(yīng)的形參指針x,使x指向?qū)崊?shù)組a。被調(diào)函數(shù)中接收數(shù)組名的形式參數(shù)有3種形式:指針變量 void inv(int *x ,int n)指定了大小的數(shù)組(注意,這里指定的數(shù)組大小是無效的?。?void inv(int x10,int n)未指定大小的數(shù)組 void inv(int x ,int n)本質(zhì)都是一個指針變量,僅接收實(shí)
14、參傳遞的數(shù)組起始地址,分配一個地址量長度的存儲空間。7.2.5 一維數(shù)組作函數(shù)參數(shù)7.2.5 一維數(shù)組作函數(shù)參數(shù)注意:實(shí)參數(shù)組與形參指針的基類型應(yīng)一致。必須另設(shè)一個形式參數(shù),指出需要處理的數(shù)組的大小。編譯程序不對通過形參指針訪問的數(shù)組元素進(jìn)行越界檢測。由于形參指針接收的是實(shí)參數(shù)組的起始地址,形參與實(shí)參都指向同一存儲空間,所以在被調(diào)函數(shù)體內(nèi)通過形參指針改變數(shù)組元素的值,實(shí)參數(shù)組對應(yīng)元素的值將同時發(fā)生變化。7.2.5 一維數(shù)組作函數(shù)參數(shù)例7.6編寫函數(shù)void cyc(int a,int n),實(shí)現(xiàn)將一個有10個元素的一維數(shù)組a中的所有數(shù)據(jù)循環(huán)左移n位。如a數(shù)組中原數(shù)據(jù)是0,1,2,3,4,5,6
15、,7,8,9,當(dāng)n為3時,循環(huán)左移后a數(shù)組中的數(shù)據(jù)是3,4,5,6,7,8,9,0,1,2。7.2.5 一維數(shù)組作函數(shù)參數(shù)#include #define ARRAY_NUM 10void cyc(int a ,int n); /* 函數(shù)的引用性聲明 */int main(void) int aARRAY_NUM=0,1,2,3,4,5,6,7,8,9,n,i; scanf(“%d”,&n); cyc(a,n); /* 實(shí)參為數(shù)組名 */for(i=0;i ARRAY_NUM;i+) printf(“%d ”,ai); return 0;void cyc(int a ,int n) /* vo
16、id cyc(int *a,int n) */ int i,j,t; for(i=0;in;i+)t=a0; /* 或?qū)懗?t=*a; */ for(j=0;jARRAY_NUM-1;j+) aj=aj+1;aARRAY_NUM-1=t; 7.2.5 一維數(shù)組作函數(shù)參數(shù)7.2.6 一維數(shù)組應(yīng)用例7.7 用“埃拉托色尼篩法”求1n之間的所有素數(shù)。“埃拉托色尼篩法”算法描述:S1: 挖去1;S2: 用下一個未被挖去的數(shù)p去除p后面的數(shù),把p的倍數(shù)挖去;S3: 檢查p是否小于 的整數(shù)部分,如果是,則返回S2,否則結(jié)束;S4: 剩下的就是素數(shù)。埃拉托色尼篩法#define ARRAY_NUM 50in
17、t main(void)int aARRAY_NUM=0,n,k,p=2; scanf(“%d”,&n);for(k=2;k=n;k+)ak=k;埃拉托色尼篩法for(p=2;p=(int)sqrt(n);p+)if(ap!=0)for(k=p+1;k=n;k+)if(ak&k%p=0)ak=0;for(k=1;k=n;k+)if(ak)printf(“%d ”,ak); return 0;7.2.6 一維數(shù)組應(yīng)用例7.8將十進(jìn)制整數(shù)轉(zhuǎn)換成R進(jìn)制并輸出(R10)。將十進(jìn)制整數(shù)除以R,余數(shù)保存在數(shù)組內(nèi),直至被除數(shù)為0,再將數(shù)組中的數(shù)倒序輸出。將十進(jìn)制整數(shù)轉(zhuǎn)換成R進(jìn)制并輸出#include#def
18、ine ARRAY_NUM 20int main(void)int numARRAY_NUM,n,k=0,base,j,temp; printf(“enter 10-base nubmer:”);scanf(“%d”,&n); printf(“enter base:”);scanf(“%d”,&base); temp=n;將十進(jìn)制整數(shù)轉(zhuǎn)換成R進(jìn)制并輸出 do numk+=temp%base; temp/=base; while(temp!=0); printf(“The decimal %d has been converted to %d-base number:”,n,base); for
19、(j=k-1;j=0;j-)printf(“%d”,numj); printf(“.n”); return 0;7.2.6 一維數(shù)組應(yīng)用例7.9 智得獎品。如圖7-4所示,12個人圍成一圈,希望得到一份獎品。獎品得主按下面的要求產(chǎn)生:從第1個人開始13報數(shù),報到3的人走出圈;從出圈者后面的人開始,重新13報數(shù),報到3的人再走出圈。如此重復(fù)直到圈中只剩下1人就是獲獎?wù)?。小紅根據(jù)規(guī)則,動了一下腦筋,最后如愿以償獲得了獎品。請問小紅開始時站在哪個位置?本題需要解決3個小問題:第一,12個人圍成一圈;可用數(shù)組元素a1至a12表示12個位置,初始值為非零數(shù),使用%運(yùn)算即可表示圍圈;第二,1至3報數(shù),報到
20、3的人走出圈;可使用內(nèi)循環(huán),當(dāng)該位置為非零值增1,到3為止,將該位置數(shù)組元素值賦值為0;第三,直到圈中只剩下1人。對賦值為0的位置計(jì)數(shù),當(dāng)該數(shù)為11時(即走出11人時),剩下的數(shù)組元素非零值的位置就是答案。7.2.6 一維數(shù)組應(yīng)用智得獎品#include#define ARRAY_NUM 13int main(void) int aARRAY_NUM=0,i,j,m,count; for(i=1;iARRAY_NUM;i+) ai=1; for(i=0,count=1;count12;count+) for(m=0;m3;) i=i%(ARRAY_NUM-1)+1;if(ai!=0) m+;
21、ai=0; 智得獎品 for(i=1;iARRAY_NUM;i+) if(ai)printf(“%dn”,i); return 0;7.2.6 一維數(shù)組應(yīng)用在計(jì)算機(jī)領(lǐng)域里,排序和查找是兩種最基本的算法。一個排序算法是能將資料依照特定排序方式排列的一種方法。排序的輸出必須遵守下列兩個原則:輸出結(jié)果為遞增序列或遞減序列輸出結(jié)果是原輸入的一種排列、或是重組,不允許出現(xiàn)其他數(shù)值3種基本的排序方法:交換排序(exchange sort)選擇排序(selection sort)插入排序(insertion sort)7.2.6 一維數(shù)組應(yīng)用例7.10將一個一維數(shù)值數(shù)組中的元素用冒泡法升序排序。冒泡排序(b
22、ubble sort) 算法思想:S1: 首先將所有待排序的數(shù)放入一個一維數(shù)組中;S2: 從數(shù)組的第一個元素開始,依次將相鄰兩個元素的值進(jìn)行比較,若前一個元素大于下一個元素,則將它們互相交換。S3: 重復(fù)S2步驟,直至再也沒有交換為止。對n個數(shù)升序排序最差情況是原序列為降序序列,此時要排n-1趟,其中第j趟中要進(jìn)行n-j次比較。7.2.6 一維數(shù)組應(yīng)用冒泡法排序985420854209542089420589204589第一趟第二趟第三趟第四趟第五趟7.2.6 一維數(shù)組應(yīng)用void sort(int temp_array ,int n) int i,j,t,flag; for(i=0;in-1
23、;i+) flag=1; for(j=0;j temp_arrayj+1) t=temp_arrayj; temp_arrayj=temp_arrayj+1; temp_arrayj+1=t; flag=0; if(flag) break; 冒泡法排序void sort(int temp_array ,int n) /* 遞歸函數(shù) */int k,t,flag=1;if(n=1) return;else for(k=0;ktemp_arrayk+1)t=temp_arrayk;temp_arrayk=temp_arrayk+1;temp_arrayk+1=t;flag=0; if(flag)
24、return;elsesort(temp_array,n-1); 7.2.6 一維數(shù)組應(yīng)用冒泡法排序7.2.6 一維數(shù)組應(yīng)用交換法排序的另一種方法985420第一趟第二趟第三趟第四趟第五趟9854209854209854205984207.2.6 一維數(shù)組應(yīng)用void sort(int temp_array ,int n) /* 交換法排序 */int i,j,t;for(i=0;in-1;i+) for(j=i+1;j temp_arrayj) t=temp_arrayi;temp_arrayi=temp_arrayj;temp_arrayj=t; /* 交換 */7.2.6 一維數(shù)組應(yīng)用例
25、7.11 編寫函數(shù)實(shí)現(xiàn)選擇法升序排序。選擇法升序排序算法:S1:設(shè)數(shù)組內(nèi)存放了n個待排序的數(shù);S2:i=0;S3:從數(shù)組的第i+1號元素開始到第n-1號元素,尋找最小元素的下標(biāo),并記錄;S4:將上一步找到的最小元素和第i號元素交換;S5:使i增1,如果i等于n-1,算法結(jié)束,否則回到第S3步。7.2.6 一維數(shù)組應(yīng)用選擇法排序985420第一趟第二趟第三趟第四趟第五趟0point12345985420123498542023i01298542033985420447.2.6 一維數(shù)組應(yīng)用void sort(int temp_array ,int n) int i,j,point,t;for(i
26、=0;in-1;i+) point=i; for(j=i+1;j temp_arrayj) point=j; if(point!=i) t=temp_arraypoint; temp_arraypoint=temp_arrayi; temp_array i=t; 選擇法排序7.2.6 一維數(shù)組應(yīng)用例7.12 編寫函數(shù)實(shí)現(xiàn)插入法升序排序。插入法升序排序算法:S1: 首先新建一個空列表,用于保存已排序的有序數(shù)列;S2: 從原數(shù)列中取出一個數(shù),將其插入“有序列表”中,使其仍舊保持有序狀態(tài);S3: 重復(fù)S2步驟,直至原數(shù)列為空。7.2.6 一維數(shù)組應(yīng)用插入法排序985420第一趟ti18895420第
27、二趟ti2589420第三趟ti3458920第四趟ti498554422458920第五趟ti5007.2.6 一維數(shù)組應(yīng)用已經(jīng)從小到大排好i個元素,現(xiàn)將第i+1個元素(即第i號元素)插入合適的位置,使其仍舊保持有序狀態(tài)。第一步,查找合適的位置(下標(biāo)j),滿足條件 aj-1=ai& ai=aj;第二步,插入元素ai,將aj至ai-1的所有元素后退一個元素位置,把a(bǔ)j空出以便存放待插入的值。后退一個元素位置的操作也可以和查找合適位置合并一起操作,即查到合適位置之前都把元素向后退一個元素位置。插入法排序7.2.6 一維數(shù)組應(yīng)用void sort(int temp_array ,int n) in
28、t i,j,t;for(i=1;in;i+)t=temp_arrayi; for(j=i-1;t=0;j-) temp_arrayj+1=temp_arrayj; temp_arrayj+1=t;插入法排序7.2.6 一維數(shù)組應(yīng)用查找算法:線性查找法(sequential search)折半查找法(binary search)7.2.6 一維數(shù)組應(yīng)用例7.13 使用線性查找法在數(shù)組中查找指定數(shù)據(jù)在數(shù)組中的位置。顧名思義,線性查找法就是順著列表的元素序列一個一個比較列表中的元素是否與待查的數(shù)據(jù)相等,若相等則輸出位置下標(biāo),若列表中的元素都與待查的數(shù)據(jù)不相等,則輸出找不到信息。7.2.6 一維數(shù)組應(yīng)
29、用#include #define ARRAY_NUM 10int main(void)int x =45,67,23,43,45,34,5,23,64,56, m=-1,i,key; scanf(“%d”,&key); for(i=0;iARRAY_NUM;i+) if(xi=key) m=i; break; if(m!=-1) printf(“found! %d”,m); else printf(“not found!”); return 0;線性查找法7.2.6 一維數(shù)組應(yīng)用例7.14使用折半查找法在有序數(shù)組中查找指定數(shù)據(jù)在數(shù)組中的位置。使用均分確定的方式:先測中點(diǎn)元素是否為待查找數(shù)據(jù):
30、若是則輸出中點(diǎn)下標(biāo)不是則比較待查找數(shù)據(jù)與中點(diǎn)元素的大小:如若中點(diǎn)元素較大,則表示待查找數(shù)據(jù)只可能出現(xiàn)在所有數(shù)據(jù)的上半部分,如若中點(diǎn)元素較小,則表示待查找數(shù)據(jù)只可能出現(xiàn)在所有數(shù)據(jù)的下半部分,縮小一半數(shù)據(jù)范圍繼續(xù)測中點(diǎn)元素,直到找到匹配或數(shù)據(jù)范圍縮小至無元素可測時結(jié)束。 7.2.6 一維數(shù)組應(yīng)用在數(shù)組(5,23,28,34,43,45,56,60,67,90)中尋找34。 折半查找法7.2.6 一維數(shù)組應(yīng)用while(low=high) mid=(low+high)/2; if(xmid=key) k=mid;break; if(key=high) return 1; else if(keyxmi
31、d) return b_search(x,low,mid-1,key); else return b_search(x,mid+1,high,key); 折半查找法(遞歸)7.3 二維數(shù)組7.3.1 二維數(shù)組聲明與二維數(shù)組元素引用7.3.2 二維數(shù)組初始化7.3.3 使用指針間接引用二維數(shù)組元素7.3.4 二維數(shù)組作函數(shù)參數(shù)7.3.5 二維數(shù)組應(yīng)用7.3.1 二維數(shù)組聲明與二維數(shù)組元素引用聲明二維數(shù)組的一般形式是:類型說明符 數(shù)組名整型常量表達(dá)式1 整型常量表達(dá)式2整型常量表達(dá)式1表示第一維的大?。葱袛?shù))整型常量表達(dá)式2表示第二維的大?。戳袛?shù))例如: float a34; 7.3.1 二維
32、數(shù)組聲明與二維數(shù)組元素引用可以將二維數(shù)組看成n個特殊的一維數(shù)組。a a0 a00 a01 a02 a03 a1 a10 a11 a12 a13 a2 a20 a21 a22 a237.3.1 二維數(shù)組聲明與二維數(shù)組元素引用二維數(shù)組元素的一般表示或引用形式為:數(shù)組名行下標(biāo)列下標(biāo)二維數(shù)組元素行與列均從0開始編號 7.3.1 二維數(shù)組聲明與二維數(shù)組元素引用#includeint main(void) int a34,i,j;for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d”,&aij);for(i=0;i3;i+) for(j=0;j4;j+) printf(“%5d”
33、,aij);printf(“n”); return 0;例7.17 輸入一個3的二維數(shù)組,并按矩陣形式輸出。7.3.1 二維數(shù)組聲明與二維數(shù)組元素引用二維數(shù)組不可能以矩陣方式存儲,仍然以線性排列。在C語言中,二維數(shù)組是按行存儲的,即先存儲完序號為0的行,接著存儲序號為的行,其余依此類推。 7.3.1 二維數(shù)組聲明與二維數(shù)組元素引用對于更多維的數(shù)組也可以降階理解。例如: float b234; 存儲順序?yàn)椋篵000b001b002b003b010b011b012b013b020b021b022b023b100b101b102b103b110b111b112b113b120b121b122b123
34、7.3.1 二維數(shù)組聲明與二維數(shù)組元素引用float a34, b234,c4; a、b、c a0、a1、a2、b00、b01、b02、b10、b11、b12 a、a0、&a00 a+1、a0+17.3.2 二維數(shù)組初始化帶有初始化值的數(shù)組聲明的一般形式如下:存儲類型 數(shù)據(jù)類型 數(shù)組名整型常量表達(dá)式1整型常量表達(dá)式2 = 常量表 常量表中給出的初始化值按數(shù)組的存儲順序給出,僅能是常量或常量表達(dá)式,且給出的初始化常數(shù)個數(shù)不能多于數(shù)組中數(shù)組元素的個數(shù)。7.3.2 二維數(shù)組初始化初始化數(shù)據(jù)按存儲順序依次寫在一個花括號內(nèi),作為對應(yīng)元素的初值。例如:int a34=1,2,3,4,5,6,7,8,9,1
35、0,11,12; 以行為單位給出初值。例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;對部分元素賦初值,未被賦值的其他元素自動置值0。例如:int a34=1,5,9; 7.3.2 二維數(shù)組初始化只對前幾行元素賦初值。例如:int b34=1,5,6; 可以不指定第一維的大?。ū仨氈付ǖ诙S的長度), 此時這一維的長度由給出的初始化值的個數(shù)確定。例如 int a 4=1,2,3,4,5,6,7,8,9,10,11,12;對部分元素分行賦初值時,也可省略第一維的長度。例如: int a 4=0,0,3,0,0,10; 7.3.3 使用指針間接引用二維數(shù)組元素二維數(shù)組
36、元素的引用形式也有下標(biāo)法和指針法。 aij *(*(a+i)+j)使用指針變量間接引用數(shù)組元素有兩種方法:一是直接使用指針變量指向數(shù)組元素二是使用指針變量指向二維數(shù)組的行7.3.3 使用指針間接引用二維數(shù)組元素直接使用指針變量指向數(shù)組元素與一維數(shù)組的間接引用方式一樣,定義指針變量的基類型為數(shù)組元素的類型即可。例7.18 使用指針變量輸出一個3的二維數(shù)組的所有元素。#includeint main(void)int a34=1,3,5,7,9,11,13,15,17,19,21,23;int *p; for(p=a0;pa0+12;p+) printf(“%d ”,*p);7.3.3 使用指針間
37、接引用二維數(shù)組元素行指針變量聲明的一般形式: 基類型 (*指針變量名)常量表達(dá)式 此時指針變量的基類型為一個一維數(shù)組。例如: float (*p)4; 聲明了一個指向每行有4個float型元素的行指針變量 p,p的基類型為float 4注意:定義時 *p兩側(cè)的括號不可缺少7.3.3 使用指針間接引用二維數(shù)組元素行指針變量可以指向有任意行數(shù)、每行有m列的二維數(shù)組。例:float a34,(*p)4; p=a;p+i 則指向a 的i行元素的存儲起始地址*(p+i)+j 表示數(shù)組中行序號為i、列序號為j的元素的地址*(*(p+i)+j) pij (*(p+i)j,當(dāng)p=a時,訪問元素aij7.3.3
38、 使用指針間接引用二維數(shù)組元素例7.19 使用行指針變量引用數(shù)組元素,輸出一個二維數(shù)組的所有元素。#include int main(void)int a34=1,3,5,7,9,11,13,15,17,19,21,23,k; int (*p)4; for(p=a;pa+3;p+) for(k=0;k4;k+) printf(“%d ”,(*p)k);return 0;7.3.4 二維數(shù)組作函數(shù)參數(shù)二維數(shù)組作為函數(shù)參數(shù)也有3種情況:數(shù)組元素作為函數(shù)的實(shí)參數(shù)組地址及數(shù)組元素的地址作函數(shù)實(shí)參指向變量的指針變量指向行的行指針變量7.3.4 二維數(shù)組作函數(shù)參數(shù)用指向變量的指針變量作為形參實(shí)質(zhì)上是將二維
39、數(shù)組降成一維數(shù)組處理。例7.20 使用函數(shù)找出34矩陣中的最大元素。#include int max_value(int *b,int n)int k,max=*b;for(k=0;kmax) max=bk; return(max);int main(void)int a34=1,3,5,7,2,4,6,8,15,17,34,12,max;max=max_value(a0,12) ; /* 或*a或&a00 */printf(“The max value is %dn”,max); return 0;指向變量的指針變量作為形參用行指針變量作為函數(shù)的形參,調(diào)用函數(shù)的實(shí)參必須是行地址??梢詫⒗?.
40、20改成:#include int max_value(int (*array)4)/*int array34 或 int array 4 */int j,k,max=array00;for(k=0;k3;k+) for(j=0;jmax) max=arraykj; return(max);int main(void)int a34=1,3,5,7,2,4,6,8,15,17,34,12;printf(“The max value is %dn”,max_value(a);return 0;7.3.4 二維數(shù)組作函數(shù)參數(shù)行指針變量作為形參7.3.5 二維數(shù)組應(yīng)用 例7.21 矩陣轉(zhuǎn)置,并輸出轉(zhuǎn)
41、置前后的矩陣。矩陣轉(zhuǎn)置即將一個矩陣行列互換,用二維數(shù)組實(shí)現(xiàn)矩陣轉(zhuǎn)置只需將存放在數(shù)組中元素的行下標(biāo)和列下標(biāo)互換位置即可。7.3.5 二維數(shù)組應(yīng)用#include int main(void) int i,j,a23=1,2,3,4,5,6, b32; for(i=0;i2;i+) for(j=0;j3;j+) bji=aij; printf(“array a:n”); for(i=0;i2;i+) for(j=0;j3;j+) printf(“%5d”,aij); printf(“n”); printf(“array b: n”); for(i=0;i3;i+) for(j=0;j2;j+) p
42、rintf(“%5d”,bij); printf(“n”); return 0;例7.217.3.5 二維數(shù)組應(yīng)用矩陣乘法是線性代數(shù)中最常見的運(yùn)算之一,它在數(shù)值計(jì)算中有廣泛的應(yīng)用。 矩陣A : mr ,矩陣B:rn , 則CAB,是一個mn的矩陣。 C中的元素Cij定義為: 每計(jì)算C的一個元素Cij,需要做r個乘法和r-1次加法。矩陣C在計(jì)算之前每個元素必須清零。例7.22 編寫程序?qū)崿F(xiàn)m行r列矩陣與r行n列矩陣的乘積#includeint main(void) int a23=1,2,3,4,5,6,b34=1,2,3,4,5,6,1,2,3,4,5,6 , c24=0 , i,j,k; f
43、or(i=0;i2;i+) for(j=0;j4;j+) for(k=0;k3;k+) cij+=aik*bkj; for(i=0;i2;i+,printf(“n”) for(j=0;j4;j+) printf(“%4d”,cij); return 0;7.3.5 二維數(shù)組應(yīng)用例7.22 編寫程序?qū)崿F(xiàn)m行r列矩陣與r行n列矩陣的乘積#includeint matrix(int a33) int sum=0,i,j; for(i=0;i3;i+) for(j=0;j3;j+) if(i=j | i+j=2) sum=sum+aij; return sum;7.3.5 二維數(shù)組應(yīng)用例7.23編寫函
44、數(shù)matrix計(jì)算某個33矩陣對角線元素之和并返回其值。 int main(void) int a33= 1,2,3,4,5,6, 7,8,9,count,i,j; count=matrix(a); for(i=0;i3;i+) for(j=0;j3;j+) printf(“%d ”,aij); putchar(“n”); printf(“%dn”,count); return 0;數(shù)組應(yīng)用-補(bǔ)充演示從鍵盤輸入一個班n個同學(xué)的英語成績,這里的n也是由鍵盤輸入決定,計(jì)算平均成績。5個一行顯示輸入的成績。輸出這些平均成績。#include int main()float score100,aver
45、age_score;int i,n;printf(please enter number of students:);scanf(%d,&n);if(n100)printf(too many students,max limit is 100.!n);return -1;printf(please enter score of students:n);for(average_score=0,i=0;in;i+)scanf(%f,&scorei);average_score+=scorei;average_score/=n;printf(the scores of students:n);for
46、(i=0;in;i+)printf(%6.1f,scorei);if(i+1)%5=0) printf(n);printf(nThe average score is:%.2fn,average_score);return 0;7.4 字符與字符串處理 7.4.1字符處理7.4.2字符數(shù)組與字符串7.4.3字符型指針變量7.4.4 字符串輸入輸出7.4.5 字符串處理7.4.6 字符串處理例7.4.1字符處理1. 字符輸入輸出函數(shù) intgetchar()intputchar(int ch)7.4.1字符處理2. 常用的字符處理庫函數(shù)ctype.hint isalnum(int ch)int
47、isalpha(int ch)int iscntrl(int ch)int isdigit(int ch) int isgraph(int ch) int islower(int ch)int isupper(int ch)int isprint(int ch)int ispunct(int ch)int isxdigit(int ch)int toupper(int ch)int tolower(int ch)int isspace(int ch) 7.4.1字符處理可利用getchar函數(shù)實(shí)現(xiàn)一行字符的輸入;每讀入一個字符判斷是否為n,若是結(jié)束輸入,輸出統(tǒng)計(jì)的單詞數(shù);否則判斷是否新單詞開始
48、決定是否進(jìn)行單詞計(jì)數(shù)。 由于單詞之間分隔的空格不一定是一個,所以不能簡單地以單一的一個空格作為的單詞間的分隔符。 分析如下英文句子:Internetware is an emerging service-based software model.,發(fā)現(xiàn)僅當(dāng)一個非空格字符前面是一個空格時(新單詞的開始)才需要進(jìn)行單詞計(jì)數(shù),這可以作為單詞分隔的判斷。例7.24 輸入一行字符,統(tǒng)計(jì)其中有多少個單詞,單詞之間用空格分隔。#include #include int main(void) int num=0; /* 單詞個數(shù) */ int space=1; /* 是否空格的標(biāo)志,是空格為1,不是為0 */
49、 char ch; while(ch=getchar()!=n) if(isspace(ch) space=1; else /* 當(dāng)前字符為非空格 */ if(space) num+; /* 前一個字符是空格, 表示新單詞開始,單詞個數(shù)增1 */ space=0; /* 當(dāng)前字符為非空格,space賦為0 */ printf(“There are %d words in the line.n”,num); return 0;7.4.1字符處理例7.24 輸入一行字符,統(tǒng)計(jì)其中有多少個單詞,單詞之間用空格分隔。7.4.2字符數(shù)組與字符串C語言中有字符串常量,但沒有字符串類型說明符,也沒有對應(yīng)的字
50、符串變量。但可以利用一維字符型數(shù)組表示與處理字符串。字符數(shù)組,顧名思義即數(shù)組中每個元素的值是一個字符。例如“char c10; ”定義了能存放10個字符的一維字符型數(shù)組。7.4.2字符數(shù)組與字符串在聲明字符型數(shù)組的同時也可以對字符數(shù)組初始化,也可以通過賦值語句及從外部讀入對字符數(shù)組元素賦值。例如:char c10=I, , a, m, , h, a, p, p, y;c0=I; c1= ; c2=a; c3=m; c4= ; c5=h; c6=a; c7=p; c8=p; c9= y;for(i=0;i10;i+) ci=getchar();7.4.2字符數(shù)組與字符串C語言的字符串必須以字符0
51、作為字符串結(jié)束標(biāo)志。計(jì)算字符串長度時并不包括0例如字符串“How do you do?n”長度為15。當(dāng)用字符數(shù)組存儲字符串時,字符數(shù)組內(nèi)必須存放字符串結(jié)束標(biāo)志0,應(yīng)保證定義的字符數(shù)組長度大于字符串的實(shí)際長度。例如:“How do you do?n”存放到字符數(shù)組str中,則str的長度至少定義為16。7.4.2字符數(shù)組與字符串使用字符串初始化字符數(shù)組,可以采用如下方式:char str =“I am happy”;或 char str =“I am happy”;char str = I, , a, m, , h, a, p, p, y, 0;數(shù)組str的長度不是10而是11如果初始化時數(shù)組
52、的長度比字符串長度大,后面多余的元素用0填充。例如 char c10= “China”;數(shù)組c中各元素的內(nèi)容如下:7.4.3字符型指針變量可以用字符型指針變量指向一個字符串字符型指針變量即基類型為字符類型的指針變量。例如: char *string;。字符指針變量的取值:char sarray10,ch=A ,*string;string=&ch; /*字符變量的地址*/string=sarray; /*字符數(shù)組名*/string=“I love China!”; /*字符串常量*/7.4.3字符型指針變量若聲明了一個指針變量且使它指向一個字符串后,可以用下標(biāo)形式引用指針變量所指向的字符串中的
53、字符。例如:char *string=“I love China!”; int i; for(i=0; stringi!=0;i+) printf(“%c”, stringi);7.4.3字符型指針變量 初始化含義與效果不同。如對于: char sarray20= “I love China!”;/*把字符串的各個字符順序存儲到數(shù)組sarray的每個元素中*/ char *string=“I love China!”;/*把存放“I love China!”存儲空間的首地址存儲到指針變量string中,使其指向字符串“I love China!” */字符數(shù)組與字符指針的差別:7.4.3字符型
54、指針變量 存儲空間大小與存放的內(nèi)容不同。字符數(shù)組有確定大小的存儲空間,由若干個元素組成,每個元素中放一個具體的字符;分配給字符指針變量的存儲空間只能存放一個地址。字符數(shù)組與字符指針的差別:7.4.3字符型指針變量 地址常量與地址變量的區(qū)別。數(shù)組名代表分配給數(shù)組的存儲空間的首地址,是一個確定的不可以改變的地址常量; 例如: char sarray =“I love China!”; sarray=sarray+7;/* 錯誤 */指針變量的值是可以改變的。 char * string=“I love China!”; string=string+7;/* 正確*/7.4.3字符型指針變量 使用要
55、求不同。只能對字符數(shù)組的各個元素賦值,不能對字符數(shù)組整體賦值。 例如:char sarray20 , * string; sarray=“I love China!” /*錯誤*/ string=“I love China!”; /*正確*/數(shù)組與數(shù)組的每個元素都有確定的地址,可以直接用于存儲字符或字符串。字符指針變量,開始時該存儲單元內(nèi)的值并不確定,不能直接使用。 例如: char sarray20;sarray1= a;/* 正確 */ char * string; string1= a;/* 錯誤 */ 但下面的指針使用是正確的:char *string, str10;string=st
56、r;string1= a; 字符數(shù)組與字符指針的差別:7.4.4 字符串輸入輸出輸入輸出字符串有兩種方法:逐個字符輸入輸出: 可以使用循環(huán)結(jié)構(gòu)及getchar、putchar函數(shù)或利用%c格式說明符的scanf、printf函數(shù)將整個字符串一次輸入輸出7.4.4 字符串輸入輸出利用gets函數(shù)輸入字符串在頭文件中有g(shù)ets函數(shù)的原型引用性聲明:char *gets(char *str);gets函數(shù)功能:從標(biāo)準(zhǔn)輸入流(stdin或鍵盤)中讀取字符串,將讀入的結(jié)果存放到字符指針變量str指向的存儲空間中,一直到n為止,并將工程n轉(zhuǎn)換成0作為讀入字符串的結(jié)束標(biāo)志。若讀入成功,則返回字符串的存放的起
57、始地址;若讀入出錯或遇到EOF則返回空指針(NULL)。1. 字符串的輸入7.4.4 字符串輸入輸出如執(zhí)行如下的語句:char sarray20;gets(sarray);輸入的字符串中可以含有空格與Tab字符。gets函數(shù)對輸入字符的個數(shù)是否超過數(shù)組的長度將不加任何檢查,為保程序的正確性,輸入字符串的長度不應(yīng)超過數(shù)組的大小。1. 字符串的輸入7.4.4 字符串輸入輸出scanf函數(shù),格式轉(zhuǎn)換說明符%s功能:從標(biāo)準(zhǔn)輸入流(stdin或鍵盤)中讀取字符串,將讀入的結(jié)果存放到與%s對應(yīng)的字符指針變量或字符數(shù)組名指向的存儲空間中,直到遇到空格、Tab、回車換行符為止,并在已讀入的字符后自動加上0字符
58、作為讀入字符串的結(jié)束標(biāo)志。例如:char sarray20;scanf (“%s”,sarray); 或scanf (“%s”,&sarray0);1. 字符串的輸入7.4.4 字符串輸入輸出對于如下語句:char sarray15, sarray 25, sarray35;scanf(”%s%s%s”,sarray1,sarray2,sarray3);若執(zhí)行時從鍵盤輸入:How are you? (“”表示Enter鍵)1. 字符串的輸入7.4.4 字符串輸入輸出使用%s的scanf函數(shù)輸入字符串有兩種情況需要注意:%s格式說明符以空白字符用作為輸入分隔符,格式控制字符串中若含有普通字符,則
59、輸入時必須輸入與普通字符匹配的字符。例如: int m=5;char n10;scanf(“%s m%d”,n,&m); /* m前有空格 */printf(“n=%s,m=%dn”,n,m);輸入:asdfgm123 輸出:n=asdfg,m=123 1. 字符串的輸入7.4.4 字符串輸入輸出例如: int m=5;char n10;scanf(“%sm%d”,n,&m); /*其中的m前無空格*/ printf(“n=%s,m=%dn”,n,m); 輸入:asdfgm123輸出:n=asdfg,m=5 輸入:asdfg12 輸出:n=asdfg,m=5 輸入:asdfgm123 輸出:n
60、=asdfgm123,m=5 1. 字符串的輸入7.4.4 字符串輸入輸出格式控制字符串中的%s格式說明符后有空白字符的處理。例如有程序段:char m12, n10; scanf(“%sn%sn”,n,m); printf(“n=%s,m=%sn”,n,m);如果輸入:aaaaaabbbbbk則輸出為:n=aaaaaa,m=bbbbb 1. 字符串的輸入7.4.4 字符串輸入輸出puts函數(shù)函數(shù)原型引用性聲明為:int puts(const char *str);puts函數(shù)功能:將str所指出的字符串送到標(biāo)準(zhǔn)輸出流stdout中。輸出時一但遇到字符串結(jié)束標(biāo)志0 輸出立即停止,且把0轉(zhuǎn)換成n
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 批發(fā)業(yè)貨架陳列技巧考核試卷
- 健康營養(yǎng)品批發(fā)商的智慧物流技術(shù)創(chuàng)新應(yīng)用考核試卷
- 勘察項(xiàng)目項(xiàng)目管理海洋工程文化建設(shè)考核試卷
- 體育組織的歷史與演變考核試卷
- 用火安全主題班會課件
- 交通文明與安全課件
- 作品采購合同范本模板
- 芒果直播代售合同范本
- 裝修工程供應(yīng)合同范本
- 酒店客房服務(wù)規(guī)范與操作流程優(yōu)化制度
- 新媒體營銷:營銷方式+推廣技巧+案例實(shí)訓(xùn) 微課版 第2版 教案全套
- 測繪地理信息標(biāo)準(zhǔn)化與規(guī)范化
- 精索靜脈曲張臨床路徑表單
- 2024年山東圣翰財貿(mào)職業(yè)學(xué)院單招綜合素質(zhì)考試題庫含答案(綜合卷)
- 委外催收機(jī)構(gòu)入圍項(xiàng)目投標(biāo)技術(shù)方案(技術(shù)標(biāo))
- 肝與膽病辨證課件
- (正式版)JBT 2930-2024 低壓電器產(chǎn)品型號編制方法
- 工程機(jī)械作業(yè)安全培訓(xùn)
- 部編版語文七年級下冊第三單元大單元整體教學(xué)設(shè)計(jì)
- 塑料件外觀檢驗(yàn)規(guī)范
- 消費(fèi)者行為學(xué)教案-消費(fèi)群體與消費(fèi)者行為教案
評論
0/150
提交評論