数据结构课程设计-特殊矩阵计算器
- 格式:docx
- 大小:21.33 KB
- 文档页数:13
数据结构课程设计报告题目:专业:班级:学号:姓名:指导老师:时间:一、课程设计题目及所涉及知识点设计题目就是“矩阵得运算”;所涉及得知识点主要就是:1、利用数组得形式来储存数据,在main函数里面,实现对于数据得输入操作,利用s witch语句进行选择来执行操作,利用for语句与do……while语句来实现功能得循环操作。
2、矩阵得加法、减法、乘法、数乘、转置得基本算法方式.3、通过switch语句进行选择来执行操作,来实现每个算法得功能。
二、课程设计思路及算法描述设计思路:用程序实现矩阵能够完成矩阵得转置运算;矩阵得数乘运算;矩阵得加法运算;矩阵得减法运算;矩阵得乘法运算;这几种矩阵得简单得运算。
用数组把将要运算得矩阵储存起来,然后实现矩阵得这几种运算。
在main函数里面,来实现对于数据得输入操作,利用switch语句进行选择来执行操作,利用for语句来实现功能得循环操作。
算法:算法1:矩阵得转置运算;首先就是把将要运算得矩阵存放在数组中,矩阵得转置运算,就就是把您将要进行运算得A矩阵得行ar与列ac,把A矩阵得行ar作为B矩阵得bc,A矩阵得列ac作为B 矩阵得br,这样得到得新矩阵B得行br与列bc就就是矩阵A得转置。
算法如下:for(i=0;i〈ar;i++)for(j=0;j〈ac;j++)B[j][i]=A[i][j];算法2:矩阵得数乘运算;首先就是把将要运算得矩阵存放在数组中,矩阵得数乘运算,就就是实现用一个实数k去A矩阵.实数k去乘矩阵得每一行与每一列,得到得一个新得矩阵B,这样就解决了矩阵得数乘运算.算法如下:for(i=0;i<ar;i++)for(j=0;j<ac;j++)B[i][j]=k*A[i][j];算法3:矩阵得加法运算;首先就是把将要运算得矩阵存放在数组中,矩阵得加法运算,就就是要实现A矩阵与B矩阵进行加法运算。
事实上就就是A矩阵得每一行ar与B矩阵得每一行br进行加法运算,而得到得一个新得矩阵C得每一行cr就就是A矩阵得ar行与B矩阵得br行得与;A矩阵得每一列ac与B矩阵得每一列bc进行加法运算,而得到得一个新得矩阵C得每一列cc就就是A矩阵得ac列与B矩阵得bc列得与。
实习4、稀疏矩阵运算器一、需求分析1. 问题描述稀疏矩阵是指那些多数元素为零的矩阵。
利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
2. 基本要求以带“行逻辑连接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵的相加、相减和相乘运算。
稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。
3. 实现提示(1)首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否匹配。
可设聚矩阵的行数和列数不超过20。
(2)程序可以对三元组的输入顺序加以限制,例如,按行优先。
注意研究教科书5.3.2节中的算法,以便提高计算效率。
(3)在用三元组表示稀疏矩阵时,相加或者相减所得的结果矩阵应该另生成,乘积矩阵也可以用二维数组存放。
二、概要设计ADT SparseMatrix{数据对象:D={a ij |i=1,2,3……m;j = 1,2,3……n;a i,j ∈intSet,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,j+1>|1≤i ≤m-1,1≤j ≤n}基本操作:CreateSMatrix(*T);操作结果:创建稀疏矩阵T 。
AddRLSMatrix(M,N,*Q);初始条件:稀疏矩阵M 和N 的行数列数对应相等。
操作结果:求稀疏矩阵的和Q=M+N 。
SubRLSSMatrix(M,N,*Q);初始条件:稀疏矩阵M 和N 的行数列数对应相等。
操作结果:求稀疏矩阵的差Q=M-N 。
SMatrixrpos(*T)初始条件:稀疏矩阵T 存在。
操作结果:求稀疏矩阵的各行第一个非零元的位置表。
MulTSMatrix(M,N,*Q);初始条件:稀疏矩阵M 的列数与N 的行数对应相等。
课程设计任务书目录PART I1 需求分析 (2)2 算法基本原理 (2)3 类设计 (3)4 详细设计 (4)4.1类的接口设计 (4)4.2类的实现 (5)4.3主函数设计 (11)5 运行结果与分析 (12)5.1程序运行结果 (12)5.2运行结果分析 (14)PART Ⅱ1 需求分析 (24)2 算法基本原理 (24)3 类设计 (14)4 详细设计 (15)4.1类的实现 (15)4.2主函数设计 (19)5 运行结果与分析 (27)5.1程序运行结果 (27)5.2运行结果分析 (27)6 参考文献 (15)PART I1 需求分析矩阵是线性代数里一个重要的概念,在这里采用C++语言实现一个简单的n×n矩阵类,类中包括一些简单的运算等操作具体要求如下:(1)使用构造函数完成方阵的初始化赋值(动态内存分配);(2)使用析构函数完成矩阵动态内存的释放;(3)重载加法运算符+,实现两个矩阵的和;(4)重载加法运算符-,实现两个矩阵的差;(5)重载加法运算符*,实现两个矩阵的积;(6)重载加法运算符=,实现两个矩阵之间的赋值;(7)使用函数实现矩阵的转置;(8)使用函数求矩阵中的最大值;(9)使用函数求矩阵中的最小值;(10)添加函数Det以得到矩阵对应行列式的值;(11)重载加法运算符<<,实现矩阵按照行列的格式输出;(12)编写一个主函数测试上述功能。
2 算法基本原理矩阵进行加法,减法,乘法运算时,必须满足两个矩阵阶数相同的条件。
加法,减法计算是把矩阵对应的各行各列的每一对数值分别进行加减法运算,结果组成一个新的同阶矩阵。
矩阵乘法是这样定义的,只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。
一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p 的矩阵c(m,p),满足矩阵乘法满足结合率,但不满足交换率3 类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是矩阵运算。
数据结构课程设计-计算器数据结构课程设计计算器在计算机科学的学习中,数据结构是一门重要的基础课程。
通过这门课程的学习,我们能够深入理解和掌握如何有效地组织和管理数据,以提高程序的运行效率和性能。
本次课程设计的任务是开发一个简单的计算器程序,通过运用所学的数据结构知识,实现基本的算术运算功能。
一、需求分析首先,我们需要明确计算器程序的功能需求。
这个计算器应该能够支持常见的四则运算,即加法、减法、乘法和除法。
用户可以通过输入表达式,例如“2 +3”、“5 2”、“3 4”、“8 /2”等,程序能够正确计算并输出结果。
此外,为了提高用户体验,计算器还应该能够处理错误输入,例如输入的表达式不符合语法规则或者除数为 0 等情况,并给出相应的错误提示信息。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和处理输入的表达式。
在这个计算器程序中,我们可以使用栈这种数据结构。
栈是一种后进先出(Last In First Out,LIFO)的数据结构,非常适合处理表达式的计算。
我们可以创建两个栈,一个用于存储操作数,另一个用于存储操作符。
当用户输入一个表达式时,我们按照从左到右的顺序逐个字符进行处理。
如果是数字,则将其转换为整数并压入操作数栈;如果是操作符,则将其压入操作符栈。
在计算过程中,我们从操作符栈中取出操作符,从操作数栈中取出相应数量的操作数进行计算,将计算结果压回操作数栈。
三、算法设计1、表达式解析算法从左到右扫描表达式。
如果遇到数字,将其作为一个整数提取出来,并压入操作数栈。
如果遇到操作符(+、、、/),则将其压入操作符栈。
如果遇到左括号“(”,则将其压入操作符栈。
如果遇到右括号“)”,则从操作符栈中弹出操作符,从操作数栈中弹出操作数,进行计算,直到遇到左括号为止。
2、计算算法当操作符栈不为空时,从操作符栈中弹出一个操作符。
根据操作符的类型,从操作数栈中弹出相应数量的操作数。
进行计算,并将结果压回操作数栈。
数据结构课程设计五····题目:严蔚敏习题实习4第1个:实现一个能进行基本稀疏矩阵运算的运算器一、需求分析1、本程序实现一个基本稀疏矩阵的简单运算,包括加、减、乘。
2、执行操作前应先创造要进行运算的两个矩阵,然后再选择进行相应的操作。
3、以三元组顺序表表示稀疏矩阵,实现二个矩阵相加,相减,相乘的运算;稀疏矩阵的输入形式为三元组表示,运算结果则为通常的阵列形式列出!4、首先输入矩阵的行数和列数,并判别给出的两个矩阵和行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过20;5、程序先给出了菜单项,用户只需按照菜单提示进行相应的操作就行了。
6、测试数据:二、概要设计1、抽象数据类型三元组的定义如下:ADT Triple{数据对象:D={ai| ai(-ElemSet,i=1,2,...,n,n>=0};数据关系:R1={<ai-1,ai>| ai-1,ai(- D,i=2,...,n}基本操作:略}2、基于三元组顺序表表示的矩阵操作:(1)创建三元组顺序表表示的矩阵:void createMatrix(TSMatrix &A)(2)初始化矩阵:void initMatrix(TSMatrix &A)(3)相加:void add(TSMatrix A,TSMatrix B,TSMatrix &C)(4)相减:void sub(TSMatrix A,TSMatrix &B,TSMatrix &C)(5)找m行n列元素在A中顺序表中的位置:int search(TSMatrix A,int m,int n)(6)相乘;void mult(TSMatrix A,TSMatrix B,TSMatrix &C) (7)输入以阵列形式表示的矩阵:void print(TSMatrix A) 3、主程序Void main(){While(true){调用相应函数执行相应操作;输出操作结果;}}4、本程序只有两个模块,调用关系简单:三、详细设计1、三元组结构描述:#define MAXSIZE 20using namespace std;typedef struct{int row;int col;int e;}Triple;typedef struct{Triple date[MAXSIZE];int m,n,len;}TSMatrix;void initMatrix(TSMatrix &A){A.len=0;A.m=0;for(int i=0;i<MAXSIZE;i++){A.date[i].col=0;A.date[i].e=0;A.date[i].row=0;}}2、各种操作函数源代码:void createMatrix(TSMatrix &A){initMatrix(A);cout<<"创建矩阵:";cout<<"请输入矩阵的行列值及非0元素个数\n";cin>>A.m>>A.n>>A.len;for(int i=0;i<A.len;i++){cout<<"请输入第"<<i<<"个非0元素对应的行、列、值:";cin>>A.date[i].row;cin>>A.date[i].col;cin>>A.date[i].e;}}void add(TSMatrix A,TSMatrix B,TSMatrix &C)//相加{if(A.m==B.m&&A.n==B.n){int i=0,j=0;int k=0;C.m=A.m;C.n=A.n;while( i<A.len||j<B.len){if(i==A.len&&j<B.len){C.date[k].col=B.date[j].col;C.date[k].row=B.date[j].row;C.date[k++].e=B.date[j].e;C.len++;j++;}else if(i<A.len&&j==B.len)C.date[k].col=A.date[i].col;C.date[k].row=A.date[i].row;C.date[k++].e=A.date[i].e;C.len++;i++;}else{if(A.date[i].row>B.date[j].row){C.date[k].col=B.date[j].col;C.date[k].row=B.date[j].row;C.date[k++].e=B.date[j].e;C.len++;j++;}else if(A.date[i].row<B.date[j].row){C.date[k].col=A.date[i].col;C.date[k].row=A.date[i].row;C.date[k++].e=A.date[i].e;C.len++;i++;}else{if(A.date[i].col==B.date[j].col){if(A.date[i].e+B.date[j].e!=0){C.date[k].col=A.date[i].col;C.date[k].row=A.date[i].row;C.date[k++].e=A.date[i].e+B.date[j].e;C.len++;}i++;j++;}else if(A.date[i].col>B.date[j].col){C.date[k].col=B.date[j].col;C.date[k].row=B.date[j].row;C.date[k++].e=B.date[j].e;C.len++;j++;}else if(A.date[i].col<B.date[j].col){C.date[k].col=A.date[i].col;C.date[k].row=A.date[i].row;C.date[k++].e=A.date[i].e;C.len++;i++;}}}}}else{cout<<"不能相加!";}}void sub(TSMatrix A,TSMatrix &B,TSMatrix &C)//相减{for(int k=0;k<B.len;k++){B.date[k].e=-B.date[k].e;}if(A.m==B.m&&A.n==B.n){add(A,B,C);}elsecout<<"不能相减!";for( k=0;k<B.len;k++){B.date[k].e=-B.date[k].e;}}int search(TSMatrix A,int m,int n){int flag=-1;for(int i=0;i<MAXSIZE;i++){if(A.date[i].row==m&&A.date[i].col==n){flag=i;break;}}return flag;}void mult(TSMatrix A,TSMatrix B,TSMatrix &C)//相乘{int i=0,j=0;if(A.n==B.m){C.m=A.m;C.n=B.n;for(i=0;i<A.len;i++){for(j=0;j<B.len;j++){if(A.date[i].col==B.date[j].row){int flag=search(C,A.date[i].row,B.date[j].col);if(flag==-1){C.date[C.len].col=B.date[j].col;C.date[C.len].row=A.date[i].row;C.date[C.len++].e=A.date[i].e*B.date[j].e;}else{C.date[flag].e=C.date[flag].e+A.date[i].e*B.date[j].e;}}}}}else{cout<<"不能相乘!"<<endl;}}void print(TSMatrix A){int k=0;int i,j;int M[MAXSIZE][MAXSIZE];for(i=0;i<A.m;i++){for(j=0;j<A.n;j++){M[i][j]=0;}}while(k<A.len){M[A.date[k].row-1][A.date[k].col-1]=A.date[k].e;k++;}for(i=0;i<A.m;i++){cout<<"| ";for(j=0;j<A.n;j++){cout<<M[i][j]<<" ";}cout<<"|"<<endl;}}void showtip(){cout<<"------------请选择要执行的操作--------"<<endl;cout<<endl;cout<<" 0---创建矩阵"<<endl;cout<<" 1---A+B"<<endl;cout<<" 2---A-B"<<endl;cout<<" 3---A*B"<<endl;cout<<" 4---退出"<<endl;cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;}3、主函数:void main(){TSMatrix A,B,C;initMatrix(A);initMatrix(B);initMatrix(C);showtip();int i;cin>>i;while(true){switch(i){case 0:system("cls");cout<<"创建矩阵A:"<<endl;createMatrix(A);cout<<"创建矩阵B:"<<endl;createMatrix(B);showtip();break;case 1:system("cls");if(A.m==0||B.m==0){cout<<"未建矩阵"<<endl;}else{initMatrix(C);add(A,B,C);if(A.m==B.m&&A.n==B.n){cout<<"加的结果;"<<endl;print(A);cout<<"+"<<endl;;print(B);cout<<"="<<endl;print(C);}}break;case 2:system("cls");if(A.m==0||B.m==0){cout<<"未建矩阵"<<endl;}else{initMatrix(C);sub(A,B,C);cout<<"减的结果;"<<endl;print(A);cout<<"+"<<endl;;print(B);cout<<"="<<endl;print(C);}showtip();break;case 3:system("cls");if(A.m==0||B.m==0){cout<<"未建矩阵"<<endl;}else{initMatrix(C);mult(A,B,C);if(A.n==B.m){cout<<"乘后的结果;"<<endl;print(A);cout<<"*"<<endl;print(B);cout<<"="<<endl;print(C);}}showtip();break;case 4:break;}cin>>i;}}四、调试分析1、由于本程序涉及的函数比较多,所以开始时在函数调用上出现了混乱,把自己都给搞糊涂了,后来经仔细排查,最终发现了错误。
数据结构课程设计之稀疏矩阵运算器#include#include#define maxsize 200typedef struct{int i,j;//i为非零元素在行,j为非零元所在列int e;//非零元}Tripe;typedef struct{Tripe data[maxsize];int h,l,total;//稀疏矩阵的行数列数及非零元个数}TSMatrix;void Creat(TSMatrix &M){//创建一个稀疏矩阵int a,b,c,x;scanf("%d,%d,%d",&M.h,&M.l,&M.total);for(x=1;x<=M.total;x++){printf("请输入第%d个稀疏矩阵的非零元素所在的行数列数用逗号隔开输完按回车键:\",x);scanf("%d,%d,%d",&a,&b,&c);M.data[x].i=a;M.data[x].j=b;M.data[x].e=c;}}void Print(TSMatrix &S){//输出稀疏矩阵int x;int c,b,a[maxsize][maxsize];for(c=1;c<=S.h;c++)for(b=1;b<=S.l;b++)a[c][b]=0;//全部初始化为零for(x=1;x<=S.total;x++){a[S.data[x].i][S.data[x].j]+=S.data[x].e;//在矩阵的相应位置附上非零元素}for(c=1;c<=S.h;c++)for(b=1;b<=S.l;b++){printf("%4d",a[c][b]);if(b==S.l)printf("\");}}void Add(TSMatrix T,TSMatrix V,TSMatrix &M){//加法运算int p=1,q=1;int b=1;if(T.h!=V.h||T.l!=V.l){printf("两矩阵行数或列数不同无法进行相加:\"); exit(0);}while(p<=T.total&&q<=V.total){if(T.data[p].i==V.data[q].i){if(T.data[p].j==V.data[q].j){M.data[b].i=T.data[p].i;M.data[b].e=T.data[p].e+V.data[q].e; p++;b++;q++;}else if(T.data[p].j<v.data[q].j)< p=""> {M.data[b].i=T.data[p].i;M.data[b].j=T.data[p].j;M.data[b].e=T.data[p].e;b++;p++;}else if(T.data[p].j>V.data[q].j){M.data[b].i=V.data[q].i;M.data[b].j=V.data[q].j;M.data[b].e=V.data[q].e;b++;q++;}}else if(T.data[p].i<v.data[q].i)< p=""> {M.data[b].i=T.data[p].i;M.data[b].j=T.data[p].j;M.data[b].e=T.data[p].e;b++;p++;}else if(T.data[p].i>V.data[q].i){M.data[b].i=V.data[q].i;M.data[b].j=V.data[q].j;b++;q++;}}//下面两个循环是把上面循环中未处理的数据添加到M中while(p<=T.total){M.data[b].i=T.data[p].i;M.data[b].j=T.data[p].j;M.data[b].e=T.data[p].e;b++;p++;}while(q<=V.total){M.data[b].i=V.data[q].i;M.data[b].j=V.data[q].j;M.data[b].e=V.data[q].e;b++;q++;}M.h=T.h;M.l=T.l;M.total=b-1; //b最后要减一,因为上面处理最后一个数时b也增加1了}void TransposTSMtrix(TSMatrix A,TSMatrix &B) //完成矩阵的转置,一次快速定位法{int j,t,p,q;int num[maxsize],position[maxsize];//num矩阵某列非零元个数,positionB.h=A.l;B.l=A.h;B.total=A.total;if(B.total){for(j=1;j<=A.l;j++)num[j]=0;for(t=1;t<=A.total;t++)num[A.data[t].j]++;position[1]=1;for(j=2;j<=A.l;j++)position[j]=position[j-1]+num[j-1];for(p=1;p<=A.total;p++){j=A.data[p].j;q=position[j];B.data[q].i=A.data[p].j;B.data[q].j=A.data[p].i;B.data[q].e=A.data[p].e;position[j]++;}}}void Jiansmatrix(TSMatrix M,TSMatrix N,TSMatrix &T){ int m=1,n=1,t=1;if(M.h!=N.h||M.l!=N.l){printf("两矩阵行数或列数不同无法进行相减");exit(0);} T.h=M.h;T.l=M.l;while(m<=M.total&&n<=N.total){{if(M.data[m].i==N.data[n].i)if(M.data[m].j==N.data[n].j){if(M.data[m].e==N.data[n].e){T.data[t].i=M.data[m].i;T.data[t].j=M.data[m].j;m++;n++;}else{T.data[t].e=M.data[m].e-N.data[n].e; T.data[t].i=M.data[m].i;T.data[t].j=M.data[m].j;t++;m++;n++;}}else if(M.data[m].j<n.data[n].j)< p=""> {T.data[t].e=M.data[m].e;T.data[t].i=M.data[m].i;T.data[t].j=M.data[m].j;t++;m++;}else if(M.data[m].j>N.data[n].j){T.data[t].e=0-N.data[n].e;T.data[t].i=N.data[n].i;T.data[t].j=N.data[n].j;t++;n++;}else{if(M.data[m].i<n.data[n].i)< p=""> {T.data[t].i=M.data[m].i;T.data[t].j=M.data[m].j;T.data[t].e=M.data[m].e;t++;m++;}else {T.data[t].e=0-N.data[n].e;T.data[t].i=N.data[n].i;T.data[t].j=N.data[n].j;t++;n++;}}}}while(M.total==(m-1)&&n<=N.total) {T.data[t].i=N.data[n].i;T.data[t].j=N.data[n].j;T.data[t].e=N.data[n].e;t++;n++;}while(N.total==(n-1)&&m<=M.total) {T.data[t].i=M.data[m].i;T.data[t].j=M.data[m].j;T.data[t].e=M.data[m].e;t++;m++;}T.total=t-1;}void Multsmatrix(TSMatrix M,TSMatrix N,TSMatrix &T) { int p,q,Qn=0;int a[200][200];if(M.l!=N.h){printf("两矩阵无法相乘");exit(0);}T.h=M.h;T.l=N.l;for(p=1;p<=M.h;p++)for(q=1;q<=N.l;q++)a[p][q]=0;for(p=1;p<=M.total;p++)for(q=1;q<=N.total;q++)if(M.data[p].j==N.data[q].i){a[M.data[p].i][N.data[q].j]+=M.data[p].e*N.data[q].e;}for(p=1;p<=M.h;p++)for(q=1;q<=N.l;q++)if(a[p][q]!=0){Qn++;T.data[Qn].e=a[p][q];T.data[Qn].i=p;T.data[Qn].j=q;}T.total=Qn;}void main(){TSMatrix ts1,ts2,ts3;int choice;do{printf("1.矩阵的转置!\");printf("2.两个矩阵相加!\");printf("3.两个矩阵相减!\");printf("4.两个矩阵相乘!\");printf("5.退出程序!\");printf("请输入您的选择:\");scanf("%d",&choice);switch(choice){case 1:printf("请输入矩阵的行和列及非零元个数用逗号隔开:\"); Creat(ts1);Print(ts1);TransposTSMtrix(ts1,ts2);printf("转置后的矩阵为:\");Print(ts2);break;case 2:printf("请输入第一个矩阵的行和列及非零元个数用逗号隔开:\"); Creat(ts1);printf("第一个矩阵为:\");Print(ts1);printf("请输入第二个矩阵的行和列及非零元个数用逗号隔开:\"); Creat(ts2);printf("第二个矩阵为:\");Print(ts2);Add(ts1,ts2,ts3);printf("以上两个矩阵相加后为:\");Print(ts3);break;case 3:printf("请输入第一个矩阵的行和列及非零元个数用逗号隔开:\"); Creat(ts1);printf("第一个矩阵为:\");Print(ts1);printf("请输入第二个矩阵的行和列及非零元个数用逗号隔开:\"); Creat(ts2);printf("第二个矩阵为:\");Print(ts2);Jiansmatrix(ts1,ts2,ts3);printf("以上两个矩阵相减后为:\");Print(ts3);break;case 4:printf("请输入第一个矩阵的行和列及非零元个数用逗号隔开:\"); Creat(ts1);printf("第一个矩阵为:\");Print(ts1);printf("请输入第二个矩阵的行和列及非零元个数用逗号隔开:\"); Creat(ts2);printf("第二个矩阵为:\");Print(ts2);Multsmatrix(ts1,ts2,ts3);printf("以上两个矩阵相乘后为:\");Print(ts3);break;case 5:exit(0);break;}}while(choice!=0); scanf("%d",&choice); }</n.data[n].i)<></n.data[n].j)<></v.data[q].i)<></v.data[q].j)<>。
课程设计报告题目:计算表达式的值1.问题描述对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值。
基本要求:从键盘输入一个正确的中缀表达式,将中缀表达式转换为对应的后缀表达式,并计算后缀表达式的值。
对于表达式中的简单错误,能够给出提示,并给出错误信息;表达式中可以包括单个字母表示的变量。
测试数据:任意选取一个符合题目要求的表达式。
提高要求:(1)能够处理多种操作符。
(2)实现包含简单运算的计算器。
(3)实现一个包含简单运算和函数运算的计算器。
2.需求分析(1)软件的基本功能本软件实在win32工程下实现的带有界面和图标的功能较为齐全的计算器。
此计算器分三个方面进行计算,分别为数值表达式的计算,字母表达式的计算和函数计算。
可由键盘或用鼠标点击按键输入带有数字或字母的中缀表达式,程序可以将输入的带有数字或字母的中缀表达式转换成对应的后缀表达式,并计算只含有数字的后缀表达式的值。
本软件支持含小数、多位数等多种操作数的处理,可以计算含加、减、乘、除、百分号、求余、求幂,求阶乘,求三角函数的值等多种运算符和函数的表达式(2)输入/输出形式用户可通过打开图标弹出来的计算器界面任意点击操作。
对于在输入时发生的简单错误,软件通过弹出对话框给出提示并且在提示错误的同时自动将用户的出错输入略去转化成正确的表达式进行计算,用户也可选择清楚操作然后重新输入a.对于数值和函数表达式软件会输出其表达式的后缀表达式和计算结果并保留六位小数;b.对于字母表达式因字母无法进行数值运算,软件仅输出其后缀表达式的值;清楚按钮可以清楚有已经输入或输出的数据从头计算;软件窗口可实现最小化。
并且输入编辑框可进行修改,复制,粘贴等操作,但后缀表达式和求值结果的编辑框中的内容不可修改,只能执行复制操作。
(3)测试数据要求用户可以输入一个符合要求的中缀表达式,也可以输入一个包含简单错误的表达式。
特殊矩阵运算1.1程序功能简介对特殊矩阵能够在界面上以人们熟悉的方式显示,可以对特殊矩阵进行加法运算和减法运算,矩阵转置。
按照要求使用了多种数据结构来求解问题,具体为二维数组和类似图的数据结构。
由于题目要求使用多种数据结构,因此分开写了两段程序,均实现了上述要求的功能,以下将分开说明。
先说明的是用二维数组实现的程序,后说明的是用图结构实现的程序。
1.2关于输入、输出形式及数据范围1.2.1使用二维数组实现的程序输入、输出范围为:-000到000,足以解决绝大多数的矩阵运算问题。
1.2.2输入的格式进入程序后首先展现的是功能选择界面,如下图:此时可通过输入对应功能的数字来选择功能。
在此程序中不同功能输入格式不同:选择功能1.矩阵转置时需要输入要进行转置操作的矩阵,首先输入矩阵的行数和列数,以逗号隔开,之后依次按矩阵形式输入矩阵即可,各数值之间以空格隔开。
选择功能2.矩阵数乘时需要输入要进行数乘操作的矩阵,此输入格式同上,之后输入一个实数,即要进行数乘的数即可。
功能3.矩阵加法与4.矩阵减法输入格式和5.矩阵乘法相同,按上述操作输入两个矩阵即可,需要注意的是矩阵减法默认顺序为先输入的矩阵减去后输入的矩阵。
当按照格式输入时可以实现以上功能,但输入错误数据时,例如进行行列数不同的矩阵相加减时则会返回无法操作,请重新输入的提示。
具体情况见下文测试部分。
1.3.1使用图结构实现的稀疏矩阵运算器程序输入、输出范围同上。
1.3.2输入的格式进入程序后首先展现的是功能选择界面,如下图:选择功能部分输入同上。
在进行矩阵输入时采取三元组的形式,这是由于稀疏矩阵的多零元性质。
首先输入矩阵的行数、列数、非零元个数,以空格隔开,输入完毕后确认,开始输入各个非零元。
输入非零元时按“所在行下标所在列下标值”的形式输入,需要注意的是输入时只能从所在行小的开始按顺序输入,不能先输入行数大的数据再输入行数小的数据。
2 概要设计2.1用二维数组实现的程序的概要设计由于使用二维数组结构实现上述功能较为简单,故全部运算仅由主函数执行,不单写出各个简单的函数。
运用数据结构实现计算器运用数据结构实现计算器1.简介本文档将介绍如何使用数据结构来实现一个计算器。
计算器是一种用于执行数学运算的工具,通过输入表达式来计算结果。
我们将使用数据结构来存储和处理表达式中的数据和运算符。
2.功能需求我们的计算器将具有以下功能:●支持基本的四则运算(加法、减法、乘法、除法)●支持括号运算●支持多位数和小数运算●支持优先级运算(乘法和除法的优先级高于加法和减法)3.数据结构设计我们将使用以下数据结构来实现计算器:●栈(Stack):用于存储运算符和括号,以实现运算符优先级处理和括号匹配。
●队列(Queue):用于存储数值和中间结果,以实现表达式的计算和保存结果。
4.算法设计计算器的核心算法如下:●表达式解析:将输入的表达式解析为数值和运算符,并存储在队列中。
●运算符优先级处理:使用栈来存储运算符并进行优先级处理,确保正确的运算顺序。
●括号匹配:使用栈来匹配括号,以确保括号内的表达式可以正确计算。
●表达式计算:使用队列中的数值和运算符进行计算,并得出最终结果。
5.界面设计计算器可以有一个简单的用户界面,包括一个文本框用于输入表达式和一个按钮用于计算。
在计算完成后,结果将显示在另一个文本框中。
6.实现步骤要实现计算器,可以按照以下步骤进行:1.设计数据结构:确定使用的数据结构,包括栈和队列。
2.实现表达式解析:编写代码将输入的表达式解析为队列中的数值和运算符。
3.实现运算符优先级处理:编写代码使用栈来处理运算符的优先级。
4.实现括号匹配:编写代码使用栈来匹配括号。
5.实现表达式计算:编写代码使用队列中的数据进行计算并得出结果。
6.设计界面:创建用户界面,包括输入表达式的文本框、计算按钮和显示结果的文本框。
7.组合功能:将各个模块结合起来,实现完整的计算器功能。
7.附件本文档不涉及附件。
8.法律名词及注释本文档不涉及法律名词及注释。
课程设计任务书目录PART I1 需求分析 (2)2 算法基本原理 (2)3 类设计 (3)4 详细设计 (4)4.1类的接口设计 (4)4.2类的实现 (5)4.3主函数设计 (11)5 运行结果与分析 (12)5.1程序运行结果 (12)5.2运行结果分析 (14)PART Ⅱ1 需求分析 (24)2 算法基本原理 (24)3 类设计 (14)4 详细设计 (15)4.1类的实现 (15)4.2主函数设计 (19)5 运行结果与分析 (27)5.1程序运行结果 (27)5.2运行结果分析 (27)6 参考文献 (15)PART I1 需求分析矩阵是线性代数里一个重要的概念,在这里采用C++语言实现一个简单的n ×n矩阵类,类中包括一些简单的运算等操作具体要求如下:(1)使用构造函数完成方阵的初始化赋值(动态内存分配);(2)使用析构函数完成矩阵动态内存的释放;(3)重载加法运算符+,实现两个矩阵的和;(4)重载加法运算符-,实现两个矩阵的差;(5)重载加法运算符*,实现两个矩阵的积;(6)重载加法运算符=,实现两个矩阵之间的赋值;(7)使用函数实现矩阵的转置;(8)使用函数求矩阵中的最大值;(9)使用函数求矩阵中的最小值;(10)添加函数Det以得到矩阵对应行列式的值;(11)重载加法运算符<<,实现矩阵按照行列的格式输出;(12)编写一个主函数测试上述功能。
2 算法基本原理矩阵进行加法,减法,乘法运算时,必须满足两个矩阵阶数相同的条件。
加法,减法计算是把矩阵对应的各行各列的每一对数值分别进行加减法运算,结果组成一个新的同阶矩阵。
矩阵乘法是这样定义的,只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。
一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p),满足矩阵乘法满足结合率,但不满足交换率3 类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是矩阵运算。
数据结构课程设计报告实验一:计算器设计要求1、问题描述:设计一个计算器,可以实现计算器的简单运算,输出并检验结果的正确性,以及检验运算表达式的正确性。
2、输入:不含变量的数学表达式的中缀形式,可以接受的操作符包括+、-、*、/、%、(、)。
具体事例如下:3、输出:如果表达式正确,则输出表达式的正确结果;如果表达式非法,则输出错误信息。
具体事例如下:知识点:堆栈、队列实际输入输出情况:正确的表达式对负数的处理表达式括号不匹配表达式出现非法字符表达式中操作符位置错误求余操作符左右出现非整数其他输入错误数据结构与算法描述解决问题的整体思路:将用户输入的中缀表达式转换成后缀表达式,再利用转换后的后缀表达式进行计算得出结果。
解决本问题所需要的数据结构与算法:用到的数据结构是堆栈。
主要算法描述如下:A.将中缀表达式转换为后缀表达式:1. 将中缀表达式从头逐个字符扫描,在此过程中,遇到的字符有以下几种情况:1)数字2)小数点3)合法操作符+ - * / %4)左括号5)右括号6)非法字符2. 首先为操作符初始化一个map<std::string,int> priority,用于保存各个操作符的优先级,其中+ -为0,* / %为13. 对于输入的字符串from和输出的字符串to,采用以下过程:初始化遍历器 std::string::iterator it=infix.begin()在当it!=from.end(),执行如下操作4. 遇到数字或小数点时将其加入到后缀表达式:case'1':case'2':case'3':case'4':case'5':case'6':case'7':case '8':case'9':case'0':case'.':{to=to+*it;break;}5. 遇到操作符(+,-,*,/,%)时,如果此时栈顶操作符的优先级比此时的操作符优先级低,则将其入栈,否则将栈中的操作符从栈顶逐个加入到后缀表达式,直到栈空或者遇到左括号,并将此时的操作符加入到栈中,在此过程中需判断表达式中是否出现输入错误:case'+':case'-':case'*':case'/':case'%':{if((it+1)==from.end()){cout<<"输入错误:运算符号右边缺少运算数"<<endl;return false;}if((*it=='*'||*it=='/')&&it==from.begin()){cout<<"输入错误:运算符号左边缺少运算数"<<endl;return false;}if((it+1)!=from.end()&&(*(it+1)=='+'||*(it+1)=='-'||*(it+1)=='*'||*(it+1)=='/' ||*(it+1)=='%')){cout<<"输入错误:运算符号连续出现"<<endl;return false;}to=to+" ";if(sym.empty()){sym.push(*it);break;}tem=sym.top();while(pri[*it]<=pri[tem]&&!sym.empty()&&tem!='('){to=to+tem+" ";sym.pop();if(sym.empty())break;tem=sym.top();}sym.push(*it);break;}6. 遇到“(”时,直接将其加入操作符栈,并且检测输入错误,并且当括号后的第一个符号为-时,说明用户试图输入负号,这种情况我们向目标表达式输出一个0,以达到处理负号的目的:case'(':{if((it+1)==from.end()){cout<<"输入错误:表达式以左括号结尾"<<endl;return false;}//若以+或者-开头,则按照正负号看待,向目标表达式中加入一个0if(*(it+1)=='-'||*(it+1)=='+'){to=to+'0';}if((it+1)!=from.end()&&((*(it+1)=='*'||*(it+1)=='/'||*(it+1)=='%'||*(it+1)==')'))) {cout<<"输入错误:左括号右边不能为运算符号或右括号"<<endl;return false;}if(it!=from.begin()&&(*(it-1)!='+'&&*(it-1)!='-'&&*(it-1)!='*'&&*(it-1)!='/'&&*(it-1)!='%'&&*(it-1)!='(')){cout<<"输入错误:左括号左边不能为运算数或右括号"<<endl;return false;}sym.push(*it);break;}5.遇到“)”时,将栈中的操作符从栈顶逐个弹出并放入后缀表达式中,直到在栈中遇到“(”,并将“(”从栈中弹出:case')':{if((it+1)!=from.end()&&*(it+1)!='+'&&*(it+1)!='-'&&*(it+1)!='*'&&*(it+1)!='/'&&*(it+1)!='%'&&*(it+1)!=')'){cout<<"输入错误:右括号右边不能为运算数"<<endl;return false;}if(it!=from.begin()&&(*(it-1)=='+'||*(it-1)=='-'||*(it-1)=='*'||*(it-1)=='/'||*(it-1)=='%')){cout<<"输入错误:右括号左边不能为运算符号"<<endl;return false;}to=to+" ";if(sym.empty()){cout<<"输入错误:表达式以右括号开始"<<endl;return false;}tem=sym.top();while(tem!='('){to=to+tem+" ";sym.pop();if(sym.empty()){cout<<"输入错误:括号匹配有误"<<endl;return false;}tem=sym.top();}sym.pop();break;}B.计算后缀表达式的主要思想:逐个字符的扫描后缀表达式,遇到单个数字或小数点时则先将其将其存到一个字符串中,当遇到后缀表达式中的分隔符(这里使用空格)时,则将这个字符串转化为数字放到堆栈numstack中;case'1':case'2':case'3':case'4':case'5':case'6':case'7':case '8':case'9':case'0':case'.':{numtemp+=*it;break;}case' ':{if(numtemp!=""){if(numtemp.find('.')&&numtemp.find('.',(numtemp.find('.')+1))!=string::npos){cout<<"输入错误:小数点数目超出:"+numtemp<<endl;return false;}strm.str(numtemp);strm>>d;numstack.push(d);numtemp="";strm.str("");strm.clear();break;}break;}2.遇到操作符+,-,*,/,%时,将堆栈numstack中的栈顶的两个数取出来,进行相应操作的运算,并将结果加入到堆栈numstack 中;case'+':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();numstack.push(d1+d2);break;}case'-':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();numstack.push(d1-d2);break;}case'*':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();numstack.push(d1*d2);break;}case'/':{d2=numstack.top();numstack.pop();if(fabs(d2)<0.0000001){cout<<"输入错误:除数不能为0"<<endl;return false;}d1=numstack.top();numstack.pop();numstack.push(d1/d2);break;}case'%':{d2=numstack.top();numstack.pop();d1=numstack.top();numstack.pop();if((fabs(d2-(int)d2))<0.0000001&&(fabs(d1-(int)d1))<0.0000001){int n1=(int)d1;int n2=(int)d2;numstack.push((double)(n1%n2));break;}else{cerr<<"输入错误:求模操作只能作用于整数"<<endl;return false;}}3.直到后缀表达式扫描完并且堆栈numstack中只有一个数值,则此数值为计算的最终结果,否则说明输入有误。
数据结构课程设计题目名称:模拟计算器程序计算机科学与技术学院课程设计任务书一、设计任务设计一个模拟计算器的程序二、设计要求1、要求对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解2、程序基本功能要求实现完整,并有简单的验证。
3、设计报告要求格式规范,符合学校课程设计报告要求。
4、报告中流程图要求描述规范,算法设计清楚正确。
三、设计期限2018年3月5日到2018年3月30日前言利用本学期所学的《数据结构》课程,运用相关知识,查阅相关资料,编写C语言程序,设计一个简单计算器,要求编写的简单计算器能够模拟windows系统的计算器,用户能够用键盘输入相关数据,要求对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解,并且在程序运行过程中能够正常的退出程序。
这个程序实际上就是对一个表达式进行计算。
而一个算术表达式中包含各种运算符,每个运算符的等级可能会不同,这就成了本程序需要解决的一个主要的问题之一了。
另外计算器中需要有各种数学函数,比如:abs sqrt sin cos tan等,如何对这些函数进行处理,也是本程序能成功的一个关键。
还有一个问题就是如何处理操作符和操作数之间的关系也是一个要点。
例如:1+2*(3-2/1),经过怎么样的变换和处理能得出结果5。
数据的输入这里应该要用字符,然后通过字符和整形之间的关系进行转换即可,这样处理的话,就方便很多了。
在计算器程序运行中,输入数据时如果遇到输入错误的情况,能够能过键盘上的退格键进行删除,并且重新输入正确的数据。
在数据输入完成后,如果需要放弃本次计算操作,可以利用程序中设置好的按键进行清零,并为下一次运算作准备。
本课程设计主要解决的是传统计算器中,不能对表达式进行运算的问题,通过制作该计算器模拟程序,可以做到快速的求解表达式的值,并且能够判定用户输入的表达式是否合法。
该模拟计算器的核心部分就在用户输入的中缀表达式的转化,程序中用到了“栈”的后进先出的基本性质。
‘实验报告题目:稀疏矩阵运算器班级:14电子商务平台建设班完成日期:2015.11.2 学号:姓名:孙少辉学号:姓名:杨德龙学号:姓名:柴益新一:需求分析稀疏矩阵是指那些多数元素为零的矩阵。
利用“稀疏“特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
【基本要求】以“带行逻辑链接信息“的三元组顺序表示稀疏矩阵,实现两个矩阵相加、相减和相乘运算。
稀疏矩阵的输入采用三元组表示,而运算结果的矩阵则以通常阵列形式列出。
【项目约束】1.首先应输入矩阵的行数和列数,并判断给出的两个矩阵行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过20。
2.程序可以对三元组的输入顺序加以限制,例如,按行优先。
注意研究教科书5.3.2节中的算法,以便提高计算效率。
3.在用三元组稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放。
三:详细设计1:数据结构的定义元素类型、变量、指针类型(1)项目数据表:3.2子函数3:函数调用关系无函数调用关系,只有一个主函数四:调试分析三元组顺序的输入规则。
以0 0 0 作为输入的结束信号。
完成实现稀疏矩阵的相加、相减、相乘的运算。
五:用户使用说明(1)首先运行文件系统1.首先定义要运算的第一个稀疏矩阵的行列数定义完成之后输入另一个要运算的稀疏矩阵的行列。
(2)输入信息:如下图所示输入两个矩阵的元素所有输入信息以及运算方法输入完成之后。
回车直接算出结果(3)输出信息:六、源代码/*****项目名称:稀疏矩阵的运算***设计者:杨德龙,柴益新,孙少辉***时间:2015.11.02***实现目标:实现矩阵的加法,减法,乘法;***/#include<stdio.h>#include<windows.h>int main(){//定义二维数组及用到的各种变量int a[20][20];int b[20][20];int c[20][20];int m,n,k,l,i,j,p;int sum;int o;char t;//输入操作printf("请输入第一个矩阵的行列\n");scanf("%d%d",&n,&m); //初始化a数组for(i=0;i<n;i++)for(j=0;j<m;j++)a[i][j]=0;printf("请输入第二个矩阵的行列\n");scanf("%d%d",&k,&l); //初始化b数组for(i=0;i<n;i++)for(j=0;j<m;j++)b[i][j]=0;printf("请用三元组的方式输入第一个矩阵(例1 1 1)(输入0 0 0时结束)\n");while(true){scanf("%d%d%d",&i,&j,&p);if(i==0 && j==0 && p==0)break;elsea[i-1][j-1]=p;}printf("请用三元组的方式输入第二个矩阵(例1 1 1)(输入0 0 0时结束)\n");while(true){scanf("%d%d%d",&i,&j,&p);if(i==0 && j==0 && p==0)break;elseb[i-1][j-1]=p;}printf("请输入执行操作(+或-或*)\n");while(true){getchar();scanf("%c",&t);if(t=='+') //加法运算{{printf("不能进行该运算!!");exit(0); //结束}else{printf("答案为:\n");for(i=0;i<n;i++){for(j=0;j<m;j++){printf("%d ",a[i][j]+b[i][j]);}printf("\n");}exit(0); //结束}}else if(t=='-') //减法运算{{printf("不能进行该运算!!");exit(0); //结束}else{printf("答案为:\n");for(i=0;i<n;i++){for(j=0;j<m;j++){printf("%d ",a[i][j]-b[i][j]);}printf("\n");}exit(0); //结束}}else if(t=='*') //乘法运算{if(m!=k){printf("不能进行该运算!!");exit(0); //结束}else{printf("答案为:\n");for(o=0;o<n;o++){for(i=0;i<l;i++){sum=0;for(j=0;j<m;j++){sum=sum+a[o][j]*b[j][i];}printf("%d ",sum);}printf("\n");}exit(0); //结束}v .. . ..}elseprintf("输入符号错误,重新输入:\n");}return 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)操作结果:创建稀疏矩阵矩阵TMLocateELem(TSMatrix M,int i,int j,int e)初始条件:稀疏矩阵M存在操作结果:稀疏矩阵中是否存在非零元素A[i][j],若存在返回edisp(TSMatrix TM)初始条件:稀疏矩阵TM存在操作结果:通常形式输出稀疏矩阵InsertSortMatrix(TSMatrix &TM)初始条件:稀疏矩阵TM存在操作结果:根据对矩阵的行列,三元组TM作直接插入排序TransposeSMatrix(TSMatrix M,TSMatrix &T)初始条件:稀疏矩阵M和T存在操作结果:求稀疏矩阵M转置的稀疏矩阵TAddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)初始条件:稀疏矩阵A,B和C存在操作结果:稀疏矩阵的加法运算:C=A+BSubTSM(TSMatrix A,TSMatrix B,TSMatrix &C)初始条件:稀疏矩阵A,B和C存在操作结果:稀疏矩阵的减法运算:C=A-BMultSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C)初始条件:稀疏矩阵A,B和C存在操作结果:稀疏矩阵的乘法运算:C=A×BNiMatrix(TSMatrix &TM)初始条件:稀疏矩阵TM存在操作结果:稀疏矩阵求逆}ADT SparseMatrix;2. 主程序:void main( ){初始化;do {接受命令;选择处理命令;}while(命令!=“退出”) }3. 本程序有四个模块,调用关系如下:图2.1 4 本程序的流程图图2.2第三章设计步骤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 ;int a ;};主要函数:tripletable();~tripletable();void convert( ) ;void add( );void multi ( );void main( );3.2设计步骤:设计一个矩阵类实现矩阵的运算:class tripletable(包含矩阵的各种运算函数)。
数据结构课程设计-特殊矩阵计算器-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN特殊矩阵计算器1、特殊矩阵计算器问题描述:创建两个特殊矩阵 A 和 B,计算 A+B、A-B、A*B、B*A、A(或 B)的逆、A(或 B)的转置、A(或 B)的行列式等,具体要求如下:① A、B 均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。
② A、B 的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。
③各运算若可行,则打印结果;若不可行,则给出提示信息。
④各运算需自己实现,禁止调用语言內建或第三方类库的矩阵 API。
涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。
#include<>#include<>#define max 100typedef struct{int row,col;//定义矩阵行数、列数int a[max][max];}Matrix; //存储结构typedef struct{int array[max];int n; //定义矩阵的阶}M;Matrix A,B,C,D;M p;//*************矩阵的压缩存储*********************//int CompressMatrix(int m,int i,int j,int n){int k;if(m==1){if(i<=j)k=(2*n-i+1)*i/2+(j-i)+1;elsek=0;return k;}if(m==2){if(i>=j)k=i*(i+1)/2+j+1;elsek=0;return k;}if(m==3){if(i>=j)k=i*(i+1)/2+j;elsek=j*(j+1)/2+i;return k;}if(m==4){if(i!=j)k=0;elsek=i+1;return k;}if(m==5){if(i==j)return 1;elsereturn 0;}return 0;}//*************矩阵定义*********************////上三角矩阵 //void CreateMatrixUppertri(M &a,Matrix &A){int i,j,t,n;printf("请输入上三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(1,i,j,n);[i][j]=[t];}}//下三角矩阵void CreateMatrixLowertri(M &a,Matrix &A){int i,j,t,n;printf("请输入下三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(2,i,j,n);[i][j]=[t];}}//对称矩阵void CreateMatrixSymmetry(M &a,Matrix &A){int i,j,t,n;printf("请输入对称矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);for(i=0;i<n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(3,i,j,n);[i][j]=[t];}}//对角矩阵void CreateMatrixDiagonal(M &a,Matrix &A){int i,j,t,n;printf("请输入对角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n);[0]=0;for(i=1;i<=n;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(4,i,j,n);[i][j]=[t];}}//单位矩阵void CreateMatrixUnit(M &a,Matrix &A){int i,j,t,n;printf("请输入单位矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;[0]=0;[1]=1;for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(5,i,j,n);[i][j]=[t];}}//*************矩阵运算*********************////矩阵加法int Add(Matrix A,Matrix B,Matrix &C){int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j]+[i][j];}return 1;}//矩阵减法int Sub(Matrix A,Matrix B,Matrix &C){int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j][i][j];}return 1;}//矩阵乘法int Mul(Matrix A,Matrix B,Matrix &C){int i,j,k;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=0;for(i=0;i<;i++) //A的行数for(j=0;j<;j++) //A的列数和B的行数for(k=0;k<;k++) //B的列数[i][j]+=[i][k]*[k][j];}return 1;}//矩阵的逆运算void Inverse(Matrix A){Matrix C;float p,q;int k,i,j,n;n=;for(i=0;i<n ;i++)for(j=0;j<(n *2);j++){if(j<n)[i][j]= [i][j];else if(j==n+i)[i][j]=;else[i][j]=;}for(k=0;k<n ;k++){for(i=0;i<n ;i++){if(i!=k){p= [i][k]/ [i][i];for(j=0;j<(n *2);j++){q= [i][j]*p;[i][j]= [i][j]-q;}}}}for(i=0;i<n ;i++){p=[i][i];for(j=0;j<n*2;j++)[i][j]=[i][j]/p;float y=;for(i=0;i<n;i++)y=y*[i][i];for(i=0;i<n;i++)for(j=0;j<n;j++)[i][j]=[i][j+n];printf("逆运算结果:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",[i][j]);printf("\n");}}}//矩阵转置void Tans(Matrix A,Matrix &C){int i,j;=;=;for(i=0;i<;i++)for(j=0;j<;j++)[j][i]=[i][j];}//矩阵行列式的值void Determinant(Matrix A) {int count[100];int sum=0;int n;n=; //矩阵的阶nfor (int p = 0; p < n; p++) {int k = 0; int j = p%n;count[p]= [k][p];for (int i = 1; i < n; i++) {k++; j++;k = k%n;j = j%n;count[p] *= [k][j];}}for (p = n-1; p >=0; p--) {int k = 0; int j = p%n;count[2*n-1-p] = [k][p];for (int i = 1; i < n; i++) {k++; j--;k = (k+n)%n;j =(j+n)%n;count[2*n-1-p] *= [k][j];}}for (int i = 0; i < n; i++)sum+= (count[i]-count[i + n]);printf(" %d\n",sum);}//输出函数void print(Matrix A){int i,j;for(i=0;i<;i++){for(j=0;j<;j++)printf(" %d ",[i][j]);printf("\n");}//菜单函数void showMenu(){printf("特殊矩阵计算器\n");printf("选项1:上三角矩阵\n");printf("选项2:下三角矩阵\n");printf("选项3:对称矩阵\n");printf("选项4:对角矩阵\n");printf("选项5:单位矩阵\n");}void showMenu2(){printf("输入选项得到结果后,如果想继续选择,请输入“Y”,否则输入任意字符退出:\n");printf("选项1:矩阵相加\n");printf("选项2:矩阵相减\n");printf("选项3:矩阵相乘\n");printf("选项4:矩阵的逆矩阵\n");printf("选项5:矩阵转置\n");printf("选项6:矩阵行列式\n");}//主函数int main(){char ifcontinue;int x;int y;showMenu();//输出矩阵Aprintf("矩阵A类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,A);printf("输出上三角矩阵A:\n");print(A);}if(x==2){CreateMatrixLowertri(p,A);printf("输出下三角矩阵A:\n");print(A);if(x==3){CreateMatrixSymmetry(p,A);printf("输出对称矩阵A:\n");print(A);}if(x==4){CreateMatrixDiagonal(p,A);printf("输出对角矩阵A:\n");print(A);}if(x==5){CreateMatrixUnit(p,A);printf("输出单位矩阵A:\n");print(A);}//输出矩阵Bprintf("矩阵B类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,B);printf("输出上三角矩阵B:\n");print(B);}if(x==2){CreateMatrixLowertri(p,B);printf("输出下三角矩阵B:\n");print(B);}if(x==3){CreateMatrixSymmetry(p,B);printf("输出对称矩阵B:\n");print(B);}if(x==4){CreateMatrixDiagonal(p,B);printf("输出对角矩阵B:\n");print(B);}if(x==5){CreateMatrixUnit(p,B);printf("输出单位矩阵B:\n");print(B);}//选择矩阵运算showMenu2();while(1){printf("请选择运算方式(输入数字选择):\n");scanf("%d",&y);switch(y){case 1:if(Add(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 2:if(Sub(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 3:if(Mul(A,B,C))print(C);elseprintf("运算错误\n");printf("----------------------------------\n");if(Mul(B,A,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 4:Inverse(A);printf("----------------------------------\n");Inverse(B);printf("**********************************\n");break;case 5:Tans(A,C);print(C);printf("----------------------------------\n");Tans(B,C);print(C);printf("**********************************\n");break;case 6:Determinant(A);printf("----------------------------------\n");Determinant(B);printf("**********************************\n");break;default:printf("请输入正确的选项!\n");printf("**********************************\n");}getchar();ifcontinue= getchar();if(ifcontinue!='Y')break;}return 0;}。
数据结构课程设计 计算器一、课程目标知识目标:1. 让学生掌握计算器的基本数据结构原理,包括栈、队列等在计算器中的应用。
2. 使学生理解表达式求值的中缀转后缀方法,并能够运用数据结构实现转换过程。
3. 让学生掌握利用数据结构进行有效计算的过程,如利用栈进行算术表达式的求值。
技能目标:1. 培养学生运用数据结构解决实际问题的能力,如设计并实现一个简单的计算器程序。
2. 培养学生通过编程实践,加深对计算器内部处理机制的理解,提高编程技能。
3. 培养学生团队合作能力,通过小组合作完成课程设计任务。
情感态度价值观目标:1. 培养学生对计算机科学和编程的兴趣,激发其探究计算器内部原理的欲望。
2. 培养学生严谨的科学态度,注重细节,追求程序的正确性和效率。
3. 培养学生面对问题时,能够积极寻求解决方案,勇于克服困难的精神。
课程性质分析:本课程设计为高年级的数据结构课程实践环节,旨在通过实际案例让学生将理论知识与实际应用相结合,加深对数据结构原理的理解。
学生特点分析:学生已经具备了一定的编程基础和数理逻辑思维能力,能够理解较为复杂的数据结构,并具备一定的程序设计能力。
教学要求:1. 教师应引导学生主动探究,培养学生自主学习能力。
2. 教学过程中注重理论与实践相结合,强调动手实践能力。
3. 注重培养学生的团队协作能力和沟通能力,提高其综合素质。
二、教学内容1. 计算器的基本数据结构原理:- 栈的概念、原理及应用- 队列的概念、原理及应用2. 表达式求值:- 中缀表达式与后缀表达式的转换方法- 利用栈进行后缀表达式的求值3. 计算器程序设计:- 设计计算器程序的需求分析- 计算器程序的数据结构设计- 计算器程序的核心算法实现4. 课程实践:- 按照教学进度,分阶段完成计算器程序的设计与实现- 小组合作,进行程序调试与优化- 提交课程设计报告,分享学习成果教学内容安排与进度:1. 第1周:学习计算器基本数据结构原理,了解栈、队列的应用场景2. 第2周:学习表达式求值方法,掌握中缀转后缀及后缀求值算法3. 第3周:进行计算器程序设计,完成需求分析、数据结构设计和核心算法实现4. 第4周:课程实践,小组合作完成计算器程序的设计与实现,进行调试与优化5. 第5周:提交课程设计报告,进行成果分享和总结教材章节关联:本教学内容与教材中“数据结构”、“算法设计与分析”章节相关,结合实际案例,引导学生将所学知识应用于计算器程序设计中。
特殊矩阵计算器1、特殊矩阵计算器问题描述:创建两个特殊矩阵 A 和 B,计算 A+B、A-B、A*B、B*A、A(或 B)的逆、A(或 B)的转置、A(或 B)的行列式等,具体要求如下:① A、B 均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。
② A、B 的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。
③各运算若可行,则打印结果;若不可行,则给出提示信息。
④各运算需自己实现,禁止调用语言內建或第三方类库的矩阵 API。
涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。
#include<stdio.h>#include<math.h>#define max 100typedef struct{int row,col;//定义矩阵行数、列数int a[max][max];}Matrix; //存储结构typedef struct{int array[max];int n; //定义矩阵的阶}M;Matrix A,B,C,D;M p;//*************矩阵的压缩存储*********************//int CompressMatrix(int m,int i,int j,int n){int k;if(m==1){if(i<=j)k=(2*n-i+1)*i/2+(j-i)+1;elsek=0;return k;}if(m==2){if(i>=j)k=i*(i+1)/2+j+1;elsek=0;return k;}if(m==3){if(i>=j)k=i*(i+1)/2+j;elsek=j*(j+1)/2+i;return k;}if(m==4){if(i!=j)k=0;elsek=i+1;return k;}if(m==5){if(i==j)return 1;elsereturn 0;}return 0;}//*************矩阵定义*********************////上三角矩阵//void CreateMatrixUppertri(M &a,Matrix &A){int i,j,t,n;printf("请输入上三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row;a.n=n;printf("请输入%d个数:",n*(n+1)/2);a.array[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&a.array[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(1,i,j,n);A.a[i][j]=a.array[t];}}//下三角矩阵void CreateMatrixLowertri(M &a,Matrix &A){int i,j,t,n;printf("请输入下三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row;a.n=n;printf("请输入%d个数:",n*(n+1)/2);a.array[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&a.array[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(2,i,j,n);A.a[i][j]=a.array[t];}}//对称矩阵void CreateMatrixSymmetry(M &a,Matrix &A){int i,j,t,n;printf("请输入对称矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row;a.n=n;printf("请输入%d个数:",n*(n+1)/2);for(i=0;i<n*(n+1)/2;i++)scanf("%d",&a.array[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(3,i,j,n);A.a[i][j]=a.array[t];}}//对角矩阵void CreateMatrixDiagonal(M &a,Matrix &A){int i,j,t,n;printf("请输入对角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row;a.n=n;printf("请输入%d个数:",n);a.array[0]=0;for(i=1;i<=n;i++)scanf("%d",&a.array[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(4,i,j,n);A.a[i][j]=a.array[t];}}//单位矩阵void CreateMatrixUnit(M &a,Matrix &A){int i,j,t,n;printf("请输入单位矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&A.row,&A.col);n=A.row;a.n=n;a.array[0]=0;a.array[1]=1;for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(5,i,j,n);A.a[i][j]=a.array[t];}}//*************矩阵运算*********************////矩阵加法int Add(Matrix A,Matrix B,Matrix &C) {int i,j;if(A.row!=B.row)return 0;else{C.row=A.row;C.col=A.col;for(i=0;i<A.row;i++)for(j=0;j<A.col;j++)C.a[i][j]=A.a[i][j]+B.a[i][j];}return 1;}//矩阵减法int Sub(Matrix A,Matrix B,Matrix &C) {int i,j;if(A.row!=B.row)return 0;else{C.row=A.row;C.col=A.col;for(i=0;i<A.row;i++)for(j=0;j<A.col;j++)C.a[i][j]=A.a[i][j]-B.a[i][j];}return 1;}//矩阵乘法int Mul(Matrix A,Matrix B,Matrix &C) {int i,j,k;if(A.row!=B.row)return 0;else{C.row=A.row;C.col=A.col;for(i=0;i<A.row;i++)for(j=0;j<A.col;j++)C.a[i][j]=0;for(i=0;i<A.row;i++) //A的行数for(j=0;j<A.col;j++) //A的列数和B的行数for(k=0;k<A.col;k++) //B的列数C.a[i][j]+=A.a[i][k]*B.a[k][j];}return 1;}//矩阵的逆运算void Inverse(Matrix A){Matrix C;float p,q;int k,i,j,n;n=A.row;for(i=0;i<n ;i++)for(j=0;j<(n *2);j++){if(j<n)C.a [i][j]=A.a [i][j];else if(j==n+i)C.a [i][j]=1.0;elseC.a [i][j]=0.0;}for(k=0;k<n ;k++){for(i=0;i<n ;i++){if(i!=k){p=C.a [i][k]/C.a [i][i];for(j=0;j<(n *2);j++){q=C.a [i][j]*p;C.a [i][j]=C.a [i][j]-q;}}}}for(i=0;i<n ;i++){p=C.a[i][i];for(j=0;j<n*2;j++)C.a[i][j]=C.a[i][j]/p;float y=1.0;for(i=0;i<n;i++)y=y*C.a[i][i];for(i=0;i<n;i++)for(j=0;j<n;j++)A.a[i][j]=C.a[i][j+n];printf("逆运算结果:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",A.a[i][j]);printf("\n");}}}//矩阵转置void Tans(Matrix A,Matrix &C){int i,j;C.row=A.row;C.col=A.col;for(i=0;i<A.row;i++)for(j=0;j<A.col;j++)C.a[j][i]=A.a[i][j];}//矩阵行列式的值void Determinant(Matrix A) {int count[100];int sum=0;int n;n=A.row; //矩阵的阶nfor (int p = 0; p < n; p++) {int k = 0; int j = p%n;count[p]= A.a[k][p];for (int i = 1; i < n; i++) {k++; j++;k = k%n;j = j%n;count[p] *= A.a[k][j];}}for (p = n-1; p >=0; p--) {int k = 0; int j = p%n;count[2*n-1-p] = A.a[k][p];for (int i = 1; i < n; i++) {k++; j--;k = (k+n)%n;j =(j+n)%n;count[2*n-1-p] *= A.a[k][j];}}for (int i = 0; i < n; i++)sum+= (count[i]-count[i + n]);printf(" %d\n",sum);}//输出函数void print(Matrix A){int i,j;for(i=0;i<A.row;i++){for(j=0;j<A.col;j++)printf(" %d ",A.a[i][j]);printf("\n");}}//菜单函数void showMenu(){printf("特殊矩阵计算器\n");printf("选项1:上三角矩阵\n");printf("选项2:下三角矩阵\n");printf("选项3:对称矩阵\n");printf("选项4:对角矩阵\n");printf("选项5:单位矩阵\n");}void showMenu2(){printf("输入选项得到结果后,如果想继续选择,请输入“Y”,否则输入任意字符退出:\n");printf("选项1:矩阵相加\n");printf("选项2:矩阵相减\n");printf("选项3:矩阵相乘\n");printf("选项4:矩阵的逆矩阵\n");printf("选项5:矩阵转置\n");printf("选项6:矩阵行列式\n");}//主函数int main(){char ifcontinue;int x;int y;showMenu();//输出矩阵Aprintf("矩阵A类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,A);printf("输出上三角矩阵A:\n");print(A);}if(x==2){CreateMatrixLowertri(p,A);printf("输出下三角矩阵A:\n");print(A);}if(x==3){CreateMatrixSymmetry(p,A);printf("输出对称矩阵A:\n");print(A);}if(x==4){CreateMatrixDiagonal(p,A);printf("输出对角矩阵A:\n");print(A);}if(x==5){CreateMatrixUnit(p,A);printf("输出单位矩阵A:\n");print(A);}//输出矩阵Bprintf("矩阵B类型为(输入数字选择):"); scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,B);printf("输出上三角矩阵B:\n");print(B);}if(x==2){CreateMatrixLowertri(p,B);printf("输出下三角矩阵B:\n");print(B);}if(x==3){CreateMatrixSymmetry(p,B);printf("输出对称矩阵B:\n");print(B);}if(x==4){CreateMatrixDiagonal(p,B);printf("输出对角矩阵B:\n");print(B);}if(x==5){CreateMatrixUnit(p,B);printf("输出单位矩阵B:\n");print(B);}//选择矩阵运算showMenu2();while(1){printf("请选择运算方式(输入数字选择):\n");scanf("%d",&y);switch(y){case 1:if(Add(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 2:if(Sub(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 3:if(Mul(A,B,C))print(C);elseprintf("运算错误\n");printf("----------------------------------\n");if(Mul(B,A,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 4:Inverse(A);printf("----------------------------------\n");Inverse(B);printf("**********************************\n");break;case 5:Tans(A,C);print(C);printf("----------------------------------\n");Tans(B,C);print(C);printf("**********************************\n");break;case 6:Determinant(A);printf("----------------------------------\n");Determinant(B);printf("**********************************\n");break;default:printf("请输入正确的选项!\n");printf("**********************************\n");}getchar();ifcontinue= getchar();if(ifcontinue!='Y')break;}return 0;}。