C语言程序设计 数组

前言

   C语言程序设计实验-数组,分享记录。

(1)掌握一维、二维数组的定义、初始化及其数组元素的引用; 
(2)掌握使用字符数组存储字符串的方法; 
(3)熟练掌握一维数组、二维数组编程运用; 
(4)熟悉字符串处理函数; 
(5)掌握数组的管理操作:排序、查找、插入和删除。

程序题目及实现

(1)随机产生 20 个 200-300 之间的 int 类型的数组元素,并用冒泡排序法按降序排列并输出。 

# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
# include <time.h>
# include <stdlib.h>

int main() {
    int arr[20];
    srand(time(NULL));

    // 生成随机数并存储到数组中
    for (int i = 0; i < 20; i++) {
        arr[i] = rand() % 100 + 200;
}

    // 冒泡排序(降序)
    for (int p = 0; p < 20; p++) {
        for (int i = 0; i < 20 - 1 - p; i++) {
            if (arr[i] < arr[i + 1]) {
                // 交换元素
                int tmp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = tmp;
            }
        }
}

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

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

(2)编程实现两个字符串的连接(不使用 strcat 函数)。 

# define _CRT_SECURE_NO_WARNINGS
# include <stdio.h>
# include <string.h>

int main() {
    int i, j;

    // 增加一个位置来容纳空格字符
    char arr1[10] = "hello", arr2[10] = "world", arr3[21] = "";

    // 复制 arr1 到 arr3   
    for (i = 0; i < sizeof(arr1) && arr1[i] != '\0'; i++) {
        arr3[i] = arr1[i];
    }

    // 在 arr3 中间添加一个空格
    arr3[i++] = ' ';

    // 手动复制 arr2 到 arr3
    for (j = 0; j < sizeof(arr2) && arr2[j] != '\0'; j++, i++) {
        arr3[i] = arr2[j];
    }

    // 输出合并后的字符串
    printf("%s\n", arr3);
    return 0;
}


(3)请编写程序,实现统计字符串 s(字符串 s 键盘输入,可以包含字母、数字等字符)中数字字符‘0’~‘9’出现的次数,并依此存储在长度为 10 的数组 count 中。
例如,当输入字符串“83748329a17846b739274560183”后 ,count 数组中
各元素的值为 1 2 2 4 3 1 2 4 4 2,表示: 
数字字符‘0’出现 1 次 
数字字符‘1’出现 2 次 
。。。。。。 
数字字符‘9’出现 2 次

# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>

int main() {
    char s[100]; // 定义一个字符数组用于存储输入的字符串,最大长度假设为100

    int count[10] = { 0 }; // 定义一个数组用于统计数字字符的出现次数,初始都为0

    // 提示用户输入字符串
    printf("请输入字符串: ");
    scanf("%s", s);

    // 遍历输入的字符串,统计数字字符的出现次数
    for (int i = 0; s[i] != '\0'; i++) {
        if (s[i] >= '0' && s[i] <= '9') {
            int digit = s[i] - '0'; // 将字符转换为对应的数字
            count[digit]++; // 增加对应数字的计数
        }
    }

    // 输出统计结果
    printf("数字字符出现的次数为:\n");

    for (int i = 0; i < 10; i++) {
        printf("数字字符'%d'出现 %d 次\n", i, count[i]);
    }
    return 0;
}


(4)输入一个 5×5 的整型矩阵,分别计算该矩阵主对角线和副对角线上的元素之和,并把结果输出。

# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>

int main() {
    int arr[5][5];
    int arr1 = 0, arr2 = 0;
    /*int arr[5][5] = {
       {10, 0, 0, 0, 20},
       {0, 10, 0, 20, 0},
       {0, 0, 10, 0, 0},
       {0, 20, 0, 10, 0},
       {20, 0, 0, 0, 10}
    };*/

    // 输入矩阵元素
    printf("请输入 arr 5×5 的整型矩阵:\n");

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            printf("输入 arr[%d][%d]: ", i, j);
            scanf("%d", &arr[i][j]);
        }
    }

    // 计算 arr 的主对角线和副对角线的元素之和
    for (int i = 0; i < 5; i++) {
        arr1 += arr[i][i]; // arr 的主对角线上的元素之和
        arr2 += arr[i][4 - i]; // arr 的副对角线上的元素之和
    }

    // 输出结果
    printf("arr 主对角线上的元素之和: %d\n", arr1);
    printf("arr 副对角线上的元素之和: %d\n", arr2);
    return 0;
}


(5)键盘输入 10 个数,将它们存入一个数组 a 中,先对该数组元素从大到小排序,再向数组 a 中插入一个数(键盘输入),插入后要求保证该数组元素依然有序,然后再将该数组的第 3 个元素删除。请编程实现以上操作,并显示插入前、插入后及删除操作后的数组,要求用选择排序。

# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>

