如何使用C语言实现学生管理系统

本篇内容介绍了“如何使用C语言实现学生管理系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!登陆界面在写学生管理系统时,

本篇内容介绍了“如何使用C语言实现学生管理系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

登陆界面

在写学生管理系统时,我首先写的是登陆界面,学生管理系统有三个身份的id,分别是管理员,老师,与学生。我的想法是输入账号,系统可以自动识别账户的身份,所以我的结构体设计如下:

  1. struct personid {       // 账户数据结构
  2.     char id[20];
  3.     char cypher1[20];
  4.     char quanxian[20];
  5.     char classnum[20];
  6.     struct personid *next;
  7. };

用字符串存储账号,密码,权限,以及学号或者班级。
在登陆前首先应该用链表提取文件中的账号。代码如下:

  1. struct personid *Create(char name[]) {  //从文件中读取账户;
  2.     FILE *fp = fopen(name, "r");
  3.     if (fp == NULL) {
  4.             printf("不存在文件%s\\n", name);
  5.             exit(1);
  6.     }
  7.     struct personid *head = (struct personid*)malloc(sizeof(struct personid));
  8.     head->next = NULL;
  9.     while (!(feof(fp))) {
  10.         struct personid *= (struct personid*)malloc(sizeof(struct personid));
  11.         fscanf(fp, "%s %s %s %s\\n", p->id, p->cypher1, p->quanxian, p->classnum);
  12.         p->next = head->next;
  13.         head->next = p;
  14.     }
  15.     fclose(fp);
  16.     return  head;
  17. }

下面是登陆界面的代码:

  1. void menu() {     //初始界面
  2.     printf("--------[欢迎进入学生管理系统]--------\\n");
  3.     printf("1.登录账户\\n");
  4.     printf("2.注册账户\\n");
  5.     printf("3.修改密码\\n");
  6.     printf("4.找回密码\\n");
  7.     printf("0.退出系统\\n");
  8.     printf("----------------------------------\\n");
  9.     setbuf(stdin, NULL);
  10.     keydown();
  11. }
  12. void keydown() {
  13.     char choice[50];
  14.     scanf("%s", choice);
  15.     setbuf(stdin, NULL);
  16.     if (choice[1] == '\\0') {
  17.         switch (choice[0]) {
  18.             case '0':
  19.                 exit(0);
  20.                 break;
  21.             case '1':
  22.                 denglu();
  23.                 break;
  24.             case '2':
  25.                 zhuce();
  26.                 break;
  27.             case '3':
  28.                 xiugai();
  29.                 break;
  30.             case '4':
  31.                 zhaohui();
  32.                 break;
  33.             default:
  34.                 printf("无效输入\\n");
  35.                 menu();
  36.                 break;
  37.         }
  38.     } else {
  39.         printf("无效输入\\n");
  40.         menu();
  41.     }
  42.     
  43. }

在写系统时一定要注意程序的稳定性,我的程序是通过不断输入来进行操作的,一开始我在写代码时,利用的是getchar函数来进行输入,造成了输入多个字符之后程序就会崩掉的问题,在后来修改时,将所有的getchar函数换成的scanf来输入,这样可以保证程序的稳定性,在进行判断时只需判断输入的是否是一个字符且有这个操作即可。
在macOS系统下可以利用setbuf(stdin, NULL) 来清除缓冲区。

注册操作

如果新用户进入程序,那么首先进行的操作就是注册操作,我在最开始写注册操作时,是让 用户自己输入自己的身份 ,这样的写法是很失败的,如果学生进行操作,也可以注册管理员,是很不严谨的!
后来在修改时,利用了不同的邀请码注册不同的身份,用户无需输入身份,学生只需输入自己的学号,老师则需要选择自己对应的班级。

