基于VC++控制台实现的图书信息管理系统

Firstsnow

发布日期: 2018-10-31 21:38:56 浏览量: 360
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

1 需求分析

开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。使之能提供以下基本功能:

  • 图书信息录入功能(图书信息用文件保存)--输入

  • 图书信息浏览功能--输出

  • 查询功能(至少一种查询方式)、排序功能(至少一种排序方式):

    • 按书名查询

    • 按作者名查询

    • 按照价钱排序

    • 按出版时间排序

  • 图书信息的删除与修改

扩展功能:可以按照自己的程度进行扩展。比如:

  • 简单的权限处理

  • 报表打印功能

  • 甚至根据自己情况,可以加上学生信息和借阅信息的管理,并扩充为图书借阅系统

  • 模糊查询

  • 综合查询

  • 统计功能,比如统计处某一类别的图书信息 或 筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能

需求分析如下:

  • 图书管理需要有管理员,客户,游客

  • 管理员的功能包括登录、注册、录入图书、删除图书、查看借书情况(查看借出最多与最少的图书)、修改图书信息、浏览图书信息、修改个人信息、修改学生的信息

  • 客户模块功能包括借书、还书、查询图书(价格查询、作者查询、类型查询、图书名查询)、查看自己借阅的图书、修改个人资料

  • 游客模块包括图书信息查询功能,包括价格查询、图书浏览、作者查询、图书名查询

2 概要设计

2.1 数据结构

  1. struct mima
  2. {
  3. char id[3];//账号名
  4. char phone[12];//电话
  5. char passworld[16];//密码
  6. struct mima *next;//下一个节点
  7. };
  8. struct book
  9. {
  10. int num;//图书编号
  11. char bookname[30];//图书名
  12. char author[20];作者
  13. char press[30];出版社
  14. char cate[30];类型
  15. int year, mon, day;//出版日期
  16. double price;//价格
  17. int kucun;//库存量
  18. int lend;//接触量
  19. struct book *next;
  20. };

2.2 模块划分

  1. void creatid1();//图书结构的建立
  2. void liulan();//浏览图书
  3. void login1();//管理员登录
  4. void FIND();//查找
  5. void find1();//按类别查找
  6. void find2();//按作者查找
  7. void find3();//按价格查找
  8. void READ();//浏览图书
  9. void xiugaixuesheng();//修改学生的资料
  10. void CHANGE();//修改图书信息
  11. void teacher();//老师菜单
  12. void student();//学生菜单
  13. void login2();//学生登录
  14. void creatid2();//学生注册
  15. void FINDbook();//查找图书
  16. void tour();//游客菜单
  17. void add();//添加图书
  18. void READmine();//浏览我的图书
  19. void tongji();//统计信息
  20. void tongji2();//按借出最多的统计
  21. void tongji1();//按最少的统计
  22. void INPUT(LinkList head);//插入图书,形参为要插入的链表
  23. void jieshu(LinkList head);//借书菜单,形参为图书的链表
  24. void huanshu(LinkList head);//还书菜单,形参为图书的链表
  25. void write(LinkList head);//向图书文件写入,形参为要写入文件的链表
  26. void writemy(LinkList head);//向我的图书写入,形参为 我借的图书的链表
  27. void writeid(LinkList1 head);//把管理员的信息写入文件,形参为老师信息的链表
  28. void writeid1(LinkList1 head);//把我的信息写入文件, 形参为老我的信息的链表
  29. void mydel(LinkList head,LinkList p);//删除我借的图书,形参分别为,我的图书//的链表,要删除的图书
  30. void del(LinkList head);//删除图书,形参为图书链表
  31. void chan(LinkList head);//修改图书信息,形参为图书链表
  32. void kucundel(LinkList head,int num);//库存减少,形参分别为图书链表和图书编//号
  33. void print(LinkList head);//输出图书信息,形参为图书链表
  34. void xiugaiziliao(char *id1);//修改管理员的资料,形参为老师的id
  35. void xiugaiziliao1(char *id1);//修改我的资料,形参为 我的id
  36. LinkList priceDown(LinkList head);//按价格降序查找,形参为图书链表,返回排序//好的链表
  37. LinkList paixu(LinkList head);//按图书编号从小到大排序, 形参为图书链表,返//回排序好的链表
  38. LinkList read();//从文件中读入图书,返回一个图书链表
  39. LinkList1 readid();//从文件中读入管理员账号密码,返回老师的信息链表
  40. LinkList1 readid1();//从文件中读入我的账号密码, 返回我的信息的链表
  41. LinkList readmy();//查找我借的书,返回读出的图书链表
  42. LinkList priceUp(LinkList head);//按价格升序查找,形参为要排序的链表,返回排//好序的图书链表

