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