1、数据结构课程设计多维数组班级学号学生姓名提交日期2017年1月12日成 绩 计算机与通信工程学院目录第一部分 需求分析1.1程序设计的任务21.2程序达到的功能21.3程序功能模块图和流程图21.4测试数据3第二部分 详细设计2.1用到的数据类型和数据结构定义42.2各个函数的基本操作和功能42.3各个函数的调用关系52.4主程序思路5第三部分 调试分析3.1遇到的问题及解决过程63.2设计过程中学到的知识73.3经验与体会7第四部分 用户手册4.1每一步骤的注释说明74.2整体思路7第五部分 测试结果5.1测试结果85.2附录-程序源码9第一部分 需求分析1.1程序设计的任务1.1.1问题描
2、述设计并模拟实现整型多维数组类型。1.1.2 基本要求设计并模拟实现多维数组类型。整型多维数组应具有以下基本功能: (1) 定义整型多维数组类型,各维的下标是任意整数开始的连续整数。 (2) 下标变量赋值,执行下标范围检查。 (3) 同类型数组赋值。 (4) 子数组赋值,例如 ,a1.n=a 2.n+1;a2.43.5=b1.32.4。 (5) 确定数组的大小。1.1.3选作内容 (1) 各维的下标是任意字符开始的连续字符。 (2) 数组初始化。 (3) 可修改数组的下标范围。1.2程序达到的功能 (1) 定义整型多维数组结构体,并定义各维的的结构体。 (2) 下标变量赋值。 (3) 同类型数
3、组赋值,不同类型赋值时检查出错误。 (4) 子数组赋值,例如 a1.n=a 2.n+1;a2.43.5=b1.32.4。 (5) 确定数组的大小。 (6) 数组初始化。 (7) 可修改数组的下标。1.3程序功能模块图和流程图图1 程序功能模块图图2. 程序流程图1.4 测试数据多维数组a:三维;下标1*22*33*5;赋值:1 2 3 4 5 6 7 8 9 10 11 12多维数组b:两维;下标1*22*3;赋值:1 2 3 4多维数组c;三维;下标2*33*44*6;赋值:2 3 4 5 6 7 8 9 10 11 12查找下标:a234,a135;替换值为原数值的复制,例如6改为66修改
4、第2维的下标,保证原来数组个数不变第二部分 详细设计2.1 用到的数据类型和数据结构定义2.1.1第几维数组的结构体定义typedef structElemType lower; /定义每维数组的下界 ElemType upper; /定义每维数组的上界int boundnum; /定义每维数组中元素的个数 Boundi; /定义第i维数组2.1.2 多维数组结构体的定义typedef structint dim; /定义多维数组的维数 Boundi boundMAXDIM; /定义第i维数组int total; /定义数组中元素的个数 int elemMAXTOTAL; /数组中每个元素的地
5、址,其中elem0为该多维数组的基址NArray; /定义多维数组2.2各个函数的基本操作及功能2.2.1 NArray CreatArray();多维数组创建并初始化函数2.2.2 int Replace(NArray &A,NArray &B);两个数组复制的函数2.2.3 void AdjustBound(NArray &A);修改下标的函数2.2.4 void FindSwap(NArray &A);查找并替换的函数2.2.5 void PrintArray(NArray A);打印输出函数2.2.6 int main();主函数图3.程序子函数主函数截图2.3 各个函数之间的调用关系
6、图4. 各个函数之间的调用关系2.4 主程序思路图5.主程序思路流程图第三部分 调试分析3.1 遇到的问题及解决过程3.1.1、在replace函数(即数组替换函数)中,当执行替换循环时,代码如下:for(i=0;iA.total;i+)B.elemi=A.elemi; /把多维数组A赋值给B cout*赋值成功*endl; return 0;把return 0;放到了for循环里了。结果只a数组中只把第一个元素赋值给了c数组里,其他的元素仍没有替换。3.1.2、在findswap函数中,给定数组下标求地址映像时遇到了困难,原因还是由二维数组类比到三维数组及多维数组出现了问题。三维数组可以想象
7、成空间的数组,又由于c+中按行存储,所以举了个例子: A223的三维数组,求A221的地址,23(2-1)+3(2-1)+1=10。公式为书上的公式: LOC(j1,j2,*,jn)=LOC(0,0,*,0)+(b2*bnj1+b3*bnj2+*+bnjn-1+jn)L。其中n维数组的映像函数。bn代表第i维数组元素的个数。可缩写成LOC(j1,j2,*,jn)=LOC(0,0,*,0)+i=0nci*ji。3.2 设计过程中学到的小知识3.2.1、当输出结果中想调用数据时,即既想有输出的原文字又有想调用的数据时。可以用 将想调用的部分给包含起来。我也是在网上搜集资料偶然发现的。具体例子就是输
8、出函数PrintArray中的输出部分。如下截图中划线的部分:3.3 经验与体会 经过这次课设我意识到虽然数据结构课程已经结束,但是数据结构的学习还远远没有结束,作为计算机专业的学生,应当学好数据结构的知识点,把专业知识打牢。同时应当动手做一些程序设计的习题,虽然刚上手的时候有点难,只要肯钻研下去,到问题解决的时候觉得自己收获还是挺大的。同时也是为了巩固自己数据结构的实习。我以后还会挑一些题做的。第四部分、 用户手册4.1每一步骤的注释说明注释说明已包含在源程序中,请详见附录中的程序代码,在此不再赘述。4.2 整体思路 我实现程序的功能的时候是把要求分成了几个功能函数,然后逐一的通过主函数调用
9、功能函数,来判别自己的功能函数是否正确,而不是从前写到后一下写完的。我觉得一个功能一个功能的实现更简单些,而且出错了容易查错。具体思路在前面都已经描述,在此不再赘述。第五部分、测试结果5.1 测试结果截图5.2 程序源码#include using namespace std;#define MAXDIM 5 /定义数组的最大维数 #define MAXNUM 10 /定义每维数组的最大个数 #define MAXTOTAL 100 /定义数组元素的最大个数typedef int ElemType;typedef structElemType lower; /定义每维数组的下界 ElemTyp
10、e upper; /定义每维数组的上界int boundnum; /定义每维数组中元素的个数 Boundi; /定义第i维数组typedef structint dim; /定义多维数组的维数 Boundi boundMAXDIM; /定义第i维数组int total; /定义数组中元素的个数 int elemMAXTOTAL; /数组中每个元素的地址,其中elem0为该多维数组的基址NArray; /定义多维数组 NArray CreatArray() /创建一个多维数组并初始化 int total=1;int n,i,j;NArray A; /定义多维数组A coutn; if(n5)co
11、ut超过数组的维数上限 请重新输入:n; A.dim=n;cout请输入每维数组的上下界:endl;for(i=1;i=A.dim;i+)cout请输入第iA.boundi-1.lower;coutA.boundi-1.upper;A.boundi-1.boundnum=A.boundi-1.upper-A.boundi-1.lower+1;total=total*A.boundi-1.boundnum; A.total=total; /统计出来数组中元素的个数for(i=0;itotal;i+)A.elemi=0;coutj;switch(j)case 1:cout请以行序输入A.total
12、个元素endl;for(i=0;iA.elemi;/输入多维数组的元素 case 0:;/不执行操作,创建一个全为0的多维数组 cout*创建多维数组成功* endl;return A; int Replace(NArray &A,NArray &B) /数组替换函数 int i;if(A.dim!=B.dim)cout*这两个数组不是同类型的*endl; /判断两个数组的维数是否相同 return 0; for(i=1;i=A.dim;i+)if(A.boundi-1.boundnum!=B.boundi-1.boundnum)cout*这两个数组不是同类型的*endl; /判断两个数组各维
13、的元素的个数是否相同 return 0; for(i=0;iA.total;i+)B.elemi=A.elemi; /把多维数组A赋值给B cout*赋值成功*endl; return 0;void AdjustBound(NArray &A) /修改数组的下标int n;coutn;coutA.boundn-1.lower;cinA.boundn-1.upper;A.boundn-1.boundnum=A.boundn-1.upper-A.boundn-1.lower+1;cout修改后的第n维元素的个数为:A.boundn-1.boundnumendl; void FindSwap(NAr
14、ray &A) /查找替换函数 int i,temptotal=1,sum=0,j;int aMAXDIM;cout请输入你所查找的元素的下标:; for(i=0;iai;for(i=0;iA.dim;i+)temptotal=ai-A.boundi.lower;/给定数组下标的求映像地址的计算公式。举个例子A223的三维数组,求A221的地址,2*3*(2-1)+3*(2-1)+1=10。公式为书上的公式 for(j=i+1;jA.dim;j+)temptotal=temptotal*A.boundj.boundnum;sum=sum+temptotal;cout数组NArray;for(i
15、=0;iA.dim;i+)coutai;cout的值为:elemsum=A.elemsum 找到了目标值endl;couti;if(i=1)cout请输入替换值j;A.elemsum=j;cout替换后的数组为:endl;for(i=0;iA.total;i+)coutA.elemi ; coutendl;void PrintArray(NArray A) /输出数组有关信息的函数 int i,j;cout这是一个A.dim维数组NArray ;for(i=1;i=A.dim;i+)coutA.boundi-1.lowerA.boundi-1.upper;cout该数组的元素的个数为:A.to
16、tal ;cout数组为: endl;for(i=0;iA.total;i+)coutA.elemi ;coutendl;int main()int m;NArray a,b,c;a=CreatArray(); /1、创建并初始化数组aPrintArray(a);b=CreatArray(); /创建并初始化数组b PrintArray(b);coutm;if(m=1)Replace(a,b); /5.1将a赋值给b 同类型的数组赋值 成功 PrintArray(b); c=CreatArray(); /创建并初始化数组c PrintArray(c);coutm;if(m=1)Replace(a,c); /5.2 将a赋值给c 不同类型的数组赋值 不成功 PrintArray(c); FindSwap(a); /4、查找和替换数组中的具体元素 FindSwap(a);AdjustBound(a); /2、修改数组a的第二维上下界 PrintArray(a);return 0;14 / 15