2.3 程序总体框架

3 详细设计

Login1():输入账号和密码,如果账号和密码与文件中保存的不同,则重新登陆。登陆成功后选择自己的操作。

  1. case 1:INPUT(head);write(head);break;//输入图书并写入文件。
  2. case 2:FIND();break;//查找。
  3. case 3:READ();break;//浏览。
  4. case 4:CHANGE();break;//修改图书信息。
  5. case 5:tongji();break;//统计信息。
  6. case 6:xiugaiziliao(id);break; //修改个人资料。
  7. case 0:return;//返回上一菜单。

creatid1():输入账号,电话号码和两次密码,如果账号已经存在或者两次密码不同,则重新注册。否则将信息写入文件并提示注册成功。

  1. void creatid1()
  2. {
  3. printf("欢迎来到注册页面:\n");
  4. FILE *fp;
  5. char id1[20], id[20],phone1[15], passworld1[20],phone[15], passworld[20],
  6. passworld2[20];
  7. if((fp=fopen("teachid.txt","a+"))==NULL)
  8. {
  9. printf("can not open this file!\n");
  10. exit(0);
  11. }
  12. printf("请输入账号名:\n");
  13. scanf("%s", id);
  14. for(;!feof(fp);)
  15. {
  16. fscanf(fp,"%s%s%s", id1, phone1, passworld1);
  17. if(strcmp(id1,id)==0)
  18. {
  19. printf("用户名已存在,请重新输入:\n");
  20. creatid1();
  21. }
  22. }
  23. printf("请输入电话号码:\n");
  24. scanf("%s", phone);
  25. printf("请输入密码:\n");
  26. int i;
  27. for(i=0;i<20;i++)
  28. {
  29. passworld1[i]=getchar();
  30. if(passworld1[i]=='\r') break;
  31. printf("*");
  32. }
  33. putchar(10);
  34. passworld1[i]='\0';
  35. printf("请确定密码:\n");
  36. for(i=0;i<20;i++)
  37. {
  38. passworld2[i]=getchar();
  39. if(passworld2[i]=='\r') break;
  40. printf("*");
  41. }
  42. putchar(10);
  43. passworld2[i]='\0';
  44. if(strcmp(passworld1,passworld2)==0)
  45. {
  46. printf("注册成功,请牢记您的密码:\n");
  47. fprintf(fp,"%s ", id);
  48. fprintf(fp,"%s ", phone);
  49. fprintf(fp,"%s\n", passworld1);
  50. printf("注册成功,请牢记您的密码!!!!\n请您登陆:\n");
  51. }
  52. else
  53. {
  54. printf("两次密码不一致,请重新注册:\n");
  55. creatid1();
  56. }
  57. if(fclose(fp))
  58. {
  59. printf("can not close this file!\n");
  60. exit(0);
  61. }
  62. login1();
  63. }

void INPUT(LinkList head):输入图书信息,当输入的图书编号已经存在时重新输入,当输入的图书编号为-1时结束,并将输入的图书信息写入文件。

  1. void INPUT(LinkList head)
  2. {
  3. LinkList p, rear=head;//刚开始尾指针是空的
  4. int num;//定义各种图书信息
  5. char bookname[30];
  6. char author[20];
  7. char press[30];
  8. char cate[30];
  9. int year, mon, day;
  10. double price;
  11. int kucun;
  12. int lend;
  13. printf("输入图书信息,输入图书编号等于-1表示输入结束\n");
  14. printf("输入图书编号:");
  15. scanf("%d", &num);
  16. while(num!=-1)
  17. {
  18. printf("请输入图书名:");
  19. scanf("%s", bookname);
  20. printf("请输入图书作者:");
  21. scanf("%s", author);
  22. printf("请输入图书出版社:");
  23. scanf("%s", press);
  24. printf("请输入图书类别:");
  25. scanf("%s", cate);
  26. printf("请输入图书出版时间(年 月 日):");
  27. scanf("%d%d%d", &year,&mon, &day) ;
  28. printf("请输入图书价格:");
  29. scanf("%lf", &price);
  30. printf("请输入图书的册数:");
  31. scanf("%d", &kucun);
  32. printf("请输入图书借出多少本:");
  33. scanf("%d", &lend);
  34. //尾插法
  35. p=(LinkList)malloc(sizeof(LNode));
  36. p->num=num;
  37. strcpy(p->bookname,bookname);
  38. strcpy(p->author,author);
  39. strcpy(p->press,press);
  40. strcpy(p->cate,cate);
  41. p->year=year;
  42. p->mon=mon;
  43. p->day=day;
  44. p->price=price;
  45. p->kucun=kucun;
  46. p->lend=lend;
  47. rear->next=p;//新节点指向尾
  48. rear=p;//更新rear
  49. printf("输入图书编号:");
  50. scanf("%d", &num);
  51. }
  52. rear->next=NULL;//尾指针置为空
  53. }

void write(LinkList head):将传递过来的链表信息写入book.txt文件中。

  1. void write(LinkList head)
  2. {
  3. paixu(head);//写之前先排序
  4. LinkList ptr=head->next;
  5. FILE *fp;
  6. if((fp=fopen("book.txt","w"))==NULL)//打开文件
  7. {
  8. printf("can not open this file!\n");
  9. exit(0);
  10. }
  11. while(ptr)//写入文件
  12. {
  13. fprintf(fp,"%d %s %s %s %s %d %d %d %lf %d %d\n",ptr->num, ptr->bookname, ptr->author, ptr->press, ptr->cate, ptr->year, ptr->mon, ptr->day,
  14. ptr->price,ptr-> kucun, ptr->lend);
  15. ptr=ptr->next;
  16. }
  17. if(fclose(fp))//关闭文件
  18. {
  19. printf("can not close this file!\n");
  20. exit(0);
  21. }
  22. }

void writemy(LinkList head):将传递过来的链表信息写入studentid.txt中。

  1. void writemy(LinkList head)
  2. {
  3. paixu(head);
  4. LinkList ptr=head->next;
  5. FILE *fp;
  6. if((fp=fopen("mybook.txt","w"))==NULL)
  7. {
  8. printf("can not open this file!\n");
  9. exit(0);
  10. }
  11. while(ptr)
  12. {
  13. fprintf(fp,"%d %s %s %s %s %d %d %d %lf %d\n",ptr->num, ptr->bookname, ptr->author, ptr->press, ptr->cate, ptr->year, ptr->mon, ptr->day,
  14. ptr->price, ptr->lend);
  15. ptr=ptr->next;
  16. }
  17. if(fclose(fp))
  18. {
  19. printf("can not close this file!\n");
  20. exit(0);
  21. }
  22. }

LinkList read():打开book.txt文件读取图书信息并写入一个链表,并返回此链表的头指针。最后关闭文件。

  1. LinkList read()
  2. {
  3. FILE *fp;
  4. if((fp=fopen("book.txt","r"))==NULL)
  5. {
  6. printf("can not open this file!\n");
  7. exit(0);
  8. }
  9. int num;
  10. char bookname[30];
  11. char author[20];
  12. char press[30];
  13. char cate[30];
  14. int year, mon, day;
  15. double price;
  16. int kucun;
  17. int lend;
  18. LinkList head, p;
  19. head=(LinkList)malloc(sizeof(LNode));
  20. head->next=NULL;
  21. while(!feof(fp))
  22. {
  23. fscanf(fp,"%d%s%s%s%s%d%d%d%lf%d%d\n", &num, bookname, author, press, cate, &year, &mon,
  24. &day, &price, &kucun, &lend);
  25. p=(LinkList)malloc(sizeof(LNode));
  26. p->num=num;
  27. strcpy(p->bookname,bookname);
  28. strcpy(p->author,author);
  29. strcpy(p->press,press);
  30. strcpy(p->cate,cate);
  31. p->year=year;
  32. p->mon=mon;
  33. p->day=day;
  34. p->price=price;
  35. p->kucun=kucun;
  36. p->lend=lend;
  37. p->next=head->next;
  38. head->next=p;
  39. }
  40. if(fclose(fp))
  41. {
  42. printf("can not close this file!\n");
  43. exit(0);
  44. }
  45. return head;//返回读出的信息
  46. }

