【C刷题记录】矩阵相关

tech2024-07-27  48

题目1·幻方矩阵 检验并打印幻方矩阵 幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个5×5的矩阵并将其存入一个二维整型数组中,检验其是否为幻方矩阵,并将其按指定格式显示到屏幕上。 输入格式: “%d” 输出格式: 如果是幻方矩阵,输出提示信息: “It is a magic square!\n” 矩阵元素的输出: “%4d”(换行使用"\n") 如果不是幻方矩阵,输出提示信息: “It is not a magic square!\n” 输入样例1:

17_24_1_8_15 23_5_7_14_16 4_6_13_20_22 10_12_19_21_3 11_18_25_2_9

(输人样例中“_”代表空格) 输出样例1:

It is a magic square! **17**24***1***8**15 **23***5***7**14**16 ***4***6**13**20**22 **10**12**19**21***3 **11**18**25***2***9

(输出样例中“*”代表空格) 输入样例2:

1_0_1_6_1 3_1_1_1_1 1_1_1_1_2 1_1_1_1_1 9_1_7_1_1

(输人样例中“_”代表空格) 输出样例2:

It is not a magic square!

注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串! (输人样例中“_”代表空格,输出样例中“*”代表空格)

程序

#include <stdio.h> #include <stdlib.h> #define N 10 void FindSaddlePoint(int a[][N], int m, int n); void FindSaddlePoint(int a[][N], int m, int n) { int max, min, x, y, k, l , p, q, r; for(p = 0; p < m; p++) { max = a[p][0]; x = p; y = 0; for(q = 0; q < n; q++) { if(a[p][q] > max) { max = a[p][q]; x = p; y = q; } } min = a[0][y]; k = 0; l = y; for(r = 0; r < m; r++) { if(a[r][y] < min) { min = a[r][y]; k = r; l = y; } } if(x == k && y == l) { printf("a[%d][%d] is %d\n", x, y, a[x][y]); return; } } printf("No saddle point!\n"); return; } int main() { int m,n,i,j,a[N][N]; printf( "Input m,n:\n"); scanf( "%d,%d",&m,&n); printf( "Input matrix:\n" ); for (i=0;i<m;i++) for (j=0;j<n;j++) { scanf("%d",&a[i][j]); } FindSaddlePoint(a, m, n); return 0; }

题目2·鞍点 请编程找出一个M*N矩阵中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。如果矩阵中没有鞍点,则输出“No saddle point!” 已知函数原型: void FindSaddlePoint(int a[][N], int m, int n); 在该函数中输出有无鞍点的信息。 程序运行结果示例1:

Input m,n: 3,3↙ Input matrix: 1 2 34 5 67 8 9↙ a[0][2] is 3

程序运行结果示例2:

Input m,n: 3,4↙ Input matrix: 3 4 7 50 1 8 29 3 2 6↙ No saddle point!

输入提示: “Input m,n:\n”“Input matrix:\n" 输入格式: 输入矩阵大小: “%d,%d” 输入矩阵元素: “%d” 输出格式: 找到鞍点的输出格式:“a[%d][%d] is %d\n” 没找到鞍点的输出格式:“No saddle point!\n”

程序

#include <stdio.h> #include <stdlib.h> #define N 10 void FindSaddlePoint(int a[][N], int m, int n); void FindSaddlePoint(int a[][N], int m, int n) { int max, min, x, y, k, l , p, q, r; for(p = 0; p < m; p++) { max = a[p][0]; x = p; y = 0; for(q = 0; q < n; q++) { if(a[p][q] > max) { max = a[p][q]; x = p; y = q; } } min = a[0][y]; k = 0; l = y; for(r = 0; r < m; r++) { if(a[r][y] < min) { min = a[r][y]; k = r; l = y; } } if(x == k && y == l) { printf("a[%d][%d] is %d\n", x, y, a[x][y]); return; } } printf("No saddle point!\n"); return; } int main() { int m,n,i,j,a[N][N]; printf( "Input m,n:\n"); scanf( "%d,%d",&m,&n); printf( "Input matrix:\n" ); for (i=0;i<m;i++) for (j=0;j<n;j++) { scanf("%d",&a[i][j]); } FindSaddlePoint(a, m, n); return 0; }

