可以用一个类来实现,结构体也可以
【以下回答由 GPT 生成】
在C语言中实现学生成绩信息统计功能可以通过使用结构体和文件操作来实现。下面是一个具体的解决方案:
第一步:定义学生信息的结构体
typedef struct {
int no;
char sno[20];
char sname[50];
float usual;
float expr;
float exam;
float total;
char grade;
} Student;
第二步:实现添加学生信息的功能
Student addStudent() {
Student student;
printf("请输入学生编号:");
scanf("%d", &student.no);
printf("请输入学生学号:");
scanf("%s", student.sno);
printf("请输入学生姓名:");
scanf("%s", student.sname);
printf("请输入学生平时成绩:");
scanf("%f", &student.usual);
printf("请输入学生实验成绩:");
scanf("%f", &student.expr);
printf("请输入学生期末考试成绩:");
scanf("%f", &student.exam);
student.total = 0.2 * student.usual + 0.2 * student.expr + 0.6 * student.exam;
if (student.total >= 90) {
student.grade = 'A';
} else if (student.total >= 80) {
student.grade = 'B';
} else if (student.total >= 70) {
student.grade = 'C';
} else if (student.total >= 60) {
student.grade = 'D';
} else {
student.grade = 'F';
}
return student;
}
void saveStudentToFile(Student student) {
FILE *file = fopen("students.txt", "a");
if (file == NULL) {
printf("文件打开错误\n");
return;
}
fprintf(file, "%d %s %s %.2f %.2f %.2f %.2f %c\n", student.no, student.sno, student.sname, student.usual, student.expr, student.exam, student.total, student.grade);
fclose(file);
}
void addStudentInfo() {
printf("请输入要添加的学生信息:\n");
Student student = addStudent();
saveStudentToFile(student);
printf("学生信息添加成功!\n");
}
第三步:实现计算学生信息的功能
void calculateStudentInfo() {
FILE *file = fopen("students.txt", "r");
if (file == NULL) {
printf("文件打开错误\n");
return;
}
float sumTotal = 0;
int count = 0;
char line[100];
while (fgets(line, sizeof(line), file) != NULL) {
Student student;
sscanf(line, "%d %s %s %f %f %f %f %c", &student.no, student.sno, student.sname, &student.usual, &student.expr, &student.exam, &student.total, &student.grade);
sumTotal += student.total;
count++;
}
if (count > 0) {
float averageTotal = sumTotal / count;
printf("所有学生的总分平均值为:%.2f\n", averageTotal);
}
fclose(file);
}
第四步:实现显示学生信息的功能
void displayStudentInfo(Student student) {
printf("编号:%d\n", student.no);
printf("学号:%s\n", student.sno);
printf("姓名:%s\n", student.sname);
printf("平时成绩:%.2f\n", student.usual);
printf("实验成绩:%.2f\n", student.expr);
printf("期末考试成绩:%.2f\n", student.exam);
printf("总分:%.2f\n", student.total);
printf("等级:%c\n", student.grade);
}
void displayAllStudents() {
FILE *file = fopen("students.txt", "r");
if (file == NULL) {
printf("文件打开错误\n");
return;
}
char line[100];
while (fgets(line, sizeof(line), file) != NULL) {
Student student;
sscanf(line, "%d %s %s %f %f %f %f %c", &student.no, student.sno, student.sname, &student.usual, &student.expr, &student.exam, &student.total, &student.grade);
displayStudentInfo(student);
printf("-----------------\n");
}
fclose(file);
}
第五步:实现删除学生信息的功能
void deleteStudentInfo(int no) {
FILE *file = fopen("students.txt", "r");
if (file == NULL) {
printf("文件打开错误\n");
return;
}
FILE *tempFile = fopen("temp.txt", "w");
if (tempFile == NULL) {
printf("文件打开错误\n");
fclose(file);
return;
}
char line[100];
int isFound = 0;
while (fgets(line, sizeof(line), file) != NULL) {
int currentNo;
sscanf(line, "%d", ¤tNo);
if (currentNo != no) {
fputs(line, tempFile);
} else {
isFound = 1;
}
}
fclose(file);
fclose(tempFile);
remove("students.txt");
rename("temp.txt", "students.txt");
if (isFound) {
printf("学生信息删除成功!\n");
} else {
printf("未找到对应的学生信息。\n");
}
}
第六步:实现修改学生信息的功能
void modifyStudentInfo(int no) {
FILE *file = fopen("students.txt", "r");
if (file == NULL) {
printf("文件打开错误\n");
return;
}
FILE *tempFile = fopen("temp.txt", "w");
if (tempFile == NULL) {
printf("文件打开错误\n");
fclose(file);
return;
}
char line[100];
int isFound = 0;
while (fgets(line, sizeof(line), file) != NULL) {
int currentNo;
sscanf(line, "%d", ¤tNo);
if (currentNo != no) {
fputs(line, tempFile);
} else {
Student student = addStudent();
fprintf(tempFile, "%d %s %s %.2f %.2f %.2f %.2f %c\n", student.no, student.sno, student.sname, student.usual, student.expr, student.exam, student.total, student.grade);
isFound = 1;
}
}
fclose(file);
fclose(tempFile);
remove("students.txt");
rename("temp.txt", "students.txt");
if (isFound) {
printf("学生信息修改成功!\n");
} else {
printf("未找到对应的学生信息。\n");
}
}
第七步:实现给不及格的学生发送通知的功能
void sendNotificationToFailedStudents() {
FILE *file = fopen("students.txt", "r");
if (file == NULL) {
printf("文件打开错误\n");
return;
}
char line[100];
while (fgets(line, sizeof(line), file) != NULL) {
Student student;
sscanf(line, "%d %s %s %f %f %f %f %c", &student.no, student.sno, student.sname, &student.usual, &student.expr, &student.exam, &student.total, &student.grade);
if (student.grade == 'F') {
printf("通知:学号为%s的学生%s不及格,请注意补救!\n", student.sno, student.sname);
}
}
fclose(file);
}
以上就是一个基本的实现学生成绩信息统计功能的解决方案。你可以根据自己的需求来扩展其他功能。