




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第8章 數(shù) 組,8.1 數(shù)組的概念 8.2 一維數(shù)組 8.3 二維數(shù)組 8.3 字符數(shù)組 8.5 數(shù)組應用舉例,8.1 數(shù)組的概念,8.1.1 數(shù)組的引入 如果一個班有50名學生,我們要計算這50名學生的數(shù)學平均成績,那就需要定義50個變量。如果計算2000名學生的數(shù)學平均成績,就需要定義2000個變量。如果照這樣下去,編寫出來的程序不僅會很長,而且需要花費很多時間。這樣的編寫程序方法會很繁瑣,編寫出的程序也不具備良好的編程風格。,8.1 數(shù)組的概念,8.1.2 數(shù)組的維數(shù) 一維數(shù)組的邏輯結(jié)構如圖8.1所示。,8.1 數(shù)組的概念,求3門課的平均成績的其實現(xiàn)代碼如下所示: #include vo
2、id main() int i,a50,b50,c50;/*3個一維數(shù)組分別表示50名學生的語文、數(shù)學、英語成績*/ float average1=0,average2=0,average3=9; for(i=0;i50;i+)/*分別輸入50名學生的語文、數(shù)學、英語成績*/ scanf(“%d%d%d”, ,8.1 數(shù)組的概念,我們要計算10名學生的語文、數(shù)學、英語3門課的平均成績,用二維數(shù)組存放學生成績的情況如圖8.2所示。,8.1 數(shù)組的概念,#include void main() int i,a310;/*定義1個二維數(shù)組,表示10名學生的語文、數(shù)學、英語成績*/ float ave
3、rage=0; /*定義1個表示平均成績的變量*/ for(i=0;i3;i+)/*分別輸入10名學生的語文、數(shù)學、英語成績*/ for(j=0;j10;j+) scanf(“%d”,/*輸出各門課的平均成績*/ ,8.2 一維數(shù)組,8.2.1 一維數(shù)組的定義和初始化 1一維數(shù)組的定義 定義一維數(shù)組語法格式如下: 類型標識符 數(shù)組名常量表達式;,8.2 一維數(shù)組,例如,一維數(shù)組的定義代碼如下: int a30; float mark100; char str200; 其中,a、mark、str分別被定義為整型數(shù)組、實型數(shù)組、字符型數(shù)組,數(shù)組的長度分別是30、100、200。,8.2 一維數(shù)組,
4、2一維數(shù)組的引用 一維數(shù)組的引用形式如下: 數(shù)組名下標 其中,數(shù)組中的下標只能是整型常量和整型常量的表達式。,8.2 一維數(shù)組,關于數(shù)組的的引用,需要說明如下: (1)元素的下標必須用方括號括起來,例如,不能將數(shù)組元素a3寫成a3。 (2)引用數(shù)組元素時,不可超出數(shù)組定義時的上下界范圍,C語言編譯器不進行數(shù)組越界檢查,這樣會造成邏輯錯誤。 (3)與定義數(shù)組時不同,使用數(shù)組時其元素下標可以用常量及其表達式,也可以用變量及其表達式等。例如,a2、ax、am+n、aai-1+ai-2都是合法的數(shù)組元素引用形式。 (4)使用數(shù)組元素時,數(shù)組名、數(shù)組類型和維數(shù)必須與數(shù)組定義時一致。,8.2 一維數(shù)組,3
5、一維數(shù)組的初始化 一維數(shù)組初始化的一般格式如下: 類型說明符 數(shù)組名數(shù)組大小=值1,值2,值n; 4數(shù)組的內(nèi)存分配,8.2 一維數(shù)組,【例8.1】給一維數(shù)組a賦初值,要求每個元素的值等于其下標的平方,并輸出其下標和元素的值。 #include void main() int a10; for(int i=1;i10;i+) ai=i*i; printf(下標t元素的值n); for(i=1;i10;i+) printf(%dt%dn,i,ai); ,8.2 一維數(shù)組,8.2.2 數(shù)組的大小sizeof運算符 利用sizeof運算符輸出數(shù)組元素的代碼如下: int a =1,2,4,8,16;
6、for(int i=0; i(sizeof(a)/sizeof(int); i+) printf(%dt%dn,i,ai);,8.2 一維數(shù)組,8.2.3 一維數(shù)組的應用舉例 【例8.2】計算機隨機產(chǎn)生100以內(nèi)的10個數(shù)據(jù),編程找出其中的最大數(shù)、最小數(shù)和平均值,并輸出大于平均值的數(shù)據(jù)及其個數(shù)。,8.2 一維數(shù)組,#include #include #include #define SIZE 10 void main() int aSIZE; int i,max,min,n=0,sum=0; float average; for(i=0; iSIZE; i+) ai=rand()%100;/*
7、產(chǎn)生100以內(nèi)的數(shù)據(jù)*/ printf(這10個隨機數(shù)是:n); for(i=0; iSIZE; i+) printf(%d ,ai); max=a0; /*最大和最小值均為數(shù)組下標0的元素*/ min=a0;,8.2 一維數(shù)組,for(i=1; imax) max=ai;/*查找最大數(shù)*/ if(ai average) printf(%d ,ai);/*將高于平均值的數(shù)據(jù)輸出*/ n = n + 1; /*對高于平均值的數(shù)據(jù)進行計數(shù)*/ printf(n高于平均值的數(shù)據(jù)個數(shù):%dn,n); ,8.2 一維數(shù)組,2遞推問題 【例8.3】輸出斐波那契(Fibonacci)數(shù)列的前20項。,01#
8、include 02void main() 03 04int i,f20=1,1; 05printf(%dn,f0); 06printf(%dn,f1); 07for(i=2;i20;i+) 08 09fi=fi-1+fi-2; 10printf(%dn,fi); 11 12,8.2 一維數(shù)組,3排序問題 (1)冒泡法 冒泡排序(BubbleSort)的基本概念是:依次比較相鄰的兩個數(shù),將小數(shù)放在前面,大數(shù)放在后面。也就是說,在第一趟排序過程中,首先比較第1個和第2個數(shù),將小數(shù)放前,大數(shù)放后。然后比較第2個數(shù)和第3個數(shù),將小數(shù)放前,大數(shù)放后,如此繼續(xù),直至比較最后兩個數(shù),將小數(shù)放前,大數(shù)放后。
9、至此第一趟排序結(jié)束,將最大的數(shù)放到了最后。在第二趟排序過程中,仍從第一對數(shù)開始比較,將小數(shù)放前,大數(shù)放后,一直比較到倒數(shù)第二個數(shù)(倒數(shù)第一的位置上已經(jīng)是最大的),第二趟結(jié)束,在倒數(shù)第二的位置上得到一個新的最大數(shù)(其實在整個數(shù)列中是第二大的數(shù))。如此重復下去,直至最終完成排序。,8.2 一維數(shù)組,【例8.4】編寫程序,使用冒泡法對8個整數(shù)33,56,20,68, 99,48,77,39進行從小到大排序,最后輸出排序后的結(jié) 果。,8.2 一維數(shù)組,經(jīng)過第一趟排序后,最后一個數(shù)被放在最后。在下一趟排序過程中,即第二趟排序過程中,需要對剩下的7個數(shù)進行排序。仍然從第1個元素開始,比較相鄰的兩個元素的大
10、小,將較小的放在前面,較大的放在后面。經(jīng)過8次比較后,次大的元素被移動到a6中。依次類推,經(jīng)過七趟排序后,就完成了整個排序的過程。每趟排序的結(jié)果如圖8.5所示。,8.2 一維數(shù)組,根據(jù)冒泡排序的思想,可以畫出相應的流程圖。冒泡排序的程序流程圖如圖8.6所示。,8.2 一維數(shù)組,#include void main() int a=33,56,20,68,99,48,77,39; int i,j,k,t,n=sizeof(a)/sizeof(a0); printf(排序前%d個整數(shù)是:n,n); for(i=0;iaj+1) /*如果ajaj+1,則交換兩者*/ t=aj; /*先將第j個元素值
11、賦值給臨時變量t*/ aj=aj+1; /*然后將第j+1個元素值賦值給第j個元素*/,8.2 一維數(shù)組,aj+1=t; printf(第%d趟排序后的結(jié)果:,i+1); for(k=0;kn;k+)/*輸出第i趟排序后的結(jié)果*/ printf(%4d,ak); printf(n); printf(最終的排序結(jié)果是:n); for(i=0;in;i+)/*輸出最終的排序結(jié)果*/ printf(%4d,ai); printf(n); ,8.2 一維數(shù)組,(2)選擇法排序 下面以6個數(shù)為例說明選擇排序的具體過程。具體排序過程如圖8.7所示。,8.2 一維數(shù)組,選擇排序的關鍵代碼如下: for(i=
12、0;in-1;i+)/*控制排序的趟數(shù)*/ k=i; /*k表示當前趟排序過程中元素最小的下標*/ for(j=i+1;jn;j+)/*待排序的元素,范圍是i+1n-1*/ if(ajak) /*如果找到一個比ak還要小的元素*/ k=j; /*將下標j賦值給k*/ /*-交換ak與aj-*/ t=ak; ak=ai; ai=t; ,8.2 一維數(shù)組,根據(jù)以上分析,得到相應的程序盒圖如圖8.8所示。,8.3 二維數(shù)組,8.3.1 二維數(shù)組的定義 定義二維數(shù)組的語法格式如下: 類型說明符 數(shù)組名常量表達式1常量表達式2; 定義二維數(shù)組的格式與定義一維數(shù)組的格式相同,只是必須指定兩個常量表達式,第
13、一個常量表達式標識數(shù)組的行數(shù),第二個常量表達式標識數(shù)組的列數(shù)。 例如,定義一個二維數(shù)組a,代碼如下: int a23;,8.3 二維數(shù)組,二維數(shù)組a在邏輯上的空間形式為2行3列。每一個數(shù)組元素都是整型數(shù)據(jù),因此數(shù)組a邏輯示意圖如圖8.9所示。,8.3 二維數(shù)組,二維數(shù)組在內(nèi)存中的排列順序遵循的原則是行優(yōu)先,即在內(nèi)存中先存儲第一行元素,然后再存儲第二行元素。 例如,有以下二維數(shù)組定義: int a23;,8.3 二維數(shù)組,數(shù)組a的元素在內(nèi)存中的存儲形式如圖8.10所示。,8.3 二維數(shù)組,8.3.2 二維數(shù)組初始化 1分行賦值 在定義二維數(shù)組時,可以同時對數(shù)組進行初始化。這種方法主要用在是數(shù)組元
14、素已經(jīng)確定的情況下。例如,定義一個二維數(shù)組a35,其初始化代碼如下: int a35=10,20,30,40,50,60,70,80,90,100, 110,120,130,140,150;,8.3 二維數(shù)組,數(shù)組a的邏輯結(jié)構如圖8.11所示。,8.3 二維數(shù)組,2省略花括號 在初始化時,也可以省略這些花括號。這是因為二維數(shù)組在邏輯上是分為行和列,但是在存儲結(jié)構上可是順序存儲的。 例如,上面的二維數(shù)組a35在定義并初始化時,可以省略內(nèi)部的花括號。其初始化如下: int a35=10,20,30,40,50,60,70,80,90,100,110,120,130,140,150;,8.3 二維數(shù)
15、組,3省略第一維長度 例如,定義一個二維數(shù)組a35,同時進行賦值,其定義及初始化如下所示: int a5=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; 上面的初始化方法與第一種、第二種初始化方法是一樣的,即相當于以下的初始化方法: int a5=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;,8.3 二維數(shù)組,4只初始化一部分 int a35=6,9,12; for(i=0;i3;i+) for(j=0;j5;j+) printf(%3d,aij); printf(n); ,8.3 二維數(shù)組,8.3.3 二維數(shù)組應用舉例 【例8.6】編寫一
16、個程序,統(tǒng)計某個班每個學生語文、數(shù)學、英語的平均成績。要求按學號從小到大順序依次輸入各個學生的成績,最后統(tǒng)計每個學生的平均成績,并列表輸出。,8.3 二維數(shù)組,#include #define N 5 #define M 5 void main() int sNM; int sum; int i,j; printf(Input data:n);/*輸入數(shù)據(jù)*/ for (i=0;iN;i+) /*輸入5個學生的學號與3門課成績*/ for (j=0;jM-1;j+) scanf(%d,8.3 二維數(shù)組,sij=sum/(M-2); /*計算每個學生的平均成績*/ printf( 學號 語文 數(shù)
17、學 英語 平均成績n); printf(-n); for (i=0;iN;i+) for (j=0;jM;j+)/*輸出每個學生的學號與成績*/ printf(%5d,sij); printf(n); printf(-n); ,8.3 二維數(shù)組,【例8.7】設有一個33的方陣,分別計算兩條對角線上的元素之和 分析:在方陣中,主對角線上元素的行號與列號相等,將aii累加即可求主對角線上的元素之和。對于一個mm的方陣,如果行號和列號都從0開始,則次對角線上元素的行號與列號之和等于m-1。,8.3 二維數(shù)組,#include void main() int a33,sum=0; int i,j; p
18、rintf(please input rectangle element:n); for(i=0;i3;i+) for(j=0;j3;j+) scanf(%d, ,8.3 二維數(shù)組,【例8.8】形成并輸出55矩陣A。,8.3 二維數(shù)組,分析:要形成上述矩陣要用55的二維數(shù)組。該數(shù)組中每個元素的值的形成規(guī)律為:數(shù)組中“行下標值列下標值”的元素(即對角線和對角線之上的各元素)其值為1;數(shù)組中“行下標值列下標值”元素的值為:行下標列下標1。,8.3 二維數(shù)組,#include void main( ) int i, j, a55; for (i=0; i=4; i+) /*控制行數(shù)*/ for (j
19、=0; j=4; j+) /*控制列數(shù)*/ if ( i=j ) /*右上角元素為1*/ aij=1; else /*左下角中的每個元素值比上面的元素值多1*/ aij=i-j+1; for (i=0; i=4; i+)/*輸出二維數(shù)組 */ for (j=0; j=4; j+) printf(%d , aij); printf(n); ,8.3 二維數(shù)組,【例8.9】求二維數(shù)組鞍點問題。即該位置上的元素在該行上最大,在該列上最小。 二維數(shù)組的元素如下: 1 2 3 13 5 6 7 8 9 10 11 12 鞍點為8。,8.3 二維數(shù)組,#include #define n 3 #defin
20、e m 4 void main() int i,j,max,maxj,anm=1,2,3,13,5,6,7,8,9,10,11,12; bool flag; for (i=0;imax) max=aij; /*每一行中的最大元素*/ maxj=j; /*保存所在列號*/ flag=true;,8.3 二維數(shù)組,for (int k=0;kakmaxj) flag=false; break; if(flag) printf(鞍點a%d%d=%dn,i,maxj,max); break; if(!flag) printf(鞍點不存在!n); ,8.3 字符數(shù)組,8.3.1 字符數(shù)組和字符串 1.
21、字符串常量 (1)字符串常量(字符串)是用一對雙引號括起來的字符序列。 (2)為了判斷字符串是否結(jié)束,系統(tǒng)自動在字符串的末尾加上一個字符0 作為字符串的結(jié)束標志。 (3)字符串常量和字符常量的區(qū)別如表8.2所示。,8.3 字符數(shù)組,表8.2 字符串常量和字符常量的區(qū)別,8.3 字符數(shù)組,2字符數(shù)組 其定義格式如下: char 數(shù)組名常量表達式;,例如: char a10; char a2b12; char _bc520; char a_b1225; char a25*3; char b_d9+2;,8.3 字符數(shù)組,3字符數(shù)組的初始化 (1)逐個字符初始化 例如,定義一個字符類型的數(shù)組a14,
22、并將其初始化,其代碼如下: char c14=I, ,a,m, ,a, ,s,t,u,d,e,n,t;,8.3 字符數(shù)組,例如,定義一個字符數(shù)組a12并初始化,其代碼如下: char a13=H,e,l,l,o, ,W,o,r,l,d; 則數(shù)組a的狀態(tài)如圖8.13所示。,8.3 字符數(shù)組,例如一個二維字符數(shù)組的初始化代碼如下: char month3=S,U,N,M,O,N,T,U,E, W,E,D,T,H,U,F,R,I,S,A,T; month是二維字符數(shù)組名,month的邏輯狀態(tài)如圖8.15所示。,8.3 字符數(shù)組,(2)字符串初始化字符數(shù)組 C語言允許將字符串直接賦值給字符數(shù)組,其代碼
23、如下: char a=“Hello World”; char c=“I am a student”; char a=“Hello World”; char c=“I am a student”;,8.3 字符數(shù)組,(3)兩種方法的比較 將字符串直接賦值給字符數(shù)組與第一種方法逐個字符初始化的方法有一個區(qū)別。如何使用第二種方法初始化字符數(shù)組,系統(tǒng)會在字符串的末尾自動添加一個0作為結(jié)束標志。這樣,通過這個結(jié)束標志0就可以判斷字符串的長度了。,8.3 字符數(shù)組,4字符數(shù)組的連續(xù)輸入使用格式符s 在C語言中,使用scanf函數(shù)為字符數(shù)組輸入數(shù)據(jù)有兩種方式:使用格式說明符%c和使用格式說明符%s。例如,輸
24、入5個字符到字符型數(shù)組a中,代碼如下: char a5; int i; for (i=0;i5,i+) scanf(%c ,8.3 字符數(shù)組,5字符數(shù)組的連續(xù)輸出使用格式符s 如果將多個字符輸出,可以使用一個循環(huán),代碼如下: for (i=0;i5,i+) printf(%c ,ai);,8.3 字符數(shù)組,【例8.11】輸入一個字符串,判斷每一個字母(不區(qū)分大小寫)出現(xiàn)的次數(shù)。 分析:這是一個分類統(tǒng)計問題,用一個大小為26的一維數(shù)組存放26個字母出現(xiàn)的次數(shù)。大寫字母AZ的出現(xiàn)次數(shù)分別存放在數(shù)組a1a26中,小寫字母az的出現(xiàn)次數(shù)分別存放在數(shù)組a1a26中。為了保證大寫字母的個數(shù)依次存放在數(shù)組a
25、中,需要將數(shù)組元素的ASCII碼減去65;同理,為了讓小寫字母的個數(shù)依次存放到數(shù)組a中,需要將數(shù)組元素的ASCII碼減去97(提示:大寫字母“A”的ASCII碼為65,小寫字母“a”的ASCII碼為97)。,8.3 字符數(shù)組,letter =si;/*取出一個字符*/ if(letter= A /*統(tǒng)計每個字母出現(xiàn)的次數(shù)*/ ,8.3 字符數(shù)組,1strlen函數(shù)求字符串長度 例如,定義并初始化字符數(shù)組,輸出字符串的長度,代碼如下: char str10 = china; printf( %d n,strlen(str); 輸出結(jié)果是5,而不是10。,8.3 字符數(shù)組,【例8.12】編程程序,
26、求字符串的長度。 #include void main ( ) int length; char line10; gets(line); length=0; while ( linelength != 0 ) length +; printf (”String length=%d”, length); ,8.3 字符數(shù)組,2strcat函數(shù)連接字符串 例如,定義字符數(shù)組str1和str2并初始化,將第str2連接到str1末尾,代碼如下: char str130=I am a ; char str2=student.; strcat(str1,str2); 執(zhí)行以上語句后,字符數(shù)組str1的內(nèi)
27、容為I am a student.。,8.3 字符數(shù)組,3strcpy函數(shù)復制字符串 例如,有以下代碼: char a6=China,b =123; strcpy(a,b); strcpy(b,ABC); puts(a); puts(b); 輸出結(jié)果如下: 123 ABC,8.3 字符數(shù)組,4strcmp函數(shù)字符串比較函數(shù) strcmp的使用方法如下: char a10=China,b =123; printf(%dn,strcmp(b,a);/*因為b串小于a串,所以輸出-18*/ printf(%dn,strcmp(a,Beijing);/*因為a串大于Beijing,所以輸出1*/,8.
28、3 字符數(shù)組,5字符串中大寫字母變換成小寫字母函數(shù)strlwr() 例如,將str中的字符串轉(zhuǎn)換為小寫字母,代碼如下: char str=CHINA; strlwr(str); 執(zhí)行以上語句后,str中的內(nèi)容變換為“china”。 6將字符串中小寫字母轉(zhuǎn)換為大寫函數(shù)strupr() 例如,將str中的字母轉(zhuǎn)換為大寫字母,代碼如下: char str=china; strupr(str); 執(zhí)行以上語句后,str中的內(nèi)容轉(zhuǎn)換為CHINA。,8.3 字符數(shù)組,8.3.3 二維字符數(shù)組 定義二維字符數(shù)組的語法格式如下: char 數(shù)組名常量表達式1常量表達式2; 【例8.13】輸出一個鉆石圖形。,8
29、.3 字符數(shù)組,#include #include void main() static char diamond5= , ,*, ,*, ,*, *, , , ,* , ,*, ,*, , ,*; int i,j; for (i=0;i5;i+) for(j=0;j5;j+) printf(%c,diamondij); printf(n); ,8.3 字符數(shù)組,一維字符數(shù)組只能存放一個字符串,如果要存放多個字符串,則需要使用二維字符數(shù)組存放字符串,每一行存放一個字符串。例如,定義一個二維字符數(shù)組,代碼如下: char a36= study,work,life; char b 6= s1,st
30、2,str3;,8.3 字符數(shù)組,char a310= study,work,life; for (i=0;i3;i+) /*輸出第i行字符串*/ printf(%sn,ai); for (i=0;i3;i+)/*輸出第i行第i列字符*/ printf(%cn,aii); 輸出結(jié)果如下: study work life s o f,8.3 字符數(shù)組,【例8.14】統(tǒng)計選票。設候選人有N人,參加投票的有M人,統(tǒng)計每個候選人的得票數(shù)。 #define N 3 #define M 10 #include #include void main( ) char sN10,k10; int bN,i,j;
31、 printf(請輸入候選人姓名:n); for(i=0;iN;i+) gets(si); bi=0; ,8.3 字符數(shù)組,printf(請輸入所投候選人姓名:n); for ( i=0; iM; i+ ) /*M個人投票 */ gets(k);/*輸入候選人姓名*/ for ( j=0; j3; j+ ) if(strcmp(sj,k)=0) /*為候選人計票*/ bj+; break; printf (投票結(jié)果:n); for ( i=0; iN; i+ )/*輸出候選人姓名和票數(shù)*/ printf (%10s:%5dn,si,bi); ,8.3 字符數(shù)組,【例8.15】 從鍵盤輸入三個字
32、符串,找出其中的最大者。 分析:比較字符串的大小,就是比較字符串中的字符對應ASCII碼的大小,這需要使用字符串比較strcmp函數(shù)。在比較過程中,如果需要交換兩個字符串,就需要使用strcpy函數(shù)。,8.3 字符數(shù)組,#include #include void main( ) char str320,string20; int i; printf(Input three strings:n); for (i=0;i0) strcpy(string,str0); else strcpy(string,str1); if (strcmp(str2,string)0) strcpy(string
33、,str2); printf(最大的字符串:%s,string); ,8.3 字符數(shù)組,8.3.4 字符數(shù)組應用舉例 【例8.16】輸入一個字符串,將字符串中的字符逆序輸出。 分析:將字符串存放在字符數(shù)組中,先計算出字符串的長度為n后,然后將a0和an-1互換,a1和an-2互換,ai 和an-i-1互換即可。,8.3 字符數(shù)組,#include #include void main() int i,n; char a30,temp; printf(Please input a string:); scanf(%s,a); n=strlen(a); for(i=0;in/2;i+) temp=
34、ai;ai=an-i-1;an-i-1=temp; for(i=0;in;i+) printf(%c,ai); ,8.3 字符數(shù)組,【例8.17】應用字符數(shù)組實現(xiàn)兩個字符串的連接。,方法一:使用C語言提供的字符串處理函數(shù)strcat實現(xiàn)兩個字符串的連接。 #include #include void main( ) char str140,str220;/*定義字符數(shù)組str1、str2*/ printf(Input two strings:n); gets(str1); /*輸入字符串1到str1中*/ gets(str2);/*輸入字符串2到str2中*/ strcat(str1,str2
35、);/*將str2連接到str1末尾*/ printf(%sn,str1);/*輸出連接后的字符串*/ ,8.3 字符數(shù)組,方法二:不使用字符串連接函數(shù)strcat連接兩個字符串。 字符數(shù)組str1、str2保存原有的兩個字符串,仍然用str1保存連接后的字符串。先找到str1中原有的字符串尾部,遇到0為止,然后將str2保存的原有字符串中字符一一賦值到str1尾部之后的相應位置。,8.3 字符數(shù)組,#include void main( ) char str140,str220;/*定義字符數(shù)組str1和str2*/ int i,j; printf(Input two strings:n);
36、 gets(str1);/*輸入字符串1到str1中*/ gets(str2);/*輸入字符串2到str2中*/ i=0;/*使i指向str1的第一個元素*/ while (str1i!=0)/*找到str1串的末尾,以便從該位置連接str2串*/ i+; j=0;/*使j指向str2的第一個元素*/,8.3 字符數(shù)組,while (str2j!=0)/*判斷str2是否結(jié)束*/ str1i=str2j;/*將str2j賦給str1i */ i+; /*使i指向str1的下一個元素*/ j+; /*使j指向str2 的下一個元素*/ str1i=0; /*在str1末尾添加結(jié)束標志0*/ pr
37、intf(%sn,str1);/*輸出str1*/ ,8.3 字符數(shù)組,【例8.18】判斷字符串s1中是否包含字符串s2。例如“china123”包含“na12”,但不包含“abc”。 分析:從字符串s1的第一個字符開始,依次分別與字符串s2的字符比較。如果兩字符相等,則比較下一對字符,當在s2中遇到0,則說明s1包含s2。如果字符不相等,則從s1的下一個字符(第2個字符)開始,依次與s2中的對應字符比較,繼續(xù)重復以上過程,直到在s1中找到s2或者找遍s1不存在s2為止。,8.3 字符數(shù)組,#include #include void main( ) char s180,s280; int i
38、=0, j, k, k1, k2, f; puts(請輸入第一個字符串:); gets(s1); puts(請輸入第二個字符串:); gets(s2); k1=strlen(s1); k2=strlen(s2); f=0;,8.3 字符數(shù)組,while(ik1-k2+1,8.3 字符數(shù)組,if(f=1) printf (%s 在 %s中n,s2,s1); else printf (%s不在 %s中n,s2,s1); 程序運行結(jié)果如下: 請輸入第一個字符串: Northwest University is a famous University! 請輸入第二個字符串: University Un
39、iversity在Northwest University is a famous University!中,8.5 數(shù)組應用舉例,【實例一】約瑟夫環(huán)問題 約瑟夫(josephus)環(huán):有n個人圍成一個環(huán),假如從第一個人開始報數(shù),報數(shù)為m的人離開,問最后留下的是第幾個人?例如,n=6,m=2,則依次出列的人的編號是:2,4,6,3,1,最后留下的人的編號為5。,8.5 數(shù)組應用舉例,分析:定義一個數(shù)組Child,每個元素代表一個人;元素下標可以作為他們的編號,例如,Child0代表第1個人,Child1代表第2個人,依次類推。為了使數(shù)組構成一個環(huán),可以采用“加1取?!狈?。例如,如果n=6,就需
40、要使用下標i加1對6取模,即(i+1)%6。當i=5時,(i+1)%6就是0,表示最后一個人的后面是第1個人。,8.5 數(shù)組應用舉例,#include #define n 6 void main() int m=2,i,j,k; int Childn,winner; for(i=0;in;i+)/*將每個人的編號存放在數(shù)組中*/ Childi=i+1; i=-1,j=0,k=0;/*k代表離開的人數(shù)*/ while(1) for(j=0;jm;)/*在圈中數(shù)m個小孩*/ i=(i+1)%n;,8.5 數(shù)組應用舉例,if(Childi!=-1)/*小孩在環(huán)中則數(shù)數(shù)有效*/ j+; if(k=n-
41、1) break; printf(%4d,Childi);/*輸出出列人的編號*/ Childi=-1;/*將離開的人標記為-1 */ k=k+1; /*離開人的個數(shù)加1 */ winner=Childi; printf(n最后剩下的人的編號:%dn,winner); ,8.5 數(shù)組應用舉例,【實例二】矩陣轉(zhuǎn)置 編寫一個程序,將一個矩陣轉(zhuǎn)置。例如,有一個34的矩陣,經(jīng)過轉(zhuǎn)置后得到一個43的矩陣。矩陣的轉(zhuǎn)置如圖8.21所示。,8.5 數(shù)組應用舉例,所謂矩陣的轉(zhuǎn)置:就是將矩陣中每個元素的行下標和列下標互換,并將該元素放在對應下標的位置,就得到了相應的轉(zhuǎn)置矩陣。一個nm的矩陣,經(jīng)過轉(zhuǎn)置后,得到的是一
42、個mn的矩陣。例如,元素12的行下標分別是2和1,則經(jīng)過轉(zhuǎn)置后元素12就應該在第2行第1列;元素24的行下標分別是2和4,則經(jīng)過轉(zhuǎn)置后,元素24就應該在第4行和第2列。,8.5 數(shù)組應用舉例,分析:為了實現(xiàn)34矩陣的轉(zhuǎn)置,需要定義兩個矩陣,一個是34矩陣,用于存放轉(zhuǎn)置前的矩陣元素;另外還需要定義一個43矩陣,存放轉(zhuǎn)置后的矩陣元素。利用二維數(shù)組實現(xiàn)矩陣的轉(zhuǎn)置其實很簡單,只需要一個賦值語句就可以了,僅僅需要將數(shù)組的下標互換一下就可以了。,8.5 數(shù)組應用舉例,#include void main() int i,j,a4=11,12,13,14,21,22,23,24,31,32,33,34; int row=3,col
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 暑期校園維修方案投標文件(技術方案)
- 醫(yī)院感染管理總結(jié)與醫(yī)院感染管理科2024年工作計劃匯編
- 網(wǎng)絡空間安全的態(tài)勢評估與預警技術
- 歷史智慧與社會
- 2025-2030中國噴涂聚氨酯泡沫(SPF)市場運行態(tài)勢與前景趨勢洞察報告
- 2025-2030中國臺球用品市場現(xiàn)狀調(diào)查及前景趨勢研究報告
- 2025-2030中國反滲透膜化學品市場現(xiàn)狀調(diào)查及未來競爭力剖析報告
- 2025-2030中國分類信息網(wǎng)站行業(yè)應用趨勢預測及前景動態(tài)研究報告
- 2025-2030中國六氟磷酸鋰(LiPF6)市場發(fā)展現(xiàn)狀及競爭格局研究報告
- 2025-2030中國低維護玻璃市場供需現(xiàn)狀及未來全景深度解析報告
- 四新四化的心得體會(24篇)
- 2023年空氣加熱室設備安裝單位工程竣工資料
- 道路清障救援作業(yè)服務投標方案(完整技術標)
- 個人查擺問題及整改措施總結(jié)(二篇)
- 海南碧凱藥業(yè)有限公司二期外用制劑車間栓劑生產(chǎn)線產(chǎn)能擴建項目 環(huán)評報告
- 2024年度醫(yī)院醫(yī)療設備維修保養(yǎng)情況報告課件
- 【基于SLP方法的餐廳設施布局優(yōu)化的案例探析13000字(論文)】
- 前列腺癌護理個案查房課件
- 克羅恩病診斷與治療新指南課件
- 普惠性托育機構申請托育中心情況說明基本簡介
- 古城墻修復專項施工方案
評論
0/150
提交評論