第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第1頁(yè)
第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第2頁(yè)
第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第3頁(yè)
第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第4頁(yè)
第6章_利用數(shù)組處理批量數(shù)據(jù).ppt_第5頁(yè)
已閱讀5頁(yè),還剩126頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、復(fù)習(xí):條件判斷表達(dá)式,邏輯表達(dá)式,分支,循環(huán),1、打星星,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=5;j+) printf(*); printf(n); ,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=i;j+) printf(*); printf(n); ,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=5-i;j+) printf( ); for(j=1;j=i;j+) printf(*);

2、 printf(n); ,#include void main() int i,j; for(i=1;i=5;i+) for(j=1;j=5-i;j+) printf( ); for(j=1;j=2*i-1;j+) printf(*); printf(n); ,#include void main() int i,j; for(i=1;i=1;i-) for(j=1;j=5-i;j+) printf( ); for(j=1;j=2*i-1;j+) printf(*); printf(n); ,2、循環(huán)中套用if判斷 #include void main() int i; for(i=10;i=

3、1000;i+) if(i%17=0 ,處理輸入數(shù)據(jù) 例如輸入20個(gè)數(shù),輸出最大值,處理循環(huán)變量 輸出10到1000之間,能被17整除, 十位數(shù)為5的整數(shù)。,關(guān)于循環(huán)套用if語(yǔ)句的方法,一定要熟練 例如: 本題; 最大最小值; 求和求階乘求平均; 輸出奇數(shù)(偶數(shù)); 素?cái)?shù); 字符處理; ,第六章,利用數(shù)組處理批量數(shù)據(jù),問題:給一組數(shù)排序,這組 數(shù)該 如何存放呢,? 這些數(shù)據(jù)如何存放才便于排序,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,本章要點(diǎn),掌握一維、二維數(shù)組的定義和引用方法、存儲(chǔ)結(jié)構(gòu)和初始

4、化方法。 掌握有關(guān)一維數(shù)組的有關(guān)算法。 掌握數(shù)組的運(yùn)算。,主要內(nèi)容,6.1 為什么要用數(shù)組 6.2 定義和引用一維數(shù)組 6.3 二維數(shù)組的定義和引用 6.4 字符數(shù)組 6.5 提高部分,6.1 為什么要用數(shù)組,C語(yǔ)言為這些數(shù)據(jù),提供了一種構(gòu)造數(shù)據(jù)類型:數(shù)組。所謂數(shù)組就是一組具有相同數(shù)據(jù)類型的數(shù)據(jù)的有序集合。,一個(gè)班學(xué)生的學(xué)習(xí)成績(jī) 一行文字 一個(gè)矩陣 這些數(shù)據(jù)的特點(diǎn)是: 1、具有相同的數(shù)據(jù)類型 2、使用過程中需要保留原始數(shù)據(jù),1.一維數(shù)組的定義格式為: 類型說明符 數(shù)組名常量表達(dá)式; 例如: int a10; 它表示定義了一個(gè)整形數(shù)組,數(shù)組名為a,此數(shù)組有10個(gè)元素。,6.2 定義和引用一維數(shù)組

5、 6.2.1 定義一維數(shù)組,說明: 1.數(shù)組名定名規(guī)則和變量名相同,遵循標(biāo)識(shí)符定名規(guī)則。,標(biāo)識(shí)符 由程序員定義的命名符,語(yǔ)法:以字母或下劃線開始,由字母、數(shù)字和下劃線組成的符號(hào)串,注意:,break int 等 不能用于命名程序中的自定義 函數(shù)、變量、常量,(1) 不能使用關(guān)鍵字作用戶標(biāo)識(shí)符;,(2) C語(yǔ)言中,字母大小寫敏感;,(3) C語(yǔ)言沒有規(guī)定標(biāo)識(shí)符的長(zhǎng)度,不同編譯系統(tǒng)有不同的識(shí)別長(zhǎng)度;,(4) 標(biāo)識(shí)符盡可能做到見文知義。,Aa 和 aa 是兩個(gè)不同的標(biāo)識(shí)符,1.2.2 詞匯,main printf等 已經(jīng)用過的變量名或函數(shù)名也不能用于命名程序中的自定義 函數(shù)、變量、常量,語(yǔ)法:以字母

