⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 juzheng.cpp

📁 实现能一个进行稀疏矩阵的基本运算的运算器
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#define maxsize 15
typedef struct {
	int row,line;
	int e;
}tri;
struct{
	tri data[maxsize];
	int r1,L1,nonzero;
}array1,array2,array3;      //构建两个三元组存放矩阵1和2的非零元,另一个用来作为运算后的非零元存放的位置



void main()
{
    int i,j,k=0,b=0;
	char signal;
	while(b!=1){
		printf("输入运算符:");
    	signal=getchar();
	    printf("%c\n",signal);
    	//判断输入的符号确定行列应该满足的值
        printf("输入运算的第一个和矩阵的行于列:\n");
        scanf("%d,%d,%d,%d",&(array1.r1),&(array1.L1));
        printf("输入运算的第二个矩阵的行于列:\n");
      	scanf("%d,%d",&(array2.r1),&(array2.L1));
	    if(signal=='+'||signal=='-')
		{
			if(array1.r1==array2.r1&&array2.L1==array2.L1) b=1;
		}
		else if(signal=='*'){
			if(array1.L1==array2.r1) b=1;
		}
        else
		  printf("对不起,你输入的格式不对,请输入合适的格式:\n");
	}

	//输入两个矩阵的非零元的信息
    
	printf("请输入array1和array2的非零元个数:\n");
	scanf("%d,%d",&(array1.nonzero),&(array2.nonzero));
	printf("请输入array1的非零元信息,即该非零元的行列和数值:\n");
		for(i=0;i<array1.nonzero;i++)
			scanf("%d,%d,%d",&(array1.data[i].row),&(array1.data[i].line),&(array1.data[i].e));
		printf("array1的***行***列***非零元***:\n");
        for(i=0;i<array1.nonzero;i++)
			printf("%11d,%4d,%4d\n",array1.data[i].row,array1.data[i].line,array1.data[i].e); 
     //矩阵1的非零元信息
        printf("请输入array2的非零元信息,即该非零元的行列和数值:\n");
		for(i=0;i<array2.nonzero;i++)
			scanf("%d,%d,%d",&(array2.data[i].row),&(array2.data[i].line),&(array2.data[i].e));
		printf("array2的***行***列***非零元***:\n");
        for(i=0;i<array2.nonzero;i++)
			printf("%11d,%4d,%4d\n",array2.data[i].row,array2.data[i].line,array2.data[i].e);
      //矩阵2的非零元信息

	

  switch(signal)
  {
  case'+':
	   //int i,j,k;
	  
	  for(i=0;i<array1.nonzero;i++)                   //n为中不为零的数目
	  {
		  for(j=0;j<array2.nonzero;j++)
		  {
			  if((array1.data[i].row==array2.data[j].row)&&(array1.data[i].line==array2.data[j].line))
			  {
				  array3.data[k].row=array1.data[i].row;
				  array3.data[k].line=array1.data[j].line;
				  array3.data[k].e=array1.data[i].e+array2.data[j].e;
     			  array2.data[j].e=0;
			  	  k++;
			  }//如果三元矩阵1中有与三元矩阵2中相同的行于列则将其相加放到三元矩阵3中.
		  }
	  	  array3.data[k].row=array1.data[i].row;
		  array3.data[k].line=array1.data[i].line;
		  array3.data[k].e=array1.data[i].e; 
		  k++;
	  }//若三元矩阵1与2中没有匹配的行于列则矩阵相加后,新矩阵中与1相同的行于列的数值相同因而也不为零,所以应该存储在三元矩阵3中    
                      
      for(j=0;j<array2.nonzero;j++)
	  {
		  if(array2.data[j].e!=0)
		  {
			  array3.data[k].row=array2.data[j].row;
			  array3.data[k].line=array2.data[j].line;
			  array3.data[k].e=array2.data[j].e;
			  k++;
		  }
	  }  break; //若矩阵2中没有与矩阵1匹配的,则与矩阵1相加后矩阵3中相同的位置数据不为零,应该存储在三元组3中
  case'-':
	  //int i,j,k;
	  for(i=0;i<array1.nonzero;i++)//n为中不为零的数目
	  {
		  for(j=0;j<array2.nonzero;j++)
		  {
			  if((array1.data[i].row)==(array2.data[j].row)&&(array1.data[i].line)==(array2.data[j].line))
			  {
				  array3.data[k].row=array1.data[i].row;
				  array3.data[k].line=array1.data[j].line;
				  array3.data[k].e=array1.data[i].e-array2.data[j].e;
     			  array2.data[j].e=0;
			  	  k++;
			  }//如果三元矩阵1中有与三元矩阵2中相同的行于列则将其相减放到三元矩阵3中.
		  }
	  	  array3.data[k].row=array1.data[i].row;
		  array3.data[k].line=array1.data[i].line;
		  array3.data[k].e=array1.data[i].e; 
		  k++;
	  }//若三元矩阵1与2中没有匹配的行于列则矩阵相减后,新矩阵中与1相同的行于列的数值相同因而也不为零,所以应该存储在三元矩阵3中    
                      
      for(j=0;j<array2.nonzero;j++)
	  {
		  if(array2.data[j].e!=0)
		  {
			  array3.data[k].row=array2.data[j].row;
			  array3.data[k].line=array2.data[j].line;
			  array3.data[k].e=0-array2.data[j].e;
			  k++;
		  }
	  }   break; //若矩阵2中没有与矩阵1匹配的,则与矩阵1相加后矩阵3中相同的位置数据不为零,应该存储在三元组3中


  case'*':
	  //int i,j;
	  int *Nc,*Tc;                         //定义一个临时数组Nc和Tc
	  Nc=(int *)malloc((array2.r1+1)*sizeof(int));
	  Tc=(int *)malloc((array1.L1+1)*sizeof(int));
	  if(!Nc||!Tc) break;                  //分配空间不成功时退出程序
	  for(i=1;i<array2.L1;i++)
	  {
		  for(j=0;j<array2.r1;j++)
			  Nc[j]=0;
		  for(j=0;j<array1.r1;j++)
			  Tc[j]=0;
		  for(j=0;j<array2.nonzero;j++)
		  {
			  if(array2.data[j].line==i)
				  Nc[array2.data[j].row]=array2.data[j].e;
		  }
		  for(j=0;j<array1.nonzero;j++)
			  Tc[array1.data[j].row]=Tc[array1.data[j].row]+(array1.data[j].e*Nc[array1.data[j].line]);
		  for(j=0;j<(array1.r1);j++)
		  {
			  if(Tc[j]!=0)
			  {
				  array3.data[k].e=Tc[j];
				  array3.data[k].row=j;
				  array3.data[k].line=i;
				  k++;
			  }
		  }
	  }   break;
  }
  printf("输出运算后的三元组:\n");
  for(i=0;i<k;i++)
	  printf("%8d,%4d,%4d\n",array3.data[k].row,array3.data[k].line,array3.data[k].e);
  
}

	  

	  




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -