当前位置:文档之家› 数据结构----稀疏矩阵运算器课程设计

数据结构----稀疏矩阵运算器课程设计

数据结构----稀疏矩阵运算器课程设计
数据结构----稀疏矩阵运算器课程设计

学生姓名:

学号:

专业:计算机科学与技术

班级:计09-1班

指导教师:刘月峰要

摘要:设计一稀疏矩阵运算器。实现转置,相加,相乘的功能。用“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相转置、相加和相乘的运算,采用分级的设计方法,分别设计出转置、加、乘运算器的子程序,相加运算时只要依次扫描两矩阵的行号和列号,若相等则相加后存入结果矩阵,不等时则存入较小的。相减运算与相加运算相同,同样比较两矩阵的行号和列号,只是不等时,若第一个小,则存入第一个的元素,若第二个小,则存入其相反数。相乘运算要先判断两矩阵能否相乘。通过给顶的行号和列号找出原矩阵对应的元素值。当在三元组表示中找到时返回其元素值,找不到时,说明该位置为0,因此返回0。然后利用该函数计算出C的行号i和列号j 处的元素值,若该值不为0,则存入矩阵,否则不存入。通过实验表明本程序能够进行稀疏矩阵的相加,相减,相乘运算。具备矩阵的加、减、乘功能。

关键词:转置运算器;相加运算器;相乘运算器

目录

稀疏矩阵运算器设计 ................................................................................................................. I 摘要........................................................................................................................................ I I 第一章需求分析 .. (1)

第二章概要设计 (2)

第三章设计步骤 (6)

3.1 函数说明 (6)

3.2 设计步骤 (7)

第四章设计理论分析方法 (20)

4.1 算法一:矩阵转置 (20)

4.2 算法二:矩阵加法 (20)

4.3 算法三:矩阵乘法 (21)

第五章程序调试 (23)

第六章心得体会 (25)

参考文献 (26)

第一章需求分析

1.稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。

2.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现矩阵转置,求逆,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。

3.演示程序以用户和计算机的对话方式执行,数组的建立方式为边输入边建立。

4.由题目要求可知:首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。

5.程序可以对三元组的输入顺序不加以限制;根据对矩阵的行列,三元组作直接插入排序,从而进行运算时,不会产生错误。

6.在用三元组表示稀疏矩阵时,相加、乘积和相减所得结果矩阵应该另生成;矩阵求逆时,为了算法方便,使用二维数组存放。

7.程序在VC6.0环境下设计。

程序执行的命令为:1.稀疏矩阵转置; 2.稀疏矩阵加法; ;3. 稀疏矩阵乘法;

4.退出

的工作。

第二章概要设计

1.抽象数据类型稀疏矩阵的定义如下:

ADT SparseMatrix{

数据对象:D={a ij|i=1,2,…,m; j=1,2,…,n;

a ij∈ElemSet, m和n分别为矩阵的行数和列数}

数据关系:R={Row,Col }

Row={﹤a i,j, a i,j+1﹥| 1≤i≤m, 1≤j≤n-1}

Col = {﹤a i,j, a i+1,j﹥| 1≤i≤m-1, 1≤j≤n}

基本操作:

create(TSMatrix &TM)

操作结果:创建稀疏矩阵矩阵TM

LocateELem(TSMatrix M,int i,int j,int e)

初始条件:稀疏矩阵M存在

操作结果:稀疏矩阵中是否存在非零元素A[i][j],若存在返回e disp(TSMatrix TM)

初始条件:稀疏矩阵TM存在

操作结果:通常形式输出稀疏矩阵

InsertSortMatrix(TSMatrix &TM)

初始条件:稀疏矩阵TM存在

操作结果:根据对矩阵的行列,三元组TM作直接插入排序

TransposeSMatrix(TSMatrix M,TSMatrix &T)

初始条件:稀疏矩阵M和T存在

操作结果:求稀疏矩阵M转置的稀疏矩阵T

AddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)

初始条件:稀疏矩阵A,B和C存在

操作结果:稀疏矩阵的加法运算:C=A+B

SubTSM(TSMatrix A,TSMatrix B,TSMatrix &C)

初始条件:稀疏矩阵A,B和C存在

操作结果:稀疏矩阵的减法运算:C=A-B

MultSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C)

初始条件:稀疏矩阵A,B和C存在

操作结果:稀疏矩阵的乘法运算:C=A×B

NiMatrix(TSMatrix &TM)

初始条件:稀疏矩阵TM存在

操作结果:稀疏矩阵求逆

}ADT SparseMatrix;

2. 主程序:

void main( )

{初始化;

do {

接受命令;

选择处理命令;

}while(命令!=“退出”)

}

3. 本程序有四个模块,调用关系如下:

主程序模块

矩阵输入模块

矩阵运算模块

矩阵输出模块

图2.1

4 本程序的流程图

图2.2

开始

选择要执行的操作

输入n 个矩阵A 的行数、列数、非零元个数

选择1,进行矩阵转置运算 选择2,进行矩阵加法运算

选择3,进行矩阵乘法运算

输出结果

结束

选择4,退出程序

第三章设计步骤

3.1函数说明

稀疏矩阵的三元组顺序表存储表示:

typedef struct // 定义三元组的元素

{

int i,j;

int v;

}Triple;

class tripletable

{ //设计类来描述稀疏矩阵及其操作

public:

aaa *pdata;

triple data[maxsize];

int rpos[maxsize]; tripletable();

~tripletable();

void convert() ;

void add( );

void multi ( );

private:

int m ;

int n ;

int t ;

};

主要函数:

tripletable();

~tripletable();

void convert( ) ;

void add( );

void multi ( );

void main( );

3.2设计步骤:

设计一个矩阵类实现矩阵的运算:class tripletable(包含矩阵的各种运算函数)。

输入矩阵(以三元组形式输入非零元)

