老师给的课后练习题
/*
时间: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 正确
-----------------------
*/