数据结构课程设计Word文件下载.docx
- 文档编号:16548354
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:18
- 大小:139.85KB
数据结构课程设计Word文件下载.docx
《数据结构课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
●把这个数组中的每一位数字单独来进行乘法运算,比如我们可以用一个数字和另外一个数组中的每一位去相乘,从而得到乘法运算中一行的数字,再将每一行数字错位相加。
这就是乘法运算的过从低位往高位依次计算,同时确定每一列的项数,确定每一位上的结果存入数组c[]中.
●找到最高位在数组中的项c[i],然后依次输出各位上的数值
●通过主函数来调用其它各个函数。
3、数据结构设计
由于整型数据存储位数有限,因此引入串的概念,将整型数据用字符串进行存储,利用字符串的一个字符存储大整数的一位数值,然后根据四则运算规则,对相应位依次进行相应运算,同时保存进位,从而实现大整数精确的运算。
4、功能函数设计
●字符串转成数字函数getdigits()
将在数组中保存的字符串转成数字存到int数组中。
首先求字符串长度,然后将字符串数组中的字符取出,使用字符-‘0’的方法,将字符转成整数,最后逆序保存在整型数组中
●逐位相乘函数multiply()
将数组a与数组b逐位相乘以后存入数组c。
数组a中的每位逐位与数组b相乘,并把结果存入数组c,比如12345*12345,a中的5与12345逐位相乘,对于数组c:
c[i+j]在i=0,j=0,1,2,3,4时存的是5与各位相乘的结果,而在i=1,j=0,1,2,3,4时不光会存4与各位相乘的结果,还会累加上上次相乘的结果,最后将十位上的数向前进位,并加上原来这个位上的数,将剩余的数存原来的位置上。
●主函数main()
分别定义3个整型数组急2个字符数组,然后输入乘数与被乘数,接着调用上述两个函数,最后输出结果。
5、编码实现
#include<
stdio.h>
stdlib.h>
string.h>
#defineN100
/*将在数组中保存的字符串转成数字存到int数组中*/
voidgetdigits(int*a,char*s)
{
inti;
chardigit;
intlen=strlen(s);
//求字符串长度
for(i=0;
i<
N;
++i)//对数组初始化
a[i]=0;
len;
++i)
{
digit=s[i];
a[len-1-i]=digit-'
0'
;
/*字符串s="
12345"
因此第一个字符应该
存在int数组的最后一个位置*/
}
}
/*将数组a与数组b逐位相乘以后存入数组c*/
voidmultiply(int*a,int*b,int*c)
inti,j;
2*N;
++i)
c[i]=0;
//数组初始化
for(j=0;
j<
++j)
c[i+j]+=a[i]*b[j];
/*
*这里是移位、进位
*/
2*N-1;
c[i+1]+=c[i]/10;
//将十位上的数向前进位,并加上原来这个位上的数
c[i]=c[i]%10;
//将剩余的数存原来的位置上
intmain()
inta[N],b[N],c[2*N];
chars1[N],s2[N];
intj=2*N-1;
printf("
请输入第一个数:
"
);
scanf("
%s"
s1);
\n请输入第二个数:
s2);
getdigits(a,s1);
getdigits(b,s2);
multiply(a,b,c);
\n两数之积:
while(c[j]==0)
j--;
if(j==-1)
j++;
for(i=j;
i>
=0;
--i)
%d"
c[i]);
\n"
return0;
6、运行结果
二、课程设计题目
(二)
构造n个城市连接的最小生成树
1、问题描述
给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立
最小生成树,并计算得到的最小生成树的代价。
:
●城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。
要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。
●表示城市间距离网的邻接矩阵(要求至少6个城市,10条边)
●该程序的主要功能:
能实现根据输入城市的信息可以判断该城市间的距离网是否构成最小生成树,遍历城市生成最小生成树,通过计算得到最小生成树的代价。
●该城市间的距离网用邻接矩阵表示
●用克鲁斯卡尔(Kruskal)算法建立最小生成树
3、数据结构定义
前面提到,要用到Kruskal算法,这是因为可以构造一个结构体,把两个城市可以看成起点和终点,之间的道路可以看成一个边。
具体结构定义如下:
typedefstructnode
{
intstr;
/*起点*/
intend;
/*终点*/
intdis;
/*距离*/
}node;
4、系统功能模块介绍
●能实现根据输入城市的信息可以判断出该城市间的距离网是否构成最小生成树,遍历城市生成最小生成树,通过计算得到最小生成树的代价。
该程序的模块结构功能图及主要函数如下:
●该城市间的距离网使用邻接矩阵表示,邻接矩阵存储方法(数组存储方法),利用两个数组来存储一个图。
用a[i][j]数组,利用邻接矩阵方式来储存城市与城市间信息。
5、程序清单
●intmain()//主程序
●intmenu()//菜单函数
●voidcreate()//输入城市信息函数
●voidjudge()//判断是否能够生成最小生成树函数
●voiddisplay()//打印输出
●voidset()//初始化pre[],rank[]函数
●voidfind()//判断是否构成回路函数
●voidUnion()//将能构成最小生成树的边添加到一个集合
●voidKrushal()//克鲁斯算法求最小生成树
6、运行及调试
●开始画面
●输入信息
设置两顶点之间无边时∞权值为10000
●数据处理
(1)、判断能否构成最小生成树
(2)、遍历所有城市生成最小生成数
16
115
6
18
生成的最小生成树
●退出
7、源代码
#definemax20
#defineMAX_LNT10
typedefstructnode/*构造一个结构体,两个城市可以看成起点和终点,之间的道路可以看成一个边*/
intstr;
nodep[max],temp;
/*p记录城市信息*/
intpre[100],rank[100];
/*用于判断是否构成回路*/
intn=0,arcs[MAX_LNT][MAX_LNT];
/*n表示城市个数,arcs[][]记录城市间权值*/
intmenu()/*菜单函数*/
intm;
..........................2013年6月18日......................\n\n"
求最小生成树\n"
________________________________\n\n"
1输入城市之间的信息\n"
2判断是否能构成一个最小生成树\n"
3遍历所有城市生成最小生成树\n"
4退出\n"
请输入所选功能1-4\n"
system("
colorE"
/*改变界面颜色的,对程序没什么影响*/
&
m);
returnm;
}
/*下面三个函数作用是检验当一条边添加进去,是否会产生回路*/
voidset(intx)/*初始化*/
{
pre[x]=x;
rank[x]=0;
intfind(intx)/*找到这个点的祖先*/
if(x!
=pre[x])
pre[x]=find(pre[x]);
returnpre[x];
voidUnion(intx,inty)/*将这两个添加到一个集合里去*/
x=find(x);
y=find(y);
if(rank[x]>
=rank[y])
pre[y]=x;
rank[x]++;
elsepre[y]=x;
voidKruskal()
intans=0,i,j,k=0;
/*ans用来记录生成最小树的权总值*/
intindex;
intcount=0;
/*记录打印边的条数*/
for(i=1;
i<
=n;
i++)/*初始化数组pre[x],rank[x]*/
set(i);
i++)
{
for(j=i+1;
j<
j++)
{
p[++k].str=i;
p[k].end=j;
p[k].dis=arcs[i][j];
/*先把所有城市之间的路段看成一个边*/
}
}
for(i=1;
i<
=k;
i++)/*把所有的边按从小到大进行排序*/
index=i;
for(j=i+1;
j<
j++)if(p[j].dis<
p[index].dis)index=j;
temp=p[index];
p[index]=p[i];
p[i]=temp;
=k;
if(find(p[i].str)!
=find(p[i].end))/*如果这两点连接在一起不构成一个回路,则执行下面操作*/
{
printf("
\t第%d条路段为:
%d--%d,权值为%d\n"
++count,p[i].str,p[i].end,p[i].dis);
/*将这条边的起点、终点打印出来*/
ans+=p[i].dis;
/*说明这条路段要用*/
Union(p[i].str,p[i].end);
printf("
\t遍历所有城市得到最小生成树的代价为:
%d\n\n"
ans);
voidcreate()/*输入城市信息*/
inti,j;
请输入城市的个数:
scanf("
n);
输入%d个城市的邻接矩阵:
n);
for(j=1;
arcs[i][j]);
voiddisplay()/*显示生成的最小生成树*/
if(n==0)
这里没有城市之间的信息\n"
return;
遍历所有城市得到最小生成树为:
\n\n\n"
Kruskal();
voidjudge()/*判断是否能够生成最小生成树*/
intclose[100],low[100],i,j,ans=0;
/*close[j]表示离j最近的顶点,low[j]表示离j最短的距离*/
intuse[100];
use[1]=1;
for(i=2;
low[i]=arcs[1][i];
/*初始化*/
close[i]=1;
use[i]=0;
for(i=1;
n;
intmin=100000000,k=0;
for(j=2;
if(use[j]==0&
&
min>
low[j])/*找到最小的low[]值,并记录*/
min=low[j];
k=j;
if(use[j]==0&
low[j]>
arcs[k][j])
low[j]=arcs[k][j];
/*修改low[]值和close[]值*/
close[j]=k;
ans+=arcs[close[k]][k];
if(ans>
=100000000)printf("
不能构成最小生成树\n"
elseprintf("
能构成最小生成树\n"
intmain()/*主函数*/
while
(1)
switch(menu())
case1:
create();
break;
/*输入城市信息*/
case2:
judge();
/*判断是否能够生成最小生成树*/
case3:
display();
/*显示生成的最小生成树*/
case4:
exit(0);
}
三、课程设计总结
一周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。
在设计过程中,和同学们相互探讨,相互学习,相互监督。
我学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世,这次课程设计对我来说受益良多。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.“千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计