七天学会C语言-第四天(数组)

在这里插入图片描述

1. 定义一维数组

在C语言中,一维数组是具有相同数据类型的元素的有序集合。定义一维数组的基本语法如下:

data_type array_name[array_size];

其中:

  • data_type 是数组元素的数据类型,可以是整数、浮点数、字符等。
  • array_name 是数组的名称,你可以自定义。
  • array_size 是数组的大小,指定了数组可以容纳的元素数量。

例 1:对 10 个数组元素依次赋值为0、1、2、3、4、5、6、7、8、9并按倒序输出。

#include <stdio.h>

int main() {
    
    
    int i;
    int a[10];  // 定义一个包含10个整数的数组

    // 使用循环为数组元素赋值
    for (i = 0; i < 10; i++) {
    
    
        a[i] = i; // 数组的每个元素赋值为它的索引
    }

    // 倒序输出数组元素
    for (i = 9; i >= 0; i--) {
    
    
        printf("%d\t", a[i]); // 输出数组元素的值
    }
    printf("\n");

    return 0;
}

运行结果:

在这里插入图片描述

例 2:输入 10 个地区的面积(面积为整数),对它们由小到大排序并输出排序后的结果。

用两种不同的排序算法,一种是选择排序,另一种是冒泡排序。

选择法(选择排序):

#include<stdio.h>

int main()
{
    
    
    int a[10];
    int i, j, t;

    // 输入10个面积值
    printf("请输入10个面积:\n");
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);

    // 选择排序算法
    for (i = 0; i < 9; i++) {
    
    
        for (j = i + 1; j < 10; j++) {
    
    
            if (a[i] > a[j]) {
    
    
                // 交换元素
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }

    // 输出排序后的面积值
    printf("排序后的面积依次是:\n");
    for (i = 0; i < 10; i++)
        printf("%d\t", a[i]);
    printf("\n");

    return 0;
}

运行结果:

在这里插入图片描述

冒泡法(沉底法、冒泡排序):

#include<stdio.h>

int main()
{
    
    
    int a[10];
    int i, j, t;

    // 输入10个面积值
    printf("请输入10个面积:\n");
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);

    // 冒泡排序算法
    for (j = 0; j < 9; j++) {
    
    
        for (i = 0; i < 9 - j; i++) {
    
    
            if (a[i] > a[i + 1]) {
    
    
                // 交换元素
                t = a[i];
                a[i] = a[i + 1];
                a[i + 1] = t;
            }
        }
    }

    // 输出排序后的面积值
    printf("排序后的面积依次是:\n");
    for (i = 0; i < 10; i++)
        printf("%d\t", a[i]);
    printf("\n");

    return 0;
}

运行结果:

在这里插入图片描述

选择排序的原理是从未排序部分找到最小值,然后与未排序部分的第一个元素交换,然后将未排序部分缩小,继续这个过程,直到整个数组排序完成。而冒泡排序的原理是比较相邻的元素,如果顺序不对则交换它们,这个过程一直重复,直到整个数组排序完成。

两者的核心思想不同,选择排序每轮只选择一个最小值,而冒泡排序每轮都可能有多次交换操作。这两种算法都可以正确地对输入的面积值进行排序,但选择排序在每轮中只交换一次元素,而冒泡排序可能在每轮中交换多次元素。

2. 定义二维数组

与一维数组类似,二维数组是一个具有两个维度的数组。它通常用于表示矩阵或表格数据。定义二维数组的语法如下:

data_type array_name[row_size][column_size];

其中:

  • data_type 是数组元素的数据类型,同样可以是整数、浮点数、字符等。
  • array_name 是数组的名称。
  • row_sizecolumn_size 分别表示二维数组的行数和列数。

例如,定义一个3x3的整数二维数组:

int matrix[3][3];

例1:将一个二维数组在这里插入图片描述
的行列元素互换,存到另一个二维数组 b 中并输出。

#include <stdio.h>

int main() {
    
    
    int a[2][3] = {
    
    {
    
    1, 2, 3}, {
    
    4, 5, 6}};
    int b[3][2];
    int i, j;

    // 使用循环将数组a转置为数组b
    for (i = 0; i <= 1; i++) {
    
    
        for (j = 0; j <= 2; j++) {
    
    
            b[j][i] = a[i][j];
        }
    }

    // 输出数组b
    printf("数组 b 为:\n");
    for (j = 0; j <= 2; j++) {
    
    
        for (i = 0; i <= 1; i++) {
    
    
            printf("%d\t", b[j][i]);
        }
        printf("\n");
    }

    return 0;
}

运行结果:

在这里插入图片描述

例 2:已知矩阵在这里插入图片描述
,请编程求出其中值最大的那个元素。

#include <stdio.h>

int main() {
    
    
    int i, j, max;
    int a[3][3] = {
    
    {
    
    1, 2, 3}, {
    
    9, 8, 7}, {
    
    -10, 10, -5}};

    // 假设最大值为数组的第一个元素
    max = a[0][0];

    // 使用嵌套循环遍历数组,找到最大值
    for (i = 0; i <= 2; i++) {
    
    
        for (j = 0; j <= 2; j++) {
    
    
            if (a[i][j] > max) {
    
    
                max = a[i][j];
            }
        }
    }

    // 输出最大值
    printf("最大元素的值为 %d\n", max);

    return 0;
}

运行结果:

在这里插入图片描述

3. 定义字符数组

字符数组是一种特殊的数组,用于存储字符串。字符串是字符的序列,以空字符 '\0' 结尾。定义字符数组的方式如下:

char string_name[length];

其中:

  • char 表示字符数组的元素类型。
  • string_name 是字符数组的名称。
  • length 是字符数组的长度,包括字符串末尾的空字符 '\0'

例如,定义一个存储名字的字符数组:

char name[20];

例1:定义一个存储名字的字符数组

#include <stdio.h>

int main() {
    
    
    // 声明并初始化一个字符数组来存储名字
    char name[20]; // 假设名字最多包含19个字符,留一个位置给空字符 '\0'

    // 输入名字
    printf("请输入你的名字: ");
    scanf("%19s", name); // 限制输入的字符数不超过19个,并自动在末尾添加 '\0'

    // 打印名字
    printf("你好,%s!\n", name);

    return 0;
}

运行结果:

在这里插入图片描述

4. 输出字符数组

要输出字符数组,你可以使用C语言的标准库函数 printf()。以下是一个示例:

char name[] = "John";
printf("Name: %s\n", name);

这将输出:Name: John

例1:定义一个字符串“Hi,Everybody!!”,然后输出这个字符串。

#include<stdio.h>

int main() {
    
    
    char c[15] = {
    
    'H', 'i', ',', ' ', 'E', 'v', 'e', 'r', 'y', 'b', 'o', 'd', 'y', '!', '!'};

    int i;
    for (i = 0; c[i] != '\0'; i++) {
    
    
        printf("%c", c[i]);
    }

    printf("\n");
    return 0;
}

运行结果:

在这里插入图片描述

例2:输出一个在这里插入图片描述
图案

#include<stdio.h>

int main() {
    
    
    char c[3][3] = {
    
    {
    
    ' ', '*', ' '}, {
    
    '*', ' ', '*'}, {
    
    ' ', '*', ' '}};

    int i, j;
    for (i = 0; i <= 2; i++) {
    
    
        for (j = 0; j <= 2; j++) {
    
    
            printf("%c", c[i][j]);
        }
        printf("\n");
    }

    return 0;
}

运行结果:

在这里插入图片描述

5. 输入字符数组

要从用户那里接收输入并存储到字符数组中,可以使用标准库函数 scanf()gets()。以下是一个示例:

使用 scanf()

char name[20];
printf("Enter your name: ");
scanf("%s", name);

使用 gets()(注意:不建议使用,因为它存在安全问题):

char name[20];
printf("Enter your name: ");
gets(name);

例1:输入一行由空格和单词组成的字符(字符数在 80 以内), 请统计有多少个单词。

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int main() {
    
    
    char input[80]; // 声明一个字符数组来存储输入
    int wordCount = 0; // 用于统计单词数量
    bool inWord = false; // 用于标记是否在单词中

    // 提示用户输入字符数组
    printf("请输入一行由空格和单词组成的字符 (最多80个字符):\n");

    // 使用fgets函数获取用户输入
    fgets(input, sizeof(input), stdin);

    // 去掉输入中的换行符
    size_t len = strlen(input);
    if (len > 0 && input[len - 1] == '\n') {
    
    
        input[len - 1] = '\0';
    }

    // 遍历输入的字符数组来统计单词数量
    for (int i = 0; i < len; i++) {
    
    
        if (input[i] == ' ' || input[i] == '\t') {
    
    
            // 遇到空格或制表符,标记不在单词中
            inWord = false;
        } else {
    
    
            if (!inWord) {
    
    
                // 进入新单词,增加单词数量
                wordCount++;
                inWord = true;
            }
        }
    }

    // 输出统计结果
    printf("输入的字符包含 %d 个单词。\n", wordCount);

    return 0;
}

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_53918860/article/details/133045213