5X5阶矩阵【C语言】

老师给的课后练习题

/*
 时间:2020/07/30 
 目的:二维数组特定元素的提取和交换 
 功能:了解对于二维数组特定元素的操作 
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 5  
void intput(int b[][N]);
void output(int b[][N]);
void move(int b[][N]); 

int main()
{
 int a[N][N]={};
 printf("原始矩阵为:\n");
 intput(a);
 printf("移动后的矩阵为:\n");
 move(a);
 output(a);
 return 0; 
    } 
    
void intput(int a[][N])
{
 int i,j;
 srand(time(0));//time(0)的返回值作为随机数种子 
 for(i=0;i<N;i++)
 {
  for(j=0;j<N;j++)
    {
        a[i][j]=rand()%99+1;//要产生[m,n]范围内的伪随机数可用: 
                             //int num=rand()%(n-m+1)+m;
    //rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)
    printf("%d\t",a[i][j]); 
    }
  printf("\n");
 }    
}

void output(int a[][N])
{
 int i,j;
 for(i=0;i<N;i++)
 {
  for(j=0;j<N;j++)
    {
     printf("%d\t",a[i][j]);
    }
    printf("\n");
 }    
}


void move(int a[][N])
{
 void swap(int *,int *);
 int *q;
 int before=0,i,j;
 q=&a[0][1];
 for(i=0;i<N;i++)
    {
      for(j=0;j<N*N;j++)//由这个for循环遍历数组 
         {
             if(*(*a+j)<*q&&*(*a+j)>before)
       //查找比*q小的值这样便可把最小的五个值依次查找出来 
             q=*a+j;//若有,就将该值的地址赋给q 
         }
         before=*q;//从最小的数开始依次赋值给before 
         switch(i)//switch函数是个比较好的想法,从最小的数开始依次交换 
         {
          case 0:swap(&a[N/2][N/2],q);break;
          case 1:swap(&a[0][0],q);break;
          case 2:swap(&a[0][N-1],q);break;
          case 3:swap(&a[N-1][0],q);break;
          case 4:swap(&a[N-1][N-1],q);break;
   }
    }
}

void swap(int*a,int*q)
{
 int t;
 t=*a;
 *a=*q;
 *q=t;
}
/*
总结:函数的定义里面只能写int b[][N],但该程序不能解决矩阵中有相同的数的情况 
-----------------------
在dev中输出结果为 
原始矩阵为:
36      46      3       23      75
74      92      94      64      46
18      14      59      76      40
42      3       25      62      58
29      20      57      33      43
移动后的矩阵为:
14      46      59      43      18
74      92      94      64      46
75      36      3       76      40
42      3       25      62      58
20      29      57      33      23        正确 
----------------------- 
*/ 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值