二維數(shù)組與多維數(shù)組_第1頁
二維數(shù)組與多維數(shù)組_第2頁
二維數(shù)組與多維數(shù)組_第3頁
二維數(shù)組與多維數(shù)組_第4頁
二維數(shù)組與多維數(shù)組_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

二維數(shù)組與多維數(shù)組C語言程序設(shè)計(jì)1.1二維數(shù)組的聲明

二維數(shù)組說明的一般形式是:

類型符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]…;其中常量表達(dá)式1表示第一維下標(biāo)的長度,常量表達(dá)式2表示第二維下標(biāo)的長度。例如:inta[3][4];

定義了一個(gè)3行4列的數(shù)組,數(shù)組名為a,其下標(biāo)變量的類型為整型。該數(shù)組的下標(biāo)變量共有3×4個(gè),即:

a[0][0],a[0][1],a[0][2],a[0][3]a[1][0],a[1][1],a[1][2],a[1][3]a[2][0],a[2][1],a[2][2],a[2][3]

二維數(shù)組與多維數(shù)組

從C語言二維數(shù)組的定義可以看出,一個(gè)二維數(shù)組也可以分解為多個(gè)一維數(shù)組。C語言允許這種分解有二維數(shù)組a[3][4],可分解為三個(gè)一維數(shù)組,其數(shù)組名分別為a[0],a[1],a[2]。對這三個(gè)一維數(shù)組不需另作說明即可使用。這三個(gè)一維數(shù)組都有4個(gè)元素,例如:一維數(shù)組a[0]的元素為a[0][0],a[0][1],a[0][2],a[0][3]。即:a[0][0],a[0][1],a[0][2],a[0][3]

a[1][0],a[1][1],a[1][2],a[1][3]

a[2][0],a[2][1],a[2][2],a[2][3]1.1二維數(shù)組的聲明

注意:二維數(shù)組是按行排列的。即放完一行之后順次放入第二行。2維數(shù)組在內(nèi)在中占一片連續(xù)存儲空間,二維數(shù)組a在內(nèi)在的映像如右圖所示(假設(shè)第一個(gè)元素的地址是0x2000)。1.1二維數(shù)組的聲明

二維數(shù)組的元素的引用形式為:

數(shù)組名[下標(biāo)][下標(biāo)]

其中下標(biāo)應(yīng)為整型常量或整型表達(dá)式。例如:a[3][4]表示a數(shù)組三行四列的元素。

注意:

下標(biāo)元素與數(shù)組定義的區(qū)別例如:inta[3][4];a[2][3]=10;a[1][2]=2*a[2][3]1.2二維數(shù)組元素的引用

例5-6

設(shè)有一個(gè)學(xué)習(xí)小組有5個(gè)人,每個(gè)人有三門課的考試成績。求每人的平均成績。學(xué)號

MathEnglishCNO1807592NO2616571NO3596370NO4858790NO5769785

編程分析:可使用一個(gè)二維數(shù)組a[5][3]存放5個(gè)人3門課的成績。再設(shè)一個(gè)一維數(shù)組aver[5]存放所求得每個(gè)學(xué)生的平均成績,實(shí)現(xiàn)的程代碼如下:

二維數(shù)組與多維數(shù)組voidmain(){inti,j,sum,a[5][3],aver[5];printf("inputscore\n");for(i=0;i<5;i++)/*i代表學(xué)生序號

*/{sum=0;/*總成績賦初值0*/

for(j=0;j<3;j++)/*j代表課程代號

*/{scanf("%d",&a[i][j]);/*輸入第i號學(xué)生第j門課程的成績

*/sum=sum+a[i][j];/*累加求總成績

*/}

aver[i]=sum/3;/*求第i個(gè)學(xué)生的平均成績

*/}printf("NO.mathEnglishCAver\n");/*輸入標(biāo)題行

*/for(i=0;i<5;i++)/*輸出計(jì)算結(jié)果

*/{printf("NO%d.",i);/*輸出學(xué)號

*/for(j=0;j<3;j++)/*輸出各科成績

*/printf("%5d",a[i][j]);printf("%5d\n",aver[i]);/*輸出平均成績

*/}}