{

int k;

tripletable A,B;

cout<<"输入稀疏矩阵A的行数,列数和非零元个数:";

cin>>A.m>>A.n>>A.t;

for(k=1;k<=A.t;k++)

{

printf("输入第%d个非0元素的行数,列数和值:",k);

cin>>A.data[k].i>>A.data[k].j>>A.data[k].v;

}

int c[100][100]={0};

for(k=1;k<=B.t;k++)

{

c[B.data[k].i][B.data[k].j]=B.data[k].v;

}

cout<<"转置(加法,乘法)结果为:"<

for(k=1;k<=B.n;k++)

{

for(int l=1;l<=B.m;l++)

cout<

cout<

}

}

转置矩阵:

void tripletable::convert( ) //矩阵的转置

{

int k;

tripletable A,B;

cout<<"输入稀疏矩阵A的行数,列数和非零元个数:"; cin>>A.m>>A.n>>A.t;

for(k=1;k<=A.t;k++)

{

printf("输入第%d个非0元素的行数,列数和值:",k); cin>>A.data[k].i>>A.data[k].j>>A.data[k].v;

}

B.m=A.m;B.n=A.n;B.t=A.t;

if(B.t)

{

int q=1,col;

for(col=1;col<=A.n;++col)

for(int p=1;p<=A.t;++p)

if(A.data[p].j==col)

{

B.data[q].i=A.data[p].j;

B.data[q].j=A.data[p].i;

B.data[q].v=A.data[p].v;

++q;

}

}

int shuru[100][100]={0};

for(k=1;k<=B.t;k++)

{

shuru[B.data[k].j][B.data[k].i]=B.data[k].v;

}

cout<<"输入为:"<

for(k=1;k<=B.m;k++)

{

for(int l=1;l<=B.n;l++)

cout<

cout<

}

int result[100][100]={0};

for(k=1;k<=B.t;k++)

{

result[B.data[k].i][B.data[k].j]=B.data[k].v;

}

cout<<"结果为:"<

for(k=1;k<=B.n;k++)

{

for(int l=1;l<=B.m;l++)

cout<

cout<

}

}

以上主要设计思想:通过三元组输入一个矩阵A,为了找到A的每一列中所有非零元素,需要对其三元组表A.data从第一行起整个扫描一遍,由于A.data是以A的行序

为主序来存放每个非零元的,由此得到的恰是B.data的应有的顺序。

加法矩阵:

void tripletable::add( ) //矩阵的加法

{

int k;

tripletable A,B;

cout<<"输入稀疏矩阵A的行数,列数和非零元个数:";

cin>>A.m>>A.n>>A.t;

for(k=1;k<=A.t;k++)

{

printf("输入第%d个非0元素的行数,列数和值:",k);

cin>>A.data[k].i>>A.data[k].j>>A.data[k].v;

}

cout<<"输入稀疏矩阵B的行数,列数和非零元个数:";

cin>>B.m>>B.n>>B.t;

for(k=1;k<=B.t;k++)

{

printf("输入第%d个非0元素的行数,列数和值:",k);

cin>>B.data[k].i>>B.data[k].j>>B.data[k].v;

}

if(A.m!=B.m||A.n!=B.n)

{

cout<<"输入错误:A与B的行数或列数不相同,请重新输入"<

}

int a[100][100]={0};

for(k=1;k<=A.t;k++)

{

a[A.data[k].i][A.data[k].j]=A.data[k].v;

}

cout<<"A输入为:"<

for(k=1;k<=A.m;k++)

{

for(int l=1;l<=A.n;l++)

cout<

cout<

}

int b[100][100]={0};

for(k=1;k<=B.t;k++)

{

b[B.data[k].i][B.data[k].j]=B.data[k].v;

}

cout<<"B输入为:"<

for(k=1;k<=B.m;k++)

{

for(int l=1;l<=B.n;l++)

cout<

cout<

}

int c[100][100]={0};

for(k=1;k<=A.m;k++)

{

for(int l=1;l<=A.n;l++)

{

c[k][l]=a[k][l]+b[k][l];

}

}

cout<<"加法结果C为:"<

for(k=1;k<=A.m;k++)

{

for(int l=1;l<=A.n;l++)

cout<

cout<

}

}

以上主要设计思想:此功能由函数add( )实现,当用户选择该功能时系统即提示用

户初始化要进行加法的两个矩阵的信息。然后检测这两个矩阵是否符合矩阵相加的规则,如果符合,进行加法。否则重新输入第二个矩阵来保证两个矩阵可以相加。最后输出结果。

乘法矩阵:

void tripletable::multi() //矩阵的乘法

