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

📄 yasuojuzhen.cpp

📁 本程序是一个对压缩矩阵问题的演示程序
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#define MAX 50 //假设非零元个数的最大值为50
#define OK  1  
#define NULL 0           


//--------------------------------功能函数---------------------------------------------//
int Add(int a[][3],int b[][3])
{
	if(a[0][0]==0)
	{
		printf("您还没有输入矩阵,请输入矩阵!\n");
		return NULL;
	}
	int c[MAX][3],i,j,k=1,m=1,n=1;
	c[0][0]=a[0][0];
	c[0][1]=a[0][1];
	while(i<=a[0][2] || j<=b[0][2])
	{
	    if(i<=a[0][2] && j<=b[0][2])
		{
			for(i=1,j=1;i<=a[0][2] && j<=b[0][2];)
			{
                if(a[i][0]==b[j][0])
				{
                   if(a[i][1]<b[j][1])
				   {
                      c[k][0]=a[i][0];
                      c[k][1]=a[i][1];
                      c[k][2]=a[i][2];
                      k++;
                      i++;
				   }
		           else if(a[i][1]>b[j][1])
				   {
			          c[k][0]=b[j][0];
			          c[k][1]=b[j][1];
			          c[k][2]=b[j][2];
			          k++;
			          j++;
				   }
		           else
				   {
			          c[k][0]=b[j][0];
			          c[k][1]=b[j][1];
			          c[k][2]=a[i][2]+b[j][2];
			          k++;
			          i++;
			          j++;
				   }
				}
		        else if(a[i][0]<b[j][0])
				{
				   c[k][0]=a[i][0];
                   c[k][1]=a[i][1];
                   c[k][2]=a[i][2];
				   k++;
                   i++;
				}
               else if(a[i][0]>b[j][0])
			   {
                  c[k][0]=b[j][0];
                  c[k][1]=b[j][1];
                  c[k][2]=b[j][2];
                  k++;
                  j++;
			   }
			}    
		}
		else if(i>a[0][2])
		{
           c[k][0]=b[j][0];
           c[k][1]=b[j][1];
           c[k][2]=b[j][2];
           k++;
           j++;
		}
        else if(j>b[0][2])
		{
           c[k][0]=a[i][0];
           c[k][1]=a[i][1];
           c[k][2]=a[i][2];
           k++;
           i++;
		}

       c[0][2]=k-1;
	}
	printf("A与B的和的矩阵表是为:\n");
	for(i=1;i<=c[0][0];++i)
	{
		for(j=1;j<=c[0][1];++j)
		{
			if(i==c[m][0] && j==c[m][1])
			{
			    printf("%5d",c[m][2]);
				m++;
				n++;
			}
			else printf("%5d",0);
		}
		if(n=c[0][1])
			printf("\n");
	}
	return OK;


}
int Sub(int a[][3],int b[][3])
{
	if(a[0][0]==0)
	{
		printf("您还没有输入矩阵,请输入矩阵!\n");
		return NULL;
	}
	int c[MAX][3],i,j,k=1,m=1,n=1;
	c[0][0]=a[0][0];
	c[0][1]=a[0][1];
    while(i<=a[0][2] || j<=b[0][2])
	{
		if(i<=a[0][2] && j<=b[0][2])
		{
           for(i=1,j=1;i<=a[0][2] && j<=b[0][2];)
		   {
				if(a[i][0]==b[j][0])
				{
					if(a[i][1]<b[j][1])
					{
						c[k][0]=a[i][0];
						c[k][1]=a[i][1];
						c[k][2]=a[i][2];
						k++;
						i++;
					}
		            else if(a[i][1]>b[j][1])
					{
						 c[k][0]=b[j][0];
						 c[k][1]=b[j][1];
						 c[k][2]=-b[j][2];
			             k++;
						 j++;
					}
		           else
				   {
				       c[k][0]=b[j][0];
			           c[k][1]=b[j][1];
			           c[k][2]=a[i][2]-b[j][2];
			           k++;
			           i++;
			           j++;
				   }
				}
                else if(a[i][0]<b[j][0])
				{
                   c[k][0]=a[i][0];
                   c[k][1]=a[i][1];
                   c[k][2]=a[i][2];
                   k++;
                   i++;
				}
               else if(a[i][0]>b[j][0])
			   {
                  c[k][0]=b[j][0];
                  c[k][1]=b[j][1];
                  c[k][2]=-b[j][2];
                  k++;
                  j++;
			   }
		   }		
		}
	    else if(i>a[0][2])
		{
           c[k][0]=b[j][0];
           c[k][1]=b[j][1];
           c[k][2]=-b[j][2];
           k++;
           j++;
		}
        else if(j>b[0][2])
		{
           c[k][0]=a[i][0];
           c[k][1]=a[i][1];
           c[k][2]=a[i][2];
           k++;
           i++;
		}
	}
   	printf("A与B的差的矩阵表是为:\n");
	for(i=1;i<=c[0][0];++i)
	{
		for(j=1;j<=c[0][1];++j)
		{
			if(i==c[m][0] && j==c[m][1])
			{
			    printf("%5d",c[m][2]);
				m++;
				n++;
			}
			else printf("%5d",0);
		}
		if(n=c[0][1])
			printf("\n");
	}
	return OK;
	
}
int Value(int a[][3],int i,int j) 
//在M中寻找行号为i和列号为j的元素,找到则返回其元素值,找不到则返回0
{
	int p;
	for(p=1;p<=a[0][2];++p)
	{
		if(a[p][0]==i && a[p][1]==j)
			return (a[p][2]);
		
	}
    return 0;
	

}
		
