如何使用C语言输出一个m*n的矩阵(m和n是任意数字,不限定大小.)?

 我来答
r1renhw
2012-11-18 · TA获得超过1577个赞
知道小有建树答主
回答量:810
采纳率:100%
帮助的人:422万
展开全部
# include <stdio.h>
# include <stdlib.h>
# define OK 1
# define ERROR 0
typedef int Status;
typedef int ElemType;
# define MAX_SIZE 100//非零元个数的最大值
struct Triple
{
int i,j;//行下标,列下标
ElemType e;//非零元素值
};
struct TSMatrix
{
Triple data[MAX_SIZE+1];//非零元三元组表,data[0]未用
int mu,nu,tu;//矩阵的行数、列数和非零元个数
};
//创建稀疏矩阵M
Status CreateSMatrix(TSMatrix * M)
{
int i,m,n;
ElemType e;
Status k;
printf("请输入矩阵的行数,列数,非零元素数:");
scanf("%d,%d,%d",&(* M).mu,&(* M).nu,&(* M).tu);
if ((* M).tu > MAX_SIZE)
{
return ERROR;
}
(* M).data[0].i = 0;
for (i=1;i<=(* M).tu; ++i)
{
do
{
printf("请按行序顺序输入第%d个非零元素所在的行(1-%d),列(1-%d),元素值:",i,(* M).mu,(* M).nu);
scanf("%d,%d,%d",&m,&n,&e);
k = 0;
if (m<1 || m>(* M).mu || n<1 || n>(* M).nu)//行或列超出范围
{
k = 1;
}
if (m<(* M).data[i-1].i || m==(* M).data[i-1].i && n<=(* M).data[i-1].j)//行或列的顺序有错
{
k = 1;
}
}while (k);
(* M).data[i].i = m;
(* M).data[i].j = n;
(* M).data[i].e = e;
}
return OK;
}
//按矩阵形式输出M
void PrintSMatrix1(TSMatrix M)
{
int i,j,k = 1;
Triple * p = M.data;
p++;//p指向第1个非零元素
for (i=1; i<=M.mu; ++i)
{
for (j=1; j<=M.nu; ++j)
{
if (k<=M.tu && p->i==i && p->j==j)//p指向非零元,且p所指元素为当前处理元素
{
printf("%3d",p->e);
p++;
k++;
}
else
{
printf("%3d",0);//输出0
}
}
printf("\n");
}
}

//输出稀疏矩阵M
void PrintSMatrix(TSMatrix M)
{
int i;
printf("%d行%d列%d个非零元素\n",M.mu,M.nu,M.tu);
printf("行 列 元素值\n");
for (i=1; i<=M.tu; ++i)
{
printf("%2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
}
}
int main(void)
{
TSMatrix A,B,C;
printf("创建矩阵A:");
CreateSMatrix(&A);
PrintSMatrix(A);
printf("按矩阵形式输出所创建矩阵:\n");
PrintSMatrix1(A);
return 0;
}
/*
在vc++6.0中的输出结果:
------------------------
创建矩阵A:请输入矩阵的行数,列数,非零元素数:3,3,3
请按行序顺序输入第1个非零元素所在的行(1-3),列(1-3),元素值:1,1,10
请按行序顺序输入第2个非零元素所在的行(1-3),列(1-3),元素值:2,3,50
请按行序顺序输入第3个非零元素所在的行(1-3),列(1-3),元素值:3,1,80
3行3列3个非零元素
行 列 元素值
1 1 10
2 3 50
3 1 80
按矩阵形式输出所创建矩阵:
10 0 0
0 0 50
80 0 0
Press any key to continue
------------------------------
*/
kaixingui2012
2012-11-18 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6472万
展开全部
#include <stdio.h>
#include <stdlib.h>

int main()
{
int m,n,i,j;
int **p;
printf("input m n:");
scanf("%d %d",&m,&n);
//以下完成输入
p=(int **)malloc( m*sizeof(int *) );
for( i=0;i<m;i++ )
{
p[i]=(int *)malloc(sizeof(int) *n);
for( j=0;j<n;j++ )
scanf("%d" , &p[i][j] );
}
}
//以下完成输出
for( i=0;i<m;i++ )
{
for( j=0;j<n;j++ )
printf("%d " , p[i][j] );
printf("\n");
}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-11-18
展开全部
关键在于长度不定。那就建一个动态的一维数组来模拟二维数组。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
淡淡的死去WO
2012-11-18 · 超过45用户采纳过TA的回答
知道答主
回答量:263
采纳率:0%
帮助的人:111万
展开全部
双层for循环就OK乐
追问
使用双重循环是必须的。使用双重循环之前总得定义一个变量。如果使用二维数组来定义是绝对不行。二维数组定义数组长度必须是确定的。如果自己输入的长度超过了这个值就会编译失败。无法达到输任意M*N的矩阵。
追答
这样吧,使用两次for循环,第一次给矩阵赋值,第二次输出。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式