数据结构课程设计 3Word文件下载.docx
《数据结构课程设计 3Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 3Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
大数相乘
目录:
系统功能分析……………………………………………………………………………3
基本要求……………………………………………………………………………..…3
功能需求…………………………………………………………………………..……3
开发工具………………………………………………………………………………3
程序说明…………………………………………………………………………….…3
大数相乘总括…………………………………………………………………………4
源程序………………………………………………………………………………………4
测试与结论………………………………………………………………………………5
创新及难点……………………………..………………………….………………………6
程序设计总结心得体会……………………………………………………………………6
2011-6-9
正文内容如下:
一、系统功能分析
功能分析:
大数相乘可以实现对两个任意大的正数相乘。
用户可以通过本程序对无法实现的两数进行相乘,其意在方便用户,方便群众。
二、1编写基本目的要求:
分析程序开发过程的具体问题,构架程序的功能,同时使该程序的使用者对本程序有一定的了解,为实现功能的编码做好基础,对数据结构有一个更深入的了解。
1、背景:
a.开发的软件系统的名称:
大数相乘。
b.本项目的任务提出者汤亚玲;
开发者:
陈浩。
2、功能需求:
根据大数相乘的实际需求,分析系统应该设计的功能,其中应该包括对于超过整型大数的输入,存储,运算,输出。
实现乘法的一般功能。
3、数据需求:
运行环境及知识要求:
运行环境要求:
windowsxp/visita/7
知识要求:
1熟悉vc++6.0编译系统
2熟悉AISCC
3熟练掌握字符与数字之间的转换
4﹑分析及实现简介:
由于大数相乘问题相对简单,我只写了一个主函数实现了其功能。
大数用字符数组存储,用AISCC数字之间转换进行运算。
二、程序的说明:
首先定义两个字符数组存储两个大数,在定义两个数组,一个用与保存结果,另一个为辅助只用,具体的思想是ab两个大数用b的个位一次乘a的每一位结果保存在辅助数组temp中,在进位取余得到正常的10进制数,用sum数组的temp的求和,用flag标记,以便temp的错位相加。
用while可以控制大数运行的次数。
三、模块分析及源程序:
/////////////////////////////////////////////////////////////////////
/*大数相乘问题*/
////////////////////////////////////////////////////////////////////
#include<
stdio.h>
string.h>
#defineMAX10000
intmain()
{
intn,i,j,t,s;
chara[100],b[100],temp[105]={0},sum[MAX]={0};
/*定义两个字符数组a,b用来存储大数temp为辅助*/
intlena,lenb,flag,m=0;
printf("
输入运算的次数n:
\n"
);
scanf("
%d"
&
n);
/*输入运算的次数n*/
while(n--)
{m++;
flag=0;
/*设置标志flag*/
printf("
输入将要运算的两数a,b;
用回车键相分隔\n"
scanf("
%s%s"
a,b);
/*输入两要相乘的大数用回车键相分隔*/
lena=strlen(a);
lenb=strlen(b);
/*求两数的长度*/
for(j=lenb-1;
j>
=0;
j--)
{
for(t=lena,i=lena-1;
i>
i--,t--)
{
temp[t]=(a[i]-48)*(b[j]-48);
/*依次从低位开始求的b的某一位与a的乘积*/
}
for(t=lena;
t>
=1;
t--)
{
if(temp[t]>
9)
{
temp[t-1]+=temp[t]/10;
temp[t]%=10;
/*进位取余*/
}
}
for(s=lena+lenb-flag,t=lena;
t--,s--)/*标志flag确保错位相加*/
sum[s]+=temp[t];
temp[t]=0;
/*辅助数组复位志零*/
for(s=lena+lenb;
s>
s--)
{
if(sum[s]>
sum[s-1]+=sum[s]/10;
sum[s]%=10;
/*s进位取余*/
}
flag++;
sum[lena+lenb+1]='
\0'
;
for(s=0;
s<
=lena+lenb;
s++)
sum[s]=sum[s]+48;
/*数值还原,48对应‘0’字符*/
lena+lenb;
if(sum[0]==48)
for(t=0;
t<
=lena+lenb-s;
t++)
sum[t]=sum[t+1];
/*高位有零向前移位,防止输出的数第一位为零*/
elsebreak;
Case%d:
m);
//输出结果;
%s*%s=%s\n"
a,b,sum);
if(n!
=0)
for(s=lena+lenb+1;
s--)/*sum字符数组复位志零等待下一轮while循环*/
sum[s]=0;
return0;
}
测试与结论:
进过我的反复测试,只要是两个正整数相乘结果正确,程序稳定性好,可以运算任意大是数。
运行结果抓图如:
”
四、创新及难点:
1、创新:
①只有一个主函数,while循环实现大数相乘,使得程序简短高效。
②使用temp辅助字符数组,降低了运算是难度,程序清晰易懂。
③系统在操作提示上较多,用户与系统间的信息交互比较方便,便于操作。
2、难点:
①要用一个大数的各个位去乘一个大数并把的到的数反向存储且使得数字每一位不大于9。
②因为相乘每一位权重不一样,要错位相加。
得数求余,变换。
四、心得体会:
通过为一学期的数据结构课程设计实验课使我了解到了一个程序开发的过程,虽然规模不大,但为我以后的编程学习打下了基础。
在编程的过程中,我体会到了学习编程的辛苦,为了一个算法的实现而思考,为了一个小小的编译错误而花时间去寻找,这需要很大的毅力和耐心,而且要有良好的思维,这才使得我完成这个任务,也使我感到一分喜悦,毕竟自己完成了一个有模有样的程序。
于此,我也发现自己的一些不足,良好的编程习惯的养成,坚定的毅力和耐心仍是我要加强的,同别人的交流也是必须的,这样才能不断使我进步。
题目二:
马的遍历
系统功能分析………………………………………………………9
基本要求……………………………………………………………9
程序说明………………………………………………………….…9
创建标志矩阵函数模块……………………………………………9
巡游子函数模块………………………………………………….…9
赋值子函数模块……………………………………………….…11
主程序函数模块……………………………………………………11
测试运行与结论…………………………………………………12
程序设计总结心得体会……………………………………………13
流程图
系统功能分析:
问题描述:
设计一个国际象棋上的马的遍历棋盘的演示过程的程序。
基本要求:
将马任意放在国际棋盘的8x8的棋盘board[8][8]的某个方格内,马按走棋规则进行移动。
要求每个方格只进入一次,走遍棋盘上的全部64个方格。
编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,。
。
64依次填入一个8x8的方阵,输出之。
程序说明:
首先,国际象棋是8*8的棋盘,马的走法是“马走日”,忽略“蹩脚马”的情况。
其次,这个题目采用的是递归,算法当中的深度优先算法和回溯法:
在“走到”一个位置后要寻找下一个位置,如果发生“阻塞”的情况,就是后面走不通的情况,则向后回溯,重新寻找。
在寻找下一步的时候,对周围的这几个点进行比较,从而分出优劣程度,即看它们周围可以走的点谁最少,然后就走那条可走路线最少的那条。
经过这样的筛选后,就会为后面的路径寻找提供方便,从而减少回溯次数。
最后,本程序的棋盘和数组类似,因而采用数组进行存储,同时还有八个方向的数组,和为栈设计的每个点周围的八个方向那些可以走的数组。
数据初始定义如下:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*马的变遍历问题*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include<
intf[11][11];
/*定义一个矩阵来模拟棋盘*/
intadjm[121][121];
/*标志矩阵,即对于上述棋盘,依次进行编号
1--121(行优先)可以从一个棋盘格i跳到棋盘格j时,adjm[i][j]=1*/
voidcreatadjm(void);
/*创建标志矩阵函数声明*/
voidmark(int,int,int,int);
/*将标志矩阵相应位置置1*/
voidtravel(int,int);
/*巡游函数声明*/
intn,m;
/*定义矩阵大小及标志矩阵的大小*/
创建标志矩阵子函数:
/********************创建标志矩阵子函数*************************/
voidcreatadjm()
inti,j;
for(i=1;
i<
=n;
i++)/*遍历矩阵初始化*/
for(j=1;
j<
j++)
f[i][j]=0;
=m;
i++)/*标志矩阵初始化*/
adjm[i][j]=0;
i++)