例4-5

一個(gè)學(xué)習(xí)小組有5個(gè)人,每個(gè)人有三門課的考試成績。求每人的平均成績。程序的運(yùn)行結(jié)果如下:思考與討論:

1)代表每個(gè)學(xué)生總成績的變量sum的賦初值為什么要放到外循環(huán)內(nèi)?如果將該語句移到外循環(huán)以外,程序輸出結(jié)果如何?

2)如果不使用一維數(shù)組aver,只用一個(gè)二維數(shù)組來處理本問題,將每位學(xué)生的平均成績存放在二維數(shù)組的第4列,即數(shù)組a的定義為“inta[5][4];”,上面的程序?qū)⑷绾涡薷模?.3二維數(shù)組的初始化二維數(shù)組初始化也是在類型說明時(shí)給各下標(biāo)變量賦以初值。二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。

1.按行分段賦值可寫為

int[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};

2.按行連續(xù)賦值可寫為

inta[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

這兩種賦初值的結(jié)果是完全相同的。

二維數(shù)組與多維數(shù)組將例5-6的數(shù)據(jù)輸入使用初始化方法實(shí)現(xiàn)main(){inti,j,sum,a[5][3],aver[5];inta[5][3]={{80,75,92},{61,65,71},{59,63,70}, {85,87,90},{76,77,85}};for(i=0;i<5;i++){sum=0;/*sum代表某個(gè)學(xué)生的總成績*/for(j=0;j<3;j++) sum=sum+a[i][j];}aver[i]=sum/3;}

………

……….1.3二維數(shù)組的初始化二、維數(shù)組初始化賦值說明:

1.可以只對部分元素賦初值,未賦初值的元素自動(dòng)取0值。例如:inta[3][3]={{1},{2},{3}};是對每一行的第一列元素賦值,未賦值的元素取0值。1002003001000200032.如對全部元素賦初值,則第一維的長度可以不給出。例如:inta[3][3]={1,2,3,4,5,6,7,8,9};可以寫為:

inta[][3]={1,2,3,4,5,6,7,8,9};而:inta[3][3]={{0,1},{0,2,0},{0,0,3}};

賦值后的元素如右圖

二維數(shù)組的定義和引用二維數(shù)組的操作一般需要使用二重循環(huán)。1.給二維數(shù)組a輸入數(shù)據(jù)設(shè)所有變量及數(shù)組己定義,其程序段如下:

for(i=0;i<N;i++)for(j=0;j<M;j++)scanf(“%d”,&a[i][j]);2.求最大元素及其所在的行和列1.4二維數(shù)組的基本操作

編程基本思路與在一維數(shù)組求最大值元素相同,用變量max存放最大值,row,column存放最大值所在行列號。

例5-7輸出下面二維數(shù)組中的最在元素及其下標(biāo)。main(){inti,j,row=0,colum=0,max;inta[3][4]={{12,23,3,5},{45,32,56,6},{9,16,34,21}};max=a[0][0];for(i=0;i<3;i++)for(j=0;j<4;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);}1.4二維數(shù)組的基本操作3.計(jì)算兩矩陣相乘設(shè)有矩陣A有M*L個(gè)元素,矩陣B有L*N個(gè)元素,則矩陣C=A*B有M*N個(gè)元素。矩陣C中任一元素:

1.4二維數(shù)組的基本操作(i=1,2,…,m;j=1,2,…,n)例5-8求下面兩矩陣的乘積矩陣

1.4二維數(shù)組的基本操作#defineM2#defineN3#defineP3voidmain(){inti,j,k,c[M][N];inta[M][P]={{1,5,6},{3,2,8}};intb[P][N]={{1,2,3},{4,5,6},{7,8,9}};for(i=0;i<M;i++)for(j=0;j<N;j++)

{c[i][j]=0;for(k=0;k<P;k++)c[i][j]=c[i][j]+a[i][k]*b[k][j];}for(i=0;i<M;i++)/*打印輸出相乘所得的矩陣C*/{for(j=0;j<N;j++)printf("%d",c[i][j]);printf("\n");/*換行

*/}}

