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 栗子:求和周邊元素
- 方法一:直接求
#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;
}
- 方法二:所有減中間
#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");
}
結果: