收藏 分享(赏)

第七章阵列 课件.ppt

上传人:无敌 文档编号:1072387 上传时间:2018-06-09 格式:PPT 页数:57 大小:151.52KB
下载 相关 举报
第七章阵列 课件.ppt_第1页
第1页 / 共57页
第七章阵列 课件.ppt_第2页
第2页 / 共57页
第七章阵列 课件.ppt_第3页
第3页 / 共57页
第七章阵列 课件.ppt_第4页
第4页 / 共57页
第七章阵列 课件.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

1、第七章 陣列 (Array),7-1-1 一維陣列的宣告,我們可以宣告10個整數資料的陣列如下: int a10; 這就產生了10個元素的整數陣列,每個元素就可以看成是一個普通的整數變數,這些變數的名稱為: a0 a1 a2 . a9 注意陣列的註標是從0算起的,所以第一個元素是 a0,而最後一個成員是 a9。這些成員會被安排在連續的記憶體位置,一個接一個,彼此相鄰。a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,其他型態的宣告也是如此,例如: int b100; 宣告100個整數的陣列 float v5; 宣告5個單精準浮點數的陣列 char name13; 宣告13個字元的陣列

2、,7-1-2 設定一維陣列的初值,陣列在宣告時,可以順便設定初始值,例如: int a10 = 99,88,77,66,55,44,33,22,11,0; 則其記憶體的內容就是: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,若宣告字元陣列: char s6=S,J,S,M,I,T; 則其記憶體的內容就是: s0 s1 s2 s3 s4 s5,有時我們會不指定陣列的元素個數,系統會根據設初值的資料,自動計算出元素個數,例如: int score= 1,3,5,7,9;,字元陣列的初值,可以直接用字串給定,例如: char t =HAPPY; 則其記憶體的內容就是: t0 t1 t

