第6章 利用數組處理批量數據_第1頁
第6章 利用數組處理批量數據_第2頁
第6章 利用數組處理批量數據_第3頁
第6章 利用數組處理批量數據_第4頁
第6章 利用數組處理批量數據_第5頁
已閱讀5頁,還剩41頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、n一維數組的定義和引用一維數組的定義和引用n二維數組的定義和引用二維數組的定義和引用n字符數組字符數組第第6章章 數組數組u定義定義:把:把具有相同類型具有相同類型的若干變量按的若干變量按有序有序的形的形式組織起來。這些式組織起來。這些按序排列的同類數據元素的按序排列的同類數據元素的集合集合稱為稱為數組數組。u分類分類: 元素的類型:元素的類型:數值數值數組、數組、字符字符數組、數組、指針指針數組、數組、結構結構數組等;數組等; 維數:維數:一維一維數組、數組、二維二維數組、數組、數組數組一維數組的定義和引用一維數組的定義和引用u一維數組:一維數組: 類型說明符類型說明符 數組名數組名 常量表

2、達式常量表達式 ;u 常量常量表達式:元素的個數,即表達式:元素的個數,即數組長度數組長度。 例如:例如:int a10;int a10; 它表示數組名為它表示數組名為a a,此數組有此數組有1010個元素。個元素。下標從下標從0 0開始,開始,即即a0, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9a1, a2, a3, a4, a5, a6, a7, a8, a9。u注意注意:u數組長度是數組長度是固定固定的,不能是的,不能是變化變化的;的;u下標從下標從0 0開始;開始;u不能使用數組元素不能使用數組元素a10a10。u功能方面,數組中每個元素與普通變量等

3、價u數組元素引用:針對每個元素進行u輸入:scanf(“%d”, &ai);u輸出:printf(%d, ai);u注意:輸入和輸出數值型數組元素必須使用循環語句逐個輸入輸出各下標變量,而不能用一個語句輸出整個數組。下面的寫法是錯誤的: scanf(%d, a); printf(%d, a); 一維數組的定義和引用一維數組的定義和引用例:對數組a中10個元素分別賦值為0到9,并依次打印: #includestdio.h void main( ) int i,a10; for(i=0;i=9;i+) ai=i; for(i=0;i=9;i+) printf(%d ,ai); 012345

4、6789a0a0a1a1a2a2a3a3a4a4a5a5a6a6a7a7a8a8a9a9一維數組的定義和引用一維數組的定義和引用u初始化:定義數組時,初始化各元素的值(1) 對所有元素賦初值,如: int a10= 0,1,2,3,4,5,6,7,8,9 ;(2) 對部分元素賦初值,如: int a10= 0,1,2,3,4 ; (前5個元素賦初值,后5個元素值為0)(3) 若想使數組中元素值均為1,可寫成 int a10= 1,1,1,1,1,1,1,1,1,1 ; 但不能寫成:int a10=1*10;或 int a10=1 ;(4) 賦初值時,數組長度可省略,其長度值有初值的個數決定,如

5、: int a5=1,2,3,4,5; 可寫為: int a =1,2,3,4,5;一維數組的初始化一維數組的初始化例:輸入20個數,找出其中最大數,并輸出。 #include int main( ) int i,max,a20; printf(input 20 numbers:n); for(i=0;i20;i+) scanf(“%d”,&ai); /*輸入20個數*/ max=a0; /*先把第一個數作為最大數*/ for(i=1;imax) max=ai; /*max中存放當前最大數*/ printf(maxmum=%dn,max); return 0; 例:求Fibonacci

6、數列的前20項的值。 a1=a2=1an=an-1+an-2 #include int main( ) int a20= 1, 1 ; int j; for (j=2; j20; j+) aj = aj-1+aj-2; for (j=0; j20; j+) printf(%dt, aj); return 0;例:輸入10個整數,按從小到大的順序輸出 #include int main( ) int i,j,temp,a10; printf(n input 10 numbers:n); for(i=0;i10;i+) scanf(“%d”,&ai); /*輸入無序的10個數*/ for(

