收藏 分销(赏)

《C语言学习与应用》教学课件08二维数组操作.pdf

上传人:曲**** 文档编号:225501 上传时间:2023-03-08 格式:PDF 页数:62 大小:3.45MB
下载 相关 举报
《C语言学习与应用》教学课件08二维数组操作.pdf_第1页
第1页 / 共62页
《C语言学习与应用》教学课件08二维数组操作.pdf_第2页
第2页 / 共62页
《C语言学习与应用》教学课件08二维数组操作.pdf_第3页
第3页 / 共62页
《C语言学习与应用》教学课件08二维数组操作.pdf_第4页
第4页 / 共62页
《C语言学习与应用》教学课件08二维数组操作.pdf_第5页
第5页 / 共62页
点击查看更多>>
资源描述

1、C语言学习与应用教学课件任务说明学习二维数组的定义,数组元素的引用、遍历和整齐 化输出的方法,在此基础上掌握批量数据的程序设计。了解二维数组的定义和下标变量的范围。掌握二维数组元素和地址的多种表示方法。掌握二维数素元素的遍历方法。掌握二维数组输出函数的编写。了解针对二维数组操作的函数的编写。0能够用宏定义二维数组的范围。C能够定使用指针变量遍历二维数组。0能够编写对二维数组操作的函数。0能够排查有关二维数组程序设计中的物理和逻辑错场0能够自由地书写二维数组操作的函数和主函数。01,二维数组的定义和初始化1.二维数组的定义二维数组就是若干个一维数组,对二维 数组的操作就是多次对一维数组的操作,-

2、维数组的遍历是一层循环,二维数组的操作 就是循环的嵌套了。1.二维数组的定义int a34;定义了一个名为a的二维数组,在内存中占有12个连续的存储单元,顺序是a00,a01,a02,a03,a10,a11.a23,如图81所不。图81二维数组存储示意图a00aOla02a03,国网mmmramma20a2la22a23可以将二维数组理解为一个矩阵,本例是3行4列的矩阵,行下标的变化范围是。2,列下标的变化范围是03。微课学习任务八二维数组操作_多科成绩统计(tfl知做而效传Mt二维数组的定义2,二维数组元素的引用如有定义double w 4 :则w 1 0.w i j、w i+j k 等均是

3、合法的引用,只要有两个方括号,方 括号中的表达式值为整数且在允许的范围内 即可。3.二维数组的初始化int a33=1525452;只给前两行的前两个元素赋值,其余元素均为0。int a4 3=1,2,4,5;按存储顺序给a00,a01,a02,分别赋值 1、2、4、5,其余元素值均为0。int a3=152535455;可以省略第一个方括号中的常量表达式,不能省略第二个方括号中 的常量表达式,本例中第一个方括号中的隐含值是2。应用举例8TB三维数组的基本操作输入和输出J#include nstdio.hn#include stdlib.h#define M3 用宏定义二维数组的行数#defi

4、ne N4 用宏定义二维数组的列数void main()(intaMN,M;for(i=0;iM;i+)对二维数组搜一遍,是两层循环for(j=0;jN;j+)aij=rand()%100;为二维数组元素赋099的随机值 for(i=0;iM;i+)应用举例8Tg二维数组的基本操作输入和输出4for0=O;jN;j+);priiC%3d%矶HUD;printf(n nn);每输出一行换一行getchar(程序输出:41 67 34 069 24 78 5862 64 5 45将程序代码补充完整,输 出3行3列的方阵。.课堂思考:问题8-1#include wstdio.hn#define M3

5、void main()(int i J,a=4,9,2,3,7,8,1,6;电力力/电力,J?)色,】虫秀七/七力&七?虫,)包n普 黔力龄代工七物/立立,)虫虫,】黔电七/七包?)?)力?)?)力加金,:七?)野普,)七七?)&七,普力电f电电七包的急虫力电电)钞/钟电器的七旬毂电期电立,e龄和aeg?)粤力立立旬立色,】给安七电七旬七龄和,)七金虫,)七七?)电就,普I二维数组的地址和指针1.二维数组元素和地址的表示若有定义“int a 3 4则数组元素a i j的地址有 以下几种表示方法。)&a i O这前TT房法是最直基的薪j(2)a i+jo这种表示方法是将a i理解为一维数组 的数

