目录
一、二维数组的初始化
在C语言中,二维数组本质上是由多个一维数组组合而成的。
对二维数组进行初始化时,有多种方式。
1.指定行数和列数、完全初始化
需要明确指定二维数组的行数和列数,并且要为数组中的每个元素都提供初始值。
其语法格式为:
数据类型 数组名[行数][列数] = {
{元素1行1列, 元素1行2列, ...},
{元素2行1列, 元素2行2列, ...},
...};
如:定义一个2行3列的二维数组,每个元素都被赋予了初始值。
#include <stdio.h>
int main() {
int arr[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
⬇️
2.指定部分行数和列数、部分初始化
和上述描述的方法一样,只需要为部分元素提供初始值,未指定初始值的元素会被自动初始化为0。
其语法格式为:
数据类型 数组名[行数][列数] = {
{元素1行部分列},
{元素2行部分列},
...
};
如,定义一个3行4列的二维数组,部分初始化;其中arr数组部分元素被初始化,未初始化元素为0。
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2},
{3},
{4, 5, 6}
};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
⬇️
3.根据初始化列表自动确定行数
当省略行数时,编译器会依据初始化列表的内容自动确定行数,但列数必须明确指定。
其语法格式为:
数据类型 数组名[][列数] = {
{元素1行},
{元素2行},
...
};
如,定义一个二维数组,省略行数,由编译器自动确定
#include <stdio.h>
int main() {
int arr[][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int rows = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
⬇️
二、二维数组的遍历
对二维数组进行遍历,常用的方法是使用嵌套的for循环。
1.嵌套for循环——实现二维数组的遍历
外层的for循环用于控制行数,内层的for循环用于控制列数。
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 行数
for (int i = 0; i < 3; i++) {
// 列数
for (int j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
⬇️
三、二维数组的计算、判断
1.计算——二维数组元素的总和
计算二维数组元素的总和,可以使用嵌套的for循环遍历数组,将每个元素累加到一个变量中。
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int sum = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
sum += arr[i][j];
}
}
printf("元素的总和为 %d\n", sum);
return 0;
}
⬇️
- sum变量用于存储数组元素的总和,通过嵌套的for循环遍历数组并累加元素值
2.判断——某个元素是否存在
判断某个元素是否存在于二维数组中,同样使用嵌套的for循环遍历数组,若找到目标元素则返回相应信息。
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int target;
printf("查找的值为: ");
scanf("%d", &target);
int found = 0;
//这里的found作为一个布尔值,来判断是否在该二维数组中
for(int i = 0; i < 3; i++){
for(int j = 0; j < 4; j++){
if(arr[i][j] == target){
found = 1;
break;
}
}
if(found){
break;
}
}
if(found){
printf("%d在二维数组中\n", target);
}else{
printf("%d不在二维数组中\n", target);
}
return 0;
}
case1
case2
四、二维数组的应用——重新摆弄柜子
Q12:想当初好歹是个大宗门外门弟子的你现在已经沦落到这个地步,你叹了口气,不经感叹真是虎落平阳被犬欺啊。
掌柜的看出了你的心不在焉,让你重新收拾下柜子里的东西。
原先如果是这样排列的柜子:
1 2 3
4 5 6
你需要把它排成这样
1 4
2 5
3 6
如果将柜子和柜子里的物体看成二维数组的话, 你需要做的就是将行和列互换。
这种苦力你怎么可能老老实实的干呢,你再次悄咪咪的打开了C语言编译器...
1.分析
如果说输入的是 n*m 矩阵的话,需要将它转换为 m*n 矩阵,原来矩阵的行变成列,原矩阵的列变成转置后的行。
2.设计
变量设计
- rows 矩阵的行数
- cols 矩阵的列数
- before[max_rows][max_cols] 二维数组,用于存储原来的矩阵
- after[max_cols][max_rows] 二维数组,用于存储转换后的矩阵
算法设计
- 用户输入矩阵的行和列
- 依次输入矩阵的元素
- 将原矩阵的值赋给后矩阵
- 输出转换后的矩阵
3.编码
#include <stdio.h>
int main() {
int max_rows = 100,max_cols = 100;
int before[max_rows][max_cols];
int after[max_cols][max_rows];
int rows, cols;
// 输入矩阵的行数和列数
printf("输入行数和列数:");
scanf("%d %d", &rows, &cols);
// 输入矩阵元素
printf("依次输入矩阵元素:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
scanf("%d", &before[i][j]);
}
}
// 进行转置操作
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
after[j][i] = before[i][j];
}
}
// 输出转置后的矩阵
printf("转置后的矩阵为:\n");
for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
printf("%d ", after[i][j]);
}
printf("\n");
}
return 0;
}