2025-02-27 学习记录--C/C++-PTA 7-30 字符串的冒泡排序
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻
一、题目描述 ⭐️
二、代码(C语言)⭐️
#include <stdio.h> // 包含标准输入输出库,用于使用scanf和puts等函数
#include <string.h> // 包含字符串处理库,用于使用strcmp和strcpy等函数
#define N 102 // 定义常量N,表示最多可以存储102个字符串
#define M 12 // 定义常量M,表示每个字符串的最大长度为12(包括字符串结束符'\0')
int main() { // 主函数,程序的入口
int n, k; // 声明两个整型变量n和k,n表示实际输入的字符串数量,k表示排序的轮数
char strs[N][M]; // 声明一个二维字符数组strs,用于存储最多N个字符串,每个字符串最大长度为M
scanf("%d %d", &n, &k); // 从标准输入读取n和k的值
for(int i = 0; i < n; i++) { // 循环n次,读取n个字符串
scanf("%s", strs[i]); // 将输入的字符串存储到strs[i]中
}
// 冒泡排序
for(int i = 0; i < k; i++) { // 外层循环,控制排序的轮数,最多进行k轮
for(int j = 0; j < n - i - 1; j++) { // 内层循环,每一轮比较相邻的两个字符串
if(strcmp(strs[j], strs[j + 1]) > 0) { // 如果strs[j]大于strs[j + 1]
char temp[M]; // 声明一个临时字符数组temp,用于交换字符串
strcpy(temp, strs[j + 1]); // 将strs[j + 1]复制到temp中
strcpy(strs[j + 1], strs[j]); // 将strs[j]复制到strs[j + 1]中
strcpy(strs[j], temp); // 将temp中的内容复制到strs[j]中,完成交换
}
}
}
for(int i = 0; i < n; i++) { // 循环n次,输出排序后的字符串
puts(strs[i]); // 输出strs[i]中的字符串
}
return 0; // 返回0,表示程序正常结束
}
三、知识点 ⭐️
1、C 库函数strcmp():比较字符串大小。
2、C 库函数strcpy()
3、C 库函数puts()
4、冒泡排序
5、为什么 上述代码中 前面是 二维数组,后面是一维数组呢?
答:📢
实际上strs
始终是一个二维数组,只是在使用时有一些细节需要注意:
- (1)、
char strs[N][M];
- 这是一个二维数组,表示
N
行M
列。- 每一行(
strs[i]
)是一个长度为M
的一维字符数组,用于存储一个字符串。- (2)、为什么看起来像一维数组?
- 在
C
语言中,二维数组的每一行(如strs[i]
)可以被视为一个一维数组。- (3)、总结
strs
始终是一个二维数组,用于存储多个字符串。strs[i]
是二维数组的第i
行,它是一个一维字符数组,用于存储单个字符串。temp
是一个一维数组,用于临时存储字符串,方便交换操作。
举例如下 🌰:
- 假设输入如下:👇🏻
5 2
apple
banana
cherry
date
fig
strs
的内容如下:👇🏻
strs[0] = "apple"
strs[1] = "banana"
strs[2] = "cherry"
strs[3] = "date"
strs[4] = "fig"
- 在排序过程中,
strs[j]
和strs[j+1]
会被比较和交换,但strs
始终是一个二维数组。