LinkList readmy():打开mybook.txt文件读取我的信息并写入链表,返回此链表的头指针。最后写入文件。

  1. LinkList readmy()
  2. {
  3. FILE *fp;
  4. if((fp=fopen("mybook.txt","r"))==NULL)
  5. {
  6. printf("can not open this file!\n");
  7. exit(0);
  8. }
  9. int num;
  10. char bookname[30];
  11. char author[20];
  12. char press[30];
  13. char cate[30];
  14. int year, mon, day;
  15. double price;
  16. int lend;
  17. LinkList head, p;
  18. head=(LinkList)malloc(sizeof(LNode));
  19. head->next=NULL;
  20. while(!feof(fp))
  21. {
  22. fscanf(fp,"%d%s%s%s%s%d%d%d%lf%d\n", &num, bookname, author, press, cate, &year, &mon,
  23. &day, &price, &lend);
  24. p=(LinkList)malloc(sizeof(LNode));
  25. p->num=num;
  26. strcpy(p->bookname,bookname);
  27. strcpy(p->author,author);
  28. strcpy(p->press,press);
  29. strcpy(p->cate,cate);
  30. p->year=year;
  31. p->mon=mon;
  32. p->day=day;
  33. p->price=price;
  34. p->lend=lend;
  35. p->next=head->next;
  36. head->next=p;
  37. }
  38. if(fclose(fp))
  39. {
  40. printf("can not close this file!\n");
  41. exit(0);
  42. }
  43. return head;
  44. }

void find1():首先打开book.txt文件,从文件中读出信息并写入链表,然后输入想要查询的选项,进行查找,当需要查找的信息和链表中的信息匹配时,输出信息。否则,输出“查找不到此类信息”并返回上一菜单。

  1. void find1()//按作者查询
  2. {
  3. FILE *fp;
  4. if((fp=fopen("book.txt","r"))==NULL)
  5. {
  6. printf("can not open this file!\n");
  7. exit(0);
  8. }
  9. int num;
  10. char bookname[30];
  11. char author[20];
  12. char press[30];
  13. char cate[30];
  14. int year, mon, day;
  15. double price;
  16. int kucun;
  17. int lend;
  18. char author1[20];
  19. printf("请输入要查询的作者名:\n");
  20. scanf("%s", author1);
  21. int count=1;
  22. for(;!feof(fp);)
  23. {
  24. fscanf(fp,"%d%s%s%s%s%d%d%d%lf%d%d\n", &num, bookname, author, press, cate, &year, &mon, &day,
  25. &price, &kucun, &lend);
  26. if(strstr(author,author1)!=NULL)//比较输出要查寻的信息*
  27. {
  28. printf("图书编号:%d;图书名:%s;作者:%s;出版社:%s;图书类别:%s ;出版时间:%d年%d月%d日;图书价格:%.2f元;库存:%d本;借出:%d本.\n",num, bookname, author, press, cate, year, mon, day,
  29. price, kucun, lend);
  30. count=0;
  31. return;
  32. }
  33. }
  34. if(count)
  35. printf("找不到该作者:\n");
  36. if(fclose(fp))
  37. {
  38. printf("can not close this file!\n");
  39. exit(0);
  40. }
  41. printf("继续按照作者则查找请输入1:");
  42. printf("返回请输入0:\n");
  43. int n;
  44. scanf("%d", &n);
  45. switch(n)
  46. {
  47. case 1:find1();break;
  48. case 0:return;
  49. }
  50. }

void READ():打开book.txt文件,输出所有的信息。关闭文件。

  1. void READ()//浏览图书
  2. {
  3. FILE *fp;
  4. if((fp=fopen("book.txt","r"))==NULL)
  5. {
  6. printf("can not open this file!\n");
  7. exit(0);
  8. }
  9. int num;
  10. char bookname[30];
  11. char author[20];
  12. char press[30];
  13. char cate[30];
  14. int year, mon, day;
  15. double price;
  16. int kucun;
  17. int lend;
  18. printf("图书信息为:\n");
  19. while(!feof(fp))
  20. {
  21. fscanf(fp,"%d%s%s%s%s%d%d%d%lf%d%d\n", &num, bookname, author, press, cate, &year, &mon,
  22. &day, &price, &kucun, &lend);
  23. printf("图书编号:%d;图书名:%s;作者:%s;出版社:%s;图书类别:%s ;出版时间:%d年%d月%d日;图书价格:%.2f元;库存:%d本;借出:%d本.\n",num, bookname, author, press, cate, year, mon, day,
  24. price, kucun, lend);
  25. }
  26. if(fclose(fp))
  27. {
  28. printf("can not close this file!\n");
  29. exit(0);
  30. }
  31. }

