C语言实现:随机数填充矩阵并沿水平轴镜像上下对称
用C语言实现矩阵上半部分水平镜像到下半部分
首先明确水平轴镜像的逻辑:对于矩阵的第i行,它在水平轴另一侧的镜像行是m - 1 - i。我们只需要处理上半部分的行(即i < m/2的行),将每行的所有元素复制到对应的镜像行即可。
实现步骤
- 为矩阵的上半部分(包括奇数行数的中间行)填充随机数
- 遍历上半部分的每一行,将其元素复制到对应的下半部分镜像行
完整代码示例
#include <stdio.h> #include <stdlib.h> #include <time.h> const int m = 3, n = 4; void InputMatrix(int x[m][n]) { int i, j; for (i = 0; i < m; i++) for (j = 0; j < n; j++) { printf("Enter [%d][%d]:", i, j); scanf("%d", &x[i][j]); } } void PrintMatrix(int x[m][n]) { int i, j; printf("\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) printf("%d\t", x[i][j]); printf("\n"); } } // 仅填充矩阵上半部分(含中间行)的随机数 void FillUpperMatrix(int x[m][n]) { int i, j; // 整数除法特性:奇数行数时包含中间行,偶数行数时到上半部分最后一行 for (i = 0; i <= (m-1)/2; i++) for (j = 0; j < n; j++) { x[i][j] = rand() % 100 - 50; } } // 将上半部分沿水平轴镜像到下半部分 void MirrorHorizontal(int x[m][n]) { int i, j; // 遍历上半部分行(不包含中间行,避免重复处理) for (i = 0; i < m/2; i++) { int mirror_row = m - 1 - i; for (j = 0; j < n; j++) { x[mirror_row][j] = x[i][j]; } } } int main() { // 初始化随机数种子,确保每次运行生成不同随机数 srand((unsigned int)time(NULL)); int matrix[m][n]; // 填充上半部分随机数 FillUpperMatrix(matrix); printf("填充上半部分后的矩阵:"); PrintMatrix(matrix); // 执行水平镜像 MirrorHorizontal(matrix); printf("水平镜像后的矩阵:"); PrintMatrix(matrix); return 0; }
代码说明
FillUpperMatrix:仅填充矩阵上半部分,避免不必要的随机数生成MirrorHorizontal:通过计算镜像行索引m-1-i,将上半部分行的元素直接复制到对应下半部分行srand((unsigned int)time(NULL)):必须添加该代码初始化随机数种子,否则每次运行生成的随机数序列固定
测试示例(m=3,n=4)
填充上半部分后的矩阵:
-12 45 -3 22 30 18 -5 9 0 0 0 0
水平镜像后的矩阵:
-12 45 -3 22 30 18 -5 9 -12 45 -3 22
内容的提问来源于stack exchange,提问作者Heise Fun
相关产品推荐
相关产品推荐

