void sortRecords() { printf("1.按学号排序\n"); printf("2.按姓名排序\n"); printf("3.按平均成绩排序\n"); printf("请选择排序方式:"); int sortChoice; scanf("%d", &sortChoice); if(sortChoice==1) { // 按学号排序(选择排序法) for (int i=0;i<studentCount-1;i++) { int minIndex=i; for (int j=i+1;j<studentCount;j++) { if (students[j].id<students[minIndex].id) { minIndex=j; } } struct Student temp=students[i]; students[i]=students[minIndex]; students[minIndex]=temp; } } else if(sortChoice==2) { // 按姓名排序(冒泡排序法) for(int i=0;i<studentCount-1;i++) { for(int j=0;j<studentCount-i-1;j++) { if(strcmp(students[j].name, students[j+1].name)>0) { struct Student temp=students[j]; students[j]=students[j+1]; students[j+1]=temp; } } } } else if(sortChoice==3) { // 按平均成绩排序(冒泡排序法) for(int i=0;i<studentCount-1;i++) { for(int j=0;j<studentCount-i-1;j++) { if(students[j].average>students[j+1].average) { struct Student temp=students[j]; students[j]=students[j+1]; students[j+1]=temp; } } } } else { printf("无效的排序方式!\n"); return; } printf("成绩排序成功!\n"); listRecords(); }的算法思想
时间: 2023-07-15 21:12:35 浏览: 63
这段代码实现了对学生记录的排序功能,包括按学号、姓名、平均成绩三种排序方式。其中,按学号排序采用选择排序法,按姓名和平均成绩排序采用冒泡排序法。
选择排序法的基本思想是:每次从待排序的元素中选出最小的元素,将其放到已排序部分的末尾。具体实现过程是,从第一个元素开始,依次比较后面的元素,找到最小的元素,并与第一个元素交换位置。然后从第二个元素开始,继续这个过程,直到所有元素都被排序。
冒泡排序法的基本思想是:依次比较相邻的两个元素,如果它们的顺序不对则交换它们的位置。具体实现过程是,从第一个元素开始,依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换它们的位置。这样一趟比较下来,最大的元素就被排到了最后面。然后从第二个元素开始,继续这个过程,直到所有元素都被排序。
在这段代码中,首先根据用户选择的排序方式,分别采用不同的排序算法进行排序。其中,选择排序法用于按学号排序,冒泡排序法用于按姓名和平均成绩排序。排序完成后,再调用listRecords函数输出排序后的学生记录。
相关问题
Student students[100]; int num_students=0; void show_mnu( ) { printf( " \n"); printf("******************************\n" ); printf(" 学生成绩管理系统 \n"); printf("******************************\n"); printf("1.显示所以学生信息\n"); printf("2.添加学生信息 \n" ); printf("3.按学号递增排序\n" ); printf( "4.按总分递减排序\n" ); printf("5.按学号查找\n" ); printf("6.按姓名查找\n" ); printf("7.按分数查找\n" ); printf("8.计算各门课平均分\n" ); printf( "9.保存学生信息到文件\n" ); printf( "0.退出程序\n" ); printf("******************************\n"); } int main() read_student_file(); while (1) { show_menu( ); int choice; printf("请输入操作编号:"); scanf( "%d", &choice); case 1:show_all_students(); break; case 2:add_student(); break; case 3:sort_by_num(); break; case 4:sort_by_total(); break; case 5:search_by_num(); break; case 6:search_by_name(); break; case 7:search by_score(); break; case 8:calculate_avg(); break; case 9:save_student_file(); break; case 0:printf("程序已退出!\n"); return O; default:printf("输入有误,请重新输入!\n"); break; } } return 0; }修改错误
有几处错误需要修正,具体修改如下:
1. 函数名 show_mnu 应该修改为 show_menu。
2. 函数 show_menu 中的 printf 函数中的字符串 “所以” 应该改为 “所有”。
3. 函数 main 中的 read_student_file 函数调用应该放到 while 循环前面。
4. switch 语句中 case 7:search by_score(); 应该修改为 case 7:search_by_score();。
5. 函数 main 的最后一行 return 0; 应该放在 while 循环结束后面。
修改后的代码如下:
```c
Student students[100];
int num_students = 0;
void show_menu() {
printf("\n");
printf("******************************\n");
printf(" 学生成绩管理系统 \n");
printf("******************************\n");
printf("1.显示所有学生信息\n");
printf("2.添加学生信息 \n");
printf("3.按学号递增排序\n");
printf("4.按总分递减排序\n");
printf("5.按学号查找\n");
printf("6.按姓名查找\n");
printf("7.按分数查找\n");
printf("8.计算各门课平均分\n");
printf("9.保存学生信息到文件\n");
printf("0.退出程序\n");
printf("******************************\n");
}
int main() {
read_student_file();
while (1) {
show_menu();
int choice;
printf("请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
show_all_students();
break;
case 2:
add_student();
break;
case 3:
sort_by_num();
break;
case 4:
sort_by_total();
break;
case 5:
search_by_num();
break;
case 6:
search_by_name();
break;
case 7:
search_by_score();
break;
case 8:
calculate_avg();
break;
case 9:
save_student_file();
break;
case 0:
printf("程序已退出!\n");
return 0;
default:
printf("输入有误,请重新输入!\n");
break;
}
}
}
```
设计一个学生成绩管理系统的大作业,要求有以下功能:输入基本信息(学号、姓名、课程名、各科成绩等);显示所有信息或根据要求输出信息;排序(按学号\姓名\某门课程分数\总分,可以根据学生的能力自己扩充);查询(按学号\姓名\某门课程等,自己可以扩充)。程序框架如下: main() { …… while(1) { printf(“1. 输入\n“); printf(“2. 查询\n“); printf(“3. 显示\n“); printf(“4. 排序\n“)
好的,这是一个很典型的学生成绩管理系统,需要实现输入、查询、显示和排序等功能。这里给出一个简单的程序框架供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
#define MAX_COURSE_NUM 10
/* 学生结构体 */
typedef struct {
int id; /* 学号 */
char name[20]; /* 姓名 */
float scores[MAX_COURSE_NUM]; /* 各科成绩 */
float total_score; /* 总分 */
} student_t;
/* 学生成绩管理系统 */
student_t students[MAX_STUDENT_NUM]; /* 学生数组 */
int student_num = 0; /* 学生总数 */
/* 输入学生信息 */
void input_student_info() {
/* TODO: 实现输入学生信息的功能 */
}
/* 查询学生成绩 */
void query_student_score() {
/* TODO: 实现查询学生成绩的功能 */
}
/* 显示学生信息 */
void show_student_info() {
/* TODO: 实现显示学生信息的功能 */
}
/* 按学号排序 */
void sort_by_id() {
/* TODO: 实现按学号排序的功能 */
}
/* 按姓名排序 */
void sort_by_name() {
/* TODO: 实现按姓名排序的功能 */
}
/* 按某门课程分数排序 */
void sort_by_course_score(int course_idx) {
/* TODO: 实现按某门课程分数排序的功能 */
}
/* 按总分排序 */
void sort_by_total_score() {
/* TODO: 实现按总分排序的功能 */
}
int main() {
int choice;
while (1) {
printf("1. 输入\n");
printf("2. 查询\n");
printf("3. 显示\n");
printf("4. 排序\n");
printf("0. 退出\n");
printf("请输入你的选择: ");
scanf("%d", &choice);
switch (choice) {
case 1:
input_student_info();
break;
case 2:
query_student_score();
break;
case 3:
show_student_info();
break;
case 4:
printf("1. 按学号排序\n");
printf("2. 按姓名排序\n");
printf("3. 按某门课程分数排序\n");
printf("4. 按总分排序\n");
printf("请选择排序方式: ");
scanf("%d", &choice);
switch (choice) {
case 1:
sort_by_id();
break;
case 2:
sort_by_name();
break;
case 3:
printf("请输入要排序的课程编号: ");
scanf("%d", &choice);
sort_by_course_score(choice - 1);
break;
case 4:
sort_by_total_score();
break;
default:
printf("无效的选择\n");
break;
}
break;
case 0:
printf("再见!\n");
return 0;
default:
printf("无效的选择\n");
break;
}
}
return 0;
}
```
在这个程序框架中,我们定义了一个 `student_t` 结构体表示学生信息,包括学号、姓名、各科成绩和总分。同时,我们定义了一个 `students` 数组表示所有学生信息,以及一个 `student_num` 变量表示学生总数。
接下来,我们实现输入、查询、显示和排序等功能。可以看到,在程序中我们使用了一些函数来实现不同的功能,如 `input_student_info()`、`query_student_score()`、`show_student_info()`、`sort_by_id()`、`sort_by_name()`、`sort_by_course_score()` 和 `sort_by_total_score()` 等。
最后,在 `main()` 函数中,我们使用一个无限循环来不断接收用户的选择,并根据不同的选择来调用相应的函数来实现相应的功能。当用户选择 `0` 退出程序时,程序结束。
阅读全文