多文件实现图书管理系统

main.c

#include<stdio.h>
#include"run.h"

int main(){
	run();

	return 0;
}

struct.h

#ifndef STRUCT_H

#define STRUCT_H



#define len 20//最长字节数



struct Read{

	char name[len];//读者姓名

	int readid;//编号

	int age;//年龄

	int money;//余额

};

struct Book{

	char name[len];//书名

	char author[len];//作者

	int price;//价格

	int bookid;//编号



};

#endif//STRUCT_H

memOper.h

#ifndef MEMOPER_H
#define MEMOPER_H
#include"menu.h"
#include<stdio.h>
void memOperread(void);
void memOperbook(void);
void freeread(void);
void freebook(void);
#endif//MEMOPER_H

memOper.c

#include<stdio.h>
#include"memOper.h"
void memOperread(void){//读者的动态内存申请
	if(pred==NULL){
		pred=malloc(readcap*sizeof(struct Read));
		if(pred==NULL){
			printf("malloc failed!");
			exit(-1);
		}
	}if(readsize>=readcap){
		readcap*=2;
		pred=realloc(pred,readcap*sizeof(struct Read));
		if(pred==NULL){
			printf("malloc failed!");
			exit(-1);
		}
	}

}
void memOperbook(void){//图书的动态内存申请
	if(pbok==NULL){
		pbok=malloc(readcap*sizeof(struct Book));
		if(pbok==NULL){
			printf("malloc failed!");
			exit(-1);
		}
	}if(booksize>=bookcap){
		bookcap*=2;
		pbok=realloc(pbok,bookcap*sizeof(struct Book));
		if(pbok==NULL){
			printf("malloc failed!");
			exit(-1);
		}
	}

}
void freeread(void){//动态内存释放
	if(pred!=NULL){
		free(pred);
		pred=NULL;
	}
}
void freebook(void){
	if(pbok!=NULL){
		free(pbok);
		pbok=NULL;
	}

}

msort.h

#ifndef MSORT_H

#define MSORT_H

#include<stdio.h>

#include<stdlib.h>



void msort(void*beg,size_t nember,size_t size,int(*cmp)(const void*,const void*));//万能排序

#endif//MSORT_H

msort.c

#include"msort.h"

#include<string.h>



void msort(void *beg,size_t nember,size_t size,int(*cmp)(const void *,const void *)){

	int i,j;

	void *ptemp=malloc(size);

	for(i=0;i<nember;i++){

		int flag=0;

		for(j=1;j<nember-i;j++){

			if(cmp((char*)beg+size*j,(char*)beg+size*(j-1))<0){

				memcpy(ptemp,(char *)beg+size*j,size);

				memcpy((char*)beg+size*j,(char*)beg+size*(j-1),size);

				memcpy((char*)beg+size*(j-1),ptemp,size);

				flag=1;

			}

		}if(flag==0){

			break;

		}

	}

	free(ptemp);



}

menu.h

#ifndef MENU_H

#define MENU_H

#include<stdio.h>

#include<stdlib.h>

#include"struct.h"

#include<string.h>

#include"memOper.h"



void showMenu(void);

void addReader(void);

void delReader(void);

void modReader(void);

void findReader(void);

void listReader(void);

void addBook(void);

void delBook(void);

void modBook(void);

void findBook(void);

void listBook(void);



extern struct Read *pred;//动态内存

extern int readcap;//动态内存容量

extern int readsize;//已使用容量

extern int readid;//用于生成编号

extern struct Book *pbok;

extern int bookcap;

extern int booksize;

extern int bookid;

#endif//MENU_H

menu.c

#include"menu.h"
#include"msort.h"

//定义全局变量
struct Read *pred=NULL;
int readcap=10;
int readsize=0;
int readid=10010000;
struct Book *pbok=NULL;
int bookcap=10;
int booksize=0;
int bookid=20200000;

