我的学生信息管理系统总结

我的学生管理系统总结



花了一天时间用C语言做了一个学生信息管理系统,有一些想要总结的地方,在此记录一下。

虽然是一个简单的系统,简单到只有增删改查功能,而且,保存数据的地方不是数据库,而是文件,但是,我还是按照了做大型项目时采用的“三层架构”的思路来写:大体上就是:底层,和数据库打交道;中间层,处理用户输入的业务逻辑,并将错误信息反馈给用户;表面层,就是和将界面展现给用户,接受用户的输入。

下面是,总结的一些好的代码:

1、判断键盘连续两次输入回车(也可以用来判断连续两次输入某字符)。

  1. void back_button()/*在子菜单下,用户按两下回车键,返回主菜单*/
  2. {
  3. printf("Please press \"Enter button\" two times to back previous menu.\n");
  4. char ch;
  5. do
  6. {
  7. while (fflush(stdin), ch = getch(), ch != ‘\r‘);
  8. if ((ch = getch()) == ‘\r‘){
  9. break;
  10. }
  11. } while (1);
  12. system("cls");
  13. }

2、用fgets()接受屏幕输入信息,一方面可以限制输入长度,一方面也能判断用户是直接按下回车键,还是直接按下Ctrl+Z.

  1. void sub_choose_1()/*子菜单1:根据学生姓名搜索学生信息*/
  2. {
  3. system("cls");
  4. char stu_name[STU_NAME_SIZE];
  5. memset(stu_name,0,STU_NAME_SIZE);/*将字符串初始化为0*/
  6. loops_search_stu_name:printf("Please input a name for search: \n");
  7. fflush(stdin);
  8. fgets(stu_name, STU_NAME_SIZE, stdin);
  9. if (stu_name[0] == 0){
  10. return;
  11. }
  12. strProcess(stu_name);/*将fgets()添加的‘\n‘去掉*/
  13. if (strlen(stu_name) == 0){
  14. printf("Student‘s name cannot empty!Please input again.\n");
  15. goto loops_search_stu_name;
  16. }
  17. stu_pNode stu;
  18. stu = searchStuInfoByName(stuList,stu_name);
  19. showAllStuInfo(stu);
  20. back_button();
  21. }

3、上一个函数是对输入字符串时的错误信息进行判断,这个函数是对输入数时的错误信息进行判断。

(总结一下,由于fgets()的返回值是输入字符串的指针或者NULL,所以没法用返回值进行判断,也就没法用while循环。而scanf()函数的返回值是:正确接受时,返回接受的个数,没正确接受时,返回0,遇到Ctrl+Z时,返回EOF(即-1),所以,可以用循环进行处理)

  1. void sub_choose_2()/*子菜单2:根据学生学号搜索学生信息*/
  2. {
  3. system("cls");
  4. int stu_id, input_info;
  5. printf("Please input a sno for search: \n");
  6. printf("Sno: ");
  7. while (fflush(stdin), input_info = scanf("%d", &stu_id), input_info == EOF || input_info != 1){
  8. if (input_info == EOF){
  9. return;
  10. }
  11. printf("Sno is a number,please input again.\n");
  12. printf("Sno: ");
  13. }
  14. stu_pNode stu;
  15. stu = searchStuInfoById(stuList,stu_id);
  16. showOneStuInfo(stu);
  17. back_button();
  18. }

4、这段代码,对fgets()的返回值进行了非常细的划分。

  1. loop_modify_name:printf("Name: ");
  2. if (fflush(stdin), fgets(new_stu.stu_name, STU_NAME_SIZE, stdin)){/*用户敲回车,此条件成立*/
  3. strProcess(new_stu.stu_name);
  4. }
  5. else{/*用户输入Ctrl+Z,此条件成立*/
  6. strcpy(new_stu.stu_name, stu_info->stu_name);
  7. }
  8. if (strlen(new_stu.stu_name) == 0){
  9. printf("Name must be not empty.If don‘t want to modify,press Ctrl+Z.\n");
  10. goto loop_modify_name;
  11. }