6、组名,a i+j就是a i j的地址。1,二维数组元素和地址的表示,*(a+i)+jo这种表示方法将上面的a i表示为*(a+i)。&a 0 n 置&a 010+4*i-0向)数组是连续存彳诸?平起始位 j 就是&ai H oJa 0+4j a 0 ori+jo 行聂示方法中,&aoo就是J数组元素ai j有以下几种表示方法。*(a i J 演变而来9j)O这种|法由地址的第二谕表示方法*(*(a+i)+j)。这种表示方法由地址的第三种表示方法 演变而来。数组元素ai j有以下几种表示方法。(*(a+i)i 表示夕*(&a 01 种表示方?0!去演变而亍:种表示方法由出北的第四*(a 0+4*

7、i+j)。这种表示方法由地址的第五种表示 方法演变而来。O o这qa+i),引法将ai斗中的a I优先问题加上括号二维数组元素的地址表示2.二维数组中几个地址的区别如有定义“int a 3 4则a、a 0、&a 0 0都是这些连续存储单元的首地址,但它们的基类型不同,a 0和&a 0 0的基类型为1个整型的存储单元,而a 的基类型为4个整型的存储单元。&3 0 0+1和a 0+1中的1表示1个存储单兀,而 a+1中的1表示4个存储单元(4就是a 3 4中的每行元素 个数),如图8-2所示。aa0&a0 0 a0 0 aO+l&aOlaOl a0 2 a0 3a+1al&alOalOal+l a

8、ll al2 al3a+2a2&a20 a20 a2+l a2l a22 a23图8-2二维数组元素的地址3.用一维数组的指针访问二维数组元素因二维数组元素是连续存储,故可以当一维数组使用。可 以用与一维数组对应的指针访问二维数组元素。如有定义“int a 3 4,*p=a 0;,则p+1 是&a 0 1,*(p+5)就是a 1 1 o还可以给P赋&a 0 0、a 1、a 2,但不能给p 赋a,因为它们的基类型不同。4.专用于二维数组的指针如有定义“int a 3 4,*p 3,(*q)4 则p 0、P 1、P 2和q可理解为是二维数组的指针。uint a 3,*p;中,*p 3的方括号优先,

9、它定义了一个数组P 3,它的三个数组元素均是指针变量,当执行语句 ufor(i=0;i3;i+)p i=a i;后,p i j就是a i j 了uint a 3 4,(*q)4;中,(*q)4的小括号 优先,它定义了一个指针变量q,其基类型为4个整型的存储单 元,当执行语句uq=a;后,q i j就是a i j 了。03I二维数组名和指针数组为实参1.二维数组名作为实参int aMN;fun(a);/调用函数时,指针数组做实参对应的fun函数头部的书写形式为:fun(int sMN)或 fun(int s N)或 fun(int*s)No三种情况中,遮住最右面的N,其余部分与一维数组名作为 实

10、参时的书写形式一致。无论是哪种方式,形参都需开辟一个存储单 元用来接收传来的二维数组的首地址。微课学习任务八二维数组操作_多科成绩统计知3一虑效传搐二维数组名作为实参2.指针数组作为实参int aMN,*pM;for(i=0;i=i,从左上到右下的对角线的元 素下标是i=j,从右上到左下的对角线特征是i+j=M7 o微课学习任务八二维数组操作_多科成绩统计知M-四效传搐二维数组应用二维数组中一些元素的表示二维数组中一些元素的表示2.针对二维数组的操作应用举例82:求二维数组周边元素的平均值。对数组元素搜一遍,遇到周边元素累加并计算。#include stdio.h#include stdlib

11、.h#define M 3#define N 4double fun(int w 口 n)(int i,j,k=O;double ave=0;for(i=0;iM;i+)对二维数组搜一遍,遇到周边元素累加并计数for(j=0;jN;j+)if(i=0|i=M-l|j=0|j=N-l)ave+=w i j;k+;return ave/k;返回平均值)void main()(int a M N,ij;for(i=0;iM;i+)为二维数组元素赋值for(j=0;jN;j+)a i j=rand()%5 0;for(i=0;iM;i+)输出数组(for(j=0;jN;j+)printf(”3d”,a

12、 i j);printf(n nn);)printf(ave=%f nn,fun(a);getchar();)输出:4 1 17 34 019 24 28 812 14 5 4 5 ave=19.5 00000将N行N列的方阵左下三角元素置0,请将程序代码补 充完整。#include stdio.h#include stdlib.h#define N 5void fun(int w N)为数组左下三角元素置0void out(int w N)输出数组void main()int aNNJJ;for(i=0;iN;i+)为二维数组元素赋值for(j=0;jN;j+)aij=rand()%5 0;

