石大远程在线考试《数据结构课程设计》8541854054813Word文档格式.docx
《石大远程在线考试《数据结构课程设计》8541854054813Word文档格式.docx》由会员分享,可在线阅读,更多相关《石大远程在线考试《数据结构课程设计》8541854054813Word文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
注销对借阅者的登记,改变该书的库存量;
1.3产品进销管理系统
针对某个行业的库房产品进销存情况进行管理,系统要求具有下列功能:
采用一定的存储结构对库房的货品及其数量进行分类管理;
可以进行产品类的添加、产品的添加、产品数量的添加;
能够查询库房每种产品的总量、进货日期、销出数量、销售时间等;
每种产品至少包含信息:
产品名、进货日期、进货数量、销出数量、销售时间、库存量;
1.4校园导航问题
设计中国石油大学(北京)的校园平面图,至少包括所的最短路径。
10个场所,可以实现任意两个场
2.课程设计报告书写规范
课程设计报告包括该题目的需求分析、概要设计、详细设计、程序测试、感想与体会几
部分内容。
下面以“稀疏矩阵运算器”为例说明如何写课程设计报告。
题目要求:
设计一个稀疏矩阵计算器,实现两个稀疏矩阵的加法、的转置运算。
采用菜单为应用程序的界面,用户通过对菜单进行选择,相减、相乘以及矩阵转速运算。
减法、乘法以及矩阵分别实现矩阵的相加、
2.1需求分析
1.稀疏矩阵是指稀疏因子小于等于0.5的矩阵。
利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
2.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现矩阵转置,以及两个
矩阵的加、减、乘的运算。
稀疏矩阵的输入形式采用三元组表示,运算结果以阵列形式列出。
3.演示程序以用户和计算机的对话方式进行,数组的建立方式为边输入边建立。
首先输入矩阵的行数和列数,并判别给出的两个矩阵的行列数是否与所要求的运算相匹配。
4.程序可以对三元组的输入属性不加以限制;
根据对矩阵的行列,三元组作之间插入排序,从而进行运算时,不会产生错误。
5.在用三元组表示稀疏矩阵时,相加、相减和相乘所产生的结果矩阵另外生成。
6.运行环境:
VC6.0++。
2.2概要设计
稀疏矩阵元素用三元组表示:
typedefstruct{
inti;
//非零元的行下标
intj;
//非零元的列下标
inte;
//矩阵非零元
}Triple;
稀疏矩阵采用三元组顺序表存储:
#define
MSXSIZE12500
//假设非零元个数的最大值为
200
#defineMAXRC10
//假定矩阵的最大行数为10
typedefstruct
{
int
mu;
//矩阵的行数
nu;
//矩阵的列数
tu;
//矩阵的非零元素个数
Tripledata[MAXSIZE+1];
//非零元三元组表,
data[0]没有用
rpos[MAXRC+1];
//各行第一个非零元素的位置表
}Tabletype;
系统主要函数及功能如下:
Menu():
主控菜单,接收用户的选项;
Input_Matrix():
输入矩阵;
Print_matrix():
输出矩阵;
Cal_matrix():
计算矩阵每行第一个非零元在三元组中的位序号;
TransposeMatrix():
矩阵转置;
Add_Matrix():
矩阵加法运算;
Sub_Matrix():
矩阵减法运算;
Multi_Matrix():
矩阵乘法运算。
模块的调用关系如图1所示。
main
Multi_MatrixTransposeMatrixAdd_MatrixSub_Matrix
Cal_Matrix
Input_MatrixPrint_Matrix
图1程序调用模块示意图
2.3详细设计
1.主函数设计
//*****************************************
//*矩阵运算主函数*
主函数中,实现用户菜单菜单的打印,并根据用户的选项执行相应的功能,主函数力求
简洁、清晰。
voidmain()
num=Menu();
//打印主菜单
while(num)
switch(num)
case1:
Multi_Matrix();
//矩阵相乘
break;
case2:
TransposeMatrix();
//矩阵转置
case3:
Add_Matrix();
//矩阵加法
case4:
Sub_Matrix();
//矩阵减法
case0:
}//switch
}//while
}
2.主菜单设计
主控菜单是用来输出提示信息和处理输入,此函数返回用户的选项,提供给main函数
中的switch语句。
对于不符合要求的选项,提示输入错误并要求用户重新输入。
将此函数
与main函数合在一起,编译运行程序,即可检查并验证菜单选项是否正确。
主菜单如下:
//*打印主控菜单函数*
intmenu()
printf("
\n主菜单"
);
\n*********************"
\n1.矩阵乘法"
\n2.矩阵转置"
\n3.矩阵加法"
\n4.矩阵减法"
\n0.退出"
scanf("
%d"
&
num);
while(num<
0||num>
4)//输入非法,重新输入
returnnum;
3.矩阵乘法运算函数
//*矩阵乘法运算算法//*****************************************
*
StatusMulti_Matrix()
Input_Matrix(&
a);
//输入矩阵a
b);
//输入矩阵b
Cal_matrix(&
//计算矩阵a每行第一个非零元的位序号
//计算矩阵b每行第一个非零元的位序号
if(a.nu!
=b.mu)//不符合矩阵乘法条件,不能相乘
returnERROR;
c.mu=a.mu;
//对矩阵c初始化
c.nu=b.nu;
c.tu=0;
if(a.tu*b.tu!
=0){
for(arow=1;
arow<
=a.mu;
arow++){/*处理矩阵a的每一行*/
for(p=1;
p<
MAXRC+1;
p++)/*当前行各元素累加器清零
*/
ctemp[p]=0;
c.rpos[arow]=c.tu+1;
if(arow<
a.mu)
tp=a.rpos[arow+1];
else
tp=a.tu+1;
for(p=a.rpos[arow];
p<
tp;
p++){//求得c中第crow行的非零元brow=a.data[p].j;
if(brow<
b.nu)
t=b.rpos[brow+1];
t=b.tu+1;
for(q=b.rpos[brow];
q<
t;
q++){
ccol=b.data[q].j;
/*乘积元素在矩阵c中的列号*/
ctemp[ccol]+=a.data[p].e*b.data[q].e;
}/*forq*/}//forpfor(ccol=1;
ccol<
=c.nu;
ccol++)
if(ctemp[ccol])/*压缩存储该行非零元*/
if((c.tu)>
MAXSIZE)
exit
(1);
c.tu++;
c.data[c.tu].i=arow;
c.data[c.tu].j=ccol;
c.data[c.tu].e=ctemp[ccol];
}/*endif*/
}/*forarrow*/
}/*if*/
Print_matrix(a);
Print_matrix(b);
Print_matrix(c);
4.矩阵转置算法
//*矩阵转置算法*
voidTransposeMatrix(){
//输入矩阵a
b.mu=a.nu;
b.nu=a.mu;
b.tu=a.tu;
if(b.tu){
q=1;
/*b.data的下标*/
for(col=1;
col<
=a.nu;
col++)//对a的每一列
for(p=1;
=a.tu;
p++)/*p为a的下标*/
if(a.data[p].j==col){//寻找矩阵a中列为
col的非零元
b.data[q].i=a.data[p].j;
b.data[q].j=a.data[p].i;
b.data[q].e=a.data[p].e;
q++;
}//if(p)
}//if(b.tu)
//输出a的转置矩阵
5.矩阵加法算法
//*矩阵加法运算函数
//*c=a+b
StatusAdd_Matrix(){
//输入矩阵b
if(a.mu!
=b.mu||a.nu!
=b.nu)
//不满足矩阵加法条件
c.mu=a.mu;
c.nu=a.nu;
ta=1;
tb=1;
tc=1;
if(a.tu*b.tu!
while((ta<
=a.tu)&
&
(tb<
=b.tu)){
if(a.data[ta].i==b.data[tb].i){
if(a.data[ta].j==b.data[tb].j){
temp=a.data[ta].e+b.data[tb].e;
if(temp!
c.data[tc].i=a.data[ta].i;
c.data[tc].j=a.data[ta].j;
c.data[tc].e=temp;
tc++;
}//endif(temp)
ta++;
tb++;
}//endif
else{
if(a.data[ta].j<
b.data[tb].j){
c.data[tc].e=a.data[ta].e;
tc++;
}//endofelseif
c.data[tc].i=b.data[tb].i;
c.data[tc].j=b.data[tb].j;
c.data[tc].e=b.data[tb].e;
tb++;
}//
if(a.data[ta].i<
b.data[tb].i){
ta++;
while(ta<
=a.tu){//处理a中剩余非零元
while(tb<
=b.tu){//处理b中剩余非零元
c.tu=tc;
6.矩阵输入算法
用于输入矩阵的行数、列数、非零元个数,以及每个非零元素。
输入算法如下:
//*矩阵输入算法
StatusInput_Matrix(Tabletype*t)
scanf(t->
mu,t->
nu,t->
tu);
//获得矩阵行列数、非零元个数
for(i=1;
i<
=tu;
i++)
data[i].i,t->
data[i].j,t->
data[i].e);
returnOK;
7.矩阵输出算法
将三元组以矩阵方式输出在屏幕上,算法如下:
//*矩阵输出函数
StatusPrint_matrix(Tabletypem){
k=1;
=m.mu;
i++){
for(j=1;
j<
=m.nu;
j++){/*非零元素*/
if((m.data[k].i==i)&
(m.data[k].j==j)){
printf(m.data[k].e);
k++;
printf(“0”);
/*零元素*/
\n"
8.Cal_matrix函数
在矩阵乘法运算时,需要统计矩阵每行第一个非零元在三元组表中的位序号,算法如下:
voidcal_matrix(Tabletype*m){
//计算矩阵中每一行中第一个非零元的位序号
for(row=1;
row<
=m->
row++)
num[row]=0;
for(t=1;
t<
t++)
num[m->
data[t].i]++;
m->
rpos[1]=1;
for(row=2;
rpos[row]=m->
rpos[row-1]+num[row-1];
2.4程序测试
在这部分给出程序运行结果的屏幕截图,以及测试分析。
2.5感想与体会
这部分给出算法设计过程中的问题、程序调试过程的问题与收获。
3.要求
源程序没有语法错误,运行结果正确;
设计报告按照规范书写。
课程设计最后提交内容包括:
源程序与课程设计报告。