• 售前

  • 售后

热门帖子
入门百科

C/C++项目:超详细教程之大学一定会被布置的作业学生成绩管理系统,看到本

[复制链接]
李冰381 显示全部楼层 发表于 2022-1-14 12:51:57 |阅读模式 打印 上一主题 下一主题
相信如果你是个专业课有编程相关的大学生,一定被老师布置过令人头疼的学生成绩管理系统,它是高校各种信息管理系统中的一种。看完这篇教你轻松取得好成绩!千万不要花钱去买了!不做冤大头从看到这篇文章开始~


今天我就用C/C++带大家一步步完成学生成绩管理系统


PS:要安装easyx图形库哦 #include    

开发工具为VS2019

在此之前呢,和大家说明一下,因为这是一个比较大的项目了,所以展示所有代码会有些困难,所以我裁剪了主要的大部分代码,主要目的是让大家明白实现这个项目的逻辑思路,希望大家可以理解,完整代码/编译器/图形库在文章最下方获取哦



正片开始:



第一步:定义学生结构,用结构体包装:

  1. //学生结构 节点
  2. typedef struct Student
  3. {
  4.         long long number;        //学号
  5.         char name[10];                //姓名
  6.         char grade[20];                //班级
  7.         int math;                        //数学
  8.         int chinese;                //语文
  9.         int english;                //英语
  10.         struct Student* next;        //指向下一个节点得指针
  11. }Student;
复制代码


第二步:封装链表:

  1. //链表得封装  单链表
  2. typedef struct List
  3. {
  4.         Student* front;        //头指针
  5.         Student* tail;        //尾指针         方便插入
  6. }List;
  7. List* createList()
  8. {
  9.         List* list = calloc(1, sizeof(List));
  10.         if (!list)
  11.         {
  12.                 return NULL;
  13.         }
  14.         return list;
  15. }
  16. Student* createStudent()
  17. {
  18.         Student* newNode = (Student*)calloc(1, sizeof(Student));
  19.         if (!newNode)
  20.         {
  21.                 return NULL;
  22.         }
  23.         return newNode;
  24. }
复制代码

第三步:从文件中读取数据并生成一个链表返回:

  1. List* createListFromFile(const char*filename)
  2. {
  3.         //创建头节点 calloc 会自动初始化申请的内存
  4.         Student* headNode = createStudent();
  5.         if (!headNode)
  6.         {
  7.                 return NULL;
  8.         }
  9.         //如果头节点申请成功,则创建链表
  10.         List*list = createList();
  11.         list->front = headNode;
  12.         list->tail = headNode;
  13.        
  14.         FILE* fp = fopen(filename, "r");
  15.         //防御性编程,一定错误处理
  16.         if (fp == NULL)
  17.         {
  18.                 perror("open file failed~");
  19.                 return list;
  20.         }
  21.         //去掉表头字段
  22.         char arr[1024] = { 0 };
  23.         fgets(arr, 1024, fp);
  24.         //读取文件 fscanf  p q s t h
  25.         while (!feof(fp))
  26.         {
  27.                 Student* newNode = createStudent();
  28.                 int ret = fscanf(fp, "%lld %s %s %d %d %d", &newNode->number, newNode->name, newNode->grade,
  29.                         &newNode->math, &newNode->chinese, &newNode->english);
  30.                 if (ret == EOF)        //如果读到了文件结尾,直接退出循环
  31.                 {
  32.                         break;
  33.                 }
  34.                 //把当前节点插入链表
  35.                 list->tail->next = newNode;
  36.                 list->tail = newNode;
  37.         }
  38.         fclose(fp);
  39.         return list;
  40. }
复制代码

第四步:查看所有学生信息:

  1. //查看所有学生信息
  2. void printAll(List* list)
  3. {
  4.         //获取第一个节点的指针
  5.         Student* curNode = list->front->next;
  6.         //遍历
  7.         printf("学号        \t姓名\t班级\t\t数学\t语文\t英语\n");
  8.         while (curNode !=NULL)
  9.         {
  10.                 printf("%lld\t%s\t%s\t%d\t%d\t%d\n", curNode->number, curNode->name, curNode->grade,
  11.                         curNode->math, curNode->chinese, curNode->english);
  12.                 curNode = curNode->next;        //移动curNode
  13.         }
  14. }
复制代码

第五步:查找学生信息:

  1. //查找学生信息
  2. //按学号查找
  3. void searchNumber(List* list,long long number)
  4. {
  5.         Student* curNode = list->front->next;
  6.         printf("学号        \t姓名\t班级\t\t数学\t语文\t英语\n");
  7.         while (curNode!=NULL)
  8.         {
  9.                 //开始比较
  10.                 if (number == curNode->number)
  11.                 {
  12.                         printf("%lld\t%s\t%s\t%d\t%d\t%d\n", curNode->number, curNode->name, curNode->grade,
  13.                                 curNode->math, curNode->chinese, curNode->english);
  14.                         //学号没有重复的,找到了直接结束循环
  15.                         break;
  16.                 }
  17.                 curNode = curNode->next;
  18.         }
  19. }
  20. //按姓名查找
  21. void searchName(List* list,const char*name)
  22. {
  23.         Student* curNode = list->front->next;
  24.         printf("学号        \t姓名\t班级\t\t数学\t语文\t英语\n");
  25.         while (curNode!=NULL)
  26.         {
  27.                 //比较姓名
  28.                 if (strcmp(name,curNode->name) == 0)
  29.                 {
  30.                         printf("%lld\t%s\t%s\t%d\t%d\t%d\n", curNode->number, curNode->name, curNode->grade,
  31.                                 curNode->math, curNode->chinese, curNode->english);
  32.                 }
  33.                 curNode = curNode->next;
  34.         }
  35. }
复制代码

第六步:删除学生:

  1. //删除学生
  2. void removeStudent(List* list, long long number)
  3. {
  4.         //1,找到要删除的学生节点
  5.         Student* prevNode = list->front;        //让pervNext指向第一个数据节点
  6.         while (prevNode->next != NULL)
  7.         {
  8.                 //找到了
  9.                 if (prevNode->next->number == number)
  10.                 {
  11.                         break;
  12.                 }
  13.                 prevNode = prevNode->next;
  14.         }
  15.         if (prevNode->next != NULL)
  16.         {
  17.                 //先保存要删除的节点
  18.                 Student* delNode = prevNode->next;
  19.                 //2,删除:1,先让前面的和后面的相连
  20.                 prevNode->next = delNode->next;
  21.                 //2,释放内存
  22.                 free(delNode);
  23.                 //如果删除的是最后一个
  24.                 if (prevNode->next == list->tail)
  25.                 {
  26.                         list->tail = prevNode;
  27.                 }
  28.         }
  29. }
  30. oid menu()
  31. {
  32.         printf("********学生成绩管理系统****************\n");
  33.         printf("*\t\t1,查看所有学生\t\t*\n");
  34.         printf("*\t\t2,添加学生\t\t*\n");
  35.         printf("*\t\t3,删除学生\t\t*\n");
  36.         printf("*\t\t4,查找学生\t\t*\n");
  37.         printf("***************************************\n");
  38. }
  39. int main()
  40. {
  41.         List* list = createListFromFile("assets/student.txt");
  42.        
  43.         int op = -1;
  44.         while (true)
  45.         {
  46.                 menu();
  47.                 printf("input select>");       
  48.                 scanf("%d", &op);
  49.                 switch (op)
  50.                 {
  51.                 case 1:                        //查看
  52.                         printAll(list);
  53.                         break;
  54.                 case 2:                        //添加
  55.                         break;
  56.                 case 3:                        //删除
  57.                 {
  58.                         long long number = -1;
  59.                         printf("输入要删除的学生的学号>");
  60.                         scanf("%lld", &number);
  61.                         removeStudent(list, number);
  62.                 }
  63.                         break;
  64.                 case 4:                        //查找
  65.                 {
  66.                         printf("****查找类型****\n");
  67.                         printf("****1,按学号查找****\n");
  68.                         printf("****2,按姓名查找****\n");
  69.                         printf("inpu select>");
  70.                         scanf("%d", &op);        //\n
  71.                         if (op == 1)
  72.                         {
  73.                                 long long number = -1;
  74.                                 printf("请输入要查询的学号>");
  75.                                 scanf("%lld", &number);
  76.                                 searchNumber(list, number);
  77.                         }
  78.                         else
  79.                         {
  80.                                 char name[10] = { 0 };
  81.                                 printf("请输入要查询的姓名>");
  82.                                 getchar();                                //读取并丢弃缓冲区中的\n
  83.                                 gets_s(name, 10);                //为什么直接跳过了
  84.                                 searchName(list, name);
  85.                         }
  86.                 }
  87.                         break;
  88.                 default:
  89.                         break;
  90.                 }
  91.                 //先暂停
  92.                 system("pause");
  93.                 //再清屏
  94.                 system("cls");
  95.         }
  96.         return 0;
  97. }
复制代码


教程到此结束!

有兴趣的同学可以尝试写出来,后续我会发布更多的项目源码以及学习资料,希望大家可以持续关注。

想要C/C++学习资料以及完整源码素材图形库开发工具等的可以在文章末领取,希望大家可以在这里得到自己想要的知识,也希望如果对你有所帮助的话可以多多关注点赞评论,有建议也可以在评论区提出,谢谢大家的支持!


 


 获取资源神秘代码:源码资素材图形库还有大量学习资料都在这哦~https://jq.qq.com/?_wv=1027&k=Mgs9YFRl






来源:https://blog.caogenba.net/a214214a/article/details/122451668
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作