zoukankan      html  css  js  c++  java
  • 我的学生信息管理系统总结

    我的学生管理系统总结


    花了一天时间用C语言做了一个学生信息管理系统,有一些想要总结的地方,在此记录一下。 
    尽管是一个简单的系统,简单到仅仅有增删改查功能。而且。保存数据的地方不是数据库,而是文件,可是,我还是依照了做大型项目时採用的“三层架构”的思路来写:大体上就是:底层,和数据库打交道。中间层,处理用户输入的业务逻辑,并将错误信息反馈给用户;表面层,就是和将界面展现给用户,接受用户的输入。 
    以下是,总结的一些好的代码:

    1、推断键盘连续两次输入回车(也能够用来推断连续两次输入某字符)。

    1. void back_button()/*在子菜单下,用户按两下回车键,返回主菜单*/
    2. {
    3. printf("Please press "Enter button" two times to back previous menu. ");
    4. char ch;
    5. do
    6. {
    7. while (fflush(stdin), ch = getch(), ch != ' ');
    8. if ((ch = getch()) == ' '){
    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: ");
    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()加入的' '去掉*/
    13. if (strlen(stu_name) == 0){
    14. printf("Student's name cannot empty!Please input again. ");
    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: ");
    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. ");
    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. ");
    10. goto loop_modify_name;
    11. }

    5、这一大段代码,很完美的模拟了用户输入username密码进行登录时的情景。当中包含了,同意用户有三次输错的机会、模拟将用户的输入信息转换成‘*’在屏幕上显示(包含按退格键时。‘*’跟着降低,密码输入过长。停止输入。而且有提示音等细节功能)。

    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()) != ' '){/*用户没有输入回车键时。继续监測键盘*/
    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 = '';
    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);/*获取username*/
    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. ");
    70. }
    71. else{
    72. printf(" Password wrong,please try again!you have %d times. ", 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. ");
    84. }
    85. else{
    86. printf(" User name is not exist,please try again!you have %d times. ", count);
    87. system("pause");
    88. }
    89. }
    90. } while (count);
    91. exit(-1);
    92. }
  • 相关阅读:
    [转]C++ Operator Overloading Guidelines
    SICP学习笔记(2.2.1)
    .net中模拟键盘和鼠标操作
    javaScript系列 [17]运算符
    javaScript系列 [24]Math
    javaScript系列 [19]string
    javaScript系列 [22]引用类型
    javaScript系列 [12]Canvas绘图(曲线)
    javaScript系列 [15]Canvas绘图(压缩)
    javaScript系列 [21]Array
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10862999.html
Copyright © 2011-2022 走看看