




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
§6.2二維數組6.2.1二維數組的定義與初始化1.二維數組的定義和存儲方式一般形式:類型說明符數組名[常量表達式1][常量表達式2]例如:
inta[3][4];該數組的下標變量共有3×4個,即:
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]
二維數組初始化也是在類型說明時給各下標變量賦以初值。二維數組可按行分段賦值,也可按行連續賦值。例如:對數組a[5][3]:按行分段賦值可寫為:
inta[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};按行連續賦值可寫為:
inta[5][3]={80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};這兩種賦初值的結果是完全相同的。2.二維數組的初始化一維存儲器中存放二維數組,有兩種方式:1.按行排列:即放完一行之后順次放入第二行;2.按列排列:放完一列之后再順次放入第二列。
在C語言中,二維數組是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四個元素也是依次存放。由于數組a說明為int類型,該類型占兩個字節的內存空間,所以每個元素均占有兩個字節。(1)可以只對部分元素賦初值,未賦初值的元素自動取0值。(2)如對全部元素賦初值,則第一維的長度可以不給出。(3)數組是一種構造類型的數據。二維數組可以看作是由一維數組的嵌套而構成的。設一維數組的每個元素又都是一個數組,就組成了二維數組。當然,前提是各元素類型必須相同。根據這樣的分析,一個二維數組也可以分解為多個一維數組。對這三個一維數組不需另作說明即可使用。說明:#include“stdio.h”main(){
int
i,j,s=0;floataverage,v[3],
int[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};
for(i=0;i<3;i++){for(j=0;j<5;j++)s=s+a[j][i];
v[i]=s/5.0;s=0;}average=(v[0]+v[1]+v[2])/3.0;
printf("math:%f\nclanguag:%f\ndFoxpro:%f\n",v[0],v[1],v[2]);
printf("total:%f\n",average);}【例6.13】求各科平均分和總成績平均分。【例6.14】一個學習小組有5個人,每個人有三門課的考試成績,成績如表6-2-1所示。求全組分科的平均成績和各科總平均成績。【分析】可設一個二維數組a[5][3]存放五個人三門課的成績。再設一個一維數組v[3]存放所求得各分科平均成績,設變量average為全組各科總平均成績。表6-2-15個人三門課考試的成績表
#include<stdio.h>main(){int
i,j,s=0;floataverage,v[3],a[5][3];
printf("inputscore\n");
for(i=0;i<3;i++){for(j=0;j<5;j++){scanf("%d",&a[j][i]);s=s+a[j][i];}
v[i]=s/5.0;s=0;}average=(v[0]+v[1]+v[2])/3.0;
printf("math:%f\nclanguag:%f\ndbase:%f\n",v[0],v[1],v[2]);
printf("total:%f\n",average);}程序代碼如下:二維數組的元素也稱為雙下標變量,其表示的形式為:
數組名[下標][下標]其中下標應為整型常量或整型表達式。例如:a[3][4]表示a數組三行四列的元素。下標變量和數組的比較:說明在形式中有些相似,但這兩者具有完全不同的含義。數組說明的方括號中給出的是某一維的長度,即可取下標的最大值;而數組元素中的下標是該元素在數組中的位置標識。前者只能是常量,后者可以是常量,變量或表達式。6.2.2二維數組的引用6.2.3二維數組的應用——極點與鞍點問題【例6.15】隨機產生20個兩位數存入數組inta[4][5]中,求二維數組a中所有元素的最大值、最小值及其所在的位置。#include<stdio.h>#include<stdlib.h>#include<time.h>voidmain(){srand((unsigned)time(NULL));
for(i=0;i<4;i++)
for(j=0;j<5;j++)
a[i][j]=rand()%90+10;
for(i=0;i<4;i++){for(j=0;j<5;j++)printf("%5d",a[i][j]);
printf("\n");}
//求極值及其位置
min=max=a[0][0];minh=minl=maxh=maxl=0;
for(i=0;i<4;i++)
for(j=0;j<5;j++){if(a[i][j]>max){max=a[i][j];maxh=i;maxl=j;}
if(a[i][j]<min){min=a[i][j];minh=i;minl=j;}}//打印極值及其位置
printf("max=a[%d][%d]=%d\n",
maxh,maxl,max);
printf("min=a[%d][%d]=%d\n",
minh,minl,min);}#include<stdio.h>#include<stdlib.h>#include<time.h>main(){intmat[6][6],i,j;
int
h,l;
srand((unsigned)time(NULL));
for(i=0;i<6;i++){for(j=0;j<6;j++){ mat[i][j]=rand()%90+10; printf("%4d",mat[i][j]);}
printf("\n");}【例6.16】隨機產生36個兩位數存入數組intmat[6][6]中,找出二維數組mat中的極點和鞍點。分析:若某元素在所在行相鄰兩點中與所在列相鄰兩點中均為最大或最小,則該點為極點。若某元素在所在行(或列)相鄰兩點中為最大,同時該元素在所在列(或行)相鄰兩點中為最小,則該點為鞍點。for(i=1;i<5;i++)
for(j=1;j<5;j++){if(mat[i][j]>mat[i][j-1]&&mat[i][j]>mat[i][j+1])//比左右還大
h=3;elseif(mat[i][j]<mat[i][j-1]&&mat[i][j]<mat[i][j+1])//比左右都小
h=1;else//一大一小
h=0;
if(mat[i][j]>mat[i-1][j]&&mat[i][j]>mat[i+1][j])//比上下都大
l=3;elseif(mat[i][j]<mat[i-1][j]&&mat[i][j]<mat[i+1][j])//比上下都小
l=1;else//一大一小
l=0;
switch(h+l){case6:printf("極大值點=%d,row=%d,col=%d\n",mat[i][j],i,j);break;case2:printf("極小值點=%d,row=%d,col=%d\n",mat[i][j],i,j);break;case4:printf("鞍點=%d,row=%d,col=%d\n",mat[i][j],i,j);break; } }}【例6.17】編程打印如圖6-2-1所示的圖形:
12345234513451245123
圖6-2-1程序代碼如下:#include<stdio.h>main(){inti,j,a[4][5];
for(j=0;j<5;j++)//對第一行元素賦值
a[0][j]=j+1;
for(i=1;i<4;i++)//對第二~四行元素賦值
for(j=0;j<5;j++)
a[i][j]=a[i-1][(j+1)%5];
for(i=0;i<4;i++)//打印二維數組
{for(j=0;j<5;j++) printf("%2d",a[i][j]);
printf("\n");
}}6.2.4二維數組的應用——圖形打印【分析】本題中第二行起每一行元素的值都是上一行元素循環左移一個元素后的結果。【例6.18】編程打印如圖6-2-2所示的圖形:AAAAAAAABBBBBAABCCCBAABCDCBAABCCCBAABBBBBAAAAAAAA圖6-2-2程序代碼如下:#include<stdio.h>main(){int
i,j,k;chara[7][7];
for(k=0;k<=7/2;k++)
for(i=k;i<7-k;i++)
for(j=k;j<7-k;j++)
a[i][j]=65+k;
for(i=0;i<7;i++)//打印二維數組
{for(j=0;j<7;j++)
printf("%c",a[i][j]);
printf("\n");}}【分析】本題可用復蓋法實現,首先將所有元素置為字符A,然后第二圈置為字符B,……從而實現所有元素的賦值。
111121133114641
圖6-2-3【分析】二維數組賦值情況如表6-2-2所示:111121133114641表6-2-2a[i-1][j]+a[i-1][j-1](其它)【例6.19】編程打印如圖6-2-3所示的楊輝三角形。由表可見:a[i][j]=1(j=0和j=i)111121133114641表6-2-2#include"stdio.h"main(){inta[5][5],i,j;
for(i=0;i<5;i++)
for(j=0;j<=i;j++)
if(j==0||i==j)
a[i][j]=1;else
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(i=0;i<5;i++){for(j=0;j<40-4*i;j++)
printf("");
for(j=0;j<=i;j++) printf("%-9d",a[i][j]);//%-9d表示輸出結果左對齊
printf("\n");}}程序代碼如下:【例6.19】編程打印如圖6-2-4所示的5階魔方。17241815235714164613202210121921311182529【分析】所謂“奇數階魔方陣”是指n為不小于3的奇數的魔方陣。我們不難發現魔方陣的特點:所填入的n2個不同整數依次為1、2、3、…、n2;各行、列和對角線上的數字雖各不相同,但其和卻是相同的;數字在陣列中的次序,并沒有遵從陣列單元的行、列下標的順序,但數字“1”卻始終出現在陣列第一行的正中間位置,而數字“n2”也始終出現在陣列第n行的正中間位置,這說明陣列中的數字排列應該是有一定規律的。通過對奇數階魔方陣的分析,其中的數字排列有如下的規律:(1)自然數1出現在第一行的正中間;(2)若填入的數字在第一行(不在第n列),則下一個數字在第n行(最后一行)且列數加1(列數右移一列);(3)若填入的數字在該行的最右側,則下一個數字就填在上一行的最左側;(4)一般地,下一個數字在前一個數字的右上方(行數少1,列數加1);(5)若應填的地方已經有數字或在方陣之外,則下一個數字就填在前一個數字的下方。(一般地,n的倍數的下一個數字是在該數的下方。)17241815235714164613202210121921311182529圖6-2-4#include"stdio.h"#defineN5main(){int
a[N][N],h,l,x;h=0;l=(N-1)/2;a[h][l]=1;
for(i=2;i<=N*N;i++)//確定總共要打印的數
{if((i-1)%N==0)//判斷該數是否是N的倍數+1,如果是就打印該數的下方
h++;else{ h--;l++;//該數不是N的倍數+1,則到該數的右上方
if(l>=N)//如果該數的右上方的列已超出要打印的列數,則將該項數打印到該行的第一列
l=0;
if(h<0) h=N-1;}
a[h][l]=1;}
for(h=0;h<5;h++){for(l=0;l<5;l++) printf("%3d",a[h][l]);
printf("\n");}}程序代碼如下:【例6.19】編程打印如圖6-2-5所示的圖形。11615141321724231231825221141920211056789
圖6-2-5【分析】本題二維數組的賦值順序可按如圖6-2-6所示的進行:11615141321724231231825221141920211056789圖6-2-611615141321724231231825221141920211056789
圖6-2-5#include"stdio.h"#defineN5voidmain(){int
a[N][N],i,j,k=1;
for(i=0;i<N/2;i++)//控制圈
{for(j=i;j<4-i;j++)//j控制行
a[j][i]=k++;
for(j=i;j<4-i;j++)//j控制列
a[4-i][j]=k++;
for(j=4-i;j>i;j++)//j控制行
a[j][4-i]=k++;
for(j=4-i;j>i;j++)//j控制列
a[i][j]=k++;}if(N%2==1)a[N/2][N/2]=N*N;
for(i=0;i<5;i++){for(j=0;j<5;j++)printf("%3d",a[i][j]);
printf("\n");}}程序代碼如下:6.2.5二維數組的應用——矩陣相加、相乘、轉置與旋轉
1.矩陣相加實質上是將兩個矩陣對應的元素值相加(前提是兩個矩陣行數和列數相同)。2.矩陣相減實質上是將兩個矩陣對應的元素值相減(前提是兩個矩陣行數和列數相同)。
3.矩陣相乘:a[m][n]*b[n][w]=>c[m][w](前提:第一個矩陣的列數==第二個矩陣的行數)【例6.19】有如下的兩個矩陣inta[3][2]和intb[2][3],兩矩陣相乘后得到矩陣c[3][3],請編程實現。矩陣相乘情況如圖6-2-7所示:圖6-2-7矩陣相乘圖示【分析】用二維數組a[3][2]、b[2][3]、c[3][3]來表示矩陣A、B、C,根據數學知識可知,c[i][j]=a[i][0]*b[0][j]+a[i][1]*b[1][j],所以用一個三重循環就可以求出數組c中全部元素。a[3][2]b[2][3]c[3][3]12123912152445619263356294051圖6-2-7矩陣相乘圖示a[3][2]b[2][3]c[3][3]12123912152445619263356294051#include“stdio.h”main(){inta[3][2]={},b[2][3]={},c[3][3],i,j,k;
for(i=0;i<3;i++)
for(j=0;j<2;j++)printf(“%4d”,a[i][j]);
printf(“\n”);
for(i=0;i<2;i++)
for(j=0;j<3;j++)printf(“%4d”,b[i][j]);
printf(“\n”);
for(i=0;i<3;i++)
for(j=0;j<3;j++){c[i][j]=0;
for(k=0;k<2;k++)
c[i][j]+=a[i][k]+b[k][j];}}程序代碼如下:4.矩陣轉置實質是將矩陣的行號和列號互換。如圖6-2-8所示:源矩陣轉置矩陣a00a01a02a00a10a20a30a10a11a12
a01a11a21a32a20a21a22a02a12a22a32a30a31a32
圖6-2-8矩陣轉置#include“stdio.h”#include“stdlib.h”#include“time.h”main(){inta[3][4],b[4][3],i,j;
srand((unsigned)time(NULL));
printf(“原矩陣為:\n”)
for(i=0;i<3;i++){for(j=0;j<4;j++){a[i][j]=random(53)+18;printf(“%3d”,a[i][j]);
b[j][i]=a[i][j];}
printf(“\n”);}【例6.20】利用隨機函數產生一個3*4矩陣,要求如下:(1)矩陣中各元素在18~70之間;(2)輸出矩陣;(3)將轉置后的矩陣輸出。請編程實現。
//打印b數組
for(i=0;i<4;i++){
for(j=0;j<3;j++)printf(“%3d”,b[i][j]);
printf(“\n”);}}#include“stdio.h”#include“stdlib.h”#include“time.h”main(){inta[3][4],b[4][3],i,j;
srand((unsigned)time(NULL));
printf(“原矩陣為:\n”)
for(i=0;i<3;i++){for(j=0;j<4;j++){a[i][j]=random(53)+18;printf(“%3d”,a[i][j]);
b[j][i]=a[i][j];}
printf(“\n”);}
//打印b數組
for(i=0;i<4;i++){
for(j=0;j<3;j++)printf(“%3d”,b[i][j]);
printf(“\n”);}}5.矩陣旋轉是指矩陣順時針或逆時針旋轉90度或180度。如圖6-2-9演示了矩陣順時針旋轉90度的情況:源矩陣a順時針旋轉90度后的矩陣ba00a01a02a30a20a10a00a10a11a12
a31a21a11a01a20a21a22a32a22a12a02a30a31a32
圖6-2-9矩陣旋轉(1)將a[m][n]順時針旋轉90度后得到矩陣b[n][m],兩者關系是:b[i][j]=a[m-1-j][i];或b[j][m-1-i]=a[i][j];(2)將a[m][n]逆時針旋轉90度后得到矩陣b[n][m],兩者關系是:b[n-1-j][i]=a[i][j];或b[i][j]=a[j][n-1-i];(3)將a[m][n]順時針旋轉180度和逆時針旋轉180度后得到的都是矩陣b[m][n],兩者關系是:
b[i][j]=a[m-1-i][n-1-j];方陣是一種特殊的矩陣,其特點是行數和列數相等。本節主要知識點包括方陣的順時針旋轉90度、逆時針旋轉90度、旋轉180度和轉置。方陣旋轉和轉置示意圖如圖6-2-10所示:6.2.6二維數組的應用——方陣旋轉與轉置#include”stdio.h”main(){inta[3][3],b[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
a[i][j]=i*3+j+1;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[i][j]=a[j][i];//轉置
for(i=0;i<3;i++){for(j=0;j<3;j++)printf(“%3d”,b[i][j]);
printf(“\n”);}}【例6.21】編程實現將上圖中的inta[3][3]數組轉置放入到b數組中。6.2.7二維數組的其它應用舉例【例6.23】隨機產生互不相同的兩位數存入二維數組a[N][M]中,根據二維數組中第一列的值的降序,重新調整各行的順序。【分析】本題分四個步驟完成:首先,產生互不相同的兩位數存入二維數組;然后,打印源數組;接著,根據第一列的降序調整各行的次序;最后,打印排序后的數組。#inchude”stdio.h”main(){inta[3][3],b[3][3];
int
i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
a[i][j]=j*3+j+1;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[i][j]=a[j][2-i];
for(i=0;i<3;i++){for(j=0;j<3;j++)printf(“%3d”,b[i][j]);
printf(“\n”);}}【例6.22】編程實現將上圖中的inta[3][3]數組逆時針旋轉90度存入b數組中。#include"stdio.h"#include"stdlib.h"#include<time.h>#defineN5#defineM6main(){ int
i,j,a[N][M],k,t;
int
b[N*M];
srand((unsigned)time(NULL));
for(i=0;i<N*M;i++) {b[i]=rand()%90+10;
for(j=0;j<i;j++)
if(b[i]==b[j]) { i--;break; } } k=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
a[i][j]=b[k++];
程序代碼如下:
printf("源數組為:\n");
for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%4d",a[i][j]);
printf("\n");}//根據第一列的降序調整各行的次序
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++) if(a[i][0]<a[j][0]) {//調整第i行和第j行的所有數據
for(k=0;k<M;k++) {t=a[i][k];a[i][k]=a[j][k];
a[j][k]=t; } }
printf("新數組為:\n");
for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%4d",a[i][j]);
printf("\n");}}#include"stdio.h"#include"stdlib.h"#include<time.h>#defineN5#defineM6main(){ int
i,j,a[N][M],k,t;
int
b[N*M];
srand((unsigned)time(NULL));
for(i=0;i<N*M;i++) {b[i]=rand()%90+10;
for(j=0;j<i;j++)
if(b[i]==b[j]) { i--;break; } } k=0;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
a[i][j]=b[k++];
printf("源數組為:\n");
for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%4d",a[i][j]);
printf("\n");}//根據第一列的降序調整各行的次序
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++) if(a[i][0]<a[j][0]) {//調整第i行和第j行的所有數據
for(k=0;k<M;k++) {t=a[i][k];a[i][k]=a[j][k];
a[j][k]=t; } }
printf("新數組為:\n");
for(i=0;i<N;i++){for(j=0;j<M;j++)printf("%4d",a[i][j]);
printf("\n");}}【分析】本題分四個步驟完成:首先,產生互不相同的兩位數存入二維數組;然后,打印源數組;接著,求每行的最大值,將最大值移至主對角線,且保證各行數據的相對位置不變;最后,打印輸出移動后的數組。【例6.24】將二維數組a中每行的最大值移至主對角線,并且保證各行數據的相對位置不變。(二維數組的元素值是由隨機函數產生的兩位數)#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN6voidmain(){int
a[N][N],i,j,max,maxl,k,t;
srand((unsigned)time(NULL));
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家電小門店管理制度
- 強化領導及管理制度
- 德育活動室管理制度
- 志愿者茶室管理制度
- 快速響應區管理制度
- 急救中感染管理制度
- 意大利劇院管理制度
- 成品庫儲存管理制度
- 戰備綜合室管理制度
- 房地產經理管理制度
- GB/T 44831-2024皮膚芯片通用技術要求
- 汽輪發電機組設備運行記錄日報表(正面) A2
- 校園安全主題團課
- 新版申請銀行減免利息的申請書
- 中職英語新課標詞匯表
- 2024秋期國家開放大學《國際法》一平臺在線形考(形考任務1至5)試題及答案
- 中華文明的起源與早期國家課件
- Unit 8 I come from China. (教學設計)-2023-2024學年湘少版(三起)英語四年級下冊
- 2024年浙江高考英語考綱詞匯表
- 化工過程安全管理導則培訓
評論
0/150
提交評論