C语言习题 矩阵元素变换
2016-03-17 21:25
393 查看
函数实现。用main函数调用。
void change(int *p,int n)
{
int *mi,*ma,i,j,t;
mi=p;
ma=p;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(*(p+i*n+j)<*mi)
mi=p+i*n+j;
if(*(p+i*n+j)>*ma)
ma=p+i*n+j;
}
t=*(p+(n/2)*n+n/2);
*(p+(n/2)*n+n/2)=*ma;
*ma=t;
t=*p;
*p=*mi;
*mi=t;
mi=p+1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(*(p+i*n+j)<*mi&&(p+i*n+j)!=p)
mi=p+i*n+j;
}
t=*(p+n-1);
*(p+n-1)=*mi;
*mi=t;
mi=p+1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(*(p+i*n+j)<*mi&&(p+i*n+j)!=p&&(p+i*n+j)!=(p+n-1))
mi=p+i*n+j;
}
t=*(p+(n-1)*n);
*(p+(n-1)*n)=*mi;
*mi=t;
mi=p+1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(*(p+i*n+j)<*mi&&(p+i*n+j)!=p&&(p+i*n+j)!=(p+n-1)&&(p+i*n+j)!=(p+n*(n-1)))
mi=p+i*n+j;
}
t=*(p+n*(n-1)+n-1);
*(p+n*(n-1)+n-1)=*mi;
*mi=t;
}
int main()
{
void change(int *,int );
int **a,*p,i,j;
int n;
scanf("%d",&n);
p=(int*)malloc(n*n*sizeof(int));
a=(int**)malloc(n*sizeof(int *));
for(i=0; i<n; i++)
a[i]=p+n*i;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf("%d",&a[i][j]);
change(p,n);
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
printf("%d ",a[i][j]);
printf("\n");
}
free(p);
free(a);
return 0;
}
Problem D: C语言习题 矩阵元素变换
Description
将一个n×n(2<n<10,n为奇数)的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从左到右、从上到下顺序依次从小到大存放),写一函数实现。用main函数调用。
Input
输入n和矩阵中的每个元素Output
变换后的矩阵Sample Input
5 25 13 9 5 1 16 17 18 19 6 15 24 4 20 7 14 23 22 21 8 2 12 11 10 3
Sample Output
1 13 9 5 2 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 3 12 11 10 4
HINT
#include<stdio.h>void change(int *p,int n)
{
int *mi,*ma,i,j,t;
mi=p;
ma=p;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(*(p+i*n+j)<*mi)
mi=p+i*n+j;
if(*(p+i*n+j)>*ma)
ma=p+i*n+j;
}
t=*(p+(n/2)*n+n/2);
*(p+(n/2)*n+n/2)=*ma;
*ma=t;
t=*p;
*p=*mi;
*mi=t;
mi=p+1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(*(p+i*n+j)<*mi&&(p+i*n+j)!=p)
mi=p+i*n+j;
}
t=*(p+n-1);
*(p+n-1)=*mi;
*mi=t;
mi=p+1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(*(p+i*n+j)<*mi&&(p+i*n+j)!=p&&(p+i*n+j)!=(p+n-1))
mi=p+i*n+j;
}
t=*(p+(n-1)*n);
*(p+(n-1)*n)=*mi;
*mi=t;
mi=p+1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(*(p+i*n+j)<*mi&&(p+i*n+j)!=p&&(p+i*n+j)!=(p+n-1)&&(p+i*n+j)!=(p+n*(n-1)))
mi=p+i*n+j;
}
t=*(p+n*(n-1)+n-1);
*(p+n*(n-1)+n-1)=*mi;
*mi=t;
}
int main()
{
void change(int *,int );
int **a,*p,i,j;
int n;
scanf("%d",&n);
p=(int*)malloc(n*n*sizeof(int));
a=(int**)malloc(n*sizeof(int *));
for(i=0; i<n; i++)
a[i]=p+n*i;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf("%d",&a[i][j]);
change(p,n);
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
printf("%d ",a[i][j]);
printf("\n");
}
free(p);
free(a);
return 0;
}
相关文章推荐
- c++插入运算符和输出运算符的重载
- 冒泡排序C++
- 【bzoj 2821】 作诗 题意&题解&代码(C++)
- C++: 模拟实现类bitset
- sort()函数与升序、降序 C++
- C++复习笔记
- 设计模式C++实现:监视器对象
- CODE[VS] 1098 均分纸牌
- 【C++】编程小结① -- new和delete
- 关于C++指针类型所占大小的测试
- c++中的前向声明
- 对PIC(position independent code)的探究
- C++第2次实验
- 【经典算法】:用C语言画日历表
- 利用外观模式模拟股民炒股 C++
- C++的运算符重载
- 用C++实现高精度数的加法
- C++课堂学习笔记
- C++标准库的异常类层次结构
- 排序——插入排序(C++)