题目3·矩阵转置 某二维数组存放的数据构成一个nn的方阵,其中n<=5。写程序,从键盘输入n的值(n<=5),该nn矩阵中各元素的值按下面的公式计算: a[i][j] = i * n + j + 1 其中,a[i][j]表示第i行第j列的元素。要求分别输出该矩阵和它的转置矩阵。 注意:定义数字大小N时,请用 #define N 10 输入格式: “%d” 输出提示:“The original matrix is:\n” 输出提示:“The changed matrix is:\n” 输出格式: 矩阵的列与列之间为%3d,行与行之间为\n 输入样例1: 5↙ 输出样例1:

The_original_matrix_is: __1__2__3__4__5 __6__7__8__9_10 _11_12_13_14_15 _16_17_18_19_20 _21_22_23_24_25 The_changed_matrix_is: __1__6_11_16_21 __2__7_12_17_22 __3__8_13_18_23 __4__9_14_18_24 __5_10_15_20_25

(输出样例中下划线“_”代表空格) 输入样例2: 4↙ 输出样例2:

The original matrix is: __1__2__3__4 __5__6__7__8 __9_10_11_12 _13_14_15_16 The changed matrix is: __1__5__9_13 __2__6_10_14 __3__7_11_15 __4__8_12_16

程序

#include <stdio.h> #include <stdlib.h> #define N 10 int main() { int n,a[N][N],i,j,m=1; scanf("%d",&n); printf("The original matrix is:\n"); for (i=0; i<n; i++) { for (j=0; j<n; j++) { a[i][j] = i * n + j + 1; printf("%3d",a[i][j]); } printf("\n"); } printf("The changed matrix is:\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%3d",a[j][i]); } printf("\n"); } return 0; }

题目4·蛇形矩阵 从键盘任意输入一个自然数n(n表示矩阵的大小,假设不超过100),请编程输出一个n*n的蛇形矩阵。如果输入的n不是自然数或者输入了不合法的数字,则输出"Input error!"。 函数原型: void ZigzagMatrix(int a[][N], int n); 函数功能:计算n*n的蛇形矩阵 提示:用两个双重循环分别计算n*n矩阵的左上三角和右下三角,设置一个计数器从1开始记录当前要写入矩阵的元素值,每次写完一个计数器加1,在计算左上角和右下角矩阵元素时,分奇数和偶数两种情况考虑待写入的元素在矩阵中的行列下标位置。 程序运行结果示例1:

Input n: 51 2 6 7 15 3 5 8 14 16 4 9 13 17 22 10 12 18 21 23 11 19 20 24 25

程序运行结果示例2:

Input n: 41 2 6 7 3 5 8 13 4 9 12 14 10 11 15 16

程序运行结果示例3:

Input n: -5↙ Input error!

程序运行结果示例4:

Input n: 105↙ Input error!

程序运行结果示例5:

Input n: w↙ Input error!

输入提示信息:“Input n:\n” 输入错误提示信息:“Input error!\n” 输入格式: “%d” 输出格式:"%4d" 数据换行: “\n”

程序

#include <stdio.h> #define N 100 void ZigzagMatrix(int a[][N], int n); void ZigzagMatrix(int a[][N], int n) { int i,j,count,temp; //处理左上三角,从a[0][0]开始正序输出 for(i=0;i<n;i++) { if(i%2==0) { temp=i*(i+1)/2+1; a[i][0]=temp; for(j=1;j<=i;j++) { temp++; a[i-j][j]=temp; } } if(i%2==1) { temp=i*(i+1)/2+1; a[0][i]=temp; for(j=1;j<=i;j++) { temp++; a[j][i-j]=temp; } } } //处理右下三角,从a[n][n]开始倒序输出 for(i=0;i<n-1;i++) { if(i%2==0) { temp=n*n-i*(i+1)/2; a[n-1-i][n-1]=temp; for(j=1;j<=i;j++) { temp--; a[n-1-i+j][n-1-j]=temp; } } if(i%2==1) { temp=n*n-i*(i+1)/2; a[n-1][n-1-i]=temp; for(j=1;j<=i;j++) { temp--; a[n-1-j][n-1-i+j]=temp; } } } for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%4d", a[i][j]); } printf("\n"); } } int main() { int n,s; int a[N][N] = {0}; printf("Input n:\n"); s = scanf("%d", &n); if(s < 1 || n < 0 || n > 100) { printf("Input error!\n"); } else { ZigzagMatrix(a, n); } return 0; }
最新回复(0)