c语言编程实现,m 名学生学习 n 门课程,要求采用动态内存分配,根据用户输入的学生人数和课程数,建立二维数组存储学生的成绩。计算学生总分,按总分降序输出学生成绩信息,编写测试程序进行测试。要完整的代码
时间: 2024-12-28 15:32:28 浏览: 6
在C语言中,你可以使用动态内存分配来实现这个需求。下面是一个简单的示例,它创建了一个二维数组来存储学生的分数,并实现了添加、计算总分以及排序的功能:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_STUDENTS 100
#define MAX_COURSES 10
// 结构体表示学生及其成绩
typedef struct {
int student_id;
double scores[MAX_COURSES];
} Student;
// 动态分配并初始化学生数据
void create_students(int num_students, int num_courses) {
Student *students = (Student*) malloc(num_students * sizeof(Student));
for (int i = 0; i < num_students; i++) {
students[i].student_id = i + 1;
// 这里假设每门课的成绩都已输入,实际应用中应通过循环获取
// 示例代码:
for (int j = 0; j < num_courses; j++) {
printf("请输入学生 %d 的第 %d 门课程的成绩:", students[i].student_id, j+1);
scanf("%lf", &students[i].scores[j]);
}
}
}
// 计算总分
double calculate_total_score(Student *student) {
double total = 0;
for (int i = 0; i < MAX_COURSES; i++) {
if (student->scores[i] != 0) // 防止除以零错误
total += student->scores[i];
}
return total;
}
// 按照总分降序排列学生
void sort_students_descending(Student *students, int num_students) {
int i, j;
for (i = 0; i < num_students - 1; 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 print_sorted_students(Student *students, int num_students) {
for (int i = 0; i < num_students; i++) {
printf("学生ID:%d 总分:%lf\n", students[i].student_id, calculate_total_score(&students[i]));
}
}
int main() {
int num_students, num_courses;
printf("请输入学生人数:");
scanf("%d", &num_students);
printf("请输入课程数:");
scanf("%d", &num_courses);
if (num_students > MAX_STUDENTS || num_courses > MAX_COURSES) {
printf("学生或课程数量超出范围,请调整。\n");
return 1;
}
create_students(num_students, num_courses);
sort_students_descending(students, num_students);
print_sorted_students(students, num_students);
free(students); // 释放内存
return 0;
}
```
**相关问题--:**
1. 这段代码为什么需要检查学生和课程的数量是否超过预设的最大值?
2. 动态内存分配是如何工作的?
3. 如何优化此代码以便处理更大规模的数据?
阅读全文