数据结构课程设计-特殊矩阵计算器
数据结构课程设计-计算器

数据结构课程设计-计算器数据结构课程设计计算器在计算机科学的学习中,数据结构是一门重要的基础课程。
通过这门课程的学习,我们能够深入理解和掌握如何有效地组织和管理数据,以提高程序的运行效率和性能。
本次课程设计的任务是开发一个简单的计算器程序,通过运用所学的数据结构知识,实现基本的算术运算功能。
一、需求分析首先,我们需要明确计算器程序的功能需求。
这个计算器应该能够支持常见的四则运算,即加法、减法、乘法和除法。
用户可以通过输入表达式,例如“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、由于本程序涉及的函数比较多,所以开始时在函数调用上出现了混乱,把自己都给搞糊涂了,后来经仔细排查,最终发现了错误。
数据结构计算器(包括中缀转换后缀)课程设计报告

课程设计报告题目:计算表达式的值1.问题描述对于给定的一个表达式,表达式中可以包括常数、算术运行符(“+”、“-”、“*”、“/”)和括号,编写程序计算表达式的值。
基本要求:从键盘输入一个正确的中缀表达式,将中缀表达式转换为对应的后缀表达式,并计算后缀表达式的值。
对于表达式中的简单错误,能够给出提示,并给出错误信息;表达式中可以包括单个字母表示的变量。
测试数据:任意选取一个符合题目要求的表达式。
提高要求:(1)能够处理多种操作符。
(2)实现包含简单运算的计算器。
(3)实现一个包含简单运算和函数运算的计算器。
2.需求分析(1)软件的基本功能本软件实在win32工程下实现的带有界面和图标的功能较为齐全的计算器。
此计算器分三个方面进行计算,分别为数值表达式的计算,字母表达式的计算和函数计算。
可由键盘或用鼠标点击按键输入带有数字或字母的中缀表达式,程序可以将输入的带有数字或字母的中缀表达式转换成对应的后缀表达式,并计算只含有数字的后缀表达式的值。
本软件支持含小数、多位数等多种操作数的处理,可以计算含加、减、乘、除、百分号、求余、求幂,求阶乘,求三角函数的值等多种运算符和函数的表达式(2)输入/输出形式用户可通过打开图标弹出来的计算器界面任意点击操作。
对于在输入时发生的简单错误,软件通过弹出对话框给出提示并且在提示错误的同时自动将用户的出错输入略去转化成正确的表达式进行计算,用户也可选择清楚操作然后重新输入a.对于数值和函数表达式软件会输出其表达式的后缀表达式和计算结果并保留六位小数;b.对于字母表达式因字母无法进行数值运算,软件仅输出其后缀表达式的值;清楚按钮可以清楚有已经输入或输出的数据从头计算;软件窗口可实现最小化。
并且输入编辑框可进行修改,复制,粘贴等操作,但后缀表达式和求值结果的编辑框中的内容不可修改,只能执行复制操作。
(3)测试数据要求用户可以输入一个符合要求的中缀表达式,也可以输入一个包含简单错误的表达式。
数据结构课程设计之稀疏矩阵运算器

