文章目录
1.设计任务
1.1 设计题目的描述
该系统包含管理员管理系统、读者查询系统和批量查询系统。
功能如下:
(1)管理员可以显示、增加、删除、修改图书信息;
(2)读者可以通过书名、图书编号和作者查询图书信息,并告诉读者书籍是否借出,如果未借出,返回图书存放地址;
(3)通过出版社或作者批量查询图书;
(4)书库的容量可以自由增加;
1.2 设计要求
(1)仔细审题,明确题目要求。
(2)按照结构化的程序设计思想,将程序模块化,将相对独立的功能写成函数。
(3)要求编程、调试通过并演示;程序编写规范,添加适当注释。
(4)按照课程设计报告的内容和格式要求,撰写课程设计报告,并且打印。
2.设计方案说明
2.1 数据的存储结构
定义的结构体数组如下:
struct Book {
int iNum; //图书编号
char Category[20]; //类别
char Name[20]; //图书名称
char Author[20]; //作者
char Press[20]; //出版社
char Day[15]; //出版日期
char Location[20]; //存放位置
int Lendto; //是否借出
};
2.2函数之间的调用关系说明
图1 函数调用关系:
2.3函数说明
ManageBook()函数
(1) 函数的原型声明
void ManageBook(); //图书管理子系统;
(2) 函数功能及参数说明
功能:完成图书显示、添加、删除、修改等操作函数的调用;
参数:无;
(3) 函数中使用的关键变量说明
变量1:n , 用来记录选择的操作类型
(4) 算法设计
1. 输入n;
2. 显示子菜单;
3. while()循环,n为‘0’时退出系统;
4. switch()操作功能的选择,调用相应的函数;
注:(ManageReader()函数; pLBook()函数;原理大致相同)
ShowBook()函数
(1) 函数的原型声明
void ShowBook();
(2) 函数功能及参数说明
功能:显示已录入的图书
参数:无
(3) 函数中使用的关键变量说明
变量1:i , 循环变量
变量2:iBookRecord ,图书记录文件中已存储的图书数量
(4) 算法设计
1. 清屏;
2. 调用ReadBookFile()函数,读取文件中图书数量;
3. 判断文件是否打开成功
4. 遍历输出已录入的图书信息
AddBook()函数
(1) 函数的原型声明
void AddBook();
(2) 函数功能及参数说明
功能:实现图书的添加,并写入文件中
参数:无
(3) 函数中使用的关键变量说明
变量1:pBook ,文件指针
变量2:iBookRecord ,图书记录文件中已存储的图书数量
变量3:cFlag , 是否录入图书选项
(4) 算法设计
1. 清屏
2. 调用ReadBookFile()函数,读取文件中图书数量;
3. 判断文件是否打开成功
4. 输入选项,是否添加图书
5. while() 循环判断输入
6. 判断文件内存是否充足,内存不足调用gaidaxiao()函数扩容
7. 输入各类图书信息
8. 判断是否正确写入文件,写入则图书数量+1
9. 关闭文件
DeleteBook()函数
(1) 函数的原型声明
void DeleteBook();
(2) 函数功能及参数说明
功能:实现图书从文件中删除
参数:无
(3) 函数中使用的关键变量说明
变量1:pBook ,文件指针
变量2:iBookRecord ,图书记录文件中已存储的图书数量
变量3:cFlag , 是否录入图书选项
变量4:iBookId , 记录要删除图书的位置
(4) 算法设计
1. 清屏
2. 调用SearchBook()函数,读取要删除图书的位置
3. 调用ReadBookFile()函数,读取文件中图书数量;
4. 输入选项,是否删除图书
5. 把从删除图书的那一项开始的后每项都向前移动一个脚标,达到删除的目的。
6. 以“wb”的形式打开文件
7. 将删除后的数据写入文件
8. 判断是否正确写入文件
9. 关闭文件
SearchBook()函数
(1) 函数的原型声明
int SearchBook();
(2) 函数功能及参数说明
功能:实现从文件中按图书编号查找图书
参数:无
(3) 函数中使用的关键变量说明
变量1:iBookNum , 输入的图书编号
变量2:iBookRecord ,图书记录文件中已存储的图书数量
变量3:iBookId , 记录要查找的图书位置
(4) 算法设计
1. 清屏
2. 调用ReadBookFile()函数,读取文件中图书数量;
3. 文件是否打开成功
4. 输入图书编号
5. 遍历查找图书,找到输出图书信息
注:(NameSearchBook();函数; AuthorSearchBook()函数; PressSearchBook()函数;原理大致相同)
ModifyBook()函数
(1) 函数的原型声明
void ModifyBook();
(2) 函数功能及参数说明
功能:实现文件中图书的信息修改
参数:无
(3) 函数中使用的关键变量说明
变量1:iItem , 修改选项的编号
变量2:iBookRecord ,图书记录文件中已存储的图书数量
变量3:iBookId , 记录要查找的图书位置
(4) 算法设计
1. 清屏
2. 调用SearchBook()函数,查找相应的图书
3. 调用ReadBookFile()函数,读取文件中图书数量;
4. 调用 ShowModifyBookMenu()函数,显示修改选项菜单
5. 输入修改选项编号
6. switch()选择并修改信息
7. 调用 SaveBookFile()函数,保存修改结果
ReadBookFile函数
(1) 函数的原型声明
int ReadBookFile(const char *pcMode);
(2) 函数功能及参数说明
功能:打开图书文件,并返回图书数量
参数:const char *pcMode , 文件打开的方式
(3) 函数中使用的关键变量说明
变量1:pBook ,文件指针
变量2:iBookRecord ,图书记录文件中已存储的图书数量
(4) 算法设计
1. 打开文件
2. 每次读一个结构体(一本书),成功后计数+1
3. 关闭文件
4. 返回文件中图书数量
FiNum()函数
(1) 函数的原型声明
void FiNum();
(2) 函数功能及参数说明
功能:按图书编号查找图书
参数:无
(3) 函数中使用的关键变量说明
变量1:iBookId , 记录要查找的图书位置
(4) 算法设计
1. 清屏
2. 调用SearchBook()函数,在文件中找到图书编号所对应的图书;
3. 判断图书是否有剩余,有则输出图书的位置
注:(Fname()函数; Fauthor()函数; Fpress()函数;原理大致相同)
SaveBookFile()函数
(1) 函数的原型声明
void SaveBookFile(int iBookId);;
(2) 函数功能及参数说明
功能:在文件中写入修改数据
参数:int iBookId ,修改图书的位置
(3) 函数中使用的关键变量说明
变量1:pBook ,文件指针
(4) 算法设计
1. 打开文件
2. fseek()找到修改文件的位置
3. fwrite()写入修改信息
4. 关闭文件
3设计题目源代码清单
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>
#include<Windows.h>
#include<string.h>
#define Book_Data astBook[i].iNum,astBook[i].Name,astBook[i].Category,astBook[i].Press,astBook[i].Author,astBook[i].Day,astBook[i].Location,astBook[i].Lendto
#define LEN_BOOK sizeof(struct Book)//Book结构体的大小
int BOOK_NUM=10; //书的个数
struct Book {
int iNum; //图书编号
char Category[20]; //类别
char Name[20]; //图书名称
char Author[20]; //作者
char Press[20]; //出版社
char Day[15]; //出版日期
char Location[20]; //存放位置
int Lendto; //是否借出
};
struct Book *astBook=(struct Book*)malloc(10*sizeof(struct Book));
//struct Book astBook[BOOK_NUM];//结构体数组记录所有图书信息
//函数声明
void ManageBook(); //图书管理子系统
void ManageReader(); //读者借阅系统
void pLBook(); //批量查询系统
void ShowBookMenu(); //显示图书管理子系统菜单
void ShowReaderMenu();//显示读者借阅系统菜单
void ShowMainMenu(); //主菜单
void pLMenu(); //批量查询菜单
int NameSearchBook(); //通过书名查找图书信息
int AuthorSearchBook(); //通过作者查找图书信息
int AuthorSearchBook1(); //有输出
int PressSearchBook(); //通过出版社查找图书信息
int SearchBook(); //通过图书编号查找图书信息
void ShowBook(); //显示图书信息
void DeleteBook(); //删除图书信息
void ModifyBook(); //修改图书信息
void AddBook(); //添加图书信息
void ShowModifyBookMenu(); //显示修改图书的可修改选项
int ReadBookFile(const char *pcMode); //从图书文件中读取图书记录
void SaveBookFile(int iBookId); //写入函数
void Fname(); //按书名查询图书
void FiNum(); //按图书编号查询图书
void Fauthor(); //按作者姓名查询图书
void Fauthor1(); //有输出
void Fpress(); //按出版社查询图书
int gaidaxiao(int BOOK_NUM);//扩容
void Print(int i,int iBookId);//打印查找的书籍和借书状态
int gaidaxiao(int BOOK_NUM){
struct Book *astBook=(struct Book*)malloc(BOOK_NUM*sizeof(struct Book));
BOOK_NUM*=2;
astBook=(struct Book*)realloc(astBook,BOOK_NUM*sizeof(struct Book));
return BOOK_NUM;
}
void ShowMainMenu() {
//主菜单
system("cls");
printf("\n\n\n\n\n");
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("\t|----------------------------------------------|\n");
printf("\n");
printf("\t\t请选择(0-3):");
}
void pLMenu(){
system("cls");
printf("\n\n\n\n\n");
printf("\t|------------------欢迎进入--------------------|\n");
printf("\t| 图书馆管理系统 |\n");
printf("\t| 批量查询系统 |\n");
printf("\t| |\n");
printf("\t| 1.根据 出版社 查询 |\n");
printf("\t| 2.根据 作 者 查询 |\n");
printf("\t| 0.退出系统 |\n");
printf("\t|----------------------------------------------|\n");
printf("\n");
printf("\t\t请选择(0-2):");
}
void ShowBookMenu(){
system("cls");
printf("\n\n\n\n\n");
printf("\t|------------------欢迎进入--------------------|\n");
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| 0.返回主菜单 |\n");
printf("\t|----------------------------------------------|\n");
printf("\n");
printf("\t\t请选择(0-4):");
}
void ShowReaderMenu(){
system("cls");
printf("\n\n\n\n\n");
printf("\t|------------------欢迎进入--------------------|\n");
printf("\t| 图书馆管理系统 |\n");
printf("\t| 读者借阅系统 |\n");
printf("\t| |\n");
printf("\t| 1.按书名查询图书 |\n");//void Fname()
printf("\t| 2.按图书编号查询图书 |\n");//void FiNum()
printf("\t| 3.按作者姓名查询图书 |\n");//void Fauthor()
printf("\t| 0.返回主菜单 |\n");
printf("\t|----------------------------------------------|\n");
printf("\n");
printf("\t\t请选择(0-3):");
}
void ShowModifyBookMenu(){
printf("\n\n\n\n\n");
printf("\t|------------------欢迎进入--------------------|\n");
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| 6.存放位置 |\n");
printf("\t| 7.是否借出 |\n");
printf("\t| 0.返回主菜单 |\n");
printf("\t|----------------------------------------------|\n");
printf("\n");
printf("\t\t请选择(0-7):");
}
void ManageBook() {
int n;
ShowBookMenu();//显示子菜单
scanf("%d", &n);
getchar();
while (n) {
switch (n) {
case 1:
ModifyBook();//修改图书信息
break;
case 2:
DeleteBook();//删除图书信息
break;
case 3:
AddBook();//添加图书信息
break;
case 4:
ShowBook();//显示图书信息
break;
default:
printf("\t\t请输入正确数字!\n\t\t");
}
printf("|按任意键返回子菜单|");
getchar();
ShowBookMenu();
scanf("%d",&n);
getchar();
}
}
void pLBook() {
int n;
pLMenu();//显示子菜单
scanf("%d", &n);
getchar();
while (n) {
switch (n) {
case 1:
Fpress();//出版社
break;
case 2:
Fauthor();//作者
break;
default:
printf("\t\t请输入正确数字!\n\t\t");
}
printf("|按任意键返回子菜单|");
getchar();
pLMenu();
scanf("%d",&n);
getchar();
}
}
void ManageReader() {
//读者借阅系统
int n;
ShowReaderMenu();//显示子菜单
scanf("%d", &n);
getchar();
while (n) {
switch (n) {
case 1:
Fname(); //按书名查询图书
break;
case 2:
FiNum(); //按图书编号查询图书
break;
case 3:
Fauthor1(); //按作者姓名查询图书
break;
default:
printf("\t\t请输入正确数字!\n\t\t");
}
printf("|按任意键返回子菜单|");
getchar();
ShowReaderMenu();
scanf("%d",&n);
getchar();
}
}
void ShowBook(){
int i,iBookRecord;
system("cls");
iBookRecord = ReadBookFile("rb");
if(iBookRecord==-1){
printf("文件打开失败,请先新增加图书信息\n");
}else if(iBookRecord==0){
printf("文件中没有图书信息!\n");
}else {
printf("\t|-----------------------------------------------------------------------------|\n");
printf("\t %-6s%-12s%-6s%-12s%-10s%-10s%-10s%-2s\n",
"编号","书名","类别","出版社","作者","出版日期","存放位置","是否借出('1'表示借出)");
for(i=0;i<iBookRecord;i++){
printf("\t %-6d%-12s%-6s%-12s%-10s%-10s%-10s%-2d\n",Book_Data);
}
printf("\t|-----------------------------------------------------------------------------|\n");
}
}
void AddBook() {
FILE *pBook;//文件指针
int iBookRecord;
char cFlag;
system("cls");
iBookRecord = ReadBookFile("ab+");
if(iBookRecord==-1){
printf("文件打开失败!\n");
}else if(iBookRecord==0){
printf("没有图书信息!\n");
}else
ShowBook();
printf("请选择是否输入信息(y/n):");
cFlag=getchar();
getchar();
if(cFlag=='n')
return;
pBook=fopen("book.txt","ab+");
if(pBook==NULL){
printf("文件打开失败");
return;
}
while(cFlag=='y'){
if(iBookRecord>=BOOK_NUM){
printf("记录已满!");
BOOK_NUM=gaidaxiao(BOOK_NUM);
printf("已自动扩容为%d",BOOK_NUM);
// fclose(pBook);
// return;
}
printf("请输入图书编号:");
scanf("%d",&astBook[iBookRecord].iNum);
printf("请输入图书名称:");
scanf("%s",astBook[iBookRecord].Name);
printf("请输入图书类别:");
scanf("%s",astBook[iBookRecord].Category);
printf("请输入图书出版社:");
scanf("%s",astBook[iBookRecord].Press);
printf("请输入图书作者:");
scanf("%s",astBook[iBookRecord].Author);
printf("请输入图书出版日期:");
scanf("%s",astBook[iBookRecord].Day);
printf("请输入图书存放位置:");
scanf("%s",astBook[iBookRecord].Location);
printf("请输入图书是否借出('1'表示借出):");
scanf("%d",&astBook[iBookRecord].Lendto);
getchar();
if(fwrite(&astBook[iBookRecord],LEN_BOOK,1,pBook)!=1){
printf("无法保存该信息");
return;
}
else{
printf("已保存!\n");
iBookRecord++;
}
printf("是否继续输入信息(y/n):");
cFlag=getchar();
getchar();
}
fclose(pBook);
printf("添加图书执行完毕!\n");
}
int SearchBook(){
int iBookNum,iBookRecord,iBookId,i;
system("cls");
iBookRecord = ReadBookFile("rb");
if(iBookRecord == -1){
printf("文件打开失败!\n");
printf("按任意键返回子菜单");
getch();
return -1;
}else if(iBookRecord == 0){
printf("没有图书记录\n");
printf("按任意键返回子菜单");
getch();
return -1;
}
//进入查找程序
printf("请输入图书编号:");
scanf("%d",&iBookNum);
getchar();
for(int i=0;i<iBookRecord;i++){
if(iBookNum==astBook[i].iNum){
iBookId=i;
printf("图书信息如下:\n");
printf("\t|-----------------------------------------------------------------------------|\n");
printf("\t %-6s%-12s%-6s%-12s%-10s%-10s%-10s%-2s\n",
"编号","书名","类别","出版社","作者","出版日期","存放位置","是否借出('1'表示借出)");
printf("\t %-6d%-12s%-6s%-12s%-10s%-10s%-10s%-2d\n",Book_Data);
printf("\t|-----------------------------------------------------------------------------|\n");
}
}
if(i==iBookRecord){
printf("找不到图书!\n");
iBookId=-1;
}
return iBookId;
}
int NameSearchBook(){
int iBookRecord,iBookId,i;
char name[20];
system("cls");
iBookRecord = ReadBookFile("rb");
if(iBookRecord == -1){
printf("文件打开失败!\n");
printf("按任意键返回子菜单");
getch();
return -1;
}else if(iBookRecord == 0){
printf("没有图书记录\n");
printf("按任意键返回子菜单");
getch();
return -1;
}
//进入查找程序
printf("请输入书名:");
scanf("%s",name);
getchar();
for(int i=0;i<iBookRecord;i++){
if(strcmp(name,astBook[i].Name)==0){
Print(i,iBookId);
if(astBook[i].Lendto==0){
printf("图书还有剩余!\n");
printf("图书的位置在:%s\n",astBook[i].Location);
}
else{
printf("图书没有剩余了!");
}
}
}
if(i==iBookRecord){
printf("找不到图书!\n");
iBookId=-1;
}
return iBookId;
}
int PressSearchBook(){
int iBookRecord,iBookId,i;
char name[20];
system("cls");
iBookRecord = ReadBookFile("rb");
if(iBookRecord == -1){
printf("文件打开失败!\n");
printf("按任意键返回子菜单");
getch();
return -1;
}else if(iBookRecord == 0){
printf("没有图书记录\n");
printf("按任意键返回子菜单");
getch();
return -1;
}
//进入查找程序
printf("请输入出版社名称:");
scanf("%s",name);
getchar();
for(int i=0;i<iBookRecord;i++){
if(strcmp(name,astBook[i].Press)==0){
Print(i,iBookId);
}
}
if(i==iBookRecord){
printf("找不到图书!\n");
iBookId=-1;
}
return iBookId;
}
int AuthorSearchBook(){
int iBookRecord,iBookId,i;
char name[20];
system("cls");
iBookRecord = ReadBookFile("rb");
if(iBookRecord == -1){
printf("文件打开失败!\n");
printf("按任意键返回子菜单");
getch();
return -1;
}else if(iBookRecord == 0){
printf("没有图书记录\n");
printf("按任意键返回子菜单");
getch();
return -1;
}
//进入查找程序
printf("请输入作者姓名:");
scanf("%s",name);
getchar();
for(int i=0;i<iBookRecord;i++){
if(strcmp(name,astBook[i].Author)==0){
Print(i,iBookId);
}
}
if(i==iBookRecord){
printf("找不到图书!\n");
iBookId=-1;
}
return iBookId;
}
int AuthorSearchBook1(){
int iBookRecord,iBookId,i;
char name[20];
system("cls");
iBookRecord = ReadBookFile("rb");
if(iBookRecord == -1){
printf("文件打开失败!\n");
printf("按任意键返回子菜单");
getch();
return -1;
}else if(iBookRecord == 0){
printf("没有图书记录\n");
printf("按任意键返回子菜单");
getch();
return -1;
}
//进入查找程序
printf("请输入作者姓名:");
scanf("%s",name);
getchar();
for(int i=0;i<iBookRecord;i++){
if(strcmp(name,astBook[i].Author)==0){
Print(i,iBookId);
if(astBook[i].Lendto==0){
printf("图书还有剩余!\n");
printf("图书的位置在:%s\n",astBook[i].Location);
}
else{
printf("图书没有剩余了!");
}
}
}
if(i==iBookRecord){
printf("找不到图书!\n");
iBookId=-1;
}
return iBookId;
}
void Print(int i,int iBookId){
iBookId=i;
printf("图书信息如下:\n");
printf("\t|-----------------------------------------------------------------------------|\n");
printf("\t %-6s%-12s%-6s%-12s%-10s%-10s%-10s%-2s\n",
"编号","书名","类别","出版社","作者","出版日期","存放位置","是否借出('1'表示借出)");
printf("\t %-6d%-12s%-6s%-12s%-10s%-10s%-10s%-2d\n",Book_Data);
printf("\t|-----------------------------------------------------------------------------|\n");
}
void DeleteBook() {
FILE *pBook;
int iBookId,iBookRecord,i;
char cFlag;
system("cls");
iBookId=SearchBook();
if(iBookId==-1){
return;
}
iBookRecord=ReadBookFile("rb");
printf("已找到图书,是否删除?(y/n)");
cFlag=getchar();
getchar();
if(cFlag=='n'){
return;
}
else if(cFlag=='y'){
for(i=iBookId;i<iBookRecord-1;i++)
astBook[i] = astBook[i+1];
iBookRecord--;
}
pBook=fopen("book.txt","wb");
if(pBook!=NULL){
for(i=0;i<iBookRecord;i++){
if(fwrite(&astBook[i],LEN_BOOK,1,pBook)!=1){
printf("无法保存该信息!\n");
return;
}
}
fclose(pBook);
printf("已删除!\n");
}
}
void ModifyBook() {
int iBookId,iBookRecord,iFlag,iItem,iNum,i;
system("cls");
iBookId=SearchBook();
if(iBookId==-1){
return;
}
//修改操作
iBookRecord=ReadBookFile("rb");
ShowModifyBookMenu();
scanf("%d",&iItem);
getchar();
switch(iItem){
case 1:
printf("请输入图书名称:");
scanf("%s",astBook[iBookId].Name);
getchar();
break;
case 2:
printf("请输入图书类别:");
scanf("%s",astBook[iBookId].Category);
getchar();
break;
case 3:
printf("请输入图书出版社:");
scanf("%s",astBook[iBookId].Press);
getchar();
break;
case 4:
printf("请输入图书作者:");
scanf("%s",astBook[iBookId].Author);
getchar();
break;
case 5:
printf("请输入图书出版日期:");
scanf("%s",astBook[iBookId].Day);
getchar();
break;
case 6:
printf("请输入图书存放位置:");
scanf("%s",astBook[iBookId].Location);
getchar();
break;
case 7:
printf("请输入图书是否借出('1'表示借出):");
scanf("%d",&astBook[iBookId].Lendto);
getchar();
break;
}
SaveBookFile(iBookId);
printf("图书修改成功!\n");
}
int ReadBookFile(const char *pcMode){
int iBookRecord=0;
FILE *pBook;
pBook = fopen("book.txt",pcMode);
if(pBook==NULL){
return -1;
}
while(!feof(pBook)){
if(fread(&astBook[iBookRecord],LEN_BOOK,1,pBook))
iBookRecord++;
}
fclose(pBook);
return iBookRecord;
}
void SaveBookFile(int iBookId){
FILE *pBook;
pBook=fopen("book.txt","rb+");
if(pBook!=NULL){
fseek(pBook,LEN_BOOK*iBookId,SEEK_SET);//SEEK_SET从文件开头偏移
if(fwrite(&astBook[iBookId],LEN_BOOK,1,pBook)!=1)
printf("无法保存该信息!\n");
}
fclose(pBook);
}
void Fname(){
int iBookId;
system("cls");
iBookId=NameSearchBook();
if(iBookId==-1){
return;
}
printf("已找到图书\n");
}
void FiNum(){
int iBookId;
system("cls");
iBookId=SearchBook();
if(iBookId==-1){
return;
}
printf("已找到图书\n");
if(astBook[iBookId].Lendto==0){
printf("图书还有剩余!\n");
printf("图书的位置在:%s\n",astBook[iBookId].Location);
}
else{
printf("图书没有剩余了!");
}
}
void Fauthor(){
int iBookId;
system("cls");
iBookId=AuthorSearchBook();
if(iBookId==-1){
return;
}
printf("已找到图书\n");
}
void Fauthor1(){
int iBookId;
system("cls");
iBookId=AuthorSearchBook1();
if(iBookId==-1){
return;
}
printf("已找到图书\n");
}
void Fpress(){
int iBookId;
system("cls");
iBookId=PressSearchBook();
if(iBookId==-1){
return;
}
printf("已找到图书\n");
}
int main() {
int n;
ShowMainMenu();
scanf("%d", &n);
getchar();
while (n) {
switch (n) {
case 1:
ManageBook();
break;
case 2:
ManageReader();
break;
case 3:
pLBook();
break;
default:
printf("\t\t请输入正确的数字!\n\t\t程序将于3秒后跳转到主菜单");
Sleep(3000);
}
ShowMainMenu();
scanf("%d",&n);
getchar();
}
return 0;
}
4 程序测试
4.1 测试数据说明
|-----------------------------------------------------------------------------|
编号 书名 类别 出版社 作者 出版日期 存放位置 是否借出('1'表示借出)
1 西安 Q QWER 张三 20200901 A-1-1 1
2 汉中 W QWER 李四 20200321 A-1-2 1
3 宝鸡 E QWER 王五 20030212 A-1-3 0
4 安康 R ASDF 曹操 20090201 A-1-4 1
5 榆林 T ASDF 孙权 20090213 B-1-1 0
6 西安 Q QWER 张三 20200901 B-1-2 0
7 咸阳 A ASDF 刘备 20060121 B-1-3 0
8 渭南 S ASDF 张三 20060213 C-1-1 0
9 延安 k ZXCV 李四 20030201 C-1-2 0
10 铜川 D ZXCV 张三 20010302 C-1-3 1
|-----------------------------------------------------------------------------|
4.2 输出结果说明
目录:
1. 管理员管理系统:
1. 目录
2. 显示图书信息
3. 删除图书信息
4. 添加图书信息
5. 修改图书信息
2. 读者查询系统
1. 目录
2. 按书名查询图书
3. 按图书编号查询图书
4. 按作者姓名查询图书
3. 批量查询系统
1. 目录
2. 根据出版社批量查询
3. 根据作者批量查询
5 课程设计总结
问题及解决方案:
问题1:如何实现程序菜单
解决方案: 通过while()和switch()嵌套,做到对应功能的选择。
问题2:如何扩充文件中图书的数量
解决方案: 通过malloc()和realloc()实现动态内存分配
问题3:如何实现文件的读取和写入
解决方案: 通过文件指针和一系列函数实现具体如下:
1. 文件的打开FILE *fp; fp=fopen(filename,mode);
三个基本模式:“r”(read)模式总是打开一个已经存在的文件,如果文件不存在则出错。“w”(write)模式建立一个新文件,如果文件已经存在,那么先删除存在的文件,再建立新文件。“a”(append)打开一个存在的文件,在文件的尾部追加数据。
三个追加符:“b”(binary)表示二进制文件。“t”(或默认)表示文本文件。“+”表示将模式扩展为可读、可写方式。
2. 文件的关闭fclose(fp);//fp是文件指针;
3. 文件的写入fwrite(buf,size,count,fp);
buf:类型为void指针,表示内存中存放着数据到首地址,通常是数组名或数组指针。size:无符号整型,表示一次写入的字节数。count:无符号整型,表示写入的大小为size的块的次数。fp:文件指针。
4. 文件的读取fread(buf,size,count,fp);
buf:类型为void指针,表示内存中存放着数据到首地址,通常是数组名或数组指针。size:无符号整型,表示一次读取的字节数。count:无符号整型,表示读取的大小为size的块的次数。fp:文件指针。
问题4:有时程序执行完出现闪退问题
解决方案:
用getch();会等待你按下任意键,再继续执行下面的语句;所在头文件: conio.h;函数用途:从控制台读取一个字符,但不显示在屏幕上;函数原型:int getch(void);返回值:读取的字符
问题5:输入数据后程序卡住不动
解决方案:
scanf不接收回车符,只是遇到回车符就提交,因此,scanf提交之后,回车符还留在缓冲区中,程序卡住不动,问题不是出在scanf无法提交,而是出在scanf提交之后,下一次循环,scanf遇到了缓存中的回车,直接认为用户按回车了,再一次不接收回车符,如此循环
scanf之后,随便找个getchar()函数,接收一下回车符,这样缓存里面就没有回车符了,接收的回车符也不用管它,目的是把他接出来。
心得体会:
C语言是计算机程序设计的重要理论基础,在我们今后的学习生活中都有着十分重要的地位。要学好C语言,仅仅通过课本上的知识是远远不够的,我们要经常动手,锻炼实践能力。也只有多动手,多去实现程序功能开发,才能发现我们的一些问题,不断提高我们的学习能力,改进完善自己的知识体系,在我独立完成这个项目的过程中,我也遇到了一些之前不懂的知识点,特别是通过文件来存储数据,由于之前对文件知识的欠缺,导致一开始根本无从下手,通过这个项目也锻炼了我自主学习的能力,经过老师的讲解和网上资料的阅读学习,我基本上掌握了文件的创建、打开、写入、读取和关闭,通过本次项目的应用,我进一步熟悉文件操作的流程,为以后的程序开发打下基础,也培养了自己开发一个程序的思维,从功能构思,到伪代码设计,再到程序实现,最后的调试运行修改,通过一周的学习和不断完善,开发的图书信息管理系统完美实现项目要求,通过测试,各模块功能正常,感谢老师对我的指导,使我能够用这一周的时间开发出我自己的第一个C语言程序。我相信,有了这第一个程序的经验积累,今后一定能写出更加高效简洁的程序。