LinkList paixu(LinkList head):形参接收的是需要排序的链表的头指针,然后进行排序,此函数的代码如下:

  1. LinkList temp1,temp2,q,p;//定义4个临时节点。
  2. for(q=head;q->next!=NULL;q=q->next)//外层循环,找出最小的图书编号。
  3. for(p=q->next;p->next!=NULL;p=p->next)//内层循环,分别比较,找出最小的图书编号。
  4. {
  5. if(p->next->num<q->next->num)
  6. if(q->next==p) //当最小的图书编号与外层循环相邻,调换位置。
  7. {
  8. temp1=p->next;先储存最小的编号信息
  9. p->next=p->next->next;删除最小的编号
  10. temp1->next=q->next;将最小的编号后面的节点变成调换的那个节点
  11. q->next=temp1;将最小的编号前移
  12. p=temp1;使循环继续向下一个
  13. }
  14. else//当不相邻
  15. {
  16. temp1=p->next;
  17. temp2=q->next;
  18. p->next=p->next->next;
  19. q->next=q->next->next;
  20. temp1->next=q->next;
  21. q->next=temp1;
  22. temp2->next=p->next;
  23. p->next=temp2;
  24. }
  25. }
  26. return head;//返回排序好的链表
  27. }
  1. void CHANGE()//修改图书资料
  2. {
  3. //用户输入自己的选择
  4. case 1: add();break;//添加
  5. case 2: del(read());break;//删除
  6. case 3: chan(read());break;//修改
  7. case 0:return;//返回上一菜单
  8. }

void add():添加信息。打开book.txt文件,将添加的信息写入book.txt文件,如果已经存在此图书,则库存添加1,如果不存在,在文件中写入此图书的信息。关闭文件。

  1. void add()//添加
  2. {
  3. LinkList p, ptr=read(), q=ptr;
  4. printf("请输入需要插入的图书编号:(当图书编号等于-1是结束)\n");
  5. int num;
  6. char bookname[30];
  7. char author[20];
  8. char press[30];
  9. char cate[30];
  10. int year, mon, day;
  11. double price;
  12. int kucun;
  13. int lend;
  14. scanf("%d", &num);
  15. while(ptr)
  16. {
  17. if(ptr->num==num)
  18. {
  19. printf("添加成功!!\n");
  20. ptr->kucun++;
  21. write(q);
  22. return;
  23. }
  24. else
  25. ptr=ptr->next;
  26. }
  27. ptr=read();
  28. printf("请输入图书名:");
  29. scanf("%s", bookname);
  30. printf("请输入图书作者:");
  31. scanf("%s", author);
  32. printf("请输入图书出版社:");
  33. scanf("%s", press);
  34. printf("请输入图书类别:");
  35. scanf("%s", cate);
  36. printf("请输入图书出版时间(年 月 日):");
  37. scanf("%d%d%d", &year,&mon, &day) ;
  38. printf("请输入图书价格:");
  39. scanf("%lf", &price);
  40. printf("请输入图书的册数:");
  41. scanf("%d", &kucun);
  42. printf("请输入图书借出多少本:");
  43. scanf("%d", &lend);
  44. p=(LinkList)malloc(sizeof(LNode));
  45. p->num=num;
  46. strcpy(p->bookname,bookname);
  47. strcpy(p->author,author);
  48. strcpy(p->press,press);
  49. strcpy(p->cate,cate);
  50. p->year=year;
  51. p->mon=mon;
  52. p->day=day;
  53. p->price=price;
  54. p->kucun=kucun;
  55. p->lend=lend;
  56. p->next=ptr->next;
  57. ptr->next=p;
  58. write(ptr);
  59. printf("添加成功!!\n");
  60. }

