課程等2011程序設計基礎數組_第1頁
課程等2011程序設計基礎數組_第2頁
課程等2011程序設計基礎數組_第3頁
課程等2011程序設計基礎數組_第4頁
課程等2011程序設計基礎數組_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、程序設計基礎吳茜媛WU, XiyuanE-mail: August 31, 2022C語言的構成體系數據類型和運算符基本數據類型:整型、實型等復雜數據類型:數組、指針、結構體等運算符語句(描述和控制操作步驟)支持結構化程序設計即C語言要有相應的語句來支持順序、分支和循環(huán)結構函數C程序是由一系列函數組成的C程序運行的基本單元第七章數組Introduction問題:計算信息14、15、16班各班平均分分析:平均分等于總分除以人數算法:如何存儲數據如何處理數據:先算每個班總分,再算平均分Introduction用我們前面學過的知識,如何存儲數據?分數是帶小數的,故要用到float型定義變量來存儲例如

2、:存儲信息14班每個學生分數:25人float a1,a2,a3, a24,a25;a1=85;a2=80.5;計算平均分:avga=(a1+a2+a3+a25)/25;信息15班:25人float b1,b2,b3, b24,b25,b26;b1=90;b2=83.5;計算平均分:avgb=(b1+b2+b3+b26)/25;信息16班:25人,太繁瑣,能不能把每個班的數據組成一組,利用下標,用循環(huán)方式在組中依次取每個人的成績數組概括下上述問題的特點:數據是相互有關系(可看作為一組)、數據類型相同C語言中,針對這種情況,發(fā)明了“數組”例如:存儲信息14班每個學生分數:25人August 31

3、, 2022float a25; /*定義數組*/a0=85; /*存儲第1個學生的成績*/a1=80.5; /*存儲第2個學生的成績*/*求總分*/sum=0; for (i=0; i25; i+) sum=sum+ai;數組數組一維數組可描述:V = (v1,v2,v3, ,vn)多維數組二維數組可描述:字符數組如何保存字符串”hello!”已學過:char a, b; a=h; /保存單個字符h b=e; /保存單個字符e 所謂數組就是一組具有相同數據類型的數據的有序集合。掌握:如何定義存儲結構引用(使用)初始化1.一維數組的定義格式為: 類型說明符 數組名常量表達式;例如: int a

4、10; 表示定義了一個整形數組,數組名為a,此數組有10個元素,每個元素都是整型。一維數組的定義說明: 1.數組名命名規(guī)則和變量名相同,遵循標識符命名規(guī)則。2.在定義數組時,需要指定數組中元素的個數,方括弧中的常量表達式用來表示元素的個數,即數組長度。3.常量表達式中可以包括常量和符號常量,但不能包含變量。也就是說,C語言不允許對數組的大小作動態(tài)定義,即數組的大小不依賴于程序運行過程中變量的值。一維數組的定義例如: int n; scanf(“%d,&n); /*在程序中臨時輸入數 組的大小 */ int an;數組說明中其他常見的錯誤: float a0;/* 數組大小為0沒有意義 */ i

5、nt b(2)(3); /* 不能使用圓括號 */ int k, ak; /* 不能用變量說明數組大小*/ 一維數組元素的引用數組元素的引用方式 數組名下標 下標可以是整型常量或整型表達式。例如: a0=a5+a7-a2*3一維數組存儲結構和地址計算數組定義后,計算機自動在內存中開辟一片連續(xù)的存儲空間數組名代表這個連續(xù)的空間的首地址a各個元素按順序存放若int 類型占用兩個字節(jié)注意:a5是什么值了?int a5;a0=10;a1=20;a2=30; 7 0編號為2000的字節(jié)200120022003200420052006200720082009a0a1a2a3a4一維數組存儲結構和地址計算問

6、題:若有數組:數組a在內存中的首地址為2000,int數據類型占2字節(jié)。求數組元素a1,a3的地址。int a5;a0=10;a1=20;a2=30; 7 0編號為2000的字節(jié)200120022003200420052006200720082009a0a1a2a3a4ai的地址=數組a的首地址+i*(每個數組元素所占字節(jié)數)數組元素地址=數組首地址 + 前面數組元素個數*每個數組元素所占字節(jié)數說明C語言中,下標的下限是0,上限是元素個數減1假設定義了一個數組,含有N個元素(N為一個常量),那么下標的取值范圍為0,N-1int a5; /定義包含5個元素的數組a0=10; /第一個元素a1=2

