图书管理系统
该系统应该具备的几项功能:
1.图书的录入、删除、修改、查找(链表的增、删、查、改)
2.文件的写入和读取
另:为了页面简洁,部分代码使用了system函数
函数部分
宏定义、全局变量、函数声明
#define BOOKS_MAX 3000
#define NAME_MAX 30
/*全局变量部分*/
int num;//书的数目
int temp = 1;//控制退出系统
BOOK_IN *book_head = NULL;//以链表存储所有书
/*函数声明部分*/
void exit();
void menu();
void seek();
void seek_menu();
void add_book();
void save_book();
void display_books();
void seek_bynum();
void seek_byname();
void delete_book();
void change_bookinfo();
void over_file();
主函数
int main()
{
while(temp){//用全局变量作循环条件,改变全局变量以退出循环
menu();//打印菜单
int n;
printf("请输入序号:\n");
scanf("%d",&n);
switch(n){//选择语句调用函数
case 1: seek(); break;
case 2: add_book(); break;
case 3: delete_book(); break;
case 4: change_bookinfo(); break;
case 5: display_books(); break;
case 6: exit(); break;
default: printf("请输入正确的序号!!\n"); break;
}
}
return 0;
}
打印菜单
void menu() {//打印菜单
printf("===========================\n");
printf("========1.查找书籍=========\n");
printf("========2.录入新书=========\n");
printf("========3.删除书籍=========\n");
printf("========4.修改信息=========\n");
printf("========5.浏览书库=========\n");
printf("========6.退出系统=========\n");
printf("===========================\n");
}
书的信息
typedef struct book{//用链表存储信息
int BOOK_NUM; //书序号
char name[NAME_MAX]; //书名
char author[NAME_MAX]; //作者名
char press[NAME_MAX]; //出版社名
double price; //价格
struct book *next;//指向下一本书
}BOOK_IN;
添加(文件读取或直接输入)
void add_book() {
printf("请选择添加方式:\n");
printf("1.从文件添加 2.手动输入\n");//输入的菜单
int k;
scanf("%d",&k);
if(k == 1){
over_file();//创建一个函数,从文件读取数据
}else if(k == 2){
int n;
printf("请输入待添加图书的数量:\n");
scanf("%d",&n);
int i = 1;
while(i <= n){
printf("正在录入第%d本书的信息\n",i);
BOOK_IN *p = (BOOK_IN*)malloc(sizeof(BOOK_IN));//将数据存储到链表
printf("请输入书的序号:\n");
scanf("%d",&p->BOOK_NUM);
printf("请输入书名:\n");
scanf("%s",&p->name);
printf("请输入作者名:\n");
scanf("%s",&p->author);
printf("请输入出版社名:\n");
scanf("%s",&p->press);
printf("请输入价格:\n");
scanf("%lf",&p->price);
printf("已完成添加!\n");
i++;
p->next = NULL;
if (book_head == NULL) {
book_head = p;
} else {
BOOK_IN *q = book_head;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
printf("是否保存?\n");
printf("==1.是=2.否==\n");
int k;
scanf("%d",&k);
if(k == 1){
save_book();//将链表数据写入文件
}else{
continue;
}
}
}
printf("添加完成!\n");
system("pause");//按任意键继续
system("cls");//清屏
}
写入文件
void save_book(){//将输入的数据写入文件
FILE *fp = fopen("F://books.txt", "w");//从路径打开文本文件
BOOK_IN *p = book_head;
while(p != NULL){
fprintf(fp, "%d %s %s %s %lf\n",
p->BOOK_NUM, p->name, p->author, p->press, p->price);
p = p->next;
}
fclose(fp);
}
从文件中读取
这里有要注意的
feof函数用来检测流上的文件结束符,文件结束返回非0值,否则返回0
上一个写入文件的函数,在fprintf函数最后加了换行符\n,此时文件存储数据的末尾是\n
如果fscanf最后没有\n,会出错
如果文件中数据的存储顺序和fscanf中不一致,也会出错
void over_file(){
FILE *fp = fopen("F://books.txt","r");//从路径打开文本文件
if (fp == NULL) {
printf("访问失败!\n");
return ;
}
while (!feof(fp)) {//循环条件:读到文件末尾停止
BOOK_IN *p = (BOOK_IN*)malloc(sizeof(BOOK_IN));//用链表存储数据
fscanf(fp, "%d %s %s %s %lf\n",
&p->BOOK_NUM,p->name,p->author,p->press,&p->price);//文件中数据的存储格式须和""内要一致
p->next = NULL;
if (book_head == NULL) {
book_head = p;
} else {
BOOK_IN *q = book_head;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
}
fclose(fp);
}
删除
void delete_book()//删除图书
{
if(book_head == NULL){
printf("库中无书!\n");
system("pause");
system("cls");
return ;
}
printf("请输入待删除书的序号:\n");
int num;
scanf("%d",&num);
BOOK_IN *p = book_head;
BOOK_IN *q = NULL;
while (p != NULL && p->BOOK_NUM != num) {
q = p;
p = p->next;
}
if (p == NULL) {//p指向空,说明链表中没有目标书籍
printf("查无此书!\n");
} else {
if (q == NULL) {
book_head = p->next;
} else {
q->next = p->next;
}
free(p);
printf("删除成功!\n");
}
save_book();//删除后要重写文件
system("pause");
system("cls");
}
修改
增加、删除、修改之后,记得重写文件
void change_bookinfo()
{
if(book_head == NULL){
printf("库中无书!\n");
system("pause");
system("cls");
return ;
}
printf("请输入待修改书籍的序号:\n");
int num;
scanf("%d",&num);
BOOK_IN *p = book_head;
while(p != NULL && p->BOOK_NUM != num){
p = p->next;
}
if(p == NULL){
printf("查无此书!\n");
}else{
printf("请输入需要更改的信息:\n");
int t;
printf("1.书号\n2.书名\n3.作者\n4.出版社\n5.价格\n");//打印菜单
scanf("%d",&t);
switch(t){//选择修改的信息
case 1:
printf("请输入新的书号:\n");
scanf("%d",&p->BOOK_NUM);//重新输入
break;
case 2:
printf("请输入新的书名:\n");
scanf("%s",p->name);
break;
case 3:
printf("请输入新的作者名:\n");
scanf("%s",p->author);
break;
case 4:
printf("请输入新的出版社名:\n");
scanf("%s",p->press);
break;
case 5:
printf("请输入新的价格\n");
scanf("%lf",&p->price);
break;
default:
printf("请正确输入!\n");
change_bookinfo();
}
}
save_book();//重写文件
system("pause");
system("cls");
}
查找(菜单)
void seek() {//查找书籍
seek_menu();
while(1){
int t;
scanf("%d",&t);
if(t == 1){
seek_bynum();
break;
}else if(t == 2){
seek_byname();
break;
}else if(t == 3){
system("cls");
return ;
}
}
system("pause");
system("cls");
}
void seek_menu() {//打印查找的菜单
printf("===========================\n");
printf("=======1.按书号查找========\n");
printf("=======2.按书名查找========\n");
printf("=======3.退出此菜单========\n");
printf("===========================\n");
}
查找方法
//用书号查找
void seek_bynum() {
if(book_head == NULL){//链表为空
printf("库中无书!\n");
return ;
}
printf("请输入要查找的书号:\n");
int book_num;
scanf("%d",&book_num);
BOOK_IN *p = book_head;
while(p != NULL){
if(p->BOOK_NUM == book_num){
printf("书号:%d\n",p->BOOK_NUM);
printf("书名:%s\n",p->name);
printf("作者:%s\n",p->author);
printf("出版社:%s\n",p->press);
printf("价格:%.2lf\n",p->price);
return;
}
p = p->next;
}
if(p == NULL){
printf("您要找的书不存在!\n");
}
}
//用书名查找
void seek_byname() {
if(book_head == NULL){
printf("库中无书!\n");
return ;
}
printf("请输入要查找的书名:\n");
char name[NAME_MAX];
scanf("%s",name);
BOOK_IN *p = book_head;
while(p != NULL){
if(strcmp(p->name,name) == 0){
printf("书号:%d\n",p->BOOK_NUM);
printf("书名:%s\n",p->name);
printf("作者:%s\n",p->author);
printf("出版社:%s\n",p->press);
printf("价格:%.2lf\n",p->price);
return ;
}
p = p->next;
if(p == NULL){
printf("您要找的书不存在!\n");
}
}
}
上面代码中出现的stcrmp函数,用于比较两个字符串,若相等,则返回0
浏览(遍历链表)
void display_books(){//浏览书籍
if(book_head == NULL){
printf("库中无书!\n");
system("pause");
system("cls");
return ;
}
BOOK_IN *p = book_head;
while (p != NULL) {
printf("图书编号:%d\n", p->BOOK_NUM);
printf("图书名称:%s\n", p->name);
printf("作者:%s\n", p->author);
printf("出版社:%s\n", p->press);
printf("价格:%.2f\n", p->price);
p = p->next;
}
system("pause");
system("cls");
}
退出程序
void exit() {//退出程序
printf("是否确认退出系统\n");
printf("===1.确认=2.取消===\n");
int t;
scanf("%d",&t);
if(t == 1){
temp = 0;//改变全局变量,结束main里面的循环
printf("感谢您的使用!\n");
}else{
system("cls");
}
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>
#include<math.h>
#include<stdbool.h>
#include<windows.h>
#define BOOKS_MAX 3000
#define NAME_MAX 30
/*书的信息*/
typedef struct book{
int BOOK_NUM; //书序号
char name[NAME_MAX]; //书名
char author[NAME_MAX]; //作者名
char press[NAME_MAX]; //出版社名
double price; //价格
struct book *next;//指向下一本书
}BOOK_IN;
/*全局变量部分*/
int num;//书的数目
int temp = 1;//控制退出系统
BOOK_IN *book_head = NULL;//
/*函数声明部分*/
void exit();
void menu();
void seek();
void seek_menu();
void add_book();
void save_book();
void display_books();
void seek_bynum();
void seek_byname();
void delete_book();
void change_bookinfo();
void over_file();
int main()
{
while(temp){
menu();
int n;
printf("请输入序号:\n");
scanf("%d",&n);
switch(n){
case 1: seek(); break;
case 2: add_book(); break;
case 3: delete_book(); break;
case 4: change_bookinfo(); break;
case 5: display_books(); break;
case 6: exit(); break;
default: printf("请输入正确的序号!!\n"); break;
}
}
return 0;
}
void menu() {//打印菜单
printf("===========================\n");
printf("========1.查找书籍=========\n");
printf("========2.录入新书=========\n");
printf("========3.删除书籍=========\n");
printf("========4.修改信息=========\n");
printf("========5.浏览书库=========\n");
printf("========6.退出系统=========\n");
printf("===========================\n");
}
void exit() {//退出程序
printf("是否确认退出系统\n");
printf("===1.确认=2.取消===\n");
int t;
scanf("%d",&t);
if(t == 1){
temp = 0;
printf("感谢您的使用!\n");
}else{
system("cls");
}
}
void seek() {//查找书籍
seek_menu();
while(1){
int t;
scanf("%d",&t);
if(t == 1){
seek_bynum();
break;
}else if(t == 2){
seek_byname();
break;
}else if(t == 3){
system("cls");
return ;
}
}
system("pause");
system("cls");
}
void seek_menu() {
printf("===========================\n");
printf("=======1.按书号查找========\n");
printf("=======2.按书名查找========\n");
printf("=======3.退出此菜单========\n");
printf("===========================\n");
}
void seek_bynum() {
if(book_head == NULL){
printf("库中无书!\n");
return ;
}
printf("请输入要查找的书号:\n");
int book_num;
scanf("%d",&book_num);
BOOK_IN *p = book_head;
while(p != NULL){
if(p->BOOK_NUM == book_num){
printf("书号:%d\n",p->BOOK_NUM);
printf("书名:%s\n",p->name);
printf("作者:%s\n",p->author);
printf("出版社:%s\n",p->press);
printf("价格:%.2lf\n",p->price);
return;
}
p = p->next;
}
if(p == NULL){
printf("您要找的书不存在!\n");
}
}
void seek_byname() {
if(book_head == NULL){
printf("库中无书!\n");
return ;
}
printf("请输入要查找的书名:\n");
char name[NAME_MAX];
scanf("%s",name);
BOOK_IN *p = book_head;
while(p != NULL){
if(strcmp(p->name,name) == 0){
printf("书号:%d\n",p->BOOK_NUM);
printf("书名:%s\n",p->name);
printf("作者:%s\n",p->author);
printf("出版社:%s\n",p->press);
printf("价格:%.2lf\n",p->price);
return ;
}
p = p->next;
if(p == NULL){
printf("您要找的书不存在!\n");
}
}
}
void add_book() {
printf("请选择添加方式:\n");
printf("1.从文件添加 2.手动输入\n");
int k;
scanf("%d",&k);
if(k == 1){
over_file();
}else if(k == 2){
int n;
printf("请输入待添加图书的数量:\n");
scanf("%d",&n);
int i = 1;
while(i <= n){
printf("正在录入第%d本书的信息\n",i);
BOOK_IN *p = (BOOK_IN*)malloc(sizeof(BOOK_IN));
printf("请输入书的序号:\n");
scanf("%d",&p->BOOK_NUM);
printf("请输入书名:\n");
scanf("%s",&p->name);
printf("请输入作者名:\n");
scanf("%s",&p->author);
printf("请输入出版社名:\n");
scanf("%s",&p->press);
printf("请输入价格:\n");
scanf("%lf",&p->price);
printf("已完成添加!\n");
i++;
p->next = NULL;
if (book_head == NULL) {
book_head = p;
} else {
BOOK_IN *q = book_head;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
printf("是否保存?\n");
printf("==1.是=2.否==\n");
int k;
scanf("%d",&k);
if(k == 1){
save_book();
}else{
continue;
}
}
}
printf("添加完成!\n");
system("pause");
system("cls");
}
void save_book(){//将输入的数据写入文件
FILE *fp = fopen("F://books.txt", "w");
BOOK_IN *p = book_head;
while(p != NULL){
fprintf(fp, "%d %s %s %s %lf\n",
p->BOOK_NUM, p->name, p->author, p->press, p->price);
p = p->next;
}
fclose(fp);
}
void delete_book()//删除图书
{
if(book_head == NULL){
printf("库中无书!\n");
system("pause");
system("cls");
return ;
}
printf("请输入待删除书的序号:\n");
int num;
scanf("%d",&num);
BOOK_IN *p = book_head;
BOOK_IN *q = NULL;
while (p != NULL && p->BOOK_NUM != num) {
q = p;
p = p->next;
}
if (p == NULL) {
printf("未找到该图书!\n");
} else {
if (q == NULL) {
book_head = p->next;
} else {
q->next = p->next;
}
free(p);
printf("删除成功!\n");
}
save_book();
system("pause");
system("cls");
}
void change_bookinfo()
{
if(book_head == NULL){
printf("库中无书!\n");
system("pause");
system("cls");
return ;
}
printf("请输入待修改书籍的序号:\n");
int num;
scanf("%d",&num);
BOOK_IN *p = book_head;
while(p != NULL && p->BOOK_NUM != num){
p = p->next;
}
if(p == NULL){
printf("查无此书!\n");
}else{
printf("请输入需要更改的信息:\n");
int t;
printf("1.书号\n2.书名\n3.作者\n4.出版社\n5.价格\n");
scanf("%d",&t);
switch(t){
case 1:
printf("请输入新的书号:\n");
scanf("%d",&p->BOOK_NUM);
break;
case 2:
printf("请输入新的书名:\n");
scanf("%s",p->name);
break;
case 3:
printf("请输入新的作者名:\n");
scanf("%s",p->author);
break;
case 4:
printf("请输入新的出版社名:\n");
scanf("%s",p->press);
break;
case 5:
printf("请输入新的价格\n");
scanf("%lf",&p->price);
break;
default:
printf("请正确输入!\n");
change_bookinfo();
}
}
save_book();
system("pause");
system("cls");
}
void display_books(){//浏览书籍
if(book_head == NULL){
printf("库中无书!\n");
system("pause");
system("cls");
return ;
}
BOOK_IN *p = book_head;
while (p != NULL) {
printf("图书编号:%d\n", p->BOOK_NUM);
printf("图书名称:%s\n", p->name);
printf("作者:%s\n", p->author);
printf("出版社:%s\n", p->press);
printf("价格:%.2f\n", p->price);
p = p->next;
}
system("pause");
system("cls");
}
void over_file(){//从文件中读取图书信息
FILE *fp = fopen("F://books.txt","r");
if (fp == NULL) {
printf("访问失败!\n");
return ;
}
while (!feof(fp)) {
BOOK_IN *p = (BOOK_IN*)malloc(sizeof(BOOK_IN));
fscanf(fp, "%d %s %s %s %lf\n",
&p->BOOK_NUM,p->name,p->author,p->press,&p->price);
p->next = NULL;
if (book_head == NULL) {
book_head = p;
} else {
BOOK_IN *q = book_head;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
}
fclose(fp);
}