13、out(a);输出数组元素fun(a);为左下三角数组元素置0out(a);再次输出数组元素getchar();应用举例8 TM方阵的转置J搜索不包括对角线元素在内的左下三角元素,与对应元素交换,即 与 ajai交换。#include stdio.h#define M 3void arrout(int arrayM)(int i,j;for(i=0;iM;i+)(for(j=0;jM;j+)printf(%3d n,array i j);printf(nn);应用举例8 TM方阵的转置Jvoid fun(int arrayMM)rintfor(i=0;iM;i+)fora=0;ji;j+)内层

14、循环次数用i控制t=arrayij;arrayij=arrayji;arrayji=t;应用举例8 TM方阵的转置Jvoid main()int 2,3,4,5,6,7,8,9,i,j;printf(nprmtl:nn);arrout(a);输出原数组fun(a);调用fun函数实现转置printf(nprmt2:iin);arrout(a);扁出转置后的数组getchar();printl:12 34 5 6 7 8 9 print2 14 72 5 8 3 6 93,将二维数组看做若干个一维数组应用举例8-4:将二维数组每行元素的平均值放在b数组中。将二维数组看做由M个一维数组组成,对每个

15、一维数组做三件事:累加器清零,求和,计算平均值并赋给b数组。#include stdio.h#define M 3#define N 4void fun(int a 口 n,float b 口)(int i,j;float s;for(i=0;iM;i+)i 是行数(s=0;这两句是一维数组的求和运算for(j=0;jN;j+)s=s+a i j;bi=s/N;第i行的平均值赋给bi)void main()(inta M:N=l,2,3,4,5,6,7,8,9,10,ll,12,i,j;float b M;fun(a,b);调用函数将每行元素的平均值放在b数组中for(i=0;iM;i+)输出

16、数组元素和对应的平均值(for(j=0;jN;j+)printf(%3d,a i j);printf(%.2f n,b i);在每行数组元素后输出平均值)getchar();)程序输出:12 34 2.505678 6.509 10 1112 10.50将二维数组每列元素的平 均值放在b数组中。将二维数组每列元素的平均值放在b数组中q#include nstdio.h0#define M 31 I#define N 41 Ivoid fun(int a N,float bN)O口for(j=0;jN;j+)printfr3cT,aij);printf(nn);)for(j=0;jN;j+)pr