6、或下劃線開始,由字母、數(shù)字和下劃線組成的符號(hào)串,判斷以下標(biāo)識(shí)符的正確性:,合法標(biāo)識(shí)符有:a x1 no_1 _a2c sum Name name 不合法標(biāo)識(shí)符有:2a x+y a,b a int b10+10; scanf(%d, ,數(shù)組說明中其他常見的錯(cuò)誤: float a0;/* 數(shù)組大小為0沒有意義 */ int b(2) ; /* 不能使用圓括號(hào) */ int k, ak; /* 不能用變量說明數(shù)組大小*/,#include void main() int n=20; /scanf(“%d”, ,注意: 定義數(shù)組時(shí)用到的數(shù)組名常量表達(dá)式 和引用數(shù)組元素時(shí)用到的數(shù)組名下標(biāo) 是有區(qū)別的。

7、例如 int a10; 中只能是整型常量(不可含變量) t=a6; 中是值為整型表達(dá)式(可含變量) 大小為n的數(shù)組,下標(biāo)范圍:0(n-1),6.2 一維數(shù)組的定義和引用6.2.2 引用一維數(shù)組元素,1.數(shù)組元素的引用方式: 數(shù)組名下標(biāo) 下標(biāo)可以是整型表達(dá)式。 例如: a0=a5+a7-a2*3,#include void main() int a3+3; int b=2; /int cb; scanf(%d, ,#include void main() int a5; scanf(%d, ,錯(cuò)誤,2.一維數(shù)組元素引用的程序?qū)嵗?例題 6.1,引用數(shù)組元素。利用循環(huán)給數(shù)組元素a0a9賦值為09,

8、然后按逆序輸出各元素的值,解題思路,用0到9的循環(huán)給數(shù)組元素a0 a9賦值09,然后用9到0的循環(huán)按a9到a0的順序輸出各元素的值。,2.一維數(shù)組元素引用的程序?qū)嵗?運(yùn)行結(jié)果如下: 9 8 7 6 5 4 3 2 1 0,編寫程序,#include void main() int i,a10; for (i=0; i=0; i-) printf(%d ,ai); printf(n); ,對(duì)數(shù)組元素初始化的實(shí)現(xiàn)方法:,1.在定義數(shù)組時(shí)對(duì)數(shù)組元素賦以初值。 例如:int a10=0,1,2,3,4,5,6,7,8,9; 將數(shù)組元素的初值依次放在一對(duì)花括弧內(nèi)。經(jīng)過上面的定義和初始化之后,a0=0,a

9、1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。,6.2 一維數(shù)組的定義和引用 6.2.3 一維數(shù)組的初始化,3. 如果想使一個(gè)數(shù)組中全部元素值為0,可以寫成: int a10=0,0,0,0,0,0,0,0,0,0; 或 int a10=0;,2. 可以只給一部分元素賦值。 例如: int a10=0,1,2,3,4; 定義a數(shù)組有10個(gè)元素,但花括弧內(nèi)只提供5個(gè)初值,這表示只給前面5個(gè)元素賦初值,后5個(gè)元素值為0。,#include void main() int i,a10; for(i=9;i=0; i-) printf(%d ,ai); pri

10、ntf(n); ,#include void main() int i,a10=0; for(i=9;i=0; i-) printf(%d ,ai); printf(n); ,4. 在對(duì)全部數(shù)組元素賦初值時(shí),由于數(shù)據(jù)的個(gè)數(shù)已經(jīng)確定,因此可以不指定數(shù)組長(zhǎng)度。 例如:int a5=1,2,3,4,5; 也可以寫成 int a=1,2,3,4,5; int a10=1,2,3,4,5; 只初始化前5個(gè)元素,后5個(gè)元素為0。,Fibonacci數(shù)列公式:已知: a1=a2=1,an=an-1+an-2 即:1,1,2,3,5,8,13 建立一個(gè)數(shù)組,將數(shù)列中第1個(gè)數(shù)放在數(shù)組第1個(gè)的元素中,數(shù)列第2個(gè)數(shù)

11、放在數(shù)組第2個(gè)的元素中,。,6.2 一維數(shù)組的定義和引用 6.2.4 一維數(shù)組程序舉例,例題 6.2,用數(shù)組來(lái)處理求Fibonacci數(shù)列問題。,解題思路,#include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(n); printf(%12d,fi); printf(n); ,if(i%5=0 int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) printf(%12d,fi);

12、if(i+1)%5=0) printf(n); ,#include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) printf(%12d,fi); if(i%5=4) printf(n); ,#include void main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=1;i=20;i+) printf(%12d,fi-1); if(i%5=0) printf(n); ,程序沒有定式 要通過思考形成 解決問題的

