稀疏矩阵运算器

问题描述:有输入界面(图形或文字界面都可),能区分加法、减法、乘法和转置;能处理任意输入的典型数据和进行出错数据处理(例如乘法,当第一个矩阵的列数不等于第二个矩阵的行数时);必须采用三元组作存储结构,不能采用数组等形式;输出要求用矩阵的形式输出(即习题集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


猜你喜欢

转载自blog.csdn.net/u014304560/article/details/48792503