int Mul(int a[][3],int b[][3])
{
	if(a[0][0]==0)
	{
		printf("您还没有输入矩阵,请输入矩阵!\n");
		return NULL;
	}
	int c[MAX][3],sum=0,i,j,t,p=1,m=1,n=0;
                         //p指示C的三元组表的当前项,初始时为1
    for(i=1;i<=a[0][0];i++)
	{
		for(j=1;j<=b[0][1];j++)  
		{
           for(t=1;t<=a[0][1];t++)
			   sum=sum+Value(a,i,t)*Value(b,t,j);// 调用Value函数,求出A中行号为i和列号为s的元素值
           if(sum!=0)     //产生一个C的三元组表元素
		   {
              c[p][0]=i;
			  c[p][1]=j;
			  c[p][2]=sum;
			  sum=0;
			  p++;
              
		   }  
		}
	}
	c[0][0]=a[0][0];
	c[0][1]=b[0][1];
	c[0][2]=p-1;
    printf("A与B的积的矩阵表是为:\n");
	for(i=1;i<=c[0][0];i++)
	{
		for(j=1;j<=c[0][1];j++)
		{
			if(i==c[m][0] && j==c[m][1])
			{
			    printf("%5d",c[m][2]);
				m++;
				n++;
				if(n==c[0][1])
				{
					printf("\n");
					n=0;
				}
			}
			else
			{
				printf("%5d",0);             
				n++;
				if(n==c[0][1])
				{
					printf("\n");
					n=0;
				}
			}

		}
	}
	return OK;
}
	
		   
               
               
    
//---------------------------------------主函数--------------------------------------------------//  


int main()
{
	int a[MAX][3],b[MAX][3],i=0,j=0;
	char ch;
	a[0][0]=0;
	printf("                            欢迎您使用稀疏矩阵运算器\n\n");
	printf("********************************** 菜单 ***************************************\n");
	printf("*  A输入矩阵       B 矩阵相加   C 矩阵相减       D 矩阵相乘           E 退出  *\n");
    printf("********************************** 菜单 ***************************************\n");
	while(1)
	{
		while(1)
		{
        fflush(stdin);
	    printf("请选择您的操作:\n");
        scanf("%c",&ch);
        fflush(stdin);
		if(ch>=65 && ch<=69) break;
		}
	    switch(ch)
		{
		    case'A':
			   printf("请输入A矩阵的行数、列数及非零元个数,中间以逗号隔开如(a,b,c):");
			   scanf("%d,%d,%d",&a[0][0],&a[0][1],&a[0][2]); 
			   for(i=1;i<=a[0][2];++i)
			   {
		           printf("请输入第%d个非零元的行下标、列下标及数值如(a,b,c):",i);
		           scanf("%d,%d,%d",&a[i][0],&a[i][1],&a[i][2]);
			   }
               printf("请输入B矩阵的行数、列数及非零元个数,中间以逗号隔开如(a,b,c):");
	           scanf("%d,%d,%d",&b[0][0],&b[0][1],&b[0][2]);
	           for(j=1;j<=b[0][2];++j)
			   {
					printf("请输入第%d个非零元的行下标、列下标及数值如(a,b,c):",j);
					scanf("%d,%d,%d",&b[j][0],&b[j][1],&b[j][2]);
			   }
			   break;
	        case'B':
			   Add(a,b);
			   break;
            case'C':
			   Sub(a,b);
			   break;
	    	case'D':
			   Mul(a,b);
			   break;
            case'E':
			   return 0;
		    default:  break;
		}
	}
    return OK;
	
}
	






⌨️ 快捷键说明

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