7、0; /第二個元素a2=30; /第三個元素a3=40; /第四個元素a4=50; /第五個元素舉例例如:int a3;定義一個含有3個整型元素的數組。在引用這三個元素時,下標只能取0、1、2三個值:a0表示3個元素中的第一個元素,在C語言中稱為下標為0的數組元素;a1表示3個元素中的第二個元素,在C語言中稱為下標為1的數組元素;a2表示3個元素中的第三個元素,在C語言中稱為下標為2的數組元素;a3的這種使用方式是不正確的但C語言的編譯系統(tǒng)不會報錯,這就要求程序設計者要牢記自己定義的數組的大小7 0編號為2000的字節(jié)20012002200320042005a0a1a2一維數組的初始化數組定義

8、后,計算機自動在內存中開辟一片連續(xù)的存儲空間這個存儲空間內存的值是不確定的要對數組元素賦值(或初始化)后,才能使用數組元素int a5;a0=10;a1=20;a2=30; 7 0編號為2000的字節(jié)200120022003200420052006200720082009a0a1a2a3a4 1.在定義數組時對數組元素賦以初值。 例如:int a10=0,1,2,3,4,5,6,7,8,9; 將數組元素的初值依次放在一對花括弧內。經過上面的定義和初始化之后,a0=0,a1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。 一維數組的初始化 3. 如果想使一個

9、數組中全部元素值為0,可以寫成: int a10=0,0,0,0,0,0,0,0,0,0; 或inta10=0; 不能寫成:int a10=0*10; 2. 可以只給一部分元素賦值。例如: int a10=0,1,2,3,4; 定義a數組有10個元素,但花括弧內只提供5個初值,這表示只給前面5個元素賦初值,后5個元素值為0。4. 在對全部數組元素賦初值時,由于數據的個數已經確定,因此可以不指定數組長度。 例如:int a5=1,2,3,4,5; 也可以寫成 int a=1,2,3,4,5; int a10=1,2,3,4,5; 只初始化前5個元素,后5個元素為0。一維數組的輸入/輸出C 語言規(guī)

10、定只能逐個的引用數組元素,不能一次引用數組中的全部元素一維數組的輸入/輸出只能一個一個元素的輸入,一個一個元素的輸出如:若定義int a9;則可使用如下方式進行輸入和輸出: for ( i = 0; i 9; i + ) scanf ( “%d”, &a i ) ; for ( i = 0; i 9; i + ) printf ( “%3d”, a i ) ;例如:計算信息14班的平均分:25人August 31, 2022float a25; /*定義數組*/for ( i = 0; i 25; i + ) scanf ( “%f”, &a i ) ;/*求總分*/sum=0; for (i

11、=0; i25; i+) sum=sum+ai;avg=sum/25;舉例(1)問題:對一組數進行排序(由小到大)。 如:9,8,5,4,2,0分析: 排序問題,一般如何處理 經典的排序方法之一:冒泡法(起泡法)舉例(2)算法設計編碼實現(xiàn)問題分析第一趟比較 經過第一趟(共5次比較與交換)后,最大的數9已“沉底” 。然后進行對余下的前面5個數第二趟比較,第二趟比較如果有n個數,則要進行n-1趟比較。在第1趟比較中要進行n-1次兩兩比較,在第 j 趟比較中要進行n-j次兩兩比較。#include “stdio.h”main()int i,j,t,n,a11; n=10; for (i=1; i=n

12、; i+)scanf(%d, &ai); printf(n); for (j=1; j=n-1; j+) for(i=1; iai+1)t=ai;ai=ai+1;ai+1=t; for (i=1; i=n; i+) printf(%d , ai); printf(n);程序運行結果如下:input 10 numbers:1 0 4 8 12 65 -76 100 -45 123the sorted numbers:-76 -45 0 1 4 8 12 65 100 123數組一維數組可描述:V = (v1,v2,v3, ,vn)多維數組二維數組可描述:字符數組如何保存字符串”hello!”已學

13、過:char a, b; a=h; /保存單個字符h b=e; /保存單個字符e 掌握:如何定義存儲結構引用(使用)初始化二維數組的定義在計算機中,常用二維數組來描述實際生活中的矩陣和表格等問題。二維數組的定義類型說明符 數組名;如:int a45; 定義了具有4行5列的a數組二維數組說明如:int a45; a00 a01 a02 a03 a04a10 a11 a12 a13 a14a20 a21 a22 a23 a24a30 a31 a32 a33 a34a0a1a2a3二維數組a45實際上對應的是一個二維表,這張表是由4行5列組成的二維數組與一維數組可以將二維數組a看成是由4個一維數組組