代码如下:

  1. void zhuce() {
  2.     printf("请输入邀请码:\\n");
  3.     int yaoqingma1 = 111;
  4.     int yaoqingma2 = 222;
  5.     int yaoqingma3 = 333;
  6.     int x;
  7.     scanf("%d", &x);
  8.     if (!= yaoqingma1 && x != yaoqingma2 && x != yaoqingma3) {
  9.         printf("无效邀请码,请联系导员:\\n");
  10.         setbuf(stdin, NULL);
  11.         menu();
  12.     }
  13.     if (== 111 || x ==222 || x == 333) {
  14.         printf("please input the id with number:");
  15.         char id[20];
  16.         char id1[20];
  17.         char id2[20];
  18.         char id3[20] = "\\n";
  19.         char id4[20] = "0";
  20.         char id6[20];
  21.         scanf("%s", id);
  22.         printf("please input the password:");
  23.         scanf("%s", id1); next1:
  24.         if (== 111) {
  25.             strcpy(id2, qx1);
  26.             printf("请输入学号\\n");
  27.             scanf("%s", id4);
  28.             struct personid *= Create(zhroad);
  29.             while (p) {
  30.                 if (!strcmp(id4, p->classnum)) {
  31.                     printf("该学号已被注册,按0返回上一层,任意键重新输入\\n");
  32.                     setbuf(stdin, NULL);
  33.                     char a;
  34.                     a = getchar();
  35.                     if (== '0') {
  36.                         menu();
  37.                     }
  38.                     setbuf(stdin, NULL);
  39.                     goto next1;
  40.                 }
  41.                 p = p->next;
  42.             }
  43.         } else if (== 222) {
  44.             printf("请选择您的班级\\n");
  45.             printf("1.网络1班\\n");
  46.             printf("2.网络2班\\n");
  47.             printf("3.网络3班\\n");
  48.             printf("4.网络4班\\n");
  49.             printf("5.网络5班\\n");
  50.             scanf("%s", id6);
  51.             if (id6[1] == '\\0') {
  52.                 if (id6[0] == '1' || id6[0] == '2' || id6[0] == '3' || id6[0] == '4' || id6[0] == '5') {
  53.                     setbuf(stdin, NULL);
  54.                     strcpy(id4, id6);
  55.                 } else {
  56.                     setbuf(stdin, NULL);
  57.                     printf("该班级不存在.\\n");
  58.                     menu();
  59.                 }
  60.             } else {
  61.                 printf("该班级不存在\\n");
  62.                 setbuf(stdin, NULL);
  63.                 menu();
  64.             }
  65.             strcpy(id2, qx2);
  66.         } else if (== 333) {
  67.             strcpy(id2, qx3);
  68.         }
  69.         AppendDataToFile(zhroad, id);
  70.         AppendDataToFile(zhroad, kong);
  71.         AppendDataToFile(zhroad, id1);
  72.         AppendDataToFile(zhroad, kong);
  73.         AppendDataToFile(zhroad, id2);
  74.         AppendDataToFile(zhroad, kong);
  75.         AppendDataToFile(zhroad, id4);
  76.         AppendDataToFile(zhroad, id3);
  77.         printf("注册成功请重新登陆!\\n");
  78.         setbuf(stdin, NULL);
  79.         menu();
  80.     }
  81. }

在进行学生注册时,应该对学生输入的学号进行一个判断,判断该学号是否被注册,若被注册应该重新输入。
在进行老师注册时,应该让老师选择已有的班级,如果没有则重新输入。
在注册成功后利用文件将已经注册的账号存储起来

学生界面的一些操作

学生主要可以进行下面几种操作:

  1. void studentmenu() {        //学生操作界面
  2.     printf("-----[good afternoon student ]-----\\n");
  3.     printf("1.查询成绩\\n");
  4.     printf("2.查询本班成绩\\n");
  5.     printf("3.成绩分析\\n");
  6.     printf("4.成绩申诉\\n");
  7.     printf("5.返回上一层:\\n");
  8.     printf("0.退出系统\\n");
  9.     printf("----------------------------------\\n");
  10.     studentkeydown();
  11.     }

在最初写代码时,我是让学生输入自己的学号来进行成绩查询,如果是考输入学号来查询的话,那么也可以输入别人的成绩,查询别人班的成绩,如果这样写,那学生的操作就和老师甚至管理员无异。
在最后修改代码时,我将学生的学号和账号绑定,在进行成绩查询等操作时,无需输入自己的学号,

教师界面的一些操作

教师界面的主要功能如下

  1. void teachermenu() {           //老师操作界面
  2.     printf("-----[good afternoon teacher]-----\\n");
  3.     printf("1.增加新的学生信息\\n");
  4.     printf("2.删除学生信息\\n");
  5.     printf("3.修改学生信息\\n");
  6.     printf("4.查询学生信息\\n");
  7.     printf("5.输出本班成绩\\n");
  8.     printf("6.成绩分析\\n");
  9.     printf("7.提醒管理员更新成绩\\n");
  10.     printf("8.返回上一层:\\n");
  11.     printf("0.退出系统\\n");
  12.     printf("----------------------------------\\n");
  13.     setbuf(stdin, NULL);
  14.     teacherkeydown();
  15. }

在一开始写代码时,和上面的学生操作类似,我是让老师输入班级或者老师输入学号来进行相关操作的,这样书写的话老师就成为了一个万能老师,可以查询文件中所存储的所有学生信息,现实中不存在教整个学校的老师,并且这样与管理员的功能冲突。
在后来修改代码时,我在老师注册时让老师选择了班级,我们将这个班级与老师的账号绑定,并且规定老师只能查询自己班学生的成绩,若输入其他班的成绩,则会进行相应的错误提醒。
老师操作界面代码如下:

  1. void teacherkeydown() { //教师输入选择界面
  2.     char *x;
  3.     char *a;
  4.     x = allclassnum;
  5.     struct student *temp1 = NULL;
  6.     char str2[200];
  7.     char str1[100];
  8.     setbuf(stdin, NULL);
  9.     scanf("%s", str1);
  10.     if (str1[1] == '\\0') {
  11.         switch (str1[0]) {
  12.             case '0':
  13.                 exit(0);
  14.                 break;
  15.             case '1':
  16.                 a = classnum(x);
  17.                 temp1 = mescreate(a);
  18.                 temp1 = addnode(temp1);
  19.                 writetoclassfile(temp1, a);
  20.                 teachermenu();
  21.                 break;
  22.             case '2':
  23.                 a = classnum(x);
  24.                 temp1 = mescreate(a);
  25.                 temp1 = delnode(temp1);
  26.                 writetoclassfile(temp1, a);
  27.                 teachermenu();
  28.                 break;
  29.             case '3':
  30.                 a = classnum(x);
  31.                 temp1 = mescreate(a);
  32.                 temp1 = changenode(temp1);
  33.                 writetoclassfile(temp1, a);
  34.                 teachermenu();
  35.                 break;
  36.             case '4':
  37.                 printf("please input student studyid:\\n");
  38.                 char studyid[20];
  39.                 scanf("%s", studyid);
  40.                 if (studyid[1] == allclassnum[0] && studyid[0] == '0' && strlen(studyid) < 6) {
  41.                     printpersonnalsocre(studyid);
  42.                     teachermenu();
  43.                 } else {
  44.                     printf("不是您的学生或者学号不存在\\n");
  45.                     teachermenu();
  46.                 }
  47.                 
  48.                 break;
  49.             case '5':
  50.                 a = classnum(x);
  51.                 temp1 = mescreate(a);
  52.                 temp1 = sort4(temp1);
  53.                 Printall(temp1);
  54.                 setbuf(stdin, NULL);
  55.                 teachermenu();
  56.                 break;
  57.             case '6':
  58.                 a = classnum(x);
  59.                 temp1 = mescreate(a);
  60.                 chengjifenxi(temp1);
  61.                 teachermenu();
  62.                 break;
  63.             case '7':
  64.                 FILE *fp1;
  65.                 fp1 = fopen(shensu, "w");
  66.                 printf("please input the wrong\\n");
  67.                 scanf("%s", str2);
  68.                 fprintf(fp1, "%s\\n", str2);
  69.                 printf("您的提醒已经发送!");
  70.                 break;
  71.             case '8':
  72.                 menu();
  73.                 break;
  74.             default:
  75.                 printf("输入有误请重新输入\\n");
  76.                 teachermenu();
  77.                 break;
  78.             }
  79.     } else {
  80.         printf("输入有误请重新输入\\n");
  81.         teachermenu();
  82.     }
  83. }

管理员的一些操作

管理员的主要功能如下:

  1. void guanlidaiban() {
  2.     printf("-----[good afternoon manager ]----\\n");
  3.     printf("1.密码注册\\n");
  4.     printf("2.密码修改\\n");
  5.     printf("3.密码找回\\n");
  6.     printf("4.成绩申诉\\n");
  7.     printf("5.更新成绩库\\n");
  8.     printf("0.退出系统\\n");
  9.     printf("----------------------------------\\n");
  10.     keydowmdaiban();
  11. }
  12. void guanlimenu() {
  13.     printf("-----[good afternoon manager ]----\\n");
  14.     printf("1.代办选项\\n");
  15.     printf("2.增加账号和密码\\n");
  16.     printf("3.删除账号和密码\\n");
  17.     printf("4.修改账号和密码\\n");
  18.     printf("5.输出所有账号和密码\\n");
  19.     printf("6.录入所有的账号和密码\\n");
  20.     printf("7.进入教师用户端\\n");
  21.     printf("a.返回上一层\\n");
  22.     printf("0.退出系统\\n");
  23.     printf("----------------------------------\\n");
  24.     guanlikeydown();
  25. }

管理员相比较于教师,可以对账号进行操作,并且可以查询所有班的成绩,在最开始设计时,我将管理员的操作写的跟学生教师冲突,尤其是进入教师用户端,进入教师用户端的代码如下。

  1. printf("请选择您想进行操作的班级\\n");
  2.                 printf("1.网络1班\\n");
  3.                 printf("2.网络2班\\n");
  4.                 printf("3.网络3班\\n");
  5.                 printf("4.网络4班\\n");
  6.                 printf("5.网络5班\\n");
  7.                 scanf("%s", choice1);
  8.                 if (choice1[1] != '\\0') {
  9.                     printf("班级不存在请重新输入\\n");
  10.                     goto  next1;
  11.                 } else if (choice1[0] == '1' || choice1[0] == '2' || choice1[0] == '3' || choice1[0] == '4' || choice1[0] == '5') {
  12.                     allclassnum[0] = choice1[0];
  13.                     teachermenu();
  14.                 } else {
  15.                     printf("班级不存在请重新输入\\n");
  16.                     goto  next1;
  17.                 }

管理员可以选择班级进行查看,当管理员选择后我将全局变量allclassnum(记录教师班级)改成了相对应操作的班级然后进入教师端。

“如何使用C语言实现学生管理系统”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注恰卡网网站,小编将为大家输出更多高质量的实用文章!

本站部分文章来自网络或用户投稿,如无特殊说明或标注,均为本站原创发布。涉及资源下载的,本站旨在共享仅供大家学习与参考,如您想商用请获取官网版权,如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
开发者

Android Jetpack库之ViewModel组件怎么使用

2022-7-23 1:18:12

开发者

Python浅析生成器generator如何使用

2022-7-23 1:18:16

搜索