您的位置:首页 > 编程语言 > C语言/C++

图书管理系统C语言课程设计2

2015-07-08 23:06 483 查看
#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define Max 3

typedef struct book

{

char book_num[10];

char book_name[20];

char book_writer[10];

int book_kc;

int book_xy;

struct book *next;

}BK;

typedef struct borrow

{

char borrow_book_num[10];

char limit_date[8];

}BO;

typedef struct reader

{

char reader_num[10];

char reader_name[10];

int right;

BO borrow[Max];

struct reader *next;

}RD;

BK *h_book;

RD *h_reader;

void Login(); /*登陆*/

int Menu(); /*主菜单*/

void Menu_select(); /*主菜单选择函数*/

void Init(); /*初始化*/

void Init_reader(); /*初始化读者*/

void Init_book(); /*初始化图书*/

void Insert_New_Book(); /*新书入库*/

int Find(); /*查找菜单*/

void Find_Select(); /*查找菜单选择函数*/

void Find_Reader(); /*查找读者信息*/

void Find_Book(); /*查找图书信息*/

void Print_reader(); /*打印读者信息*/

void Print_book(); /*打印图书信息*/

void Borrow_Book(); /*借书函数*/

void Return_Book(); /*还书函数*/

void Save(); /*保存信息*/

void Save_Reader(); /*保存读者信息*/

void Save_Book(); /*保存图书信息*/

void Load(); /*加载信息*/

void Load_Reader(); /*加载读者信息*/

void Load_Book(); /*加载图书信息*/

void Login()/*登陆*/

{

system("cls");

printf("\n\n\n\t\t\t欢迎登陆本系统\n");

printf("\n\n\t\t 系统版权所有\n\n\n\n\n\n\n");

printf("\n\n\n\t\t 按 任 意 键 进 入 系 统 ...");

getchar(); system("cls");

}

int Menu() /*主菜单*/

{ int sn;

printf("\n\t\t图书管理系统主菜单\n");

printf("=================================================\n");

printf("*\t0----退出系统 *\n");

printf("*\t1----新书入库 *\n");

printf("*\t2---- 查询 *\n");

printf("*\t3----借书登记 *\n");

printf("*\t4----还书管理 *\n");

printf("=================================================\n");

printf("请选择相应代码:");

for(;;)

{ scanf("%d",&sn);

fflush(stdin);

if(sn<0||sn>4)

printf("\n错误!请重新输入:");

else break;

}

return sn;

}

void Menu_select()/*主菜单选择函数*/

{

for(;;) /*循环调用模式,保证能进行重复操作*/

{

switch(Menu()) /*功能选择*/

{ case 0:

system("cls");/*清楚屏幕先前的显示内容*/

Save();

printf("\n\n\t文件保存成功!\n");

printf("\n\n\t欢迎下次使用本系统!\n");

getchar();

exit(0);

case 1:Insert_New_Book();break;

case 2:Find_Select();break;

case 3:Borrow_Book();break;

case 4:Return_Book();break;

default:printf("\n错误!");exit(0);

}

}

}

void Init() /*初始化*/

{

Init_reader();

Init_book();

}

void Init_reader() /*初始化读者信息*/

{

RD *p0;

int i;

printf("\n读者初始化开始,请输入读者信息..\n包括编号.姓名..\n");

p0=(RD*)malloc(sizeof(RD));

h_reader=p0;

printf("\n请输入读者的信息:\n");

printf("ReaderNo.:"); /*输入读者编号(唯一)*/

scanf("%s",p0->reader_num);

printf("ReaderName:"); /*输入读者姓名(不唯一)*/

scanf("%s",p0->reader_name);

p0->right=0;

for(i=0;i<Max;i++)

{

strcpy(p0->borrow[i].borrow_book_num,"0"); /*所借图书直接置为0(即没有借书)*/

strcpy(p0->borrow[i].limit_date,"0");

}

p0->next=NULL;

printf("\n读者信息初始化完毕!按任意键继续下一步操作..\n");

getchar();

system("cls");

}

void Init_book() /*初始化图书信息*/

{

BK *p0;

printf("\n图书初始化开始,请输入图书信息..\n包括编号.书名.数量..\n");

p0=(BK*)malloc(sizeof(BK));

h_book=p0;

printf("\n请输入图书信息:\n");

printf("BookNo.:"); /*输入图书编号(唯一)*/

scanf("%s",p0->book_num);

printf("BookName:"); /*输入图书名称*/

scanf("%s",p0->book_name);

printf("BookWriter:"); /*输入图书作者*/

scanf("%s",p0->book_writer);

printf("Number:"); /*输入图书数量*/

scanf("%d",&p0->book_kc);

p0->book_xy=p0->book_kc; /*开始时图书现有量和库存量相等*/

p0->next=NULL;

printf("\n图书信息初始化完毕!按任意键继续下一步操作..\n");

getchar();

system("cls");

}

void Insert_New_Book()/*新书入库*/

{

BK *p,*p0,*p1;

p=p1=h_book;

printf("\n新书入库模块...\n");

printf("\n请输入新书信息..\n包括书号.书名.数量..\n");

p0=(BK *)malloc(sizeof(BK));

printf("BookNo.:");

scanf("%s",p0->book_num);

while(strcmp(p0->book_num,p1->book_num)!=0&&p1->next!=NULL)

p1=p1->next;

if(strcmp(p0->book_num,p1->book_num)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/

{

printf("\n此编号图书已存在!!直接入库!\n");

printf("Number:");

scanf("%d",&p0->book_kc);

p1->book_kc+=p0->book_kc;

p1->book_xy+=p0->book_kc;

}

else/*若不存在,则需要输入其他的信息 ,然后在进行插入操作*/

{

printf("BookName:");

scanf("%s",p0->book_name);

printf("BookWriter:");

scanf("%s",p0->book_writer);

printf("Number:");

scanf("%d",&p0->book_kc);

while(p->next)

{

p=p->next;

}

if(h_book==NULL) h_book=p0; /*此处分两种情况,链表中没有数据,head直接指向p0处*/

else p->next=p0; /*此处分两种情况,链表中有数据,链表中最后元素的next指向p0处*/

p0->next=NULL;

p0->book_xy=p0->book_kc;

}

printf("\n新书入库完毕!按任意键继续下一步操作..\n");

getchar();

system("cls");

}

int Find() /*查找菜单*/

{

int sn;

printf("\n\t\t信息查询菜单\n");

printf("=================================================\n");

printf("*\t0----返回上级 \t*\n");

printf("*\t \t*\n");

printf("*\t1----查找图书 2----查找读者 \t*\n");

printf("*\t \t*\n");

printf("*\t3----打印图书 4----打印读者 \t*\n");

printf("=================================================\n");

printf("请选择相应代码:");

for(;;) /*循环调用模式,保证能进行重复操作*/

{

scanf("%d",&sn);

fflush(stdin);

if(sn<0||sn>4)

printf("\n错误!请重新输入:");

else break;

}

return sn;

}

void Find_Select() /*查找菜单选择函数*/

{

system("cls");

for(;;) /*循环调用模式,保证能进行重复操作*/

{

switch(Find()) /*功能选择*/

{

case 0:system("cls"); Menu_select(); break;

case 1:Find_Book();break;

case 2:Find_Reader();break;

case 3:Print_book();break;

case 4:Print_reader();break;

default:printf("\n错误!");exit(0);

}

}

}

void Find_Reader() /*查找读者信息*/

{

RD *p;

int i;

char find_reader[10];

p=h_reader;

printf("\n读者信息查询模块\n");

printf("\n请输入你要查询读者编号:");

scanf("%s",find_reader);

while(strcmp(p->reader_num,find_reader)!=0&&p->next)

p=p->next;

if(strcmp(p->reader_num,find_reader)==0)

{

printf("\n读者编号:%s的信息为:\n",find_reader);

printf("ReaderNo.\tReaderName"); /*此处这样处理,是为了能实现一个读者能借多本书 Max 可以改*/

printf("\n");

printf("\t%s\t\t%s",p->reader_num,p->reader_name);

for(i=0;i<Max;i++)

{

printf("\n");

printf("BorrowBookNum%d",i+1);

printf("\tReturn%dLimitDate",i+1);

printf("\n");

printf("\t%s",p->borrow[i].borrow_book_num);

printf("\t\t%s",p->borrow[i].limit_date);

}

printf("\n");

}

else

printf("\n此读者编号不存在,请核对!按任意键返回...");

getchar();

system("cls");

}

void Find_Book() /*查找图书信息*/

{

BK *p;

char find_book[10]; /*功能很简单,读者编号唯一,查找只须一次遍历*/

p=h_book;

printf("\n图书信息查询模块\n");

printf("\n请输入你要查询图书编号:");

scanf("%s",find_book);

while(strcmp(p->book_num,find_book)!=0&&p->next)

p=p->next;

if(strcmp(p->book_num,find_book)==0)

/*找到了就打印,否则提示不存在,或出错*/

{

printf("\n图书编号:%s的信息为:\n",find_book);

printf("\nBookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n");

printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);

}

else

printf("\n此图书编号不存在,请核对!按任意键返回...");

getchar(); system("cls");

}

void Print_reader() /*打印读者信息*/