void showMenu(void){
	puts("-----图书员管理系统-----");
	printf("--1.增加读者--\n");
	printf("--2.删除读者--\n");
	printf("--3.修改读者信息--\n");
	printf("--4.查找读者--\n");
	printf("--5.列出所有读者--\n");
	printf("--6.增加图书--\n");
	printf("--7.删除图书--\n");
	printf("--8.修改图书信息--\n");
	printf("--9.查找图书--\n");
	printf("--10.列出所有图书--\n");
	printf("--0.退出系统--\n");
	printf("请输入操作序号:");
}
void addReader(void){
	puts("##增加读者##");
	struct Read p={};
	printf("请输入读者姓名");
	scanf("%s",p.name);
	p.readid=readid++;
	printf("请输入年龄");
	scanf("%d",&p.age);
	printf("请输入余额");
	scanf("%d",&p.money);
	memOperread();
	pred[readsize++]=p;
	printf("添加成功\n");
	
}
void showRead1(void){
	puts("-------------");
	puts("姓名 编号 年龄 余额");
}
int search(int id){
	int i;
	for(i=0;i<readsize;i++){
		if(pred[i].readid==id){
			return i;
		}
	}
	return -1;
}
void showRead2(struct Read *r){
	printf("%s %d %d %d\n",r->name,r->readid,r->age,r->money);
	
}
void delReader(void){
	puts("##删除读者##");
	if(readsize==0){
		printf("暂无读者!\n");
		return;
	}
	int no=0;
	printf("请输入读者编号");
	scanf("%d",&no);
	int res=search(no);
	if(res==-1){
		printf("无此读者!\n");
	}else{
		showRead1();
		showRead2(pred+res);
		pred[res]=pred[readsize--];
		printf("删除成功!\n");
	}
	
}
void modReader(void){
	puts("##修改读者信息##");
	if(readsize==0){
		printf("暂无读者!\n");
		return;
	}
	int no=0;
	printf("请输入读者编号");
	scanf("%d",&no);
	int res=search(no);
	if(res==-1){
		printf("无此读者!\n");
	}else{
		showRead1();
		showRead2(pred+res);
		printf("请输入读者姓名");
		scanf("%s",pred[res].name);
		printf("请输入读者年龄");
		scanf("%d",&pred[res].age);
		printf("请输入余额");
		scanf("%d",&pred[res].money);
		printf("修改之后:\n");
		showRead1();
		showRead2(pred+res);
	}
}
void findReader(void){
	puts("##查找读者##");
	if(readsize==0){
		printf("暂无读者!\n");
		return;
	}
	int no=0;
	printf("请输入读者编号");
	scanf("%d",&no);
	int res=search(no);
	if(res==-1){
		printf("无此读者!\n");
	}else{
		showRead1();
		showRead2(pred+res);
		}
}
int orderByIdAsc(const void*v1,const void*v2){
	const struct Read *p1=(const struct Read*)(v1);
	const struct Read *p2=(const struct Read*)(v2);
	return p1->readid-p2->readid; 
}
int orderByNameAsc(const void*v1,const void*v2){
	const struct Read *p1=(const struct Read*)(v1);
	const struct Read *p2=(const struct Read*)(v2);
	return strcmp(p1->name,p2->name);
}
void listReader(void){
	puts("##列出读者##");
	if(readsize==0){
		printf("暂无读者!\n");
		return;
	}
	puts("--1.按编号升序--");
	puts("--2.按姓名升序--");
	printf("请选择:");
	int opt=0;
	scanf("%d",&opt);
	switch(opt){
		case 1:msort(pred,readsize,sizeof(struct Read),orderByIdAsc);break;
		case 2:msort(pred,readsize,sizeof(struct Read),orderByNameAsc);break;
	}int i;
	showRead1();
	for(i=0;i<readsize;i++){
		showRead2(pred+i);
	}
}
void addBook(void){
	puts("##增加图书##");
	struct Book p={};
	printf("请输入书名");
	scanf("%s",p.name);
	p.bookid=bookid++;
	printf("请输入作者");
	scanf("%s",p.author);
	printf("请输入价格");
	scanf("%d",&p.price);
	memOperbook();
	pbok[booksize++]=p;
	printf("添加成功\n");
}
void showBook1(void){
	puts("-------------");
	puts("书名 作者 价格 编号");
}
int search2(int id){
	int i;
	for(i=0;i<booksize;i++){
		if(pbok[i].bookid==id){
			return i;
		}
	}return -1;
}
void showBook2(struct Book*b){
	printf("%s %s %d %d\n",b->name,b->author,b->price,b->bookid);
}
void delBook(void){
	puts("##删除图书##");
	if(booksize==0){
		printf("暂无图书!\n");
		return;
	}
	int no=0;
	printf("请输入图书编号");
	scanf("%d",&no);
	int res=search2(no);
	if(res==-1){
		printf("无此图书!\n");
	}else{
		showBook1();
		showBook2(pbok+res);
		pbok[res]=pbok[booksize--];
		printf("删除成功!\n");
	}
}
void modBook(void){
	puts("##修改图书信息##");
	if(booksize==0){
		printf("暂无图书!\n");
		return;
	}
	int no=0;
	printf("请输入图书编号");
	scanf("%d",&no);
	int res=search2(no);
	if(res==-1){
		printf("无此图书!\n");
	}else{
		showBook1();
		showBook2(pbok+res);
		printf("请输入书名");
		scanf("%s",pbok[res].name);
		printf("请输入作者");
		scanf("%s",pbok[res].author);
		printf("请输入价格");
		scanf("%d",&pbok[res].price);
		printf("修改之后:\n");
		showBook1();
		showBook2(pbok+res);
	}
}
void findBook(void){
	puts("##查找图书##");
	if(booksize==0){
		printf("暂无图书!\n");
		return;
	}
	int no=0;
	printf("请输入图书编号");
	scanf("%d",&no);
	int res=search2(no);
	if(res==-1){
		printf("无此图书!\n");
	}else{
		showBook1();
		showBook2(pbok+res);
		}
}
int orderByBookIdAsc(const void*v1,const void*v2){
	const struct Book *p1=(const struct Book*)(v1);
	const struct Book *p2=(const struct Book*)(v2);
	return p1->bookid-p2->bookid; 
}
int orderByBookNameAsc(const void*v1,const void*v2){
	const struct Book *p1=(const struct Book*)(v1);
	const struct Book *p2=(const struct Book*)(v2);
	return strcmp(p1->name,p2->name);
}
void listBook(void){
	puts("##列出图书##");
	if(booksize==0){
		printf("暂无图书!\n");
		return;
	}
	puts("--1.按编号升序--");
	puts("--2.按书名升序--");
	printf("请选择:");
	int opt=0;
	scanf("%d",&opt);
	switch(opt){
		case 1:msort(pbok,booksize,sizeof(struct Book),orderByBookIdAsc);break;
		case 2:msort(pbok,booksize,sizeof(struct Book),orderByBookNameAsc);break;
	}int i;
	showBook1();
	for(i=0;i<booksize;i++){
		showBook2(pbok+i);
	}
}

run.h

#ifndef RUN_H

#define RUN_H

#include"menu.h"

#include"struct.h"

#include"memOper.h"

void run(void);

#endif//RUN_H

run.c

#include"run.h"

void run(void){

	while(1){

		system("clear");

		showMenu();

		int opt=0;

		scanf("%d",&opt);

		switch(opt){

			case 1:addReader();break;

			case 2:delReader();break;

			case 3:modReader();break;

			case 4:findReader();break;

			case 5:listReader();break;

			case 6:addBook();break;

			case 7:delBook();break;

			case 8:modBook();break;

			case 9:findBook();break;

			case 10:listBook();break;

			case 0:freeread();

				   freebook();

				   printf("--正常退出系统!--\n");

				   exit(0);

			default:printf("操作有误!\n");

		}

	}

}
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值