17、intf(n%.2f n9bj);getchar();void main()(int aMN=l,2,3,4,5,6,7,8,9,10,U,12,i,j;float bN;fun(a,b);调用画数将每列元素的平均值放在b数组中for(i=0;iM;i+)输出数组元素和对应的平均值任务实施任务多科成绩的统计计算工作内容及要求:单科成绩的统计计算是一维数组的操作,二维数组就是多个一维数 组,将单科成绩的统计计算重复几遍就是对多科成绩的操作,在filel文 件(图8-3)中存放了某班学生的三科成绩(算法、JAVA、数据库),每 一行的数据是一个学生的三科成绩,在主函数中已将成绩读入二维数组a100

18、 3中,学生数小于100,完成以下计算任务。(1)计算每个人的平均分,将各科成绩和平均分写入f1.txt文件中。(2)计算各科成绩的最高分,将各科成绩和最高分写入f2.txt文件。,filel.txt|I叵区文件()编辑区 帮助也)格式)4818244837913028297317145671801161649389779661659131_ _881467V图8-3 fi Ie1文件内容编程训练8-1代码调试。这个任务涉及文件操作的知识,请先将下面的参考/代码在VS环境中调试,调试前要检查在d盘根目录下的1 file1.txt文件是否存在,数据是否符合要求,程序运 卜、行通过后要检查在d盘产

