目录
数组
一、数组的相关概念
- 数组名:本质上是一个标识符常量,命名需要符合标识符规范。
- 元素:同一个数组中的元素必须是相同的数据类型。
- 下标(索引、角标):从0开始的连续数字。
- 数组的长度:表示元素的个数。
二、数组操作
1.数组的定义
- 方式一:先指定元素的个数和类型,再进行初始化
// 定义一个数组,数组名字是arr1,元素类型是int,元素个数是3个
int arr1[3];
// 定义完后为每个元素赋值
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
- 方式二:指定元素的类型和个数并同时进行初始化
// 定义一个int类型的数组,数组名是arr2,元素个数是3,并且进行初始化 int arr2[3] = {100, 200, 300};
- 方式三:指定元素的类型,不指定元素个数,同时进行初始化
// 没有指定元素个数,系统会自动计算
int arr3[] = {1, 2, 3, 4, 5};
2.访问数组元素
通过“数组名[下标]”可以访问数组中的元素,案例如下
#include <stdio.h>
int main()
{
// 定义一个int类型的数组,有3个数元素,并且进行初始化
int arr1[3] = {10, 20, 30};
// 通过索引(下标)修改第二个位置的数据
arr1[1] += 100;
printf("第一个元素值为:%d \n", arr1[0]);
printf("第二个元素值为:%d \n", arr1[1]);
printf("第三个元素值为:%d \n", arr1[2]);
return 0;
}
3.遍历数组
遍历数组是指按顺序访问数组中的每个元素,以便读取或修改它们,编程中一般使用循环结构对数组进行遍历。
#include <stdio.h>
int main()
{
// 遍历数组
int arr[5] = {100, 200, 300, 400, 500};
// 先计算数组的元素个数
int arr_len = (sizeof arr) / (sizeof arr[0]);
for (int i = 0; i < arr_len; i++)
{
printf("数组下标为:%d,元素值为:%d \n", i, arr[i]);
}
return 0;
}
我们还可以通过数组遍历完成数组的初始化赋值,看下面案例。
创建长度为10的数组,元素依次赋值为0,1,2,3,4,5,6,7,8,9,并按逆序输出每个元素,代码如下:
#include <stdio.h>
int main()
{
// 动态为数组赋值,并且倒序输出
int arr[10];
int arr_len = sizeof arr / sizeof arr[0];
for (int i = 0; i < arr_len; i++)
{
arr[i] = i; // 为数组元素赋值
}
for (int i = arr_len - 1; i >= 0; i--)
{ // 倒序输出
printf("值为:%d ", arr[i]);
}
return 0;
}
4.数组应用案例
取出数组中之值最大的元素。
#include <stdio.h>
int main()
{
// 求数组中最大值,最小值
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int arr_len = sizeof arr / sizeof arr[0];
// 假设第一元素为最大值
int max = arr[0];
// 假设第一元素为最小值
int min = arr[0];
for (int i = 0; i < arr_len; i++)
{
if (max < arr[i])
{ // 如果最大值比数组的每个元素还大,就存储起来
max = arr[i];
}
if (min > arr[i])
{ // 如果最小值比数组的每个元素还小,就存储起来
min = arr[i];
}
}
printf("最大值为:%d,最小值为:%d \n", max, min);
return 0;
}
三、字符数组
1.字符数组(字符串)的定义
- 方式一:最后一个元素设置成 \0
在给某个字符数组赋值时,赋值的元素个数小于字符数组的长度,则会自动在后面加 '\0', 表示字符串结束; 赋值的元素的个数等于该数组的长度(或不指定数组长度),则不会自动添加 '\0'。
#include <stdio.h>
int main()
{
// 定义字符数组(也可以叫字符串) \0----结束标识
// 定义char类型的数组,设置5个元素数,并显示设置\0
char chs1[5] = {'a','b','c','d','\0'};
// 指定长度,没有显示设置\0,默认会自动加上
char chs2[4] = {'t','o','m'};
// 没有指定数组元素个数,也没有显示指定\0
char chs3[] = {'j', 'a', 'c', 'k'};
// 输出这些字符串
printf("%s \n",chs1);
printf("%s \n",chs2);
// 由于没有显示设置结束标识,那么默认会把相邻内存中的数据读取出来,直到找到\0结束标识位置
printf("%s \n",chs3);
// 总结:字符数组指定了元素个数后,需要在结尾指定结束标识\0,
// 如果字符数组指定了元素个数,元素数据中没有指定结尾标识,系统会自动加上结束标识\0
// 如果字符数组指定了元素个数,但是元素个数和指定长度相同,那么结尾处也没有结束标识\0
// 系统没有自动添加结束标识\0,也没有显示指定,输出的时候会把相邻的内存中的字符全部读取出来,直到遇到结束标识为止
return 0;
}
- 方式二:简化写法
#include <stdio.h>
int main()
{
// 简化字符数组写法
// 默认会自动添加结束标识\0
char chs1[] = {"what are you no sha lei"};
printf("%s \n", chs1);
// 省略大括号,默认也会自动加\0
char chs2[] = "no sha lei ni shuo ne";
printf("%s \n", chs2);
return 0;
}
2.字符数组(字符串)的访问和遍历
字符数组(字符串)的访问和遍历,按照一般数组的方式访问和遍历即可。
#include <stdio.h>
int main()
{
// 字符串数组的遍历
char chs[] = "love";
// 计算字符数组的字节长度
int chs_len = sizeof chs;
printf("数组长度:%d \n", chs_len); // 字节个数:4
printf("%s \n", chs); // 输出字符串
printf("第三个元素:%c \n", chs[2]);
// 遍历字符数组
for (int i = 0; i < chs_len; i++)
{
printf("%c ", chs[i]);
}
return 0;
}
三、多维数组
如果数组的元素还是数组,这样的数组就称为多维数组。这种多层次的结构允许我们以表格或矩阵的方式组织数据,其中每个维度都对应于不同的行、列或更多的维度,使数据更加结构化和有组织
1.二维数组的定义
- 方式1: 先定义再初始化
#include <stdio.h>
int main()
{
int arr[2][3]; // 定义一个2行3列的二维数组
// 为数组元素赋值
arr[0][0] = 10;
arr[0][1] = 20;
arr[0][2] = 30;
arr[1][0] = 40;
arr[1][1] = 50;
arr[1][2] = 60;
return 0;
}
- 方式2: 直接定义并初始化
#include <stdio.h>
int main()
{
// 直接定义并以矩阵的方式初始化二维数组
int arr1[3][4] = {
{10, 20, 30, 40},
{50, 60, 70, 80},
{90, 100, 110, 120}};
// 定义三行四列的二维数组(自动匹配隔行割裂)
int arr2[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
// 定义三行三列的二维数组,只设置列,也会自动匹配(一维可以不进行预设)
int arr3[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
return 0;
}
2.二维数组的访问和遍历
访问二维数组的元素,需要使用两个下标(索引),一个用于访问行(第一维),另一个用于访问列(第二维),我们通常称为行下标(行索引)或列下标(列索引)。
遍历二维数组,需要使用双层循环结构。
#include <stdio.h>
int main()
{
// 定义一个2行3列的二维数组,并初始化,使用for遍历,同时求和
int sum = 0;
int arr[2][3] = {
{10, 20, 30},
{40, 50, 60}};
// 计算出数组的行数
int rows = sizeof arr / sizeof arr[0];
// 计算出数组的列数
int cols = sizeof arr[0] / sizeof(int);
// printf("%d \n",rows);
// printf("%d \n",cols);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
printf("%d \t", arr[i][j]);
sum += arr[i][j];
}
printf("\n");
}
printf("二维数组中数据之和为:%d \n", sum);
return 0;
}
二维数组应用案例
现在有三个班,每个班五名同学,用二维数组保存他们的成绩,并求出每个班级平均分、以及所有班级平均分,数据要求从控制台输入。
#include <stdio.h>
int main()
{
// 案例现在有三个班,每个班五名同学,用二维数组保存他们的成绩,并求出每个班级平均分、以及所有班级平均分,数据要求从控制台输入。
int rows = 3; // 行数
int cols = 5; // 列列数
// 先定义一个3行5列的二维数组
double scores[rows][cols];
// 循环录入每个班每个学生的成绩
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
printf("请输入第%d个班中第%d个学生的成绩: \n", i + 1, j + 1);
scanf("%lf", &scores[i][j]);
}
}
// 定义每个班的总成绩和所有班的总成绩
double class_sum = 0;
double all_class_sum = 0;
// 遍历所有的班级学员成绩
for (int i = 0; i < rows; i++)
{
class_sum = 0; // 每次重置该成绩数据
for (int j = 0; j < cols; j++)
{
// 计算每个班的总成绩
class_sum += scores[i][j];
}
printf("\n");
// 求每个班的平均成绩
printf("第%d班的总成绩为:%.2f,每个的平均分为:%.2f \n", i + 1, class_sum, class_sum / cols);
// 计算所有班的总成绩
all_class_sum += class_sum;
}
// 所有班的平均成绩为
printf("所有班的总成绩:%.2f,平均成绩为:%.2f \n", all_class_sum, all_class_sum / (rows * cols));
return 0;
}