13、邏輯 用特定語(yǔ)句實(shí)現(xiàn)它 如果程序有錯(cuò)誤時(shí) 思考找出邏輯缺陷 在什么位置,例題 6.3,假如有n個(gè)人,各人年齡不同,希望按年齡將他們從小到大排列。,解題思路,這種問題稱為數(shù)的排序(sort)。排序的原則有兩 類,一類是升序,從小到大;一類是降序,從大到小。我們可以把這個(gè)題目抽象為一般形式: 對(duì)n個(gè)數(shù)按升序排列 對(duì)一組數(shù)據(jù)進(jìn)行排序的方法很多,本例介紹用起泡法排序。起泡法的思路如下,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;ia1) t=a0; a0=a1; a1=t; printf(

14、the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,#include void main() int a10; int i,j,t; printf(

15、input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,for(j=1;j=9;j+) 可以嗎?,for(i=1;i=9;i+) 可以嗎?,經(jīng)過第一趟后,最大的數(shù)9已沉底 。然后進(jìn)行對(duì)余下的前面5個(gè)數(shù)第二趟比較,共5次比較與交換即可。,比較相鄰的兩個(gè)數(shù),如果有n個(gè)數(shù),則要進(jìn)行n-1趟比較。在第1趟比較中要進(jìn)行n-1次兩兩比較,在第2趟比較中要進(jìn)行n-2次兩兩比較,在第j趟比較中要進(jìn)

16、行n-j次兩兩比較。,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,趟,次,關(guān)于冒泡排序的討論:,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai

17、; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,for(j=1;j=9;j+) 可以嗎?,for(i=1;i=9;i+) 可以嗎?,#include void main() int a10; int i,j,t; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%

18、d ,ai); printf(n); ,提高了效率,#include void main() int a10; int i,j,t; int work; printf(input 10 numbers :n); for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; work=1; if(!work) break; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n); ,提高了效率,#include void main() int a10; int i,j,t,work,coun

19、t=0; printf(input 10 numbers :n); for (i=0;iai+1) t=ai;ai=ai+1;ai+1=t; work=1; if(!work) break; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); printf(n);printf(%dn,count); ,數(shù)組:一種數(shù)據(jù)類型,可以按順序存放同類型的多個(gè)數(shù)據(jù)。 例:在一維數(shù)組中存放有某班同學(xué)的成績(jī)。提示用戶輸入一個(gè)成績(jī),程序判斷此成績(jī)?cè)跀?shù)組中的情況,如果有則輸出其序號(hào),如果沒有則輸出No such grade!,#includ

20、e void main() int i,a,flag=0; int s10=60,60,70,80,80,50,50,60,70,70; printf(please input a grade for search:); scanf(%d, ,輸入公元后的某一個(gè)日期(年月日), 輸出該日期是那一年的第幾天。 注意,對(duì)于年份值,要求大于0, 否則提示用戶重新輸入; 對(duì)于月份值,要求在1到12之間, 否則提示用戶重新輸入; 對(duì)于日期值輸入有誤的, 提示用戶重新輸入。,算法: int a12=31,28,31,30,31,30,31,31,30,31,30,31; do 輸入年份 while(不合法

21、年份); do 輸入月份 while(不合法月份); if(閏年) a1=29; do 輸入日期 while(不合法日期); sum=日期; for(i=0;i=月份-2;i+) sum=sum+ai;,#include void main() int a12=31,28,31,30,31,30,31,31,30,31,30,31; int y,m,d,i,sum; do printf(請(qǐng)輸入年份:); scanf(%d, ,如何調(diào)試程序? Insert breakpoint Go Step (右鍵 調(diào)試 debug) Auto Watch,#include void main() int i

22、,sum; for(i=0;i5;i+); sum=+i; printf(第%d天。n,sum); ,#include void main() int a12=31,28,31,30,31,30,31,31,30,31,30,31; int y,m,d,i,sum; do printf(請(qǐng)輸入年份:); scanf(%d, ,練習(xí): 1、數(shù)組中存有10個(gè)分?jǐn)?shù),去掉一個(gè)最高分,去掉一個(gè)最低分,算出最后得分,并輸出。 (10分制,有小數(shù)),練習(xí): 2、數(shù)組中存有20個(gè)分?jǐn)?shù),去掉2個(gè)最高分,去掉2個(gè)最低分,算出最后得分,并輸出。 (10分制,有小數(shù)),今天作業(yè): 2.1 2.2 2.3 3.3 3.

23、4,6.3 二維數(shù)組的定義和引用 6.3.1 定義二維數(shù)組,二維數(shù)組定義的一般形式為 類型說明符 數(shù)組名常量表達(dá)式常量表達(dá)式; 例如:定義a為34(3行4列)的數(shù)組,b為510(5行10列)的數(shù)組。如下: float a34,b510;,不能寫成 float a3,4,b5,10;,C語(yǔ)言中,二維數(shù)組中元素排列的順序是按行存放的,即在內(nèi)存中先順序存放第一行的元素,再存放第二行的元素。下圖表示對(duì)a34數(shù)組存放的順序。 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,6.3 二維數(shù)組的定義和引用 6.3.1 定義二維數(shù)組,二維數(shù)組元素的表示形式為:

24、數(shù)組名下標(biāo)下標(biāo) 例如: a23 下標(biāo)可以是表達(dá)式,可以有變量,如 ai-12*j-1,數(shù)組元素可以出現(xiàn)在表達(dá)式中,也可以被賦值 例如:b12=a23/2,6.3 二維數(shù)組的定義和引用6.3.2 引用二維數(shù)組的元素,常出現(xiàn)的錯(cuò)誤有: int a34; /* 定義a為34的數(shù)組 */ a34=3;,在使用數(shù)組元素時(shí),應(yīng)該注意下標(biāo)值應(yīng)在已定義的數(shù)組大小的范圍內(nèi)。,6.3 二維數(shù)組的定義和引用6.3.2 引用二維數(shù)組的元素,每一維下標(biāo)范圍:0(n-1),可以用下面4種方法對(duì)二維數(shù)組初始化:,.分行給二維數(shù)組賦初值。 例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,.可以

25、將所有數(shù)據(jù)寫在一個(gè)花括弧內(nèi),按數(shù)組排列的順序?qū)Ω髟刭x初值。 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;,6.3 二維數(shù)組的定義和引用 6.3.3 二維數(shù)組的初始化,.可以對(duì)部分元素賦初值。 例如: int a34=1,5,9;,1 0 0 0 5 0 0 0 9 0 0 0,也可對(duì)某些行中的某些元素賦初值,如 int a34=1,0,6,0,0,11;,1 0 0 0 0 6 0 0 0 0 11 0,1 0 0 0 5 6 0 0 0 0 0 0,也可以只對(duì)某幾行元素賦初值。如: int a34=1,5,6;,.如果對(duì)全部元素都賦初值,則定義數(shù)組時(shí)對(duì)第一維

26、的長(zhǎng)度可以不指定,但第二維的長(zhǎng)度不能省。 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等價(jià)于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;,在定義時(shí)也可以只對(duì)部分元素賦初值而省略第一維的長(zhǎng)度,但應(yīng)分行賦初值。 例如:int a4=0,0,3,0,10;,0 0 3 0 0 0 0 0 0 10 0 0,算法和程序都是圍繞著變量(內(nèi)存)內(nèi)容進(jìn)行處理的!不同類型的變量有不同的特點(diǎn),可解決不同的問題。例如:二維數(shù)組也是一種類型。 如何將二維數(shù)組各元素賦值為我們需要的內(nèi)容?賦初值或使用循環(huán)賦值; 例如:都賦值為100;提示用戶逐個(gè)輸入;賦值為一

27、系列有規(guī)律的數(shù)據(jù)(元素的內(nèi)存序號(hào)等) 如何讀取二維數(shù)組中的數(shù)據(jù)并處理? 例如:輸出其中的素?cái)?shù) 如何按照二維的形式輸出二維數(shù)組的數(shù)據(jù)?,如何設(shè)計(jì)算法并實(shí)現(xiàn)算法,#include void main() int i,j,k; int s34=0; for (i=0;i3;i+) for (j=0;j4;j+) sij=100; for (i=0;i3;i+) for (j=0;j4;j+) printf(Please input a number:); scanf(%d, ,#include void main() int i,j; int s22; for (i=0;i2;i+) for (j=

28、0;j2;j+) printf(%d ,sij); ,#include void main() int i,j; int s22=0; for (i=0;i2;i+) for (j=0;j2;j+) printf(%d ,sij); printf(n); ,#include void main() int i,j; int s22=0; for (i=0;i2;i+) for (j=0;j2;j+) printf(%d ,sij); printf(n); ,#include void main() int i,j; int s22=0; for (i=0;i2;i+) for (j=0;j2;

29、j+) printf(%d ,sij); printf(n); ,6.3 二維數(shù)組的定義和引用 6.3.4 二維數(shù)組程序舉例,例題 6.4,將一個(gè)二維數(shù)組a的行和列的元素互換(即行列轉(zhuǎn)置),存到另一個(gè)二維數(shù)組b中。,解題思路,將a數(shù)組中第i行j列元素賦給b數(shù)組中j行i列元素,例如a00賦給b00,a01 賦給b10,a02賦給b20,??梢杂秒p層循環(huán)來(lái)處理,用外循環(huán)控制行的變化,內(nèi)循環(huán)控制列的變化。,#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=

