一道C++编程问题,速求~
发布网友
发布时间:2023-08-11 13:21
我来回答
共2个回答
热心网友
时间:2024-10-19 02:20
差不多就完了,自己再改下吧
#include<stdio.h>
#define MAXSIZE 100 /* 非零元个数的最大值 */
typedef struct triple
{
int i,j; /* 行下标,列下标 */
int e; /* 非零元素值 */
}triple;
typedef struct tsmatrix
{
triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用 */
int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */
/* 各列第一个非零元的位置表rpos[0]未用 */
}rlsmatrix;
createsmatrix(rlsmatrix *M)
{ /* 创建稀疏矩阵M */
int e,i,m,n;
M->data[0].i=0; /* 为以下比较顺序做准备 */
printf("请输入矩阵的行数,列数,和非零元素的个数:");
scanf("%d",&M->mu);scanf("%d",&M->nu);scanf("%d",&M->tu);
for(i=1;i<=M->tu;i++)
{
printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,M->mu,M->nu);
scanf("%d",&m);scanf("%d",&n);scanf("%d",&e);
if(m<1||m>M->mu||n<1||n>M->nu) /*行或列超出范围 */
{printf("行或列超出范围");getch();exit();}
if(m<M->data[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) /*行或列的顺序有错*/
{printf("行或列的顺序有错");getch();exit();}
M->data[i].i=m;
M->data[i].j=n;
M->data[i].e=e;
}
}
/* 求矩阵的快速转置 */
void transposesmatrix(rlsmatrix M,rlsmatrix *T)
{ /* cpos存放每列的第一个非零元素的地址,temp中间变量 */
int i,m,*cpos,*temp,k=0;
T->mu=M.nu;
T->nu=M.mu;
T->tu=M.tu;
cpos=(int *)malloc(M.mu*sizeof(int));
if(cpos==NULL)exit();
temp=(int *)malloc(M.mu*sizeof(int));
if(temp==NULL)exit();
/* 对cpos对初始化,初值为0 */
*(cpos+1)=0;
for(i=1;i<=M.nu;i++)
{
for(m=1;m<=M.tu;m++)
{
if(M.data[m].j==i)
k++;
}
temp[i]=k;
if(i==1&&k!=0)
*(cpos+i)=1;/* 为cpos赋值 */
if(i>1)
*(cpos+i)=*(temp+i-1)+1;
}
free(temp);
for(i=1;i<=M.tu;i++)/* 进行转置 */
{T->data[*(cpos+M.data[i].j)].i=M.data[i].j;
T->data[*(cpos+M.data[i].j)].j=M.data[i].i;
T->data[*(cpos+M.data[i].j)].e=M.data[i].e;
(*(cpos+M.data[i].j))++;}
free(cpos);
}
multsmatrix(rlsmatrix M,rlsmatrix N,rlsmatrix *T)
{
int i,j,Qn=0;
int *Qe;
if(M.nu!=N.mu)
{printf("两矩阵无法相乘");getch();exit();}
T->mu=M.mu;
T->nu=N.nu;
Qe=(int *)malloc(M.mu*N.nu*sizeof(int)); /* Qe为矩阵Q的临时数组*/
for(i=1;i<=M.mu*N.nu;i++)
*(Qe+i)=0;/* 矩阵Q的第i行j列的元素值存于*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)中,初值为0 */
for(i=1;i<=M.tu;i++) /* 结果累加到Qe */
for(j=1;j<=N.tu;j++)
if(M.data[i].j==N.data[j].i)
*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)+=M.data[i].e*N.data[j].e;
for(i=1;i<=M.mu;i++) /*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零 */
for(j=1;j<=N.nu;j++) /*当M的第一行和N的第一列相乘则得T的第一个元素;当M的第一行和N的第二列相乘则得T的第二个元素;…… */
if(*(Qe+(i-1)*N.nu+j)!=0) /*……当M的第i行和N的第j列相乘则得T的第p个元素;根据归纳法得p=(i-1)*N的列数+j */
{
Qn++;//非零元个数加一
T->data[Qn].e=*(Qe+(i-1)*N.nu+j);
T->data[Qn].i=i;
T->data[Qn].j=j;
}
free(Qe);
T->tu=Qn;
return ;
}
void printmatrix(rlsmatrix M)//输出
{
int i,m=1,n,k;
printf("矩阵的简化模式是:\n");
for(i=1;i<=M.tu;i++)
printf("%d,%d,%d\n",M.data[i].i,M.data[i].j,M.data[i].e);
printf("矩阵的行数是:%d\n",M.mu);
printf("矩阵的列数是:%d\n",M.nu);
printf("矩阵中非零元素个数是:%d\n",M.tu);
printf("矩阵的完整模式的:\n");
for(n=1;n<=M.mu;n++)
{
printf("|");
for(k=1;k<=M.nu;k++)
{
if(M.data[m].i==n&&M.data[m].j==k)
{printf("%3d",M.data[m].e);
m++;}
else
printf(" 0");
}
printf(" |\n");
}
return;
}
void main()
{
rlsmatrix M,N,T,K;
printf("请为矩阵M赋值!\n");
createsmatrix(&M);
printmatrix(M);
printf("请为矩阵N赋值!\n");
createsmatrix(&N);
printmatrix(N);getch();
printf("矩阵M*N得矩阵T!\n");
multsmatrix(M,N,&T);
printmatrix(T);
getch();
printf("对矩阵T进行转置!");getch();
transposesmatrix(T,&K);
printf("转置后的矩阵是\n");
printmatrix(K);
getch();
}
热心网友
时间:2024-10-19 02:21
这么猛啊。直接上网问啊,呵呵。你是几班的
热心网友
时间:2024-10-19 02:21
差不多就完了,自己再改下吧
#include<stdio.h>
#define MAXSIZE 100 /* 非零元个数的最大值 */
typedef struct triple
{
int i,j; /* 行下标,列下标 */
int e; /* 非零元素值 */
}triple;
typedef struct tsmatrix
{
triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用 */
int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */
/* 各列第一个非零元的位置表rpos[0]未用 */
}rlsmatrix;
createsmatrix(rlsmatrix *M)
{ /* 创建稀疏矩阵M */
int e,i,m,n;
M->data[0].i=0; /* 为以下比较顺序做准备 */
printf("请输入矩阵的行数,列数,和非零元素的个数:");
scanf("%d",&M->mu);scanf("%d",&M->nu);scanf("%d",&M->tu);
for(i=1;i<=M->tu;i++)
{
printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,M->mu,M->nu);
scanf("%d",&m);scanf("%d",&n);scanf("%d",&e);
if(m<1||m>M->mu||n<1||n>M->nu) /*行或列超出范围 */
{printf("行或列超出范围");getch();exit();}
if(m<M->data[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) /*行或列的顺序有错*/
{printf("行或列的顺序有错");getch();exit();}
M->data[i].i=m;
M->data[i].j=n;
M->data[i].e=e;
}
}
/* 求矩阵的快速转置 */
void transposesmatrix(rlsmatrix M,rlsmatrix *T)
{ /* cpos存放每列的第一个非零元素的地址,temp中间变量 */
int i,m,*cpos,*temp,k=0;
T->mu=M.nu;
T->nu=M.mu;
T->tu=M.tu;
cpos=(int *)malloc(M.mu*sizeof(int));
if(cpos==NULL)exit();
temp=(int *)malloc(M.mu*sizeof(int));
if(temp==NULL)exit();
/* 对cpos对初始化,初值为0 */
*(cpos+1)=0;
for(i=1;i<=M.nu;i++)
{
for(m=1;m<=M.tu;m++)
{
if(M.data[m].j==i)
k++;
}
temp[i]=k;
if(i==1&&k!=0)
*(cpos+i)=1;/* 为cpos赋值 */
if(i>1)
*(cpos+i)=*(temp+i-1)+1;
}
free(temp);
for(i=1;i<=M.tu;i++)/* 进行转置 */
{T->data[*(cpos+M.data[i].j)].i=M.data[i].j;
T->data[*(cpos+M.data[i].j)].j=M.data[i].i;
T->data[*(cpos+M.data[i].j)].e=M.data[i].e;
(*(cpos+M.data[i].j))++;}
free(cpos);
}
multsmatrix(rlsmatrix M,rlsmatrix N,rlsmatrix *T)
{
int i,j,Qn=0;
int *Qe;
if(M.nu!=N.mu)
{printf("两矩阵无法相乘");getch();exit();}
T->mu=M.mu;
T->nu=N.nu;
Qe=(int *)malloc(M.mu*N.nu*sizeof(int)); /* Qe为矩阵Q的临时数组*/
for(i=1;i<=M.mu*N.nu;i++)
*(Qe+i)=0;/* 矩阵Q的第i行j列的元素值存于*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)中,初值为0 */
for(i=1;i<=M.tu;i++) /* 结果累加到Qe */
for(j=1;j<=N.tu;j++)
if(M.data[i].j==N.data[j].i)
*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)+=M.data[i].e*N.data[j].e;
for(i=1;i<=M.mu;i++) /*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零 */
for(j=1;j<=N.nu;j++) /*当M的第一行和N的第一列相乘则得T的第一个元素;当M的第一行和N的第二列相乘则得T的第二个元素;…… */
if(*(Qe+(i-1)*N.nu+j)!=0) /*……当M的第i行和N的第j列相乘则得T的第p个元素;根据归纳法得p=(i-1)*N的列数+j */
{
Qn++;//非零元个数加一
T->data[Qn].e=*(Qe+(i-1)*N.nu+j);
T->data[Qn].i=i;
T->data[Qn].j=j;
}
free(Qe);
T->tu=Qn;
return ;
}
void printmatrix(rlsmatrix M)//输出
{
int i,m=1,n,k;
printf("矩阵的简化模式是:\n");
for(i=1;i<=M.tu;i++)
printf("%d,%d,%d\n",M.data[i].i,M.data[i].j,M.data[i].e);
printf("矩阵的行数是:%d\n",M.mu);
printf("矩阵的列数是:%d\n",M.nu);
printf("矩阵中非零元素个数是:%d\n",M.tu);
printf("矩阵的完整模式的:\n");
for(n=1;n<=M.mu;n++)
{
printf("|");
for(k=1;k<=M.nu;k++)
{
if(M.data[m].i==n&&M.data[m].j==k)
{printf("%3d",M.data[m].e);
m++;}
else
printf(" 0");
}
printf(" |\n");
}
return;
}
void main()
{
rlsmatrix M,N,T,K;
printf("请为矩阵M赋值!\n");
createsmatrix(&M);
printmatrix(M);
printf("请为矩阵N赋值!\n");
createsmatrix(&N);
printmatrix(N);getch();
printf("矩阵M*N得矩阵T!\n");
multsmatrix(M,N,&T);
printmatrix(T);
getch();
printf("对矩阵T进行转置!");getch();
transposesmatrix(T,&K);
printf("转置后的矩阵是\n");
printmatrix(K);
getch();
}
热心网友
时间:2024-10-19 02:21
这么猛啊。直接上网问啊,呵呵。你是几班的
热心网友
时间:2024-10-19 02:21
差不多就完了,自己再改下吧
#include<stdio.h>
#define MAXSIZE 100 /* 非零元个数的最大值 */
typedef struct triple
{
int i,j; /* 行下标,列下标 */
int e; /* 非零元素值 */
}triple;
typedef struct tsmatrix
{
triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用 */
int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */
/* 各列第一个非零元的位置表rpos[0]未用 */
}rlsmatrix;
createsmatrix(rlsmatrix *M)
{ /* 创建稀疏矩阵M */
int e,i,m,n;
M->data[0].i=0; /* 为以下比较顺序做准备 */
printf("请输入矩阵的行数,列数,和非零元素的个数:");
scanf("%d",&M->mu);scanf("%d",&M->nu);scanf("%d",&M->tu);
for(i=1;i<=M->tu;i++)
{
printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,M->mu,M->nu);
scanf("%d",&m);scanf("%d",&n);scanf("%d",&e);
if(m<1||m>M->mu||n<1||n>M->nu) /*行或列超出范围 */
{printf("行或列超出范围");getch();exit();}
if(m<M->data[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) /*行或列的顺序有错*/
{printf("行或列的顺序有错");getch();exit();}
M->data[i].i=m;
M->data[i].j=n;
M->data[i].e=e;
}
}
/* 求矩阵的快速转置 */
void transposesmatrix(rlsmatrix M,rlsmatrix *T)
{ /* cpos存放每列的第一个非零元素的地址,temp中间变量 */
int i,m,*cpos,*temp,k=0;
T->mu=M.nu;
T->nu=M.mu;
T->tu=M.tu;
cpos=(int *)malloc(M.mu*sizeof(int));
if(cpos==NULL)exit();
temp=(int *)malloc(M.mu*sizeof(int));
if(temp==NULL)exit();
/* 对cpos对初始化,初值为0 */
*(cpos+1)=0;
for(i=1;i<=M.nu;i++)
{
for(m=1;m<=M.tu;m++)
{
if(M.data[m].j==i)
k++;
}
temp[i]=k;
if(i==1&&k!=0)
*(cpos+i)=1;/* 为cpos赋值 */
if(i>1)
*(cpos+i)=*(temp+i-1)+1;
}
free(temp);
for(i=1;i<=M.tu;i++)/* 进行转置 */
{T->data[*(cpos+M.data[i].j)].i=M.data[i].j;
T->data[*(cpos+M.data[i].j)].j=M.data[i].i;
T->data[*(cpos+M.data[i].j)].e=M.data[i].e;
(*(cpos+M.data[i].j))++;}
free(cpos);
}
multsmatrix(rlsmatrix M,rlsmatrix N,rlsmatrix *T)
{
int i,j,Qn=0;
int *Qe;
if(M.nu!=N.mu)
{printf("两矩阵无法相乘");getch();exit();}
T->mu=M.mu;
T->nu=N.nu;
Qe=(int *)malloc(M.mu*N.nu*sizeof(int)); /* Qe为矩阵Q的临时数组*/
for(i=1;i<=M.mu*N.nu;i++)
*(Qe+i)=0;/* 矩阵Q的第i行j列的元素值存于*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)中,初值为0 */
for(i=1;i<=M.tu;i++) /* 结果累加到Qe */
for(j=1;j<=N.tu;j++)
if(M.data[i].j==N.data[j].i)
*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)+=M.data[i].e*N.data[j].e;
for(i=1;i<=M.mu;i++) /*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零 */
for(j=1;j<=N.nu;j++) /*当M的第一行和N的第一列相乘则得T的第一个元素;当M的第一行和N的第二列相乘则得T的第二个元素;…… */
if(*(Qe+(i-1)*N.nu+j)!=0) /*……当M的第i行和N的第j列相乘则得T的第p个元素;根据归纳法得p=(i-1)*N的列数+j */
{
Qn++;//非零元个数加一
T->data[Qn].e=*(Qe+(i-1)*N.nu+j);
T->data[Qn].i=i;
T->data[Qn].j=j;
}
free(Qe);
T->tu=Qn;
return ;
}
void printmatrix(rlsmatrix M)//输出
{
int i,m=1,n,k;
printf("矩阵的简化模式是:\n");
for(i=1;i<=M.tu;i++)
printf("%d,%d,%d\n",M.data[i].i,M.data[i].j,M.data[i].e);
printf("矩阵的行数是:%d\n",M.mu);
printf("矩阵的列数是:%d\n",M.nu);
printf("矩阵中非零元素个数是:%d\n",M.tu);
printf("矩阵的完整模式的:\n");
for(n=1;n<=M.mu;n++)
{
printf("|");
for(k=1;k<=M.nu;k++)
{
if(M.data[m].i==n&&M.data[m].j==k)
{printf("%3d",M.data[m].e);
m++;}
else
printf(" 0");
}
printf(" |\n");
}
return;
}
void main()
{
rlsmatrix M,N,T,K;
printf("请为矩阵M赋值!\n");
createsmatrix(&M);
printmatrix(M);
printf("请为矩阵N赋值!\n");
createsmatrix(&N);
printmatrix(N);getch();
printf("矩阵M*N得矩阵T!\n");
multsmatrix(M,N,&T);
printmatrix(T);
getch();
printf("对矩阵T进行转置!");getch();
transposesmatrix(T,&K);
printf("转置后的矩阵是\n");
printmatrix(K);
getch();
}
热心网友
时间:2024-10-19 02:21
这么猛啊。直接上网问啊,呵呵。你是几班的