7、i=0;i9;i+) /*選擇排序*/ for(j=i+1;jaj) temp=ai; ai=aj; aj=temp; for(i=0;i10;i+) /*輸出有序的10個數*/ printf(%d,ai); return 0 改進的選擇排序:#includeint main ( ) int i,j,t,p, a10; for (i=0; i10; i+) scanf (%d, &ai); /*輸入無序的10個數*/ for ( i=0; i9; i+ ) /* 進行9次比較 */ p=i; /* p為排序過程中最小元素的下標 */ for (j=i+1; jaj) p = j; /*

8、 若有更小的數則記錄下標 */ if ( p != i ) t=ap; ap=ai; ai=t; /* 一次交換到位 */ for (i=0; i10; i+)/* 輸出排序后的結果 */ printf (%d , ai); return 0; 基本思想:將一堆無序的數據進行從小到大的排序,分若干次的排序,每一趟的排序都是將相鄰兩個數比較,將小的調到前頭,即實現小的數“上升”,大的數“下沉”。且每趟“下沉”到最后的數即該趟比較的數據的最大的數。例如:9,8,5,4,2,0(共6個數據)第一趟:(共5次比較)冒泡排序冒泡排序第二趟:(共4次比較) 如此進行下去。可以推知,對6個數要比較5趟,才能

9、使6個數按大小順序排列。在第一趟中要進行兩個數之間的比較共5次,在第二趟中比4次第5趟比1次。如果有 n 個數,則要進行 n-1 趟比較。在第 1 趟比較中要進行n-1次兩兩比較,在第 j 趟比較中要進行 n-j 次兩兩比較。 冒泡排序冒泡排序 #include int main ( ) /* 冒泡排序 */ int i, j, t, a10; for (i=0; i10; i+) /* 輸入10個整數 */ scanf (%d, &ai); for (i=0; i9; i+)/* 進行9趟比較 */ for (j=0; j aj+1 ) t=aj; aj=aj+1; aj+1=t;

10、for (i=0; i10; i+)/* 輸出排序結果 */ printf(%d , ai); return 0; 冒泡冒泡排序排序 for(i=0;i9;i+)for(i=0;i9;i+) for(j=0;j9-i;j+) for(j=0;jaj+1) if(ajaj+1) t=aj; t=aj; aj=aj+1; aj=aj+1; aj+1=t; aj+1=t; 比較比較選擇選擇排序和排序和冒泡冒泡排序排序 選擇選擇排序排序for(i=0;i9;i+) for(i=0;i9;i+) for(j=i+1;j10;j+) for(j=i+1;jaj)if(aiaj) temp=ai;temp=

11、ai; ai=aj; ai=aj; aj=temp; aj=temp; 選擇排序選擇排序(從小到大):第一趟從(從小到大):第一趟從a0a0到到a9a9中找到中找到最小數最小數放在放在a0a0中,第二趟從中,第二趟從a1a1到到a9a9中找到次小數放在中找到次小數放在a1a1中,中,以此類推。以此類推。冒泡排序冒泡排序(從小到大):第一趟從(從小到大):第一趟從a0a0到到a9a9中找到中找到最大數最大數放在放在a9a9中,第二趟從中,第二趟從a0a0到到a8a8中找到次大數放在中找到次大數放在a8a8中,中,以此類推。以此類推。例:假設數組a的長度為10,要求輸入a的所有元素,再輸入一個整數

12、m,實現將a中后m個數字移到a的前面。 如:數組a中元素為:1 2 3 4 5 6 7 8 9 10,若m=4,則輸出:7 8 9 10 1 2 3 4 5 6方法一:1) 1.9往后移動一位,將10放到最前面; 2) 10,1.,8往后移動一位,將9放到最前面; . 4) 將8,9,10,1.6往后移動一位,將7放到最前面;關鍵:m步循環,每次循環將數組中前9個元素往后移動一位,最后一位放到數組最前面。 例:假設數組a的長度為10,要求輸入a的所有元素,再輸入一個整數m,實現將a中后m個數字移到a的前面。 如:數組a中元素為:1 2 3 4 5 6 7 8 9 10,若m=4,則輸出:7 8