5、这一大段代码,非常完美的模拟了用户输入用户名密码进行登录时的情景。其中包括了,允许用户有三次输错的机会、模拟将用户的输入信息转换成‘*’在屏幕上显示(包括按退格键时,‘*’跟着减少,密码输入过长,停止输入,并且有提示音等细节功能)。

  1. void userNameprocess(char *str)
  2. {
  3. while (*str != 10){
  4. ++str;
  5. }
  6. *str = 0;
  7. }
  8. void backspace(int *length,char **ch)
  9. {
  10. --(*ch);
  11. --(*length);
  12. putchar(8);
  13. putchar(32);
  14. putchar(8);
  15. }
  16. void passwordGets(char *psw)
  17. {
  18. char ch;
  19. int psw_length = 0, sign = 0;
  20. while ((ch = getch()) != ‘\r‘){/*用户没有输入回车键时,继续监测键盘*/
  21. if (psw_length < USER_PASSWORD_LEN - 1){/*允许输入的最大长度限制*/
  22. if (ch == 8){/*如果是退格键*/
  23. if (psw_length >0){
  24. sign = 1;
  25. backspace(&psw_length, &psw);
  26. }
  27. else{/*长度小于0,即退格到开头了,响铃警报*/
  28. putchar(7);
  29. }
  30. }
  31. else{/*不是退格键,继续前进*/
  32. sign = 0;
  33. *(psw++) = ch;
  34. ++psw_length;
  35. }
  36. if (!sign){/*退格键标记,当用户按下退格键时,不再打印‘*‘.*/
  37. putchar(‘*‘);
  38. }
  39. }
  40. else if (ch == 8){/*长度超过限制,为能重新输入,即满足输入条件(lentgh<psw_length < USER_PASSWORD_LEN - 1),在按退格键时,退一格*/
  41. backspace(&psw_length, &psw);
  42. }
  43. else{/*长度已经超过最大限制了,如继续输入非回车非退格键,则响铃警报*/
  44. putchar(7);
  45. }
  46. }
  47. *psw = ‘\0‘;
  48. }
  49. int login()
  50. {
  51. char user_name[USER_NAME_SIZE];
  52. char user_password[USER_PASSWORD_LEN];
  53. user_pNode user;
  54. int count = 3;
  55. do{
  56. --count;
  57. system("cls");
  58. printf("enter user_name: ");
  59. fgets(user_name, USER_NAME_SIZE + 1, stdin);/*获取用户名*/
  60. userNameprocess(user_name);
  61. system("cls");
  62. printf("enter usr_password: ");
  63. passwordGets(user_password);/*获取用户密码*/
  64. user = searchUserAccountInfoByName(userList, user_name);
  65. if (user){
  66. if (strcmp(user->user_password, user_password) != 0){
  67. if (count == 0){
  68. system("cls");
  69. printf("You have already input Wrong 3 times,system will be exit.\n");
  70. }
  71. else{
  72. printf("\nPassword wrong,please try again!you have %d times.\n", count);
  73. system("pause");
  74. }
  75. }
  76. else{
  77. return user->role_type;
  78. }
  79. }
  80. else{
  81. if (count == 0){
  82. system("cls");
  83. printf("You have already input Wrong 3 times,system will be exit.\n");
  84. }
  85. else{
  86. printf("\nUser name is not exist,please try again!you have %d times.\n", count);
  87. system("pause");
  88. }
  89. }
  90. } while (count);
  91. exit(-1);
  92. }

我的学生信息管理系统总结

时间: 2024-08-08 13:50:51

我的学生信息管理系统总结的相关文章

学生信息管理系统修改

北京工业大学耿丹学院 c语言设计课程报告   课程设计名称:高级语言程序设计 专业班级:计算机科学与技术1 姓名:吴双 学号:150809201   2016年5月10日 一 对c语言指针链表的体会 ------------------------ 二 修改学生信息管理系统 ------------------------ 三 体会 ------------------------ 一 对c语言指针链表的体会 1.指针 简单来说,指针是一个存储计算机内存地址的变量. 用 int *ptr 这种形

用基本数据结构修改后的学生信息管理系统(增删改查)

package com.xt.student.system; //创建学生类存放信息 public class Student {//声明变量private String stuNo; private String stuName; private String gender; private int age; private int score; //对变量进行封装 public String getStuNo() {return stuNo;} public void setStuNo(St

基于数据库MySQL的简易学生信息管理系统

