C語言第7章數(shù)組_第1頁
C語言第7章數(shù)組_第2頁
C語言第7章數(shù)組_第3頁
C語言第7章數(shù)組_第4頁
C語言第7章數(shù)組_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第七章數(shù)組數(shù)組的基本概念一維數(shù)組的定義和引用二維數(shù)組的定義和引用字符數(shù)組本章內(nèi)容2

3

1.數(shù)組的基本概念

在前面幾章中,所介紹的數(shù)據(jù)類型為基本類型(整、實(shí)、字符),基本類型的數(shù)據(jù)已是最小數(shù)據(jù)單位。C語言還提供了以這些基本類型為基礎(chǔ),按層次方法構(gòu)造起來的構(gòu)造類型(數(shù)組、結(jié)構(gòu)體、共同體)。其中數(shù)組:同一種(基本)類型按一定順序組合在一起的數(shù)據(jù)類型。1.數(shù)組的基本概念數(shù)組的特點(diǎn):數(shù)組是同類型下標(biāo)變量的有序集合。數(shù)組中的每個(gè)成員稱為元素,數(shù)組元素如同基本變量一樣地使用。

各元素按順序排列,元素在數(shù)組中的位置由下標(biāo)確定,數(shù)組是通過下標(biāo)去訪問各元素的。下標(biāo)必須是正整數(shù)、0、整型表達(dá)式,下標(biāo)的個(gè)數(shù)被稱為維數(shù)。4

5

2.一維數(shù)組a[0]0145a[1]a[2]a[3]a[4]a[5]23a合法標(biāo)識(shí)符表示元素個(gè)數(shù)下標(biāo)從0開始編譯時(shí)分配連續(xù)內(nèi)存內(nèi)存字節(jié)數(shù)=數(shù)組元素個(gè)數(shù)*

sizeof(元素?cái)?shù)據(jù)類型)數(shù)組名表示內(nèi)存首地址,是地址常量例

inta[6];類型說明符

數(shù)組名[常量表達(dá)式];int

a[6]

;

charc[5];[]:數(shù)組運(yùn)算符單目運(yùn)算符優(yōu)先級(jí)(1)左結(jié)合不能用()注意:數(shù)組定義中的下標(biāo),表示元素的個(gè)數(shù)(數(shù)組的長度),不能是變量,下標(biāo)編號(hào)是從0開始的。編譯不檢查數(shù)組的邊界是否超界,在上例中若使用

a[6],c[5]是錯(cuò)誤的。定義:

2.一維數(shù)組說明:

數(shù)組不初始化,其元素值為隨機(jī)數(shù)對static數(shù)組元素不賦初值,系統(tǒng)會(huì)自動(dòng)賦以0值只給部分?jǐn)?shù)組元素賦初值當(dāng)全部數(shù)組元素賦初值時(shí),可不指定數(shù)組長度在定義數(shù)組時(shí),為數(shù)組元素賦初值(在編譯階段使之得到初值)inta[5]={1,2,3,4,5};等價(jià)于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;如inta[5]={6,2,3};

等價(jià)于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};

()一維數(shù)組的初始化:

6

2.一維數(shù)組象使用變量那樣,先定義后使用引用方式:數(shù)組名[下標(biāo)]代表了一個(gè)元素,等價(jià)一個(gè)同類型的變量例如:a[0]5+a[1]6為正確的算術(shù)表達(dá)式一般地,一維數(shù)組各元素分配在連續(xù)地內(nèi)存單元之中,只能逐個(gè)引用數(shù)組元素,不能一次引用整個(gè)數(shù)組一維數(shù)組的引用:

7

例inta[10];printf(“%d”,a);()必須

for(j=0;j<10;j++)printf(“%d\t”,a[j]);()【例1】讀程序?qū)懡Y(jié)果#include<stdio.h>voidmain(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf("%d",a[i]);printf("\n");}

數(shù)組元素的下標(biāo)常用循環(huán)變量來控制98765432102.一維數(shù)組一維數(shù)組的程序舉例:

8

用循環(huán)語句:s=0;for(n=1;n<=30;n++){scanf(“%d”,&x);

s=s+x;

}printf(“%f”,s/30);

用數(shù)組:s=0;for(n=1;n<=30;n++){scanf(“%d”,&x[n]

)s+=x[n];}printf(“%f”,s/30);

【例2】求平均分9