13、 9 10 1 2 3 4 5 6方法二:1) 1.10個元素逆序存放; 2) 將前m個元素逆序存放; 3) 將剩余元素(10-m)個元素逆序存放;關鍵:使用逆序方式,只需3個循環,每次循環將數組中元素逆序存放即可。 #includeint main()int i, a10, t, m;printf(請輸入數組:);for(i=0; i10; i+) scanf(%d, &ai);printf(請輸入前置元素的個數:);scanf(%d, &m);/第一次全部逆序交換 for(i=0; i5; i+)t = ai; ai = a9-i;a9-i=t;/前m個元素逆序交換for(

14、i=0; im/2; i+)t = ai;ai = am-i-1;am-i-1=t; /剩余元素逆序交換for(i=m; i(10+m)/2; i+)t = ai;ai = am+9-i;am+9-i=t; /打印for(i=0; i10; i+) printf(%d , ai); return 0;例:假設數組a的長度為10,請輸入a中的所有元素,再輸入一個整數m,如果m在數組a中,則從a中刪除m,并輸出刪除m后的數組a,如果m不在數組a中,提示“數據不存在!”。 如:數組a元素為:1 2 3 4 5 6 7 8 9 10。 若m=4,則輸出: 1 2 3 5 6 7 8 9 10;若m=1

15、2,則輸出“數據不存在!”;步驟:1) 使用循環,逐個判斷數組a中元素是否與m相等,若相等則記錄下標,并退出循環。 2) 循環結束后,判斷該下標,如果下標10,則意味著a中存在m,此時刪除m。具體做法:將下標后面的所有元素均往前移動一位,實現刪除m的目的; 3) 若下標=10,表示沒有a中找到m,輸出“數據不存在!”;u二維數組定義: 類型說明符 數組名常量表達式1常量表達式2 例如:int a34; /* 不能寫成 a3,4 */ 說明了一個三行四列的數組,數組名為a,其下標變量共有34個,即: a00, a01, a02, a03 a10, a11, a12, a13 a20, a21,

16、a22, a23u二維數組引用或訪問 : 數組名下標1下標2 其中下標應為整型常量或整型表達式。 二維數組的初始化二維數組的初始化u初始化u全部元素:按行分段賦值,或按行連續賦值,如: int a33= 80,75,92,61,65,71,59,63,70 ; 或:int a33= 80,75,92,61,65,71,59,63,70 ;u部分元素:未賦初值的元素自動取0值。如: int a23 = 1, 4 ; int a33 = 1,2, , 4,5,6 ; u全部元素初始化時,可省略第一維的大小。例如: int a 3 = 1, 2, 3, 4, 5, 6; 注意:此時只能省略第1維的值

17、。C根據初始化數據的數量,自動確定第1維的大小。二維數組的初始化二維數組的初始化 二維數組中的元素在內存中的排列順序是:按按行存放,即先順序存放行存放,即先順序存放第一行的元素,再存放第一行的元素,再存放第二行的元素第二行的元素 二維數組二維數組b00b01b02b10b11b12b20b21b22例如:例如:整型數組整型數組 b33= 1,2,3, 4,5,6, 7,8,9 ;123456789多維數組的定義,類似于二維數組。例如:三維數組:例如:三維數組: float a234;注意:注意:多維數組元素在內存中的多維數組元素在內存中的排列順序排列順序: a000a000a001a001a0

18、02a002a003a003 a010 a010a011a011a012a012a013a013 a020a020a021a021a022a022a023a023 a100 a100a101a101a102a102a103a103 a110 a110a111a111a112a112a113a113 a120 a120a121a121a122a122a123a123二維數組可以看作是由一維數組的嵌套而構成的。設一維數組的每個元素都又是一個數組,就組成了二維數組。根據這樣的分析,一個二維數組也可以分解為多個一維數組。如二維數組a34,可分解為三個一維數組,其數組名分別為: a0 、a1、a2。這三

