• C++期末课设—图书管理系统


    期末将至,还有人为不知道如何写课设而头疼吗,这里给大家带来一个最简单基础的课设项目,图书管理系统。

    功能分析

    一般来说,简单的图书管理系统有以下几个功能:

    1、用户管理

    2、读者管理

    3、图书管理

    4、图书借还管理

     因此我们的菜单页面可以这样写(以用户管理为例)

    Menu.c

    1. #include "Menu.h"
    2. //提示选择
    3. int select()
    4. {
    5. int op = -1;
    6. printf("select>");
    7. scanf("%d", &op);
    8. return op;
    9. }
    10. //主菜单
    11. int mainMenu()
    12. {
    13. printf("**********************************\n");
    14. printf("* 1.用户管理 *\n");
    15. printf("* 2.读者管理 *\n");
    16. printf("* 3.图书管理 *\n");
    17. printf("* 4.图书流通管理 *\n");
    18. printf("* 5.退出系统 *\n");
    19. printf("**********************************\n");
    20. return select();
    21. }
    22. //用户管理菜单
    23. int userMenu()
    24. {
    25. printf("**********************************\n");
    26. printf("* 1.用户信息输入 *\n");
    27. printf("* 2.用户信息修改 *\n");
    28. printf("* 3.用户信息删除 *\n");
    29. printf("* 4.用户信息显示 *\n");
    30. printf("* 5.用户密码修改 *\n");
    31. printf("* 6.返回主菜单 *\n");
    32. printf("**********************************\n");
    33. return select();
    34. }
    35. //读者管理菜单
    36. //以此类推

    那我们怎么从主页面进入用户管理呢,用下面的代码

    Main.c

    1. #include"Menu.h"
    2. #include
    3. #include
    4. #include"UserManage.h"
    5. UserManage userManage; //用户管理
    6. void quit()
    7. {
    8. exit(0);
    9. }
    10. void init()
    11. {
    12. userManage_init(&userManage);
    13. }
    14. void run()
    15. {
    16. int op = mainMenu();
    17. switch (op)
    18. {
    19. case 1: //用户管理
    20. userManage_operation(&userManage);
    21. break;
    22. case 2:
    23. break;
    24. case 3:
    25. break;
    26. case 4:
    27. break;
    28. case 5:
    29. quit();
    30. break;
    31. }
    32. }
    33. void print(void* val)
    34. {
    35. printf("%d ", (int)val);
    36. }
    37. int main()
    38. {
    39. init();
    40. while (true)
    41. {
    42. run();
    43. }
    44. return 0;
    45. }

    这样我们根据输入的数字即可判断下一步实现哪个功能,进入用户管理后,我们要对用户数据进行录入,代码如下

    UserManage.c

    1. #include "UserManage.h"
    2. #include"Menu.h"
    3. #include
    4. void userManage_init(UserManage* umage)
    5. {
    6. list_init(&umage->userList);
    7. //读取文件
    8. userManage_loadData(umage,"./data/user.txt");
    9. }
    10. void userManage_loadData(UserManage* umage,const char* filename)
    11. {
    12. FILE* fp = fopen(filename, "r");
    13. if (!fp)
    14. {
    15. perror("file open failed\n");
    16. return;
    17. }
    18. //读取数据
    19. //把表头读出来,并丢掉
    20. char buf[BUFSIZ] = { 0 };
    21. fgets(buf, BUFSIZ, fp);
    22. //读取正式的内容
    23. while (!feof(fp))
    24. {
    25. fgets(buf, BUFSIZ, fp);
    26. //如果成功,放入链表
    27. list_pushBack(&umage->userList, user_fromString(buf));
    28. }
    29. fclose(fp);
    30. }
    31. void userManage_operation(UserManage* umage)
    32. {
    33. bool isDone = false;
    34. while (!isDone)
    35. {
    36. int op = userMenu();
    37. switch (op)
    38. {
    39. case 1:
    40. userManage_input(umage);
    41. break;
    42. case 2:
    43. userManage_modify(umage);
    44. break;
    45. case 3:
    46. userManage_remove(umage);
    47. break;
    48. case 4:
    49. userManage_show(umage);
    50. break;
    51. case 5:
    52. userManage_modifyPassword(umage);
    53. break;
    54. case 6:
    55. isDone = true;
    56. break;
    57. }
    58. }
    59. }
    60. void userManage_input(UserManage* umage)
    61. {
    62. printf("请输入用户(用户ID、密码、类型)>");
    63. User* user = createEmptyUser();
    64. scanf("%lu %s %d", &user->number, user->password, &user->type);
    65. list_pushBack(&umage->userList, user);
    66. printf("用户添加成功!\n");
    67. }
    68. void userManage_modify(UserManage* umage)
    69. {
    70. }
    71. void userManage_remove(UserManage* umage)
    72. {
    73. }
    74. void userManage_show(UserManage* umage)
    75. {
    76. list_transfrom(&umage->userList, user_print);
    77. }
    78. void userManage_modifyPassword(UserManage* umage)
    79. {
    80. }

    将数据存储

    User.c

    1. #include "User.h"
    2. #include
    3. #include
    4. User* createEmptyUser()
    5. {
    6. User* user = calloc(1, sizeof(User));
    7. if (!user)
    8. {
    9. printf("user create failed\n");
    10. return NULL;
    11. }
    12. return user;
    13. }
    14. User* user_fromString(const char* str)
    15. {
    16. //创建一个空User
    17. User* user = createEmptyUser();
    18. //分割字符串
    19. int ret = sscanf(str, "%lu %s %d", &user->number, user->password, &user->type);
    20. if (ret <= 0)
    21. {
    22. printf("sscanf failed\n");
    23. free(user);
    24. return NULL;
    25. }
    26. return user;
    27. }
    28. void user_print(User* user)
    29. {
    30. printf("%lu %s %d\n", user->number, user->password, user->type);
    31. }

     最后加上

    List.c

    1. #include "List.h"
    2. #include
    3. void list_init(List* list)
    4. {
    5. list->size = 0;
    6. list->front = list->tail = calloc(1, sizeof(Node));
    7. if (list->front == NULL)
    8. {
    9. printf("head create failed\n");
    10. return;
    11. }
    12. }
    13. Node* createNode(void* val)
    14. {
    15. Node* newNode = calloc(1, sizeof(Node));
    16. if (!newNode)
    17. {
    18. printf("newNode create failed\n");
    19. return NULL;
    20. }
    21. newNode->data = val;
    22. return newNode;
    23. }
    24. void list_pushBack(List* list, void* val)
    25. {
    26. Node* newNode = createNode(val);
    27. newNode->next = list->tail->next;
    28. list->tail->next = newNode;
    29. list->tail = newNode;
    30. list->size++;
    31. }
    32. void list_transfrom(List* list, LISTCALLBACK fun)
    33. {
    34. Node* curNode = list->front->next;
    35. while (curNode)
    36. {
    37. fun(curNode->data);
    38. curNode = curNode->next;
    39. }
    40. }

    到这里我们源文件已经写到位了,接下来是头文件的引用

    List.h

    1. #pragma once
    2. //用户 读者 图书 借还信息 有四种数据(如何定义一个链表,能够装所有的类型)
    3. //定义节点
    4. typedef struct Node
    5. {
    6. void* data; //万能指针,指向任意数据的地址 void*
    7. struct Node* next; //后继节点指针
    8. }Node;
    9. typedef struct List
    10. {
    11. int size; //节点个数
    12. Node* front; //头指针
    13. Node* tail; //尾指针
    14. }List;
    15. typedef void (*LISTCALLBACK)(void*);
    16. void list_init(List* list);
    17. void list_pushBack(List* list,void* val);
    18. void list_transfrom(List* list, LISTCALLBACK fun);

    Menu.h

    1. #ifndef _MENU_H_
    2. #define _MENU_H_ //预处理指令,防止头文件重复包含
    3. #include
    4. //提示选择
    5. int select();
    6. //主菜单
    7. int mainMenu();
    8. //用户管理菜单
    9. int userMenu();
    10. #endif // !_MENU_H_

    User.h

    1. #pragma once
    2. /*@枚举用户类型*/
    3. enum UserType
    4. {
    5. UT_SysAdminUser = 1, //系统管理员
    6. Ut_BookAdminUser, //图书管理员
    7. Ut_CommonUser //普通用户
    8. };
    9. /*@用户*/
    10. typedef struct User
    11. {
    12. unsigned long number; //用户编号
    13. char password[20]; //用户密码
    14. int type; //用户类型
    15. }User;
    16. User* createEmptyUser();
    17. User* user_fromString(const char* str);
    18. void user_print(User* user);

    UserManage.h

    1. #pragma once
    2. #include"List.h"
    3. #include"User.h"
    4. typedef struct UserManage
    5. {
    6. List userList; //存储所有用户
    7. }UserManage;
    8. void userManage_init(UserManage* umage);
    9. void userManage_loadData(UserManage* umage,const char* filename);
    10. //用户管理操作
    11. void userManage_operation(UserManage* umage);
    12. //用户信息输入
    13. void userManage_input(UserManage* umage);
    14. //用户信息修改
    15. void userManage_modify(UserManage* umage);
    16. //用户信息删除
    17. void userManage_remove(UserManage* umage);
    18. //用户信息显示
    19. void userManage_show(UserManage* umage);
    20. //用户密码修改
    21. void userManage_modifyPassword(UserManage* umage);

    到这里这个系统已经完成了第一部分的功能,后续功能实现大家可以自己动手尝试一下哦!

    进企鹅群【768440837】,为你的课设节省一点时间~

    免费自学资源获取,可问问题,群友共同交流! 共同学习进步!

    今天的分享到这里就结束啦,觉得此文对你有帮助的同学可以点赞支持一下~

  • 相关阅读:
    【Cicadaplayer】avpkt 队列(mPacketQueue)的条件等待(wait)
    杰理之内置短按再长按,不管长按多长时间都是短按【篇】
    利用setjmp和longjmp实现一个简单的协程
    【JVM】经典垃圾收集器
    [算法】查找元素
    Spring5源码3-BeanDefinition
    java-net-php-python-springboot班级信息系统计算机毕业设计程序
    .Net Core 使用 TagProvider 与 Enricher 丰富日志
    华为交换机:STP的详解和试验
    Unity Android(九)USB权限弹窗问题
  • 原文地址:https://blog.csdn.net/kxtxdy/article/details/127446012