/把学生信息存放在txt文件中,读取数据,数据//放在单链表中。 //要求可以通过ID查询某学生的各科成绩和总分及//平均分。 //可以通过ID查询某科成绩排名//可以通过ID查询总分排名。//成绩一样的排名一样。具体代码加注释是什么
时间: 2023-04-03 11:01:11 浏览: 122
C++从文本文件读取数据到vector中的方法
5星 · 资源好评率100%
您好,以下是针对您的问题的代码和注释:
// 包含所需的头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct student {
char id[10]; // 学号
char name[20]; // 姓名
float score[3]; // 三门课程成绩
float totalScore; // 总分
float avgScore; // 平均分
struct student *next; // 指向下一个学生的指针
} Student;
// 定义全局变量,指向链表头
Student *head = NULL;
// 函数声明
void readFromFile(); // 从文件中读取学生信息
void printStudent(Student *s); // 打印学生信息
void printAllStudents(); // 打印所有学生信息
void searchByID(); // 根据学号查询学生信息
void searchBySubject(); // 根据学号和科目查询成绩排名
void searchByTotalScore(); // 根据学号查询总分排名
int main() {
readFromFile(); // 从文件中读取学生信息
printAllStudents(); // 打印所有学生信息
searchByID(); // 根据学号查询学生信息
searchBySubject(); // 根据学号和科目查询成绩排名
searchByTotalScore(); // 根据学号查询总分排名
return ;
}
// 从文件中读取学生信息
void readFromFile() {
FILE *fp = fopen("students.txt", "r"); // 打开文件
if (fp == NULL) { // 判断文件是否打开成功
printf("文件打开失败!\n");
exit(1);
}
char buf[100]; // 用于存放读取的每行数据
while (fgets(buf, 100, fp) != NULL) { // 逐行读取文件内容
Student *s = (Student *)malloc(sizeof(Student)); // 创建新的学生结构体
sscanf(buf, "%s %s %f %f %f", s->id, s->name, &s->score[], &s->score[1], &s->score[2]); // 解析每行数据
s->totalScore = s->score[] + s->score[1] + s->score[2]; // 计算总分
s->avgScore = s->totalScore / 3; // 计算平均分
s->next = head; // 将新的学生结构体插入链表头部
head = s;
}
fclose(fp); // 关闭文件
}
// 打印学生信息
void printStudent(Student *s) {
printf("学号:%s,姓名:%s,语文成绩:%.1f,数学成绩:%.1f,英语成绩:%.1f,总分:%.1f,平均分:%.1f\n", s->id, s->name, s->score[], s->score[1], s->score[2], s->totalScore, s->avgScore);
}
// 打印所有学生信息
void printAllStudents() {
printf("所有学生信息如下:\n");
Student *p = head;
while (p != NULL) {
printStudent(p);
p = p->next;
}
}
// 根据学号查询学生信息
void searchByID() {
char id[10];
printf("请输入要查询的学生学号:");
scanf("%s", id);
Student *p = head;
while (p != NULL) {
if (strcmp(p->id, id) == ) { // 判断学号是否匹配
printf("查询结果如下:\n");
printStudent(p);
return;
}
p = p->next;
}
printf("未找到该学生!\n");
}
// 根据学号和科目查询成绩排名
void searchBySubject() {
char id[10];
int subject;
printf("请输入要查询的学生学号和科目(1代表语文,2代表数学,3代表英语):");
scanf("%s %d", id, &subject);
Student *p = head;
float score = ;
while (p != NULL) {
if (strcmp(p->id, id) == ) { // 判断学号是否匹配
score = p->score[subject - 1]; // 获取对应科目的成绩
break;
}
p = p->next;
}
if (p == NULL) { // 如果未找到该学生
printf("未找到该学生!\n");
return;
}
int rank = 1;
p = head;
while (p != NULL) {
if (p->score[subject - 1] > score) { // 判断成绩是否高于当前学生
rank++;
}
p = p->next;
}
printf("查询结果如下:\n");
printf("学号为%s的学生在第%d名\n", id, rank);
}
// 根据学号查询总分排名
void searchByTotalScore() {
char id[10];
printf("请输入要查询的学生学号:");
scanf("%s", id);
Student *p = head;
float totalScore = ;
while (p != NULL) {
if (strcmp(p->id, id) == ) { // 判断学号是否匹配
totalScore = p->totalScore; // 获取总分
break;
}
p = p->next;
}
if (p == NULL) { // 如果未找到该学生
printf("未找到该学生!\n");
return;
}
int rank = 1;
p = head;
while (p != NULL) {
if (p->totalScore > totalScore) { // 判断总分是否高于当前学生
rank++;
}
p = p->next;
}
printf("查询结果如下:\n");
printf("学号为%s的学生在第%d名\n", id, rank);
}
阅读全文