{

RD *p;

int i;

p=h_reader;

printf("\n读者信息如下:\n\n");

printf("ReaderNo.\tReaderName"); /*此处这样处理,是为了能实现一个读者能借多本书 Max 可以改*/

printf("\n");

while(p!=NULL) /*遍历链表一次就可以了*/

{

printf("\t%s\t\t%s",p->reader_num,p->reader_name);

for(i=0;i<Max;i++)

{

printf("\n");

printf("BorrowBookNum%d",i+1);

printf("\tReturn%dLimitDate",i+1);

printf("\n");

printf("\t%s",p->borrow[i].borrow_book_num);

printf("\t\t%s",p->borrow[i].limit_date);

}

printf("\n");

p=p->next;

}

printf("\n读者信息打印完毕!按任意键继续下一步操作..");

getchar();

system("cls");

}

void Print_book() /*打印图书信息*/

{

BK *p;

p=h_book;

printf("\n图书信息如下:\n\n");

printf("BookNo.\t\tBookName\tBookWriter\tXianYou \tKuCun\n");

/*直接打印所有图书的信息,遍历链表一次就可*/

while(p!=NULL)

{

printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xy,p->book_kc);

p=p->next;

}

printf("\n图书信息打印完毕!按任意键继续下一步操作..");

getchar();

system("cls");

}

void Borrow_Book() /*借书模块*/

{

BK *p0; RD *p1;

char bo_num[10],rea_num[10],lim_date[8];

int i;

p0=h_book; p1=h_reader;

printf("\n借书模块...\n");

printf("\n请输入借书的读者编号:"); /*先输入借书的读者信息*/

scanf("%s",rea_num);

while(p1->next!=NULL&&strcmp(rea_num,p1->reader_num)!=0) /*遍历一次读者链表,判断读者是否存在*/

p1=p1->next;

if(p1->next==NULL&&strcmp(rea_num,p1->reader_num)!=0) /*如果存在,则继续,不存在就、则提示错误!*/

{

printf("\n此读者编号不存在!按任意键返回..\n");

goto END;

}

printf("\n请输入你要借的书的编号:");

scanf("%s",bo_num);

while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL) /*遍历一次图书链表,判断此图书是否存在*/

p0=p0->next;

if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0) /*如果存在,则继续,不存在就、则提示错误!*/

{

printf("\n此图书编号不存在!按任意键返回..\n");

}

else if(p0->book_xy<=0) /*判断此图书现在是否还有库存*/

{

printf("\n抱歉,此书已借完!请等待新书的到来!!\n按任意键返回....");

}

else if(p1->right>=Max) /*判断此读者借书权限是否已达最大*/

{

printf("\n不好意思,借书数目已满!不能借书!\n按任意键返回....");

}

else if(strcmp(p1->borrow[0].borrow_book_num,"0")!=0) /*此读者若已经借书,再判断此读者是否要借两本一样的书*/

{

for(i=0;i<Max;i++) /*遍历一次读者所借的书,如果发现有重复,则结束*/

{

if(strcmp(p1->borrow[i].borrow_book_num,bo_num)==0)

{

printf("\n抱歉!同一个读者不能同借两本相同的书!\n");

}

else if(strcmp(p1->borrow[i].borrow_book_num,"0")==0) /*如果没有重复*/

{

printf("\n请输入你要归还图书的日期:");

scanf("%s",lim_date);

strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num); /*记录所借书号,并且借书数目加一,现存量减一*/

strcpy(p1->borrow[p1->right-1].limit_date,lim_date);

p0->book_xy--;

printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);

}

}

}

else /*此读者从未借过书*/

{

printf("\n请输入你要归还图书的日期:");

scanf("%s",lim_date);

strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num); /*记录所借书号,并且借书数目加一,现存量减一*/

strcpy(p1->borrow[p1->right-1].limit_date,lim_date);

p0->book_xy--;

printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);

}

END:getchar(); system("cls");

}

void Return_Book() /*还书模块*/

