图书管理系统--C语言实现

图书管理系统

该系统应该具备的几项功能:

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);
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尼杉纳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值