#ifndef managetain_c_
#define managetain_c_
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "library.h"
//////////////////////////////////////////////////////////////////////////
//求取借书者证件号字符串对应的最大长整型数
long int maxnum(void)
{
int i;
long int max_num;
for (max_num=0,i=0;i<MAXBORROWERNUM-1;i++)
{
max_num *= 10;
max_num += 9;
}
return (max_num);
}
//IF添加图书失败
int failed_addbook(void)
{
printf("\n\n\t【提示】:添加图书失败!\n\n\n");
system("pause");
return LIBRARY_ERROR;
}
//IF添加图书成功
int completed_addbook(void)
{
printf("\n\n\t【提示】:添加图书成功!\n\n\n");
system("pause");
return LIBRARY_OK;
}
//添加图书结点时对链表进行修改
void add_book_to_list(BookNode* new_book)
{
if (headbooklist)
//当图书链表不为空时
{
headbooklist->prev->next = new_book;
new_book->prev = headbooklist->prev;
headbooklist->prev = new_book;
new_book->next = NULL;
}
else
//当图书链表为空时
{
headbooklist = new_book;
headbooklist->prev = new_book;
new_book->next = NULL;
}
++ new_book->book.book_total; //图书总册数加一
++ new_book->book.leaved_total; //图书剩余册数加一
}
//添加图书
int add_book(void)
{
BookNode* new_book = alloc_booknode(); //分配新的结点
BookNode* cur_booknode = headbooklist; //指向当前结点
int flag; //flag作为输入字符时的表字符,为1表示输入正确,为0表示退出输入
char get_ch;
system("cls");
fflush(stdin);
printf("\n\t\t------《添加图书》------");
printf("\n\n\t#-------------------------------#\n");
printf("\n\t请输入图书名:");
flag = inputstring(new_book->book.name,MAXSTRLEN,0);
if (!flag)
{
return(failed_addbook());
}
//gets(new_book->book.name);
if ( find_booknode(new_book->book.name) )
//如果在原链表中查找到该图书
{
cur_booknode = find_booknode(new_book->book.name);
printf("\n\t【提示】:该图书已存在!");
disp_book(& (cur_booknode->book)); //输出该图书信息
printf("\n\t如果您确认是该图书,并同意添加,请输入“Y”或者“y”!\n");
printf("\t否则,请输入其他键退出!");
get_ch = getch();
if ('Y' == get_ch || 'y' == get_ch )
//当确认添加该图书时
{
//查找该图书在链表中的位置
//while ( strcmp(new_book->book.name,cur_booknode->book.name))
//cur_booknode = cur_booknode->next;
if (cur_booknode->book.book_total >= MAXBOOKNUM)
//如果该图书储存本数已经达到规定限额
{
free_booknode(new_book);
printf("\n\t该图书库存量已达到规定限额(%d本),不能再添加!\n",MAXBOOKNUM);
return(failed_addbook()); //添加失败
}
else
//如果本数没有达到规定限额
{
++ cur_booknode->book.book_total; //该图书总册数加一
++ cur_booknode->book.leaved_total; //该图书剩余册数加一
free_booknode(new_book); //释放结点
return(completed_addbook()); //添加成功
}
}
free_booknode(new_book); //释放结点
return(failed_addbook()); //添加失败
}
//如果该图书库中尚没有该图书信息
printf("\n\t请输入图书作者:");
flag = inputstring(new_book->book.author,MAXSTRLEN,0);
if (!flag)
{
return(failed_addbook());
}
//gets(new_book->book.author);
printf("\n\t您确认要添加该图书吗? (确定添加请输入'Y',否则请输入其他键!) ");
get_ch = getch();
if ( 'Y' == get_ch || 'y' == get_ch )
//如果确认添加
{
add_book_to_list(new_book); //添加图书时修改指针和信息
return(completed_addbook()); //添加成功
}
free_booknode(new_book); //释放该图书结点
return(failed_addbook()); //添加失败
}
//添加借书者失败
int failed_addborrower(void)
{
printf("\n\n\t【提示】:添加借书者失败!\n\n\n");
system("pause");
return LIBRARY_ERROR;
}
//添加借书者成功
int completed_addborrower(void)
{
printf("\n\n\t【提示】:添加借书者成功!\n\n\n");
system("pause");
return LIBRARY_OK;
}
//添加借书者结点时对链表进行修改
void add_borrower_to_list(BorrowerNode* new_borrower)
{
if (headborrowerlist)
//当借书者链表不为空时
{
headborrowerlist->prev->next = new_borrower;
new_borrower->prev = headborrowerlist->prev;
headborrowerlist ->prev = new_borrower;
new_borrower->next = NULL;
}
else
//当借书者链表为空时
{
headborrowerlist = new_borrower;
headborrowerlist->prev = new_borrower;
new_borrower->next = NULL;
}
}
//为借书者分配图书证件号码
//number[]用于接受转化后的字符串,borrower_total为转化前的长整型数据
//转化规则:将长整型数据borrower_total的每一位转变为相应的字符,若borrower_total不满8位
//则在转化后的字符串前面加零,直到满8位为止。字符串的最后一位(下标为【8】)赋值为‘\0’.
void give_borrowernumber(char number[],long int borrower_total)
{
int count;
long int div_count; //因为实际字符串长度为8位
long int num;
for (count = 0,div_count =1;count < MAXBORROWERNUM - 2;count ++)
{
div_count *= 10;
}
for (count = 0;count < MAXBORROWERNUM-1;count ++)
{
num = borrower_total / div_count;
if (! num)
{
number[count] = '0';
}
else
{
number[count] = num + 48;
}
borrower_total=borrower_total % div_count;
div_count = div_count / 10 ;
}
number[MAXBORROWERNUM-1] = '\0';
return;
}
//添加借书者
int add_borrower(void)
{
BorrowerNode* new_borrower = alloc_borrowernode(); //分配新的结点
//BorrowerNode* cur_borrower = headborrowerlist;
int flag; //flag作为输入字符时的表字符,为1表示输入正确,为0表示退出输入
long int borrower_count;
//long int borrower_num;
char get_ch;
//char name[MAXSTRLEN];
char current_number[MAXBORROWERNUM] = {'0','0','0','0','0','0','0','0','\0'};
char number[MAXBORROWERNUM];
system("cls");
fflush(stdin);
printf("\n\t\t------《添加借书者》------");
printf("\n\n\t#-------------------------------#\n");
printf("\n\t请输入借书者姓名: ");
flag = inputstring(new_borrower->borrower.name,MAXSTRLEN,0);
if (!flag)
{
return(failed_addbook());
}
printf("\n\t请输入该借书者性别(man / woman): ");
flag = inputstring(new_borrower->borrower.sex,MAXBORROWERSEXLEN,0);
while (strcmp(new_borrower->borrower.sex,"man") && strcmp(new_borrower->borrower.sex,"woman"))
{
printf("\n\t【提示】:您输入的性别格式有误!");
printf("\n\n\t请重新输入该借书者性别(man / woman): ");
flag = inputstring(new_borrower->borrower.sex,MAXBORROWERSEXLEN,0);
}
if (!flag)
{
return(failed_addborrower());
}
//gets(new_borrower->borrower.sex);
printf("\n\t请输入借书者地址: ");
flag = inputstring(new_borrower->borrower.address,MAXSTRLEN,1);
if (!flag)
{
return(failed_addborrower());
}
//gets(new_borrower->borrower.address);
printf("\n\t请输入借书者联系方式: ");
flag = inputstring(new_borrower->borrower.phone_number,MAXSTRLEN,1);
if (!flag)
{
return(failed_addborrower());
}
//gets(new_borrower->borrower.phone_number);
printf("\n\n\t【提示】:您确认要添加该借书者?(确认添加请输入'Y',否则请输入其他键!)");
get_ch = getch();
if ( 'Y' == get_ch || 'y' == get_ch )
//如果确认添加
{
FILE *fp;
int i,j,ten = 10;
borrower_count = 0;
if (count_borrowernode()==maxnum()) //maxnum()代表借书者证件号对应的最大长整型数据
{
printf("\n\n\t【警告】:借书者人数已经达到最上限,请您增大借书者容量!");
free_borrowernode(new_borrower); //释放该结点
return(failed_addborrower()); //添加失败
}
fp=fopen(FILENAME_BORROWERNUMBER,"rb"); //以读二进制方式打开文件"borrowernumber.dat"
if (!fp)
{
//假设文件不存在,则新建文件
fp=fopen(FILENAME_BORROWERNUMBER,"wb");
if (!fp)
{
system("cls");
printf("【警告】:打开文件失败,退出!\n");
exit(0);
}
//新建文件后,写数据0
fwrite(current_number,sizeof(current_number),1,fp);
}
fclose(fp);
fp = fopen(FILENAME_BORROWERNUMBER,"rb");
i = sizeof(current_number);
//将文件指针指向最后一个整型数据,并读取
fseek(fp,-i,2);
fread(current_number,sizeof(current_number),1,fp);
for (i = 0 ; i < MAXBORROWERNUM-1 ; i ++)
{
//将字符串转