数据结构课程设计之稀疏矩阵运算器#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程序功能简介对特殊矩阵能够在界面上以人们熟悉的方式显示,可以对特殊矩阵进行加法运算和减法运算,矩阵转置。
按照要求使用了多种数据结构来求解问题,具体为二维数组和类似图的数据结构。
由于题目要求使用多种数据结构,因此分开写了两段程序,均实现了上述要求的功能,以下将分开说明。
先说明的是用二维数组实现的程序,后说明的是用图结构实现的程序。
1.2关于输入、输出形式及数据范围1.2.1使用二维数组实现的程序输入、输出范围为:-000到000,足以解决绝大多数的矩阵运算问题。
1.2.2输入的格式进入程序后首先展现的是功能选择界面,如下图:此时可通过输入对应功能的数字来选择功能。
在此程序中不同功能输入格式不同:选择功能1.矩阵转置时需要输入要进行转置操作的矩阵,首先输入矩阵的行数和列数,以逗号隔开,之后依次按矩阵形式输入矩阵即可,各数值之间以空格隔开。
选择功能2.矩阵数乘时需要输入要进行数乘操作的矩阵,此输入格式同上,之后输入一个实数,即要进行数乘的数即可。
功能3.矩阵加法与4.矩阵减法输入格式和5.矩阵乘法相同,按上述操作输入两个矩阵即可,需要注意的是矩阵减法默认顺序为先输入的矩阵减去后输入的矩阵。
当按照格式输入时可以实现以上功能,但输入错误数据时,例如进行行列数不同的矩阵相加减时则会返回无法操作,请重新输入的提示。
具体情况见下文测试部分。
1.3.1使用图结构实现的稀疏矩阵运算器程序输入、输出范围同上。
1.3.2输入的格式进入程序后首先展现的是功能选择界面,如下图:选择功能部分输入同上。
在进行矩阵输入时采取三元组的形式,这是由于稀疏矩阵的多零元性质。
首先输入矩阵的行数、列数、非零元个数,以空格隔开,输入完毕后确认,开始输入各个非零元。
输入非零元时按“所在行下标所在列下标值”的形式输入,需要注意的是输入时只能从所在行小的开始按顺序输入,不能先输入行数大的数据再输入行数小的数据。
2 概要设计2.1用二维数组实现的程序的概要设计由于使用二维数组结构实现上述功能较为简单,故全部运算仅由主函数执行,不单写出各个简单的函数。
运用数据结构实现计算器(2023版)

运用数据结构实现计算器运用数据结构实现计算器1.简介本文档将介绍如何使用数据结构来实现一个计算器。
计算器是一种用于执行数学运算的工具,通过输入表达式来计算结果。
我们将使用数据结构来存储和处理表达式中的数据和运算符。
2.功能需求我们的计算器将具有以下功能:●支持基本的四则运算(加法、减法、乘法、除法)●支持括号运算●支持多位数和小数运算●支持优先级运算(乘法和除法的优先级高于加法和减法)3.数据结构设计我们将使用以下数据结构来实现计算器:●栈(Stack):用于存储运算符和括号,以实现运算符优先级处理和括号匹配。
●队列(Queue):用于存储数值和中间结果,以实现表达式的计算和保存结果。
4.算法设计计算器的核心算法如下:●表达式解析:将输入的表达式解析为数值和运算符,并存储在队列中。
●运算符优先级处理:使用栈来存储运算符并进行优先级处理,确保正确的运算顺序。
●括号匹配:使用栈来匹配括号,以确保括号内的表达式可以正确计算。
●表达式计算:使用队列中的数值和运算符进行计算,并得出最终结果。
5.界面设计计算器可以有一个简单的用户界面,包括一个文本框用于输入表达式和一个按钮用于计算。
在计算完成后,结果将显示在另一个文本框中。
6.实现步骤要实现计算器,可以按照以下步骤进行:1.设计数据结构:确定使用的数据结构,包括栈和队列。
2.实现表达式解析:编写代码将输入的表达式解析为队列中的数值和运算符。
3.实现运算符优先级处理:编写代码使用栈来处理运算符的优先级。
4.实现括号匹配:编写代码使用栈来匹配括号。
5.实现表达式计算:编写代码使用队列中的数据进行计算并得出结果。
6.设计界面:创建用户界面,包括输入表达式的文本框、计算按钮和显示结果的文本框。
7.组合功能:将各个模块结合起来,实现完整的计算器功能。
7.附件本文档不涉及附件。
8.法律名词及注释本文档不涉及法律名词及注释。
数据结构程序设计-矩阵的运算

二.概要设计:
1、抽象数据类型定义如下: ADT SparseMatrix{ 数据对象D:D={aij|i=1,2,3…,m;j=1,2,3…,n; ai ∈ElemSet,m和n分别称为矩阵的行数和列数} 数据关系R: R={Row,Col} Row={<ai,j,ai,j+1>|1≤i≤m, 1≤j≤n-1} Col={<ai,ai+1,j>|1≤i≤m-1, 1≤j≤n} 基本操作 本程序中,用三元组顺序表作为存储结构。 (1)、CreatSMatrix (TSMatrix &M) 操作结果:创建矩阵M。 (2)、AddSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C,int n) 初始条件:矩阵A和B的行数和列数对应相等。 操作结果:求矩阵A、B的和C=A+B。 (3)、SubMatrix (TSMatrix *a,TSMatrix *b) 初始条件:矩阵A和B的行数和列数对应相等。 操作结果:求矩阵A、B的和C=A+B。 (4)、MultiplicationMatrixPow (TSMatrix *a,TSMatrix *b,TSMatrix *c) 初始条件:矩阵A和B的行数和列数匹配 操作结果:求矩阵A、B的和C=A*B。 (5) OutputSMatrix(TSMatrix M) 初始条件:矩阵M已存在 操作结果:输出矩阵M 2、 本程序包含5个模块
for(i=1;i<=M->mu;i++)//输出矩阵 { for(j=1;j<=M->nu;j++) printf("%5d",a[i][j]); printf("\n"); } } //*************矩阵的求和运算*****************// int AddSMatrix(TSMatrix *M,TSMatrix *N,TSMatrix *Q)//求 采用三元组顺序表存储表示的稀疏矩阵M和N的和,结果赋给矩阵Q { int i,j,p,q,x=0,y=0; if((M->mu<=0)||(M->nu<=0)||(M->tu<=0)||(N->mu<=0)||(N>nu<=0)||(N->tu<=0))//判断行数列数非零元素个数是否符合匹配 return ERROR; if(M->mu!=N->mu||M->nu!=N->nu)//判断A与B的行列数 是否相等的 return ERROR; Q->mu=M->mu;//矩阵Q的初始化 Q->nu=M->nu; Q->tu=0; for(i=1;i<=Q->mu;i++) { for(j=1;j<=Q->nu;j++)//寻找矩阵M,N中非零元素相等 的行列 { for(p=1;p<=M->tu;p++)//求矩阵M行列中所对应的 非零元素的值 赋值给X { if((i==M->data[p].row)&&(j==M->data[p].col))// 如果i是矩阵M中非零元素行,j是其列 { x=M->data[p].e;
数据结构课程设计 模拟计算器程序

数据结构课程设计题目名称:模拟计算器程序计算机科学与技术学院课程设计任务书一、设计任务设计一个模拟计算器的程序二、设计要求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。
数据的输入这里应该要用字符,然后通过字符和整形之间的关系进行转换即可,这样处理的话,就方便很多了。
在计算器程序运行中,输入数据时如果遇到输入错误的情况,能够能过键盘上的退格键进行删除,并且重新输入正确的数据。
在数据输入完成后,如果需要放弃本次计算操作,可以利用程序中设置好的按键进行清零,并为下一次运算作准备。
本课程设计主要解决的是传统计算器中,不能对表达式进行运算的问题,通过制作该计算器模拟程序,可以做到快速的求解表达式的值,并且能够判定用户输入的表达式是否合法。
该模拟计算器的核心部分就在用户输入的中缀表达式的转化,程序中用到了“栈”的后进先出的基本性质。
数据结构与算法课程设计--模拟简单计算器

