C语言数字数组

一维数组

常用定义和初始化

1
2
#define n 10
int s[n];
1
int s[10]={1,2,3,4,5,6,8,9,66,99}

常用的为循环输入

1
2
3
4
5
6
int s[10];
int i;
for(i=0;i<10;i++)
{
scanf("%d",&s[i]);
}

输出为printf

1
2
3
4
for(i=0;i<n;i++)
{
printf("%d",s[i]);
}

冒泡排序

重要排序算法

冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的列表,比较每一对相邻的元素,如果它们的顺序错误就交换它们。这个过程被重复进行直到没有需要交换的元素为止,列表因此变得有序。

任务描述

本关任务:将十个数进行从大到小的顺序进行排列。

测试说明

样例输入: 1 2 3 4 5 6 7 8 9 10

样例输出: 10 9 8 7 6 5 4 3 2 1

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
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<stdio.h>

int main(void)
{
/*********Begin*********/
int i, j, temp;
int s[10];

// 输入数组元素
for(i = 0; i < 10; i++)
{
scanf("%d", &s[i]);
}

// 使用冒泡排序将数组按降序排列
for(i = 0; i < 10 - 1; i++)
{
for(j = 0; j < 10 - 1 - i; j++)
{
if(s[j] < s[j + 1])
{
temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
}
}
}

// 输出排序后的数组
for(i = 0; i < 10; i++)
{
printf("%d ", s[i]);
}

/*********End**********/
return 0;
}

这段代码的目标是将数组 s 按降序排序。让我们逐行解析这段代码:

1
for(i = 0; i < 10 - 1; i++)

这个外层 for 循环控制整个冒泡排序过程需要执行的轮数。由于每一轮最大的元素都会被移到最后,我们实际上只需要执行 n-1 轮(这里 n 是数组的长度)。因此,循环的范围是 08(共 9 次)。

1
for(j = 0; j < 10 - 1 - i; j++)

内层 for 循环用于控制每轮遍历。每一轮都需要比较并可能交换相邻的元素对。注意,循环的上限是 10 - 1 - i,这是因为随着每一轮的进行,已经排序好的元素会逐渐“冒泡”到数组的末尾,这部分元素不需要再比较。

1
if(s[j] < s[j + 1])

这里的 if 语句检查当前元素 s[j] 是否小于下一个元素 s[j + 1]。如果是,则需要交换它们以确保更大的元素在前(实现降序排序)。

1
2
3
temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;

这三行代码实现了元素交换:

  1. s[j] 的值存到临时变量 temp 中。
  2. s[j + 1] 的值赋给 s[j]
  3. temp 中的原 s[j] 值赋给 s[j + 1]

通过上述步骤,这对元素被交换,较大的元素移动到了前面。

代码整体流程

  1. 初始化外层循环i0 开始递增到 8
  2. 内层循环:每次遍历数组的前 10 - 1 - i 个元素,对每对相邻元素进行比较和交换。
  3. 元素交换:如果前一个元素小于后一个元素,就交换它们,使较大的元素移到前面。
  4. 重复上述过程:直到所有元素都被正确排序为止。

最终,经过 n-1 轮比较和交换,数组 s 将按降序排序。

二维数组

二维数组是数组的一种扩展形式,可以用来表示矩阵、表格或其他网格状的数据结构。在C语言中,二维数组是一个数组的数组,这意味着它是一个包含多个一维数组的数组。

定义和初始化二维数组

在C语言中,可以这样定义和初始化一个二维数组:

1
int array[3][4]; // 定义一个3行4列的二维数组

这段代码定义了一个包含3个一维数组的数组,每个一维数组包含4个整数元素。

可以在定义时进行初始化:

1
2
3
4
5
int array[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};

这将数组初始化为如下形式:

1
2
3
1  2  3  4
5 6 7 8
9 10 11 12

访问二维数组元素

可以使用下标访问二维数组中的元素:

1
2
int value = array[1][2]; // 访问第二行第三列的元素,值为7
array[0][0] = 42; // 将第一行第一列的元素设置为42

遍历二维数组

可以使用嵌套的循环遍历二维数组:

1
2
3
4
5
6
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", array[i][j]);
}
printf("\n");
}

这段代码将打印二维数组的所有元素,每行一个。

应用二维数组的示例程序

让我们看一个简单的示例程序,它读取一个二维数组的输入并打印出来:

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
26
#include <stdio.h>

int main() {
int rows = 3;
int cols = 4;
int array[rows][cols];

// 读取二维数组输入
printf("请输入 %d 行 %d 列的数组元素:\n", rows, cols);
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
scanf("%d", &array[i][j]);
}
}

// 打印二维数组
printf("输入的二维数组是:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", array[i][j]);
}
printf("\n");
}

return 0;
}

总结

  • 定义:使用 type array[rows][cols] 定义二维数组,其中 type 是数据类型,rows 是行数,cols 是列数。
  • 初始化:可以在定义时对数组进行初始化,使用大括号 {} 分别包围每一行的数据。
  • 访问:使用 array[i][j] 访问第 i 行第 j 列的元素。
  • 遍历:使用嵌套的 for 循环遍历数组的所有元素。

二维数组在存储和处理矩阵、表格数据时非常有用,在科学计算、图像处理和游戏开发中广泛应用,如五子棋,贪吃蛇等。

任务描述

题目描述:按如下函数原型编程从键盘输入一个mn列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中mn的值由用户键盘输入。已知mn的值都不超过10

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
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>

int main(void) {
int rows, cols;

// 读取二维数组的行数和列数
printf("Enter the number of rows: ");
scanf("%d", &rows);
printf("Enter the number of columns: ");
scanf("%d", &cols);

int array[rows][cols];

// 读取二维数组的元素
printf("Enter the elements of the array:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
scanf("%d", &array[i][j]);
}
}

// 查找二维数组中的最大值
int max_value = array[0][0];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (array[i][j] > max_value) {
max_value = array[i][j];
}
}
}

// 打印最大值
printf("The maximum value in the array is: %d\n", max_value);

return 0;
}

代码说明:

  1. 读取数组的维度
    • 程序首先提示用户输入二维数组的行数和列数,并将其存储在rowscols变量中。
  2. 读取数组的元素
    • 程序创建一个具有rows行和cols列的二维数组array
    • 使用嵌套的for循环遍历每个数组元素,并提示用户输入这些元素的值。
  3. 查找最大值
    • 初始化max_value为数组的第一个元素array[0][0]
    • 再次使用嵌套的for循环遍历每个数组元素,如果发现某个元素大于当前的max_value,则更新max_value
  4. 打印最大值
    • 最后,程序打印出找到的最大值。

使用示例:

假设输入如下:

1
2
3
4
5
6
Enter the number of rows: 3
Enter the number of columns: 3
Enter the elements of the array:
1 2 3
4 5 6
7 8 9

程序的输出将是:

1
The maximum value in the array is: 9