输入5个学生学号及3门课的成绩,每门课成绩范围为0-100,超过此范围不允许输入且给出提示,计算每位学生的总分,并依据总分进行排序并输出。
时间: 2024-12-22 20:18:54 浏览: 5
当然,这是一个涉及到基本数据输入、验证、计算和排序的问题。我们可以使用结构体来存储每个学生的信息,数组或动态内存分配来存储所有学生的数据,然后使用循环遍历数组,进行相应的操作。以下是一个简单的C程序示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义一个结构体来存储学生信息
typedef struct {
int student_id; // 学生学号
float score[3]; // 三门课程成绩
} Student;
void input_scores(Student* students, int num_students) {
for (int i = 0; i < num_students; i++) {
printf("请输入学生%d的学号:", i+1);
scanf("%d", &students[i].student_id);
for (int j = 0; j < 3; j++) {
printf("请输入第%d门课的成绩(0-100):", j+1);
while (scanf("%f", &students[i].score[j]) != 1 || students[i].score[j] < 0 || students[i].score[j] > 100) {
printf("分数超出范围,请重新输入:");
clear_input_buffer();
}
}
}
}
float calculate_total_score(Student* student) {
return student->score[0] + student->score[1] + student->score[2];
}
void sort_students(Student* students, int num_students) {
int i, j;
for (i = 0; i < num_students - 1; i++) {
for (j = 0; j < num_students - 1 - i; j++) {
if (calculate_total_score(&students[j]) > calculate_total_score(&students[j + 1])) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
void output_sorted_students(Student* students, int num_students) {
printf("\n按总分从高到低排列的学生信息:\n");
for (int i = 0; i < num_students; i++) {
printf("学号:%d 总分:%f\n", students[i].student_id, calculate_total_score(&students[i]));
}
}
int main() {
int num_students;
printf("请输入学生数量:");
scanf("%d", &num_students);
// 分配内存给学生数组
Student* students = malloc(num_students * sizeof(Student));
if (!students) {
printf("内存分配失败!\n");
return 1;
}
input_scores(students, num_students);
sort_students(students, num_students);
output_sorted_students(students, num_students);
free(students); // 释放内存
return 0;
}
```
这个程序首先定义了一个`Student`结构体,接着定义了输入成绩、计算总分、排序以及输出功能。`input_scores`函数用于获取用户输入,`sort_students`函数实现了冒泡排序算法对总分进行降序排列。
请确保运行环境支持`clear_input_buffer()`函数(这里未实际编写,一般是在`getchar()`后清除缓冲区),如果不在标准库中,你需要自己实现这部分逻辑。
阅读全文