数据结构与算法课程设计--模拟简单计算器数据结构与算法课程设计模拟简单计算器在计算机科学领域中,数据结构和算法是非常重要的基础知识。
本次课程设计的目标是模拟一个简单计算器,通过这个实践项目,深入理解和应用数据结构与算法的相关知识。
首先,让我们来明确一下简单计算器需要实现的功能。
它应该能够进行基本的四则运算,即加法、减法、乘法和除法。
同时,还需要支持输入多个操作数和运算符,能够按照正确的运算顺序进行计算。
为了实现这个简单计算器,我们需要选择合适的数据结构来存储输入的操作数和运算符。
考虑到操作的顺序性和灵活性,栈这种数据结构是一个不错的选择。
栈具有先进后出的特点,可以方便地处理运算的优先级。
接下来,我们开始设计算法。
当用户输入一个表达式时,程序需要对其进行解析。
首先,将表达式中的数字和运算符分别提取出来,并按照顺序存储在相应的栈中。
在计算过程中,从运算符栈中取出运算符,从操作数栈中取出相应的操作数进行计算,将结果重新压入操作数栈中。
在具体的实现过程中,我们需要处理一些特殊情况。
例如,除数不能为零的情况。
当遇到除法运算且除数为零时,程序应该给出相应的错误提示。
另外,对于表达式的合法性也需要进行检查。
比如,输入的表达式是否符合基本的数学运算规则,是否存在多余的字符或不匹配的括号等。
如果表达式不合法,程序也需要给出明确的提示信息,以便用户能够及时修正。
为了提高程序的可读性和可维护性,我们采用模块化的编程思想。
将表达式解析、运算处理、错误检查等功能分别封装成独立的函数,这样在后续的调试和优化过程中会更加方便。
```pythonclass Stack:def __init__(self):selfitems =def push(self, item):selfitemsappend(item)def pop(self):if not selfis_empty():return selfitemspop()else:return Nonedef is_empty(self):return len(selfitems) == 0def calculate(expression):operand_stack = Stack()operator_stack = Stack()num =""for char in expression:if charisdigit():num += charelif char in "+/":if num!="":operand_stackpush(int(num))num =""operator_stackpush(char)if num!="":operand_stackpush(int(num))while not operator_stackis_empty():operator = operator_stackpop()operand2 = operand_stackpop()operand1 = operand_stackpop()if operator =='+':result = operand1 + operand2 elif operator =='':result = operand1 operand2elif operator =='':result = operand1 operand2elif operator =='/':if operand2 == 0:print("除数不能为零!")returnresult = operand1 / operand2 operand_stackpush(result)return operand_stackpop()测试代码expression ="2+34-5/2"print(calculate(expression))```在上述代码中,我们首先定义了一个栈类`Stack`,用于存储操作数和运算符。
数据结构实验稀疏矩阵计算器

‘实验报告题目:稀疏矩阵运算器班级: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; //结束}. . . 资料. .。
数据结构课程设计-特殊矩阵计算器

数据结构课程设计-特殊矩阵计算器-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周:提交课程设计报告,进行成果分享和总结教材章节关联:本教学内容与教材中“数据结构”、“算法设计与分析”章节相关,结合实际案例,引导学生将所学知识应用于计算器程序设计中。
数据结构课程设计(稀疏矩阵运算器)

*****大学数据结构课程设计说明书题目:稀疏矩阵运算器学生姓名:学号:专业:班级:指导教师:2013 年 7 月 24日稀疏矩阵运算器摘要摘要:设计一稀疏矩阵运算器。
实现两个矩阵的相加、相减和相乘的功能。
用“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算,采用分级的设计方法,分别设计出加、减、乘运算器的子程序,相加运算时只要依次存储、扫描两矩阵的行、列数,若行、列数相等,再取行、列下标相等的元素,相加后存入结果矩阵。
相减运算与相加运算相同,同样取行、列下标相等的元素,相减后存入结果矩阵。
相乘运算要先判断两矩阵能否相乘。
若能相乘,则取行、列号相对应的元素进行相乘及相加,最后将对应元素存入结果矩阵中。
通过实验表明本程序能够进行稀疏矩阵的相加,相减,相乘运算。
具备矩阵的加、减、乘功能。
关键词:相加运算器;相减运算器;相乘运算器数据结构课程设计任务书针对本课程设计,完成以下课程设计任务:1、熟悉系统实现工具和上级环境。
2、根据课程设计任务,查阅相关资料。
3、针对所选课题完成以下工作:(1)、需求分析(2)、概要设计(3)、详细设计(4)、编写源程序(5)、静态走查程序和上机调试程序4、书写上述文档和撰写课程设计报告。
目录稀疏矩阵运算器 (I)摘要 (II)课程设计任务书 (III)课程设计正文 (Ⅳ)第一章问题描述 (5)第二章需求分析 (6)第三章概要设计 (9)第四章详细设计 (19)4.1 函数说明 (10)4.2 算法分析 (19)第五章调试分析 (21)第六章测试结果 (23)第七章课程设计总结 (24)参考文献 (24)附录(程序清单) (33)第一章问题描述一、问题描述:稀疏矩阵是指那些多数元素为零的矩阵,利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率,实现一个能进行稀疏矩阵基本运算的运算器。
二、基本要求:以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。
数据结构课程设计计算器

