问题描述:有输入界面(图形或文字界面都可),能区分加法、减法、乘法和转置;能处理任意输入的典型数据和进行出错数据处理(例如乘法,当第一个矩阵的列数不等于第二个矩阵的行数时);必须采用三元组作存储结构,不能采用数组等形式;输出要求用矩阵的形式输出(即习题集136页的形式),当第一个矩阵的行数不等于第二个矩阵的行数时,注意如第三个乘法的形式输出。
#include<stdio.h> #define MAXSIZE 20 typedef struct{ int i,j; int e; }Triple; typedef struct{ int mu,nu,tu; Triple data[MAXSIZE]; }RLSMatrix; void Input(RLSMatrix &M) { //三元组输入函数 printf("*********************\n"); printf("请输入矩阵的行数:"); scanf("%d",&M.mu); printf("请输入矩阵列数:"); scanf("%d",&M.nu); printf("请以行为主序,以三元组方式输入矩阵元素,'0,0,0'结束输入:\n"); for(M.tu=0;;M.tu++){ printf("%d : ",M.tu+1); scanf("%d,%d,%d",&M.data[M.tu].i,&M.data[M.tu].j,&M.data[M.tu].e); if((M.data[M.tu].i==0)&&(M.data[M.tu].j==0)&&(M.data[M.tu].e==0))break; }//for } void Transfer() {//矩阵转置运算 int row,line,col,p,q,k,h; RLSMatrix M,T; printf("矩阵的转置:\n"); Input(M); printf("转置后的矩阵为:\n"); T.mu=M.nu;T.nu=M.mu;T.tu=M.tu; if(T.tu){ q=0; for(col=1;col<=M.nu;++col) for(p=0;p<=M.tu;++p) if(M.data[p].j==col){ T.data[q].i=M.data[p].j;T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e;++q; }//if }//for for(row=1;row<=T.mu;row++){ for(line=1;line<=T.nu;line++){ for(k=0,h=0;k<T.tu;k++){ if((T.data[k].i==row)&&(T.data[k].j==line)){ printf("%d ",T.data[k].e);h++;break;} }//for if(h==0)printf("0 "); }//for printf("\n"); }//for }//Transfer void Count(int i) {//矩阵加法和减法的函数 int row,line,p,q,k,h; RLSMatrix M1,M2; if(i==2)printf("矩阵的加法:\n"); else printf("矩阵的减法:\n"); printf("=================\n"); printf("请输入第一个矩阵:\n"); Input(M1); printf("请输入第二个矩阵:\n"); Input(M2); if(i==2)printf("矩阵加法的结果为:\n"); else printf("矩阵减法的结果为:\n"); if(M1.nu!=M2.nu||M1.mu!=M2.mu){printf("ERROR!\n");return;} else{ for(row=1;row<=M1.mu;row++){ for(line=1;line<=M1.nu;line++){ for(k=0,h=0;k<M1.tu;k++){ if((M1.data[k].i==row)&&(M1.data[k].j==line)){ p=M1.data[k].e;h++;break;} }//for if(h==0)p=0; for(k=0,h=0;k<M2.tu;k++){ if((M2.data[k].i==row)&&(M2.data[k].j==line)){ q=M2.data[k].e;h++;break;} }//for if(h==0)q=0; if(i==2)printf("%d ",p+q); else printf("%d ",p-q); }//for printf("\n"); }//for } //else }//Add int Find(RLSMatrix M,int i,int j) { //在三元组中找到指定位置上的元素来做运算 int t; for(t=0;t<M.tu;t++){ if((M.data[t].i==i)&&(M.data[t].j==j))return M.data[t].e; }//for return 0; }//Find void Multiplication() { int row,line,p,q,k,L; RLSMatrix M1,M2; printf("矩阵乘法:\n"); printf("======================\n"); printf("请输入第一个矩阵:\n"); Input(M1); printf("请输入第二个矩阵:\n"); Input(M2); printf("矩阵乘法的结果为:\n"); if(M1.nu!=M2.mu){printf("ERROR!\n");return;} else{ for(row=1;row<=M1.mu;row++){ for(line=1;line<=M2.nu;line++){ L=0; for(k=1;k<=M1.nu;k++){ p=Find(M1,row,k); q=Find(M2,k,line); L=L+p*q; }//for printf("%d ",L); }//for printf("\n"); }//for }//else } int main() { int i; printf("稀疏矩阵运算器:\n"); printf("1-矩阵转置\n"); printf("2-矩阵加法\n"); printf("3-矩阵减法\n"); printf("4-矩阵乘法\n"); printf("0-退出\n"); printf("请输入选项0,1,2,3,4:"); scanf("%d",&i); switch(i){ case 1:Transfer();break; case 2:Count(i);break; case 3:Count(i);break; case 4:Multiplication();break; case 0:break; } return 0; }//main