C程序设计 (第四版) 谭浩强 习题8.10
习题 8.10 将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。
IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。
代码块
方法:使用指针,动态分配内存
#include <stdio.h>
#include <stdlib.h>
#define N 5
//初始化矩阵
void initialMatrix(int ***matrix, int n){
*matrix = (int**)malloc(n * sizeof(int*));
for(int i = 0; i < n; i++){
(*matrix)[i] = (int*)malloc(n * sizeof(int));
}
}
//输入矩阵中的元素
void inputMatrix(int **matrix, int n){
printf("Enter %d*%d matrix:\n", n, n);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
scanf("%d", &matrix[i][j]);
}
}
}
//复制矩阵到一个新的矩阵以便进行下面的排序,找到最小的4个元素和最大的元素
void copyMatrix(int **matrix, int **newMatrix, int n){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
newMatrix[i][j] = matrix[i][j];
}
}
}
//对矩阵排序,将最小的4个元素和最大元素赋值到数组value
void sortMatrix(int **newMatrix, int n, int *value){
int *tempArr = (int*)malloc((n*n) * sizeof(int));
for(int **p = newMatrix, i = 0; p < newMatrix + n; p++){
for(int *q = *p; q < *p + n; q++){
tempArr[i++] = *q;
}
}
int temp;
for(int i = 0; i < n * n; i++){
for(int j = i + 1; j < n * n; j++){
if(tempArr[i] > tempArr[j]){
temp = tempArr[i];
tempArr[i] = tempArr[j];
tempArr[j] = temp;
}
}
}
int i;
for(i = 0; i < 4; i++){
value[i] = tempArr[i];
}
value[i] = tempArr[n*n-1];
free(tempArr);
}
//调整矩阵,按题目要求放置元素
void transMatrix(int **matrix, int n, int *value){
int temp;
for(int k = 0; k < 5; k++){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(matrix[i][j] == value[k]){
if(k == 0){
temp = matrix[0][0];
matrix[0][0] = matrix[i][j];
matrix[i][j] = temp;
}
if(k == 1){
temp = matrix[0][n-1];
matrix[0][n-1] = matrix[i][j];
matrix[i][j] = temp;
}
if(k == 2){
temp = matrix[n-1][0];
matrix[n-1][0] = matrix[i][j];
matrix[i][j] = temp;
}
if(k == 3){
temp = matrix[n-1][n-1];
matrix[n-1][n-1] = matrix[i][j];
matrix[i][j] = temp;
}
if(k == 4){
temp = matrix[n/2][n/2];
matrix[n/2][n/2] = matrix[i][j];
matrix[i][j] = temp;
}
}
}
}
}
}
//输出矩阵,当sign为0,输出原先矩阵,当sign为1,输出调整后的矩阵
void outputMatrix(int **matrix, int n, int sign){
if(sign == 0){
printf("\nOriginal Matrix:\n");
}
else{
printf("\nNew Matrix:\n");
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
printf("%-3d ", matrix[i][j]);
}
printf("\n");
}
}
//释放内存
void freeMatrix(int ***matrix, int n){
for(int i = 0; i < n; i++){
free((*matrix)[i]);
}
free(*matrix);
}
int main(){
int **matrix = NULL;
int **newMatrix = NULL;
int *value = (int*)malloc(5 * sizeof(int));
initialMatrix(&matrix, N);
initialMatrix(&newMatrix, N);
inputMatrix(matrix, N);
outputMatrix(matrix, N, 0);
copyMatrix(matrix, newMatrix, N);
sortMatrix(newMatrix, N, value);
transMatrix(matrix, N, value);
outputMatrix(matrix, N, 1);
freeMatrix(&matrix, N);
system("pause");
return 0;
}