19、生的txt文件内容是否正确。*一知识链接:文件读写知识FILE*fp;定义文件指针if(fp=fopen(ud:fiIe1.txt,)=NULL)/以“读”方式打开d盘filel.txt文件(pr intf(cannot open this f i Ie!n5J);如打开有误,终止程序ex it(0);/*强行终止程序,须包含“stdl ib.h”文件*/#include stdio.h#include”stdlib.hn 调用 exit(O)需包含的文件#define M 100#define N 3int afin(int aMN)/*将文件内容读入数组,函数值为记录个数列 FILE*fp

20、;定义文件指针变量int i=0,n;if(fp=fopen(66d:filel.txt,66r,)=NULL)/*以读方式打开 d 盘根目录mel.txt 文件*/(printf(文件打开错误!n);/若打开有误,终止程序exit(0);强行终止程序)while(!feof(fp)文件指针没到尾(fscanf(fpJ%d%d%(T,&ai0,&ail,&ai2);从文件读数 i+;)fclose(fp);关闭文件n=i;return n;n表示读入的记录个数void afout(int aMN,int n)将数组内容写入文件的函数(FILE*fp;int i;if(fp=fopen(66d:

21、fl.txt,/6w,)=NULL)/*写方式打开d盘根目录下的fl.txt文 件*/(printf(文件写入错误!暧);exit(O);)for(i=0;in;i+)fprintf(fp,n%4 d%4 d%4 dnn,ai0,ail,ai2);向文件写数fclose(fp);)一void aout(int aMN,int n)显示数组内容int i;for(i=0;in;i+)printf(n%4 d%4 d%4 dnM9ai0,ail,ai2);都探二臧螂一感void main()(int aMN,n;n=afin(a);aout(a,n);afout(a,n);getchar();/定

22、义数组和中间变量/将文件内容读入数组/显示数组内容/将数组内容写入文件编程训练8-2计算各科成绩的平均分。计算各科成绩的平均分是一维数组计算平均值 的问题,计算所有人的平均分是二维数组的操作,I 就是对一维数组操作的重复,写出fun1函数,计算a 数组中n个人的平均分,并将平均分依次存入b数组 中。程序的输出结果如图8-4所示。除,I*D:sddDebugsdd.算法JAUA数据结构平均分 匚48 18 24 3Q.00 巍83 79 1 5 4.33 30 28 29 29.00|73 17 14 34.67 56 71 80 69.00|11 61 64 4 5-33|1(9 38 9 1

23、8,6777 96 61 78.00 65 91 3 5 3.00 88 14 67 56.33 111 一,一,O/图8-4编程训练8-2程序的显示结果#include stdio.h#include stdlib.h#define M 100#define N 3int afin(int aMN)/)将文件内容读入数组,函数值为记录个数略void afout(int aMN,int n,double b)将数组内容写入文件的函数(.请参考编程训练8的内容fprintf(fpj算法Java数据结构平均分记);for(i=0;in;i+)fprintf(fp,n%4 d%4 d%4 d%.2f

24、nH,ai0,ail,ai2,bi);fclose(fp);_void aout(int aMN,int n,double b)显示数组内容(int i;printf(“算法Java数据结构平均分iT);for(i=0;in;i+)printf(n%4 d%4 d%4 d%.2fnH,ai0,ail,ai2,bi);void funl(int a 3,int n,double*b)void main()(int aMN,n;定义数组和中间变量double bM;定义存放平均值的数组n=afin(a);将文件内容读入数组计算a数组n行三素的平均值,放在b数组中aout(a,n,b);显示数组内容

25、afout(a9n,b);将数组内容写入文件getchar();I_褊程训练8-3计算各科成绩的最高分。这是对三个数组最大值的问题,请写出 fiin2函数并调试程序,参考输出如图8-5所示图8-5编程训练8-3程序运行后f2.txt文件的内容#include stdio.h#include stdlib.h#define M 100#define N 3int afin(int aMN)将文件内容读入数组,函数值为记录个数略void afout(int aMN,int n,int*c)将数组内容写入文件的函I数fprintf(fp,“算法 Java 数据结构n”);for(i=0;in;i+)

26、fprintf(fp/6%4 d%4 d%4 dn,ai0,ail,ai2);fprint(fp,“最高分分”);for(i=0;iN;i+)fprint(fp/6%4 dw,ci);fclose(fp);_void aout(int aMN,int n,int*c)显示数组内容(int i;printf(“算法Java数据结构平均分n);for(i=0;in;i+)printf(66%4 d%4 d%4 dnn,ai0,ail,ai2);printf(最高分:n”);for(i=0;iN;i+)printf(n%4 dn,ci);)void fun2(int aN,int n9int*c)v

27、oid main()(int aMN,n;int cN;n=afin(a);fun2(a,n,c);aout(a,n,c);afout(a,n,c);getchar()定义数组和中间变量定义存放最高分的数组将文件内容读入数组招a数组记录的n个最高分放入c数组显示数组内容将数组内容写入文件编程训练8-4程序挑错。下面这段程序代码是计算最高分的,编译没 错,但是结果不对,显示如图8-6所示,请指出 其中的错误。*.11*D:sddDeb.算法数据结构 匚图8-6编程训练8-4程序的执行结果#include stdio.h#include stdlib.h#define M 100#define N

28、 3void fun2(int a 3,int n,double*c)(int i,j,m;for(i=0;iN;i+)(m=a0i;for(j=l;jM;j+)if(maji)m=aji;ci=m;)void main()(FILE*fp;int aMN;double cN;int i=0,j,n;定义文件指针变量if(fp二fopen(“d:fflel.txt”,r)=NULL)/*读方式打开 d 盘根目录 filel.txt文件力(printf(文件打开错误!n);若打开有误,则终止程序exit(O);)while(!feof(fp)文件指针没到尾(fscanf(fp/6%d%d%d,&

29、ai0,&ail,&ai2);i+;)fclose(fp);关闭文件n=i;是记录数fun2(a,n,c);printf(算法Java数据结构n);for(i=0;in;i+)输出各科分数和对应的平均分(for(j=0;jN;j+)printf(H%4 dH,aij);printf(niin);printf(最高分:n);for(i=0;iN;i+)printf(H%4 dH,ci);if(fp=fopend:f2.txt”Jw)=NULL)以写方式打开d盘根目录下的f2.txt文件(printfC文件写入错误!暧);exit(O);)fprintf(fp J 算法 Ja va 数据结构 n”);for(i=0;in;i+)将各科成绩和平均分写入文件(for(j=0;jN;j+)fprintf(fp9n%4 dM,aij);fprintf(fp,nn);fprintf(fpj 最高分八n);for(i=0;iN;i+)fprintf(fp,n%4 d n,c i);fclose(fp);getchar();第一处错误:第二处错误:祝你进步!谢谢!

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 语言学

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服