用C建立一张学生成绩表,每个学生包含 学号、姓名、性别、语文、数学、英语、总分、平均分。 3.按学号查找某学生所有成绩。 4.能够实现某学生的成绩插入和删除。 5.实现文件操作,程序退出时将学生成绩保存在studen_grad.txt文件中;程序开始时,能够从student_grad.txt文件中加载已有的学生成绩信息。 要求所有功能均使用独立的函数来实现,使用结构体来存储学生信息,使用malloc动态创建,假设学生的总数是固定的,即你只需要开辟一次内存,使用一个整数
时间: 2023-12-03 17:47:48 浏览: 98
来记录学生数量即可。以下是实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100 // 最大学生数
// 学生结构体
typedef struct {
char id[10]; // 学号
char name[20]; // 姓名
char sex[5]; // 性别
int score[3]; // 三科成绩
int total; // 总分
float average; // 平均分
} Student;
// 学生数组
Student* students[MAX_STUDENTS];
// 学生数量
int num_students = 0;
// 添加学生
void add_student() {
if (num_students >= MAX_STUDENTS) {
printf("学生数量已达到最大值,无法添加新学生!\n");
return;
}
Student* s = (Student*)malloc(sizeof(Student));
printf("请输入学生学号:");
scanf("%s", s->id);
printf("请输入学生姓名:");
scanf("%s", s->name);
printf("请输入学生性别:");
scanf("%s", s->sex);
printf("请输入学生语文成绩:");
scanf("%d", &(s->score[0]));
printf("请输入学生数学成绩:");
scanf("%d", &(s->score[1]));
printf("请输入学生英语成绩:");
scanf("%d", &(s->score[2]));
s->total = s->score[0] + s->score[1] + s->score[2];
s->average = s->total / 3.0;
students[num_students++] = s;
printf("学生添加成功!\n");
}
// 显示学生列表
void list_students() {
printf("学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n");
for (int i = 0; i < num_students; i++) {
Student* s = students[i];
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%.2f\n",
s->id, s->name, s->sex, s->score[0], s->score[1], s->score[2], s->total, s->average);
}
}
// 按学号查找学生
void find_student() {
char id[10];
printf("请输入要查找的学生学号:");
scanf("%s", id);
for (int i = 0; i < num_students; i++) {
Student* s = students[i];
if (strcmp(s->id, id) == 0) {
printf("学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n");
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%.2f\n",
s->id, s->name, s->sex, s->score[0], s->score[1], s->score[2], s->total, s->average);
return;
}
}
printf("未找到该学生!\n");
}
// 删除学生
void delete_student() {
char id[10];
printf("请输入要删除的学生学号:");
scanf("%s", id);
for (int i = 0; i < num_students; i++) {
Student* s = students[i];
if (strcmp(s->id, id) == 0) {
free(s);
for (int j = i + 1; j < num_students; j++) {
students[j - 1] = students[j];
}
num_students--;
printf("学生删除成功!\n");
return;
}
}
printf("未找到该学生!\n");
}
// 保存学生信息到文件
void save_students() {
FILE* fp = fopen("student_grad.txt", "w");
if (fp == NULL) {
printf("无法打开文件!\n");
return;
}
fprintf(fp, "%d\n", num_students);
for (int i = 0; i < num_students; i++) {
Student* s = students[i];
fprintf(fp, "%s %s %s %d %d %d %d %.2f\n",
s->id, s->name, s->sex, s->score[0], s->score[1], s->score[2], s->total, s->average);
}
fclose(fp);
printf("学生信息已保存到文件!\n");
}
// 从文件加载学生信息
void load_students() {
FILE* fp = fopen("student_grad.txt", "r");
if (fp == NULL) {
printf("无法打开文件!\n");
return;
}
fscanf(fp, "%d", &num_students);
for (int i = 0; i < num_students; i++) {
Student* s = (Student*)malloc(sizeof(Student));
fscanf(fp, "%s %s %s %d %d %d %d %f",
s->id, s->name, s->sex, &(s->score[0]), &(s->score[1]), &(s->score[2]), &(s->total), &(s->average));
students[i] = s;
}
fclose(fp);
printf("学生信息已从文件中加载!\n");
}
int main() {
load_students();
while (1) {
printf("\n请输入操作编号:\n1.添加学生\n2.显示学生列表\n3.按学号查找学生\n4.删除学生\n5.保存学生信息到文件\n0.退出程序\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
add_student();
break;
case 2:
list_students();
break;
case 3:
find_student();
break;
case 4:
delete_student();
break;
case 5:
save_students();
break;
case 0:
save_students();
printf("程序已退出!\n");
return 0;
default:
printf("无效的操作编号,请重新输入!\n");
break;
}
}
}
```
阅读全文