关于二维数组的处理

1. 二维数组的访问

两层 for 循环,外层遍历内层遍历行内列

1.1 栗子 one 遍历

遍历输出二维数组中的值,每5个换一行

#include <stdio.h>
int main(void)
{
	int a[5][5] = {
		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
	};
	int count = 1;
	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++) {
			printf("%3d", a[i][j]);
			if (count % 5 == 0) {
				printf("\n");
			}
			count++;
		}
	}
	return 0;
} 

结果:
在这里插入图片描述

1.2 栗子 two 求鞍点

鞍点 :数组当前元素既是本行最大值,又是本列最小值

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
int main(void)
{
	int a[N][N];
	int max[N], min[N];
	int i, j, m, n;
	printf("请输入行和列:"); 
	scanf("%d %d", &m, &n);
	srand(time(0));/* 初始rand */
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			a[i][j] = rand() % 10;/* 模拟随机数 */
			printf("%3d", a[i][j]);
		}
		printf("\n");
	}
	
	for (i = 0; i < m; i++) {
		max[i] = a[i][0]; /* 存储每行第一个元素 */ 
		for (j = 0; j < n; j++) {/* 遍历这一行找最大 */
			if (a[i][j] > max[i]) {
				max[i] = a[i][j];
			}
		} 
	}

	for (j = 0; j < n; j++) {
		min[j] = a[0][j]; /* 存储每列第一个元素 */ 
		for (i = 0; i < m; i++) {/* 遍历这一列找最小 */
			if (a[i][j] < min[j]) {
				min[j] = a[i][j];
			}
		} 
	}
	int count = 1;
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (a[i][j] == max[i] && a[i][j] == min[j]) {
				printf("第%d行第%d列的%d是第%d鞍点\n", i+1, j+1, a[i][j], count); 
				count++;
			}
		}
	}
	return 0;
} 

2. 二维数组的局部访问(方阵)

2.1 访问下半三角

特点:行大于列

在这里插入图片描述

	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (i > j) {
				printf("%2d", a[i][j]);
			}
		}
		printf("\n");
	} 

结果:
在这里插入图片描述

2.2 访问上半三角

特点:列大于行

在这里插入图片描述

	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (i < j) {
				printf("%2d", a[i][j]);
			}else{
				printf("  ");/* 有利于看 */
			}
		}
		printf("\n");
	} 

结果:
在这里插入图片描述

2.3 访问主对角线元素

特点:列等于行

在这里插入图片描述

	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (i == j) {
				printf("%2d", a[i][j]);
			}else{
				printf("  ");
			}
		}
		printf("\n");
	} 

结果:
在这里插入图片描述

2.4 访问副对角线元素

特点:i + j + 1 = 行

在这里插入图片描述

	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (i == m - j - 1) {/* 关键 */
				printf("%2d", a[i][j]);
			}else{
				printf("  ");
			}
		}
		printf("\n");
	} 

结果:
在这里插入图片描述

2.5 访问周边元素

特点:i == 0 || i == m - 1 || j == n -1 || j == 0

还有一种思想是先算全部的然后减去中间的

在这里插入图片描述

	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (i == 0 || i == m - 1 || j == n -1 || j == 0) {/* 关键 */
				printf("%2d", a[i][j]);
			}else{
				printf("  ");
			}
		}
		printf("\n");
	} 

结果:
在这里插入图片描述

2.5.6 栗子:求和周边元素
  1. 方法一:直接求
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
int main(void)
{
	int a[N][N];
	int max[N], min[N];
	int i, j, m, n;
	printf("请输入行和列:"); 
	scanf("%d %d", &m, &n);
	srand(time(0));/* 初始rand */
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			a[i][j] = rand() % 10;/* 模拟随机数 */
			printf("%3d", a[i][j]);
		}
		printf("\n");
	}
	
	printf("-------------\n");
	int sum = 0;
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (i == 0 || i == m - 1 || j == n -1 || j == 0) {/* 关键 */
				sum += a[i][j];
			}
		}
	} 
	printf("%d", sum);
	return 0;
} 
  1. 方法二:所有减中间
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
int main(void)
{
	int a[N][N];
	int max[N], min[N];
	int i, j, m, n;
	int sum = 0;
	printf("请输入行和列:"); 
	scanf("%d %d", &m, &n);
	srand(time(0));/* 初始rand */
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			a[i][j] = rand() % 10;/* 模拟随机数 */
			printf("%3d", a[i][j]);
			sum += a[i][j];
			
		}
		printf("\n");
	}
	
	printf("-------------\n");
	
	for (i = 1; i < m-1; i++) {
		for (j = 1; j < n-1; j++) {
				sum -= a[i][j];
			}
		} 
	printf("%d", sum);
	return 0;
} 
2.5 逆置方阵

在这里插入图片描述

	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			if (i > j) {
				int temp = a[i][j];
				a[i][j] = a[j][i];
				a[j][i] = temp;
			}
		}
	} 
	
	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
				printf("%3d", a[i][j]);
		}
		printf("\n");
	}

结果:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章