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");
}
}
}