首先,定义学生成绩结构体类型,其中成员包括学号、姓名、性别、数学成绩、英语成绩、C语言成绩和总成绩,并且定义结构体数组,然后,利用文件的读写操作知识,编写函数实现从文件中逐条读取学生成绩信息功能和保存所有学生成绩信息到文件的功能,最后,编写函数实现显示学生全部信息功能、修改某位同学成绩信息功能、删除某位同学成绩信息功能、查询某位同学成绩信息功能和按照总成绩排序的功能。
时间: 2023-08-18 20:05:04 浏览: 186
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 定义结构体数组最大长度
// 学生成绩结构体类型
typedef struct {
char id[10]; // 学号
char name[20]; // 姓名
char gender[6]; // 性别
int math_score; // 数学成绩
int eng_score; // 英语成绩
int c_score; // C语言成绩
int total_score; // 总成绩
} Student;
Student stu[MAX_SIZE]; // 结构体数组
int stu_num = 0; // 结构体数组中实际元素个数
// 从文件中逐条读取学生成绩信息功能
void readFromFile() {
FILE *fp;
fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
while (!feof(fp)) {
fscanf(fp, "%s%s%s%d%d%d%d", stu[stu_num].id, stu[stu_num].name, stu[stu_num].gender,
&stu[stu_num].math_score, &stu[stu_num].eng_score, &stu[stu_num].c_score, &stu[stu_num].total_score);
stu_num++;
}
fclose(fp);
}
// 保存所有学生成绩信息到文件的功能
void saveToFile() {
FILE *fp;
fp = fopen("students.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
for (int i = 0; i < stu_num; i++) {
fprintf(fp, "%s %s %s %d %d %d %d\n", stu[i].id, stu[i].name, stu[i].gender,
stu[i].math_score, stu[i].eng_score, stu[i].c_score, stu[i].total_score);
}
fclose(fp);
}
// 显示学生全部信息功能
void displayAll() {
printf(" 学号\t\t姓名\t\t性别\t\t数学成绩\t英语成绩\tC语言成绩\t总成绩\n");
for (int i = 0; i < stu_num; i++) {
printf("%s\t%s\t\t%s\t\t%d\t\t%d\t\t%d\t\t%d\n", stu[i].id, stu[i].name, stu[i].gender,
stu[i].math_score, stu[i].eng_score, stu[i].c_score, stu[i].total_score);
}
}
// 修改某位同学成绩信息功能
void modify() {
char id[10];
printf("请输入要修改的学生学号:");
scanf("%s", id);
for (int i = 0; i < stu_num; i++) {
if (strcmp(stu[i].id, id) == 0) {
printf("请输入修改后的学生信息:\n");
printf("学号:");
scanf("%s", stu[i].id);
printf("姓名:");
scanf("%s", stu[i].name);
printf("性别:");
scanf("%s", stu[i].gender);
printf("数学成绩:");
scanf("%d", &stu[i].math_score);
printf("英语成绩:");
scanf("%d", &stu[i].eng_score);
printf("C语言成绩:");
scanf("%d", &stu[i].c_score);
stu[i].total_score = stu[i].math_score + stu[i].eng_score + stu[i].c_score;
printf("修改成功!\n");
return;
}
}
printf("未找到该学生信息!\n");
}
// 删除某位同学成绩信息功能
void delete() {
char id[10];
printf("请输入要删除的学生学号:");
scanf("%s", id);
for (int i = 0; i < stu_num; i++) {
if (strcmp(stu[i].id, id) == 0) {
for (int j = i; j < stu_num - 1; j++) {
stu[j] = stu[j+1];
}
stu_num--;
printf("删除成功!\n");
return;
}
}
printf("未找到该学生信息!\n");
}
// 查询某位同学成绩信息功能
void query() {
char id[10];
printf("请输入要查询的学生学号:");
scanf("%s", id);
for (int i = 0; i < stu_num; i++) {
if (strcmp(stu[i].id, id) == 0) {
printf(" 学号\t\t姓名\t\t性别\t\t数学成绩\t英语成绩\tC语言成绩\t总成绩\n");
printf("%s\t%s\t\t%s\t\t%d\t\t%d\t\t%d\t\t%d\n", stu[i].id, stu[i].name, stu[i].gender,
stu[i].math_score, stu[i].eng_score, stu[i].c_score, stu[i].total_score);
return;
}
}
printf("未找到该学生信息!\n");
}
// 按照总成绩排序的功能
void sort() {
for (int i = 0; i < stu_num - 1; i++) {
for (int j = 0; j < stu_num - i - 1; j++) {
if (stu[j].total_score < stu[j+1].total_score) {
Student temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
}
}
printf("排序成功!\n");
}
int main() {
readFromFile(); // 从文件中读取学生成绩信息
int choice;
while (1) {
printf("\n1. 显示学生全部信息");
printf("\n2. 修改某位同学成绩信息");
printf("\n3. 删除某位同学成绩信息");
printf("\n4. 查询某位同学成绩信息");
printf("\n5. 按照总成绩排序");
printf("\n6. 保存所有学生成绩信息到文件");
printf("\n7. 退出程序");
printf("\n请输入你的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
displayAll();
break;
case 2:
modify();
break;
case 3:
delete();
break;
case 4:
query();
break;
case 5:
sort();
break;
case 6:
saveToFile();
break;
case 7:
exit(0);
default:
printf("输入有误,请重新输入!\n");
}
}
return 0;
}
```
其中,我们将学生信息保存到了一个名为 "students.txt" 的文本文件中,文件格式如下:
```
20190101 张三 男 80 90 85 255
20190102 李四 女 90 85 95 270
20190103 王五 男 75 85 90 250
```
以上代码实现了一个简单的学生成绩管理系统,可以通过不同的选项进行学生信息的读取、修改、删除、查询和排序等操作。
阅读全文