数据结构课程设计计算器在计算机科学的学习中,数据结构课程设计是一个非常重要的实践环节。
而本次课程设计的主题是实现一个计算器,这不仅考验了我们对数据结构的理解和运用能力,还锻炼了我们的编程思维和解决实际问题的能力。
一、需求分析在开始设计之前,我们首先需要明确计算器的功能需求。
一个基本的计算器应该能够支持常见的四则运算(加、减、乘、除),以及处理括号的优先级。
此外,还应该能够处理整数和浮点数的运算,并且具备一定的错误处理能力,比如输入非法字符或表达式错误时能够给出相应的提示。
二、数据结构选择为了实现上述功能,我们需要选择合适的数据结构来存储和处理表达式。
栈是一种非常适合的数据结构,因为它具有后进先出(LIFO)的特性,可以方便地处理括号和运算符的优先级。
我们可以使用两个栈,一个用来存储操作数(数字),另一个用来存储运算符。
在处理表达式时,从左到右依次读取字符,如果是数字,则将其压入操作数栈;如果是运算符,则根据运算符的优先级与栈顶运算符进行比较,决定是直接压入运算符栈还是先进行运算。
三、算法设计1、表达式转换首先,需要将用户输入的中缀表达式转换为后缀表达式。
中缀表达式如“(2 + 3) 4 5”,后缀表达式则是“2 3 +4 5 ”。
转换的过程中,通过栈来处理括号和运算符的优先级。
2、计算后缀表达式得到后缀表达式后,使用操作数栈进行计算。
从左到右读取后缀表达式的字符,如果是操作数,则压入栈中;如果是运算符,则从栈中弹出两个操作数进行相应的运算,并将结果压回栈中。
最后,栈顶元素即为计算结果。
3、错误处理在整个计算过程中,需要对用户输入的表达式进行错误检查。
例如,检查是否存在非法字符、括号是否匹配、除数是否为零等情况。
如果发现错误,及时给出提示信息。
四、代码实现以下是使用 C++语言实现计算器的部分代码示例:```cppinclude <iostream>include <stack>include <string>//判断字符是否为数字bool isDigit(char c) {return c >='0' && c <='9';}//计算运算符的优先级int precedence(char op) {if (op =='+'|| op =='')return 1;if (op ==''|| op =='/')return 2;return 0;}//中缀表达式转后缀表达式std::string infixToPostfix(std::string infix) {std::stack<char> opStack;std::string postfix ="";for (char c : infix) {if (isDigit(c)){postfix += c;} else if (c =='('){opStackpush(c);} else if (c ==')'){while (!opStackempty()&& opStacktop()!='('){postfix += opStacktop();opStackpop();}opStackpop();} else {while (!opStackempty()&& precedence(opStacktop())>=precedence(c)){postfix += opStacktop();opStackpop();}opStackpush(c);}}while (!opStackempty()){postfix += opStacktop();opStackpop();}return postfix;}//计算后缀表达式的值double evaluatePostfix(std::string postfix) {std::stack<double> operandStack;for (char c : postfix) {if (isDigit(c)){operandStackpush(c '0');} else {double operand2 = operandStacktop();operandStackpop();double operand1 = operandStacktop();operandStackpop();switch (c) {case '+':operandStackpush(operand1 + operand2);break;case '':operandStackpush(operand1 operand2);break;case '':operandStackpush(operand1 operand2);break;case '/':if (operand2!= 0) {operandStackpush(operand1 / operand2);} else {std::cout <<"除数不能为零!"<< std::endl; return -1;}break;}}}return operandStacktop();}int main(){std::string infixExpression;std::cout <<"请输入表达式:";std::cin >> infixExpression;std::string postfixExpression = infixToPostfix(infixExpression);double result = evaluatePostfix(postfixExpression);std::cout <<"结果:"<< result << std::endl;return 0;}```五、测试与优化在完成代码实现后,需要进行充分的测试以确保计算器的功能正确。
数据结构课程设计-计算器

