小型图书馆管理系统c语言版
- 格式:doc
- 大小:151.36 KB
- 文档页数:21
课程设计(大作业)报告课程名称:数据结构课程设计设计题目:小型图书馆管理系统院系:信息技术学院班级:计算机科学与技术3班设计者:学号:*******指导教师:***设计时间:2012.12.24--28昆明学院课程设计(大作业)任务书一、题目分析本题是一个图书馆管理系统,涉及到c语言的一些基本操作,比如,构造结构体,插入,查找等!这个程序包括构造一个结构体,域为:书号,书名,作者,出版商,出版日期。
运用文件操作的方式实现文件的保存与调用!用菜单界面来操作整个过程!先写每个功能的程序,然后再组合起来,这样显得调理清晰,不容易乱!二、基本理论C语言的基本知识,比如结构体的构造,链表的操作,文件的操作三、总体设计函数功能:struct books_list * Create_Books_Doc(); /*新建链表*/void InsertDoc(struct books_list * head); /*插入*/void DeleteDoc(struct books_list * head , int num);/*删除*/void Print_Book_Doc(struct books_list * head);/*浏览*/void search_book(struct books_list * head); /*查询*/void info_change(struct books_list * head);/*修改*/void save(struct books_list * head);/*保存数据至文件*/四、实验器材Pc机五、方法步骤1. 创建主函数main()2新建数据文件create()2.1为节点分配内存2.2创建二进制文件用于存储图书信息2.3通过一个循环一次录入图书信息2.4关闭文件3.编写删除数据纪录函数delete()3.1打开文件3.2遍历文件找到与指定图书信息匹配的记录并删除3.3关闭文件4.编写浏览数据记录函数Print_Book_Doc()4.1打开文件4.2遍历整个数据。
并显示在于界面上4.3保存数据至文件5建立查询函数search_book()5.1打开文件5.2遍历整个文件找到与指定图书匹配信息5.3输出查询到的信息5.4关闭文件6. 编写修改数据纪录函数info_change()6.1打开文件6.2遍历整个文件找到与指定图书信息匹配的记录并修改6.3关闭文件7.保存后结束整个程序六、成效分析我编写的部分struct books_list{char author[20]; /*作者名*/char bookname[20]; /*书名*/char publisher[20]; /*出版单位*/char pbtime[15]; /*出版时间*/char loginnum[10]; /*登陆号*/float price; /*价格*/char classfy[10]; /*分类号*/struct books_list * next; /*链表的指针域*/};struct books_list * Create_Books_Doc(); /*新建链表*/void InsertDoc(struct books_list * head); /*插入*/void DeleteDoc(struct books_list * head , int num);/*删除*/void Print_Book_Doc(struct books_list * head);/*浏览*/void search_book(struct books_list * head); /*查询*/void info_change(struct books_list * head);/*修改*/void save(struct books_list * head);/*保存数据至文件*//*新建链表头节点*/struct books_list * Create_Books_Doc(){struct books_list * head;head=(struct books_list *)malloc(sizeof(struct books_list)); /*分配头节点空间*/head->next=NULL; /*头节点指针域初始化,定为空*/return head;}/*保存数据至文件*/void save(struct books_list * head){struct books_list *p;FILE *fp;p=head;fp=fopen("data.txt","w+"); /*以写方式新建并打开data.txt文件*/fprintf(fp,"┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━┳━━━━┓\n"); /*向文件输出表格*/fprintf(fp,"┃登录号┃书名┃作者┃出版单位┃出版时间┃分类号┃价格┃\n");fprintf(fp,"┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━╋━━━━┫\n");/*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/while(p->next!= NULL){p=p->next;fprintf(fp,"┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-6.6s┃%.2f┃\n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->price);}fprintf(fp,"┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━┻━━━━┛\n");fclose(fp);printf(" 已将图书数据保存到data.txt 文件\n");}/*插入*/void InsertDoc(struct books_list *head){/*定义结构体指针变量s指向开辟的新结点首地址p为中间变量*/struct books_list *s, *p;char flag='Y'; /*定义flag,方便用户选择重复输入*/p=head;/*遍历到尾结点,p指向尾结点*/while(p->next!= NULL){p=p->next;}/*开辟新空间,存入数据,添加进链表*/while(flag=='Y'||flag=='y'){s=(struct books_list *)malloc(sizeof(struct books_list));printf("\n 请输入图书登陆号:");fflush(stdin);scanf("%s",s->loginnum);printf("\n 请输入图书书名:");fflush(stdin);scanf("%s",s->bookname);printf("\n 请输入图书作者名:");fflush(stdin);scanf("%s",s->author);printf("\n 请输入图书出版社:");fflush(stdin);scanf("%s",s->publisher);printf("\n 请输入图书出版时间:"); fflush(stdin);scanf("%s",s->pbtime);printf("\n 请输入图书分类号:");fflush(stdin);scanf("%s",s->classfy);printf("\n 请输入图书价格:");fflush(stdin);scanf("%f",&s->price);printf("\n");p->next=s; /*将新增加的节点添加进链表*/p=s; /*p指向尾节点,向后移*/s->next=NULL;printf(" ━━━━添加成功!━━━━"); printf("\n 继续添加?(Y/N):"); fflush(stdin);scanf("%c",&flag);printf("\n");if(flag=='N'||flag=='n'){break;}else if(flag=='Y'||flag=='y'){continue;}}save(head); /*保存数据至文件*/return;}/*修改操作*/void info_change(struct books_list * head){struct books_list * p;int panduan=0; /*此变量用于判断是否找到书目*/char temp[20];p=head;printf("请输入要修改的书名:");scanf("%s",temp);while(p->next!= NULL){p=p->next;if(strcmp(p->bookname,temp)==0){printf("\n 请输入图书登陆卡号:");fflush(stdin);scanf("%s",p->loginnum);printf("\n 请输入图书书名:");fflush(stdin);scanf("%s",p->bookname);printf("\n 请输入图书作者名:");fflush(stdin);scanf("%s",p->author);printf("\n 请输入图书出版社:");fflush(stdin);scanf("%s",p->publisher);printf("\n 请输入图书出版时间:");fflush(stdin);scanf("%s",p->pbtime);printf("\n 请输入图书分类号:");fflush(stdin);scanf("%s",p->classfy);printf("\n 请输入图书价格:");fflush(stdin);scanf("%f",&p->price);printf("\n");panduan=1;}}if(panduan==0){printf("\n ━━━━没有图书记录! ━━━━\n\n"); }return;}/*删除操作*/void DeleteDoc(struct books_list * head){struct books_list *s,*p; /*s为中间变量,p为遍历时使用的指针*/char temp[20];int panduan; /*此变量用于判断是否找到了书目*/panduan=0;p=s=head;printf(" [请输入您要删除的书名]:");scanf("%s",temp);/*遍历到尾结点*/while(p!= NULL){if(strcmp(p->bookname,temp)==0){panduan++;break;}p=p->next;}if(panduan==1){for(;s->next!=p;) /*找到所需删除卡号结点的上一个结点*/{s=s->next;}s->next=p->next; /*将后一节点地址赋值给前一节点的指针域*/free(p);printf("\n ━━━━删除成功! ━━━━\n");}else /*未找到相应书目*/{printf(" 您输入的书目不存在,请确认后输入!\n");}return;}int main(void){struct books_list * head;char choice;head=NULL;for(;;) /*实现反复输入选择*/{printf(" ┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n"); printf(" ┃┃socat 图书管理系统┃┃\n"); printf(" ┃┗━━━━━━━━━━━━━━━━━━━┛┃\n"); printf(" ┃●[1]图书信息录入┃\n"); printf(" ┃┃\n"); printf(" ┃●[2]图书信息浏览┃\n"); printf(" ┃┃\n"); printf(" ┃●[3]图书信息查询┃\n"); printf(" ┃┃\n"); printf(" ┃●[4]图书信息修改┃\n"); printf(" ┃┃\n"); printf(" ┃●[5]图书信息删除┃\n"); printf(" ┃┃\n");printf(" ┃●[6]退出系统┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf(" 请选择:");fflush(stdin);scanf("%c",&choice);if(choice=='1'){if(head==NULL){head=Create_Books_Doc();}InsertDoc(head);}else if(choice=='2'){Print_Book_Doc(head);}else if(choice=='3'){search_book(head);}else if(choice=='4'){info_change(head);}else if(choice=='5'){DeleteDoc(head);}else if(choice=='6'){printf("\n");printf(" ━━━━━━━━感谢使用图书管理系统━━━━━━━━\n");break;}else{printf(" ━━━━输入错误,请重新输入!━━━━");break;}}return 0; }程序源代码#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>struct books_list{char author[20]; /*作者名*/char bookname[20]; /*书名*/char publisher[20]; /*出版单位*/char pbtime[15]; /*出版时间*/char loginnum[10]; /*登陆号*/float price; /*价格*/char classfy[10]; /*分类号*/struct books_list * next; /*链表的指针域*/};struct books_list * Create_Books_Doc(); /*新建链表*/ void InsertDoc(struct books_list * head); /*插入*/void DeleteDoc(struct books_list * head , int num);/*删除*/ void Print_Book_Doc(struct books_list * head);/*浏览*/ void search_book(struct books_list * head); /*查询*/void info_change(struct books_list * head);/*修改*/void save(struct books_list * head);/*保存数据至文件*//*新建链表头节点*/struct books_list * Create_Books_Doc(){struct books_list * head;head=(struct books_list *)malloc(sizeof(struct books_list)); /*分配头节点空间*/head->next=NULL; /*头节点指针域初始化,定为空*/return head;}/*保存数据至文件*/void save(struct books_list * head){struct books_list *p;FILE *fp;p=head;fp=fopen("data.txt","w+"); /*以写方式新建并打开data.txt文件*/fprintf(fp,"┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━┳━━━━┓\n"); /*向文件输出表格*/fprintf(fp,"┃登录号┃书名┃作者┃出版单位┃出版时间┃分类号┃价格┃\n");fprintf(fp,"┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━╋━━━━┫\n");/*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/while(p->next!= NULL){p=p->next;fprintf(fp,"┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-6.6s┃%.2f┃\n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->price);}fprintf(fp,"┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━┻━━━━┛\n");fclose(fp);printf(" 已将图书数据保存到data.txt 文件\n");}/*插入*/void InsertDoc(struct books_list *head){/*定义结构体指针变量s指向开辟的新结点首地址p为中间变量*/struct books_list *s, *p;char flag='Y'; /*定义flag,方便用户选择重复输入*/p=head;/*遍历到尾结点,p指向尾结点*/while(p->next!= NULL){p=p->next;}/*开辟新空间,存入数据,添加进链表*/while(flag=='Y'||flag=='y'){s=(struct books_list *)malloc(sizeof(struct books_list));printf("\n 请输入图书登陆号:");fflush(stdin);scanf("%s",s->loginnum);printf("\n 请输入图书书名:");fflush(stdin);scanf("%s",s->bookname);printf("\n 请输入图书作者名:");fflush(stdin);scanf("%s",s->author);printf("\n 请输入图书出版社:");fflush(stdin);scanf("%s",s->publisher);printf("\n 请输入图书出版时间:"); fflush(stdin);scanf("%s",s->pbtime);printf("\n 请输入图书分类号:");fflush(stdin);scanf("%s",s->classfy);printf("\n 请输入图书价格:");fflush(stdin);scanf("%f",&s->price);printf("\n");p->next=s; /*将新增加的节点添加进链表*/p=s; /*p指向尾节点,向后移*/s->next=NULL;printf(" ━━━━添加成功!━━━━"); printf("\n 继续添加?(Y/N):"); fflush(stdin);scanf("%c",&flag);printf("\n");if(flag=='N'||flag=='n'){break;}else if(flag=='Y'||flag=='y'){continue;}}save(head); /*保存数据至文件*/return;}/*查询操作*/void search_book(struct books_list *head){struct books_list * p;char temp[20];p=head;if(head==NULL || head->next==NULL) /*判断数据库是否为空*/{printf(" ━━━━图书库为空!━━━━\n"); }else{printf("请输入您要查找的书名: ");fflush(stdin);scanf("%s",temp);/*指针从头节点开始移动,遍历至尾结点,查找书目信息*/while(p->next!= NULL){p=p->next;if(strcmp(p->bookname,temp)==0){printf("\n图书已找到!\n");printf("\n");printf("登录号: %s\t\n",p->loginnum);printf("书名: %s\t\n",p->bookname);printf("作者名: %s\t\n",p->author);printf("出版单位: %s\t\n",p->publisher);printf("出版时间: %s\t\n",p->pbtime);printf("分类号: %s\t\n",p->classfy);printf("价格: %.2f\t\n",p->price);}if(p->next==NULL){printf("\n查询完毕!\n");}}}return;}/*浏览操作*/void Print_Book_Doc(struct books_list * head){struct books_list * p;if(head==NULL || head->next==NULL) /*判断数据库是否为空*/{printf("\n ━━━━没有图书记录! ━━━━\n\n");return;}p=head;printf("┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━┳━━━━┓\n");printf("┃登录号┃书名┃作者┃出版单位┃出版时间┃分类号┃价格┃\n");printf("┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━╋━━━━┫\n");/*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/while(p->next!= NULL){p=p->next;printf("┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-6.6s┃%.2f┃\n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->price); /*循环输出表格*/}printf("┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━┻━━━━┛\n");printf("\n");}/*修改操作*/void info_change(struct books_list * head){struct books_list * p;int panduan=0; /*此变量用于判断是否找到书目*/char temp[20];p=head;printf("请输入要修改的书名:");scanf("%s",temp);while(p->next!= NULL){p=p->next;if(strcmp(p->bookname,temp)==0){printf("\n 请输入图书登陆卡号:");fflush(stdin);scanf("%s",p->loginnum);printf("\n 请输入图书书名:");fflush(stdin);scanf("%s",p->bookname);printf("\n 请输入图书作者名:");fflush(stdin);scanf("%s",p->author);printf("\n 请输入图书出版社:");fflush(stdin);scanf("%s",p->publisher);printf("\n 请输入图书出版时间:");fflush(stdin);scanf("%s",p->pbtime);printf("\n 请输入图书分类号:");fflush(stdin);scanf("%s",p->classfy);printf("\n 请输入图书价格:");fflush(stdin);scanf("%f",&p->price);printf("\n");panduan=1;}}if(panduan==0){printf("\n ━━━━没有图书记录! ━━━━\n\n"); }return;}/*删除操作*/void DeleteDoc(struct books_list * head){struct books_list *s,*p; /*s为中间变量,p为遍历时使用的指针*/char temp[20];int panduan; /*此变量用于判断是否找到了书目*/panduan=0;p=s=head;printf(" [请输入您要删除的书名]:");scanf("%s",temp);/*遍历到尾结点*/while(p!= NULL){if(strcmp(p->bookname,temp)==0){panduan++;break;}p=p->next;}if(panduan==1){for(;s->next!=p;) /*找到所需删除卡号结点的上一个结点*/{s=s->next;}s->next=p->next; /*将后一节点地址赋值给前一节点的指针域*/free(p);printf("\n ━━━━删除成功! ━━━━\n");}else /*未找到相应书目*/{printf(" 您输入的书目不存在,请确认后输入!\n");}return;}int main(void){struct books_list * head;char choice;head=NULL;for(;;) /*实现反复输入选择*/{printf(" ┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n"); printf(" ┃┃socat 图书管理系统┃┃\n"); printf(" ┃┗━━━━━━━━━━━━━━━━━━━┛┃\n");printf(" ┃●[1]图书信息录入┃\n"); printf(" ┃┃\n"); printf(" ┃●[2]图书信息浏览┃\n"); printf(" ┃┃\n"); printf(" ┃●[3]图书信息查询┃\n"); printf(" ┃┃\n"); printf(" ┃●[4]图书信息修改┃\n"); printf(" ┃┃\n"); printf(" ┃●[5]图书信息删除┃\n"); printf(" ┃┃\n"); printf(" ┃●[6]退出系统┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf(" 请选择:");fflush(stdin);scanf("%c",&choice);if(choice=='1'){if(head==NULL){head=Create_Books_Doc();}InsertDoc(head);}else if(choice=='2'){Print_Book_Doc(head);}else if(choice=='3'){search_book(head);}else if(choice=='4'){info_change(head);}else if(choice=='5'){DeleteDoc(head);}else if(choice=='6'){printf("\n");printf(" ━━━━━━━━感谢使用图书管理系统━━━━━━━━\n");break;}else{printf(" ━━━━输入错误,请重新输入!━━━━");break;}}return 0;}五.课程设计总结在这次课程设计中让我的编程能力得到了一定的提高,让我熟悉了链表的一些操作,但在这个过程中还是有很多地方难以下手,需要同学的帮助。