void chan(LinkList head):修改图书资料,形参接收需要添加的图书的链表的头指针,修改时需要选择修改的信息,然后将修改后图书信息的写入book.txt文件。

  1. void chan(LinkList head)
  2. {
  3. printf("*********************************************\n");
  4. printf("***** 修改图书价格请输入 1: *******\n");
  5. printf("***** 修改图书库存请输入 2: *******\n");
  6. printf("***** 返回主菜单请输入 0: *******\n");
  7. printf("**********************************************\n");
  8. int n;
  9. scanf("%d", &n);
  10. LinkList p=head->next;
  11. switch(n)
  12. {
  13. case 1:chan1(head); break;
  14. case 2:chan2(head); break;
  15. case 0: return;
  16. }
  17. }

void jieshu(LinkList head):借书。形参接收的是book.txt中的图书链表的头指针,输入需要借阅的图书的编号,将此编号与链表中的编号信息进行对比,如果编号相等且库存大于0,将此图书信息写入到mybook.txt文件中,同时将此图书的库存量减少1,当库存小于0且没有此图书编号时输出“您输入的错误,请重新输入。”。

  1. void jieshu(LinkList head)
  2. {
  3. system("cls");
  4. LinkList p;
  5. LinkList head1;
  6. head1=(LinkList)malloc(sizeof(LNode));
  7. head1->next=NULL;
  8. int num;
  9. char bookname[30];
  10. char author[20];
  11. char press[30];
  12. char cate[30];
  13. int year, mon, day;
  14. double price;
  15. int kucun;
  16. int lend;
  17. int t=1;
  18. printf("输入要借的图书信息,输入图书编号等于-1表示输入结束\n");
  19. printf("输入图书编号:");
  20. scanf("%d", &num);
  21. head=head->next;
  22. while(head)
  23. {
  24. if(head->num==num&&head->kucun>0)
  25. {
  26. t=0;
  27. kucundel(read(),num);
  28. write(read());
  29. break;
  30. }
  31. head=head->next;
  32. }
  33. if(head==NULL)
  34. {
  35. t=1;
  36. return;
  37. }
  38. if(t==1) printf("不存在此图书!!!\n");
  39. if(t==0) printf("借书成功!请珍爱图书!\n");
  40. putchar(10);
  41. FILE *fp;
  42. if((fp=fopen("mybook.txt","a"))==NULL)
  43. {
  44. printf("can not open this file!\n");
  45. exit(0);
  46. }
  47. fprintf(fp,"%d ", head->num);
  48. fprintf(fp,"%s ", head->bookname);
  49. fprintf(fp,"%s ", head->author);
  50. fprintf(fp,"%s ", head->press);
  51. fprintf(fp,"%s ", head->cate);
  52. fprintf( fp, "%d %d %d ", head->year, head->mon, head->day);
  53. fprintf(fp,"%f ", head->price);
  54. fprintf(fp,"%d\n", 1);
  55. if(fclose(fp))
  56. {
  57. printf("can not close this file!\n");
  58. exit(0);
  59. }
  60. }

void huanshu(LinkList head):还书。形参接收的是为图书链表的头指针,输入还书的编号,将此编号与链表中的编号信息进行对比,如果相同,就将库存增加1。反之,就将此图书添加到链表后面,然后将此图书信息写入book.txt文件中。

  1. void huanshu(LinkList head)
  2. {
  3. system("cls");
  4. LinkList p;
  5. LinkList head1;
  6. int num;
  7. int t=1;
  8. printf("输入要还的图书信息,输入图书编号等于-1表示输入结束\n");
  9. printf("输入图书编号:");
  10. scanf("%d", &num);
  11. head=head->next;
  12. while(head)
  13. {
  14. if(head->num==num)
  15. {
  16. t=0;
  17. kucunadd(read(),head);
  18. mydel(readmy(),head);
  19. break;
  20. }
  21. head=head->next;
  22. }
  23. if(t==1) printf("不存在此图书!!!\n");
  24. if(t==0) printf("还书成功! 感谢您的使用.\n");
  25. if(head==NULL)
  26. {
  27. printf("没有借此书:\n");
  28. return;
  29. }
  30. putchar(10);
  31. }

