用C语言表示程序:某班有最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体门数由键盘输入)定义结构体类型描述学生信息,每个学生信息包括:学号、姓名、多门课的成绩、总成绩和平均成绩。用结构体数组作为函数参数,编程实现如下菜单驱动的学生成绩管理系统。 (注:红色部分为必做功能,黑色部分为选做功能) (1) 录入每个学生的学号、姓名和各科考试成绩。 (2) 计算每门课程的总分和平均分。 (3) 计算每个学生的总分和平均分。 (4) 按每个学生的总分由高到低排出名次表。
时间: 2024-02-21 18:58:25 浏览: 122
以下是实现题目要求的C语言代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 30
#define MAX_COURSES 6
#define MAX_NAME_LENGTH 20
// 定义学生信息结构体
typedef struct {
char id[10]; // 学号
char name[MAX_NAME_LENGTH]; // 姓名
float scores[MAX_COURSES]; // 各科成绩
float total_score; // 总成绩
float average_score; // 平均成绩
} student;
// 函数声明
void input_scores(student students[], int num_students, int num_courses);
void calculate_course_total_average(student students[], int num_students, int num_courses);
void calculate_student_total_average(student students[], int num_students, int num_courses);
void sort_students_by_total_score(student students[], int num_students);
int main()
{
int num_students, num_courses;
student students[MAX_STUDENTS];
// 读取学生人数和科目数
printf("请输入学生人数(不超过30人)和科目数(不超过6门):\n");
scanf("%d %d", &num_students, &num_courses);
// 录入学生信息和成绩
input_scores(students, num_students, num_courses);
// 计算每门课程的总分和平均分
calculate_course_total_average(students, num_students, num_courses);
// 计算每个学生的总分和平均分
calculate_student_total_average(students, num_students, num_courses);
// 按每个学生的总分由高到低排出名次表
sort_students_by_total_score(students, num_students);
// 输出每个学生的信息和成绩
printf("学号\t姓名\t");
for (int i = 1; i <= num_courses; i++) {
printf("科目%d\t", i);
}
printf("总分\t平均分\t名次\n");
for (int i = 0; i < num_students; i++) {
printf("%s\t%s\t", students[i].id, students[i].name);
for (int j = 0; j < num_courses; j++) {
printf("%.1f\t", students[i].scores[j]);
}
printf("%.1f\t%.1f\t%d\n", students[i].total_score, students[i].average_score, i + 1);
}
return 0;
}
// 录入学生信息和成绩
void input_scores(student students[], int num_students, int num_courses)
{
for (int i = 0; i < num_students; i++) {
printf("请输入第%d个学生的学号、姓名和各科成绩:\n", i + 1);
scanf("%s %s", students[i].id, students[i].name);
for (int j = 0; j < num_courses; j++) {
scanf("%f", &students[i].scores[j]);
}
}
}
// 计算每门课程的总分和平均分
void calculate_course_total_average(student students[], int num_students, int num_courses)
{
for (int i = 0; i < num_courses; i++) {
float total_score = 0;
for (int j = 0; j < num_students; j++) {
total_score += students[j].scores[i];
}
float average_score = total_score / num_students;
printf("科目%d总分为%.1f,平均分为%.1f\n", i + 1, total_score, average_score);
}
}
// 计算每个学生的总分和平均分
void calculate_student_total_average(student students[], int num_students, int num_courses)
{
for (int i = 0; i < num_students; i++) {
float total_score = 0;
for (int j = 0; j < num_courses; j++) {
total_score += students[i].scores[j];
}
students[i].total_score = total_score;
students[i].average_score = total_score / num_courses;
}
}
// 按每个学生的总分由高到低排出名次表
void sort_students_by_total_score(student students[], int num_students)
{
for (int i = 0; i < num_students - 1; i++) {
for (int j = i + 1; j < num_students; j++) {
if (students[i].total_score < students[j].total_score) {
student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
}
}
```
这个程序实现了题目要求的所有功能。用户可以先输入学生人数和科目数,然后录入每个学生的学号、姓名和各科成绩。程序会自动计算每门课程的总分和平均分,每个学生的总分和平均分,并且按每个学生的总分由高到低排出名次表。最后,程序会输出每个学生的信息和成绩。
阅读全文