




已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第七章,數組,問題:給一組數排序,這組 數該 如何存放呢,? 這些數據如何存放才便于排序,1,8,8,8,8,8,8,8,8,8,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,8,8,8,8,8,8,8,8,8,本章要點,掌握一維、二維數組的定義和引用方法、存儲結構和初始化方法。 掌握有關一維數組的有關算法 掌握數組的運算。,主要內容,7.1 一維數組的定義和引用 7.2 二維數組的定義和引用 7.3 字符數組,7.1 一維數組的定義和引用,C語言為這些數據,提供了一種構造數據類型:數組。所謂數組就是一組具有相同數據類型的數據的有序集合。,一個班學生的學習成績 一行文字 一個矩陣 這些數據的特點是: 1.具有相同的數據類型 2.使用過程中需要保留原始數據,1.一維數組的定義格式為: 類型說明符 數組名常量表達式; 例如: int a10; 它表示定義了一個整形數組,數組名為a,此數組有10個元素。,7.1.1一維數組的定義,說明: 1.數組名定名規(guī)則和變量名相同,遵循標識符定名規(guī)則。,2.在定義數組時,需要指定數組中元素的個數,方括弧中的常量表達式用來表示元素的個數,即數組長度。 3.常量表達式中可以包括常量和符號常量,但不能包含變量。也就是說,C語言不允許對數組的大小作動態(tài)定義,即數組的大小不依賴于程序運行過程中變量的值。,例如: int n; scanf(“%d,,數組說明中其他常見的錯誤: float a0; /* 數組大小為0沒有意義 */ int b(2)(3); /* 不能使用圓括號 */ int k, ak; /* 不能用變量說明數組大小*/,2.一維數組在內存中的存放,每個數據元素占用的字節(jié)數,就是基類型的字節(jié)數 一個元素占4個字節(jié),一維數組: float mark100;,注意: 定義數組時用到的“數組名常量表達式” 和引用數組元素時用到的“數組名下標” 是有區(qū)別的。 例如 int a10; t=a6;,7.1.2一維數組元素的引用,1.數組元素的引用方式 數組名下標 下標可以是整型常量或整型表達式。 例如: a0=a5+a7-a2*3,2.一維數組元素引用的程序實例,#include void main() int i,a10; for (i=0; i=0; i-) printf(“%d ,ai); printf(“n); ,運行結果如下: 9 8 7 6 5 4 3 2 1 0 程序使a0到 a9的值為09,然后按逆序輸出。,對數組元素初始化的實現方法:,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。,7.1.3一維數組的初始化,3. 如果想使一個數組中全部元素值為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。,例7-1:用數組來處理,求解Fibonacci數列。,程序實例: #include void main() int i; int f20=1,1;,Fibonacci數列公式:已知: a1=a2=1 an=an-1+an-2 即:1,1,2,3,5,8,13,7.1.4一維數組程序舉例,for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(n); printf(%12d,fi) /*For循環(huán)結束*/ /*程序結束*/,運行結果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,if語句用來控制換行,每行輸出5個數據。,程序舉例2:用起泡法對10個數排序(由小到大)。,經過第一趟(共5次比較與交換)后,最大的數9已“沉底” 。然后進行對余下的前面5個數第二趟比較,,如果有n個數,則要進行n-1趟比較。在第1趟比較中要進行n-1次兩兩比較,在第j趟比較中要進行n-j次兩兩比較。,程序流程圖如下:,程序實例7.3: #include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;i10;i+) scanf(“%d“,,for(j=0;jai+1) t=ai;ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); /*程序結束*/,程序運行結果如下: input 10 numbers: 1 0 4 8 12 65 -76 100 -45 123 the sorted numbers: -76 -45 0 1 4 8 12 65 100 123,7.2 二維數組的定義和引用,7.2.1二維數組的定義,二維數組定義的一般形式為 類型說明符 數組名常量表達式常量表達式; 例如:定義a為34(3行4列)的數組,b為510(5行10列)的數組。如下: float a34,b510;,不能寫成 float a3,4,b5,10;,注意:我們可以把二維數組看作是一種特殊的一維數組:它的元素又是一個一維數組。 例如:可以把a看作是一個一維數組,它有3個元素:a0、a1、a2,每個元素又是一個包含4個元素的一維數組。,7.2.1二維數組的定義,二維數組中的元素在內存中的排列順序是:按行存放,即先順序存放第一行的元素,再存放第二行的元素,一維數組在內存中的存放,下圖表示對a34數組存放的順序,地址 值 數組元素,b00 b01 b02 b10 b11 b12 b20 b21 b22,3000H 3002H 3004H 3006H 3008H 300AH 300CH 300EH 3010H,例如:整型數組 b33= 1,2,3, 4,5,6, 7,8,9 ;,1 2 3,4 5 6,789,問題:有了二維數組的基礎,那么多維數組如何定義呢?,定義三維數組: float a234; 注意:多維數組元素在內存中的排列順序: 第一維的下標變化最慢,最右邊的下標變化最快。,7.2.1二維數組的定義,三維數組的元素排列順序,二維數組元素的表示形式為: 數組名下標下標 例如: a23 下標可以是整型表達式,如 a2-12*2-1,數組元素可以出現在表達式中,也可以被賦值 例如:b12=a23/2,7.2.2 二維數組的引用,常出現的錯誤有: int a34; /* 定義a為34的數組 */ a34=3;,在使用數組元素時,應該注意下標值應在已定義的數組大小的范圍內。,可以用下面4種方法對二維數組初始化:,數據類型 數組名 常量表達式1常量表達式2 初始化數據 ;,.分行給二維數組賦初值。 例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,.可以將所有數據寫在一個花括號內,按數組排列的順序對各元素賦初值。 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;,7.2.3二維數組的引用,.可以對部分元素賦初值。 例如: int a34=1,5,9;,1 0 0 0 5 0 0 0 9 0 0 0,也可以對各行中的某一元素賦初值,如 int a34=1,0,6,0,0,11;,1 0 0 0 0 6 0 0 0 0 0 11,1 0 0 0 5 6 0 0 0 0 0 0,也可以只對某幾行元素賦初值。如: int a34=1,5,6;,.如果對全部元素都賦初值,則定義數組時對第一維的長度可以不指定,但第二維的長度不能省。 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等價于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;,在定義時也可以只對部分元素賦初值而省略第一維的長度,但應分行賦初值。 例如:int a4=0,0,3,0,10;,0 0 3 0 0 0 0 0 0 10 0 0,7.2.4二維數組程序舉例,例7.4 將一個二維數組行和列元素互換,存到另一個 二維數組中。,#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) for (j=0;j=2;j+) ,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); /*程序結束*/,運行結果如下: array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6,例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;imax) max=aij; row=i; colum=j; printf(max=%d,row=%d,colum=%dn, max,row,colum); /*程序結束*/,7.3 字符數組,7.3.1字符數組的定義,定義方法與前面介紹的類似。例如: char c10; c0=I;c1= ;c2=a; c3=m;c4= ;c5=h;c6=a; c7=p;c8=p;c9=y;,對字符數組初始化,可逐個字符賦給數組中各元素。 例如: char c10=I,a,m,h,a,p,p,y,7.3.2字符數組的初始化,如果初值個數小于數組長度,則只將這些字符賦給數 組中前面那些元素,其余的元素自動定為空字符。,如果提供的初值個數與預定的數組長度相同,在定義 時可以省略數組長度,系統(tǒng)會自動根據初值個數確定 數組長度。,char c=I, ,a,m, ,h, a,p,p,y;數組c的長度自動定為10。,char diamond55= , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,*,定義和初始化一個二維字符數組,7.3.3字符數組的引用,例7.6 輸出一個字符串。,程序如下: #include void main() char c10=I, ,a,m, ,a, , b,o,y; int i; for(i=0;i10;i+) printf(%c,ci); printf(n); ,運行結果:I am a boy,例7.7 輸出一個鉆石圖形,#include void main() char diamond5= , ,*,*, ,*,*, , , ,*, ,*, ,*, , ,*; int i,j; for (i=0;i5;i+) for (j=0;j5;j+) printf(%c,diamondij); printf(n); ,運行結果 * * * * * * * *,7.3.4字符串和字符串結束標志,為了測定字符串的實際長度,C語言規(guī)定了一個“字符串結束標志”0。,字符數組并不要求它的最后一個字符為0,甚至可以不包含0。 例如:char c5=C,h,i,n,a;,但是由于系統(tǒng)對字符串常量自動加一個0。因此,為了使處理方法一致,在字符數組中也常人為地加上一個0。 例如:char c6=C,h,i,n,a,0;,例如: 定義字符數組 char c=“Pascal program”; 要用一個新的字符串代替原有的字符串”Pascal program” ,從鍵盤向字符數組輸入Hello 如果不加0的話,字符數組中的字符如下 Hellol program,7.3.5字符數組的輸入輸出,字符數組的輸入輸出可以有兩種方法: 逐個字符輸入輸出。用格式符“%c”輸入或輸出一個字符。 將整個字符串一次輸入或輸出。用“%s”格式符,意思是對字符串的輸入輸出。,在內存中數組c的狀態(tài),說明: (1)用“%s”格式符輸出字符串時,printf函數中的輸出項是字符數組名,而不是數組元素名。 (2)如果數組長度大于字符串實際長度,也只輸出到遇0結束。 (3)輸出字符不包括結束符0。 (4)如果一個字符數組中包含一個以上0,則遇第一個0時輸出就結束。 (5)可以用scanf函數輸入一個字符串。,如果利用一個scanf函數輸入多個字符串,則在輸入時以空格分隔。 例如: char strl5,str25,str35; scanf(%s %s %s,str1,str2,str3); 輸入數據: How are you? 數組中未被賦值的元素的值自動置0。,分析圖中所示的字符數組 用8進制形式輸出數組c的起始地址 printf(%o,c); printf(%s,c);,注意:scanf函數中的輸入項如果字符數組名。不要再加地址符&,因為在C語言中數組名代表該數組的起始地址。下面寫法不對: scanf(%s,&str);,1. puts函數 其一般形式為: puts (字符數組) 其作用是將一個字符串(以0結束的字符序列)輸出到終端。假如已定義str是一個字符數組名,且該數組已被初始化為“China“。則執(zhí)行puts(str);其結果是在終端上輸出China。,7.3.6字符串處理函數,用puts函數輸出的字符串中可以包含轉義字符。例如: char str=ChinanBeijing; puts(str); 輸出結果: China Beijing,在輸出時,將字符串 結束標志0 轉換成n, 即輸出完字符串后換行。,2. gets函數 其一般形式為:gets(字符數組) 其作用是從終端輸入一個字符串到字符數組,并且得到一個函數值。該函數值是字符數組的起始地址。如執(zhí)行下面的函數: gets(str) 從鍵盤輸入: Computer將輸入的字符串“Computer“送給字符數組str,說明: 函數值為字符數組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; print(%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”可以是字符數組名,也可以是一個字符串常量。如strcpy(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; 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函數 其一般形式為:strlen (字符數組) strlen是測試字符串長度的函數。函數的值為字符串中的實際長度(不包括0在內)。 例如:char str10=China; printf(%d,strlen(st
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權】 IEC 60793-2-50:2025 CMV EN Optical fibres - Part 2-50: Product specifications - Sectional specification for class B single-mode fibres
- 2025年新興技術與產業(yè)發(fā)展研究考試卷及答案
- 2025年市場推廣與廣告策略考試卷及答案
- 2025年外貿英語專業(yè)考試題及答案
- 2025年電子商務專業(yè)考試試卷及答案
- 2025年法務會計考試試題及答案
- 2025年企業(yè)戰(zhàn)略管理職業(yè)考題及答案
- 丈夫保證協(xié)議書
- 七級地理試題及答案
- 烘焙店學徒合同協(xié)議書
- 2025年山東省濟南市萊蕪區(qū)中考一模地理試卷(原卷版+解析版)
- 2025春季學期國開電大??啤墩螌W原理》一平臺在線形考(形考任務四)試題及答案
- SCI論文寫作與投稿 第2版-課件 14-SCI論文投稿與發(fā)表
- 中國車路云一體化發(fā)展研究報告
- 2025年青桐鳴高三語文3月大聯考作文題目解析及相關范文:道理是直的道路是彎的
- 腫瘤免疫治療綜述
- 2025-2030年中國威士忌酒行業(yè)運行動態(tài)及前景趨勢預測報告
- 小學生記憶小竅門課件
- 婚姻家庭與法律知到智慧樹章節(jié)測試課后答案2024年秋延邊大學
- 物業(yè)管理安全責任分配
- 《傷寒論》課件-少陽病提綱、小柴胡湯證
評論
0/150
提交評論