现在要对若干个学生的姓名(汉字)进行从小到大排序(即字典顺序,适合用字符串处理库函数处理),键盘接收输入的学生个数,假设学生姓名最长不超过20个汉字(一个汉字2个字节),依次输入所有姓名后,输出排序后的学生姓名。请编写程序实现上述功能,既要省时又要省空间。
时间: 2024-02-15 15:01:25 浏览: 78
好的,我来为您解答这个问题。
首先,我们可以定义一个字符串类型的数组,用于存储学生姓名。假设学生个数为n,则数组大小为n*21(20个汉字加上一个字符串结束符'\0')。
接下来,我们可以使用C语言中的标准库函数qsort()进行排序。qsort()函数的原型如下:
```c
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
```
其中,参数base为待排序数组的首地址,nmemb为数组元素个数,size为每个元素的大小,compar为比较函数的指针。
比较函数的定义如下:
```c
int cmp(const void *a, const void *b);
```
其中,参数a和b为待比较的两个元素的指针。比较函数的返回值为负数、0或正数,分别表示a小于、等于或大于b。
在本问题中,我们需要按照字典序进行排序。因此,我们可以使用标准库函数strcmp()进行比较。strcmp()函数的原型如下:
```c
int strcmp(const char *s1, const char *s2);
```
其中,参数s1和s2为待比较的两个字符串。strcmp()函数的返回值为负数、0或正数,分别表示s1小于、等于或大于s2。
综上所述,本问题的解决方案如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b) {
return strcmp(*(const char **)a, *(const char **)b);
}
int main() {
int n;
printf("请输入学生个数:");
scanf("%d", &n);
char **names = (char **)malloc(n * sizeof(char *));
for (int i = 0; i < n; i++) {
names[i] = (char *)malloc(21 * sizeof(char));
printf("请输入第%d个学生的姓名:", i+1);
scanf("%s", names[i]);
}
qsort(names, n, sizeof(char *), cmp);
printf("排序后的学生姓名为:\n");
for (int i = 0; i < n; i++) {
printf("%s\n", names[i]);
free(names[i]);
}
free(names);
return 0;
}
```
在本程序中,我们首先定义了一个char指针类型的数组names,用于存储学生姓名。在循环中,我们先为每个指针分配21字节的空间,然后使用scanf()函数从键盘接收输入的学生姓名。
接下来,我们使用qsort()函数对names数组进行排序,排序函数cmp()使用strcmp()函数比较两个字符串的大小。
最后,我们依次输出排序后的学生姓名,并释放动态分配的内存空间。
希望我的回答能够帮助您解决问题!
阅读全文