14、成的,每個一維數組中由含有5個元素這4個一維數組的名稱是a0、a1、a2、a3第一個一維數組a0的各個元素表示為a00、a01、a02、a03、a04int a45; a00 a01 a02 a03 a04a10 a11 a12 a13 a14a20 a21 a22 a23 a24a30 a31 a32 a33 a34a0a1a2a3二維數組存儲結構二維表僅僅是邏輯上的組織,而在內存中存放數據時只能按照順序方式(即線性方式)存放C語言規(guī)定,二維數組中的元素在存儲時,采用行優(yōu)先策略:先存放第一行的數據再存放第二行的數據,每行數據按下標的順序由小到大存放二維數組存儲結構10001001100210

15、031004100510061007100810091010101110121013a00a00 a01 a02 a03 a04a10 a11 a12 a13 a14a20 a21 a22 a23 a24a30 a31 a32 a33 a34a0a1a2a3a01a02a03a04a10a11二維數組地址計算問題:若二維數組的起始地址是1000,數組元素是整型(占2字節(jié)),求a01、a03、a21在內存中的地址?已知a00的地址是1000a00 a01 a02 a03 a04a10 a11 a12 a13 a14a20 a21 a22 a23 a24a30 a31 a32 a33 a34a0a

16、1a2a3int a45; 二維數組存儲結構10001001100210031004100510061007100810091010101110121013a00a00 a01 a02 a03 a04a10 a11 a12 a13 a14a20 a21 a22 a23 a24a30 a31 a32 a33 a34a0a1a2a3a01a02a03a04a10a11數組元素地址=數組起始地址 + 前面數組元素個數*每個數組元素所占字節(jié)數a21=數組首地址 + (2*數組列數+1)*每個數組元素所占字節(jié)數行下標列下標即:1000(2 * 5 + 1) * 2 1022二維數組地址計算計算aij的地

17、址地址: 數組a起始地址+ ( i * (列數) + j ) * (數組元素所占字節(jié)數) 其中:i為要計算的數組元素的行下標,j為列下標如:int a45; a00 a01 a02 a03 a04a10 a11 a12 a13 a14a20 a21 a22 a23 a24a30 a31 a32 a33 a34a0a1a2a3二維數組地址計算假設數組a45在內存中的起始地址為1000,數組元素為int類型(占2個字節(jié))求數組元素a32的地址?1000(3 * 5 + 2) * 2 1034二維數組的引用一般格式為: 數組名;C語言運行時不檢查數組的邊界,即下標值超界時(上下兩個方向),系統(tǒng)不指出

18、其錯誤數組越界的檢查應該由程序員自己來掌握要求程序設計者要牢記自己定義的數組的大小如:a45; 二維數組的初始化數組定義后,計算機自動在內存中開辟一片連續(xù)的存儲空間數組名代表這個連續(xù)的存儲空間,如a;這個存儲空間的值是不確定的要對數組元素賦值(或初始化)后,才能使用數組元素C 語言允許在定義數組的同時,對數組進行初始化在源程序編譯過程中由編譯系統(tǒng)完成的在程序運行前就已經規(guī)定好數組中各元素的取值,這樣可以節(jié)省程序的運行時間。二維數組在定義的同時可以進行初始化,有以下幾種方式:分行初始化。最常用的初始化方法,如: int a34 = 1,2,3,4, 4,3,2,1, 1,2,3,4;二維數組有幾

19、行,就有幾個用逗號分隔的大括號有幾列,每個大括號中就有幾個用逗號分割的數值最后將所有的初始化內容用一對大括號括起來。線性初始化。如: int a34 = 1,2,3,4,4,3,2,1,1,2,3,4;將所有的數值寫在一對大括號中,系統(tǒng)自動按照二維數組規(guī)定的列值對數組進行初始化。二維數組的初始化對二維數組的部分賦初值。如: int a34 = 1, 4,3, 1,2;等價于下式: int a34 = 1,0,0,0, 4,3,0,0, 1,2,0,0;系統(tǒng)自動將沒有賦值的元素賦值為0 int a34 = 1,4; 等價于: int a34 = 1,0,0,0, 4,0,0,0, 0,0,0,0

