二维数组.pptx
- 文档编号:18900510
- 上传时间:2024-02-10
- 格式:PPTX
- 页数:33
- 大小:114.23KB
二维数组.pptx
《二维数组.pptx》由会员分享,可在线阅读,更多相关《二维数组.pptx(33页珍藏版)》请在冰点文库上搜索。
第二节第二节二维数组二维数组某班有n(n80)人,期末考试考六门,语数英物化生,现要求出每人的成绩总分和各学科的平均分。
输入班级人数,每人的座位号和各学科成绩,输出每人的座位号、成绩(包含总分)和各学科的平均分。
输入样例:
3167899382879028098878289933788692906785输出样例:
16789938287905082809887828993529378869290678549875.091.090.784.781.089.3搞7个数组,一个数组存座位号,其他6个数组分别存语数英物化生。
搞7个数组显然很麻烦。
由输入可发现,数据是二维的,即可以表示一张表格。
如果a1里面又是一个数组就能解决这个问题。
数组里面的元素类型是数组就可以用二维数组表示。
A80880行8列For(inti=1;iai0;/输入座位号for(intj=1;jaij;ai7+=aij;/累加每行的成绩sumj+=aij;/累加每列的成绩存储方式二维数组在计算机中的存储方式:
计算机的存储方式是一维的,要把二维数组元素存放到存储器中,c+是按行(第一个下标)的次序存放,即按a0,1,a0,2,a0,3,a0,4,a0,5,a1,1a1,5的次序存放于存储器中某一组连续的存储单元之内.现学现用:
某数组中每个元素占2个存储单元,首地址为50,则第18个元素的存储地址为()A、82B、84C、85D、86一、二维数组的定义当一维数组元素的类型也是一维数组时,便构成了“数组的数组”,即二维数组。
二维数组定义的一般格式:
数据类型数组名常量表达式1常量表达式2;例如:
inta410;a数组实质上是一个有4行、10列的表格,表格中可储存40个元素。
第1行第1列对应a数组的a00,第n行第m列对应数组元素an-1m-1。
说明:
当定义的数组下标有多个时,我们称为多维数组,下标的个数并不局限在一个或二个,可以任意多个,如定义一个三维数组a和四维数组b:
inta10035;intb10010035;多维的数组引用赋值等操作与二维数组类似。
二、二维数组元素的引用二维数组的数组元素引用与一维数组元素引用类似,区别在于二维数组元素的引用必须给出两个下标。
引用的格式为:
下标1下标2说明:
显然,每个下标表达式取值不应超出下标所指定的范围,否则会导致致命的越界错误。
例如,设有定义:
inta35;则表示a是二维数组(相当于一个3*5的表格),共有3*5=15个元素,它们是:
a00a01a02a03a04a10a11a12a13a14a20a21a22a23a24因此可以看成一个矩阵(表格),a23即表示第3行第4列的元素。
三、二维数组的初始化二维数组的初始化和一维数组类似。
可以将每一行分开来写在各自的括号里,也可以把所有数据写在一个括号里。
例如:
intdirect42=1,0,0,1,-1,0,0,-1intdirect42=1,0,0,1,-1,0,0,-1/尽量不要用四、二维数组程序设计例5.8设有一程序#include#include#includeconstintn=3;usingnamespacestd;intan+1n+1;intmain()for(inti=1;i=n;+i)for(intj=1;jaij;for(inti=1;i=n;+i)for(intj=1;j=n;+j)coutsetw(5)aji;coutendl;return0;程序的输入:
213331121程序的输出:
231132311例5.9已知一个6*6的矩阵(方阵),把矩阵二条对角线上的元素值加上10,然后输出这个新矩阵。
【分析】矩阵即表格,是一个二维数组,有6行6列共36个元素,每个矩阵都有二条对角线,本题难点在于对角线的元素怎么确定。
#include#includeusingnamespacestd;inta77;intmain()for(inti=1;i=6;+i)/输入矩阵元素for(intj=1;jaij;for(inti=1;i=6;+i)/更改对角线上元素的值for(intj=1;j=6;+j)if(i=j)|(i+j=7)aij+=10;/寻找对角线的特征for(inti=1;i=6;+i)/输出6行6列的矩阵元素for(intj=1;j=6;+j)coutsetw(5)aij;coutendl;return0;例5.10打印杨辉三角形的前10行。
杨辉三角形如下图:
111111121121133113311464114641图5-1图5-2【问题分析】观察图5-1,大家不容易找到规律,但是如果将它转化为图5-2,不难发现杨辉三角形其实就是一个二维表的小三角形部分,假设通过二维数组yh存储,每行首尾元素为1,且其中任意一个非首位元素yhij的值其实就是yhi-1j-1与yhi-1j的和,另外每一行的元素个数刚好等于行数。
有了数组元素的值,要打印杨辉三角形,只需要控制好输出起始位置就行了。
#include#includeusingnamespacestd;intmain()inta1111;a11=1;/设定第一行的值for(inti=2;i=10;+i)/从第二行开始推ai1=1;aii=1;/设定每一行的首尾值为1for(intj=2;j=i-1;+j)/当前行非首尾的数aij=ai-1j-1+ai-1j;/每个数等于上一行的二个数之和for(inti=1;i=10;i+)if(i!
=10)coutsetw(30-3*i);/控制每行的起始位置,即空格数量for(intj=1;j=i;j+)coutsetw(6)aij;coutendl;return0;例5.11大部分元素是0的矩阵称为稀疏矩阵,假设有k个非0元素,则可把稀疏矩阵用K*3的矩阵简记之,其中第一列是行号,第二列是列号,第三列是该行、该列下的非元素的值。
如:
0005写简记成:
145/第1行第4列有个数是50200222/第2行第2列有个数是20100321/第3行第2列有个数是1试编程读入一稀疏矩阵,转换成简记形式,并输出。
【分析】本题中需要解决的主要问题是查找非零元素并记忆位置。
将原始矩阵存于数组a。
转换后的矩阵存于数组b,当然b数组的行数可以控制在一个小范围内。
#include#includeconstintn=3,m=5;usingnamespacestd;intmain()intan+1m+1,b1014,k=0;for(inti=1;i=n;+i)/矩阵初始for(intj=1;jaij;for(inti=1;i=n;+i)for(intj=1;j=m;+j)if(aij!
=0)/找到非零值,存储+k;bk1=i;bk2=j;bk3=aij;for(inti=1;i=k;+i)/输出for(intj=1;j=3;+j)coutsetw(3)bij;coutendl;return0;运行结果:
输入:
000050040010001输出:
155234311351例5.12输入一串字符,字符个数不超过100,且以“.”结束。
判断它们是否构成回文。
【分析】所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。
先读入要判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。
程序如下:
#includeusingnamespacestd;intmain()charch,letter101;inti=0,j=1;coutch;while(ch!
=.)/读入一个字符串以.号结束+i;letteri=ch;cinch;while(j=i)coutYesendl;elsecoutNoendl;return0;例5.13蛇形填数在n*n方阵里填入1,2,3,n*n,要求填成蛇形。
例如n=4时方阵为:
10111219161328151437654上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出,n=8。
【分析】:
类比数学中的矩阵,我们可以用一个所谓的二维数组来储存题目中的方阵。
只需声明一个intaMAXNMAXN,就可以获得一个大小为MAXNMAXN的方阵。
在声明时,两维的大小不必相同,因此也可以声明inta3050这样的数组,第一维下标范围是0,1,2,29,第二维下标范围是0,1,2,49。
让我们从1开始依次填写。
设“笔”的坐标为(x,y),则一开始x=0,y=n-1,即第0行,第n-1列(别忘了行列的范围是0到n-1,没有第n列)。
“笔”的移动轨迹是:
下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。
总之,先是下,到不能填了为止,然后是左,接着是上,最后是右。
“不能填”是指再走就出界(例如45),或者再走就要走到以前填过的格子(例如1213)。
如果我们把所有格子初始为0,就能很方便地加以判断。
#include#include#defineMAXN10intaMAXNMAXN;intmain()intn,x,y,tot=0;scanf(%d,&n);memset(a,0,sizeof(a);tot=ax=0y=n-1=1;while(totn*n)while(x+1=0&!
axy-1)ax-y=+tot;while(x-1=0&!
ax-1y)a-xy=+tot;while(y+1n&!
axy+1)ax+y=+tot;for(x=0;xn;+x)for(y=0;yn;+y)printf(%3d,axy);printf(n);return0;【说明】:
这段程序充分利用了C+语言简洁的优势。
首先,赋值x=0和y=n-1后马上要把它们作为a数组的下标,因此可以合并完成;tot和a0n-1都要赋值1,也可以合并完成。
这样,我们用一条语句完成了多件事情,而且并没有牺牲程序的可读性,这段代码的含义显而易见。
那4条while语句有些难懂,不过十分相似,因此只需介绍其中的第一条:
不断向下走,并且填数。
我们的原则是:
先判断,再移动,而不是走一步以后发现越界了再退回来。
这样,我们需要进行“预判”,即是否越界,以及如果继续往下走会不会到达一个已经填过的格子。
越界只需判断x+1n,因为y值并没有修改;下一个格子是(x+1,y),因此只需ax+1y=0,简写成!
ax+1y(其中!
是“逻辑非”运算符)。
细心的读者也许会发现这里的一个“潜在bug”;如果越界,x+1会等于n,ax+1y将访问非法内存!
幸运的是,这样的担心是不必要的。
&是短路运算符。
如果x+1n为假,将不会计算!
ax+1y,也就不会越界了。
至于为什么是+tot而不是tot+,留给读者思考。
3.假设四个商店一周内销售自行车的情况如下面表一所示:
自行车牌号永久牌飞达牌五羊牌第一商店354055第二商店205064第三商店103218第四商店383628几种牌号自行车的单价如表二所示:
单价元永久牌395飞达牌398五羊牌384求各店本周出售自行车的总营业额。
例例6.编写一个根据n的值显示螺旋式数字方阵的程序。
方阵中数字的排列规律如下:
123n=3时:
89476512341213145n=4时:
11161561098712345161718196152425207n=5时:
142322218131211109分析:
分析:
方阵中有nn个数,可以用n行n列的二维数组存放这些数,待nn个数全部产生并存入这个二维数组后,输出这个二维数组。
用4个整型变量left、right、up、down表示方阵的左、右、上、下边界,其初始值为1、n、1、n。
*先从左往右填up行,然后up值加1;*先从上往下填right列,然后right值减1;*先从右往左填down行,然后down值减1;*先从下往上填left列,然后left值加1;重复执行下列操作,直到重复执行下列操作,直到nnnn个数都填满:
个数都填满:
programdwsz8(input,output);programdwsz8(input,output);ConstConstmax=100;max=100;varvara:
array1.max,1.maxofa:
array1.max,1.maxofinteger;integer;n,i,j,up,down,right,left,sn,i,j,up,down,right,left,s:
integer;:
integer;beginbeginreadln(n);readln(n);up:
=1;down:
=n;up:
=1;down:
=n;right:
=n;left:
=1;right:
=n;left:
=1;s:
=0;i:
=up;s:
=0;i:
=up;whilewhilesn*nsn*ndodobeginbeginforforj:
=leftj:
=lefttotorightrightdodobeginbegins:
=s+1;s:
=s+1;ai,j:
=s;ai,j:
=s;end;end;up:
=up+1;up:
=up+1;j:
=right;j:
=right;fori:
=uptodowndobegins:
=s+1;ai,j:
=s;end;right:
=right-1;i:
=down;forj:
=rightdowntoleftdobegins:
=s+1;ai,j:
=s;end;down:
=down-1;j:
=left;fori:
=downdowntoupdobegins:
=s+1;ai,j:
=s;end;left:
=left+1;i:
=up;end;fori:
=1tondobeginforj:
=1tondowrite(ai,j:
4);writeln;end;end;end.【上机练习】1.矩阵交换行【1.8编程基础之多维数组01】给定一个5*5的矩阵(数学上,一个rc的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果。
输入:
输入共6行,前5行为矩阵的每一行元素,元素与元素之间以一个空格分开。
第6行包含两个整数m、n,以一个空格分开(1=m,n=5)。
输出:
输出交换之后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开。
样例输入:
122125678393053721463082415样例输出:
3082456783930537214612212【上机练习】2.同行列对角线的格【1.8编程基础之多维数组02】输入三个自然数N,i,j(1=i=n,1=j=n),输出在一个N*N格的棋盘中(行列均从1开始编号),与格子(i,j)同行、同列、同一对角线的所有格子的位置。
如:
n=4,i=2,j=3表示了棋盘中的第二行第三列的格子,如下图:
当n=4,i=2,j=3时,输出的结果是:
(2,1)(2,2)(2,3)(2,4)同一行上格子的位置(1,3)(2,3)(3,3)(4,3)同一列上格子的位置(1,2)(2,3)(3,4)左上到右下对角线上的格子的位置(4,1)(3,2)(2,3)(1,4)左下到右上对角线上的格子的位置【上机练习】输入:
一行,三个自然数N,i,j,相邻两个数之间用单个空格隔开(1=N=10)。
输出:
第一行:
从左到右输出同一行格子位置;第二行:
从上到下输出同一列格子位置;第三行:
从左上到右下输出同一对角线格子位置;第四行:
从左下到右上输出同一对角线格子位置。
其中每个格子位置用如下格式输出:
(x,y),x为行号,y为列号,采用英文标点,中间无空格。
相邻两个格子位置之间用单个空格隔开。
样例输入:
423样例输出:
(2,1)(2,2)(2,3)(2,4)(1,3)(2,3)(3,3)(4,3)(1,2)(2,3)(3,4)(4,1)(3,2)(2,3)(1,4)【上机练习】3.计算矩阵边缘元素之和【1.8编程基础之多维数组03】输入一个整数矩阵,计算位于矩阵边缘的元素之和。
所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
输入:
第一行分别为矩阵的行数m和列数n(m100,n100),两者之间以一个空格分开。
接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。
输出:
输出对应矩阵的边缘元素和。
样例输入:
33341371201样例输出:
15【上机练习】4.计算鞍点【1.8编程基础之多维数组05】给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。
鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
例如:
在下面的例子中(第4行第1列的元素就是鞍点,值为8)。
输入:
输入包含一个5行5列的矩阵。
输出:
如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出notfound。
样例输入:
11356912478101056911864721510112025样例输出:
418【上机练习】5.图像相似度【1.8编程基础之多维数组06】给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。
说明:
若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。
两幅图像的相似度定义为相同像素点数占总像素点数的百分比。
输入:
第一行包含两个整数m和n,表示图像的行数和列数,中间用单个空格隔开。
1=m=100,1=n=100。
之后m行,每行n个整数0或1,表示第一幅黑白图像上各像素点的颜色。
相邻两个数之间用单个空格隔开。
之后m行,每行n个整数0或1,表示第二幅黑白图像上各像素点的颜色。
相邻两个数之间用单个空格隔开。
输出:
一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。
样例输入:
样例输出:
3344.44101001110110001001【上机练习】6.矩阵加法【1.8编程基础之多维数组07】输入两个n行m列的矩阵A和B,输出它们的和A+B。
输入:
第一行包含两个整数n和m,表示矩阵的行数和列数(1=n=100,1=m=100)。
接下来n行,每行m个整数,表示矩阵A的元素。
接下来n行,每行m个整数,表示矩阵B的元素。
相邻两个整数之间用单个空格隔开,每个元素均在11000之间。
输出:
n行,每行m个整数,表示矩阵加法的结果。
相邻两个整数之间用单个空格隔开。
样例输入:
样例输出:
3324612357912381012123123456789【上机练习】7.矩阵乘法【1.8编程基础之多维数组08】计算两个矩阵的乘法。
n*m阶的矩阵A乘以m*k阶的矩阵B得到的矩阵C是n*k阶的,且Cij=Ai0*B0j+Ai1*B1j+Aim-1*Bm-1j(Cij表示C矩阵中第i行第j列元素)。
输入:
第一行为n,m,k,表示A矩阵是n行m列,B矩阵是m行k列,n,m,k均小于100。
然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,矩阵中每个元素的绝对值不会大于1000。
输出:
输出矩阵C,一共n行,每行k个整数,整数之间以一个空格分开。
样例输入:
323111111111111样例输出:
222222222【上机练习】8.矩阵转置【1.8编程基础之多维数组09】输入一个n行m列的矩阵A,输出它的转置AT。
输入:
第一行包含两个整数n和m,表示矩阵A的行数和列数(1=n=100,1=m=100)。
接下来n行,每行m个整数,表示矩阵A的元素。
相邻两个整数之间用单个空格隔开,每个元素均在11000之间。
输出:
m行,每行n个整数,为矩阵A的转置。
相邻两个整数之间用单个空格隔开。
样例输入:
33123456789样例输出:
147258369【上机练习】9.图像旋转【1.8编程基础之多维数组10】输入一个n行m列的黑白图像,将它顺时针旋转90度后输出。
输入:
第一行包含两个整数n和m,表示图像包含像素点的行数和列数。
1=n=100,1=m=100。
接下来n行,每行m个整数,表示图像的每个像素点灰度。
相邻两个整数之间用单个空格隔开,每个元素均在0255之间。
输出:
m行,每行n个整数,为顺时针旋转90度后的图像。
相邻两个整数用单个空格隔开。
样例输入:
33123456789样例输出:
741852963【上机练习】10.图像模糊处理【1.8编程基础之多维数组12】给定m行n列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
1.四周最外侧的像素点灰度值不变;2.中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
输入:
第一行包含两个整数n和m,表示图像包含像素点的行数和列数。
1=n=100,1=m=100。
接下来n行,每行m个整数,表示图像的每个像素点灰度。
相邻两个整数之间用单个空格隔开,每个元素均在0255之间。
输出:
m行,每行n个整数,为模糊处理后的图像。
相邻两个整数之间用单个空格隔开。
样例输入:
451000100050501002000050501001002001001005050100样例输出:
100010005050801006005080100902001001005050100例四例四下面是一个3阶的奇数幻方。
它由1到32的自然数组成一个3*3的方阵,方阵的每一行,每一列和两个对角线上的各数字之和都相等,且等于n(n2+1)/2(n是方阵的行数或列数)。
编程打印出n为10以内的奇数阶幻方。
618753294分析:
分析:
仔细观察示例,有如下规律:
在顶行中间填数字1;横坐标(行)X=1,纵坐标(列)Y=(n+1)/2后继数放在前一个数的左上方;X=X-1;Y:
=Y-1若超出了行,则认为是最后一行;ifX1thenX=n若超出了列,则认为是最后一列;ifY1thenY=n若左上方已有数,则放在原数的正下方;X=X+1,Y=Y重复步骤、,直至填满方阵为止。
Vara:
array1.10,1.10ofinteger;x,y,xx,yy,s,n:
integer;BeginClrscr;清屏fillchar(a,sizeof(a),0);将a数组各元素置0repeatwrite(InputNumberPlease!
);提示输入nreadln(n)untilodd(n);s:
=1;x:
=1;y:
=(ndiv2)+1;ax,y:
=1;repeatinc(s);xx:
=x;yy:
=y;dec(x);dec(y);ifx1thenx:
=n;ify1theny:
=n;ifax,y0thenbeginx:
=xx+1;y:
=yyend;ax,y:
=s;untils=n*n;forx:
=1tondobeginfory:
=1tondowrite(ax,y:
3);writelnend;repeatuntilkeypressed;End.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二维 数组