当前位置:首页 » 《资源分享》 » 正文

C语言——学生信息管理系统

13 人参与  2024年03月27日 17:35  分类 : 《资源分享》  评论

点击全文阅读


目录

功能展示

界面展示 

所有功能模块:

功能1:菜单模块(显示功能菜单)

功能2:增加学生信息

功能3:输出学生信息(查看所有学习信息)

功能4:修改学生信息

功能5:删除学生信息

功能6:查询单个学生信息

功能7:排序学习信息(按照学号升序排序)

功能8:退出管理系统

 心得分享 

过程梳理

个人总结

学生管理系统(完整代码)

main.cpp 

student.h

student.cpp


功能展示

界面展示 

 

所有功能模块:


功能1:菜单模块(显示功能菜单)


功能2:增加学生信息


功能3:输出学生信息(查看所有学习信息)


功能4:修改学生信息

第一步:修改信息

第二步:查询验证


功能5:删除学生信息

第一步:删除信息

第一步:查询验证


功能6:查询单个学生信息

按照学号查询:

按照姓名查询:

查询为空:


功能7:排序学习信息(按照学号升序排序)

在排序之前,先增加几条数据:

执行排序:

验证结果(该数据无法验证是否执行头排序)

再插入一条比第一条小的数据(用于执行头排序):

执行(头)排序:

验证结果:


功能8:退出管理系统


 心得分享 

过程梳理

首先要根据需求分析,将各个功能模块罗列出来

数据建模,对数据进行封装,创建一个student结构体,添加我们需要的各种数据。

​​​​​

创建一个可以循环输入命令的菜单,并且可以退出,还可以检查输入的指令是否匹配。然后一个个功能模块实现就可以了。但要注意实现功能的顺序。(写功能也要有顺序,这样可以事半功倍)第一个功能,肯定就是添加了,每当需要添加的时候,就需要申请一块内存,创建一个student结构体,并赋予相应的数据。第二个功能,就是打印全部数据。第三个功能,实现单个数据的查询。第四个功能,实现单个数据的删除。(删除和修改都差不多)第五个功能,实现单个数据的修改。第六个功能,也就是最难的功能——链表排序最后,对细节进行处理。

个人总结

当思维混乱的时候,不妨画图来理解。写循环时,一定要明确跳出的逻辑和循环的次数和迭代方法。在实现功能的时候,还需要考虑特殊情况!边界条件的处理尤其重要。(在排序的时候,一定要考虑多个因素)总体难度不大,但是需要一步一步去实现,更多的是考验对细节的处理,后面又看了别人的实现方法,发现自己的思维方式还是比较呆板,别人几行就可以搞定的,自己还是用了各种if分支和for循环才搞定,还得加强自己的思维能力,多刷算法!

学生管理系统(完整代码)

 

main.cpp 

# include "student.h"int main(){StudentNode* s = NULL;int command; while (true){myMenu();   // 展示菜单 scanf("%d", &command);   // 输入switch (command){case 1:// 增加学生信息AddStudent(&s);break;case 2:// 删除学生信息DeleteStudent(&s);break;case 3:// 修改学生信息UpdateStudent(&s);break;case 4:// 查询学生信息 (可按照姓名和学号) SearchStudent(&s);break;case 5:// 输出学生信息 (打印所有学生信息) MyPrint(s);break;case 6:// 排序学生信息 (按照学号升序排序) MySort(&s);break;case 0:// 退出管理系统exit();break;default :      //输入有误error();   break;}system("pause"); }} 

 student.h

#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>typedef int  STDateTypeOne;typedef char STDateTypeTow;// 学生  typedef struct StudentNode{int ID;               // 学号int Score;            // 排名 char Name[50];       // 姓名char Sex[10];        // 性别char Profession[50]; // 专业char Phone[20];       // 电话号码char Q[20];           // QQ号 struct StudentNode* next;    // 指针域}StudentNode;// 主菜单界面void myMenu();// 退出系统void exit(); // 命令有误void error();    // ----------------------------------CRUD模块void AddStudent(StudentNode** s);     // 添加 void DeleteStudent(StudentNode** s);  // 删除void UpdateStudent(StudentNode** s);  // 更新void SearchStudent(StudentNode** s);  // 查询// ----------------------------------其他模块 void MyPrint(StudentNode* s);     // 输出学生信息 (打印所有学生信息) void MySort(StudentNode** s);     // 排序学生信息 (按照学号升序排序)  

 student.cpp

#include "student.h"// 字符判断int MyStrcmp(const char* str1, const char* str2){assert(NULL != str1);assert(NULL != str2);//防御性编程while (*(unsigned char*)str1 == *(unsigned char*)str2){if (*(unsigned char*)str1 != '\0'){return 0;//当*(unsigned char*)str1 ==*(unsigned char*)str2==‘\0'时两个字符串完全相等}str1++;  //比较下个字符str2++;}//*(unsigned char*)str1 与*(unsigned char*)str2的差值与返回值正负匹配return *(unsigned char*)str1 - *(unsigned char*)str2;}// 菜单 void myMenu(){system("cls");printf("****************************************************************\n");printf("***********           \033[34m学生信息管理系统         \033[30m      ***********\n");printf("----------------------------------------------------------------\n");printf("***********     \033[32m     1 \033[30m---- 增加学生信息             ***********\n");printf("***********     \033[32m     2 \033[30m---- 删除学生信息             ***********\n");printf("***********     \033[32m     3 \033[30m---- 修改学生信息             ***********\n");printf("***********     \033[32m     4 \033[30m---- 查询学生信息             ***********\n");printf("***********     \033[32m     5 \033[30m---- 输出学生信息             ***********\n");printf("***********     \033[32m     6 \033[30m---- 排序学生信息             ***********\n");printf("***********     \033[32m     0 \033[30m---- 退出管理系统             ***********\n");printf("****************************************************************\n");printf("\033[31m");printf("请选择想要实现的功能(数字):");}// 退出管理系统void exit(){system("cls");printf("欢迎下次使用学生信息管理系统!\n");exit(0);   // 结束程序}// 提示输入错误 void error(){printf("请输入对应指令!\n");}// ----------------------------------CRUD模块void AddStudent(StudentNode** s){int ID;   // 学号int Score;            // 排名 char Name[50];       // 姓名char Sex[10];        // 性别char Profession[50]; // 专业char Phone[20];       // 电话号码char Q[20];           // QQ号 // 创建新节点 StudentNode* newnode = (StudentNode*)malloc(sizeof(StudentNode)); //将申请的空间---强转为 指针变量// 输入数据 printf("请输入新增学生的相关信息:\n");printf("学号:");scanf("%d", &newnode->ID);   // 输入printf("排名:");scanf("%d", &newnode->Score);   // 输入printf("姓名:");scanf("%s", &newnode->Name);   // 输入printf("性别: ");scanf("%s", &newnode->Sex);   // 输入printf("专业: ");scanf("%s", &newnode->Profession);   // 输入printf("电话号码:");scanf("%s", &newnode->Phone);   // 输入printf("QQ号: ");scanf("%s", &newnode->Q);   // 输入newnode->next = NULL; // 尾插if(*s == NULL){*s = newnode;}else{printf("添加中...\n");//找到尾节点 StudentNode* tp = *s;StudentNode* tmp;while(tp->next != NULL){tmp = tp->next;tp = tmp;}tp->next = newnode;}printf("添加成功!\n");}void DeleteStudent(StudentNode** s){//判断链表是不是空 if(*s == NULL){printf("当前还没有任何数据!\n ");return;}// 展示所以数据MyPrint(*s); int id; // 选择删除的数据 printf("您要删除第几条信息: ");scanf("%d", &id);   // 输入// 进行删除StudentNode* tp  = *s;StudentNode* flag= *s;// 删头节点 if(id == 1){StudentNode* p = (*s)->next;free(*s);*s = p;printf("删除成功!\n");return;}for(int i = 1; i< id; i++){flag = tp;tp = tp->next;}flag->next = tp->next; free(tp); printf("删除成功!\n");}void UpdateStudent(StudentNode** s){//判断链表是不是空 if(*s == NULL){printf("当前还没有任何数据!\n ");return;}// 展示所以数据MyPrint(*s); int id;// 选择修改的信息printf("您要修改第几条信息: ");scanf("%d", &id);   // 输入// 进行修改 StudentNode* tp  = *s;StudentNode* flag= *s;for(int i = 1; i< id; i++){tp = tp->next;}// 请输入您要修改的数据 printf("请输入您要修改的数据 :\n");printf("学号:");scanf("%d", &tp->ID);   // 输入printf("排名:");scanf("%d", &tp->Score);   // 输入printf("姓名:");scanf("%s", &tp->Name);   // 输入printf("性别: ");scanf("%s", &tp->Sex);   // 输入printf("专业: ");scanf("%s", &tp->Profession);   // 输入printf("电话号码:");scanf("%s", &tp->Phone);   // 输入printf("QQ号: ");scanf("%s", &tp->Q);   // 输入// 修改成功! printf("修改成功! \n");}void SearchStudent(StudentNode** s){//判断链表是不是空 if(*s == NULL){printf("当前还没有任何数据!\n ");return;}StudentNode* p  = *s;int choice;int myid;              // 学号char myname[50];       // 姓名// 选择查询方法 printf("请选择查询方式(0:学号 / 1:姓名) : ");scanf("%d", &choice);   // 输入// 学号查询 if(choice == 0){printf("请输入查询的学号 : ");scanf("%d", &myid);   // 输入while(1){// 边界判断 if(p->next == NULL){if(p->ID == myid){printf("__________________________________________");printf("_______________________________________\n");printf("|%d\t|%d\t|%s\t|%s\t|%s\t\t|%s\t\t|%s\t\t|\n", p->ID, p->Score, p->Name, p->Sex, p->Profession, p->Phone, p->Q);}else{printf("您所查找的学生不存在!\n");}break;}// 判断学号 if(p->ID == myid){printf("__________________________________________");printf("_______________________________________\n");printf("|%d\t|%d\t|%s\t|%s\t|%s\t\t|%s\t\t|%s\t\t|\n", p->ID, p->Score, p->Name, p->Sex, p->Profession, p->Phone, p->Q);break;}// 继续遍历p = p->next;}return;}if(choice == 1){printf("请输入查询的姓名 : ");scanf("%s", &myname);   // 输入while(1){// 边界判断 if(p->next == NULL){// 判断姓名int i = MyStrcmp(p->Name, myname);if(i == 0){printf("|学号\t|排名\t|姓名\t|性别\t|专业\t\t|电话\t\t|QQ\t\t|\n");printf("__________________________________________");printf("_______________________________________\n");printf("|%d\t|%d\t|%s\t|%s\t|%s\t\t|%s\t\t|%s\t\t|\n", p->ID, p->Score, p->Name, p->Sex, p->Profession, p->Phone, p->Q);break;}else{printf("您所查找的学生不存在!\n");}break;}// 判断姓名int i = MyStrcmp(p->Name, myname);if(i == 0){printf("|学号\t|排名\t|姓名\t|性别\t|专业\t\t|电话\t\t|QQ\t\t|\n");printf("__________________________________________");printf("_______________________________________\n");printf("|%d\t|%d\t|%s\t|%s\t|%s\t\t|%s\t\t|%s\t\t|\n", p->ID, p->Score, p->Name, p->Sex, p->Profession, p->Phone, p->Q);break;}// 继续遍历p = p->next;}return;}printf("请输入正常的指令!\n");}// ----------------------------------其他模块 void MyPrint(StudentNode* s){system("cls");StudentNode* p = s;if(!p){printf("暂无任何信息!\n");return; }printf("|学号\t|排名\t|姓名\t|性别\t|专业\t\t|电话\t\t|QQ\t\t|\n");while (p != NULL){printf("__________________________________________");printf("_______________________________________\n");printf("|%d\t|%d\t|%s\t|%s\t|%s\t\t|%s\t\t|%s\t\t|\n", p->ID, p->Score, p->Name, p->Sex, p->Profession, p->Phone, p->Q);p = p->next;}}//=============冒泡排序====================升序 void MySort(StudentNode** s){StudentNode* p  = *s;StudentNode* temp;int lenth = 0;// 判断特殊情况 长度为1     if((p -> next == NULL))    {    printf("长度为1,无需排序!\n");        return;    }    // 判断特殊情况 长度为2    if((p -> next -> next == NULL))    {    if(p->ID < p->next->ID){    temp = p;  // 保存头节点     *s = (*s)->next;   // 头节点换为下一个节点 (*s)->next = temp; (*s)->next->next = NULL;    }    printf("排序完成! \n");        return;    }        // 获取长度 while(1) {lenth++;if(p->next == NULL){// 退出 break;}p = p->next;}printf("长度为%d !\n", lenth);// 冒泡排序 StudentNode* head  = *s;StudentNode* pre   = *s;             // 当前 StudentNode* cur   = (*s)->next;             // 当前 +1StudentNode* next  = (*s)->next->next;      // 当前 + 2 StudentNode* end = NULL;for (int i = lenth; i >= 0; i--) {pre = head;cur = pre->next;next = cur->next;while(next != NULL) {if (cur->ID > next->ID) {cur->next = next->next;pre->next = next;next->next = cur;next = cur->next;pre = pre->next;}else {pre = pre->next;cur = cur->next;next = next->next;}}}// 头结点 排序head  = *s;cur   = *s;             // 当前 // cur到尾巴 while(cur->next != NULL){// 大于上一个,小于下一个 if(head->ID > cur->ID && head->ID < cur->next->ID ){// 头节点换为下一个节点 *s = (*s)->next;   // 插入 head temp = cur->next;cur->next = head;head->next = temp;printf("头排序完成!\n");printf("排序完成!\n");return;}cur = cur->next;  // 往下走 }// 单独比较尾巴 if(head->ID > cur->ID){// 头节点换为下一个节点 *s = (*s)->next;  cur->next = head;head->next = NULL;printf("头排序完成!\n");}printf("排序完成!\n");    }

点击全文阅读


本文链接:http://zhangshiyu.com/post/86769.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1