20、;對于沒有寫出的大括號,系統(tǒng)自動將此行元素賦值為0。int a34 = 1,1; 等價于: int a34 = 1,0,0,0, 0,0,0,0, 1,0,0,0;二維數組的初始化二維數組的初始化如果對數組的所有元素賦初值,定義二維數組時可以省略第一維的長度。如:int a 4 = 1,2,3,4,5,6,7,8,9,10,11,12;系統(tǒng)會四個數據四個數據的數,數了幾個四個數,則第一維的長度(行數)就是幾。該例中第一維的長度為3。其他方式:int a 4 = 1,1 ,2;用逗號分隔開了四個大括號,因此第一維的長度是4。二維數組的輸入輸出 設有二維數組定義如下: int a1010;輸入 f

21、or (i = 0; i 10; i+) for(j = 0; j 10; j+) scanf(“%d”, &aij);輸出 for (i = 0; i 10; i+) for(j = 0; j 10; j+) printf(“%3d”, aij);示例August 31, 2022算法設計編碼實現(xiàn)問題分析例7.5: 有一個34的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號。 問題分析: 核心問題: 1)比較元素大?。?2)獲取行號和列號。算法設計人的大腦如何處理?依次比較大小、其他處理等并行比較、處理普通電腦如何做?也可教會其模擬人的處理方法若采用依次比較方案Augu

22、st 31, 2022例7.5: 有一個34的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號。 N-S流程圖表示算法 如下:#include void main() int i,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); 數組一維數組可描述:V = (v1,v2,v3, ,vn)

23、多維數組二維數組可描述:字符數組如何保存字符串常量“hello!”已學過:char a, b; a=h; /保存單個字符h b=e; /保存單個字符e 掌握:如何定義存儲結構引用(使用)初始化字符數組字符數組定義的一般格式char數組名;例如:char a3 ; /* 字符數組定義*/ a0 = Y ; /* 字符數組元素的使用*/ a1 = O ; a2 = U ;字符數組初始化常用的初始化方法,如:char a15 = H, a, p, p, y, !;在這個初始化語句中共寫了6個字符,還有9個數組元素沒有給出初值,系統(tǒng)自動對它們賦值為空字符,即0)。初始化時可以省略數組長度,如:char

24、 a = M, a, c, a, o;系統(tǒng)自動把這個a數組的長度(或大小)定為5。字符數組初始化也可以用如下方式對字符數組初始化: char a = “How do you do?” ;問題:數組的長度是多少?C語言規(guī)定:對字符串常量,在內存中存儲時,會自動在其結尾加一個“字符串結束標志”( 0) ,從而可以知道這串字符在什么位置結束。字符串常量“How do you do?”在內存中存儲時占15個字節(jié)。故上面字符數組a的長度應是15。字符數組初始化下面的初始化方法也是正確的: char a = “How do you do?” ; 對二維字符數組初始化 char a 4 = M,a,c,a,

25、o;M000a000c000a000o000How doyoudo?0字符數組的引用字符數組的引用和普通數組的引用沒有什么區(qū)別,只是數據元素的類型是字符型而已。 char a3 ; /* 字符數組定義*/ a0 = Y ; /* 字符數組元素的引用*/ a1 = O ; a2 = U ;字符數組的輸入輸出 字符數組的輸入輸出可以有兩種方法:逐個字符輸入輸出。用格式符“%c”輸入或輸出一個字符。將整個字符串一次輸入或輸出。用“%s”格式符,意思是對字符串的輸入輸出。 char c=China;printf(%s,c); 例如在內存中數組c的狀態(tài) 如果利用一個scanf函數輸入多個字符串,則在輸入

26、時以空格分隔。例如:char strl5,str25,str35;scanf(%s %s %s,str1,str2,str3);輸入數據:How are you? 數組中未被賦值的元素的值自動置0。分析圖中所示的字符數組printf(%s,c);printf(%d,c); 用十進制形式輸出數組c的起始地址 注意:scanf函數中的輸入項如果是字符數組名,不要再加地址符&,因為在C語言中數組名代表該數組的起始地址。下面寫法不對:scanf(%s,&str);1. puts函數其一般形式為: puts (字符數組)其作用是將一個字符串(以0結束的字符序列)輸出到終端。char str=“China

27、”;puts(str);函數在輸出的時候,將從數組第一個元素開始,一個元素接一個元素的輸出到屏幕上,一直遇到0字符為止。其結果是在終端上輸出China。字符串處理函數 用puts函數輸出的字符串中可以包含轉義字符。例如:char str=ChinanBeijing;puts(str);輸出結果:ChinaBeijing 2. gets函數其一般形式為: gets(字符數組)其作用是從終端輸入一個字符串到字符數組,并且得到一個函數值。該函數值是字符數組的起始地址。如執(zhí)行下面的函數: gets(str)從鍵盤輸入:Computer將輸入的字符串Computer送給字符數組str把回車符作為分隔符,

28、遇到回車符認為字符串輸入完成.說明: 函數值為字符數組str的起始地址。一般利用gets函數的目的是向字符數組輸入一個字符串,而不大關心其函數值。 注意:用puts和gets函數只能輸入或輸出一個字符串,不能寫成 puts(str1,str2) 或 gets(str1,str2)3. strcat函數其一般形式為:strcat(字符數組1,字符數組2)strcat的作用是連接兩個字符數組中的字符串,把字符串2接到字符串1的后面,結果放在字符數組1中,函數調用后得到一個函數值字符數組1的地址。例如:char str130=Peoples Republic of ;char str2=China;

29、printf(%s,strcat(str1,str2); 輸出:Peoples Republic of China 4. strcpy函數 其一般形式為:strcpy(字符數組1,字符串2) strcpy是“字符串復制函數”。作用是將字符串2復制到字符數組1中去。例如:char str110,str2=China;strcpy(str1,str2); 關于strcpy函數的幾點說明(1)字符數組1必須定義得足夠大,以便容納被復制的字符串。字符數組1的長度不應小于字符串2的長度。 (2)”字符數組1”必須寫成數組名形式(如str1),“字符串2”可以是字符數組名,也可以是一個字符串常量。如str

30、cpy(str1,China); (3)復制時連同字符串后面的0一起復制到字符數組1中。 (4)可以用strcpy函數將字符串2中前面若干個字符復制到字符數組1中去。例如:strcpy(str1,str2,2);作用是將str2中前面2個字符復制到str1中去,然后再加一個0。 (5)不能用賦值語句將一個字符串常量或字符數組直接賦值給一個字符數組。如: str1=China; 不合法 str1=str2; 不合法用strcpy函數只能將一個字符串復制到另一個字符數組中去。用賦值語句只能將一個字符賦給一個字符型變量或字符數組元素。下面是合法的使用:char a5,c1,c2;c1=A; c2=B

31、;a0=C; a1=h; a2=i; a3=n; a4=a; 5. strcmp函數 其一般形式為:strcmp(字符串1,字符串2) strcmp的作用是比較字符串1和字符串2。例如:strcmp(str1,str2); strcmp(China,Korea); strcmp(str1,Beijing);比較的結果由函數值帶回(1) 如果字符串1=字符串2,函數值為0。(2) 如果字符串1字符串2,函數值為一正整數。(3) 如果字符串1str2) printf(yes);而只能用 if(strcmp(str1,str2)0) printf(yes);6. strlen函數 其一般形式為:st

32、rlen (字符數組) strlen是測試字符串長度的函數。函數的值為字符串中的實際長度(不包括0在內)。例如:char str10=China; printf(%d,strlen(str);輸出結果不是10,也不是6,而是5。也可以直接測試字符串常量的長度,如strlen(China); 7. strlwr函數 其一般形式為:strlwr (字符串) strlwr函數的作用是將字符串中大寫字母換成小寫字母。 8. strupr函數 其一般形式為:strupr (字符串) strupr函數的作用是將字符串中小寫字母換成大寫字母。 數組小結一維數組如: int a3;可描述:V = (v1,v2

33、,v3, ,vn)多維數組如:int a34;可描述:字符數組如:char a20;可描述字符串:“hello!”掌握:如何定義存儲結構引用(使用)初始化August 31, 2022C語言的構成體系數據類型(運算符)基本數據類型:整型、實型等復雜數據類型:數組、指針、結構體等運算符語句(描述和控制操作步驟)支持結構化程序設計即C語言要有相應的語句來支持順序、分支和循環(huán)結構函數C程序是由一系列函數組成的C程序運行的基本單元小結 二維數組程序舉例 例7.4 將一個二維數組行和列元素互換,存到另一個 二維數組中。例如:a= 1 2 3 1 4 4 5 6 b= 2 5 3 6算法設計編碼實現(xiàn)問題分析問題分析:設兩個矩陣分別為a,b讓 bji=aijAugust 31, 2022 二維數組程序舉例 算法設計Step1: 定義矩陣a,b,初始化矩陣a;Step2: 讀取矩陣a中每個元素,讓bji=aij;算法設計編碼實現(xiàn)問題分析August 31, 2022#in

溫馨提示

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

評論

0/150

提交評論