2.一維數(shù)組【例3】用數(shù)組求Fibonacci數(shù)列問題。f[i]=f[i–2]+f[i–1];i=2~20F1=1,F2=1Fn=Fn–1+Fn–2(n>2)main(){inti;staticintf[20]={1,1};for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i<20;i++){if(i%5==0)printf("\n");printf("%12d",f[i]);}}main(){longintf1,f2;inti;f1=1;f2=1;for(i=1;i<=20;i++){printf("%12ld%12ld",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+f1;}}

10

2.一維數(shù)組【例4】在一批數(shù)中求最大數(shù)和最小數(shù),并將最大數(shù)與最小數(shù)互換位置。

由于后一個(gè)問題中涉及位置,故用數(shù)組來存數(shù)。1、輸入:for循環(huán)輸入6個(gè)整數(shù)

2、給變量min,max賦初值max=min=a[0];3、依次用a[i]和max,min比較(循環(huán))若max≤a[i],令max=a[i],記錄大數(shù)的位置k=i;若min≥a[i],令min=a[i],記錄小數(shù)的位置j=i;4、遍歷后,將max與min互換a[k]=min;a[j]=max;5、輸出:for循環(huán)輸出互換位置的6個(gè)整數(shù)。算法:11

2.一維數(shù)組voidmain(){inti,a[6],max,min,k=0,j=0;for(i=0;i<=5;i++)scanf("%d",&a[i]);max=min=a[0];for(i=1;i<=5;i++){if(max<=a[i]){max=a[i];k=i;}if(min>=a[i]){min=a[i];j=i;}}printf("max=%dmin=%d\n",max,min);

a[k]=min;a[j]=max;for(i=0;i<=5;i++)printf("%d",a[i]);}運(yùn)行過程:輸入:132957↙輸出:max=9min=193215712

2.一維數(shù)組for(i=2;i<=5;i++){if(max<a[i]){max=a[i];k=i;}

if(min>a[i]){min=a[i];j=i;}}?

for(i=2;i<=5;i++){if(max<a[i]){max=a[i];k=i;}

else

{min=a[i];j=i;}}

13

2.一維數(shù)組【例5】將任意5個(gè)數(shù)從小→大排序。分析:a[0],a[1],a[2],a[3],a[4]

排序過程:(相鄰元素二二比較)(1)比較第一個(gè)數(shù)與第二個(gè)數(shù),若為逆序a[0]>a[1],則交換;然后比較第二個(gè)數(shù)與第三個(gè)數(shù);依次類推,直至第n-1個(gè)數(shù)和第n個(gè)數(shù)比較為止——第一趟冒泡排序,結(jié)果最大的數(shù)被安置在最后一個(gè)元素位置上(2)對前n-1個(gè)數(shù)進(jìn)行第二趟冒泡排序,結(jié)果使次大的數(shù)被安置在第n-1個(gè)元素位置(3)重復(fù)上述過程,共經(jīng)過n-1趟冒泡排序后,排序結(jié)束冒泡排序法14

2.一維數(shù)組冒泡排序法:voidmain(){inti,j,t,k,a[5]={24,67,-2,-23,78};

for(i=0;i<4;i++)

for(j=0;j<4-i;j++)

if(a[j]>a[j+1])

{t=a[j];a[j]=a[j+1];a[j+1]=t;}

for(i=0;i<5;i++)printf("%d",a[i]);}運(yùn)行結(jié)果:-23-2246778外循環(huán)控制比較的趟數(shù)n-1內(nèi)循環(huán)控制每趟比較的次數(shù)

15

2.一維數(shù)組排序過程:將a[0]與a[1]-a[4]分別比較,將最小值存入a[0],將a[1]→a[2]-a[4]分別比較,將當(dāng)前最小值存入a[1],

將a[2]→a[3]-a[4]分別比較,將當(dāng)前最小值存入a[2],將a[3]→a[4]比較,將當(dāng)前最小值存入a[3]。選擇排序法16

2.一維數(shù)組選擇排序法:voidmain(){inti,j,t,k,a[5]={24,67,-2,-23,78};

for(i=0;i<4;i++){k=i;for(j=k+1;j<5;j++)

if(a[k]>a[j])k=j;

t=a[i];a[i]=a[k];a[k]=t;}for(i=0;i<5;i++)printf("%d",a[i]);}運(yùn)行結(jié)果:-23-224677817

2.一維數(shù)組【例6】有一個(gè)從小到大已排好序的數(shù)組,現(xiàn)插入一個(gè)數(shù),使數(shù)組仍有序。分析:

解決上述問題可采用重排序和插入算法。重排序:將數(shù)據(jù)插入數(shù)組尾部,將數(shù)組重新排序。插入:前插和后插。僅移動(dòng)部分?jǐn)?shù)據(jù),效率高,多采用。18