30、0;j=2;j+) printf(%5d,aij); printf(n); printf(array b:n); for (i=0; ;i+) for(j=0; ;j+) printf(%5d,bij); printf(n); ,#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(

31、j=0;j=1;j+) printf(%5d,bij); printf(n); ,如果把第7行: for (i=0;i=1;i+) 改為: for (i=0;i=2;i+) b會(huì)輸出什么?,printf(%5d,aij); printf(%5d,bij); 分別被執(zhí)行多少遍? 兩處 printf(n); 語(yǔ)句 分別被執(zhí)行多少遍? printf(array a:n); printf(array b:n); 被執(zhí)行多少遍?,例題 6.5,有一個(gè)班30個(gè)學(xué)生,己知每個(gè)學(xué)生有5門課的成績(jī),要求輸出平均成績(jī)最高的學(xué)生的成績(jī)以及該學(xué)生的序號(hào)。,解題思路,對(duì)本題而言,宜用二維數(shù)組,用一行中的各元素存放一個(gè)學(xué)

32、生的成績(jī),即行代表學(xué)生,列代表一門課的成績(jī)。要存放30個(gè)學(xué)生5門課的成績(jī),要用一個(gè)30*5的二維數(shù)組。另外,由于要比較各人的平均成績(jī),因此,對(duì)每個(gè)學(xué)生來(lái)說,應(yīng)該存放6個(gè)數(shù)據(jù),每人平均成績(jī)要計(jì)算出來(lái),并存放在數(shù)組中。這樣,數(shù)組的大小就應(yīng)該是30*6。 設(shè)計(jì)算法: (1)求每人平均成績(jī),放在數(shù)組每一行的最后一列中; (2)找出最高的平均分,和該學(xué)生的序號(hào); (3)輸出最高的平均分,和該學(xué)生的序號(hào)。,#include void main() int i,j,max_i; float sum,max=-1; float s66=70,80,90,70,90,90,90,100,95,100,60,70

33、,80,90,100, 60,60,70,80,80,50,50,60,70,70,40,50,60,70,80; for (i=0;imax) max=si5; printf(stu_order=%dnmax=%7.2fn,max_i,max); ,#include void main() int i,j,max_i; float sum,max=-1; float s66=70,80,90,70,90,90,90,100,95,100,60,70,80,90,100, 60,60,70,80,80,50,50,60,70,70,40,50,60,70,80; for (i=0;imax)

34、max=si5; max_i=i; printf(stu_order=%dnmax=%7.2fn,max_i,max); ,1、在對(duì)數(shù)組初始化時(shí),只對(duì)各行的前5列賦初值,第6列默認(rèn)為0。 2、注意第一個(gè)for語(yǔ)句的范圍。請(qǐng)思考能否不要sum=0;這一行?或者把這一句改放到第一個(gè)for語(yǔ)句的前面? 3、第三個(gè)for語(yǔ)句內(nèi)嵌了一個(gè)if語(yǔ)句,用來(lái)將5個(gè)學(xué)生的平均分逐個(gè)與max比較,如果符合條件,則同時(shí)記錄它的值以及它的序號(hào),如果可以是負(fù)分,這道題怎么改?,#include void main() int i,j,k; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b

35、12; for (i=0,k=0;i3;i+) for (j=0;j4; j+,k+) bk=aij; for(i=0;i12;i+) printf(%d ,bi); printf(n); ,#include void main() int i,j; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b12; for (i=0;i3;i+) for (j=0;j4;j+) bi*4+j=aij; for(i=0;i12;i+) printf(%d ,bi); printf(n); ,把二維數(shù)組中的元素按照內(nèi)存中存放的順序?qū)氲揭痪S數(shù)組中:,#include voi

36、d main() int i,j,k; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b12; for (i=0,k=0;i3;i+) for (j=0;j4; j+,k+) bk=aij; for(i=0;i12;i+) printf(%d ,bi); printf(n); ,#include void main() int i,j; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b12; for (i=0;i3;i+) for (j=0;j4;j+) bi*4+j=aij; for(i=0;i12;i+) printf(%

