用c语言编写:利用指针将10个学生的姓名排序。名字由键盘输入,只用一个主函数
时间: 2023-08-31 07:35:24 浏览: 570
### 回答1:
下面是用C语言编写的利用指针将10个学生的姓名排序的程序,只用一个主函数:
```c
#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN 50
#define NUM_STUDENTS 10
int main()
{
char names[NUM_STUDENTS][MAX_NAME_LEN];
char temp[MAX_NAME_LEN];
char *name_ptrs[NUM_STUDENTS];
int i, j;
// 输入学生姓名
printf("请输入%d个学生的姓名:\n", NUM_STUDENTS);
for (i = 0; i < NUM_STUDENTS; i++) {
scanf("%s", names[i]);
name_ptrs[i] = names[i];
}
// 排序学生姓名
for (i = 0; i < NUM_STUDENTS - 1; i++) {
for (j = i + 1; j < NUM_STUDENTS; j++) {
if (strcmp(name_ptrs[i], name_ptrs[j]) > 0) {
temp[0] = '\0';
strcpy(temp, name_ptrs[i]);
name_ptrs[i][0] = '\0';
strcpy(name_ptrs[i], name_ptrs[j]);
name_ptrs[j][0] = '\0';
strcpy(name_ptrs[j], temp);
}
}
}
// 输出排序后的学生姓名
printf("\n排序后的学生姓名如下:\n");
for (i = 0; i < NUM_STUDENTS; i++) {
printf("%s\n", name_ptrs[i]);
}
return 0;
}
```
程序中使用了一个二维字符数组 `names` 存储学生姓名,一个一维字符指针数组 `name_ptrs` 存储指向每个学生姓名的指针,以及一个字符数组 `temp` 用于交换字符串时的临时存储。
首先通过循环输入学生姓名,并将每个姓名的地址存储到 `name_ptrs` 数组中。然后使用两个嵌套的循环对学生姓名进行排序,排序方法为比较姓名的字典序,如果前一个姓名大于后一个姓名,则交换两个姓名的位置。
最后输出排序后的学生姓名。
注意,为了简化程序,没有对输入的姓名进行长度检查,实际应用中应该对输入的姓名进行长度限制和检查。
### 回答2:
要用C语言编写程序,利用指针将10个学生的姓名排序,并且只用一个主函数的话,我们可以使用选择排序算法来实现。
首先,我们可以定义一个结构体`Student`来表示学生信息,其中包括一个字符数组`name`用于存储学生姓名。
接下来,在主函数中,我们可以定义一个存放10个学生的`Student`类型的数组,并利用循环从键盘输入每位学生的姓名,并把它们存储在对应位置的`name`数组中。
然后,我们可以定义一个指向`Student`类型的指针`p1`和`p2`,并使用选择排序算法来对学生姓名进行排序。
具体步骤如下:
1. 定义一个`Student`类型的数组`students`用于存放学生信息。
2. 使用循环从键盘输入每位学生的姓名,并把它们存储在对应位置的`name`数组中。
3. 定义指向`Student`类型的指针`p1`和`p2`。
4. 使用两层循环遍历学生信息数组,比较学生姓名的字典序,并交换指针`p1`和`p2`所指向的学生信息。
5. 输出排序后的学生姓名。
下面是一段示例代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_NAME_LENGTH 20
#define NUM_STUDENTS 10
typedef struct {
char name[MAX_NAME_LENGTH];
} Student;
int main() {
Student students[NUM_STUDENTS];
// 输入学生姓名
for (int i = 0; i < NUM_STUDENTS; ++i) {
printf("请输入第%d个学生的姓名:", i + 1);
scanf("%s", students[i].name);
}
// 使用选择排序算法对学生姓名进行排序
for (int i = 0; i < NUM_STUDENTS - 1; ++i) {
for (int j = i + 1; j < NUM_STUDENTS; ++j) {
if (strcmp(students[i].name, students[j].name) > 0) {
Student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
// 输出排序后的学生姓名
printf("排序后的学生姓名为:\n");
for (int i = 0; i < NUM_STUDENTS; ++i) {
printf("%s\n", students[i].name);
}
return 0;
}
```
以上就是使用C语言编写程序,利用指针将10个学生的姓名排序的方法。
### 回答3:
#include <stdio.h>
#include <string.h>
#define MAX_NAME_LENGTH 50
#define NUM_STUDENTS 10
void sortNames(char** names) {
int i, j;
char* temp;
for(i = 0; i < NUM_STUDENTS - 1; i++) {
for(j = 0; j < NUM_STUDENTS - 1 - i; j++) {
if(strcmp(names[j], names[j+1]) > 0) {
temp = names[j];
names[j] = names[j+1];
names[j+1] = temp;
}
}
}
}
int main() {
char* names[NUM_STUDENTS];
int i;
printf("请输入10个学生的姓名:\n");
for(i = 0; i < NUM_STUDENTS; i++) {
char name[MAX_NAME_LENGTH];
printf("请输入第%d个学生的姓名:", i+1);
scanf("%s", name);
names[i] = malloc(strlen(name) + 1);
strcpy(names[i], name);
}
sortNames(names);
printf("排序结果为:\n");
for(i = 0; i < NUM_STUDENTS; i++) {
printf("%s\n", names[i]);
free(names[i]);
}
return 0;
}
以上是使用C语言编写的将10个学生的姓名进行排序的代码。在这个程序中,我们通过使用指针来保存学生姓名。首先,我们定义了一个指向指针的数组names,用于保存学生姓名的指针。然后,我们使用循环从键盘输入10个学生的姓名,并将它们保存在相应的指针中。接下来,我们使用sortNames函数对学生姓名进行排序。在该函数中,我们使用冒泡排序算法对names数组进行排序。最后,我们在主函数中输出排序后的学生姓名。在输出之后,我们还需要释放之前使用malloc函数分配的内存,以防止内存泄漏的发生。
阅读全文