C语言实现图书管理系统

所属分类: 软件编程 / C 语言 阅读数: 98
收藏 0 赞 0 分享

本文实例为大家分享了C语言实现图书管理系统的具体代码,供大家参考,具体内容如下

一、分析过程

首先此程序需要实现输入、增加、删除、查询、输出的五大功能,则首先需要设置一个菜单键,让用户可以选择不同的功能,完成不同的操作,然后编写不同的函数实现不同的功能,在这个过程中注意要人性化,让用户方便,直观的进行操作。

二、算法

三、函数模块介绍

 1录入模块:本模块主要执行信息的录入功能

 2浏览模块:本模块主要是执行把已有信息输出浏览功能

 3查询模块:本模块主要是按照图书名查找图书的相关信息

 4删除模块:主要是执行删除图书信息的功能

 5退出模块:方便用户离开

四、源程序

#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 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 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() 
{ 
 struct books_list * head; 
 char choice; 
 head=NULL; 
 for(;;) /*实现反复输入选择*/ 
 { 
 printf(" ┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n"); 
 printf(" ┃ ┃ tony 图书馆管理系统 ┃ ┃\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(" ┃   ┃\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') 
 { 
 DeleteDoc(head); 
 } 
 
 else if(choice=='5') 
 { 
 printf("\n"); 
 printf(" ━━━━━━━━ 感谢使用图书管理系统 ━━━━━━━━\n"); 
 break; 
 } 
 else 
 { 
 printf("  ━━━━ 输入错误,请重新输入!━━━━\n"); 
 
 } 
 } 
 
 return 0; 
} 

五、课程设计总结

通过这一周的课程设计,我感受到做程序一定要有自己的清晰计划,否则会无处用力,感觉会很乱,当高屋建瓴的有计划后,然后开始认真严谨的设计每一个模块,要知道用户的一切输入都是不可信的,必须想得要全面,要仔细的对待每一个细节,任何一个差错都有可能让程序崩溃,这其中有许多的困难,刚开始感觉到束手无策,但是放一放,换个角度想就会豁然开朗,我觉得从这个中感觉到了充实,满足感,也提醒我以后要多多练练,多上机,积累经验,争取设计出更多的好的程序。

更多学习资料请关注专题《管理系统开发》。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

用标准c++实现string与各种类型之间的转换

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本
收藏 0 赞 0 分享

C++如何通过ostringstream实现任意类型转string

再使用整型转string的时候感觉有点棘手,因为itoa不是标准C里面的,而且即便是有itoa,其他类型转string不是很方便。后来去网上找了一下,发现有一个好方法
收藏 0 赞 0 分享

C/C++指针小结

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区
收藏 0 赞 0 分享

C++ 类的静态成员深入解析

在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
收藏 0 赞 0 分享

C++类的静态成员初始化详细讲解

通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
收藏 0 赞 0 分享

C++类静态成员与类静态成员函数详解

静态成员不可在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值
收藏 0 赞 0 分享

C++中的friend友元函数详细解析

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
收藏 0 赞 0 分享

static全局变量与普通的全局变量的区别详细解析

以下是对static全局变量与普通的全局变量的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
收藏 0 赞 0 分享

C++ explicit关键字的应用方法详细讲解

C++ explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?下面就让我们一起来看看这方面的知识吧
收藏 0 赞 0 分享

教你5分钟轻松搞定内存字节对齐

随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则
收藏 0 赞 0 分享
查看更多