3、2 t3 t4 t5注意會多出一個0字元,這是ASCII碼值為零的字元,用來做為字串的結束符號,有時我們會用靜態變數 static int b10; 來宣告,那麼 b 陣列的初始值就自動全設為 0,而且程式執行後,會保持為上一次儲存的內容。,7-1-3 一維陣列的輸出,接著,我們來將陣列的內容,輸出到螢幕上: for (i=0; i10; i+) printf(a%d=%dn,i,ai); 注意其中 ai 是表示,a 陣列的第 i 個元素(從第 0 個算起),把它當成是一個普通的整數變數就是了。,字元陣列的輸出也可以比照辦理: for (i=0; i6; i+) printf(s%d=%cn,

4、i,si);,至於未指定個數的陣列,則根據初值的個數,逐一印出: for (i=0; i sizeof(score)/sizeof(int); i+) printf(score%d=%dn,i,scorei); 注意離開此 for 迴圈時,變數 i 的值,剛好是資料的個數,7-1-4 一維陣列的輸入,再來看看如何輸入資料給陣列: for (i=0; i10; i+) printf(input %dth data:,i); scanf(%d, 因為 ai 是第 i 個資料,所以 &ai 就是第 i 個元素的位址,,【範例 7-1-2】陣列元素的輸入與輸出,設計一程式,由鍵盤輸入10筆期中考成績,

5、存入陣列,將它們由最後一個元素開始,倒著印出其值、註標號碼,以及位址到螢幕上之後,再印出其平均值。1 /* Example 7-1-2 */2 /* array input and average */3 #define N 1045 main()6 ,7 int i,sum,midtermN;89 for (i=0; i=0; i-) 15 printf(%d %d %pn,i,midtermi,執行結果:input 0th score: 10input 1th score: 20input 9th score: 1009 100 0D9B:0FFE8 90 0D9B:0FFC0 10 0D

6、9B:0FECaverage = 55,【範例 7-1-3】求出陣列元素的最大值,設計一程式,宣告10個元素的整數陣列 score,由鍵盤輸入10筆成績給 score陣列,求出其中最大值的元素,印出其值、註標號碼。7 int i,max,scoreN;89 for (i=0; i=0 , 使用陣列的注意事項(續),(5)陣列的命名和一般的變數相同,陣列名稱可代表整個陣列的起始位址,所以 a 和 &a0 是代表相同的記憶體位址。 (6)陣列所佔記憶體的空間,可用 sizeof(陣列名稱) 來計算佔多少個位元組,而元素個數就可用: sizeof(陣列名稱)/sizeof(元素的資料型態) 來算出,

7、 使用陣列的注意事項(續),(7)兩個以上的陣列可以一起宣告,中間用逗號隔開,例如: int a10,b10,i; char c=hello,ch; (8)陣列是用註標來存取其中的元素,所以通常會配合迴圈的控制來操作。, 一維陣列的應用,【範例 7-3-1】學生成績統計 設計一程式,輸入 5 筆學生的語言成績,存入陣列後逐一印出,求出最高分,以及總平均。6 int i,a5,max,sum;78 for (i=0; i5; i+) 9 printf(input %dth score :,i);10 scanf(%d,11 ,13 for (i=0; imax) max=ai;19 printf

8、(highest score is %dn,max);2021 sum=0;22 for (i=0; i5; i+)23 sum += ai;24 printf(average is %fn,sum/5.0);,【範例 7-3-2】列印一維陣列的函數,設計一函數,傳入一整數陣列 a,以及元素個數 n,印出陣列的內容。並設計一程式,呼叫此函數,驗證其結果。3 void print_array (int , int);45 main()6 7 int t5= 3,6,9,7,0;89 print_array(t,5);,12 void print_array (int a, int n)13 14

9、 int i;1516 for (i=0; in; i+)17 printf(%d ,ai);18 ,範例 7-3-3】一維陣列求和的函數,設計一函數,傳入一整數陣列 a,以及元素個數 n,傳回陣列元素的總和。並設計一程式,呼叫此函數,驗證其結果。3 int getsum (int a, int n);45 main()6 7 int sum,count,data5=12,34,56,78,90;89 count=sizeof(data)/sizeof(int);10 sum= getsum(data,count);11 printf(sum = %dn,sum);,13 int getsum

10、 (int a, int n)14 15 int i,s;1617 s=0;18 for (i=0; in; i+)19 s += ai;20 return s;21 ,【範例 7-3-4】線性蒐尋(linear search),在電腦的應用中,最常遇到的動作,就是在一排資料中蒐尋某項資料。例如在同學名冊中,尋找某位同學的名字;在 DOS 的內部指令表中,尋找 dir 的指令;在電話號碼簿裡,蒐尋某個號碼等等。 最簡單的蒐尋方法,就是從頭到尾找一次,如果找到就印出是第幾個,若找不到就印出Not found,表示沒找到,這種方法叫做線性蒐尋法(linear search)。 如果有一排整數資料為

11、 77,66,33,22,55,44,99,88,試設計一程式輸入一整數,印出此數是否在資料列中。,3 int search1 (int key, int a , int n);45 main()6 7 int i,key,t8= 77,66,33,22,55,44,99,88;89 printf(input key to search :);10 scanf(%d,14 ,16 int search1 (int key, int a , int n)17 18 int i;1920 for (i=0; in; i+)21 if (key=ai) return i; /* found */22

12、 return -1; /* not found */23 執行結果:input key to search :99found at 6th position,【範例 7-3-5】二分蒐尋(binary search),前述的【範例 7-3-4】使用線性蒐尋法,來進行蒐尋的工作,這種方法所花費的時間,會和資料個數成正比。如果資料只有數十筆,大概還可以用,但若資料個數達到數百、數千,甚至上萬筆,就太沒有效率了。 如果資料本身已經事先由小到大依序排好,我們可改用二分蒐尋法(binary search),每次根據資料陣列 a 的中間項 amid,和所欲尋找的數值 key 進行比較。 若 key 等於

13、 amid,那就找到了,mid 就是所求的位置; 若 key 小於 amid,表示 key 可能落在陣列的左半列,我們繼續找左半陣列就可以了; 若 key 大於 amid,表示 key 可能落在陣列的右半列,我們繼續找右半陣列就可以了; 如此每次尋找的陣列範圍,都會縮小一半,直到尋獲 key 的位置,或是資料用盡表示找不到。,3 int search2 (int key, int a , int n);45 main()6 7 int i,key,t8= 22,33,44,55,66,77,88,99; /* sorted */89 printf(input key to search :);

14、10 scanf(%d,14 ,16 int search2 (int key, int a , int n)17 18 int low=0,high=n-1,mid;1920 while (low = high) 21 mid = (low+high)/2;22 if (key=amid) return mid; /* found */23 if (key amid) high=mid-1;24 else low=mid+1;25 26 return -1; /* not found */27 , 二維陣列的概念,7-4-1 二維陣列的宣告 首先,宣告一個兩列三行的二維整數陣列如下: int

15、 a23; 第一行 第二行 第三行第一列第二列,(1)二維陣列的名稱為 a,也代表整個陣列的起始位址。 (2)每一個元素的內容是整數值,共有 2x3 = 6 個元素。 (3)整個陣列配置了 2x3xsizeof(int) 個位元組的記憶體。 (4)第一列元素為 a00, a01, a02 第二列元素為 a10, a11, a12 (5)a0是一維陣列的名稱,代表第一列元素的起始位址 a1是一維陣列的名稱,代表第二列元素的起始位址 所以 &a00 與 a0 與 a 這三者都是代表整個陣列的起始位址。,(6)由於記憶體位址是連續的一維空間,所以二維陣列事實上是以一維的方式儲存在連續的記憶體位址,配

16、置的方式是採以列為主(Row major)的排列方式,也就是說先存第一列所有元素,再存第二列,依此類推:位址: X X+2 X+4 X+6 X+8 X+10 第一列 第二列 若此二維陣列的起始位址在 X,則元素 aij 的位址可算出為: &aij = X + (i*3+j)*sizeof(int) 請注意註標從 0 算起,所以開頭元素是 a00,最後一個是 a12。,7-4-2 設定二維陣列的初值,至於設定二維陣列的初值的方式如下: 例如: int a23 = 9,8,7, 6,5,4 ; 每列用大括弧框起來,裏面填入各行元素,列與列之間用逗號隔開,最後一列不加逗號,分號放在 之後。,7-4-

17、3 二維陣列的輸出,輸出二維陣列的內容到螢幕,可使用兩層迴圈,i 代表列號,j 代表行數,將各元素逐列印出: for (i=0; i2; i+) for (j=0; j3; j+) printf(%3d ,ai j); printf(n); ,7-4-4 二維陣列的輸入,至於由鍵盤輸入二維陣列,也仿此使用兩層迴圈,i 代表列號,j 代表行數,逐列輸入每個元素: for (i=0; i2; i+) for (j=0; j3; j+) scanf(%d,【範例 7-4-2】二維陣列的輸入,6 int i,j,k32;78 for (j=0; j3; j+) 9 printf(input %dth

18、row elements : ,j);10 for (i=0; i2; i+)11 scanf(%d,17 ,【範例 7-4-3】轉置矩陣,一個矩陣 Amxn 的轉置矩陣 Bnxm,就是將列數與行數對調,而任一元素 Aij 的值填入 Bji 的元素中。 設計一程式,宣告一 3 列 2 行的整數陣列 A3x2 ,設定其初值為: 3, 8, 2, 4, -1, 9 求出其轉置矩陣 B2x3,將兩陣列內容都印出到螢幕上。,6 int a32= 3,8,7 2,4,8 -1,99 ;10 int b23,i,j;1112 printf(A matrix:n);13 for (j=0; j2; j+)1

19、4 for (i=0; i3; i+)15 b j i =ai j ;,【範例 7-5-2】矩陣相加,若欲將兩個矩陣相加,必須兩者的行數相同,列數也相同,才可以相加。 設計一程式,輸入兩個 3x3 的整數矩陣 a 與 b,每次輸入一列 3 個元素,印出兩矩陣相加的結果。,9 printf(input matrix A:n);10 for (j=0; j3; j+) 11 printf(input %dth row: ,j);12 for (i=0; i3; i+)13 scanf(%d,24 ,【範例 7-5-3】矩陣相乘,若欲將兩個矩陣 Amxn 與 Bnxp 相乘,必須 A 行數與 B 的

20、列數相同,才可以相乘,結果得到陣列 Cmxp。 設計一程式,輸入整數矩陣 A3x2 與 B2x3,印出 A3x2 * B2x3 兩矩陣相乘的結果。,3 #define M 39 int aMN,bNP,cMP;24 for (j=0; jM; j+) 25 for (i=0; iP; i+) 26 c ji=0;27 for (k=0; k=0; j-) 23 printf(PASS %d :n,n-1-j);24 for (i=0; iai+1) 26 printf( swap %d,%d : ,ai,ai+1);27 t=ai;28 ai=ai+1;29 ai+1=t;30 print_array(a,n);31 32 33 ,34 void print_array (int a , int n)35 36 int i;3738 for (i=0; in; i+)39 printf(%d ,ai);40 printf(n);41 ,第七章 結束,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报