void xiugaiziliao(char *id1):修改个人资料,形参为登陆后的id,选择输入电话号码和修改后的密码,将账号信息读入链表,然后将信息修改,写入teacherid.txt文件。

  1. void xiugaiziliao(char *id1)
  2. {
  3. system("cls");
  4. char phone[15],passworld[20], id[20];
  5. printf("请输入修改后的电话号码:\n") ;
  6. scanf("%s",phone);
  7. printf("请输入修改后的密码:\n");
  8. scanf("%s", passworld);
  9. LinkList1 head=readid();
  10. LinkList1 p=head->next;
  11. while(p)
  12. {
  13. if(strcmp(p->id,id1)==0)
  14. {
  15. strcpy(p->phone,phone);
  16. strcpy(p->passworld,passworld);
  17. }
  18. p=p->next;
  19. }
  20. writeid(head);
  21. }

void xiugaixuesheng();修改学生的资料。首先将student.txt文件中的学生信息读入链表。输入需要修改的学号,然后将此学号与链表中的学号对比,如果相同,就输入选择修改的信息,然后输入信息,将此信息写入student.txt文件中。如果找不到相同的学号,则显示找不到此学号。

  1. void xiugaixuesheng()
  2. {
  3. printf("请输入需要修改的学生的账号:\n");
  4. char num[8];
  5. scanf("%s", num);
  6. xiugaiziliao1(num);
  7. }

4 调试分析

在面对问题的时候,首先想到是用什么结构,结合所学的内容,链表采用动态存储分配,不会造成内存浪费和溢出;另外,链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素。所以决定了用链表。

刚开始,以为自己可以把整个程序全部写完再进行调试,然而写了几百行代码后,问题接踵而至,整个思路都乱了。后来我决定按照模块进行,调试好了之后再进行下一个模块,这样思路才清晰了起来。

由于此程序有对文件的操作,但是起初没有写读文件函数,导致每次都要写写文件代码,很是繁琐,最后把它写成函数进行模块化后,每次使用只进行调用即可,对程序简化不少。

删除图书时,测试数据为第一个数据的时候,就会出现删除不了的情况,经过检查,发现只定义了一个指针,指向头结点的下一个节点的下一个节点,这样就跳过了第一个数据,需要特别判断一下第一个数据。

在将信息从文件读入链表时,判断是否到文件末尾的函数feof()总是多读取一次最后的数据,经过调试发现,是因为写入的时候有一个控制换行符,所以没有到达文件末尾,在读取的时候需要跳过一个换行符,才将问题解决。

5 测试结果

选择角色主菜单

选择管理员出现的页面

选择学生出现的页面

选择游客出现的页面

游客的浏览功能

登录时序输入账号密码

输入账号密码与文件中的不同

注册时输入的账号已有

录入的图书写入文件

删除图书

添加图书

输入作者名与类别查找图书

按照价格升序查找

按照价格降序查找

修改前的资料

修改后的资料

统计出借出3本书以上的图书

修改学生的个人资料

学生的功能菜单

借编号为3的图书

6 课程心得总结

此程序是我半年多以来写过的最长的、最丰富的、最耗时的一个程序。包括44个函数,共计1675行代码。通过此次作业,我深刻认识到了写程序时模块化的重要性,它可以将问题简化。

由于刚开始只是在脑海中设想了一下要怎么完成这个作业,基本没有进行设计前的规划,而是像平时实验一样,直接写程序。这么做简直是大错特错,后来简直不知道自己是在写什么,没有丝毫逻辑。调整策略之后,思路清晰,这才渐渐地将程序写完。

定义数据的长度也是颇有讲究的,在保证不溢出的情况下要尽可能小,否则就会造成内存的浪费。

以前总认为写程序是最难的,现在则认为调试才是最不容易的。由于此次试验数据较多,调试用了我大概四分之三的时间,输入了许多数据来测试程序的健壮性,后期又添加了许多提示,使程序更加人性化。

总之,经过此次的作业,让我对程序的概念有更深入的了解,而且综合了以前学习的知识,让我的基础更加牢固,对写程序的过程有更深的体会。但是,由于时间原因,还有许多功能尚未实现,有的功能实现的过程很繁琐,有时间的话会继续优化的。

无论做什么事都要用心,都要有严谨认真的态度。写程序更是如此,任何小的疏忽都有可能出现大的错误。从C语言老师那里我学到了好多,在此感谢老师。

上传的附件 cloud_download 图书信息管理系统.7z ( 1.28mb, 19次下载 )
error_outline 下载需要8点积分

发送私信

背负的太多,没等到击垮敌人,就先累死了自己

9
文章数
8
评论数
最近文章
eject