2.一維數(shù)組1.給a數(shù)組輸入一組有序數(shù),給x賦值。4.a(chǎn)[i]=x,輸出a數(shù)組。2.查找插入點(diǎn):

若x>尾元素,插在隊(duì)尾之后。否則將數(shù)組中各元素逐一與x比較,一旦

x<=a[i](即找到插入點(diǎn)i)就跳出循環(huán)。前插算法:3.將a[i]及其之后的元素向后平移一位,以便騰出

a[i]插入x。19

2.一維數(shù)組查找位置向后平移,騰出i位置插入數(shù)據(jù)voidmain(){intx,i,j,a[5]={2,5,8,10};scanf("%d",&x);

if(x>a[3])i=4;

else

{for(i=0;i<5;i++)

if(x<=a[i])break;for(j=3;j>=i;j--)a[j+1]=a[j];}a[i]=x;for(j=0;j<5;j++)printf("%d",a[j]);}運(yùn)行過程:輸入:7↙輸出:25781020

2.一維數(shù)組1.給a數(shù)組輸入一組有序數(shù),給x賦值。3.后插x:a[i+1]=x;

輸出a數(shù)組。2.反向遍歷數(shù)組:

若x>某元素,跳出(找到插入點(diǎn))。否則將當(dāng)前元素向后平移(騰位置)。后插算法:for(i=3;i>=0;i--){

if(x>a[i])break;

elsea[i+1]=a[i];

}21

2.一維數(shù)組voidmain(){intx,i,a[5]={1,5,9,14};scanf("%d",&x);for(i=3;i>=0;i--){if(x>a[i])break;

//找到插入點(diǎn),跳出

elsea[i+1]=a[i];

//否則,向后平移}a[i+1]=x;for(i=0;i<5;i++)printf("%d",a[i]);}運(yùn)行過程:輸入:6↙輸出:15691422

3.二維數(shù)組

主要用來處理具有行列結(jié)構(gòu)的數(shù)據(jù)(矩陣)類型說明符數(shù)組名[常量表達(dá)式][常量表達(dá)式]inta[3][4];floatx[5][8];因?yàn)橛袃蓚€(gè)下標(biāo),故稱為二維數(shù)組。(下標(biāo)的個(gè)數(shù)被稱為維數(shù))此下標(biāo)指示行此下標(biāo)指示列

定義a為3×4(3行4列)的整型數(shù)組定義x為5×8(5行8列)的實(shí)型數(shù)組注意不能寫成

inta[3,4];floatx[5,8];定義:作用:23

3.二維數(shù)組

成績單學(xué)號(hào)數(shù)學(xué)英語c語言平均分

198808627869903567880在這批數(shù)中,每個(gè)數(shù)具有固定的位置這批數(shù)須用二維數(shù)組來處理。

例如:

inta[3][4]a[0][0]a[0][1]a[0][2]a[0][3]1988086

a[1][0]a[1][1]a[1][2]a[1][3]2786990a[2][0]a[2][1]a[2][2]a[2][3]35678803.二維數(shù)組

特點(diǎn):

按行存放可將二維數(shù)組看成是特殊的一維數(shù)組,它的每個(gè)元素又是一個(gè)一維數(shù)組例如inta[3][4];表示:一個(gè)二維數(shù)組,共存放3*4=12個(gè)整數(shù)可將a數(shù)組看作是一個(gè)一維數(shù)組,它有3個(gè)元素:a[0],a[1],a[2],每個(gè)元素又是一個(gè)包含4個(gè)元素的一維數(shù)組24

014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]3.二維數(shù)組

二維數(shù)組的引用引用方式:數(shù)組名[下標(biāo)][下標(biāo)]其中的下標(biāo)為整型表達(dá)式,但不得越界與一維數(shù)組元素一樣,二維數(shù)組元素相當(dāng)于同類型的簡單變量注意下標(biāo)的最大取值,即要注意數(shù)組定義和數(shù)組元素引用的區(qū)別例如定義inta[3][4];下標(biāo)下限值是a[0][0]下標(biāo)上限值是a[2][3]25