数据结构课程设计报告实验一:计算器设计要求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中只有一个数值,则此数值为计算的最终结果,否则说明输入有误。
课程设计--设计一个矩阵运算器

课程设计--设计一个矩阵运算器《数据结构C语言版》课程设计一、题目内容的描述设计一个矩阵运算器【问题描述】设计一个矩阵运算器,对矩阵进行乘方(^)、加(+)、减(-)、乘(*)、转置等运算;【基本要求】(1) 参见数据结构题集P136页4.1(2) 求含有乘方(^)、加(+)、减(-)、乘(*)运算;。
(3) 写出课程设计报告【测试数据】分别选定一组测试数据进行测试,验证程序的正确性。
二、应用程序功能的详细说明1(输入矩阵运算器:说明该程序只适用于矩阵运算;2. 提供功能选择的界面:以菜单的形式提供功能选择,可以对所要进行的功能进行选择,最后系统自动实行此操作。
3. 矩阵的加法:先创建两个矩阵,要求两个矩阵的行和列分别相等。
调用矩阵的加法函数,系统自动输出新的相加后的矩阵。
4. 矩阵的减法:先创建两个矩阵,要求两个矩阵的行和列分别相等。
调用矩阵的减法函数,系统自动输出新的相减后的矩阵。
5.矩阵的乘法:先创建两个矩阵,要求第一个矩阵的列和第二个矩阵的行相等。
调用矩阵的乘法函数,系统自动输出新的相乘后的矩阵。
6. 矩阵的转置:先创建矩阵,输入矩阵的行和列数,调用矩阵的转置函数,系统自动输出新的转置后的矩阵。
7. 方阵的乘方:先创建一个方阵,输入方阵的阶乘,调用方阵的乘方函数,然后系统自动输出新的方阵。
三、输入数据类型、格式和内容{const int Max=100;int a[Max][Max],b[Max][Max],g[Max][Max],c[Max][Max],h[Max][Max];} Const int Max=100;定义矩阵的最大存储空间为100;int a[Max][Max],b[Max][Max],g[Max][Max],c[Max][Max],h[Max][Max];在函数中定义五个矩阵。
四、主要函数申明void createjuzheng(int d[Max][Max],int m,int n)创建矩阵函数;void shuchujuzheng(int z[Max][Max],int m,int n)输出矩阵函数;void juzhengchengfang(int m,int n,int p)矩阵乘方函数;void juzhengjiafa(int m,int n) 矩阵加法函数;void juzhengjianfa(int m ,int n) 矩阵减法函数;void juzhengchengfa(int m,int n) 矩阵乘法函数;void juzhengzhuanzhi(int m,int n) 矩阵转置函数;switch(o)创建矩阵运算菜单。
数据结构课程设计报告---矩阵的运算

数据结构课程设计报告题目:专业:班级:学号:姓名:指导老师:时间:一、课程设计题目及所涉及知识点设计题目就是“矩阵得运算”;所涉及得知识点主要就是: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列得与。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
特殊矩阵计算器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);}{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);}{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;}。