1.4二維數(shù)組的基本操作4.矩陣的轉(zhuǎn)置

如果是方陣,即a是M*M的二維數(shù)組,則可以不必定義另一數(shù)組,否則就需要再定義新數(shù)組。方陣的轉(zhuǎn)置以對角線為基準(zhǔn),對應(yīng)元素交換,下面2段的程序代碼都能實(shí)現(xiàn)方陣的轉(zhuǎn)置。for(i=1;i<N;i++)for(j=0;j<i;j++){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}for(i=0;i<N;i++)for(j=i+1;j<N;j++){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}1.4二維數(shù)組的基本操作例5-9

將下面矩陣的轉(zhuǎn)置存放,并打印輸出#defineN3voidmain(){inti,j,t;inta[N][N]={{1,4,7},{2,5,8},{3,6,9}};

for(i=0;i<N;i++)for(j=i+1;j<N;j++){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}for(i=0;i<N;i++)/*打印輸出轉(zhuǎn)置后的矩陣

*/{for(j=0;j<N;j++)printf("%d",a[i][j]);printf("\n");/*換行

*/}}

如果不是方陣,則要定義另一個(gè)數(shù)組。設(shè)a是M*N的矩陣,要重新定義一個(gè)N*M的二級數(shù)組b算法:b[j][i]=a[i][j]1.4二維數(shù)組的基本操作for(i=0;i<M;i++)for(j=0;j<N;j++)b[j][i]=a[i][j];1.5二維數(shù)組應(yīng)用舉例

例5-10

設(shè)某一個(gè)班共有30個(gè)學(xué)生,期末考試5門課程,請編一程序評定學(xué)生的獎(jiǎng)學(xué)金,要求打印輸出一、二等獎(jiǎng)學(xué)金學(xué)生的學(xué)號和各門課成績。(獎(jiǎng)學(xué)金評定標(biāo)準(zhǔn)是:總成績超過全班總平成績20%發(fā)給一個(gè)獎(jiǎng)學(xué)金,超過全班總平成績10%發(fā)給二個(gè)獎(jiǎng)學(xué)金。)

編程分析:本題定義一個(gè)二維數(shù)組x來存放學(xué)生的各科目成績和他的總成績(用是后1列),為便于程序維護(hù),分別定義存放學(xué)生人數(shù)和課程數(shù)目的NUM和KCN符號常量。#include<stdio.h>#defineNUM30/*學(xué)生人數(shù)的符號常量

*/#defineKCN5/*課程數(shù)目的符號常量

*/voidmain(){inti,j,k;floatx[NUM][KCN+1];/*存放學(xué)生成績,第最后1列為該學(xué)生的總成績

*/floatsum,tt=0.0,ver;

for(i=0;i<NUM;i++)/*i代表學(xué)生序號

*/{sum=0;/*每位學(xué)生成績輸入前,其總成績賦初值0*/for(j=0;j<KCN;j++)/*j代表課程代號

*/{scanf("%d",&x[i][j]);/*輸入第i號學(xué)生第j門課程的成績

*/sum=sum+x[i][j];}/*累加求i個(gè)學(xué)生總成績

*/x[i][KCN+1]=sum;/*總成績存入到二維數(shù)組的最后一列

*/tt=tt+x[i][KCN+1];/*累加求全班的總成績

*/}ver=tt/NUM;/*計(jì)算全班總平成績

*/printf("N01.scoregrade\n");

for(i=0;i<NUM;i++)/*打印輸出A等獎(jiǎng)學(xué)金的學(xué)生

*/if(x[i][KCN+1]>=1.2*ver){printf("%5d",i+1);for(j=0;j<KCN;j++)printf("%5.1f",x[i][j]);

溫馨提示

  • 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)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論