關於二維數組的處理

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");
	}

結果:
在這裏插入圖片描述

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