19、個一維數組都有4個元素,例如:一維數組a0的元素為a00,a01,a02,a03。 二維數組二維數組二維數組元素的表示形式為:二維數組元素的表示形式為:數組名下標下標數組名下標下標例如:例如: k = a23下標可以是下標可以是整型整型表達式或表達式或整型整型變量,如變量,如 k=a2-12*2-1; j = aii+5;注意:注意:1. 不要寫成不要寫成 a2,3,a2-1,2*2-1形式形式;2. 下標值應在已定義的數組大小的范圍內。下標值應在已定義的數組大小的范圍內。二維數組二維數組例:求矩陣A(23)的轉置矩陣B(32)。 1 2 3 1 4 2 5 4 5 6 3 6 矩陣轉置算法:

20、在原來矩陣中的元素aij,應是轉置后矩陣中的元素bji。 #include int main( ) int i, j, b32, a23 = 1,2,3, 4,5,6 ; for (i=0; i=1; i+) for (j=0; j=2; j+) bji = aij; /* 進行數組轉置 */ for (i=0; i=2; i+) for (j=0; j=1; j+) printf(%d , bij); printf(“n”); /* 輸出完一行換行*/ 例:有一個3*4的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號。#include int main() int i,

21、j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6,-10,10,-5,2; max=a00; for(i=0;i=2;i+) for(j=0;jmax) max=aij; row=i; colum=j; printf(“max=%d,row=%d,colum=%dn”,max,row,colum); return 0;u定義 char 數組名常量表達式;u初始化 char c10=c, ,p,r,o,g,r,a,m; 多余元素自動定為空字符(即0)n當省略數組長度,系統會自動根據初值個數確定數組長度。 char c=c, ,p,r,o,g,r,a,m;

22、(長度自動為9)字符數組字符數組u初始化用字符串的方式 char c=“I am happy”; 或 char c=I am happy; 等價于 char c= I , ,a,m, ,h,a,p,p,y,0 ; 定義的數組長度大于實際字符串長度時,多余的以0補。字符數組字符數組u字符數組的輸入和輸出 1)用循環語句逐個輸入輸出:用格式符“c” 輸入: for(i=0; i10; i+) scanf(%c,&ai); 輸出: for (i=0; i10; i+) printf(%c,ai); 2)整個字符串一次性輸入輸出:用格式符“s” 例如: scanf( %s,c ); print

23、f( %s,c );n注意:用“%s”格式符輸出字符串時,scanf、printf函數中的輸出項是字符數組名,而不是數組元素名。寫成下面這樣是不對的:printf(%s,c0);字符數組字符數組例:輸出一個字符串例:輸出一個字符串“I am a boy!”。 程序如下:程序如下:#include void main() char c10=I, ,a,m, ,a, , b, o, y, !; int i; for(i=0;i 字符串2,返回值 0; 字符串1 字符串2,返回值 0。 本函數也可用于比較兩個字符串常量,或比較數組和字符串常量。如:k=strcmp(“China”,“CHINA”);

24、 注意:對兩個字符串比較,不能用以下形式: if(str1=str2) printf(“yes”);而只能用 if(strcmp(str1,str2)=0) printf(“yes”);字符串處理函數u6、測字符串長度函數strlen 格式: strlen(字符數組名) 功能:測字符串的實際長度(不含0) 并作為函數返回值。 如:char st=C language; k=strlen(st); u7、字符串大小寫轉換函數strlwr,strupr strlwr(str) 將字符串中大寫字母換成小寫字母 strupr(str) 將字符串中小寫字母換成大寫字母函數的返回值為字符串的首地址。字符串

25、處理函數例:輸入一行字符,統計其中有多少個單詞,單詞之間用空格分隔開。#includevoid main() char string81, c; int i,num=0,word=0; gets(string); for(i=0;(c=stringi)!=0;i+) if(c= ) word=0; else if(word=0) word=1; num+; printf(“There are %d words in the line.n”,num);0 x y . z #include int main( ) char str1100,str2100;int i, j;printf (”Enter string 1:”);gets (str

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論