int main() {
    int i, j, tmp, max, arr[11] = { 0 };

    // 输入十个整数,将其存储在数组中
    for (i = 0; i < 10; i++) {
        printf("请输入第%d个数:", i + 1);
        scanf("%d", &arr[i]);
    }

    // 显示插入前的数组
    printf("插入前的数组:");
    for (i = 0; i < 10; i++)
        printf("%d ", arr[i]);
    printf("\n");

    // 使用选择排序对数组进行降序排序
    for (i = 0; i < 9; i++) {
        max = i;
        for (j = i + 1; j < 10; j++)
            if (arr[max] < arr[j])
                max = j;
        // 如果最大元素不在当前位置,进行交换
        if (max != i) {
            tmp = arr[i];
            arr[i] = arr[max];
            arr[max] = tmp;
        }}

    // 显示排序后的数组
    printf("排序后的数组:");
    for (i = 0; i < 10; i++)
        printf("%d ", arr[i]);
    printf("\n");

    // 输入要插入的数
    printf("请输入要插入的数:");
    scanf("%d", &arr[10]);

    // 使用选择排序对数组进行降序排序(包含新插入的数)
    for (i = 0; i < 11; i++) {
        max = i;
        for (j = i + 1; j < 11; j++)
            if (arr[max] < arr[j])
                max = j;

        // 如果最大元素不在当前位置,进行交换
        if (max != i) {
            tmp = arr[i];
            arr[i] = arr[max];
            arr[max] = tmp;
        }
    }

    // 显示插入后的数组
    printf("插入后的数组:");
    for (i = 0; i < 11; i++)
        printf("%d ", arr[i]);

    printf("\n");

    // 删除插入后的第三个元素
    for (i = 2; i < 10; i++)
        arr[i] = arr[i + 1];

    // 显示删除操作后的数组
    printf("删除操作后的数组:");

    for (i = 0; i < 10; i++)
        printf("%d ", arr[i]);

    printf("\n");

    // 返回 0 表示程序执行成功
    return 0;
}


(6)编写程序:输入 n 个单词(n>=2),实现按字母顺序升序排列。例如:
“change”“yes”“hello”“able” , 排 序 结 果 为 “able”
“change”“hello”“yes”

# define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <string.h>

int main() {
    int n;
    // 初始化字符串数组来存储输入的单词
    char arr[100][100];  // 假设最多有100个单词,每个单词的最大长度为100

    // 获取输入的单词数量
    printf("请输入单词的数量(n>=2): ");
    scanf("%d", &n);

    // 检查输入是否合法
    if (n < 2) {
        printf("输入的数量不合法。\n");
        return 1;  // 返回错误码
    }

    // 获取每个单词
    for (int i = 0; i < n; i++) {
        printf("请输入第%d个单词: ", i + 1);
        scanf("%s", arr[i]);
    }

    // 使用冒泡排序按字母顺序升序排列单词
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < n - i; j++) {
            if (strcmp(arr[j], arr[j + 1]) > 0) {
                // 交换两个单词
                char temp[100];
                strcpy(temp, arr[j]);
                strcpy(arr[j], arr[j + 1]);
                strcpy(arr[j + 1], temp);
            }
        }
    }

    printf("按字母顺序升序排列的结果为:\n");
    for (int i = 0; i < n; i++) {
        printf("%s\n", arr[i]);
    }

 return 0;

}


(7)拓展题(选) 
编写程序,从键盘输入一个字符串 s,删除 s 所存储的字符串中下标为偶数同时ASCII 码值也为偶数的字符,剩余字符所形成的的新字符串存储到 t 数组中,输出 t 数组。 
如:若 s 所存字符串为“AB479cde$@” ,其中字符‘A’下标是偶数(0 记为偶数),但 ASCII 码值是奇数,所以保留;字符‘B,其 ASCII 码值为偶数,但下标是奇数,所以保留;字符‘4’下标是偶数,ASCII 码值也是偶数,所以删除;以此类推,按要求删除后剩余字符形成新的字符串“AB79ce@” 

# define  _CRT_SECURE_NO_WARNINGS 1 
# include <stdio.h>

int main() {
    char s[100], t[100];
    int i = 0, j = 0;

    printf("请输入一个字符串: ");
    gets(s);

    // 遍历字符串 s,删除下标为偶数且 ASCII 码值为偶数的字符,并将结果存储到数组 t 中
    for (i = 0; s[i] != '\0'; i++) {
        if (i % 2 != 0 || s[i] % 2 != 0) {
            t[j] = s[i];
            j++;
        }
    }

    t[j] = '\0';  // 在 t 数组末尾添加字符串结束符

    // 输出删除下标为偶数且 ASCII 码值为偶数的字符后的结果
    printf("删除下标为偶数且 ASCII 码值为偶数的字符后的结果: %s\n", t);

    return 0;
}


(8)拓展题(选) 
编写程序,从键盘上输入一行英文句子存于一个字符数组中,删除其中的空格字符后输出字符串及其长度。 
如:请输入英文句子: 
H  ow ar e you?↵ 
输出为:Howareyou? 
串的长度为:10

# define  _CRT_SECURE_NO_WARNINGS 1 
# include <stdio.h>

int main() {
    int i = 0, j = 0;
    char arr[100], arr1[100];

    printf("请输入英文句子:");
    gets(arr); 
 
    for (i = 0; i < strlen(arr); i++) {
        if (arr[i] != ' ') {
            arr1[j] = arr[i];  // 如果字符不是空格,将其添加到 arr1 中
            j++;
        }
    }

    arr1[j] = '\0';  // 在删除空格后的字符串末尾添加字符串结束符

    // 输出删除空格后的字符串及其长度
    printf("删除空格后的字符串是: %s\n", arr1);
    printf("串的长度为%d\n", strlen(arr1));

    return 0;
}

总结

        在本次的编程实验中,掌握一维、二维数组的定义、初始化及其数组元素的引用,还有字符数组存储字符串的方法。 熟练掌握一维数组、二维数组编程运用。熟悉了用字符串处理函数以及数组的管理操作:排序、查找、插入和删除。数组在一定程度上可以简化某些问题,节省打代码的时间,也缩短了代码的长度,使自己的效率提高。但在使用数组时应遵循数组使用的原则。

  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值