3.二維數(shù)組

二維數(shù)組的初始化按行給二維數(shù)組賦全值inta[3][4]={{1,2,3,4},

{5,6,7,8},{9,10,11,12}};或:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};staticb[2][3];b[2][4]={0};所有的元素被賦值0。26

3.二維數(shù)組可以對部分元素賦初值,但需表達(dá)清楚。例如:inta[3][4]={{1,2},{3},{8}}

則相當(dāng)于1200

30008000若:inta[3][4]={1,2,3,8}

則相當(dāng)于12380000

0000

27

3.二維數(shù)組在程序中對二維數(shù)組訪問,一般要利用雙循環(huán)。例如:for(j=0;j<3;j++)

for(k=0;k<4;k++)scanf(“%d”,&a[j][k]);

a[3][2]=20;例如:a[i][j]=10;printf(“%d”,a[i][j]);28

3.二維數(shù)組二維數(shù)組的程序舉例:

29

【例7】將一個(gè)二維數(shù)組行和列元素互換,存到另一個(gè)二維數(shù)組中。a=123456b=142536①

a數(shù)組初始化(或賦值)并輸出②用二重循環(huán)進(jìn)行轉(zhuǎn)置b[j][i]=a[i][j]③輸出b數(shù)組算法如下:數(shù)組元素?cái)?shù)據(jù)的輸入必須以循環(huán)方式進(jìn)行或者定義時(shí)置初值二維數(shù)組一般用二重循環(huán)30

3.二維數(shù)組main(){staticinta[2][3]={{1,2,3},{4,5,6}};staticintb[3][2],i,j;printf("arraya:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];}printf("\n");}printf("arrayb:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);printf("\n");}}運(yùn)行結(jié)果:arraya:123456arrayb:14253631

3.二維數(shù)組【例8】有一個(gè)3×4的矩陣,要求編程序求出其中值最大的那個(gè)元素的值,以及所在的行號(hào)和列號(hào)。先用N-S流程圖表示算法max=a[0][0]fori=0to2forj=0to3a[i][j]>maxmax=a[i][j]row=icolum=j輸出:max和row,colum真假32

3.二維數(shù)組main(){inti,j,row=0,colum=0,max;staticinta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}max=a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)if(a[i][j]>max){max=a[i][j];row=i;colum=j;}printf("max=%d,row=%d,colum=%d\n",max,row,colum);}運(yùn)行結(jié)果:max=10,row=2,colum=1小測驗(yàn)【題1】以下能對一維數(shù)組a所有元素正確初始化的語句是:

A)inta[20]={1,2,3,4,5};

B)

inta[30]={};C)inta[]={1};

D)

a[20]={10};【題2】以下數(shù)組定義錯(cuò)誤的是:

A)inta[2][3];B)

intb[][3]={0,1,2,3};C)intc[100][100]={0};

D)

d[2][]={{1,2},{1,2,3}};【例3】下面程序的輸出結(jié)果是:main(){staticinta[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;for(i=0;i<3;i++)for(j=0;j<=i;j++)s+=a[i][j];printf(“%d\n”,s);}A)18B)19C)20D)21√√√33

4.字符數(shù)組

定義:34

存放字符數(shù)據(jù)。字符串–––用字符數(shù)組存放。類型名數(shù)組名大小

charc[10];

字符型和整型可以相互通用。初始化:直接給出字符串中的各字符例如staticchara[4]={'G','o','o','d'};若字符多于元素個(gè)數(shù),則語法錯(cuò),反之,后面補(bǔ)"\0"4.字符數(shù)組可以去掉定義時(shí)的大小設(shè)置,而通過自動(dòng)賦值決定長度(大小)例如staticcharx[]={'I','','a','m','','a','','s','t','u','d','e','n','t'};前面說過,字符串常量用“”表示,且由‘\0’結(jié)尾例如staticcharx[]={"Iamastudent."};則長度為15+1=16,其中x[15]存放‘\0’,其中{}

亦可省略引用:每一個(gè)字符數(shù)組元素相當(dāng)于一個(gè)字符變量35

