📄 matrix.cpp
字号:
#include <iostream>
using namespace std;
#include "stdio.h"
#include "conio.h"
typedef int Status;
typedef int ElemType;//类型定义
#define MAXSIZE 20
typedef struct{
int i,j;
ElemType e;
}Triple;
#define MAXMN 10
typedef struct{
Triple data[MAXSIZE+1];
int rpos[MAXMN+1];
int r,c,z;//矩阵的行,列,非零数
}RLSMatrix;
void InitSMatrix(RLSMatrix &m){ //初始化矩阵
m.r=m.c=m.z=0;
}
void Setrpos(RLSMatrix &m){
for(int k=1;k<=m.z;k++)
{
if(m.rpos[m.data[k].i]==0)
m.rpos[m.data[k].i]=k;
}
}//把每一行第一个非零数的位置保存到m.rpos
void InsertElem(RLSMatrix &m,int cur,int row,int col,ElemType e){
m.data[cur].i=row;
m.data[cur].j=col;
m.data[cur].e=e;
}//输入元素
void Equal(Triple &ea,Triple &eb){
ea.i=eb.i;ea.j=eb.j;ea.e=eb.e;
}//赋值
Status SortElem(RLSMatrix &m,int cur){
if(m.z==1||m.z==0) return 1;
Triple temp;
Equal(temp,m.data[cur]);
while(temp.i<m.data[cur].i||temp.j<m.data[cur].j){
Equal(m.data[cur],m.data[cur-1]);
Equal(m.data[cur-1],temp);
--cur;
if(cur==1) return 1;
}
return 0;
}//排序
Status CreateSMatrix(RLSMatrix &m){
InitSMatrix(m);
do{
printf("\n输入矩阵的行列和非零个数(逗号分隔)\n");
printf("行,列,非零数:");
scanf("%d,%d,%d",&m.r,&m.c,&m.z);
if(m.z>m.r*m.c){
printf("非零数超出范围,重新输入!");
continue;
}
}while(m.z>m.r*m.c);//输入矩阵行列和非零个数
for(int k1=1;k1<=m.r;k1++)
m.rpos[k1]=0;
for(int k2=1;k2<=m.z;k2++)
m.data[k2].e=0; //初始化
int curelemnum=1;
int row,col;
ElemType E;
bool isExist;
printf("请输入非零元素:\n");//一共需要输入m.z个元素
while(curelemnum<=m.z){
isExist=false;
printf("行,列,值:");
scanf("%d,%d,%d",&row,&col,&E);
if(curelemnum>1){
for(int k4=1;k4<curelemnum;k4++){
if(m.data[k4].i==row&&m.data[k4].j==col){
printf("该行列已经存在!请重新输入!\n");
isExist=true;
break;
}
}
}
if(isExist) continue;
InsertElem(m,curelemnum,row,col,E); //插入元素
SortElem(m,curelemnum);//排序
++curelemnum;
}
Setrpos(m);
return 1;
}//创建矩阵
void PrintSMatrix(RLSMatrix m){
int index=1;
for(int i=1;i<=m.r;i++){
for(int j=1;j<=m.c;j++){
if(m.data[index].i==i&&m.data[index].j==j)
printf("%3d",m.data[index++].e);
else
printf("%3d",0);
}
printf("\n");
}
}//输出矩阵
ElemType CheckElem(RLSMatrix m,int row,int col){
for(int k=1;k<=m.z;k++)
if(m.data[k].i==row&&m.data[k].j==col)
return m.data[k].e;
return 0;
}//当前位置为非零元素,则返回值,否则返回0
Status AddSMatrix(RLSMatrix m,RLSMatrix n,RLSMatrix &p){
if(m.r!=n.r||m.c!=n.c){
printf("ERROR行列数不对!\n");
return 0;}//判断m,n的行列数是否相等
InitSMatrix(p);
p.r=m.r;p.c=m.c;p.z=0;
ElemType e;
for(int i=1;i<=m.r;i++)
for(int j=1;j<=m.c;j++){
e=0;
e+=CheckElem(m,i,j)+CheckElem(n,i,j);
if(e){
p.data[++p.z].i=i;
p.data[p.z].j=j;
p.data[p.z].e=e;
}
}
return 1;
}//矩阵加法
Status SubSMatrix(RLSMatrix m,RLSMatrix n,RLSMatrix &p){
for(int i=1;i<=n.z;i++)
n.data[i].e*=-1;
if(!(AddSMatrix(m,n,p))) return 0;
return 1;
}//矩阵减法
Status MultSMatrix(RLSMatrix m,RLSMatrix n,RLSMatrix &p){
if(m.c!=n.r) return 0;
InitSMatrix(p);
p.r=m.r;p.c=n.c;
p.z=0;
int temp=m.c;
ElemType e;
for(int i=1;i<=p.r;i++)
for(int j=1;j<=p.c;j++){
e=0;
for(int k=1;k<=temp;k++)
e+=CheckElem(m,i,k)*CheckElem(n,k,j);
if(e){
p.data[++p.z].i=i;
p.data[p.z].j=j;
p.data[p.z].e=e;
}
}
return 0;
}//矩阵乘法
void Menu(){
printf("***************MENU***************\n");
printf("请选择所想要进行的操作!\n");
printf("1.矩阵相加\n");
printf("2.矩阵相减\n");
printf("3.矩阵相乘\n");
printf("4.退出\n");
printf("**********************************\n");
}
void InputSMatrix(RLSMatrix &m){
printf("请输入矩阵:");
CreateSMatrix(m);
printf("\n");
printf("输入的矩阵为:");
printf("\n");
PrintSMatrix(m);
printf("\n");
}
void main(){
int select;
RLSMatrix A,B,C;
do{
Menu();
scanf("%d",&select);
switch(select){
case 1:
InputSMatrix(A);
InputSMatrix(B);
if(AddSMatrix(A,B,C))
{
printf("矩阵相加的结果:\n");
PrintSMatrix(C);
printf("\n");
}break;
case 2:
InputSMatrix(A);
InputSMatrix(B);
if(SubSMatrix(A,B,C)){
printf("矩阵相减的结果:\n");
PrintSMatrix(C);
printf("\n");}break;
case 3:
InputSMatrix(A);
InputSMatrix(B);
MultSMatrix(A,B,C);
printf("矩阵相乘的结果:\n");
PrintSMatrix(C);
printf("\n");break;
case 4:
system("cls");
printf("按任意键退出");
getch();
return;
default:cout<<"输入错误,请重新选择!!"<<endl;
break;
}
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -