#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 学生信息结构体
struct Student
{// 学号long stuid;// 姓名char stuname[20];
};// 作业信息结构体
struct Homework
{// 作业编号long worksno;// 作业内容char workdata[100];// 作业成绩指针// struct list_node *p;
};// 作业成绩单链表
struct list_node
{//数据域,用于存储数据// 学号long stuid;// 作业编号long worksno;// 作业成绩float grade;//指针,可以用来访问节点数据,也可以遍历,指向下一个节点struct list_node *next;
};// 作业成绩结构体
struct Grade
{// 学号long stuid;// 作业编号long worksno;// 作业成绩float grade;
};// 新增学生信息
void addStuInfo(struct Student stu[], int count)
{printf("请输入学号 姓名:\n");scanf("%d", &stu[count].stuid);scanf("%s", &stu[count].stuname);
}// 修改学生信息
void updStuInfo(struct Student stu[], int count)
{long stuid;printf("请输入学号:\n");scanf("%d", &stuid);// 遍历数组 找到输入学号 并修改for (int i = 0; i < count; i++){if (stu[i].stuid == stuid){printf("请输入更改姓名:\n");scanf("%s", &stu[i].stuname);return;}}// 未找到 打印该信息printf("无此学号记录!\n");
}// 查询学生信息
void qryStuInfo(struct Student stu[], int count)
{printf("学号\t姓名\n");// 遍历数组 打印学号 姓名信息for (int i = 0; i < count; i++){printf("%d\t%s\n", stu[i].stuid, stu[i].stuname);}
}// 新增作业信息
void addWorkInfo(struct Homework work[], int count)
{printf("请输入作业内容:\n");work[count].worksno = count;scanf("%s", &work[count].workdata);
}// 修改作业信息
void updWorkInfo(struct Homework work[], int count)
{long wordsno;printf("请输入作业编号:\n");scanf("%d", &wordsno);// 遍历数组 找到输入对应作业编号 并修改for (int i = 0; i < count; i++){if (work[i].worksno == wordsno){printf("请输入更改内容:\n");scanf("%s", &work[i].workdata);return;}}// 未找到 打印该信息printf("无此作业记录!\n");
}// 查询作业信息
void qryWorkInfo(struct Homework work[], int count)
{printf("作业编号\t作业内容\n");// 遍历数组 打印作业编号 作业内容信息for (int i = 0; i < count; i++){printf("%d\t\t%s\n", work[i].worksno, work[i].workdata);}
}// 创建成绩信息
struct list_node *createGradeInfo(long stuid, long worksno, float grade)
{//给每个节点分配结构体一样的空间大小 struct list_node *p = malloc(sizeof(struct list_node));if (NULL == p){printf("malloc error!\n");return NULL;}//由于结构体在未初始化的时候一样是脏数据,所以要清 memset(p, 0, sizeof(struct list_node));//初始化第一个节点 进行赋值p->stuid = stuid;p->worksno = worksno;p->grade = grade;//将节点的后继指针设置为NULL p->next = NULL;return p;
}// 插入成绩信息
void insertGradeInfo(struct list_node *pH, struct list_node *new)
{//获取当前的位置 struct list_node *p = pH;//如果当前位置的下一个节点不为空 while (p->next){//移动到下一个节点 p = p->next;}//如果跳出以上循环,所以已经到了NULL的这个位置//此时直接把新插入的节点赋值给NULL这个位置 p->next = new;
}// 录入 修改成绩
void updGrade(struct list_node *pH)
{long stuid;long worksno;printf("请输入学号 作业编号:\n");scanf("%d", &stuid);scanf("%d", &worksno);struct list_node *p = pH;//如果当前位置的下一个节点不为空 while (p->next){p = p->next;if (p->stuid == stuid&&p->worksno == worksno){float grade;printf("请输入成绩:\n");scanf("%.2f", &grade);p->grade = grade;return;}}printf("未找到该学号 作业号信息!\n");
}// 查看所有成绩信息
void showAllGrade(struct list_node *pH)
{//获取当前的位置 struct list_node *p = pH;printf("学号\t作业编号\t作业成绩\n");//如果当前位置的下一个节点不为空 while (p->next){p = p->next;printf("%d\t%d\t\t%.2f\n", p->stuid, p->worksno, p->grade);}
}// 根据作业编号查看所有成绩
void showAllGradeByWorksno(struct list_node *pH)
{long worksno;printf("请输入作业编号:\n");scanf("%d", &worksno);//获取当前的位置 struct list_node *p = pH;printf("学号\t作业编号\t作业成绩\n");//如果当前位置的下一个节点不为空 while (p->next){p = p->next;if (p->worksno == worksno){printf("%d\t%d\t\t%.2f\n", p->stuid, p->worksno, p->grade);}}
}// 根据作业编号查看没有成绩学生信息
void showAllGradeByWorksnoWithNoGrade(struct list_node *pH)
{long worksno;printf("请输入作业编号:\n");scanf("%d", &worksno);//获取当前的位置 struct list_node *p = pH;printf("学号\t作业编号\t作业成绩\n");//如果当前位置的下一个节点不为空 while (p->next){p = p->next;if (p->worksno == worksno && p->grade == 0){printf("%d\t%d\t\t%.2f\n", p->stuid, p->worksno, p->grade);}}
}// 查看作业平均分
void showAvgGrade(struct list_node *pH, struct Homework work[], int stucount)
{// 该数组 存放对应作业总分float sum = 0;long worksno;printf("请输入作业编号:\n");scanf("%d", &worksno);//获取当前的位置 struct list_node *p = pH;//如果当前位置的下一个节点不为空 while (p->next){p = p->next;if (p->worksno == worksno){sum += p->grade;}}printf("作业编号\t平均分\n");printf("%d\t\t%.2f\n", worksno, sum / stucount);
}// 根据作业编号查看所有成绩(降序)
void showAllGradeByWorksnoDesc(struct list_node *pH, int stucount)
{// 定义grade动态数组 存储每个学生 成绩struct Grade* const grade = (struct Grade*)malloc(sizeof(struct Grade*)*stucount);long worksno;printf("请输入作业编号:\n");scanf("%d", &worksno);//获取当前的位置 struct list_node *p = pH;printf("学号\t作业编号\t作业成绩\n");// 将作业编号为worksno 的学生成绩信息存入grade数组int n = 0;while (p->next){p = p->next;if (p->worksno == worksno){grade[n].stuid = p->stuid;grade[n].worksno = worksno;grade[n].grade = p->grade;n++;}}// 对grade数组进行排序(倒序)int i, j;struct Grade temp;for (i = 0; i < stucount; ++i) {for (j = stucount - 1; j > i; --j) {if (grade[j].grade > grade[j - 1].grade) {temp = grade[j];grade[j] = grade[j - 1];grade[j - 1] = temp;}}}// 遍历 打印信息for (int i = 0; i < stucount; ++i) {printf("%d\t%d\t\t%.2f\n", grade[i].stuid, grade[i].worksno, grade[i].grade);}
}// 单链表释放
void Free_list(struct list_node *pHead) //释放链表
{struct list_node * p;while (pHead != NULL){p = pHead;pHead = pHead->next;free(p);p = NULL;}
}int main()
{// 学生数量统计int stucount = 0;// 作业数量统计(作业编号)int workcount = 0;// 作业成绩统计int gradecount = 0;// 定义学生信息结构体数组struct Student stu[100];// 定义作业信息结构体数组struct Homework work[100];// 创建单链表头结点struct list_node *header = createGradeInfo(0, 0, 0);int n = 0;long stuid;// 从文件读取学生信息FILE *frStu = fopen("stuinfo.txt", "r");if (frStu != NULL){char StrLine[1024];while (!feof(frStu)){fgets(StrLine, 1024, frStu);    // 读取一行// 去除读取行末尾\n换行符 保证显示正常if (StrLine[strlen(StrLine) - 1]=='\n'){StrLine[strlen(StrLine) - 1] = '\0';}char* temp = strtok(StrLine, " ");// 按空格 分开 取学号char* temp1 = strtok(NULL, " ");// 取姓名// char* 转long 对学号赋值stu[stucount].stuid = strtol(temp, NULL, 10);// 对姓名赋值strcpy(stu[stucount].stuname, temp1);stucount++;}fclose(frStu);}// 从文件读取作业信息FILE *frWork = fopen("work.txt", "r");if (frWork != NULL){char StrLine[1024];while (!feof(frWork)){fgets(StrLine, 1024, frWork);  // 读取一行// 去除读取行末尾\n换行符 保证显示正常if (StrLine[strlen(StrLine) - 1] == '\n'){StrLine[strlen(StrLine) - 1] = '\0';}// 文件 内容为空 跳过char* temp = strtok(StrLine, " ");// 按空格 分开 作业编号char* temp1 = strtok(NULL, " ");// 取作业内容// char* 转long 对作业编号赋值work[workcount].worksno = strtol(temp, NULL, 10);// 对作业内容赋值strcpy(work[workcount].workdata, temp1);workcount++;}fclose(frWork);}// 从文件读取成绩信息FILE *frGrade = fopen("grade.txt", "r");if (frGrade != NULL){char StrLine[1024];while (!feof(frGrade)){fgets(StrLine, 1024, frGrade);  // 读取一行// 去除读取行末尾\n换行符 保证显示正常if (StrLine[strlen(StrLine) - 1] == '\n'){StrLine[strlen(StrLine) - 1] = '\0';}// 文件 内容为空 跳过char* temp = strtok(StrLine, " ");// 取学号char* temp1 = strtok(NULL, " ");// 取作业编号char* temp2 = strtok(NULL, " ");// 取成绩insertGradeInfo(header, createGradeInfo(strtol(temp, NULL, 10), strtol(temp1, NULL, 10), strtof(temp2, NULL)));gradecount++;}fclose(frGrade);}while (n != 3){printf("请选择访问角色:\n");printf("1.教师  2.学生 3.退出\n");scanf("%d", &n);if (n == 1){// 教师模块int n1 = 0;while (n1 != 4){printf("请选择操作内容:\n");printf("1.学生信息管理  2.作业信息管理 3.作业成绩管理 4.返回\n");scanf("%d", &n1);if (n1 == 1){int n2 = 0;while (n2 != 4){printf("请选择操作内容:\n");printf("1.增加学生信息  2.修改学生信息 3.查询学生信息 4.返回\n");scanf("%d", &n2);if (n2 == 1){addStuInfo(stu, stucount);// 新增后 学生记录数加1stucount++;}else if (n2 == 2){updStuInfo(stu, stucount);}else if (n2 == 3){qryStuInfo(stu, stucount);}}}else if (n1 == 2){int n3 = 0;while (n3 != 5){printf("请选择操作内容:\n");printf("1.增加作业信息  2.修改作业信息 3.查询作业信息  4.删除作业信息 5.返回\n");scanf("%d", &n3);if (n3 == 1){addWorkInfo(work, workcount);// 创建作业时 更新所有学生该作业成绩链表 默认成绩为0for (int i = 0; i < stucount; i++){insertGradeInfo(header, createGradeInfo(stu[i].stuid, work[workcount].worksno, 0));}// 新增后 作业记录数加1workcount++;}else if (n3 == 2){updWorkInfo(work, workcount);}else if (n3 == 3){qryWorkInfo(work, workcount);}else if (n3 == 4){long worksno;printf("请输入要删除的作业编号:\n");scanf("%d", &worksno);int delRow = -1;for (int i = 0; i < workcount; i++){if (worksno == work[i].worksno){// 找到后并记录当前数据的下标(索引)delRow = i;break;}}// 根据索引的判断,如果你要删除的数的下标和所给定索引的初值相同,那么肯定就是没找到。if (delRow == -1){printf("没有找到该作业!\n");}else{// 如果找到了,建立一个循环并且从下标开始,数组中的元素后面一个覆盖前面一个,且数组长度 - 1for (int i = delRow; i < workcount - 1; i++){work[i] = work[i + 1];}// 删除成功后 作业记录数减1workcount--;// 删除成功后 清除作业成绩单链表该作业信息 并释放内存struct list_node *p, *q, *s;p = header;q = header->next;while (q) {if (q->worksno == worksno){p->next = q->next;s = q;q = q->next;free(s);}else {p = p->next;q = q->next;}}}}}}else if (n1 == 3){int n4 = 0;while (n4 != 8){printf("请选择操作内容:\n");printf("1.录入成绩  2.修改成绩 3.查看所有成绩 4.根据作业编号查看所有成绩 5.根据作业编号查看没有成绩学生信息 \n");printf("6.查看作业平均分 7.根据作业编号查看所有成绩(降序) 8.返回\n");scanf("%d", &n4);if (n4 == 1){updGrade(header);}else if (n4 == 2){updGrade(header);}else if (n4 == 3){showAllGrade(header);}else if (n4 == 4){showAllGradeByWorksno(header);}else if (n4 == 5){showAllGradeByWorksnoWithNoGrade(header);}else if (n4 == 6){showAvgGrade(header, work, stucount);}else if (n4 == 7){showAllGradeByWorksnoDesc(header, stucount);}}}}}else if (n == 2){printf("请输入学号:\n");scanf("%d", &stuid);// 学生模块int n5 = 0;while (n5 != 4){printf("请选择操作内容:\n");printf("1.查看所有成绩信息  2.查看第N次作业信息 3.查看作业总分及平均分 4.返回\n");scanf("%d", &n5);if (n5 == 1){//获取当前的位置 struct list_node *p = header;printf("学号\t作业编号\t作业成绩\n");//如果当前位置的下一个节点不为空 while (p->next){p = p->next;if (p->stuid == stuid){printf("%d\t%d\t\t%.2f\n", p->stuid, p->worksno, p->grade);}}}else if (n5 == 2){long count;printf("请输入第几次:\n");scanf("%d", &count);int i = 0;//获取当前的位置 struct list_node *p = header;printf("学号\t作业编号\t作业成绩\n");//如果当前位置的下一个节点不为空 while (p->next){p = p->next;if (p->stuid == stuid){i++;if (i == count){printf("%d\t%d\t\t%.2f\n", p->stuid, p->worksno, p->grade);break;}}}}else if (n5 == 3){float sum = 0;struct list_node *p = header;//如果当前位置的下一个节点不为空 while (p->next){p = p->next;if (p->stuid == stuid){sum += p->grade;}}printf("总分\t\t平均分\n");printf("%.2f\t%.2f\n", sum, sum / workcount);}}}}// 保存学生信息FILE *fwStu = fopen("stuinfo.txt", "w");if (fwStu != NULL){char buffer[20];for (int i = 0; i < stucount; i++){fputs(ltoa(stu[i].stuid, buffer, 10), fwStu);fputs(" ", fwStu);fputs(stu[i].stuname, fwStu);// 最后一行记录 末尾不能存\n 不然会多空行if (i != stucount - 1){fputs("\n", fwStu);}}fclose(fwStu);}// 保存作业信息FILE *fwWork = fopen("work.txt", "w");if (fwWork != NULL){char buffer[20];for (int i = 0; i < workcount; i++){fputs(ltoa(work[i].worksno, buffer, 10), fwWork);fputs(" ", fwWork);fputs(work[i].workdata, fwWork);// 最后一行记录 末尾不能存\n 不然会多空行if (i != workcount - 1){fputs("\n", fwWork);}}fclose(fwWork);}// 保存成绩信息FILE *fwGrade = fopen("grade.txt", "w");if (fwGrade != NULL){char buffer[20];struct list_node *p = header;while (p->next){p = p->next;fputs(ltoa(p->stuid, buffer, 10), fwGrade);fputs(" ", fwGrade);fputs(ltoa(p->worksno, buffer, 10), fwGrade);fputs(" ", fwGrade);sprintf(buffer, "%.2f ", p->grade);fputs(buffer, fwGrade);// 最后一行记录 末尾不能存\n 不然会多空行if (p->next != NULL){fputs("\n", fwGrade);}}fclose(fwGrade);}// 释放单链表Free_list(header);system("pause");return 0;
}

学习、交流 qq8660673

C语言 作业成绩管理系统相关推荐

  1. c语言按给定成绩查询,C语言学生成绩管理系统(简易版)

    #include #include #include int readstudents(struct students stu[]); //读取学生信息 int readsexcode(struct ...

  2. 用C语言学生成绩数据库排序功能设计,[c语言学生成绩管理系统]C语言学生成绩管理系统实验报告...

    篇一 : C语言学生成绩管理系统实验报告 实 验 四:结构体(6学时) 实验目的: 1.更加灵活的使用数组作为函数参数: 2.初步掌握开发一个小型实用系统的基本方法: 3.初步掌握书写程序设计开发文档 ...

  3. C语言学生成绩管理系统(课程设计报告书)

    今天再跟大家分享一份课程设计报告:C语言学生成绩管理系统源码 程序设计组成框图: #include<stdio.h> #include<conio.h> #include< ...

  4. C语言学生成绩管理系统源代码

    分享:C语言学生成绩管理系统设计 <C语言程序设计>实训报告 点击查看 ----> C语言学生成绩管理系统(课程设计报告书) 扫描下方公众号,发送 成绩系统 4个字,获取下载源码. ...

  5. c语言成绩管理系统教程,C语言学生成绩管理系统教程.doc

    C语言学生成绩管理系统教程 实训报告 题 目: 学生成绩管理系统院 系: 专 业: 姓 名: 学 号: 指导教师: 日 期: 目录 TOC \o "1-3" \h \z \u HY ...

  6. c语言成绩管理系统报告书,C语言学生成绩管理系统实验报告

    <C语言学生成绩管理系统实验报告>由会员分享,可在线阅读,更多相关<C语言学生成绩管理系统实验报告(22页珍藏版)>请在人人文库网上搜索. 1.学生成绩管理系统实验报告实验名称 ...

  7. C语言 学生成绩管理系统 带登录界面

    C语言 学生成绩管理系统 带登录界面 C语言课程设计 思路 部分展示 代码片段 C语言课程设计 先上要求: 思路 为了方便简单,直接利用结构体数组来存储学生学生,最后根据功能编写函数即可. 部分展示 ...

  8. c语言学生成绩管理系统(增、删、查、改、排序、分析优秀及格率等)

    复制时运行出错请看这里:c语言学生成绩管理系统 添加公众号回复 学管 免费获取源代码 代做可私聊 c语言学生成绩管理系统(增.删.查.改.排序.分析优秀及格率等)详细内容 一.功能描述 实现学生基本信 ...

  9. c语言学生成绩管理系统课设作业,C语言课程设计——学生成绩管理系统

    摘 要 学生成绩管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段.但一直以来人们使用传统人工的方式 ...

最新文章

  1. 让你的程序只能运行一个实例
  2. @javax.inject.Inject,新的注入依赖规范
  3. 查看表字段信息 sql,mysql,oracle
  4. anaconda下安装python,Windows下Anaconda的安装和简单使用方法
  5. ios学习笔记——RunTime
  6. 双频路由器是选择将2.4G和5.0G分设,还是选择由机器选择好?
  7. ubuntu16 kickstart pxe 安装系统
  8. 零基础不建议学前端_临夏零基础怎么学理发
  9. 【bzoj2588/P2633】count on a tree —— LCA + 主席树
  10. 维基百科简体中文语料的获取
  11. JTextField文本框的使用
  12. Cython的原理:知其然,知其所以然
  13. MacPro系统重装操作步骤(U盘重装)
  14. 「西瓜书」阅读笔记——决策树
  15. ARM 开发板安装Alpine Linux (英)
  16. 预见未来: 微软亚洲研究院看下一个二十年
  17. 3DES数据加密算法
  18. ISO15189医学实验室认可内审员培训
  19. 2023.4月及5月最新HCIP 考试战报来袭
  20. Linux命令-压缩和解压缩命令

热门文章

  1. First Day Of Second Life
  2. 微信:把元宇宙装进小程序
  3. IT行业 缓解工作压力
  4. SSL 2295——暗黑破坏神
  5. 算法学习笔记——动态规划:高楼扔鸡蛋
  6. 基于web的人才招聘求职位系统java ssm毕业设计源码介绍
  7. JavaScript面试题三千问---下篇
  8. 初学4之坦克要求(我方坦克击中敌方坦克,敌方坦克消失)
  9. 叹服,华为高工的344页高性能Java架构核心原理实战手册
  10. Aircrack-ng 学习笔记