4.字符數(shù)組字符串:用“字符串”賦初值時(shí),長度=字符個(gè)數(shù)+1,以便編譯自動(dòng)在串尾后加結(jié)束符\0;賦初值時(shí),若未指定長度,以實(shí)際錄入的字符個(gè)數(shù)為準(zhǔn)定義字符串類型時(shí),長度不能省略例如charstr[]字符個(gè)數(shù)>數(shù)組長度,出錯(cuò)。字符個(gè)數(shù)<數(shù)組長度,多余的元素被自動(dòng)賦值\0例如charcity[5]=“Beijing”;36

4.字符數(shù)組字符數(shù)組的訪問:對字符數(shù)組的訪問可采用兩種格式符:格式符:

%c–––逐個(gè)輸入/輸出字符

%s–––整個(gè)串一次輸入/輸出輸出(用%s)用%s輸出時(shí),不輸出‘\0’在printf中須直接寫數(shù)組名

staticcharc[]={"Iamastudent"};printf("%s",c);若數(shù)組長度大于字符串長度,則遇到‘\0’即停止輸出

staticcharc[10]="china";printf("%s",c);輸出時(shí)遇到第一個(gè)‘\0’即結(jié)束37

4.字符數(shù)組輸入(用%s)輸入字符串時(shí),系統(tǒng)自動(dòng)加上‘\0’輸入多個(gè)字符串,可用空格隔開

scanf中須用地址量,數(shù)組名表示地址量38

staticcharstr1[5],str2[5],str3[5];scanf("%s%s%s",str1,str2,str3);則:輸入Howareyou?str1:How\0str2:are\0str3:you?\0但若:staticcharstr[13]scanf("%s",str);輸入:Howareyou?則只會(huì)將How輸入,且存為str:How\0……

4.字符數(shù)組【例9】輸入一個(gè)字符串并存放至字符數(shù)組,統(tǒng)計(jì)字符串中共有多少個(gè)數(shù)字和其他字符。main(){

charch[100];inti=0,number=0,other=0;scanf("%s",ch);while(ch[i]!='\0'){if(ch[i]>='0'&&ch[i]<='9')

number++;else

other++;

i++;}printf("\nnumber=%d,other=%d",number,other);}運(yùn)行過程:輸入:6,e,5;m?3#↙

輸出:number=3,other=739

4.字符數(shù)組字符串處理函數(shù):

40

gets(字符數(shù)組名):從鍵盤輸入一個(gè)字符串(以回車結(jié)束

)放到數(shù)組中,并且得到一個(gè)函數(shù)值,該函數(shù)值是字符數(shù)組的起始地址。如:gets(str)

puts(字符數(shù)組名/字符串):

將數(shù)組中的字符串(以’\0’結(jié)束的字符序列)輸出到終端上,輸完換行。

即puts(str)與printf(“%s\n”,str)等價(jià)或puts(“ok!”);與printf(“%s\n”,“ok!”)

或printf(“ok!\n”)等價(jià)4.字符數(shù)組

41

strcat(字符數(shù)組1,字符數(shù)組2)

連接兩個(gè)字符數(shù)組中的字符串,把字符串2接到字符串1后面,結(jié)果放在字符數(shù)組1中。strcpy(字符數(shù)組1,字符串2)

將字符串2復(fù)制到字符數(shù)組1中去。注意:①字符數(shù)組1的長度≥字符串2的長度②拷貝時(shí)連同’\0’一起拷貝③不能把字符串或字符數(shù)組直接賦給一個(gè)字符數(shù)組如:charstr[6];

str=“China”;

str[0]=“C”;str[1]=“h”;

strcpy(str,“China”);4.字符數(shù)組

42

strcmy(字符串1,字符串2)

比較兩個(gè)字符串:如:

字符串1>字符串2時(shí),正數(shù)x=strcmy(“abc”,“ABC”);

字符串1=字符串2時(shí),0x=strcmy(“AX”,“AX”);字符串1<字符串2時(shí),負(fù)數(shù)x=strcmy(“1000”,“2”);

※兩個(gè)字符串比較不能用下面形式

str1==str2或str1<str2或str1>str2

只能用strcmy(str1,str2)==0或<0或>0來判斷strlen(字符數(shù)組)

測試字符串長度(不含‘\0’)如:strlen(“China”)值為5字符串的比較、拷貝、連接都必須用函數(shù)4.字符數(shù)組

43

strlwr(字符串)將字符串中大寫字母轉(zhuǎn)換成小寫字母strupr(字符串)將字符串中小寫字母轉(zhuǎn)換成大寫字母4.字符數(shù)組

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論