已知电信专业2023级有5个班,每个班的学生人数不超过30。要求:1、设计并实现图1所示的数据结构,用于存放各班学生信息。学生信息包含同学姓名和数据结构与算法分析课程考试成绩(使用随机函数生成且呈正太分布)。
时间: 2024-09-17 15:08:33 浏览: 49
为了满足您的需求,我们可以创建一个名为`Student`的结构体来存储学生的姓名和课程考试成绩。同时,我们可以使用链表或动态数组的数据结构来表示班级及其成员,因为班级的学生数量不确定且可能少于30。这里我会使用链表来演示如何实现这个数据结构。
首先,定义`Student`结构体:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h> // 需要time库来生成随机数
typedef struct {
char name[50];
float exam_score;
} Student;
// 链表节点结构
typedef struct Node {
Student student;
struct Node* next;
} Node;
```
然后,创建表示班级的结构和对应操作:
```c
struct Class {
int class_id; // 班级ID
int capacity; // 班级容量
Node* students; // 学生链表头结点
};
// 初始化一个新的班级
Class* createClass(int id, int size) {
Class* new_class = (Class*)malloc(sizeof(Class));
new_class->class_id = id;
new_class->capacity = size;
new_class->students = NULL;
return new_class;
}
// 添加学生到班级
void addStudentToClass(Class* class, Student* student) {
if (class->students == NULL) {
class->students = (Node*)malloc(sizeof(Node));
class->students->student = *student;
class->students->next = NULL;
} else {
Node* current = class->students;
while (current->next != NULL && current->next->student.exam_score > student->exam_score) {
current = current->next;
}
if (current->next == NULL || current->next->student.exam_score <= student->exam_score) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->student = *student;
newNode->next = current->next;
current->next = newNode;
}
}
}
// 生成并设置学生的考试成绩(这里只是一个简单的示例,实际应生成符合正太分布的值)
void setRandomExamScore(Student* student) {
srand(time(NULL)); // 设置随机种子
student->exam_score = (float)(rand() % 100) + 60; // 生成60到100之间的随机数
}
```
现在,您可以创建多个班级,并为每个学生分配一个ID,调用`setRandomExamScore`函数设置成绩,然后添加他们到相应的班级。这里没有完整的主程序,但您可以通过类似以下的方式进行操作:
```c
int main() {
// 创建5个班级
Class* classes[5] = {createClass(1, 30), createClass(2, 30), createClass(3, 30), createClass(4, 30), createClass(5, 30)};
for (int i = 0; i < 5; i++) {
Student student;
strcpy(student.name, "Student Name " + i); // 这里仅做字符串拼接示意,实际应用中应有更好的方式
setRandomExamScore(&student);
addStudentToClass(classes[i], &student);
}
// 您可以根据需要遍历班级和学生列表,查看他们的信息
// 示例:
for (int i = 0; i < 5; i++) {
printf("Class %d:\n", classes[i].class_id);
Node* current = classes[i].students;
while (current != NULL) {
printf("Name: %s, Score: %.2f\n", current->student.name, current->student.exam_score);
current = current->next;
}
}
// 清理内存
for (int i = 0; i < 5; i++) {
free(classes[i]->students);
free(classes[i]);
}
return 0;
}
```
阅读全文