C语言:矩阵操作练习

图像所C语言练习
编译环境GCC
1.  struct MAT
{
int row,col;
int*p;
}
二维数组有一个MAT型结构体指向,其中row,col为数组的行和列大小,*p指向数组的具体数据。
(1)定义一个函数,struct MAT* createMat(int r,int c),分配一个结构体空间,指向一个r*c个单元的数组,并给数组分配空间,正确分配返回结构体地址,否者返回NULL。(2)定义函数,void showMat(struct MAT *m),显示m指向的矩阵所有值。
(3)定义函数char put(struct MAT *m,int r,intc,int n),给*m指向的数组的第r行,第c列赋值n,如果成功返回1,否则返回0。
(4)定义函数int get(struct MAT *m,int r,intc),返回*m指向的数组的第r行,第c列值。
(5)定义函数char save(FILE *f,struct MAT *m),以文本文件形式保存m的元素到文件f中, 如果成功返回1,否则返回0。
(6)定义函数char load(FILE *f,struct MAT *m),以文本文件形式读文件f的数据给m的元素, 如果成功返回1,否则返回0。
(7)定义函数void max(struct MAT *s,struct MAT *ms),寻找s矩阵每行的最大值,放在一个一维的矩阵ms中。
(8)定义矩阵加法函数,void add(struct MAT *src1,struct MAT *src1,struct MAT *dst),实现dst=src1+src2功能。
综合:利用以上函数,定义一个3X5的矩阵,给每个单元赋一个随机值(rand函数),并显示,求每行的最大值,并显示。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3
#define COL 5
struct MAT {
 int row ,col;
 int *p ;
};
typedef struct MAT mat ;
typedef struct MAT* pmat;

struct MAT *createMat(int r,int c)
{
  struct MAT * pMat ;
  pMat = malloc(sizeof(mat));
  if(pMat==NULL)
    {
	printf("creatMat fail \n");
        return 0 ;
    } 
  pMat->p = malloc(sizeof(int)*r*c);
  pMat->row = r;
  pMat->col = c; 
  return pMat ;
}
void showMat(struct MAT *m)
{
  int i ,j;
  for(i= 0;i < m->row;i++)
     {
	 for(j=0;j < m->col;j++)
	   printf("%i ",*(m->p+i*m->col+j));
	 printf("\n");
    }	
}
char put(struct MAT *m,int r,int c,int n)
{
  if(r > m->row&& c > m->col)
	return 0;
  *(m->p+(r-1)*m->col+c-1)= n;
  return 1 ;
}
int get(struct MAT*m,int r,int c)
{
  return *(m->p+m->col*(r-1)+c-1);
}
char save(FILE* f,struct MAT *m)
{
  int i ,j;
  for(i= 0;i < m->row;i++)
    {
	 for(j=0;j < m->col;j++)
	   fprintf(f,"%i ",*(m->p+i*m->col+j));
	    fprintf(f,"\n");
    }	
   return 1;
}
char load(FILE *f,struct MAT *m)
{
 int i ,j ;
 for(i= 0;i < m->row;i++)
     for(j = 0 ;j < m->col;j++)
	 fscanf(f,"%i ",(m->p + m->col*i+j));
 return 1;
}
void maxMat(struct MAT *s,struct MAT *ms)
{
  int max ;
  int i,j;
  for(i = 0;i< s->row;i++)
     {
        max = *(s->p+ s->col*i);
	for(j=1;j < s->col;j++)
	   {      
		if(max < *(s->p+s->col*i+j))
		    max = *(s->p+s->col*i+j);
	   }
	 *(ms->p+i) = max ;
     }
}
void add(struct MAT *src1,struct MAT *src2,struct MAT *dst)
{
   int i,j;
   for(i = 0;i < src1->row;i++)
	for(j=0;j< src1->col;j++)
	   *(dst->p+i*dst->col+j) = *(src1->p+i*src1->col+j) + *(src2->p+i*src2->col+j);
}
int  main(int argc ,char* argv[])
{
 struct MAT* m ,*ms,*dst;
 int r ,c ;
 FILE *fp;
 fp = fopen("mat.txt","w");
 srand((unsigned int)time(NULL));
 m = createMat(ROW,COL);
 ms = createMat(ROW,1);
 dst = createMat(ROW,COL);
 for(r= 1 ;r <= ROW;r++)
      for(c = 1 ;c <= COL;c++)
	 put(m,r,c,(int)(100.0*rand()/RAND_MAX+1.0));
 showMat(m);
 maxMat(m,ms);
 showMat(ms);
 add(m,m,dst);
 showMat(dst);
 save(fp,m);
 fclose(fp);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值