37、d ,bi); printf(n); ,把二維數(shù)組中的元素按照內(nèi)存中存放的順序?qū)氲揭痪S數(shù)組中:,i是從0到2變化的 j是從0到3變化的 k是從0到11變化的 i*4+j也是從0到11變化的 其中的j是變化了3遍,6.4 字符數(shù)組6.4.1 定義字符數(shù)組及對(duì)其初始化,定義方法與其它類型數(shù)組類似。例如: char c10; c0=I;c1= ;c2=a; c3=m;c4= ;c5=h;c6=a; c7=p;c8=p;c9=y;,用字符型變量 char c; 直接表示字符串 怎么樣?,對(duì)字符數(shù)組初始化,可逐個(gè)字符賦初值。 例如: char c10=I, ,a, m, ,h, a, p, p, y;

38、,6.4 字符數(shù)組6.4.1 定義字符數(shù)組及對(duì)其初始化,如果初值個(gè)數(shù)小于數(shù)組長(zhǎng)度,則只將這些字符賦給數(shù) 組中前面那些元素,其余的元素自動(dòng)定為空字符。,0代表空字符,ASCII碼值為0; 這與int型數(shù)組初值不足時(shí)使用0進(jìn)行初始化是一致的。,如果提供的初值個(gè)數(shù)與預(yù)定的數(shù)組長(zhǎng)度相同,在定義 時(shí)可以省略數(shù)組長(zhǎng)度,系統(tǒng)會(huì)自動(dòng)根據(jù)初值個(gè)數(shù)確定 數(shù)組長(zhǎng)度。,char c=I, ,a,m, ,h, a,p,p,y;數(shù)組c的長(zhǎng)度自動(dòng)定為10。,char d55= , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*,定義和初始化一個(gè)二維字符數(shù)組,6.4 字符數(shù)組6.4.2 引用字符數(shù)組,

39、例題 6.6,輸出一個(gè)菱形圖,解題思路,先畫出準(zhǔn)備輸出的菱形字符圖案,它應(yīng)當(dāng)是5行5列,然后逐個(gè)寫出其中的字符。,#include void main() char diamond5= , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,*; int i,j; for (i=0;i5;i+) for (j=0;j5;j+) printf(%c,diamondij); printf(n); ,6.4 字符數(shù)組6.4.3字符串和字符串結(jié)束標(biāo)志,為了測(cè)定字符串的實(shí)際長(zhǎng)度,C語(yǔ)言規(guī)定了一個(gè)字符串結(jié)束標(biāo)志0,作為字符數(shù)組并不要求它的最后一個(gè)字符為0 例如: char c5=C,h,i,

40、n,a;,6.4 字符數(shù)組6.4.4 字符數(shù)組的輸入輸出,字符數(shù)組的輸入輸出可以有兩種方法: 逐個(gè)字符輸入輸出。用格式符%c輸入或輸出一個(gè)字符。 將整個(gè)字符串一次輸入或輸出。用%s格式符,意思是對(duì)字符串的輸入輸出。,#include void main() char a6=h,e,l,l,o,0; int i; for (i=0;i5;i+) printf(%c,ai); printf(n); printf(%s,a); printf(n); ,#include void main() char a5=h,e,l,l,o; int i; for (i=0;i5;i+) printf(%c,ai

41、); printf(n); printf(%s,a); printf(n); ,#include void main() char a10=h,e,l,l,o; int i; for (i=0;i5;i+) printf(%c,ai); printf(n); printf(%s,a); printf(n); ,作為字符數(shù)組,并不要求一定要有結(jié)束標(biāo)志0 如果沒有0,使用循環(huán)逐個(gè)字符輸出(%c)是沒問題的;但是,使用%s作為字符串整體輸出,則會(huì)有錯(cuò)誤,因?yàn)橄到y(tǒng)不知道該字符串到哪里結(jié)束,字符串的長(zhǎng)度并不總是等于數(shù)組的大小,#include void main() char a10; int i; f

42、or (i=0;i5;i+) scanf(%c, ,輸入abcde 字符串長(zhǎng)度為5 數(shù)組大小為10,#include void main() char a10; int i; for (i=0;i5;i+) scanf(%c, ,輸入abcde 字符串長(zhǎng)度為5 數(shù)組大小為10,#include void main() char a10=0; int i; for (i=0;i5;i+) scanf(%c, ,輸入abcde 字符串長(zhǎng)度為5 數(shù)組大小為10,系統(tǒng)對(duì)字符串常量自動(dòng)加一個(gè) 0 例如: #include void main() printf(%sn,abcde); ,在內(nèi)存中數(shù)組c的狀

43、態(tài),#include void main() char a=a,a,a; printf(%s,a); printf(n); ,#include void main() char a=aaa; printf(%s,a); printf(n); ,數(shù)組大小分別是多少?,#include void main() char a10=aaa; printf(%s,a); printf(n); ,#include void main() char a10=a,a,a; printf(%s,a); printf(n); ,數(shù)組大小分別是多少?,#include void main() char a10; a

44、=aaa; printf(%s,a); printf(n); ,#include void main() char a10; a=a,a,a; printf(%s,a); printf(n); ,#include void main() char a10; a=aaa; printf(%s,a); printf(n); ,#include void main() char a10; a=a,a,a; printf(%s,a); printf(n); ,都不對(duì)!僅限初始化時(shí)可以! 其他時(shí)候必須單個(gè)元素逐一賦值!,關(guān)于%s的說明: 1. 輸出字符不包括結(jié)束符 0(見0 就停止,不輸出0 ) 2.用

45、%s格式符輸出字符串時(shí),printf函數(shù)中的輸出項(xiàng)是字符數(shù)組名(a),而不是數(shù)組元素名(ai) 3.如果數(shù)組長(zhǎng)度大于字符串實(shí)際長(zhǎng)度,也只輸出到遇0結(jié)束 4.如果一個(gè)字符數(shù)組中包含一個(gè)以上0 ,則遇第一個(gè)0時(shí)輸出就結(jié)束 5.可以用scanf函數(shù)以%s的方式輸入一個(gè)字符串,輸入的字符串帶有0。例如輸入 abc ,數(shù)組中得到的是 a b c 0,#include void main() char a10; int i; scanf(%s,a); for (i=0;i10;i+) printf(%c,ai); printf(n); printf(%s,a); printf(n); ,輸入abc 輸出結(jié)

46、果是什么 為什么,這種情況下,不知道循環(huán)需要多少次,可以判斷到達(dá)0時(shí)結(jié)束 for (i=0;ai!=0;i+) 或 for (i=0;ai;i+),scanf函數(shù)讀取字符串,到空格就停止;如果利用一個(gè)scanf輸入多個(gè)字符串,則在輸入時(shí)以空格分隔即可 例如: #include void main() char str15,str25,str35; scanf(%s%s%s,str1,str2,str3); printf(%s %s %s,str1,str2,str3); printf(n); 輸入數(shù)據(jù): How are you?,#include void main() char str120

47、; scanf(%s,str1); printf(%s,str1); printf(n); 輸入 how are you? 得到什么結(jié)果,分析圖中所示的字符數(shù)組 用8進(jìn)制形式輸出數(shù)組c的起始地址 printf(%o,c); printf(%s,c);,6. scanf函數(shù)中以%s輸入字符串時(shí)直接用數(shù)組名,不再加地址符 printf(%on,c); printf(%sn,c); /printf(%on, /地址相差1;如果是int數(shù)組則相差4,系統(tǒng)對(duì)字符串常量自動(dòng)加一個(gè)0 為了使處理方法一致,在字符數(shù)組中也常常人為地加上一個(gè)0 例如: char c6=C,h,i,n,a,0;,6.4 字符數(shù)組,

48、字符數(shù)組也是數(shù)組,輸出時(shí)本應(yīng)使用循環(huán),逐個(gè)元素輸出(%c);但是字符和其它數(shù)據(jù)不一樣,常常是一串字符代表一個(gè)內(nèi)容,所以引入了字符串統(tǒng)一輸出(%s),作為不同于其它數(shù)組的特殊處理方式,前提是有0作為結(jié)束標(biāo)志,因?yàn)閿?shù)組大小常常大于字符串真實(shí)長(zhǎng)度。(例如:定義人名時(shí)可以定義為大小為30的字符數(shù)組),例如: 定義了如下的字符數(shù)組 char c=Pascal program; 現(xiàn)在想用一個(gè)新的字符串代替原有的字符串,從鍵盤向字符數(shù)組輸入Hello 如果不加0的話,字符數(shù)組中的字符如下 Hellol program,如何輸入Hello?,單個(gè)元素分別讀入,#include void main() char

49、 a=Pascal program; int i; for (i=0;i5;i+) scanf(%c, ,#include void main() char a=Pascal program; int i; for (i=0;i5;i+) scanf(%c, ,#include void main() char a=Pascal program; int i; scanf(%s,a); printf(%s,a); printf(n); ,三個(gè)程序哪個(gè)更好? 為什么? 如果輸入的字符數(shù)不確定,則,在程序中往往需要對(duì)字符串作某些操作處理,如字符串的相互賦值、字符串的連接、字符串的比較等 如: ch

50、ar a6=,b6=; a=b; if(a=b) if(a=b) a=a+b; 可以嗎?,6.4 字符數(shù)組 6.4.5字符串處理函數(shù),幾乎都需要使用循環(huán)來(lái)解決,如何完成?,對(duì)于數(shù)組只能操作其元素, 不能進(jìn)行整體的操作! 直接寫數(shù)組名代表地址操作!,int 型數(shù)組也不能這樣做,由于字符串操作十分常用,為了免去每次使用都寫循環(huán)操作的麻煩,在C函數(shù)庫(kù)中已經(jīng)提供了一些字符串處理函數(shù),實(shí)現(xiàn)以上功能,使用十分方便。 下表列出幾種常用的函數(shù):,6.4 字符數(shù)組 6.4.5字符串處理函數(shù),string.h,除了前兩個(gè)之外,全部在 string.h 里面,#include void main() char a2

51、0=China; char b20=China; gets(a); puts(a); scanf(%s,b); printf(%s,b); printf(n); ,gets可接受空格 scanf到空格就結(jié)束,#include void main() char a20=Chinanaaaaa; puts(a); /printf(%s,a); ,puts()輸出時(shí),自動(dòng)將字符串結(jié)束標(biāo)志0轉(zhuǎn)換成n , 即輸出完字符串后自動(dòng)換行,#include void main() char a20=Chinanaaaaa; puts(gets(a); gets函數(shù)有返回值,返回值就是數(shù)組a的地址,所以可以連續(xù)進(jìn)

52、行puts gets得到的字符串也是帶結(jié)束標(biāo)志的(0),string.h,除了前兩個(gè)之外,全部在 string.h 里面,#include #include void main() char a20=China; char b20=China; strcat(a,b); printf(%sn,a); printf(%sn,b); ,strcat的作用是把字符串2接到字符串1的后面,結(jié)果放在字符串1中,函數(shù)調(diào)用后得到一個(gè)函數(shù)值字符數(shù)組1的地址 例如: char str130=Peoples Republic of ; char str2=China; print(%s,strcat(str1,s

53、tr2); 輸出: Peoples Republic of China,a=a+b是不行的,string.h,除了前兩個(gè)之外,全部在 string.h 里面,#include #include void main() char a20=aaaaaaaaaaaaa; char b20=China; strcpy(a,b); printf(%sn,a); printf(%sn,b); ,關(guān)于strcpy函數(shù)的幾點(diǎn)說明,1.字符數(shù)組1必須定義得足夠大,以便容納被復(fù)制的字符串。字符數(shù)組1的長(zhǎng)度不應(yīng)小于字符串2的長(zhǎng)度。,2.字符數(shù)組1必須寫成數(shù)組名形式(如str1),字符串2可以是字符數(shù)組名,也可以是一

54、個(gè)字符串常量,如strcpy(str1,China);,3.復(fù)制時(shí)連同字符串后面的0一起復(fù)制到字符數(shù)組1中,4.不能用賦值語(yǔ)句將一個(gè)字符串直接給一個(gè)字符數(shù)組。 如下面兩行都是不合法的: str1=China; str1=str2; 只能用strcpy函數(shù)將一個(gè)字符串復(fù)制到另一個(gè)字符數(shù)組中。 用賦值語(yǔ)句只能將一個(gè)字符賦給一個(gè)字符型變量或字符數(shù) 組元素。如下面是合法的: char a5,c1,c2; c1=A; c2=B; a0=C; a1=h; a2=i; a3=n; a4=a;,string.h,除了前兩個(gè)之外,全部在 string.h 里面,如果不使用strcpy函數(shù),如何實(shí)現(xiàn)字符串復(fù)制,#

55、include void main() char a20=China; char b20; printf(%sn,a); printf(%sn,b); ,如果不使用strcpy函數(shù),如何實(shí)現(xiàn)字符串復(fù)制,#include void main() char a20=China; char b20; int i; for(i=0; ;i+) bi=ai; printf(%sn,a); printf(%sn,b); ,如果不使用strcpy函數(shù),如何實(shí)現(xiàn)字符串復(fù)制,#include void main() char a20=China; char b20; int i; for(i=0;ai!=0;i+) bi=ai; printf(%sn,a); printf(%sn,b); ,如果不使用strcpy函數(shù),如何實(shí)現(xiàn)字符串復(fù)制,#include void main() char a20=China; char b20; int i; for(i=0;ai!=0;i+) bi=ai; bi=ai; printf(%sn,a); printf(%sn,b); ,#include #include void main() char a20=China; char b20=China; char c20=aaz;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論