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