{

int k;

tripletable A,B,C;

cout<<"输入稀疏矩阵A的行数,列数和非零元个数:";

cin>>A.m>>A.n>>A.t;

for(k=1;k<=A.t;k++)

{

printf("输入第%d个非0元素的行数,列数和值:",k);

cin>>A.data[k].i>>A.data[k].j>>A.data[k].v;

}

int row=1;

for(k=1;k<=A.t;k++)

{

while(row<=A.data[k].i)

{

A.rpos[row++]=k;

}

}

while(row<=A.m)A.rpos[row++]=A.t+1;

cout<<"输入稀疏矩阵B的行数,列数和非零元个数:";

cin>>B.m>>B.n>>B.t;

for(k=1;k<=B.t;k++)

{

printf("输入第%d个非0元素的行数,列数和值:",k);

cin>>B.data[k].i>>B.data[k].j>>B.data[k].v;

}

row=1;

for(k=1;k<=B.t;k++)

{

while(row<=B.data[k].i)

{

B.rpos[row++]=k;

}

}

while(row<=B.m)B.rpos[row++]=B.t+1;

if(A.n!=B.m)

{

cout<<"输入错误:A的列数不等于B的行数,请重新输入"<

}

C.m=A.m;C.n=B.n;C.t=0;

int arow,p,q,ccol,t,tp;

if(A.t*B.t!=0)

{

for(arow=1;arow<=A.m;++arow)

{

int ctemp[maxsize]={0};

C.rpos[arow]=C.t+1;

if(arow

for(p=A.rpos[arow];p

{

int brow=A.data[p].j;

if(brow

else{t=B.t+1;}

for(q=B.rpos[brow];q

{

ccol=B.data[q].j;

ctemp[ccol]+=A.data[p].v*B.data[q].v;

}

}

for(ccol=1;ccol<=C.n;++ccol)

{

if(ctemp[ccol])

{

if(++C.t>maxsize)return;

C.data[C.t].i=arow;

C.data[C.t].j=ccol;

C.data[C.t].v=ctemp[ccol];

}

}

}

}

int a[100][100]={0};

for(k=1;k<=A.t;k++)

{

a[A.data[k].i][A.data[k].j]=A.data[k].v; }

cout<<"A输入为:";

cout<

for(k=1;k<=A.m;k++)

{

for(int l=1;l<=A.n;l++)

cout<

cout<

}

int b[100][100]={0};

for(k=1;k<=B.t;k++)

{

b[B.data[k].i][B.data[k].j]=B.data[k].v; }

cout<<"B输入为:"<

for(k=1;k<=B.m;k++)

{

for(int l=1;l<=B.n;l++)

cout<

cout<

}

int c[100][100]={0};

for(k=1;k<=C.t;k++)

{

c[C.data[k].i][C.data[k].j]=C.data[k].v; }

cout<<"乘法结果C为:"<

for(k=1;k<=C.m;k++)

计算器课程设计报告

课设报告 福建工程学院软件学院 题目:汇编计算器 班级: 1301 姓名 学号: 指导老师: 日期:

目录 1、设计目的 (3) 2、概要设计 (3) 2.1 系统总体分析 (3) 2.2 主模块框图及说明 (3) 3、详细设计 (4) 3.1 主模块及子模块概述 (4) 3.2各模块详运算 (4) 4、程序调试 (7) 4.1 运行界面分析 (7) 算法分析 (7) 4.2 调试过程与分析 (9) 5、心得体会 (11) 5.1 设计体会 (11) 5.2 系统改进 (11) 附录: (11)

1、设计目的 本课程设计是一次程序设计方法及技能的基本训练,通过实际程序的开发及调试,巩固课堂上学到的关于程序设计的基本知识和基本方法,进一步熟悉汇编语言的结构特点和使用,达到能独立阅读、设计编写和调试具有一定规模的汇编程序的水平。 2、概要设计 用8086汇编语言编写一个能实现四则混合运算、带括号功能的整数计算器程序。程序能实现键盘十进制运算表达式的输入和显示(例如输入:“1+2*(3-4)”),按“=”后输出十进制表示的运算结果。 2.1 系统总体分析 在8086的操作环境下,该计算器分成输入,数据存储,运算功能,输出几个大模块,实现了使用者使用该计算器时输入一个算式,能让系统进行计算。此计算器的实现功能是基本的数学的四则运算,结果范围在0~65535。 2.2 主模块框图及说明 此流程图简要的表现出了所要实现的功能以及一些功能的大概算法,同时也是我编写的一个总体的框架。 程序流程图说明:通过流程图,可以看出程序运行时,首先输出提示语气,当用户输入后,程序根据所输入内容进行判断,通过判断的结果来决定调用哪个功能模块,首要先要要判断的是否为0-9,“+”“-”“*”“/”这些字符,若不是就会报错,实则根据运算符号调用其功能模块完成运算。最后将运算的结果显示在主频幕上,返回主程序,使用户可以重新输入。

数据结构稀疏矩阵基本运算实验报告

课程设计 课程:数据结构 题目:稀疏矩阵4 三元组单链表结构体(行数、列数、头) 矩阵运算重载运算符优 班级: 姓名: 学号: 设计时间:2010年1月17日——2010年5月XX日 成绩: 指导教师:楼建华

一、题目 二、概要设计 1.存储结构 typedef struct{ int row,col;//行,列 datatype v;//非0数值 }Node; typedef struct{ Node data[max];//稀疏矩阵 int m,n,t;//m 行,n 列,t 非0数个数 … … 2.基本操作 ⑴istream& operator >>(istream& input,Matrix *A)//输入 ⑵ostream& operator <<(ostream& output,Matrix *A){//输出 ⑶Matrix operator ~(Matrix a,Matrix b)//转置 ⑷Matrix operator +(Matrix a,Matrix b)//加法 ⑸Matrix operator -(Matrix a,Matrix b)//减法 ⑹Matrix operator *(Matrix a,Matrix b)//乘法 ⑺Matrix operator !(Matrix a,Matrix b)//求逆 三、详细设计 (1)存储要点 position[col]=position[col-1]+num[col-1]; 三元组表(row ,col ,v) 稀疏矩阵((行数m ,列数n ,非零元素个数t ),三元组,...,三元组) 1 2 3 4 max-1

数据结构课程设计-迷宫问题(参考资料)

目录第一部分需求分析 第二部分详细设计 第三部分调试分析 第四部分用户手册 第五部分测试结果 第六部分附录 第七部分参考文献

一、需求分析 1、对于给定的一个迷宫,给出一个出口和入口,找一条从入口到出口的通路,并把这条通路显示出来;如果没有找到这样的通路给出没有这样通路的信息。 2、可以用一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 3、编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j, d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。 4、由于迷宫是任意给定的,所以程序要能够对给定的迷宫生成对应的矩阵表示,所以程序的输入包括了矩阵的行数、列数、迷宫内墙的个数、迷宫内墙的坐标、所求的通路的入口坐标、出口坐标。 二、详细设计 1、计算机解迷宫通常用的是“穷举求解“方法,即从人口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路

退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。可以二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(n,n)。为处理方便起见,可在迷宫的四周加一圈障碍。对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通。2、如果在某个位置上四个方向都走不通的话,就退回到前一个位置,换一个方向再试,如果这个位置已经没有方向可试了就再退一步,如果所有已经走过的位置的四个方向都试探过了,一直退到起始点都没有走通,那就说明这个迷宫根本不通。 3、所谓"走不通"不单是指遇到"墙挡路",还有"已经走过的路不能重复走第二次",它包括"曾经走过而没有走通的路"。 显然为了保证在任何位置上都能沿原路退回,需要用一个"后进先出"的结构即栈来保存从入口到当前位置的路径。并且在走出出口之后,栈中保存的正是一条从入口到出口的路径。 4、若当前位置“可通”,则纳入“当前路径”,并继续朝“下一位置”探索;若当前位置“不可通”,则应顺着“来的方向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周四个方块均“不可通”,则应从“当前路径”上删除该通道块。 所谓“下一位置”指的是“当前位置”四周四个方向(东、南、西、北)上相邻的方块。假设以栈S记录“当前路径”,则栈顶中存放的

C++课程设计报告--小型特殊计算器

课程设计报告 课程:面向对象程序设计学号: 姓名: 班级: 教师:

课程设计名称:小型特殊计算器 1.设计内容: 实现一个特殊的计算器,可以实现复数、有理数、矩阵和集合的特殊计算。程序可以实现复数、有理数的加、减、乘、除,可以实现矩阵的加法、减法和乘法运算,也可以实现集合的求交集、并集、子集的运算。 2.设计目的与要求: 2.1设计目的 达到熟练掌握C++语言的基本知识和技能; 基本掌握面向对象程序设计的基本思路和方法; 能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。 2.2设计要求 要求利用面向对象的方法以及C++的编程思想来完成系统的设计; 要求在设计的过程中,建立清晰的类层次; 在系统的设计中,至少要用到面向对象的一种机制。 3.系统分析与设计 3.1主要知识点 运算符重载增加了C++语言的可扩充性。运算符的重载实际上就是一种函数调用的形式,可以用成员函数重载运算符,就是将运算符重载定义为一个类的成员函数的形式;也可以用友元函数重载。用友元重载运算符的友元函数是独立于类以外的一般函数。 3.2关键技术 程序中每一种数据类型用一个类来实现,共设计了4个类。复数类complex,矩阵类matrix,有理数类rational以及集合类set。每一种类都定义了相应的运算符重载函数。具体定义如下所示: (1)类complex 类complex中,成员变量image表示虚部,real表示实部。成员函数print()用来显示数据。运算符重载函数都是用友元函数来实现的。分别重载+、-、*、/运算符。 (2)类matrix 类matrix中,成员变量elems用来存放矩阵的所有元素,rows表示矩阵的行,cols表示矩阵的列。成员函数SetElems()用来给矩阵中的每一个元素赋值,Disp()用来显示矩阵中的所有元素。其它友元函数分别重载+、-、*、/运算符。 (3)类rational 类rational中,有两个成员变量:denominator用来表示有理数的分母,numerator表示有理数的分子。有理数成员函数print()用来显示有理数,optimization()用来优化有理数函数。友元函数real()用来将有理数转换为实数,其它友元函数分别重载+、-、*、/运算符。 (4)类set

数据结构与算法 特殊矩阵和稀疏矩阵

常熟理工学院 《数据结构与算法》实验指导与报告书 _2017-2018_____学年第__1__ 学期 专业:物联网工程 实验名称:特殊矩阵和稀疏矩阵 实验地点: N6-210 指导教师:聂盼红 计算机科学与工程学院 2017

实验五特殊矩阵和稀疏矩阵 【实验目的】 1、掌握数组的结构类型(静态的内存空间配置);通过数组的引用下标转换成该数据在内存中的地址; 2、掌握对称矩阵的压缩存储表示; 3、掌握稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。 【实验学时】 2学时 【实验预习】 回答以下问题: 1、什么是对称矩阵?写出对称矩阵压缩存储sa[k]与aij之间的对应关系。 若n阶矩阵A中的元素满足下述性质:a ij=a ji,则称为n阶对称矩阵。 sa[k]与矩阵元素a ij之间存在着一一对应的关系: 若i>=j,k=i*(i+1)/2+j; 若i

的关系。(注意C程序中,i,j,k均从0开始) (2)调试程序与运行。对称矩阵存储下三角部分即i>=j。 对称矩阵为3,9,1,4,7 9,5,2,5,8 1,2,5,2,4 4,5,2,1,7 7,8,4,7,9 参考程序如下: #include<> #define N 5 int main() { int upper[N][N]= {{3,9,1,4,7}, {9,5,2,5,8}, {1,2,5,2,4}, {4,5,2,1,7}, {7,8,4,7,9} }; /*对称矩阵*/ int rowMajor[15]; /*存储转换数据后以行为主的数组*/ int Index; /*数组的索引值*/ int i,j; printf("Two dimensional upper triangular array:\n"); for (i=0; i

数据结构迷宫问题的C 代码

数据结构课程设计——迷宫问题求解代码 问题描述及要求: 迷宫问题求解 输入: 第一行n,m表示迷宫大小n*m 之后有n行m列,全由01组成,0表示路,1表示墙 入口设为(0,0) 出口设为(n-1,m-1) 输出: 输出从入口到出口的所有不同解,每组解的第一行打印一个数表示第几组解,之后k行表示路径,如: 1 (0,0) (0,1) (1,1) 代码部分(已测试,可直接运行): #include #include #define N255 int n,m,cnt; int maze[N][N],step[N][N]; struct Point{ int x,y; }path[N*N]; int oper[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; bool isvaild(int x,int y){ if(x>=0&&x=0&&y

Point tmp; tmp.x=x+oper[i][0]; tmp.y=y+oper[i][1]; path[len]=tmp; step[tmp.x][tmp.y]=1; dfs(tmp.x,tmp.y,len+1); step[tmp.x][tmp.y]=0; } } void work(){ step[0][0]=1; Point cur; cur.x=0; cur.y=0; path[0]=cur; dfs(0,0,1); } int main(){ scanf("%d%d",&n,&m); for(int i=0;i

计算机科学与专业技术学院课程设计成绩单

计算机科学与技术学院课程设计成绩单

————————————————————————————————作者:————————————————————————————————日期:

计算机科学与技术学院课程设计成绩单 课程名称:数据库系统原理指导教师: 姓名性别学号班级 综合成绩成绩等级 程序运行情况 (占总成绩20%) □能正确运行□基本能正确运行□能运行但结果不完善 (20分)(15分)(10分) 程序功能的完善 程度 (占总成绩10%)□完善□基本完善□不完善(10分)(8分)(5分) 程序结构的合理 性 (占总成绩10%)□合理□基本合理□不太合理(10分)(8分)(5分) 对问题的答辩情况 (占总成绩40%)□概念正确有创新□能正确回答所有问题□基本能正确回答(40分)(35分)(30分) □部分问题回答概念不清晰 (20分) 学生的工作态度与独立工作能力(占总成绩10%)□工作态度认真能独立完成任务□工作态度认真但独立性较差(10分)(8分) □工作态度基本认真但缺乏独立性 (5分) 设计报告的规范 性 (占总成绩10%)□符合规范□基本符合规范□规范性较差(10分)(8分)(5分) 优秀:90分~100分良好:80分~89分中等:70~79分及格:60~69分不及格0分~59分 武汉科技大学计算机科学与技术学院制表

计算机科学与技术学院 课程设计报告 课程名称:数据库系统原理专业: 班级:级班学号: 姓名: 指导老师:

网上选课系统 一、实验目的 利用一种DBMS作为设计工具,理解并应用课程中关于数据库设计的相关理论,能按照设计流程完成完整的数据库设计,包括需求分析、概念设计、逻辑设计、物理设计和实施。同时能够应用各个阶段的典型工具 二、设备与环境 (1) 硬件设备:PC机一台 (2) 软件环境:安装Windows操作系统,安装数据库管理系统SQL Server2000等。 三、实验内容 完整实践应用数据库设计的工程过程:需求分析\概念设计\逻辑设计\物理设计和实施: (1)需求分析:选定一个应用,对所设计的数据库系统有一定的调研分析,其结果应该以 简单的需求分析说明书\数据字典和数据流图(2级数据流即可)表示; (2)概念分析:使用E-R图作为描述工具.描述出局部和全局的E-R图; (3)逻辑设计:将E-R图转化为相应的关系模式,并根据范式理论进行优化分析,关系模 式不少于3个; (4)物理设计:根据需要设计必要的索引等结构; (5)实施:以某种DBMS为工具创建出完整的数据库.在数据库中要表现出的知识点包括 ①登录控制 (标准登录或混合登录) ②数据完整性(参照完整性、实体完整性、自定义完整性(包括触发器) ③设置用户,并相应设计用户的权限和角色(用户设计至少3个,有不同的权限) ④以游标或存储过程完成相关操作至少2个,以文件方式保存 (6)以上内容,请详细描述,并有必要抓图. 四、实验结果及分析 1.需求分析 随着信息时代科技不断提高,学校规模不断扩大,教学质量不断提高,大学期间有许多公共选修课,以往的选修课方法是课堂报名或者纸上填写方式报名,这种方法虽然直接,但是造成选课的盲目性,而且学生选过课程后不好在更改查看,一方面浪费大量的人力,物力资源,另一方面浪费时间以及在认为统计过程中不可避免的出现差错的情况。这给广大的老师和学生带来诸多的不便,管理起来也相当困难。使用网上选课系统可以提前进行网上选课,并且选课以后学生还可以在查看和更改,随意选择各个老师的课程,老师管理起来也比较方便。鉴于

单片机计算器的课程设计报告

目录 一、设计任务和性能指标 (1) 1.1设计任务 (2) 1.2性能指标 (2) 二、设计方案 (2) 3 3 4 5 5 6 6 7 7 20 20 20 20 21 参考文献 (21) 附录1、系统硬件电路图 (22) 附录2、硬件实物图 (23) 附录3、器件清单 (24)

一、设计任务和性能指标 1.1设计任务 自制一个单片机最小系统,包括复位电路,采用外部小键盘输入数据,能够实现加法、乘法及一个科学计算,计算结果显示在四位一体的数码管上。 要求用Protel 画出系统的电路原理图(要求以最少组件,实现系统设计所要 显 位 监测模块采用二极管和扬声器(实验室用二极管代替)组成电路。 键盘电路采用4*4矩阵键盘电路。 显示模块采用4枚共阳极数码管和74ls273锁存芯片构成等器件构成。 整个单片机的接口电路: P0用于显示输出; P1用于键扫描输入; P2用于数码管位选控制; P3用于键盘扩展(部分运算符输入);

三.系统硬件设计 3.1单片机最小系统 单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。 主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。 扩展键:“log”,“ln”,“x^2”“小数点”,“开方” 共计25个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.0~P1.7,这样扫描P1口就可以完成对矩阵键盘的扫描,通过对16个按键进行编码,从而得到键盘的口地址,对比P1口德扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘的功能。 以下为键盘接口电路的硬件电路图

稀疏矩阵(算法与数据结构课程设计)

稀疏矩阵 一、问题描述 假若在n m ?阶中,有t 个元素不为零,令n m t ?=δ称为矩阵的稀疏因子。通常认为≤δ0.05时称为稀疏矩阵。稀疏矩阵的研究大大的减少了数据在计算机中存储所需的空间,然而,它们的运算却与普通矩阵有所差异。通过本次实验实现稀疏矩阵的转置、加法和乘法等多种运算。 二、基本要求 1、稀疏矩阵采用三元组表示,建立稀疏矩阵,并能按矩阵和三元组方式输出; 2、编写算法,完成稀疏矩阵的转置操作; 3、编写算法,完成对两个具有相同行列数的稀疏矩阵进行求和操作; 4、编写算法,对前一矩阵行数与后一矩阵列数相等的两个矩阵,完成两个稀疏矩阵的相乘操作。 三、测试数据 1、转置操作的测试数据: ??????? ? ?00200013000010020100 2、相加操作的测试数据: ??????? ? ?002000130000100 20100 ??????? ??00200010000210030300 3、相乘操作的测试数据: ?????? ? ??000000030040 0021 ??????? ??001002000021 四、算法思想 1、三元组结构类型为Triple ,用i 表示元素的行,j 表示元素的列,e 表示元素值。稀疏矩阵的结构类型为TSMatrix ,用数组data[]表示三元组,mu 表示行数,nu 表示列数,tu 表示非零元个数。 2、稀疏矩阵转置的算法思想 将需要转置的矩阵a 所有元素存储在三元组表a.data 中,按照矩阵a 的列序来转置。

为了找到a的每一列中所有非零元素,需要对其三元组表a.data扫描一遍,由于a.data 是以a的行需序为主序来存放每个非零元的,由此得到的就是a的转置矩阵的三元组表,将其储存在b.data中。 3、稀疏矩阵相加的算法思想 比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为0的元素的行数及列数(即i与j),将i与j都相等的前后两个元素值e相加,保持i,j不变储存在新的三元组中,不等的则分别储存在此新三元组中。最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。 4、稀疏矩阵相乘的算法思想 两个相乘的矩阵为M与N,对M中每个元素M.data[p](p=1,2,…,M.tu),找到N中所有满足条件M.data[p].j=N.data[q].i的元素N.data[q],求得M.data[p].v和N.data[q].v 的乘积,又T(i,j)=∑M(i,k)×N(k,j),乘积矩阵T中每个元素的值是个累计和,这个乘积M.data[p].v×N.data[q].v只是T[i][j]中的一部分。为便于操作,应对每个元素设一累计和的变量,其初值是零,然后扫描数组M,求得相应元素的乘积并累加到适当的求累计和的变量上。由于T中元素的行号和M中元素的行号一致,又M中元素排列是以M的行序为主序的,由此可对T进行逐行处理,先求得累计求和的中间结果(T的一行),然后再压缩存储到Q.data中去。 五、模块划分 1、Status CreateM(TSMatrix *M, int a[],int row, int col),创立三元组; 2、void PrintM(TSMatrix M),按数组方式输出; 3、void PrintM3(TSMatrix M),按三元组方式输出; 4、Status TransposeSMatrix(TSMatrix M, TSMatrix *T),稀疏矩阵的转置; 5、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵加法; 6、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵相乘; 7、main(),主函数。 六、数据结构//(ADT) 1、三元组结构类型 typedef struct { int i,j; ElemType e; } Triple; 2、稀疏矩阵 typedef struct { Triple data[MAXSIZE+1];

数据结构课程设计——迷宫问题课程设计报告

迷宫问题 ——王欣歆20080564 一.需求设计:以一个m*m 的方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口的通道,或得出没有通路的结论。二.概要设计: 存储结构: 采用了数组以及结构体来存储数据,在探索迷宫的过程中用到的栈,属于顺序存储结构。 /*八个方向的数组表示形式*/ int move[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1, 0},{-1, 1}}; /*用结构体表示位置*/ struct position { int x,y; }; position stack[m*m+1]; 基本算法: 走迷宫的过程可以模拟为一个搜索的过程:每到一处,总让它按东、东南、南、西南、西、西北、北、东北8个方向顺序试探下一个位置;如果某方向可以通过,并且不曾到达,则前进一步,在新位置上继续进行搜索;如果8个方向都走不通或曾经到达过,则退回一步,在原来的位置上继续试探下一位置。 每前进或后退一步,都要进行判断:若前进到了出口处,则说明找到了一条通路;若退回到了入口处,则说明不存在通路。 用一个字符类型的二维数组表示迷宫,数组中每个元素取值“0”(表示通路)或“1”(表示墙壁)。迷宫的入口点在位置(1,1)处,出口点在位置(m,m)处。设计一个模拟走迷宫的算法,为其寻找一条从入口点到出口点的通路。 二维数组的第0行、第m+1行、第0列、第m+1列元素全置成“1”,表示迷宫的边界;第1行第1列元素和第m行第m列元素置成“0”,表示迷宫的入口和出口;其余元素值用随机函数产生。 假设当前所在位置是(x,y)。沿某个方向前进一步,它可能到达的位置最多有8个。 如果用二维数组move记录8个方向上行下标增量和列下标增量,则沿第i个方向前进一步,可能到达的新位置坐标可利用move数组确定: x=x+move[i][0] y=y+move[i][1] 从迷宫的入口位置开始,沿图示方向顺序依次进行搜索。在搜索过程中,每前进一步,在所到位置处做标记“ ” (表示这个位置在通路上),并将该位置的坐标压入栈中。 每次后退的时候,先将当前所在位置处的通路标记“ ”改 成死路标记“×”(表示这个位置曾到达过但走不通,以后 不要重复进入),然后将该位置的坐标从栈顶弹出。 678 51 432 x y o

C++ 科学计算器-课程设计报告

DONGFANG COLLEGE,FUJIAN AGRICULTURE AND FORESTRY UNIVERSITY 课程名称:堆栈计算器 系别:计算机 年级专业:11级计算机科学与技术 学号:1150303040 姓名:蔡新云 任课教师:林励成绩: 2013 年 6 月13 日

引言 堆栈计算器 简介: 计算带括号的数学算式,可以判断优先级,错误判断等功能。友好的操作界面,美观的视觉效果。 截图 界面: 计算演示: 结果:

错误判断: 数据结构:应用了栈,做数值缓存,应用了递归处理括号内算式。其他知识:mfc界面设计;c++类的封装(.h与.cpp分离)。 编译环境:使用了vs2012,通过修改vs2010也可以打开。

程序简单流程图: (注:eval 的代码在下面。。。) 功能实现原理与代码: //栈的实现 //初始化 stack::stack(int len) { lengh=len; date=new double[len]; date[0]=0; top=0; } stack::stack() { date=new double[100]; MFC 文本框 按钮事件 = 事件 Cal.eval() 调用函数eval(),返回结果到文本框 当 =事件 发生 从文本框取出表达式到eval ()函数

date[0]=0; top=0; } //判断为空 bool stack::is_empty() { if(top==0) { return true; } return false; } //进栈 void stack::push(double number) { date[top++]=number; } //出栈 double stack::pop() { if(!is_empty()) return date[--top]; } //calculator类(核心代码) 初始化 calculator::calculator() { error="null"; } 是否为数字 bool calculator::is_num(char num) { if(num<='9' && num>='0'||num=='.') { return true; }

科学计算器课程设计报告C课程设计修订稿

科学计算器课程设计报告C课程设计 集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]

计算机科学与技术学部 C++课程设计 题目科学计算器 学部计算机科学与技术 班级计科1103 指导教师李军 姓名刘明 学号 2012年6月27日

摘要 计算器的产生和发展是建立在电子计算机基础之上的。硬件方面,自1946年第一台电子计算机诞生以来,计算机技术的发展可谓日新月异,从庞大的只能在实验室里供研究使用的计算机到如今能适应不同环境满足不同需求的各种各样的计算机;运算速度从每秒几千次到每秒几百亿次;处理器从焊有上百万个电子管的大的惊人的电子板到只有指甲大小的集成电路;现在计算机在硬件方面的发展已达到了每三个月更新换代一次的惊人速度。软件方面,也已从机器语言、汇编语言、高级语言发展到现如今的第四代语言——非结构化、面向对象、可视化的语言。 在这个计算器里面,我们实现了简单的四则运算以及更高功能的科学计算,它的外观简洁美观,使人们能快捷简单的操作。能准确的得到计算结果,大大减少了数字计算所需要的时间,为人们的生活带来便利。此系统在Windows 7环境下,使用VC++ 进行编写。 简单计算器包括双目运算和单目运算功能,双目运算符包含基本的四则运算及乘幂功能,单目运算符包含正余弦,对数,开方,阶乘,倒数,进制转换等运算。可对其输入任意操作数,包括小数和整数及正数和负数进行以上的所有运算并能连续运算。并且包含清除,退格功能等。我们所做的计算器其功能较Windows 7下的计算器还是很不够多,没有其菜单的实现功能项,没有其小巧的标准计算器。 关键词:计算器;运算;VC++等

数据结构课后习题及解

数据结构课后习题及解析第五章

第五章习题 5.1 假设有6行8列的二维数组A,每个元素占用6个字节,存储器按字节编址。已知A的基地址为 1000,计算: 数组A共占用多少字节; 数组A的最后一个元素的地址; 按行存储时元素A 36 的地址; 按列存储时元素A 36 的地址; 5.2 设有三对角矩阵A n×n ,将其三条对角线上的元素逐行地存于数组B(1:3n-2)中,使得B[k]= a ij , 求: (1)用i,j表示k的下标变换公式; (2)用k表示i,j的下标变换公式。 5.3假设稀疏矩阵A和B均以三元组表作为存储结构。试写出矩阵相加的算法,另设三元组表C存放 结果矩阵。 5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个 辅助向量空间。 5.5写一个在十字链表中删除非零元素a ij 的算法。 5.6画出下面广义表的两种存储结构图示: ((((a), b)), ((( ), d), (e, f))) 5.7求下列广义表运算的结果: (1)HEAD[((a,b),(c,d))]; (2)TAIL[((a,b),(c,d))]; (3)TAIL[HEAD[((a,b),(c,d))]]; (4)HEAD[TAIL[HEAD[((a,b),(c,d))]]]; (5)TAIL[HEAD[TAIL[((a,b),(c,d))]]];

实习题 若矩阵A m×n 中的某个元素a ij 是第i行中的最小值,同时又是第j列中的最大值,则称此元素为该 矩阵中的一个马鞍点。假设以二维数组存储矩阵,试编写算法求出矩阵中的所有马鞍点。 第五章答案 5.2设有三对角矩阵A n×n,将其三条对角线上的元素逐行的存于数组B[1..3n-2]中,使得B[k]=a ij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i、j的下标变换公式。 【解答】(1)k=2(i-1)+j (2) i=[k/3]+1, j=[k/3]+k%3 ([ ]取整,%取余) 5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。 【解答】算法(一) FastTransposeTSMatrix(TSMartrix A, TSMatrix *B) {/*把矩阵A转置到B所指向的矩阵中去,矩阵用三元组表表示*/ int col,t,p,q; int position[MAXSIZE]; B->len=A.len; B->n=A.m; B->m=A.n; if(B->len>0) { position[1]=1; for(t=1;t<=A.len;t++) position[A.data[t].col+1]++; /*position[col]存放第col-1列非零元素的个数, 即利用pos[col]来记录第col-1列中非零元素的个数*/ /*求col列中第一个非零元素在B.data[ ]的位置,存放在position[col]中*/ for(col=2;col<=A.n;col++) position[col]=position[col]+position[col-1]; for(p=1;p

《数据结构课程设计》走迷宫游戏

信息工程学院 课程设计报告 课程名称《数据结构》 课题名称走迷宫游戏 专业 班级 学号 姓名 联系方式 指导教师 2015 年 12 月 27 日

目录 1、数据结构课程设计任务书............................................................... 1 1.1、题目........................................................................... 1 1.2、要求........................................................................... 1 2、总体设计............................................................................. 1 2.1、设计思路及总体组成框架......................................................... 1 2.2、操作流程图..................................................................... 2 3、详细设计............................................................................. 5 3.1、程序中所采用的数据结构及存储结构的说明......................................... 5 3.2、函数功能模块说明............................................................... 5 3.3、各函数的调用关系 ............................................................................................................................... 7 4、调试与测试:......................................................................... 7 4.1、调试方法与步骤:............................................................... 7 4.2、测试结果的分析与讨论:......................................................... 8 4.3、测试过程中遇到的主要问题及采取的解决措施:................................... 10 6、源程序清单......................................................................... 10 7、数据结构课程设计总结............................................................... 14 8、参考文献........................................................................... 14

JAVA实现计算器课程设计

JAVA实现计算器课程设计 计算机科学系 计应0701班 指导老师:刘其昌 设计人员:陈秀桃 设计日期:2009年11月10日——2009年12月20日 计算器的设计 目录 第一章绪 论 ..................................................................... .. (2)

1.1 开发环 境 ..................................................................... . (2) 1.2 基本功能介 绍 ..................................................................... ......... 2 第二章系统设 计 ..................................................................... (3) 2.1 系统流程 图 ..................................................................... . (3) 2.2 系统功能框 图 ..................................................................... (3) 2.3 需求分 析 ..................................................................... ................ 4 第三章软件设 计 ..................................................................... (5) 3.1 界面设 计 ..................................................................... . (5) 3.2 代码设 计 .....................................................................

计算器课程设计报告

高级语言程序(JAVA)课程设计报告 系部名称:商学系专业班级:营销*** 学生姓名:墨璇 墨兰学号: ********** ********** 指导教师:王芬教师职称:讲师 2014年06月26日

目录 一、课程设计目的及意义 .................................... 错误!未定义书签。 二、课程设计任务 .......................................... 错误!未定义书签。 2.1程序设计要求....................................... 错误!未定义书签。 三、课程设计时间 .......................................... 错误!未定义书签。 四、课程设计地点 .......................................... 错误!未定义书签。 五、课程设计内容 .......................................... 错误!未定义书签。 5.1开发工具与平台..................................... 错误!未定义书签。 (1).开发工具 ...................................... 错误!未定义书签。 (2).开发平台 ...................................... 错误!未定义书签。 5.2设计思路........................................... 错误!未定义书签。 5.3 程序测试 .......................................... 错误!未定义书签。 5.4实验总结........................................... 错误!未定义书签。 六、课程设计感想 .......................................... 错误!未定义书签。 七、附录(程序代码) ...................................... 错误!未定义书签。

数据结构C语言版-稀疏矩阵的三元组顺序表存储表示和实现

typedef int ElemType; // 稀疏矩阵的三元组顺序表存储表示 #define MAXSIZE 100 // 非零元个数的最大值 typedef struct { int i,j; // 行下标,列下标 ElemType e; // 非零元素值 }Triple; typedef struct { Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用 int mu,nu,tu; // 矩阵的行数、列数和非零元个数 }TSMatrix; // 创建稀疏矩阵M int CreateSMatrix(TSMatrix *M) { int i,m,n; ElemType e; int k; printf("请输入矩阵的行数,列数,非零元素个数:(逗号)\n"); scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu); (*M).data[0].i=0; // 为以下比较顺序做准备 for(i = 1; i <= (*M).tu; i++) { do { printf("请按行序顺序输入第%d个非零元素所在的行(1~%d)," "列(1~%d),元素值:(逗号)\n", i,(*M).mu,(*M).nu); scanf("%d,%d,%d",&m,&n,&e); k=0; // 行或列超出范围 if(m < 1 || m > (*M).mu || n < 1 || n > (*M).nu) k=1; if(m < (*M).data[i-1].i || m == (*M).data[i-1].i && n <= (*M).data[i-1].j) // 行或列的顺序有错 k=1; }while(k);

课程设计报告(迷宫)

武汉东湖学院计算机科学学院 课程设计报告 课程名称数据结构课程设 题目深度与广度优先搜索 迷宫问题 专业班级(请自己填写) 学号(请自己填写) 学生姓名(请自己填写) 指导教师吴佳芬 (请自己填写)年(请自己填写)月(请自己填写)日

武汉东湖学院计算机科学学院 课程设计任务书 课程名称:数据结构课程设计 设计题目:深度与广度优先搜索:迷宫问题 专业:(请自己填写)班级:(请自己填写) 完成时间:自己填写指导教师:吴佳芬专业负责人:许先斌

武汉大学东湖分校计算机科学学院 课程设计成绩评价表 指导教师:吴佳芬年月日

(由学生完成,以下为摸版) 【软件课程设计报告目录】 1、需求分析 说明程序设计的任务,强调的是程序要做什么,明确规定: (1)输入的形式和输入值的范围; (2)输出的形式; (3)程序所能达到的功能; (4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。 2、概要设计 说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。 3、详细设计 实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法;画出函数的调用关系。 4、使用说明、测试分析及结果 (1)说明如何使用你编写的程序; (2)测试结果与分析; (3)调试过程中遇到的问题是如何解决提以及对设计与实现的回顾讨论和分析; (4)运行界面。 5、课程设计总结(设计心得) (1)你在编程过程中用时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题? (2)遇到了哪些难题?你是怎么克服的? (3)你对算法有什么改正想法吗? (4)你的收获有哪些? 参考文献 (由学生完成,以下为摸版,编页码:共x页,第x页)

相关主题
文本预览
相关文档 最新文档