{

BK *p; RD *q;

int i,j,find=0;

char return_book_num[10],return_reader_num[10];

p=h_book; q=h_reader;

printf("\n还书模块...\n");

printf("\n请输入要还书的读者编号:"); /*基本同上*/

scanf("%s",return_reader_num); /*注意:数组的输入没有&*/

while(q->next!=NULL&&strcmp(return_reader_num,q->reader_num)!=0)

q=q->next;

if(q->next==NULL&&strcmp(return_reader_num,q->reader_num)!=0)

{

find=2;/*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,则find=2,若借了,则find=1,若没借为find=0*/

printf("\n此读者编号不存在!按任意键返回..\n");

goto end;

}

printf("\n请输入读者还书的编号:");

scanf("%s",return_book_num);

while(p->next!=NULL&&strcmp(return_book_num,p->book_num)!=0)

p=p->next;

if(p->next==NULL&&strcmp(return_book_num,p->book_num)!=0)

{

find=2;/*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,则find=2,若借了,则find=1,若没借为find=0*/

printf("\n错误!此图书编号不存在!按任意键返回..\n");

goto end;

}

for(i=0;i<Max;i++)

if(strcmp(return_book_num,q->borrow[i].borrow_book_num)==0) /*如果此读者借了此书*/

{

find=1; /*设置标志,用于判断读者是否借了此书或是否出错提前结束,若提前出错,则find=2,若借了,则find=1,若没借为find=0*/

for(j=i;j<Max-1;j++)

{

strcpy(q->borrow[j].borrow_book_num,q->borrow[j+1].borrow_book_num);

strcpy(q->borrow[j].limit_date,q->borrow[j+1].limit_date);

}

strcpy(q->borrow[Max-1].borrow_book_num,"0");

strcpy(q->borrow[Max-1].limit_date,"0");

p->book_xy++;

q->right--;

printf("\n编号%s的读者还书完毕!按任意键继续下步操作..",return_reader_num);

}

if(find==0) /*为什么有个find==0,因为遍历时循环Max次,如循环完毕还没有找到,则说明读者没有借此书,find用来保证只打印一次结果,否则每循环一次就会打印一个结果*/

printf("\n错误!此读者未借此书!按任意键返回..\n"); /*如果遍历读者所借的书号,发现读者未借此书,则提示错误!*/

end: getchar(); system("cls");

}

void Save() /*保存信息*/

{

Save_Reader();

Save_Book();

}

void Save_Reader() /*保存读者信息*/

{

FILE *fp_reader; /*创建文件型指针*/

RD *p,*p0;

p=h_reader;

if((fp_reader=fopen("Reader.dat","wb"))==NULL) /*创建文件,进行保存*/

{

printf("\n文件保存失败!\n请重新启动本系统...\n");

exit(0);

}

while(p!=NULL)

{

if(fwrite(p,sizeof(RD),1,fp_reader)!=1) /*将链表中的信息写入文件中*/

printf("\n写入文件失败!\n请重新启动本系统!\n");

p0=p;

p=p->next;

free(p0); /*释放所有结点*/

}

h_reader=NULL;

fclose(fp_reader); /*关闭文件*/

}

void Save_Book() /*保存图书信息*/

{

FILE *fp_book; /*创建文件型指针*/

BK *p,*p0;

p=h_book;

if((fp_book=fopen("Book.dat","wb"))==NULL) /*创建文件,进行保存*/

{

printf("\n文件保存失败!\n请重新启动本系统...\n");

exit(0);

}

while(p!=NULL)

{

if(fwrite(p,sizeof(BK),1,fp_book)!=1) /*将链表中的信息写入文件中*/

printf("\n写入文件失败!\n请重新启动本系统!\n");

p0=p;

p=p->next;

free(p0);

}

h_book=NULL;

fclose(fp_book); /*关闭文件*/

}

void Load() /*加载信息*/

{

Load_Reader();

Load_Book();

}

void Load_Reader() /*加载读者信息*/

{

RD *p1,*p2,*p3;

FILE *fp; /*创建文件型指针*/

fp=fopen("Reader.dat","rb"); /*打开文件*/

p1=(RD *)malloc(sizeof(RD));

fread(p1,sizeof(RD),1,fp);

h_reader=p3=p2=p1;

while(! feof(fp)) /*读出信息,重新链入链表*/

{ p1=(RD *)malloc(sizeof(RD));

fread(p1,sizeof(RD),1,fp);

p2->next=p1;

p3=p2;

p2=p1;

}

p3->next=NULL;

free(p1);

fclose(fp); /*关闭文件*/

}

void Load_Book() /*加载图书信息*/

{

BK *p1,*p2,*p3;

FILE *fp; /*创建文件型指针*/

fp=fopen("Book.dat","rb"); /*打开文件*/

p1=(BK *)malloc(sizeof(BK));

fread(p1,sizeof(BK),1,fp);

h_book=p3=p2=p1;

while(! feof(fp)) /*读出信息,重新链入链表*/

{ p1=(BK *)malloc(sizeof(BK));

fread(p1,sizeof(BK),1,fp);

p2->next=p1;

p3=p2;

p2=p1;

}

p3->next=NULL;

free(p1);

fclose(fp); /*关闭文件*/

}

void main()

{

FILE *fp_book,*fp_reader; /*创建文件型指针*/

Login();

if((fp_book=fopen("Book.dat","rb"))==NULL||(fp_reader=fopen("Reader.dat","rb"))==NULL)

{

Init();

}

else Load();

Menu_select(); /*调用主菜单*/

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: