二課件new第四章數(shù)組_第1頁
二課件new第四章數(shù)組_第2頁
二課件new第四章數(shù)組_第3頁
二課件new第四章數(shù)組_第4頁
二課件new第四章數(shù)組_第5頁
已閱讀5頁,還剩61頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第四章數(shù)組4.1

數(shù)組概述數(shù)組是一種重要的數(shù)據(jù)結(jié)構(gòu),而非數(shù)據(jù)類型數(shù)組是一組相關(guān)的存儲(chǔ)單元,這些存儲(chǔ)

單元具有相同的名字和數(shù)據(jù)類型,數(shù)組

中不同的元素的引用(使用),需要提

供數(shù)組名和元素在數(shù)組中的序號(hào)(下標(biāo))簡(jiǎn)單數(shù)組例子數(shù)組a有10個(gè)元素?cái)?shù)組名a后用方括號(hào)([])括起特定元素的序號(hào)(通常叫下標(biāo)),可引用任何一個(gè)數(shù)組元素,如

a[2],表示下標(biāo)為2的元素,數(shù)組中的第三個(gè)元素下標(biāo)可以是整數(shù)或者整數(shù)表達(dá)式數(shù)組下標(biāo)從0開始,因此使用第i個(gè)元素,用a[i-1]表示數(shù)組的下標(biāo)方括號(hào)——[][]實(shí)際上也被認(rèn)為是一個(gè)運(yùn)算符,和圓括號(hào)()具有相同的優(yōu)先級(jí)迄今為止的運(yùn)算符總結(jié)運(yùn)算符優(yōu)先級(jí)順序結(jié)合性類型()

[]1自左向右括號(hào)++--+(正號(hào))

-(符號(hào))!(數(shù)據(jù)類型)2自右向左單目運(yùn)算*

/

%3自左向右乘除求余運(yùn)算+

-4自左向右加減法運(yùn)算<

<=

>

>=5自左向右關(guān)系運(yùn)算==

!=6自左向右關(guān)系運(yùn)算&&7自左向右邏輯“與”||8自左向右邏輯“非”?

:9自左向右條件運(yùn)算符=、+=、-=、*=、/=、%=10自右向左賦值運(yùn)算符,11自左向右逗號(hào)運(yùn)算符4.2

數(shù)組聲明語法形式:數(shù)據(jù)類型數(shù)組名[數(shù)組大小];如:int

a[10];//表示定義了10個(gè)單元的整形數(shù)組,下標(biāo)范圍0~9,不包括10其中數(shù)據(jù)類型,可以是基本數(shù)據(jù)類型:int,float,double,char,也可以是自定義數(shù)據(jù)類型、指針類型(后續(xù)章節(jié)介紹)數(shù)組名,任何合法標(biāo)識(shí)符數(shù)組大小,數(shù)組元素個(gè)數(shù),常量整數(shù)表達(dá)式,不能使用變量#include"stdio.h"main(){int

n[10],i; //定義數(shù)組//初始化數(shù)組

for(i=0;i<10;i++)n[i]=0;printf("元素 下標(biāo)\n");for(i=0;i<10;i++) //打印數(shù)組內(nèi)容printf("%4d

%4d\n",n[i],i);}初學(xué)者注意:int

a[10];

定義時(shí)候10表示共有十個(gè)元素,下標(biāo)編號(hào)為0~9在應(yīng)用時(shí)候,不能出現(xiàn)a[10],因?yàn)椴淮嬖谙聵?biāo)編號(hào)為10(第十一個(gè))元素用變量做下標(biāo)時(shí)候,注意下標(biāo)變量的取值范圍,下標(biāo)值不合適會(huì)導(dǎo)致下標(biāo)越界(下標(biāo)超出定義

范圍)數(shù)組聲明并初始化int

n[5]={1,4,5,7,8};int

a[10]={0},

b[5]={};int

a[]={1,2,3,4,5};第一種方式,聲明數(shù)組,并初始化所有元素第二種方式,聲明數(shù)組并初始化部分元素,其他元素自動(dòng)初始為0第三種方式,根據(jù)提供的元素個(gè)數(shù),自動(dòng)確定數(shù)組大小注意:定義時(shí)候可以用{}初始化不能在賦值語句中出現(xiàn)n[5]={1,4,5,7,8};使用#define

定義數(shù)組大小是良好的習(xí)慣#include"stdio.h“#define

SIZE

10main(){int

a[SIZE],i;

//定義數(shù)組//初始化數(shù)組

for(i=0;i<SIZE;i++)a[i]=0;printf("元素

下標(biāo)\n");for(i=0;i<SIZE;i++)

//打印數(shù)組內(nèi)容printf("%4d

%4d\n",a[i],i);}每一個(gè)數(shù)組元素都是一個(gè)獨(dú)立的存儲(chǔ)單元,相當(dāng)于變量當(dāng)大量數(shù)據(jù)需要存儲(chǔ)的時(shí)候,一般選擇數(shù)組存儲(chǔ),而不是定義大量的變量數(shù)組可以使原本無規(guī)律的數(shù)據(jù)變得有規(guī)律:1

3

5

7

9

111

4

2

10

5

8a[0]

a[1]

a[2]

a[3]

a[4]

a[5]4.3

數(shù)組應(yīng)用舉例—例4.1統(tǒng)計(jì)一班級(jí)學(xué)生某次考試的成績(jī)信息(班級(jí)人數(shù)從鍵盤輸入),得出該班級(jí)的平均成績(jī),以及高于平均分和低于平均分的人數(shù)及其比例1、問題分析平均分問題,實(shí)際是求和問題,統(tǒng)計(jì)高于平均分低于平均分的人數(shù),需要先計(jì)算平均值,在做比較統(tǒng)計(jì),因此需要存儲(chǔ)每個(gè)學(xué)生的成績(jī)值,每個(gè)學(xué)生的成績(jī)都需要一個(gè)存儲(chǔ)單元,N個(gè)學(xué)

生需要N個(gè)存儲(chǔ)單元2、算法算法設(shè)計(jì)輸入班級(jí)人數(shù)n輸入n個(gè)學(xué)生的成績(jī)并求和計(jì)算平均成績(jī)統(tǒng)計(jì)高于評(píng)價(jià)成績(jī)的人數(shù)輸出結(jié)果如何利用數(shù)組統(tǒng)計(jì)各分?jǐn)?shù)段人數(shù)???例子:數(shù)組中求最大值例在數(shù)組查找某一數(shù)據(jù)是否存在,并給出所在位置分析查找數(shù)據(jù)如果存在,則返回值為0~n-1,如果不存在則可以定義為-1查找過程用簡(jiǎn)單的窮舉法,從第一個(gè)到最后一個(gè)逐個(gè)比較例2:篩選法求100以內(nèi)的素?cái)?shù)思路:把2~100的所有整數(shù)都放入到對(duì)應(yīng)下標(biāo)的數(shù)組單元格中從2開始,下標(biāo)為2的單元格2是素?cái)?shù),把下標(biāo)2以后的所有單元格中,凡是能被2整除的數(shù)據(jù)都改為-1,表示不是素?cái)?shù)。接下去尋找下一個(gè)不是-1的數(shù)據(jù),同樣從該數(shù)的后面一個(gè)開始到最后一個(gè)單元格為止,判斷是否能被整除,如果整除則置為-1,直到最后一個(gè)數(shù)據(jù)為止。例子

統(tǒng)計(jì)輸入字符串中,各字母出現(xiàn)的次數(shù)例:食堂邀請(qǐng)了40個(gè)學(xué)生對(duì)工作進(jìn)行調(diào)查打分(1~5分),請(qǐng)統(tǒng)計(jì)調(diào)查結(jié)果假設(shè)分?jǐn)?shù)值都已經(jīng)給你,并存在數(shù)組s[40]中,請(qǐng)編程統(tǒng)計(jì)各個(gè)分?jǐn)?shù)的個(gè)數(shù)靜態(tài)數(shù)組static

int

a[10]10個(gè)元素每個(gè)元素都是靜態(tài)變量靜態(tài)數(shù)組每個(gè)元素自動(dòng)被初始化為0一維數(shù)組排序問題(選擇排序法一)927562975629756297560

1

2

3

4a1:2:3:4:29756一維數(shù)組排序問題(選擇排序法一)0

1

2

3

4297562795625976a1:2:3:25976一維數(shù)組排序問題(選擇排序法一)一維數(shù)組排序問題(選擇排序法二)例5.4

的改進(jìn)int

a[6]={1,5,2,7,9,6},p,i;k=0;for(i=1;i<n;i++)if(a[k]>a[i])k=i;printf(“%d\n”,a[k]);0

1

2

3

4

5a

1

5

2

7

9

6kii一維數(shù)組排序問題(選擇排序法)次數(shù)k初值i的范圍k最后值1:k=01~5k=02:k=12~5k=23:k=23~5k=14:k=34~5k=55:k=45~5k=30

1

2

3

4

5aa[k]<->a[i]152796一維數(shù)組排序問題(選擇排序法)k=0;for(i=1;i<n;i++)if(a[k]>a[i])

k=i;if(k!=0)

{t=a[0];a[0]=a[k];a[k]=t;}int

a[6]={1,5,2,7,9,6},p,i;1:k=1;for(i=2;i<n;i++)if(a[k]>a[i])

k=i;if(k!=1)

{t=a[1];a[1]=a[k];a[k]=t;}2:for(j=0;j<n;j++){k=j;for(i=j+1;i<n;i++)if(a[k]>a[i])k=i;if(k!=j){t=a[j];a[j]=a[k];a[k]=t;}}一維數(shù)組排序問題(冒泡排序法)0123492756297562795627596a1:2:3:4:27569一維數(shù)組排序問題(冒泡排序法)01234275692756925769a1:2:3:25679一維數(shù)組排序問題(冒泡排序法)數(shù)組常見操作(插入一元素)數(shù)組常見操作(刪除一個(gè)數(shù)據(jù))字符數(shù)組與字符串字符數(shù)組chara[10]={‘I’,’

’,’a’,’m’,’

’,’h’,’a’,’p’,’p’,’y’};字符串char b[]={”I

am

happy”};char c[]=“I

am

happy”;chard[]={‘I’,’

’,’a’,’m’,’

’,’h’,’a’,’p’,’p’,’y’,’\0’};字符數(shù)組的操作輸入用scanf(“%c”)或者getchar函數(shù)輸出用printf(“%c”)或者putchar函數(shù)和其他數(shù)據(jù)類型的輸入輸出沒有太大的區(qū)別例如main(){chara[10]={‘I’,’

’,’a’,’m’,’

’,’h’,’a’,’p’,’p’,’y’};int

i;for(i=0;i<10;i++)printf(“%c”,a[i]);}字符串的長(zhǎng)度問題C語言中\(zhòng)0表示字符串結(jié)束標(biāo)志char c[20]="I

am

happy";其中字符數(shù)組的長(zhǎng)度為20(數(shù)組20個(gè)元素)但是實(shí)際字符長(zhǎng)度為10,因?yàn)閏語言中計(jì)數(shù)到第一個(gè)\0就結(jié)束C語言中用strlen()函數(shù)來求字符串的長(zhǎng)度比如上例printf("%d",strlen(c));結(jié)果為10而非20字符數(shù)組和字符串共同點(diǎn):都是用字符型數(shù)組存儲(chǔ)數(shù)據(jù)字符數(shù)組和字符串的關(guān)鍵區(qū)別在于:字符數(shù)組中是否存在’\0’——字符串結(jié)束標(biāo)志。如果數(shù)組中無’\0’,則該數(shù)組只是普通字符數(shù)組,只能按照數(shù)組的一般操作進(jìn)行處理如果數(shù)組中有’\0’存在,則符合字符串定義,那么,既可以用普通數(shù)組處理方式操作,也可以采用字符串的方式操作所以,問題的關(guān)鍵是第一步,判斷字符數(shù)組是否是字符串注:在字符數(shù)組初始化時(shí),可能隱含了’\0’例如:char

ch[10]={‘a(chǎn)’,’b’};

ch就符合字符串定義了,默認(rèn)空的單元格都是’\0’字符數(shù)組的輸入輸出定義字符數(shù)組char

a[10];逐個(gè)字符的輸入輸出for(i=0;i<10;i++)scanf("%c",&a[i]);……for(i=0;i<10;i++)printf("%c",

a[i]);字符數(shù)組的輸入輸出定義字符數(shù)組char

a[10];整個(gè)字符串的一次性輸入輸出//一次性輸入scanf("%s",a);//一次性輸出

printf("%s",a);怎么不加&,這里就是不加,a表示指向整個(gè)數(shù)組的起始地址字符數(shù)組的輸入輸出gets(a);//一次性輸出

puts(a);定義字符數(shù)組char

a[10];另一種整個(gè)字符串的一次性輸入輸出//一次性輸入用scanf(“%s”,a)時(shí)字符串中間不能有空格,空格表示字符串之間的間隔,

gets(a)表示整一行,到回車之前的所有字符輸出后會(huì)多個(gè)換行可見實(shí)驗(yàn)教程P76例題例子4.8

先輸入一個(gè)字符串,然后統(tǒng)計(jì)各字母出現(xiàn)的次數(shù)問題分析與例4.2不同的地方,例4.2是輸入一個(gè)處理一個(gè),而本例則是先輸入整個(gè)字符串到字符串?dāng)?shù)組中,而后統(tǒng)一處理。ABC……YZnum[0]num[1]num[2]……num[24]num[25]#include

"stdio.h"#include

"string.h"main(){char

a[50];//定義足夠長(zhǎng)

char

num[26]={0};inti;printf("請(qǐng)輸入一個(gè)由小寫字母組成的字符串\n");//輸入字符串

gets(a);//統(tǒng)計(jì)小寫字母出現(xiàn)次數(shù)

for(i=0;i<strlen(a);i++){if(a[i]>='a'

&&a[i]<='z')num[a[i]-'a']++;}//輸出結(jié)果

for(i=0;i<26;i++){printf("%c

->

%d\t",'a'+i,num[i]);}}字符串處理函數(shù)(1)strcat(字符串1,字符串2)作用:連接兩個(gè)字符串,把字符串2接到字符串1后面,結(jié)果放在字符串1中注意:“字符串1”必須寫成數(shù)組名形式字符數(shù)組1必須足夠大,以便容納連接后的新字符串。連接前兩個(gè)字符串的后面都有一個(gè)'\0',連接時(shí)將字符串1后面的'\0'取消,只在新串結(jié)束后保留一個(gè)'\0'字符串處理函數(shù)(2)例4.9字符串處理函數(shù)(3)strcpy(字符串1,字符串2)作用:復(fù)制字符串2中字符到字符串1中去注意:“字符串1”必須寫成數(shù)組名形式字符數(shù)組1必須足夠大,不應(yīng)小于字符串2的長(zhǎng)度?!白址?”可以是字符數(shù)組名,也可以是字符串常量復(fù)制時(shí)連同字符串后面的'\0'也一起復(fù)制到字符數(shù)組1中不能用賦值語句將一個(gè)字符串常量或字符數(shù)組直接給一個(gè)字符數(shù)組字符串處理函數(shù)(4)例4.10字符串處理函數(shù)(5)strcmp(字符串1,字符串2)作用:比較字符串1和字符串2規(guī)則:逐字符比較對(duì)應(yīng)字符的ASCII碼值,直到遇到不同字符或遇到'\0'為止若全部字符相同,則兩個(gè)字符串相等,返回0若出現(xiàn)不相同字符,則以第一個(gè)不相同字符的比較結(jié)果為準(zhǔn),返回不相同字符的ASCII碼差值注意:值差字符串處理函數(shù)(6)例4.11字符串處理函數(shù)(7)strlen(字符串)作用:測(cè)試字符串實(shí)際長(zhǎng)度(不包括'\0')strlwr(字符串)作用:將字符串中大寫字母轉(zhuǎn)換成小寫字母strupr(字符串)作用:將字符串中小寫字母轉(zhuǎn)換成為大寫字母字符串處理函數(shù)(8)例4.12第一講C語言程序設(shè)計(jì)(二)4.5

二維數(shù)組的聲明聲明方式:例如:float a

[3][4],

b[5][10];數(shù)組元素排放順序:二維數(shù)組可以看作是一種特殊的一維數(shù)組按行存放每行元素可看成為一維數(shù)組a

a[0]

……a[1]

……a[2]

……a00a01a02a03a10a11a12a13a20a21a22a23二維數(shù)組元素的初始化分行賦值:例如int

a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};例如int

a[

][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};平展賦值(全部賦值,可缺省第一維長(zhǎng)度)例如int

a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};例如int

a[

][4]={1,2,3,4,5,6,7,8,9,10,11,12};部分元素顯式賦值例如int

a[3][4]={{1},{5},{9}};其余自動(dòng)賦為0例如int

a[

][4]={{1},{5},{9}};其余自動(dòng)賦為0二維數(shù)組應(yīng)用一維數(shù)組通常用來存儲(chǔ)一組數(shù)據(jù)(一行)二維數(shù)組通常用來存儲(chǔ)多組數(shù)據(jù)(多行),比如多門成績(jī),游戲中的二維平面地圖(如貪吃蛇、俄羅斯方塊等)二維數(shù)組的輸出#include"stdio.h"main(){inta[][3]={1,2,3,4,5,6};inti,j;for(i=0;i<2;i++) //第i行{

for(j=0;j<3;j++)

//每一行中的第j列printf("%5d",a[i][j]);printf("\n");}}例4.13

求轉(zhuǎn)置矩陣642 3

5a

=

1

3

6

2 5

1 4

b

=例4.14尋

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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)論