用c语言写一个学生成绩管理系统 该系统用于管理学生的课程成绩,要求实现以下功能: 1、计算每位同学的平均分,对所有同学的成绩按平均分排序,给出名次; 2、计算各课程分数段(90-100、80-89、60-79、60以下)的人数。 数据至少有10个学生的原始数据。原始数据如下: 学号 姓名 C程序设计 高等数学 英语 线性代数 3. 用户输入学生学号可直接查找到其各科分数以及名次
时间: 2023-06-17 21:04:06 浏览: 154
以下是一个简单的学生成绩管理系统的示例代码,包括上述功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 10
#define MAX_NAME_LEN 20
typedef struct {
int id;
char name[MAX_NAME_LEN];
float scores[4];
float avg;
int rank;
} Student;
void read_scores(Student students[], int n_students);
void calculate_avg(Student students[], int n_students);
void calculate_rank(Student students[], int n_students);
void print_scores(Student students[], int n_students);
void print_rankings(Student students[], int n_students);
void print_score_segments(Student students[], int n_students);
void get_student_info(Student students[], int n_students, int id);
int main() {
Student students[MAX_STUDENTS];
int n_students = 0;
int choice;
while (1) {
printf("请选择操作:\n");
printf("1. 输入学生成绩\n");
printf("2. 计算平均分和名次\n");
printf("3. 按平均分排序并输出\n");
printf("4. 输出各科分数段的人数\n");
printf("5. 查找学生信息\n");
printf("0. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
read_scores(students, n_students);
n_students++;
break;
case 2:
calculate_avg(students, n_students);
calculate_rank(students, n_students);
printf("计算完成!\n");
break;
case 3:
qsort(students, n_students, sizeof(Student),
[](const void* a, const void* b) -> int {
const Student* s1 = (const Student*) a;
const Student* s2 = (const Student*) b;
return s2->avg - s1->avg;
});
print_scores(students, n_students);
break;
case 4:
print_score_segments(students, n_students);
break;
case 5:
printf("请输入要查找的学生学号:\n");
int id;
scanf("%d", &id);
get_student_info(students, n_students, id);
break;
case 0:
exit(0);
break;
default:
printf("无效的选择!\n");
}
}
return 0;
}
void read_scores(Student students[], int n_students) {
if (n_students >= MAX_STUDENTS) {
printf("学生数已达到最大值!\n");
return;
}
printf("请输入学号、姓名、C程序设计、高等数学、英语、线性代数的成绩:\n");
Student* s = &students[n_students];
scanf("%d %s %f %f %f %f", &s->id, s->name, &s->scores[0], &s->scores[1],
&s->scores[2], &s->scores[3]);
}
void calculate_avg(Student students[], int n_students) {
for (int i = 0; i < n_students; i++) {
float sum = 0;
for (int j = 0; j < 4; j++) {
sum += students[i].scores[j];
}
students[i].avg = sum / 4;
}
}
void calculate_rank(Student students[], int n_students) {
qsort(students, n_students, sizeof(Student),
[](const void* a, const void* b) -> int {
const Student* s1 = (const Student*) a;
const Student* s2 = (const Student*) b;
return s2->avg - s1->avg;
});
for (int i = 0; i < n_students; i++) {
if (i == 0 || students[i].avg < students[i - 1].avg) {
students[i].rank = i + 1;
} else {
students[i].rank = students[i - 1].rank;
}
}
}
void print_scores(Student students[], int n_students) {
printf("学号\t姓名\tC程序设计\t高等数学\t英语\t线性代数\t平均分\t名次\n");
for (int i = 0; i < n_students; i++) {
printf("%d\t%s\t%.1f\t\t%.1f\t\t%.1f\t%.1f\t\t%.1f\t%d\n",
students[i].id, students[i].name, students[i].scores[0],
students[i].scores[1], students[i].scores[2], students[i].scores[3],
students[i].avg, students[i].rank);
}
}
void print_rankings(Student students[], int n_students) {
printf("名次\t学号\t姓名\t平均分\n");
for (int i = 0; i < n_students; i++) {
printf("%d\t%d\t%s\t%.1f\n", students[i].rank, students[i].id,
students[i].name, students[i].avg);
}
}
void print_score_segments(Student students[], int n_students) {
int count[4] = {0, 0, 0, 0};
for (int i = 0; i < n_students; i++) {
float avg = students[i].avg;
if (avg >= 90) {
count[0]++;
} else if (avg >= 80) {
count[1]++;
} else if (avg >= 60) {
count[2]++;
} else {
count[3]++;
}
}
printf("90-100分段: %d\n", count[0]);
printf("80-89分段: %d\n", count[1]);
printf("60-79分段: %d\n", count[2]);
printf("60分以下: %d\n", count[3]);
}
void get_student_info(Student students[], int n_students, int id) {
for (int i = 0; i < n_students; i++) {
if (students[i].id == id) {
printf("学号\t姓名\tC程序设计\t高等数学\t英语\t线性代数\t平均分\t名次\n");
printf("%d\t%s\t%.1f\t\t%.1f\t\t%.1f\t%.1f\t\t%.1f\t%d\n",
students[i].id, students[i].name, students[i].scores[0],
students[i].scores[1], students[i].scores[2], students[i].scores[3],
students[i].avg, students[i].rank);
return;
}
}
printf("未找到该学生!\n");
}
```
在这个示例代码中,我们使用了一个 `Student` 结构体来表示学生信息,包括学号、姓名、四门课程的分数、平均分和名次。主函数中使用一个无限循环,让用户选择不同的操作。其中,`read_scores` 函数用于输入学生成绩,`calculate_avg` 函数用于计算平均分,`calculate_rank` 函数用于计算名次,`print_scores` 函数用于按平均分排序并输出学生信息,`print_rankings` 函数用于输出名次排序,`print_score_segments` 函数用于输出各科分数段的人数,`get_student_info` 函数用于根据学号查找学生信息。注意,为了方便排序,我们使用了 C++11 中的 Lambda 表达式来定义排序函数。
你可以根据自己的需求修改代码,并添加输入校验等功能,使其更加完善。
阅读全文
相关推荐
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![c](https://img-home.csdnimg.cn/images/20250102104920.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241231044937.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![txt](https://img-home.csdnimg.cn/images/20241231045021.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)