实验内容
根据本学期的课程表,设计一个成绩管理系统管理自己班的成绩;每个学生记录包含学号、姓名、每门课程成绩等。具体要求如下(自己可以增加功能):
(1)输入:成绩录入;
(2)输出:输出成绩表和每门课成绩平均成绩;
(3)插入:在成绩表中适当位置插入某个学生成绩;
(4)删除:在成绩表中删除某个学生成绩;
(5)查找:根据某个关键字查找某个学生成绩
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 学生信息结构体
typedef struct Student {
int id;
char name[50];
float chinese, math, english;
} Student;
// 单链表节点结构体
typedef struct Node {
Student data;
struct Node *next;
} Node;
// 顺序表
Student arr[100];
int count = 0; // 记录当前学生的数量
// 单链表
Node *head = NULL;
// 函数声明
void input();
void output();
void insert();
void deleteById(int id);
void searchById(int id);
void printList();
void printArray();
float calculateAverage(float *scores, int size);
void addToList(Student student);
void removeFromList(int id);
int main() {
int choice, id, i;
char name[50];
float chinese, math, english;
while (1) {
printf("\n成绩管理系统\n");
printf("1. 输入成绩\n");
printf("2. 输出成绩表\n");
printf("3. 插入成绩\n");
printf("4. 删除成绩\n");
printf("5. 查找成绩\n");
printf("6. 退出\n");
printf("请选择操作: ");
scanf("%d", &choice);
switch (choice) {
case 1:
input();
break;
case 2:
output();
break;
case 3:
insert();
break;
case 4:
printf("请输入要删除的学生学号: ");
scanf("%d", &id);
deleteById(id);
break;
case 5:
printf("请输入要查找的学生学号: ");
scanf("%d", &id);
searchById(id);
break;
case 6:
return 0;
default:
printf("无效的选择,请重新选择!\n");
}
}
return 0;
}
void input() {
if (count >= 100) {
printf("顺序表已满!无法继续输入。\n");
return;
}
printf("请输入学号: ");
scanf("%d", &arr[count].id);
printf("请输入姓名: ");
scanf("%s", arr[count].name);
printf("请输入语文成绩: ");
scanf("%f", &arr[count].chinese);
printf("请输入数学成绩: ");
scanf("%f", &arr[count].math);
printf("请输入英语成绩: ");
scanf("%f", &arr[count].english);
Student student = arr[count++];
addToList(student); // 将新学生信息添加到单链表中
}
void output() {
int i;
printf("\n成绩表:\n");
printf("学号\t姓名\t语文\t数学\t英语\n");
for (i = 0; i < count; i++) {
printf("%d\t%s\t%.2f\t%.2f\t%.2f\n",
arr[i].id, arr[i].name,
arr[i].chinese, arr[i].math, arr[i].english);
}
// 计算并输出每门课的平均成绩
float avg_chinese, avg_math, avg_english;
float *chinese_scores = (float *)malloc(count * sizeof(float));
float *math_scores = (float *)malloc(count * sizeof(float));
float *english_scores = (float *)malloc(count * sizeof(float));
for (i = 0; i < count; i++) {
chinese_scores[i] = arr[i].chinese;
math_scores[i] = arr[i].math;
english_scores[i] = arr[i].english;
}
avg_chinese = calculateAverage(chinese_scores, count);
avg_math = calculateAverage(math_scores, count);
avg_english = calculateAverage(english_scores, count);
free(chinese_scores);
free(math_scores);
free(english_scores);
printf("\n各科平均成绩:\n");
printf("语文平均分: %.2f\n", avg_chinese);
printf("数学平均分: %.2f\n", avg_math);
printf("英语平均分: %.2f\n", avg_english);
printList(); // 打印单链表中的成绩
}
void insert() {
int pos, j;
printf("请输入要插入的位置(0-%d): ", count);
scanf("%d", &pos);
if (pos < 0 || pos > count) {
printf("位置超出范围!\n");
return;
}
if (count >= 100) {
printf("顺序表已满!无法继续插入。\n");
return;
}
printf("请输入学号: ");
scanf("%d", &arr[pos].id);
printf("请输入姓名: ");
scanf("%s", arr[pos].name);
printf("请输入语文成绩: ");
scanf("%f", &arr[pos].chinese);
printf("请输入数学成绩: ");
scanf("%f", &arr[pos].math);
printf("请输入英语成绩: ");
scanf("%f", &arr[pos].english);
// 将pos及其之后的数据后移
for (j = count; j > pos; j--) {
arr[j] = arr[j - 1];
}
count++;
Student student = arr[pos];
addToList(student); // 将新学生信息添加到单链表中
}
void deleteById(int id) {
int found = 0;
for (int i = 0; i < count; i++) {
if (arr[i].id == id) {
for (int j = i; j < count - 1; j++) {
arr[j] = arr[j + 1];
}
count--;
found = 1;
break;
}
}
if (!found) {
printf("未找到该学生。\n");
} else {
removeFromList(id); // 从单链表中删除对应的学生信息
}
}
void searchById(int id) {
int found = 0;
for (int i = 0; i < count; i++) {
if (arr[i].id == id) {
printf("学号: %d 姓名: %s 语文: %.2f 数学: %.2f 英语: %.2f\n",
arr[i].id, arr[i].name, arr[i].chinese, arr[i].math, arr[i].english);
found = 1;
break;
}
}
if (!found) {
printf("未找到该学生。\n");
}
}
void printList() {
printf("\n单链表中的成绩表:\n");
printf("学号\t姓名\t语文\t数学\t英语\n");
Node *temp = head;
while (temp != NULL) {
printf("%d\t%s\t%.2f\t%.2f\t%.2f\n",
temp->data.id, temp->data.name,
temp->data.chinese, temp->data.math, temp->data.english);
temp = temp->next;
}
}
void printArray() {
printf("\n顺序表中的成绩表:\n");
printf("学号\t姓名\t语文\t数学\t英语\n");
for (int i = 0; i < count; i++) {
printf("%d\t%s\t%.2f\t%.2f\t%.2f\n",
arr[i].id, arr[i].name,
arr[i].chinese, arr[i].math, arr[i].english);
}
}
float calculateAverage(float *scores, int size) {
float sum = 0;
for (int i = 0; i < size; ++i) {
sum += scores[i];
}
return sum / size;
}
void addToList(Student student) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = student;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
} else {
Node *temp = head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
void removeFromList(int id) {
Node *current = head;
Node *previous = NULL;
while (current != NULL && current->data.id != id) {
previous = current;
current = current->next;
}
if (current == NULL) {
printf("没有找到该学生\n");
} else if (previous == NULL) {
head = current->next;
free(current);
} else {
previous->next = current->next;
free(current);
}
}