第一章
§1.1题目描述
图书管理系统设计:
【要求】图书管理信息包括:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等。试设计一图书管理系统,使之能提供以下功能:
(1) 新图书基本信息的输入;
(2) 图书基本信息的查询;
(3) 对撤销图书信息的删除;
(4) 办理借书手续;
(5) 办理还书手续;
【提示】建立图书馆里信息结构体,结构体成员包括图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号。存在状态设为整型,可用不同数字代表借还状态。借书和还书手续要注意修改结构体的成员变量存在状态的值。
§1.2算法设计
1.设计思想:
在整个系统编写的过程中,涉及了较多C语言知识点,对于不同的数据类型、程序控制结构、数据结构作以分析和总结,并结合这个课题进行综合的应用,在一定程度上做到了对所学知识融会贯通。由此进一步加深、巩固了所学的课程的基本理论知识,培养了综合分析问题、解决问题的能力。在设计程序时,参考了学校图书馆的图书管理系统,实现了程序的模块化、结构化。在主函数中调用各种函数,操作界面简单,易操作,人机互动性较强。
2.实现注释:
这个实用的小型图书管理系统程序以结构体数组指针操作完成,并实现文件信息的录入、修改和保存等功能,所有信息以磁盘文件方式保存,方便用户使用。本图书管理系统分为管理员和学生两个部分,其基本功能包括了对图书信息的存储、查询、添加、删除和借书、还书手续办理等。查询时可按书名、编号等方式查询,找到后输出这本书的所有信息。可查询图书的在库状态,方便用户进行借书、还书操作。在借书还书成功后图书的在库状态自动改变,并更新信息到数据库。系统中主要的数据结构就是图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等。在处理过程中各项可以作为一本图书的不同属性来进行处理。
3.结构体系设计
图1.1:主函数结构;图1.2:新书信息录入流程;图1.3:图书信息查询(管理员)流程;图1.4:图书信息查询(学生)流程;图1.5:图书信息删除流程;图1.6:办理借书手续流程;图1.7:办理还书手续流程;
§1.3程序设计及代码分析
1.程序设计:
下面,我大致介绍一下我的系统的主要功能和注意事项:
当运行此程序时,首先进入系统主界面,然后可以选择[1].管理员登陆(密码:123),[2].学生登陆,[0].退出系统;
选择[1]后进入管理员系统,验证密码成功后显示管理员功能菜单,按数字键选择所需服务。管理员功能菜单中,[1].新书信息录入,[2].图书信息查询,[3].图书信息删除,[4].返回主菜单,[0].退出系统;当出现“请选择”时,输入选项前的数字,输完之后按回车(下同)。首次运行系统需要先选择[1]录入库存书籍信息,图书各信息项须用空格键隔开,输入完毕后信息自动储存并更新至数据库,然后再选择其他操作。当选择[3]时会进入图书信息删除,在这里可以选择删除图书信息等操作,需要注意的是每次执行删除操作需要手动选择保存图书信息的操作,不然磁盘文件信息不会改变。
选择[2]后进入学生系统,然后显示学生功能菜单,按数字键选择所需服务。学生功能菜单中,[1].图书信息查询,[2].办理借书手续,[3].办理函数手续,[4].返回主菜单,[0].退出系统;当出现“请选择”时,输入选项前的数字。当进入办理借书和还书手续功能时需要注意的是每次执行操作需要手动选择确认等操作,否子磁盘文件信息不会改变。
所有信息最后均以磁盘文件方式保存,而且格式固定,输入和输出均按这种格式,用户在使用时必须要按这种格式输入,否则会出现文件信息错误。
2.代码分析:
/**********源程序代码**********/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LONG sizeof(struct Book)
struct Book
{
char title[100];
char author[50];
char press[100];
char year[5];
char claim_number[30];
int collection;
int can_borrow;
char unit_price[10];
char student_name[50];
char sex[5];
char student_id[20];
long long int number;
};
/**********函数声明**********/
void main_meun();//【主界面函数】
void manager_menu();//【管理员功能界面函数】
void student_meun();//【学生功能界面函数】
int book_add(int back);//【新书信息录入函数】
int search_2(int back);//【图书信息查询(学生版)】
int search_1(int back);//【图书信息查询函数(管理员版)】
int search_number(int back);//【按编号查询函数(管理员版)】
int search_title(int back);//【按书名查询函数(管理员版)】
void search_menu();//【图书查询函数界面(管理员版)】
int book_delete(int back);//【图书信息删除函数】
int borrow(int back);//【办理借书手续函数】
int return_book(int back);//【办理还书手续函数】
/**********主函数**********/
int main()
{
int a,b,c,z;
int back=0,back2=0,back3=0;
A:system("cls");//A为一个标志位,用于从子函数返回主界面
back=0;back2=0;back3=0;
main_meun();//【主界面函数】
while(1)//主程序循环运行
{
scanf("%d",&a);
switch(a)
{
case 1://进入管理员界面
{
printf("登陆密码【123】:");
scanf("%d",&z);
if(z!=123)goto A;
B:system("cls");//B为一个标志位,用于从子函数返回管理员功能界面
back=0;back2=0;back3=0;
manager_menu();//【管理员功能界面函数】
while(1)
{
scanf("%d",&b);
switch(b)
{
case 1:{back2=book_add(back2);if(back2==1)goto B;}//进入新书信息录入
case 2:{back2=search_1(back2);if(back2==1)goto B;}//进入图书信息查询
case_3:{back2=book_delete(back2);if(back2==1)goto B;}//进入图书信息删除
case 4:goto A;//返回主菜单
case 0://退出系统
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}break;
case 2://进入学生界面
{
C:system("cls");//C为一个标志位,用于从子函数返回学生功能界面
back=0;back2=0;back3=0;
student_meun();//【学生功能界面函数】
while(1)
{
scanf("%d",&c);
switch(c)
{
case 1:{ back3=search_2(back3);if(back3==1)goto C; }//进入图书信息查询
case 2:{ back3=borrow(back3);if(back3==1)goto C; }//办理借书手续
case 3:{ back3=return_book(back3);if(back3==1)goto C; }//办理还书手续
case 4:goto A;//返回主菜单
case 0://退出系统
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}break;
case 0://退出系统
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
/**********其他函数**********/
void main_meun()//【主界面函数】
{
printf(" ============================================================\n");
printf(" | |\n");
printf(" | 欢迎使用图书管理系统 |\n");
printf(" | |\n");
printf(" | |\n");
printf(" | [1].管理员登陆 [2].学生登陆 [0].退出系统 |\n");
printf(" | |\n");
printf(" ============================================================\n");
printf("请选择:");
}
void manager_menu()//【管理员功能界面函数】
{
printf(" ============================================================\n");
printf(" | |\n");
printf(" | [1].新书信息录入 |\n");
printf(" | |\n");
printf(" | [2].图书信息查询 |\n");
printf(" | |\n");
printf(" | [3].图书信息删除 |\n");
printf(" | |\n");
printf(" | [4].返回主菜单 |\n");
printf(" | |\n");
printf(" | [0].退出系统 |\n");
printf(" | |\n");
printf(" ============================================================\n");
printf("请选择:");
}
void student_meun()//【学生功能界面函数】
{
printf(" ============================================================\n");
printf(" | |\n");
printf(" | [1].图书信息查询 |\n");
printf(" | |\n");
printf(" | [2].办理借书手续 |\n");
printf(" | |\n");
printf(" | [3].办理还书手续 |\n");
printf(" | |\n");
printf(" | [4].返回主菜单 |\n");
printf(" | |\n");
printf(" | [0].退出系统 |\n");
printf(" | |\n");
printf(" ============================================================\n");
printf("请选择:");
}
int book_add(int back)//【新书信息录入函数】
{
FILE *fp;
struct Book *p1;
long long int a,b;
int n;
fp=fopen("图书信息数据库.txt","a+");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
while(1)
{
A:system("cls");//A为一个标志位,用于返回本函数首界面
p1=(struct Book*)malloc(LONG);
fseek(fp,-11,SEEK_END);
fscanf(fp,"%lld",&a);
if(a<0)a=20011001;
fseek(fp,0,SEEK_END);
printf("上一本图书编号:%lld\n",a);
printf("请输入新图书信息:\n");
printf("===============================================================================\n");
printf("书名 作者 出版社 年份 索取号 单价 数量\n"); printf("-------------------------------------------------------------------------------\n");
p1->number=a+1;
strcpy(p1->student_id,"未知");
strcpy(p1->student_name,"未知");
strcpy(p1->sex,"未知");
scanf("%s %s %s %s %s %s %d",p1->title,p1->author,p1->press,p1->year,p1->claim_number,p1->unit_price,&p1->collection);
p1->can_borrow=p1->collection;
fprintf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",p1->title,p1->author,p1->press,p1->year,p1->claim_number,p1->unit_price,p1->collection,p1->can_borrow,p1->student_name,p1->sex,p1->student_id,p1->number);
fflush(fp);
if(1collection)
{
for(b=2;b<=p1->collection;b++)
{
p1->number=a+b;
fprintf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",p1->title,p1->author,p1->press,p1->year,p1->claim_number,p1->unit_price,p1->collection,p1->can_borrow,p1->student_name,p1->sex,p1->student_id,p1->number);
fflush(fp);
}
}
printf("\a");
printf(" -------------------------------------------------------\n");
printf(" [1].继续录入 [2].结束录入 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&n);
switch(n)
{
case 1:goto A;
case 2:{fclose(fp);back=1;return(back);}
}
}
}
int search_2(int back)//【进入图书信息查询(学生版)】
{
FILE *fp;
char title[100];
struct Book *p;
int a1=0,b1;
A:system("cls");//A为一个标志位,用于返回本函数首界面
back=0;
printf("请输入书名:");
scanf("%s",title);
fp=fopen("图书信息数据库.txt","r");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
p=(struct Book*)malloc(LONG);
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",p->title,p->author,p->press,p->year,p->claim_number,p->unit_price,&p->collection,&p->can_borrow,p->student_name,p->sex,p->student_id,&p->number);
if(strcmp(title,p->title)==0)
{
a1=1; printf("===============================================================================\n");
printf("书名 作者 出版社 年份 索取号 馆藏 可借\n"); printf("-------------------------------------------------------------------------------\n"); printf("%-28s%-8s%-19s%-6s%-11s%-5d%d\n",p->title,p->author,p->press,p->year,p->claim_number,p->collection,p->can_borrow);
break;
}
}
if(a1==1)
{
fclose(fp);
printf("\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续搜索 [2].返回学生功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&b1);
while(1)
{
switch(b1)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
if(a1==0)
{
fclose(fp);
printf("\a \n 未找到与条件相符的图书!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续搜索 [2].返回学生功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&b1);
while(1)
{
switch(b1)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
}
int search_1(int back)//【进入图书信息查询函数(管理员版)】
{
int a,back3;
A:system("cls");//A为一个标志位,用于返回本函数首界面
back=0;back3=0;
search_menu();
scanf("%d",&a);
while(1)
{
switch(a)
{
case 1:{back3=search_number(back3);if(back3==1)goto A;}//进入编号查询
case 2:{back3=search_title(back3);if(back3==1)goto A;}//进入书名查询
case 3:return(back=1);
}
}
}
int search_number(int back)//【按编号查询函数(管理员版)】
{
FILE *fp;
long long int number;
struct Book *p;
int b1;
A:system("cls");//A为一个标志位,用于返回本函数首界面
back=0;
printf("请输入图书编号(数字):");
scanf("%lld",&number);
fp=fopen("图书信息数据库.txt","r");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
p=(struct Book*)malloc(LONG);
while(1)
{
if(feof(fp))
{
fclose(fp);
printf("\a\n 未找到与条件相符的图书!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续搜索 [2].返回上一级菜单 [0].退出系统
\n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&b1);
while(1)
{
switch(b1)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
fscanf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",p->title,p->author,p->press,p->year,p->claim_number,p->unit_price,&p->collection,&p->can_borrow,p->student_name,p->sex,p->student_id,&p->number);
if(number==p->number)
{
fclose(fp); printf("===============================================================================\n\n");
printf(" %-6s%-12lld%-8s%-12s%-6s%-8s%s%s\n\n","编号:",p->number,"索取号:",p->claim_number,"年份:",p->year,"单价:",p->unit_price);
printf(" 书名:%s\n\n",p->title);
printf(" %-6s%-12s%s%s\n\n","作者:",p->author,"出版社:",p->press);
printf(" %-6s%-12d%s%d\n\n","馆藏:",p->collection,"可借:",p->can_borrow);
printf(" 借书人信息|| %-6s%-10s%-6s%-7s%-7s%s\n\n","姓名:",p->student_name,"性别:",p->sex,"学号:",p->student_id); printf("===============================================================================\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续搜索 [2].返回上一级菜单 [0].退出系统
\n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&b1);
while(1)
{
switch(b1)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
}
}
int search_title(int back)//【按书名查询函数(管理员版)】
{
FILE *fp;
char title[100];
struct Book *p;
int a1,b1;
A:system("cls");//A为一个标志位,用于返回本函数首界面
back=0;
a1=0;
printf("请输入书名:");
scanf("%s",title);
fp=fopen("图书信息数据库.txt","r");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
p=(struct Book*)malloc(LONG);
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",p->title,p->author,p->press,p->year,p->claim_number,p->unit_price,&p->collection,&p->can_borrow,p->student_name,p->sex,p->student_id,&p->number);
if(strcmp(title,p->title)==0)
{
a1=1; printf("===============================================================================\n\n");
printf(" %-6s%-12lld%-8s%-12s%-6s%-8s%s%s\n\n","编号:",p->number,"索取号:",p->claim_number,"年份:",p->year,"单价:",p->unit_price);
printf(" 书名:%s\n",p->title);
printf(" %-6s%-12s%s%s\n\n","作者:",p->author,"出版社:",p->press);
printf(" %-6s%-12d%s%d\n","馆藏:",p->collection,"可借:",p->can_borrow);
printf(" 借书人信息|| %-6s%-10s%-6s%-7s%-7s%s\n\n","姓名:",p->student_name,"性别:",p->sex,"学号:",p->student_id); printf("===============================================================================\n");
}
}
if(a1==1)
{
fclose(fp);
printf(" -------------------------------------------------------\n");
printf(" [1].继续搜索 [2].返回上一级菜单 [0].退出系统
\n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&b1);
while(1)
{
switch(b1)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
if(a1==0)
{
fclose(fp);
printf("\a \n未找到与书名相符的图书!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续搜索 [2].返回上一级菜单 [0].退出系统
\n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&b1);
while(1)
{
switch(b1)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
}
void search_menu()//【图书查询函数界面(管理员版)】
{
printf(" ============================================================\n");
printf(" | |\n");
printf(" | [1].按图书编号查询 |\n");
printf(" | |\n");
printf(" | [2].按图书名称查询 |\n");
printf(" | |\n");
printf(" | [3].返回上一级菜单 |\n");
printf(" | |\n");
printf(" ============================================================\n");
printf("请选择:");
}
int book_delete(int back)//【图书信息删除函数】
{
FILE *fp;
char title[100],d[100];
struct Book n[1000];
int i,j;
struct Book *p;
int a,b,c,e,f;
A:system("cls");//A为一个标志位,用于返回本函数首界面
back=0,i=0,j=0,b=0,a=0;
printf("请输入书名:");
scanf("%s",title);
fp=fopen("图书信息数据库.txt","r");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
p=(struct Book*)malloc(LONG);
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",p->title,p->author,p->press,p->year,p->claim_number,p->unit_price,&p->collection,&p->can_borrow,p->student_name,p->sex,p->student_id,&p->number);
if(strcmp(title,p->title)==0)
{
a=1;
if(strcmp(p->student_name,"未知")!=0)b=1; printf("===============================================================================\n\n");
printf(" %-6s%-12lld%-8s%-12s%-6s%-8s%s%s\n\n","编号:",p->number,"索取号:",p->claim_number,"年份:",p->year,"单价:",p->unit_price);
printf(" 书名:%s\n",p->title);
printf(" %-6s%-12s%s%s\n\n","作者:",p->author,"出版社:",p->press);
printf(" %-6s%-12d%s%d\n","馆藏:",p->collection,"可借:",p->can_borrow);
printf(" 借书人信息|| %-6s%-10s%-6s%-7s%-7s%s\n\n","姓名:",p->student_name,"性别:",p->sex,"学号:",p->student_id); printf("===============================================================================\n");
}
}
fclose(fp);
if(b==1)
{
fclose(fp);
printf("\a \n\n此书正在出借,无法删除信息!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].重新搜索 [2].返回管理员功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&b);
while(1)
{
switch(b)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
if(a==1&&b!=1)
{
printf("\a\n\n 确认删除?\n");
printf(" -------------------------------------------------------\n");
printf(" [1].是 [2].否 \n");
printf(" -------------------------------------------------------\n");
scanf("%d",&c);
while(1)
{
switch(c)
{
case 1:
{
fp=fopen("图书信息数据库.txt","r");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",&n[i].title,&n[i].author,&n[i].press,&n[i].year,&n[i].claim_number,&n[i].unit_price,&n[i].collection,&n[i].can_borrow,&n[i].student_name,&n[i].sex,&n[i].student_id,&n[i].number);
if(strcmp(title,n[i].title)==0)
{ strcpy(d,n[i].press);strcpy(n[i].press,n[i].title);strcpy(n[i].title,d);
e=n[i].number/10000;n[i].collection=e;
f=n[i].number%10000;n[i].can_borrow=f;
n[i].number=1234567890;
}
i+=1;
}
j=i;
fclose(fp);
fp=fopen("图书信息数据库.txt","w");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
i=0;
while(j!=0)
{
fprintf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",n[i].title,n[i].author,n[i].press,n[i].year,n[i].claim_number,n[i].unit_price,n[i].collection,n[i].can_borrow,n[i].student_name,n[i].sex,n[i].student_id,n[i].number);
fflush(fp);
i+=1;
j-=1;
}
fclose(fp);
system("cls");
printf(" \n 删除成功!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续删除 [2].返回管理员功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&b);
while(1)
{
switch(b)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
case 2:return(back=1);
}
}
}
if(a!=1)
{
fclose(fp);
printf("\a \n 未找到与书名相符的图书!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].重新搜索 [2].返回管理员功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&b);
while(1)
{
switch(b)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
}
int borrow(int back)//【办理借书手续函数】
{
FILE *fp;
char title[100];
char student_name[50],sex[5],student_id[20];
struct Book *p,n[1000];
int a,b,c,d,i,j;
A:system("cls");//A为一个标志位,用于返回本函数首界面
back=0;a=0;b=0;i=0;j=0;d=0;
printf("请输入书名:");
scanf("%s",title);
fp=fopen("图书信息数据库.txt","r");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
p=(struct Book*)malloc(LONG);
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",p->title,p->author,p->press,p->year,p->claim_number,p->unit_price,&p->collection,&p->can_borrow,p->student_name,p->sex,p->student_id,&p->number);
if(strcmp(title,p->title)==0)
{
a=1;
if(p->can_borrow!=0)b=1; printf("===============================================================================\n");
printf("书名 作者 出版社 年份 索取号 馆藏 可借\n");
printf("-------------------------------------------------------------------------------\n"); printf("%-28s%-8s%-19s%-6s%-11s%-5d%d\n",p->title,p->author,p->press,p->year,p->claim_number,p->collection,p->can_borrow);
break;
}
}
if(a!=1)
{
fclose(fp);
printf("\a \n 无该书信息!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续搜索 [2].返回学生功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&c);
while(1)
{
switch(c)
{
case 1:goto A;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
if(b!=1)
{
fclose(fp);
printf("\a \n 无法办理该书借阅手续!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续搜索 [2].返回学生功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&c);
while(1)
{
switch(c)
{
case 1:goto A;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
if(b==1)
{
printf("\a\n\n 是否办理该书借书手续?\n");
printf(" -------------------------------------------------------\n");
printf(" [1].是 [2].否 \n");
printf(" -------------------------------------------------------\n");
scanf("%d",&c);
while(1)
{
switch(c)
{
case 1:
{
system("cls");
printf("请输入你的个人信息:\n");
printf(" =======================================================\n");
printf(" 姓名 性别 学号 \n");
printf(" -------------------------------------------------------\n");
scanf("%s %s %s",student_name,sex,student_id);
fp=fopen("图书信息数据库.txt","r");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",&n[i].title,&n[i].author,&n[i].press,&n[i].year,&n[i].claim_number,&n[i].unit_price,&n[i].collection,&n[i].can_borrow,&n[i].student_name,&n[i].sex,&n[i].student_id,&n[i].number);
if(strcmp(title,n[i].title)==0)
{
if(d!=1&&strcmp(n[i].student_name,"未知")==0)
{
strcpy(n[i].student_name,student_name);
strcpy(n[i].sex,sex);
strcpy(n[i].student_id,student_id);
d=1;
}
n[i].can_borrow-=1;
}
i+=1;
}
fclose(fp);
j=i;
fp=fopen("图书信息数据库.txt","w");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
i=0;
while(j!=0)
{
fprintf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",n[i].title,n[i].author,n[i].press,n[i].year,n[i].claim_number,n[i].unit_price,n[i].collection,n[i].can_borrow,n[i].student_name,n[i].sex,n[i].student_id,n[i].number);
fflush(fp);
i+=1;j-=1;
}
fclose(fp);
system("cls");
printf(" \n 借书办理成功!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续借书 [2].返回学生功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&c);
while(1)
{
switch(c)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
case 2:return(back=1);
}
}
}
}
int return_book(int back)//【办理还书手续函数】
{
FILE *fp;
char title[100];
char student_name[50];
struct Book *p,n[1000];
int a,b,c,d,i,j;
A:system("cls");//A为一个标志位,用于返回本函数首界面
back=0;a=0;b=0;i=0;j=0;d=0;
printf("请输入你的姓名:");
scanf("%s",student_name);
fp=fopen("图书信息数据库.txt","r");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
p=(struct Book*)malloc(LONG);
printf("你目前的借书情况:\n");
printf("===============================================================================\n");
printf("书名 作者 出版社 年份 索取号 馆藏 可借\n");
printf("-------------------------------------------------------------------------------\n");
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",p->title,p->author,p->press,p->year,p->claim_number,p->unit_price,&p->collection,&p->can_borrow,p->student_name,p->sex,p->student_id,&p->number);
if(strcmp(student_name,p->student_name)==0)
{
a=1;
printf("%-28s%-8s%-19s%-6s%-11s%-5d%d\n",p->title,p->author,p->press,p->year,p->claim_number,p->collection,p->can_borrow);
printf("-------------------------------------------------------------------------------\n");
}
}
fclose(fp);
if(a!=1)
{
printf("你目前没有借书记录!\n");
printf(" -------------------------------------------------------\n");
printf(" [1].返回学生功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&c);
while(1)
{
switch(c)
{
case 1:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
if(a==1)
{
printf("\n请输入所还图书书名(每次一种):");
scanf("%s",title);
printf("\a\n\n 是否确认办理该书还书手续?\n");
printf(" -------------------------------------------------------\n");
printf(" [1].是 [2].否 \n");
printf(" -------------------------------------------------------\n");
printf("请输入:");
scanf("%d",&c);
while(1)
{
switch(c)
{
case 1:
{
system("cls");
fp=fopen("图书信息数据库.txt","r");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",&n[i].title,&n[i].author,&n[i].press,&n[i].year,&n[i].claim_number,&n[i].unit_price,&n[i].collection,&n[i].can_borrow,&n[i].student_name,&n[i].sex,&n[i].student_id,&n[i].number);
if(strcmp(title,n[i].title)==0)
{
if(strcmp(n[i].student_name,student_name)==0)
{
strcpy(n[i].student_name,"未知");
strcpy(n[i].sex,"未知");
strcpy(n[i].student_id,"未知");
}
n[i].can_borrow+=1;
}
i+=1;
}
fclose(fp);
j=i;
fp=fopen("图书信息数据库.txt","w");
if(fp==NULL){printf("数据库打开错误!请检查...\n");exit(0);}
i=0;
while(j!=0)
{
fprintf(fp,"%s %s %s %s %s %s %d %d %s %s %s %lld\n",n[i].title,n[i].author,n[i].press,n[i].year,n[i].claim_number,n[i].unit_price,n[i].collection,n[i].can_borrow,n[i].student_name,n[i].sex,n[i].student_id,n[i].number);
fflush(fp);
i+=1;j-=1;
}
fclose(fp);
system("cls");
printf(" \n 还书办理成功!\n\n");
printf(" -------------------------------------------------------\n");
printf(" [1].继续还书 [2].返回学生功能菜单 [0].退出系统 \n");
printf(" -------------------------------------------------------\n");
printf("请选择:");
scanf("%d",&c);
while(1)
{
switch(c)
{
case 1:goto A;break;
case 2:return(back=1);
case 0:
{
system("cls");
printf(" ------------------------------------------------------------\n");
printf(" -= 感谢使用,再见! =- \n");
printf(" ------------------------------------------------------------\n");
exit(0);
}
}
}
}
case 2:return(back=1);
}
}
}
}
§1.4实验数据及运行效果截图
运行程序,系统菜单:
管理员功能界面:
新书信息录入完成:
图书信息查询(管理员):
按图书名称查询结果:
图书信息删除(遇删除图书正在出借情况):
学生功能界面:
办理还书手续:
§1.5设计中出现的错误及解决方法
在编写这个图书管理系统中,遇到的最大问题是,对数据库文件信息的定向修改。原本试图通过文件指针的飘移与写入覆盖来实现数据库文件的定位修改,但是不能成功。后来还是采用的全文覆盖的方法;程序编写过程中多次存在无限循环的情况,后来通过检查解决问题。遗憾的是在本次编写程序中没有很好的学会动态链表的使用,而是采用的结构体数组,以后需加强对链表的学习。
通过这次实践,我体会到了c语言学习的实用性。将理论和实践结合在一起,用先进的计算机工具方便人们的生活。C语言程序的编写首先要从大局考虑,把自己编写整个程序的思想都写在草稿上,这样有助于自己编写程序,在编写时要完善注释,方便其他人理解程序。编写的程序从理论上来说并没有错,但以上机就问题不断。甚至有些课本上的知识照搬不变,也不能得到正确的结果。有时一个程序改了一遍又一遍,但就是不能成功,编程显得枯燥乏味,看似简单的程序题,在调试时却屡屡出错。经反复的修改后,结果正确了,这时所有的乏味都显得那么无力,一切都是值得的。
我认为,开发一套系统,最重要的是细心,并且思考要全面,结合实际,充分考虑到客户的需求和现实意义。不管什么系统,只用运用到实际应用中,才具有先现实意义。 所以c语言程序的实用性很强,我们以后还要更加努力认真地学习编程语言。
合肥学院计算机科学与技术系课程设计报告20xx20xx学年第二学期课学学专指业导班教生姓程C语言课程设计图书管理系统名号级师课程设…
第一章1.1题目描述图书管理系统设计:【要求】图书管理信息包括:图书名称、图书编号、单价、作者、存在状态、借书人姓名、性别、学号等…
第三章图书管理系统的设计与实现3.1系统的需求分析图书登记管理系统作为一个应用软件将为学校的老师和学生提供一个对学校图书馆深入了解…
河南工业大学C语言课程设计报告20xx20xx学年第2学期课程C语言课程设计课程设计名称图书管理系统姓名晁永兵学号20xx1604…
课程设计报告图书馆管理系统目录1题目与要求22系统总体设计要给出必要的文字说明及必要的图示321功能需求分析明确选题的功能需求32…
中国地质大学本科生课程论文封面课程名称c语言课程设计教师姓名樊媛媛本科生姓名本科生学本科生专业所在院系类别日期课程设计评语1注1无…
合肥学院计算机科学与技术系课程设计报告20xx20xx学年第二学期课学学专指业导班教生姓程C语言课程设计图书管理系统名号级师课程设…
课程设计报告书课程名称班级学号姓名指导老师通讯录管理系统一需求分析设计题目及要求建立通讯录信息信息至少包含编号姓名年龄电话通讯地址…
C语言课程设计报告图书信息管理系统设计指导老师:C语言程序设计编程实践是学习C语言程序设计的一重要环节,上机实习和课程设计是提高同…
第三章图书管理系统的设计与实现3.1系统的需求分析图书登记管理系统作为一个应用软件将为学校的老师和学生提供一个对学校图书馆深入了解…
大连交通大学软件学院C语言课程设计报告SOFTWAREINSTITUTEOFDALIANJIAOTONGUNIVERSITYEXP…