一、项目简介
学生信息管理系统是一个基于C语言实现的小型控制台应用程序。通过该程序,管理员可以添加、删除、修改、查询学生信息,还可以对学生成绩数据进行统计分析。
二、代码剖析
1. 主体函数:main()
int main() {
int choice;
while (1) {
menu();
scanf("%d", &choice);
switch (choice) {
case 1:
add();
break;
case 2:
del();
break;
case 3:
update();
break;
case 4:
search();
break;
case 5:
stat();
break;
case 0:
exit(0);
break;
default:
printf("\n请输入正确的选项!\n");
}
putchar('\n');
}
return 0;
}
主要是提供一个交互式界面,提供菜单选项供管理员进行学生信息管理操作,每次操作后可以继续进行下次操作。
2. 菜单函数:menu()
void menu() {
printf("**************************************\n");
printf("********** 1. 新增学生信息 ***********\n");
printf("********** 2. 删除学生信息 ***********\n");
printf("********** 3. 修改学生信息 ***********\n");
printf("********** 4. 查询学生信息 ***********\n");
printf("********** 5. 统计分析 **************\n");
printf("********** 0. 退出管理系统 ***********\n");
printf("**************************************\n");
printf("请输入您的选项(0 ~ 5):");
}
显示一个简单的菜单界面,供管理员选择学生信息管理操作。
3. 新增函数:add()
void add() {
int num;
char name[10];
float score1, score2, score3;
struct student *p, *tail;
FILE *fp = fopen("stu.dat", "a+");
printf("\n请输入学生学号:");
scanf("%d", &num);
while (1) {
p = head;
while (p != NULL) {
if (p->num == num) {
printf("\n该学号已存在,请重新输入学号:");
scanf("%d", &num);
break;
} else {
p = p->next;
}
}
if (p == NULL) {
break;
}
}
printf("请输入学生姓名:");
scanf("%s", name);
printf("请输入学生三门课程的成绩:\n");
printf("高数:");
scanf("%f", &score1);
printf("英语:");
scanf("%f", &score2);
printf("C语言编程:");
scanf("%f", &score3);
p = (struct student *) malloc(sizeof(struct student));
p->num = num;
strcpy(p->name, name);
p->score[0] = score1;
p->score[1] = score2;
p->score[2] = score3;
p->aver = (score1 + score2 + score3) / 3.0;
p->next = NULL;
if (head == NULL) {
head = p;
} else {
tail = head;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = p;
}
fwrite(p, sizeof(struct student), 1, fp);
fclose(fp);
printf("\n学生[%d|%s]添加成功!\n", p->num, p->name);
}
管理员输入学生基本信息和成绩信息,系统自动生成平均分。将学生信息以二进制形式写入文件中,同时将学生信息添加到链表中。
4. 删除函数:del()
void del() {
int num;
struct student *p, *prev;
FILE *fp1 = fopen("stu.dat", "r");
FILE *fp2 = fopen("tmp.dat", "w");
printf("\n请输入要删除的学生学号:");
scanf("%d", &num);
p = head;
prev = NULL;
while (p != NULL) {
if (p->num == num) {
if (p == head) {
head = p->next;
} else {
prev->next = p->next;
}
printf("\n学生[%d|%s]删除成功!\n", p->num, p->name);
free(p);
writeToFile(fp1, fp2);
fclose(fp1);
fclose(fp2);
remove("stu.dat");
rename("tmp.dat", "stu.dat");
return;
} else {
prev = p;
p = p->next;
}
}
printf("\n没有找到要删除的学生!\n");
fclose(fp1);
fclose(fp2);
remove("tmp.dat");
}
管理员输入要删除的学生学号,程序在链表中查找学号,找到则删除该学生在链表中的节点,并将链表中的数据覆盖写入到临时文件中。最后将临时文件覆盖原始文件实现删除。
5. 修改函数:update()
void update() {
int num;
struct student *p;
FILE *fp1 = fopen("stu.dat", "r");
FILE *fp2 = fopen("tmp.dat", "w");
printf("\n请输入要修改的学生学号:");
scanf("%d", &num);
p = head;
while (p != NULL) {
if (p->num == num) {
printf("请输入新的姓名:");
scanf("%s", p->name);
printf("请输入新的高数成绩:");
scanf("%f", &p->score[0]);
printf("请输入新的英语成绩:");
scanf("%f", &p->score[1]);
printf("请输入新的C语言编程成绩:");
scanf("%f", &p->score[2]);
p->aver = (p->score[0] + p->score[1] + p->score[2]) / 3.0;
printf("\n学生[%d|%s]修改成功!\n", p->num, p->name);
writeToFile(fp1, fp2);
fclose(fp1);
fclose(fp2);
remove("stu.dat");
rename("tmp.dat", "stu.dat");
return;
} else {
p = p->next;
}
}
printf("\n没有找到要修改的学生!\n");
fclose(fp1);
fclose(fp2);
remove("tmp.dat");
}
管理员输入要修改的学生学号,程序在链表中查找学号,找到后修改学生姓名和3个科目成绩,更新该学生平均分,并将链表中的数据覆盖写入到临时文件中。最后将临时文件覆盖原始文件实现更新。
6. 查询函数:search()
void search() {
int num;
struct student *p;
FILE *fp = fopen("stu.dat", "r");
printf("\n请输入要查询的学生学号:");
scanf("%d", &num);
p = head;
while (p != NULL) {
if (p->num == num) {
printf("\n学生[%d|%s]\n", p->num, p->name);
printf("高数成绩:%.2f\n", p->score[0]);
printf("英语成绩:%.2f\n", p->score[1]);
printf("C语言编程成绩:%.2f\n", p->score[2]);
printf("平均分:%.2f\n", p->aver);
fclose(fp);
return;
} else {
p = p->next;
}
}
printf("\n没有找到要查询的学生!\n");
fclose(fp);
}
管理员输入要查询学生的学号,程序在链表中查找学号,找到后输出该学生的学号、姓名、3个科目成绩和平均分。
7. 统计函数:stat()
void stat() {
int n = 0, sum1 = 0, sum2 = 0, sum3 = 0;
float aver1, aver2, aver3;
struct student *p = head;
FILE *fp = fopen("stu.dat", "r");
while (p != NULL) {
n++;
sum1 += p->score[0];
sum2 += p->score[1];
sum3 += p->score[2];
p = p->next;
}
aver1 = (float) sum1 / n;
aver2 = (float) sum2 / n;
aver3 = (float) sum3 / n;
printf("\n[统计信息]\n");
printf("共有%d名学生\n", n);
printf("高数平均分:%.2f\n", aver1);
printf("英语平均分:%.2f\n", aver2);
printf("C语言编程平均分:%.2f\n", aver3);
fclose(fp);
}
程序对所有学生的高数、英语、C语言编程成绩进行统计计算,并输出各科目平均分。
三、总结
学生信息管理系统是一个综合性高强度的应用程序,管理员通过该程序可以在控制台进行学生信息管理的增删改查和统计等操作,该项目以C语言为编程语言,可以在Windows、Linux、macOS等平台上运行。以上是对该项目的详细剖析和代码解释。