用c语言写一学籍体统,主要功能: 欢迎及菜单页面 通过文本文件读入学生信息 新增学生(学号不可重复) 录入成绩 删除学生 展示所有学生信息 计算最高最低平均成绩 统计ABCD每个分段的人数 按成绩从高到低排序 按学号排序 退出前将所有学生信息回写进文本文档个学籍系统
时间: 2024-05-01 19:22:37 浏览: 93
好的,以下是用C语言实现学籍系统的代码。请注意,由于本示例是基于文本文件读写,因此在使用时需要根据实际情况修改文件路径。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct {
char id[20]; // 学号
char name[50]; // 姓名
int score[5]; // 成绩,包括语文、数学、英语、物理、化学
} student;
// 定义全局变量
student stu[100]; // 最多存储100个学生信息
int count = 0; // 学生数量
// 函数声明
void welcome(); // 欢迎页面
void menu(); // 菜单页面
void readFromFile(); // 从文件读入学生信息
void addStudent(); // 新增学生
void inputScore(int index); // 录入成绩
void deleteStudent(); // 删除学生
void showAll(); // 展示所有学生信息
void calculateScore(); // 计算最高最低平均成绩
void countScore(); // 统计ABCD每个分段的人数
void sortScore(); // 按成绩从高到低排序
void sortId(); // 按学号排序
void writeToFile(); // 将所有学生信息回写进文本文档
int getRank(int index); // 获取学生排名
int main() {
readFromFile(); // 从文件读入学生信息
welcome(); // 欢迎页面
menu(); // 菜单页面
writeToFile(); // 将所有学生信息回写进文本文档
return 0;
}
void welcome() {
printf("欢迎使用学籍系统!\n\n");
}
void menu() {
int choice;
printf("请选择要执行的操作:\n");
printf("1. 新增学生\n");
printf("2. 录入成绩\n");
printf("3. 删除学生\n");
printf("4. 展示所有学生信息\n");
printf("5. 计算最高最低平均成绩\n");
printf("6. 统计ABCD每个分段的人数\n");
printf("7. 按成绩从高到低排序\n");
printf("8. 按学号排序\n");
printf("9. 退出程序\n");
scanf("%d", &choice);
switch (choice) {
case 1:
addStudent();
break;
case 2: {
int index;
printf("请输入要录入成绩的学生的序号:\n");
scanf("%d", &index);
inputScore(index);
break;
}
case 3:
deleteStudent();
break;
case 4:
showAll();
break;
case 5:
calculateScore();
break;
case 6:
countScore();
break;
case 7:
sortScore();
break;
case 8:
sortId();
break;
case 9:
printf("感谢使用学籍系统!\n");
return;
default:
printf("输入的选项不正确,请重新输入!\n");
break;
}
menu();
}
void readFromFile() {
FILE *fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("文件读取失败!\n");
return;
}
while (!feof(fp)) {
fscanf(fp, "%s %s %d %d %d %d %d\n", stu[count].id, stu[count].name,
&stu[count].score[0], &stu[count].score[1], &stu[count].score[2],
&stu[count].score[3], &stu[count].score[4]);
count++;
}
fclose(fp);
}
void addStudent() {
printf("请输入学生的学号、姓名:\n");
scanf("%s %s", stu[count].id, stu[count].name);
// 判断学号是否重复
for (int i = 0; i < count; i++) {
if (strcmp(stu[i].id, stu[count].id) == 0) {
printf("学号已存在,请重新输入!\n");
return;
}
}
count++;
printf("新增学生成功!\n");
}
void inputScore(int index) {
if (index < 1 || index > count) {
printf("输入的序号不正确,请重新输入!\n");
return;
}
printf("请输入语文、数学、英语、物理、化学成绩:\n");
scanf("%d %d %d %d %d", &stu[index-1].score[0], &stu[index-1].score[1],
&stu[index-1].score[2], &stu[index-1].score[3], &stu[index-1].score[4]);
printf("成绩录入成功!\n");
}
void deleteStudent() {
char id[20];
printf("请输入要删除的学生的学号:\n");
scanf("%s", id);
for (int i = 0; i < count; i++) {
if (strcmp(stu[i].id, id) == 0) {
// 将该学生信息从数组中删除
for (int j = i; j < count-1; j++) {
stu[j] = stu[j+1];
}
count--;
printf("删除成功!\n");
return;
}
}
printf("未找到该学生!\n");
}
void showAll() {
printf("序号\t学号\t姓名\t语文\t数学\t英语\t物理\t化学\t总分\t排名\n");
for (int i = 0; i < count; i++) {
int sum = 0;
for (int j = 0; j < 5; j++) {
sum += stu[i].score[j];
}
printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n", i+1, stu[i].id, stu[i].name,
stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3], stu[i].score[4],
sum, getRank(i));
}
}
void calculateScore() {
int max[5] = {0}, min[5] = {100}, sum[5] = {0};
for (int i = 0; i < count; i++) {
for (int j = 0; j < 5; j++) {
if (stu[i].score[j] > max[j]) {
max[j] = stu[i].score[j];
}
if (stu[i].score[j] < min[j]) {
min[j] = stu[i].score[j];
}
sum[j] += stu[i].score[j];
}
}
printf("语文:最高分%d,最低分%d,平均分%.2f\n", max[0], min[0], sum[0]*1.0/count);
printf("数学:最高分%d,最低分%d,平均分%.2f\n", max[1], min[1], sum[1]*1.0/count);
printf("英语:最高分%d,最低分%d,平均分%.2f\n", max[2], min[2], sum[2]*1.0/count);
printf("物理:最高分%d,最低分%d,平均分%.2f\n", max[3], min[3], sum[3]*1.0/count);
printf("化学:最高分%d,最低分%d,平均分%.2f\n", max[4], min[4], sum[4]*1.0/count);
}
void countScore() {
int countA = 0, countB = 0, countC = 0, countD = 0;
for (int i = 0; i < count; i++) {
int sum = 0;
for (int j = 0; j < 5; j++) {
sum += stu[i].score[j];
}
double avg = sum * 1.0 / 5;
if (avg >= 90) {
countA++;
} else if (avg >= 80) {
countB++;
} else if (avg >= 70) {
countC++;
} else {
countD++;
}
}
printf("A段(90分及以上):%d人\n", countA);
printf("B段(80-89分):%d人\n", countB);
printf("C段(70-79分):%d人\n", countC);
printf("D段(70分以下):%d人\n", countD);
}
void sortScore() {
// 冒泡排序
for (int i = 0; i < count-1; i++) {
for (int j = 0; j < count-i-1; j++) {
int sum1 = 0, sum2 = 0;
for (int k = 0; k < 5; k++) {
sum1 += stu[j].score[k];
sum2 += stu[j+1].score[k];
}
if (sum1 < sum2) {
student temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
}
}
printf("按成绩从高到低排序成功!\n");
}
void sortId() {
// 冒泡排序
for (int i = 0; i < count-1; i++) {
for (int j = 0; j < count-i-1; j++) {
if (strcmp(stu[j].id, stu[j+1].id) > 0) {
student temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
}
}
printf("按学号排序成功!\n");
}
void writeToFile() {
FILE *fp = fopen("students.txt", "w");
if (fp == NULL) {
printf("文件写入失败!\n");
return;
}
for (int i = 0; i < count; i++) {
fprintf(fp, "%s %s %d %d %d %d %d\n", stu[i].id, stu[i].name,
stu[i].score[0], stu[i].score[1], stu[i].score[2],
stu[i].score[3], stu[i].score[4]);
}
fclose(fp);
}
int getRank(int index) {
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += stu[index].score[i];
}
int rank = 1;
for (int i = 0; i < count; i++) {
if (i == index) {
continue;
}
int temp = 0;
for (int j = 0; j < 5; j++) {
temp += stu[i].score[j];
}
if (temp > sum) {
rank++;
}
}
return rank;
}
```
希望这份代码能够帮助到你。
阅读全文