From b42a73dc71147629819764f922c691108e7e519d Mon Sep 17 00:00:00 2001 From: pq52sx6n8 <2731407373@qq.com> Date: Wed, 21 May 2025 23:40:24 +0800 Subject: [PATCH] =?UTF-8?q?Add=20=E5=AD=A6=E7=94=9F=E6=88=90=E7=BB=A9?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=B3=BB=E7=BB=9F=E4=BF=AE=E6=94=B91?= =?UTF-8?q?=EF=BC=8C=E5=8A=A0=E5=85=A5=E4=BA=86=E5=86=99=E5=85=A5=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BD=86=E4=BC=9A?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E4=B8=AD=E6=96=87=E4=B9=B1=E7=A0=81=E7=9A=84?= =?UTF-8?q?=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 学生成绩管理系统修改1 | 301 ++++++++++++++++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 学生成绩管理系统修改1 diff --git a/学生成绩管理系统修改1 b/学生成绩管理系统修改1 new file mode 100644 index 0000000..8b8ed40 --- /dev/null +++ b/学生成绩管理系统修改1 @@ -0,0 +1,301 @@ +#include +#include +#include + +typedef struct { + int rank; // 排名序号 + char num[20]; // 学号 + char name[10]; // 姓名 + int math_score; // 高数成绩 + int datastruct_score; // 数据结构成绩 + int English_score; // 英语成绩 + int physics_score; // 物理成绩 + float average; // 平均分 +} Student; + +typedef struct { + Student *data; + int length; +} funlist; + +// 初始化线性表 +void initlist(funlist *l) { + l->data = (Student *)malloc(100 * sizeof(Student)); + l->length = 0; +} + +// 判断是否为空表 +int isempty(funlist *l) { + return l->length == 0; +} + +// 取值 +int getelem(funlist l, int i, Student *e) { + if (i < 1 || i > l.length) { + printf("位置不合法\n"); + return 0; + } + *e = l.data[i - 1]; + return 1; +} + +// 计算平均分 +float calculate_average(Student *s) { + return (s->math_score + s->datastruct_score + s->English_score + s->physics_score) / 4.0f; +} + +// 打印操作(无排名) +void printlist_no_rank(funlist l) { + int i; + printf("成绩表为:\n"); + for (i = 0; i < l.length; i++) { + printf("学号:%s 姓名:%s 高数:%d 数据结构:%d 英语:%d 物理:%d 平均分:%.2f\n", + l.data[i].num, l.data[i].name, l.data[i].math_score, + l.data[i].datastruct_score, l.data[i].English_score, + l.data[i].physics_score, l.data[i].average); + } +} + +// 打印操作(带排名) +void printlist_with_rank(funlist l) { + int i; + printf("成绩表为:\n"); + for (i = 0; i < l.length; i++) { + printf("排名:%d 学号:%s 姓名:%s 高数:%d 数据结构:%d 英语:%d 物理:%d 平均分:%.2f\n", + l.data[i].rank, l.data[i].num, l.data[i].name, l.data[i].math_score, + l.data[i].datastruct_score, l.data[i].English_score, + l.data[i].physics_score, l.data[i].average); + } +} + +// 查找操作(按学号查找) +int locateelem1(funlist l, char *num) { + int i; + for (i = 0; i < l.length; i++) { + if (strcmp(l.data[i].num, num) == 0) + return i + 1; + } + return -1; +} + +// 查找操作(按姓名查找) +int locateelem2(funlist l, char *name) { + int i; + for (i = 0; i < l.length; i++) { + if (strcmp(l.data[i].name, name) == 0) + return i + 1; + } + return -1; +} + +// 删除操作 +int deleteelem(funlist *l, int i) { + int j; + if (i < 1 || i > l->length) { + printf("位置不合法\n"); + return 0; + } + for (j = i; j < l->length; j++) { + l->data[j - 1] = l->data[j]; + } + l->length--; + // 重新调整排名 + for (j = i - 1; j < l->length; j++) { + l->data[j].rank = j + 1; + } + return 1; +} + +// 插入操作 +int listinsert(funlist *l, int i, Student e) { + if (i < 1 || i > l->length + 1) { + printf("位置不合法\n"); + return 0; + } + if (l->length >= 100) { + printf("线性表已满\n"); + return 0; + } + int j; + for (j = l->length - 1; j >= i - 1; j--) { + l->data[j + 1] = l->data[j]; + // 向后移动排名 + l->data[j + 1].rank = l->data[j].rank + 1; + } + // 计算并保存平均分 + e.average = calculate_average(&e); + e.rank = i; + l->data[i - 1] = e; + l->length++; + return 1; // 返回1表示成功 +} + +// 按平均分排序 +void sort_by_average(funlist *l) { + if (l->length <= 1) return; // 无需排序 + + int i, j; + for (i = 0; i < l->length - 1; i++) { + for (j = 0; j < l->length - i - 1; j++) { + if (l->data[j].average < l->data[j + 1].average) { + Student temp = l->data[j]; + l->data[j] = l->data[j + 1]; + l->data[j + 1] = temp; + } + } + } + // 更新排名 + for (i = 0; i < l->length; i++) { + l->data[i].rank = i + 1; + } + printf("学生已按平均分降序排列\n"); +} + +// 将数据写入文件 +void write_to_file(funlist l, const char *filename) { + FILE *file = fopen(filename, "a"); + if (file == NULL) { + printf("无法打开文件\n"); + return; + } + + for (int i = 0; i < l.length; i++) { + fprintf(file, "排名:%d 学号:%s 姓名:%s 高数:%d 数据结构:%d 英语:%d 物理:%d 平均分:%.2f\n", + l.data[i].rank, l.data[i].num, l.data[i].name, l.data[i].math_score, + l.data[i].datastruct_score, l.data[i].English_score, + l.data[i].physics_score, l.data[i].average); + } + + fclose(file); + printf("数据已成功写入文件 %s\n", filename); +} + + +int main() { + funlist L; + initlist(&L); + + int choice; + char num[20]; + char name[10]; + int math_score; + int datastruct_score; + int English_score; + int physics_score; + int i; + + printf("1.插入学生\n"); + printf("2.通过学号查询学生\n"); + printf("3.通过姓名查询学生\n"); + printf("4.删除学生\n"); + printf("5.按平均分排序学生\n"); + printf("6.退出\n"); + + while (1) { + printf("请输入操作选项:"); + scanf("%d", &choice); + switch (choice) { + case 1: { + Student e; + printf("请输入姓名:"); + scanf("%s", name); + strcpy(e.name, name); + + printf("请输入学号:"); + scanf("%s", num); + strcpy(e.num, num); + + printf("请输入高数成绩:"); + scanf("%d", &math_score); + e.math_score = math_score; + + printf("请输入数据结构成绩:"); + scanf("%d", &datastruct_score); + e.datastruct_score = datastruct_score; + + printf("请输入英语成绩:"); + scanf("%d", &English_score); + e.English_score = English_score; + + printf("请输入物理成绩:"); + scanf("%d", &physics_score); + e.physics_score = physics_score; + + printf("请输入想插入的位置(1-%d):\n", L.length + 1); + scanf("%d", &i); + + if (listinsert(&L, i, e)) { + printf("插入成功\n"); + } else { + printf("插入失败\n"); + } + printlist_no_rank(L); + printf("\n"); + break; + } + + case 2: { + printf("输入想查找的学生学号:"); + scanf("%s", num); + i = locateelem1(L, num); + if (i != -1) { + Student e; + getelem(L, i, &e); + printf("找到学生: 学号:%s 姓名:%s 平均分:%.2f\n", + e.num, e.name, e.average); + } else { + printf("未找到学号为%s的学生\n", num); + } + printf("\n"); + break; + } + + case 3: { + printf("输入想查找的学生姓名:"); + scanf("%s", name); + i = locateelem2(L, name); + if (i != -1) { + Student e; + getelem(L, i, &e); + printf("找到学生: 学号:%s 姓名:%s 平均分:%.2f\n", + e.num, e.name, e.average); + } else { + printf("未找到姓名为%s的学生\n", name); + } + printf("\n"); + break; + } + + case 4: { + printf("输入想删除的学生位置:"); + scanf("%d", &i); + if (deleteelem(&L, i)) { + printf("删除成功\n"); + } else { + printf("删除失败\n"); + } + printlist_no_rank(L); + printf("\n"); + break; + } + + case 5: { + sort_by_average(&L); + printlist_with_rank(L); + printf("\n"); + break; + } + + case 6: { + write_to_file(L, "Z:\\C语言\\数据结构\\学生成绩信息.txt"); // 写入文件 + printf("退出系统\n"); + free(L.data); + return 0; + } + default: + printf("无效选项,请重新输入\n"); + } + } + + return 0; +} \ No newline at end of file