数据结构课程设计报告(四维数组应用)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告
(原创)
设计题目:数组应用
专业
班级
学生
学号
指导教师
时间
目录
一、设计任务 (3)
二、软件环境 (4)
三、程序源代码 (4)
四、算法设计思想及流程图 (11)
4.1算法设计思想 (11)
4.2流程图 (13)
4.2.1主要功能模块流程图 (13)
4.2.2输入函数流程图 (13)
4.2.3输出函数流程图 (14)
4.2.4查找函数流程图 (15)
五、输入及相应运行结果 (16)
六、收获及体会 (19)
七、参考文献 (20)
八、附录(部分截图) (21)
一、设计任务
题目:数组应用
功能:按照行优先顺序将输入的数据建成4维数组,再按照列优先顺序输出结果,给出任意处的元素值,并给出对应的一维数组中的序号。
分步实施:
1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;
2.完成最低要求:完成第一个功能;
3.进一步要求:进一步完成后续功能。
有兴趣的同学可以自己扩充系统功能。
要求:1)界面友好,函数功能要划分好
2)总体设计应画一流程图
3)程序要加必要的注释
4)要提供程序测试方案
5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
二、软件环境
V C ++6.0
三、程序源代码
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define M 100
typedef struct
{
int data;
int wei[4];
}node;
typedef struct
{
node dat[M];
int max_meiwei[4];//每维的长度
int m;
}shu;
void menu(shu *G);
void input(shu *G);
void output(shu *G);
void find(shu *G);
void introduce(shu *G); //函数声明
/***********************************************************/
void input(shu *G)// 输入按行
{
int i,j,k,l,h,b,n;
G->m=1;
for(i=0;i<4;i++)//依次输入第一、二、三、四维的长度
{
printf("\t\t\t请输入第%d维的长度:",i+1);
scanf("%d",&G->max_meiwei[i]);
G->m*=G->max_meiwei[i]; //维数长度积即为数据个数}
n=0;
for(i=0;i<G->max_meiwei[0];i++)//坐标
{
for(j=0;j<G->max_meiwei[1];j++)//初
{
for(k=0;k<G->max_meiwei[2];k++)//始
{
for(l=0;l<G->max_meiwei[3];l++)//化
{
G->dat[n].wei[0]=i;
G->dat[n].wei[1]=j;
G->dat[n].wei[2]=k;
G->dat[n].wei[3]=l;
n++;
}
}
}
}
for(n=0;n<G->m;n++)//依次输入各个结点的坐标值
{
printf("\t\t\t请输入A[");
for(b=0;b<4;b++)
{
printf("%d,",G->dat[n].wei[b]);
}
printf("\b]的值\n");
scanf("%d",&G->dat[n].data);
}
system("pause");
menu(G);
}
/*******************************************************/
void output(shu *G)// 输出按列优先顺序
{
int i,j,b,k,l,h,n;
for(i=0;i<G->max_meiwei[3];i++) //先固定第四维,而后由里到外依次输出
{
for(j=0;j<G->max_meiwei[2];j++)
{
for(k=0;k<G->max_meiwei[1];k++)
{
for(l=0;l<G->max_meiwei[0];l++)
{
printf("\t\t");
for(h=0;h<G->m;h++)
{
if(G->dat[h].wei[3]==i && G->dat[h].wei[2]==j && G->dat[h].wei[1]==k && G->dat[h].wei[0]==l)
{
printf("\t%d",G->dat[h].data);
}
}
}
printf("\n");
}
}
}
printf("\n");
system("pause");
menu(G);
}
/*******************************************************/
/*******************************************************/
void find(shu *G) // 给出任意元素值输出对应的一维数组所在的位置{
int i,a,k=0,j;
system("cls");
printf("\n\n\t\t\t 请输入所查值:");
scanf("%d",&a);
for(i=0;i<G->m;i++)
{
if(a==G->dat[i].data) //逐个比较,找出数组中和所给值相等的数
{
printf("\n\t\t\4 \4 \4 \4 \4 \4 \4 \4 \4 \4 \4 \4 \4 \4 \\4 \4");
printf("\n\t\t\t对应第一维位置为:%d\n",i);
printf("\t\t\5 \5 \5 \5 \5 \5 \5 \5 \5 \5 \5 \5 \5 \5 \5 \5\n");
k=1;
}
}
if(k==0)
{
printf("\n\t\t\t~~~~(>_<)~~~~ 对不起,您所查询的数不存在!~~~~(>_<)~~~~ \n");
printf("\n\t\t\t继续1\n\t\t\t返回2\n\t\t\t请选择:");
scanf("%d",&j);
if(j==1)
{
find(G);
}
else if(j==2)
{
menu(G);
}
}
system("pause");
menu(G);
}
/*******************************************************/ void menu(shu *G)//菜单
{
int i;
system("cls");
system("color 9a");
printf("\t\t\n\n\n\n\n\n");
printf("\t\t\n");
printf("\t\t╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬\n"); printf("\t\t║**************************************║\n"); printf("\t\t╬* WELCOME *╬\n"); printf("\t\t║**************************************║\n"); printf("\t\t╬* *╬\n"); printf("\t\t║* *║\n"); printf("\t\t╬* ☆输入(press 1) *╬\n"); printf("\t\t║* ★输出(press 2) *║\n"); printf("\t\t║* ☆查找(press 3) *║\n"); printf("\t\t╬* ★退出(press 0) *╬\n"); printf("\t\t║* *║\n"); printf("\t\t║**************************************║\n"); printf("\t\t╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬\n"); printf("\t\t\t请选择");
printf("\n\t\t\t");
scanf("%d",&i);
switch(i)
{
case 1: input(G);
break;
case 2: output(G);
break;
case 3: find(G);
break;
case 0:
{
system("cls");
printf("\n\n");
printf("\t\t \n");
printf("\t\t\n");
printf("\t\t (.@.@) \n");
printf("\t\t+-------oOOo-----(_)-----oOOo---------+\n");
printf("\t\t||\n");
printf("\t\t|再见! 谢谢使用!! |\n");
printf("\t\t||\n");
printf("\t\t+----------oooO-------Oooo--------------+\n");
printf("\n\n");
exit(0);
break;
}
default:
menu(G);
break;
}
}
/*******************************************************/
/*******************************************************/
void introduce(shu *G)
{
int i;
system("cls");
printf("\n\n\n\n\t\t ☆此系统的功能有☆\n\n");
printf("\t\t★按照行优先顺序将输入的数据建成4维数组\n\n");
printf("\t\t★按照列优先顺序输出\n\n");
printf("\t\t★给出任意处的元素值,查询相应的一维数组的序号
\n\n");
printf("\n\n\n\t\t按1返回\n");
printf("\n\n\t\t按0退出\n");
scanf("%d",&i);
if(i==1)
{
menu(G);
}
else if(i==0)
{
exit(0);
}
}
/*******************************************************/
main()
{
int i,j=1;
shu *G;
G=(shu *)malloc(sizeof(shu)); //开辟一段空间
while(j) //利用j来实现while循环
{
system("cls");
system("color 9e");
printf("\n\n\n");
printf("\t\t┏━━━━━━━━━━━━━━━━━━━┓\n"); printf("\t\t┃* * * * * * * * * * * * * * * * * * * ┃\n"); printf("\t\t┃* ※欢迎使用数组应用系统※* ┃\n"); printf("\t\t┃* * * * ** * * * * * * * * * * * * * * ┃\n"); printf("\t\t┃* * ┃\n"); printf("\t\t┃* * ┃\n"); printf("\t\t┃* ☆☆☆☆☆☆☆☆* ┃\n"); printf("\t\t┃* ★★★★★* ┃\n");
printf("\t\t┃* ☆☆☆☆* ┃\n"); printf("\t\t┃* ★★★★* ┃\n"); printf("\t\t┃* ☆☆☆☆* ┃\n"); printf("\t\t┃* ★★★★* ┃\n"); printf("\t\t┃* ☆☆☆☆* ┃\n"); printf("\t\t┃* ★★★★* ┃\n"); printf("\t\t┃* ☆☆* ┃\n"); printf("\t\t┃* * ┃\n"); printf("\t\t┃* * * * * * * * * * * * * * * * * * * ┃\n");
printf("\t\t┗━━━━━━━━━━━━━━━━━━━┛\n"); printf("\n\t\t\t\3\3\3\3\3\3\3\3\3 简介 1 \3\3\3\3\3\3\3"); printf("\n\n\n\t\t\t\3\3\3\3\3\3\3\3\3 登录 2 \3\3\3\3\3\3\3"); printf("\n\n\n\t\t\t\3\3\3\3\3\3\3\3\3 退出 3 \3\3\3\3\3\3\3"); printf("\n\t\t\t请选择:");
scanf("%d",&i);
switch(i){ //case语句,控制输入情况case 1:
j=0;
introduce(G);break;
case 2:
j=0;
menu(G);break;
case 3:
j=0;
exit(0);
default:
printf("输入有误,请重新输入"); //增强程序健壮性
j=1;
}
}
return 0;
}
四、算法设计思想及流程图
4.1 算法设计思想
首先,在定义四维数组的数据类型时,我选择了整型以方便编程及利于数据的输入和输出。
为了实现任务所要求的功能,我将程序划分为三类:功能函数,界面函数以及主函数。
另外,其中的功能函数包括以下几种函数:四维数组元素输入函数、四维数组元素输出函数、元素查找函数、功能介绍函数以及主函数。
对于四维数组输入函数,我通过四个for循环语句先对数组的坐标进行初始化,并输入各个维的长度。
然后,再利用一个for循环输入各个元素值。
输入时,先固定第一维,然后依次输入各个结点的元素值。
对于思维数组输出函数,我也是通过多重for循环进行元素值的输出。
先固定第四维,然后依次输出各个结点的元素值。
对于元素查找函数,就比较简单了。
就是依次对四维数组中的元素值进行比对,如果所查找的元素与数组中的元素值相同,则输出该元素所在的一维编号即可。
界面函数包括欢迎界面以及选择菜单界面,包括在完成某些操作后循环出现的选择界面。
出于对界面更加友好的考虑,我适当的装饰了一下界面,并采用了DOS系统的清屏命令以及暂停函数,这样就使得界面更加的清晰、简洁,便于使用。
在主函数里,我先输入了欢迎界面,然后进入系统选择菜单,最后在退出该系统时,还设置了欢送界面,使得该系统更加的人性化。
4.2 流程图
4.2.1主要功能模块流程图
4.2.2数组输入函数流程图
4.2.3数组输出函数流程图
4.2.4查找函数流程图
五、输入及相应运行结果
第一组:
一二三四维数分别为2,2,2,2,
行优先输入16个数:
1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16
列优先输出相应结果:
1 9
5 13
3 11
7 15
2 10
6 14
4 12
8 16
查找元素16:对应的一维位置为15
第二组:
一二三四维数分别为2,2,2,2:
行优先输入16个数:
5,3,4,7,11,3,9,10,8,5,5,7,40,21,31,22 列优先输出相应结果:
5 8
11 40
4 5
9 31
3 5
3 21
7 7
10 22
查找元素7:对应的一维位置为3,11
六、收获及体会
通过数据结构的课程设计,我学到了许多,并将这些知识应用于实践中,进一步锻炼了自己的动手能力。
当然,也会出现一些问题。
总结如下:
1、对于出现的调试错误要仔细分析错误的原
因,根据错误提示,按照自顶向下的程序设
计原则,逐个进行排错。
只要够细心,就一
定能够找到错误的所在。
2、程序的易操作性很重要,也就是要有一个足
够友好的界面。
基于这一点,我设计了自己
程序的人机对话界面,通过一个个选项来完
成各种操作,大大增强了程序的易用性。
3、编程过程中加入必要的注释是很重要的,这
不仅时为了别人能更容易的看懂你的源程
序,更重要的是方便自己未来的修改。
因为
程序源代码一多,自己未必能够十分清楚变
量及函数的作用。
此时,加必要的注释,就
能帮助自己变量及函数的含义,而不是从头
理解,提高了工作的效率。
4、要善于利用各种资源,以此提高自己编程的
效率。
否则,就会花费许多无谓的时间在不
必要的事情上面。
5、编写的程序要通俗易懂,比如变量与函数的
定义要尽量做到见名知义。
七、参考文献
1、谭浩强编著 C程序设计(第四版)
清华大学出版社 2010.01
2、严蔚敏编著数据结构(C语言版)
清华大学出版社 1997.04
3、网络资源
八.部分截图。