1. 设计思路
图书:(增删改查) 显示
读者:(增删改查) 显示 借书 还书 主菜单 子菜单
系统如下图
如上图,实际上只需要执行三个模块:图书管理模块,读者管理模块,借书还书登记模块
2. 实现图书管理模块
#define _CRT_SECURE_NO_WARNINGS //scanf宏定义 #include#include #include #define BOOK_NUM 200 #define READER_NUM 100 #define BOOK_DATA astBook[i].iNum,astBook[i].acName,astBook[i].acAuthor,astBook[i].acPress,astBook[i].iAmount #define LEN_BOOK sizeof(struct Book) //两个结构体封装图书和读者的基本信息 //图书 struct Book { int iNum;//图书编号 char acName[15];//图书名称 char acAuthor[15];//图书作者 char acPress[15];//图书出版社 int iAmount;//图书库存量 }; //读者 struct Reader { int iNum;//读者编号 char acName[15];//读者姓名 char acSex[4];//读者性别 int iMax;//读者最大可借阅数量 int iAmount;//读者当前可借阅的数量 int Bookld[10];//读者已经借阅的图书列表 }; //定义两个全局结构体来记录所有图书信息和所有读者信息 struct Book astBook[BOOK_NUM]; struct Reader astReader[READER_NUM]; //显示主菜单 void ShowMainMeun() { //清屏函数 system("cls"); printf("nnnnn"); printf("t**************************欢迎进入*************************n"); printf("t************************图书管理系统***********************n"); printf("t***************************主菜单**************************n"); printf("t************************1.图书管理*************************n"); printf("t************************2.读者管理*************************n"); printf("t************************3.借还书登记***********************n"); printf("t************************0.退出系统***********************n"); printf("n"); printf("tt请选择(0-3)"); } //显示书籍管理的子菜单 void ShowBookMenu() { system("cls"); printf("nnnnn"); printf("t|**************************欢迎进入*************************|n"); printf("t|************************图书管理系统***********************|n"); printf("t|***************************子菜单**************************|n"); printf("t|************************1.显示图书信息*************************|n"); printf("t|************************2.新增图书信息*************************|n"); printf("t|************************3.查询图书信息***********************|n"); printf("t|************************4.删除图书信息***********************|n"); printf("t|************************5.修改图书信息***********************|n"); printf("t|************************0.返回主菜单***********************|n"); printf("n"); printf("tt请选择(0-5)"); } //从文件中读取记录 int ReadBookFile(const char* pcMode) { int iBookRecord = 0; FILE* pfBook;//文件指针 pfBook = fopen("book,txt", pcMode);//用fopen_s if(pfBook==NULL) { return -1; } while (!feof(pfBook))//feof函数指的是,一直读取直到结尾 { if (fread(&astBook[iBookRecord], LEN_BOOK, 1, pfBook)) { iBookRecord++; } } fclose(pfBook); return iBookRecord; } //显示图书 void ShowBook() { int i, iBookRecord;//记录条数 system("cls"); iBookRecord = ReadBookFile("rb");//只读 if (iBookRecord == -1) { printf("该文件打开失败,请先增图书信息!n"); } if (iBookRecord == 0) { printf("文件中没有图书信息!n"); } else { printf("t|*********************************************|n"); printf("nn"); printf("t%-6s%-16s%-10s%-20s%-4sn","图书编号","书名","作者","出版社","库存量"); for(i = 0; i < iBookRecord; i++) { printf("t%-6d%-16s%-10s%-20s%-4dn", BOOK_DATA); //BOOK_DATA宏定义 } printf("nn"); printf("t|***************************************************|n"); printf("nn"); } } //新增图书信息 void AddBook() { FILE* pfBook; int iBookRecord, iFlagExist,i; //iFlagExist编号不能重复 char cFlag; system("cls"); iBookRecord = ReadBookFile("ab+");//ab+追加方式打开文件或者新建二进制文件 if (iBookRecord == -1) { printf("文件打开失败n"); return; } else if (iBookRecord == 0) { printf("没有图书记录n"); } else { ShowBook();//如果图书记录不为0,则显示所有图书 } //循环录入图书信息 printf("请选择是否输入信息(y/n):"); cFlag = getchar(); getchar(); if (cFlag == 'n') { return; } pfBook = fopen("book.txt","ab+"); if (pfBook == NULL) { printf("文件打开失败!n"); return; } while (cFlag == 'y') { //录入数据 if (iBookRecord >= BOOK_NUM)//只能录入200个数据 { printf("记录已满!"); fclose(pfBook); return; } //图书编号不能重复 printf("请输入图书编号:"); do { iFlagExist = 0; scanf("%d", &astBook[iBookRecord].iNum); getchar(); for (i = 0; i < iBookRecord; i++) { if (astBook[i].iNum == astBook[iBookRecord].iNum) { iFlagExist = 1; printf("该图书编号已经存在,请重新输入:"); break; } } } while (iFlagExist == 1); printf("请输入图书名称"); scanf("%s", astBook[iBookRecord].acName); getchar(); printf("请输入图书作者"); scanf("%s", astBook[iBookRecord].acAuthor); getchar(); printf("请输入图书出版社"); scanf("%s", astBook[iBookRecord].acPress); getchar(); printf("请输入图书库存量"); scanf("%d", &astBook[iBookRecord].iAmount); getchar(); //将新增的图书信息写入文件中 if (fwrite(&astBook[iBookRecord], LEN_BOOK, 1, pfBook) != 1) { printf("无法保存信息!n"); return; } else { printf("%d号图书信息已经保存!n", astBook[iBookRecord].iNum); iBookRecord++; } printf("继续输入信息吗?(y/n)"); cFlag = getchar(); getchar(); } fclose(pfBook); printf("添加图书信息执行完毕!n"); } //查找图书信息 int SearchBook() { int iBookNum, iBookRecord, iBookld, i; //i其中BookNum表示编号 iBookRecord表示记录条数 iBookld表示返回的查找编号 i system("cls"); iBookRecord = ReadBookFile("rb"); if (iBookRecord == -1) { printf("文件打开失败!n"); printf("|按任意键返回子菜单|"); _getch(); return -2;//文件打开失败,返回-2 } else if (iBookRecord == 0) { printf("没有图书记录!n"); printf("|按任意键返回子菜单|"); _getch(); return -3;//没有记录,返回-3 } //进入查找程序 printf("请输入图书编号"); scanf("%d", &iBookNum); getchar(); for (i = 0; i < iBookNum; i++) { if (iBookNum == astBook[i].iNum) { iBookld = i;//找到记录,返回记录编号 printf("%d号图书信息如下:n", iBookNum); printf("t|*********************************************|n"); printf("t %-6s%-16s%-10s%-20s%-4sn", "图书编号", "书名", "作者", "出版社", "库存量"); printf("t %-6d%-16s%-10s%-20s%-4dn", BOOK_DATA);//用宏定义减少代码量 printf("t|*********************************************|n"); break; } } if (i == iBookRecord) { printf("找不到%d号图书信息n", iBookNum); iBookld = -1;//找不到记录,返回-1; } return iBookld; } //删除图书信息 void DeleteBook() { FILE* pfBook; int iBookld, iBookRecord, i; char cFlag; system("cls"); iBookld = SearchBook(); if (iBookld == -1) { return; } iBookRecord = ReadBookFile("rb");// printf("已经找到该图书,是否删除?(y/n)"); cFlag = getchar(); getchar(); //删除之前需要保存删除之前的图书编号,因为删除之后图书编号信息会被覆盖 int index = astBook[iBookld].iNum; if (cFlag == 'n') { return; } else if (cFlag == 'y') { for (i = 0; i < iBookRecord - 1; i++) { astBook[i] = astBook[i + 1];//数组依次前移 } iBookRecord--; } pfBook = fopen("book.txt", "wb"); if (pfBook != NULL) { for (i = 0; i < iBookRecord; i++) { if (fwrite(&astBook[i], LEN_BOOK, 1, pfBook) != 1) { printf("无法保存该信息!n"); return; } } fclose(pfBook); printf("%d号图书信息已删除!n", index); } } //显示修改选项的子菜单 void ShowModifyBookMenu() { printf("nnn"); printf("t|**********************1.编号******************|n"); printf("t|**********************2.书名********************|n"); printf("t|**********************3.作者*******************|n"); printf("t|**********************4.出版社*********************|n"); printf("t|**********************5.图书库存量*********************|n"); printf("t 请输入所要修改的信息(输入相应的数字1-5):"); } void SaveBookFile(int iBookld) { FILE* pfBook; pfBook = fopen("book.txt", "rb+"); if (pfBook != NULL) { fseek(pfBook, LEN_BOOK * iBookld, SEEK_SET); if (fwrite(&astBook[iBookld], LEN_BOOK, 1, pfBook) != 1) { printf("无法保存该信息!n"); } } fclose(pfBook); } //修改图书信息,标号,名称,作者等 void ModifyBook() { int iBookld, iBookRecord, iFlagExist, iltem, iNum, i; system("cls"); iBookld = SearchBook(); if (iBookld == -1) { return; } if (iBookld == -3) { return; } //找到该序号的图书,可以进行修改操作 iBookRecord = ReadBookFile("rb"); //显示修改选项的子菜单 ShowModifyBookMenu(); scanf_s("%d", &iltem); getchar(); switch (iltem) { case 1: printf("请输入图书编号"); do { iFlagExist = 0; scanf_s("%d", &iNum); getchar(); for (i = 0; i < iBookRecord; i++) { if (iNum == astBook[i].iNum && i != iBookld) { iFlagExist = 1; printf("错误,该图书编号已经存在,请重新输入:"); break; } } } while (iFlagExist == 1); astBook[iBookld].iNum = iNum; break; case 2: printf("请输入图书名称"); scanf("%s", astBook[iBookld].acName); getchar(); break; case 3: printf("请输入图书作者"); scanf("%s", astBook[iBookld].acAuthor); getchar(); break; case 4: printf("请输入图书出版社"); scanf("%s", astBook[iBookld].acPress); getchar(); break; case 5: printf("请输入图书库存量"); scanf("%d", &astBook[iBookld].iAmount); getchar(); break; } SaveBookFile(iBookld); printf("图书信息修改成功n"); } //书籍管理 void MangageBook() { int iltem; ShowBookMenu();//显示书籍管理的子菜单 scanf("%d", &iltem); getchar(); while (iltem) { switch (iltem) { case 1: ShowBook();//显示图书信息 break; case 2: AddBook();//新增图书信息 break; case 3: SearchBook();//查找图书信息 break; case 4: DeleteBook();//删除图书信息 break; case 5: ModifyBook();//修改图书信息 break; default: printf("tt请输入正确的数字!ntt"); } printf("|请按任意键返回子菜单|"); _getch();//从控件中获取字符而无需回显,头文件conio ShowBookMenu(); scanf("%d", &iltem); getchar(); } } int main() { //显示主函数的界面; ShowMainMeun(); int iltem; scanf("%d", &iltem); while (iltem)//只要iltem不是0,就这一直在这个循环中,直到遇到0,突出整个系统 { switch (iltem) { case 1: MangageBook();//图书管理模块 break; case 2: //todo //MangageReader();//读者管理模块 break; case 3: //todo //BorrowReturnManger();//借还书模块 break; default: printf("tt请输入正确的数字!nt程序将于3秒后跳转到主菜单"); Sleep(3000); } ShowMainMeun(); scanf("%d", &iltem); getchar(); } return 0; }
最后运行显示界面类似如下,再进一步实现其中的信息
注意:可以自己操作实现第一模块,注意其中的宏定义部分代表的含义,还有每个函数中的子函数注意点,下一篇写第二模块---读者管理模块。



