• [C语言]C语言学生管理系统功能详解


    目录

    一.学生管理系统流程图

    二.学生管理系统初始化

    三.学生管理系统主界面

    四.学生管理系统添加学生信息

    五.学生管理系统查找学生信息

    六.学生管理系统展示所有学生信息

    七.学生管理系统学生成绩排序

    八.学生管理系统删除学生信息

    九.学生管理系统修改学生信息


    一.学生管理系统流程图

    昨天花了一天时间写的学生管理系统,主要用到链表和文件读写,功能都比较简单,流程图如下

    二.学生管理系统初始化

    定义学生结构体,初始化节点,如果文本中有内容,先要把文本中的内容读取到链表中

    1. #include "stdafx.h"
    2. #include
    3. #include
    4. #include
    5. 定义一个学生类型
    6. typedef struct Student
    7. {
    8. char ID[16];//学号
    9. char name[20];//姓名
    10. char sex[6];//性别
    11. int scoreCh;//语文成绩
    12. int scoreMa;//数学成绩
    13. int scoreEn;//外语成绩
    14. struct Student*pNext;//下一个学生的指针
    15. }Stu,*pStu;
    16. /************************************************************************/
    17. /*初始化*/
    18. /************************************************************************/
    19. pStu pHeader;
    20. pStu pTail;
    21. void initStu(char* path)
    22. {
    23. FILE*file;
    24. pHeader=(pStu)malloc(sizeof(Stu));
    25. if (pHeader==NULL)
    26. {
    27. printf("分配失败");
    28. }
    29. // 初始化头节点
    30. pTail=pHeader;
    31. pTail->pNext=NULL;
    32. //打开文件
    33. file=fopen(path,"r");
    34. if (file==NULL)
    35. {
    36. printf("打开文件失败!");
    37. return;
    38. }
    39. while(1)
    40. {
    41. pStu pNew=(pStu)malloc(sizeof(Stu));
    42. //scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF
    43. //文件中没有内容了则释放刚刚给它分配的空间
    44. if (fscanf(file,"%s %s %s %d %d %d",&(pNew->ID),&(pNew->name),&(pNew->sex),&(pNew->scoreCh),&(pNew->scoreMa),&(pNew->scoreEn))==EOF)
    45. {
    46. free(pNew);
    47. pNew=NULL;
    48. break;
    49. }
    50. pNew->pNext=NULL;
    51. //将当前结点和新建的链接起来
    52. pTail->pNext=pNew;
    53. //调整当前结点为新结点
    54. pTail=pNew;
    55. }
    56. fclose(file);
    57. }

    三.学生管理系统主界面

     设置界面功能,用switch case,一个case对应一个功能.

    1. /************************************************************************/
    2. /*主界面*/
    3. /************************************************************************/
    4. void interface(char* path)
    5. {
    6. int c;
    7. while(1)
    8. {
    9. system("cls");
    10. printf(" ╪╪╪╪╪╪╧╧╧╧╧╧╧╧╪╪╪╪╪╪\n");
    11. printf("╔═══╧╧ 学生管理系统 ╧╧═══╗\n");
    12. printf("║※1.添加学生信息 ║\n");
    13. printf("║※2.查找学生信息  ║\n");
    14. printf("║※3.学生成绩排序  ║\n");
    15. printf("║※4.删除学生信息  ║\n");
    16. printf("║※5.修改学生信息  ║\n");
    17. printf("║※6.展示学生信息  ║\n");
    18. printf("║※0.退出程序  ║\n");
    19. printf("╚═════════════════╝\n");
    20. system("color 0A");
    21. scanf("%d",&c);
    22. getchar();
    23. switch(c)
    24. {
    25. case 1:
    26. {
    27. StudentAdd(path);
    28. break;
    29. }
    30. case 2:
    31. {
    32. StudentSearch();
    33. break;
    34. }
    35. case 3:
    36. {
    37. sort();
    38. break;
    39. }
    40. case 4:
    41. {
    42. delStu(path);
    43. break;
    44. }
    45. case 5:
    46. {
    47. alterStu(path);
    48. break;
    49. }
    50. case 6:
    51. {
    52. bianli(pHeader);
    53. break;
    54. }
    55. case 0:
    56. {
    57. exit(0);
    58. break;
    59. }
    60. default:
    61. {
    62. printf("Error!\n");
    63. }
    64. }
    65. system("pause");
    66. }
    67. }
    68. int main(int argc, char* argv[])
    69. {
    70. //获取运行目录
    71. char infoPath[100];
    72. GetCurrentDirectory(100,infoPath);
    73. strcat(infoPath,"\\stuinfo.txt");
    74. /*printf("%s",infoPath);*/
    75. initStu(infoPath);
    76. interface(infoPath);
    77. return 0;
    78. }

    四.学生管理系统添加学生信息

    首先展示一下功能

    添加学生信息要注意学号不能重复,所以要写个检查学号是否重复的功能

    因为考虑到可能一次要输入多个学生信息,所以用了循环输入,输入#可以退出

    特别注意,scanf多次输入要考虑scanf缓存的问题,一定要清除scanf缓存,不然数据可能错乱.

    1. //清除scanf缓存
    2. void safe_flush(FILE *fp)
    3. {
    4. int ch;
    5. while( (ch = fgetc(fp)) != EOF && ch != '\n' );
    6. }
    7. //写入文件
    8. void StudentWrite(char* infoPath,Student a)
    9. {
    10. FILE*fp;
    11. fp=fopen(infoPath,"a");
    12. if (fp==NULL)
    13. {
    14. printf("fopen error\n");
    15. }
    16. fprintf(fp,"%s %s %s %d %d %d\n",a.ID,a.name,a.sex,a.scoreCh,a.scoreMa,a.scoreEn);
    17. fclose(fp);
    18. }
    19. /*判断学号是否重复*/
    20. //1为重复 0为不重复
    21. int checkAdd(char* id)
    22. {
    23. pStu stu=pHeader->pNext;
    24. while(stu!=NULL)
    25. {
    26. if (strcmp(stu->ID,id)==0)
    27. {
    28. return 1;
    29. }
    30. stu=stu->pNext;
    31. }
    32. return 0;
    33. }
    34. /************************************************************************/
    35. /*添加学生信息*/
    36. /************************************************************************/
    37. void StudentAdd(char* path)
    38. {
    39. Student ss;
    40. system("cls");
    41. system("color 0D");
    42. printf("-------------------------------\n");
    43. printf("\t欢迎来到学生管理系统\t\n");
    44. printf("\t\t添加学生信息\n");
    45. printf("-------------------------------\n");
    46. while(1)
    47. {
    48. printf("请依次输入学生ID 姓名 性别 语文 数学 外语成绩,如果想结束输入,请按#退出\n");
    49. scanf("%s",ss.ID);
    50. if (!strcmp(ss.ID,"#"))
    51. {
    52. break;
    53. }
    54. if (checkAdd(ss.ID)==1)
    55. {
    56. printf("学生ID重复,不能添加!\n");
    57. safe_flush(stdin);//清除scanf缓存
    58. continue;
    59. }
    60. scanf("%s %s %d %d %d",ss.name,ss.sex,&ss.scoreCh,&ss.scoreMa,&ss.scoreEn);
    61. pStu pN=(pStu)malloc(sizeof(Stu));
    62. pN->pNext=NULL;
    63. //给新节点赋值
    64. strcpy(pN->ID,ss.ID);
    65. strcpy(pN->name,ss.name);
    66. strcpy(pN->sex,ss.sex);
    67. pN->scoreCh=ss.scoreCh;
    68. pN->scoreMa=ss.scoreMa;
    69. pN->scoreEn=ss.scoreEn;
    70. pTail->pNext=pN;
    71. pTail=pN;
    72. StudentWrite(path,ss);
    73. }
    74. }

    五.学生管理系统查找学生信息

    查询很简单,下面上代码,检查学号这个功能光查找学生信息是不需要位置的,但为了兼顾删除和修改所以用到了位置

    注意,(*pos)++一定要加括号,后面的++运算优先级比较高,我就是被这个小问题困扰了好大一会儿,还不知道哪里错了,大家千万别像我一样犯低级错误.

    1. /************************************************************************/
    2. /*查找学生信息*/
    3. /************************************************************************/
    4. pStu checkXuehao(char*x,int* pos)
    5. {
    6. pStu px=pHeader->pNext;
    7. *pos=-1;
    8. while(px!=NULL)
    9. {
    10. (*pos)++;
    11. if (strcmp(x,px->ID)==0)
    12. {
    13. return px;
    14. }
    15. px=px->pNext;
    16. }
    17. return NULL;
    18. }
    19. void StudentSearch()
    20. {
    21. system("cls");
    22. system("color 0C");
    23. printf("-------------------------------\n");
    24. printf("\t欢迎来到学生管理系统\t\n");
    25. printf("\t\t查找学生信息\n");
    26. printf("-------------------------------\n");
    27. char ID[16];
    28. printf("请输入您要查询的学生学号\n");
    29. scanf("%s",ID);
    30. int value;
    31. pStu s=checkXuehao(ID,&value);
    32. if (s==NULL)
    33. {
    34. printf("您输入的学号不存在\n");
    35. }
    36. else
    37. {
    38. printf("您查询的结果如下:\n");
    39. printf("%8s%8s%8s%8s%8s%8s\n","学号","姓名","性别","语文","数学","外语");
    40. printf("%8s%8s%8s%8d%8d%8d\n",s->ID,s->name,s->sex,s->scoreCh,s->scoreMa,s->scoreEn);
    41. }
    42. }

    六.学生管理系统展示所有学生信息

    1. /************************************************************************/
    2. /*展示学生信息*/
    3. /************************************************************************/
    4. void bianli(pStu stu)
    5. {
    6. system("cls");
    7. system("color 0E");
    8. printf("-------------------------------\n");
    9. printf("\t欢迎来到学生管理系统\t\n");
    10. printf("\t\t展示学生信息\n");
    11. printf("-------------------------------\n");
    12. pStu px=pHeader->pNext;
    13. printf("%8s%8s%8s%8s%8s%8s%8s\n","学号","姓名","性别","语文","数学","外语","总成绩");
    14. while(px!=NULL)
    15. {
    16. printf("%8s%8s%8s%8d%8d%8d%8d\n",px->ID,px->name,px->sex,px->scoreCh,px->scoreMa,px->scoreEn,px->scoreCh+px->scoreMa+px->scoreEn);
    17. px=px->pNext;
    18. }
    19. }

    七.学生管理系统学生成绩排序

    先用冒泡进行排序,然后再调用展示学生信息

    上面这两张截图就是按总成绩排序打印的

    1. /************************************************************************/
    2. /*学生成绩排序*/
    3. /************************************************************************/
    4. void paixuCh(pStu pHeader,int c)
    5. {
    6. pStu p,p1,t=pHeader;
    7. for (p=pHeader->pNext;p!=NULL;p=p->pNext)
    8. {
    9. for (p1=p->pNext;p1!=NULL;p1=p1->pNext)
    10. {
    11. if (c==1)
    12. {
    13. if ((p->scoreCh)<(p1->scoreCh))
    14. {
    15. //复制内存
    16. //交换内存数据,不换指针,只需要将除pNext指针外的结构体数据拷贝交换即可
    17. MoveMemory(t,p,sizeof(Stu) - 4);
    18. MoveMemory(p,p1,sizeof(Stu) - 4);
    19. MoveMemory(p1,t,sizeof(Stu) - 4);
    20. }
    21. }
    22. else if (c==2)
    23. {
    24. if (p->scoreMascoreMa)
    25. {
    26. MoveMemory(t,p,sizeof(Stu) - 4);
    27. MoveMemory(p,p1,sizeof(Stu) - 4);
    28. MoveMemory(p1,t,sizeof(Stu) - 4);
    29. }
    30. }
    31. else if (c==3)
    32. {
    33. if (p->scoreEnscoreEn)
    34. {
    35. MoveMemory(t,p,sizeof(Stu) - 4);
    36. MoveMemory(p,p1,sizeof(Stu) - 4);
    37. MoveMemory(p1,t,sizeof(Stu) - 4);
    38. }
    39. }
    40. else if(c==4)
    41. {
    42. if ((p->scoreCh+p->scoreMa+p->scoreEn)<(p1->scoreCh+p1->scoreMa+p1->scoreEn))
    43. {
    44. MoveMemory(t,p,sizeof(Stu) - 4);
    45. MoveMemory(p,p1,sizeof(Stu) - 4);
    46. MoveMemory(p1,t,sizeof(Stu) - 4);
    47. }
    48. }
    49. }
    50. }
    51. }
    52. void sort()
    53. {
    54. int c;
    55. system("cls");
    56. system("color 0B");
    57. printf("-------------------------------\n");
    58. printf("\t欢迎来到学生管理系统\t\n");
    59. printf("\t\t学生成绩排序\n");
    60. printf("-------------------------------\n");
    61. printf("*******************\n");
    62. printf("1.按语文成绩降序\n");
    63. printf("2.按数学成绩降序\n");
    64. printf("3.按外语成绩降序\n");
    65. printf("4.按总成绩降序\n");
    66. printf("*******************\n");
    67. scanf("%d",&c);
    68. switch(c)
    69. {
    70. case 1:
    71. {
    72. paixuCh(pHeader,c);
    73. bianli(pHeader);
    74. break;
    75. }
    76. case 2:
    77. {
    78. paixuCh(pHeader,c);
    79. bianli(pHeader);
    80. break;
    81. }
    82. case 3:
    83. {
    84. paixuCh(pHeader,c);
    85. bianli(pHeader);
    86. break;
    87. }
    88. case 4:
    89. {
    90. paixuCh(pHeader,c);
    91. bianli(pHeader);
    92. break;
    93. }
    94. default:
    95. {
    96. printf("Error!\n");
    97. }
    98. }
    99. }

    八.学生管理系统删除学生信息

     删除要找到位置,方法以前单向链表那篇文章已经讲过了,这里就不多赘述了

    1. /************************************************************************/
    2. /*删除学生信息*/
    3. /************************************************************************/
    4. void rewrite(char* infoPath,pStu pHeader)
    5. {
    6. FILE*fp;
    7. pStu rep=pHeader->pNext;
    8. fp=fopen(infoPath,"w");
    9. if (fp==NULL)
    10. {
    11. printf("fopen error\n");
    12. }
    13. while(rep!=NULL)
    14. {
    15. fprintf(fp,"%s %s %s %d %d %d\n",rep->ID,rep->name,rep->sex,rep->scoreCh,rep->scoreMa,rep->scoreEn);
    16. rep=rep->pNext;
    17. }
    18. fclose(fp);
    19. }
    20. void delStu(char* path)
    21. {
    22. system("cls");
    23. system("color 0B");
    24. printf("-------------------------------\n");
    25. printf("\t欢迎来到学生管理系统\t\n");
    26. printf("\t\t删除学生信息\n");
    27. printf("-------------------------------\n");
    28. char ID[16];
    29. char a;
    30. printf("请输入您要删除的学生学号\n");
    31. scanf("%s",ID);
    32. int pos;
    33. int i=0;
    34. pStu s=checkXuehao(ID,&pos);
    35. pStu d=pHeader->pNext;
    36. if (s==NULL)
    37. {
    38. printf("您输入的学号不存在\n");
    39. }
    40. else
    41. {
    42. printf("您要删除的学生信息如下:\n");
    43. printf("%8s%8s%8s%8s%8s%8s\n","学号","姓名","性别","语文","数学","外语");
    44. printf("%8s%8s%8s%8d%8d%8d\n",s->ID,s->name,s->sex,s->scoreCh,s->scoreMa,s->scoreEn);
    45. printf("请问确定要删除吗?y/n\n");
    46. safe_flush(stdin);
    47. scanf("%c",&a);
    48. if (a=='n')
    49. {
    50. return;
    51. }
    52. else if (a=='y')
    53. {
    54. while (d!=NULL && i1)
    55. {
    56. i++;
    57. d=d->pNext;
    58. }
    59. /*printf("i%d pos%d\n",i,pos);*/
    60. d->pNext=d->pNext->pNext;
    61. free(s);
    62. s=NULL;
    63. rewrite(path,pHeader);
    64. printf("删除成功!\n");
    65. }
    66. else
    67. {
    68. printf("Error!/n");
    69. }
    70. }
    71. }

    九.学生管理系统修改学生信息

    修改也是要找到位置,然后重新写入时写到要修改的位置时把数据换成新输入的数据. 

    1. /************************************************************************/
    2. /*修改学生信息*/
    3. /************************************************************************/
    4. void alterwrite(char* infoPath,pStu pHeader,int* pos)
    5. {
    6. FILE*fp;
    7. pStu rep;
    8. Stu ss;
    9. int i=-1;
    10. printf("请依次输入学生ID 姓名 性别 语文 数学 外语成绩\n");
    11. scanf("%s %s %s %d %d %d",ss.ID,ss.name,ss.sex,&ss.scoreCh,&ss.scoreMa,&ss.scoreEn);
    12. fp=fopen(infoPath,"w");
    13. if (fp==NULL)
    14. {
    15. printf("fopen error\n");
    16. }
    17. rep=pHeader->pNext;
    18. while (rep!=NULL)
    19. {
    20. i++;
    21. if (i==(*pos))
    22. {
    23. strcpy(rep->ID,ss.ID);
    24. strcpy(rep->name,ss.name);
    25. strcpy(rep->sex,ss.sex);
    26. rep->scoreCh=ss.scoreCh;
    27. rep->scoreMa=ss.scoreMa;
    28. rep->scoreEn=ss.scoreEn;
    29. }
    30. fprintf(fp,"%s %s %s %d %d %d\n",rep->ID,rep->name,rep->sex,rep->scoreCh,rep->scoreMa,rep->scoreEn);
    31. rep=rep->pNext;
    32. }
    33. fclose(fp);
    34. }
    35. void alterStu(char* path)
    36. {
    37. system("cls");
    38. system("color 0D");
    39. printf("-------------------------------\n");
    40. printf("\t欢迎来到学生管理系统\t\n");
    41. printf("\t\t修改学生信息\n");
    42. printf("-------------------------------\n");
    43. char ID[16];
    44. char a;
    45. printf("请输入您要修改的学生学号\n");
    46. scanf("%s",ID);
    47. int pos=0;
    48. int i=0;
    49. pStu s=checkXuehao(ID,&pos);
    50. pStu d=pHeader;
    51. if (s==NULL)
    52. {
    53. printf("您输入的学号不存在\n");
    54. }
    55. else
    56. {
    57. printf("您要修改的学生信息如下:\n");
    58. printf("%8s%8s%8s%8s%8s%8s\n","学号","姓名","性别","语文","数学","外语");
    59. printf("%8s%8s%8s%8d%8d%8d\n",s->ID,s->name,s->sex,s->scoreCh,s->scoreMa,s->scoreEn);
    60. printf("请问确定要修改吗?y/n\n");
    61. /*printf("pos:%d\n",pos);*/
    62. safe_flush(stdin);
    63. scanf("%c",&a);
    64. if (a=='n')
    65. {
    66. return;
    67. }
    68. else if (a=='y')
    69. {
    70. alterwrite(path,pHeader,&pos);
    71. printf("修改成功!\n");
    72. }
    73. else
    74. {
    75. printf("Error!/n");
    76. }
    77. }
    78. }


    今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!  

  • 相关阅读:
    MATLAB常用命令大全,非常详细(持续更新中)
    JavaScript 基本数据类型 和基本包装类型
    牛客刷题<十>使用函数实现数据大小端转换
    Oracle-RAC集群不同节点数据查询不一致
    neo4j学习记录
    搜索算法总结
    el-cascader组件根据最后一级向上找到父级并设置默认值
    【Vue】事件处理
    万字长文教你实现华为云IoT+OpenHarmony智能家居开发
    [附源码]计算机毕业设计勤工俭学管理小程序Springboot程序
  • 原文地址:https://blog.csdn.net/qq_62099321/article/details/126027238