通过这几天学习Mysql数据库,对其也有了基本的了解,为了加深印象,于是就写了一个最简易的学生信息管理系统. 一:基本要求 1.通过已知用户名和密码进行登录: 2.可以显示菜单: 3.可以随时插入学生信息: 4.可以删除学生信息: 5.可以通过学生姓名或学号显示学生所有信息: 还可以修改学生信息,添加学生表格属性等等,,,这些实现都基本类似上述的(这些不想写了,最简易的学生信息管理系统): 二:步骤 1.写一个sql脚本,包括创建数据库,使用数据库,创建学生信息表格,插入大部分学生信息. stu

学生信息管理系统

根据资料显示,那么,如果写一个字符串到一个文件中,是什么方式呢?显示到屏幕上是默认的输出文件,如果是硬盘中的一个文件,首先要打开一个文件,然后才能往里写,那么就要告诉程序这个文件在什么地方,按照什么样的方式打开(读.写.读和写.添加.覆盖等),然后打开后要给这个打开的文件一个符号(指针变量),表示后续的读和写都是针对这个文件的,而不是到屏幕的,这个指针变量以后就代表了文件自身了. 在学生信息管理系统中,需要同时保存一个学生的姓名,性别,年龄等信息,那么设置变量保存很多同学的这些信息就有点不太方便

【学生信息管理系统】EOF 和 BOF

敲完学生信息管理系统时,在删除信息的时候,经常会出现下图这样的错误,遇到问题就要解决问题.经过查阅理解了记录集Recordset的EOF和BOF属性,用这两个属性可以知道记录集中是否有信息存在. EOF和BOF属性 BOF 指示当前记录位置位于 Recordset 对象的第一个记录之前. EOF 指示当前记录位置位于 Recordset 对象的最后一个记录之后. 返回值:BOF 和 EOF 属性返回布尔型值. 使用 BOF 和 EOF 属性可确定Recordset 对象是否包含记录,或者从一个记

学生信息管理系统(四)——模块分析

学生信息管理系统已经敲完了,也进行了第一次验收,结果不是太理想.之前的总结也没有及时发表.现在重新复习一遍,把它发表. 从今天开始,我们就进入了代码分析阶段.现在我们就来分析一下模块中的几个函数. Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset 'executes SQL and returns Recordset Dim cnn As ADODB.Connection

学生信息管理系统改编

老师给的代码: #include"stdio.h" #include"stdlib.h" #include"string.h" #include"conio.h" #define PAGE 3 #define MAX 1000 #define N 5 int k=0; /*结构体类型*/ typedef struct {   int num;/*学号*/ char name[20];/*姓名*/ char sex[5];/*性

学生信息管理系统中遇到的问题解析

项目概述:做一个简单的学生信息管理系统 要求:学生信息的增删查改,成绩的增删.自动生成的编号. 工具:微软企业库与MiniUI 遇到的问题与解决方法:(前面的博文也有类似的问题和解决方法,这里不再写冗余的文字了) 1 整体思路(数据的传输思路) 我从后台说起: 数据库获取数据(DataTable) --> (ArrayList)--->Hashtable--->[业务处理]--(JSON类)解析成json-->(mini.decode)-->js对象---(页面展示) 2 唯

学生信息管理系统(第一次.....)

因为我曾经做题都不看书.结果c语言书上的最后面文件的输入输出没有看.昨天学长让我们写个管理系统.我懵了. . 就花了一个小时看了看文件的输入输出.就先写个简单的学生信息管理系统把. 假设遗漏希望各位留言指出. . 我会改进的. 因为第一次写,代码粗糙请见谅.. . 对了,我还发现一个问题,希望会的博友能回复下. 我想怎样才干把写入文件的数据在文本中换行. 我在文件后加上fputc('\n'),是实现换行了,但是在查找的时候查找不到. 希望有人可以解答. . 谢谢.! #include <stdi

Java 实现学生信息管理系统

编写一个简单的学生管理信息系统. 在oracle中设计一张学生表,以学号作为关键字. 其他学生信息有:姓名.手机号. 在进入系统时,显示如下菜单: ************************************************** =====欢迎进入学生管理信息系统===== 1. 新增学生 2. 修改学生 3. 删除学生 4. 查询学生 5. 退出系统 请选择(1-5): ************************************************** (