使用struct student定义了学生信息的结构体,包括学号(x)、学期(t)、班级©、姓名(n)、数学成绩(math)、英语成绩(english)、计算机成绩(computer)、总成绩(all)、平均成绩(average)等成员变量。
count是全局变量,用于记录学生数量。
文件操作主要是使用FILE*指针和fopen、fclose等函数对文件进行读写。
主函数通过循环提供用户选择不同的功能,包括学生成绩录入、修改、查询、排序和输出等操作。
使用了switch语句根据用户选择调用相应的函数。
new_student函数用于学生信息录入,将学生信息写入文件中。
update_student函数用于修改学生信息,包括选择学生和科目,然后更新相应的成绩。
sreach_student函数用于查询学生信息,包括按学号查询具体信息和输出不及格科目的学生名单。
sort_student函数用于对学生成绩进行排序,并输出排序结果。
output_student函数根据班级查询并输出学生成绩单。
在一些函数中,使用了fopen(“D:\a.txt”, “rb”)来打开文件,其中"rb"表示以二进制只读方式打开文件。需要确保文件存在且格式正确,否则可能导致打开文件失败。
代码中的很多循环都是基于一个固定的数组大小(struct student students[100]),如果实际学生数量超过了数组大小,可能导致数组越界。
用户可以输入学生的学号、学期、班级、姓名、数学成绩、英语成绩和计算机成绩。
程序将学生信息写入文件(“D:\a.txt”)。
用户可以选择要修改的学生学号。
程序会显示该学生的当前信息,用户可以选择要修改的科目(数学、英语、计算机)以及新的成绩。
修改后的信息将更新到文件中。
用户可以选择查询学生信息或不及格科目及学生名单。
如果选择查询学生信息,用户需要输入学号,程序将显示该学生的详细信息。
如果选择查询不及格科目及学生名单,程序将输出不及格科目的学生学号和姓名。
对学生信息进行排序,按平均成绩从高到低的顺序排列。
排序后的学生信息将在控制台上输出。
用户可以输入班级,程序将从文件中读取学生信息,然后输出指定班级的学生成绩单。
提供一个简单的用户界面,用户可以通过输入数字选择不同的操作。
通过循环,用户可以一直执行操作直到选择退出(输入0)。
使用文件存储学生信息,通过文件读写实现信息的永久性保存和持久化。
struct student {
long int x, math, computer, english, all;
long int average;
char n[30], t[20], c[30];
};
struct student 结构体包含了学生的各种信息,包括学号(x)、数学成绩(math)、英语成绩(english)、计算机成绩(computer)、总成绩(all)、平均成绩(average)、姓名(n)、学期(t)和班级(c)等。
在主函数中,创建了一个结构体数组 struct student students[100],用于存储多个学生的信息。数组的大小为100,限制了学生数量。
学生信息以一定的格式存储在文件中(“D:\a.txt”)。每个学生的信息占据一行,各字段之间使用空格分隔。
数据存储格式为:
学号 学期 班级 姓名 英语成绩 数学成绩 计算机成绩 总成绩 平均成绩 计数
int count 是一个全局变量,用于记录学生数量。在代码中,它被用来记录学生信息的总数,但在一些函数中可能没有很好地维护其一致性。
在文件读取的部分,存在一个潜在的数组越界问题。由于使用了固定大小的数组,如果实际学生数量超过数组大小,可能导致访问越界,因此需要谨慎处理。
排序功能使用了冒泡排序算法,对学生信息按平均成绩降序排序。这种简单的排序算法对于小规模的数据可能是足够的,但对于大规模数据可能效率较低。
通过 fscanf 和 fprintf 函数,将结构体数组中的数据与文件之间进行读写操作。
在修改学生信息时,通过对结构体数组中的数据进行修改,再将整个数组重新写回文件的方式来实现信息的更新。
字符串(如姓名、学期、班级)使用字符数组来表示。需要注意在输入和输出时对字符串的处理,以防止缓冲区溢出等问题。
#include
#include
#include
struct student {
long int x, math, computer, english, all;
long int average;
char n[30], t[20], c[30];
};
int count = 0;
void new_student(struct student students[]);
void update_student(struct student students[]);
void sreach_student(struct student students[]);
void sort_student(struct student students[]);
void output_student(struct student students[]);
int main(void) {
printf("*************学生成绩管理系统*************\n");
printf("\t1--学生成绩录入 \t2--学生成绩修改\n\t3--学生成绩查询 \t4--学生成绩排序\n\t5--学生成绩单输出 \t0--退出\n");
printf("******************************************\n");
int i = 1;
struct student students[100];
while (i != 0) {
printf("请选择(0--5):");
scanf("%d", &i);
switch (i) {
case 1:
printf("您选择的是信息录入!\n");
new_student(students);
break;
case 2:
printf("您选择的是信息修改!\n");
update_student(students);
break;
case 3:
printf("您选择的是信息查询!\n");
sreach_student(students);
break;
case 4:
printf("您选择的是信息排序!\n");
sort_student(students);
break;
case 5:
printf("您选择的是成绩单输出!\n");
output_student(students);
break;
}
}
return 0;
}
void new_student(struct student students[]) {
struct student a;
int num, n;
FILE* fp;
if ((fp = fopen("D:\\a.txt", "w")) == NULL) {
printf("File open error!\n");
exit(0);
}
printf("请输入您要录入的学生个数:");
scanf("%d", &n);
for (num = 0; num < n; num++) {
printf("学号:");
scanf("%ld", &a.x);
printf("学期:");
scanf("%s", a.t);
printf("班级:");
scanf("%s", a.c);
printf("姓名:");
scanf("%s", a.n);
printf("英语成绩:");
scanf("%ld", &a.english);
printf("数学成绩:");
scanf("%ld", &a.math);
printf("计算机成绩:");
scanf("%ld", &a.computer);
a.all = a.computer + a.english + a.math;
a.average = a.all / 3;
printf("总成绩:%ld\n", a.all);
printf("平均成绩:%ld\n", a.average);
count++;
fprintf(fp, "%ld %s %s %s %ld %ld %ld %ld %ld %d \n", a.x, a.t, a.c, a.n, a.english, a.math, a.computer, a.all, a.average, count);
}
fclose(fp);
}
void sreach_student(struct student students[]) {
int i, flag = 0, k;
long int x;
FILE* fp;
if ((fp = fopen("D:\\a.txt", "rb")) == NULL) {
printf("File open error!\n");
exit(0);
}
for (i = 0; i < 100; i++) {
fscanf(fp, "%ld %s %s %s %ld %ld %ld %ld %ld %d ", &students[i].x, &students[i].t, &students[i].c, &students[i].n, &students[i].math, &students[i].english, &students[i].computer, &students[i].all, &students[i].average, &count);
}
printf("请输入您要查询的内容:\n 1-学生成绩 2-不及格科目及学生名单\n");
scanf("%d", &k);
switch (k) {
case 1: {
printf("请输入学生学号:");
scanf("%ld", &x);
for (i = 0; i < count; i++) {
if (students[i].x == x) {
flag = 1;
}
if (flag) {
printf("学号:%ld\n", students[i].x);
printf("学期:%s\n", students[i].t);
printf("班级:%s\n", students[i].c);
printf("姓名:%s\n", students[i].n);
printf("数学成绩:%ld\n", students[i].math);
printf("英语成绩:%ld\n", students[i].english);
printf("计算机成绩:%ld\n", students[i].computer);
printf("总成绩:%ld\n", students[i].all);
printf("平均成绩:%ld\n", students[i].average);
break;
}
}
if (flag == 0)
printf("Not Found");
break;
}
case 2: {
for (i = 0; i < count; i++) {
if (students[i].computer < 60 || students[i].english < 60 || students[i].math < 60)
printf("%ld %s", students[i].x, students[i].n);
printf("该学生不及格的科目有:\n");
if (students[i].computer < 60)
printf("计算机 \n");
if (students[i].english < 60)
printf("英语 \n");
if (students[i].math < 60)
printf("数学 \n");
}
}
break;
}
if (fclose(fp)) {
printf("Can't close the file\n");
exit(0);
}
}
void update_student(struct student students[]) {
int i, flag = 0, k;
long int score, m;
FILE* fp;
if ((fp = fopen("D:\\a.txt", "rb")) == NULL) {
printf("File open error!\n");
exit(0);
}
printf("请输入您所要修改信息的学生学号:");
scanf("%ld", &m);
for (i = 0; i < 100; i++) {
fscanf(fp, "%ld %s %s %s %ld %ld %ld %ld %ld %d ", &students[i].x, &students[i].t, &students[i].c, &students[i].n, &students[i].math, &students[i].english, &students[i].computer, &students[i].all, &students[i].average, &count);
}
for (i = 0; i < 100; i++) {
if (m == students[i].x) {
printf("学号:%ld\n", students[i].x);
printf("学期:%s\n", students[i].t);
printf("班级:%s\n", students[i].c);
printf("姓名:%s\n", students[i].n);
printf("数学成绩:%ld\n", students[i].math);
printf("英语成绩:%ld\n", students[i].english);
printf("计算机成绩:%ld\n", students[i].computer);
printf("总成绩:%ld\n", students[i].all);
printf("平均成绩:%ld\n", students[i].average);
printf("请选择您要修改的科目: 1-数学 2-英语 3-计算机");
scanf("%d", &k);
printf("该科目的成绩:");
scanf("%ld", &score);
switch (k) {
case 1:
students[i].math = score;
break;
case 2:
students[i].english = score;
break;
case 3:
students[i].computer = score;
break;
default:
printf("无效的选择\n");
}
students[i].all = students[i].math + students[i].english + students[i].computer;
students[i].average = students[i].all / 3;
break;
}
}
if (fclose(fp)) {
printf("Can't close the file\n");
exit(0);
}
if ((fp = fopen("D:\\a.txt", "w")) == NULL)
fclose(fp);
if ((fp = fopen("D:\\a.txt", "a")) == NULL) {
printf("File open error!\n");
exit(0);
}
for (i = 0; i < count; i++)
fprintf(fp, "%ld %s %s %s %ld %ld %ld %ld %ld %d ", students[i].x, students[i].t, students[i].c, students[i].n, students[i].math, students[i].english, students[i].computer, students[i].all, students[i].average, count);
if (fclose(fp)) {
printf("Can't close the file\n");
exit(0);
}
}
void sort_student(struct student students[]) {
struct student p;
int i, m, n;
FILE* fp;
if ((fp = fopen("D:\\a.txt", "rb")) == NULL) {
printf("File open error!\n");
exit(0);
}
for (i = 0; i < 100; i++) {
fscanf(fp, "%ld %s %s %s %ld %ld %ld %ld %ld %d ", &students[i].x, &students[i].t, &students[i].c, &students[i].n, &students[i].math, &students[i].english, &students[i].computer, &students[i].all, &students[i].average, &count);
}
for (m = 1; m < i; m++)
for (n = 0; n < i - 1; n++)
if (students[n].average < students[n + 1].average) {
p = students[n];
students[n] = students[n + 1];
students[n + 1] = p;
}
printf("排序如下:\n");
for (i = 0; i < count; i++)
printf("%ld %s %s %s %ld %ld\n", students[i].x, students[i].t, students[i].c, students[i].n, students[i].all, students[i].average);
if (fclose(fp)) {
printf("Can't close the file\n");
exit(0);
}
}
void output_student(struct student students[]) {
char ch[30];
int i;
printf("请输入您要输出的班级:");
scanf("%s", ch);
FILE* fp;
if ((fp = fopen("D:\\a.txt", "rb")) == NULL) {
printf("File open error!\n");
exit(0);
}
for (i = 0; i < 100; i++) {
fscanf(fp, "%ld %s %s %s %ld %ld %ld %ld %ld %d ", &students[i].x, &students[i].t, &students[i].c, &students[i].n, &students[i].math, &students[i].english, &students[i].computer, &students[i].all, &students[i].average, &count);
if (strcmp(students[i].c, ch) == 0)
printf("%ld %s %s %s %ld %ld %ld %ld %ld\n", students[i].x, students[i].t, students[i].c, students[i].n, students[i].math, students[i].english, students[i].computer, students[i].all, students[i].average);
}
if (fclose(fp)) {
printf("Can't close the file\n");
exit(0);
}
}