课程设计实验报告-图书管理系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程报告
课程名称:程序设计实践
专业班级:计科1401
学生姓名:牛草原
学号:201416010101
任课教师:张玉宏
学期:2013-2014学年第二学期
课程报告任务书
开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。
使之能提供以下基本功能:
(1)图书信息录入功能(图书信息用文件保存)--输入
(2)图书信息浏览功能--输出
(3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式):
①按书名查询②按作者名查询③按照价钱排序④按出版时间排序等等
(4)图书信息的删除与修改
扩展功能:可以按照自己的程度进行扩展。
比如(1)简单的权限处理(2)报表打印功能(3)甚至根据自己情况,可以加上学生信息和借阅信息的管理,并扩充
为图书借阅系统。
(4)模糊查询(5)综合查询(6)统计功能比如统计处某一
类别的图书信息或筛选出小于指定数量库存的图书信息等等,总之,可以根据自
己需求进行分析功能。
成绩评定教师:
目录
引言 (3)
绪论 (3)
一.需求分析 (3)
二.概要设计 (5)
2.1数据结构 (5)
2.2数据需求 (5)
2.3模块划分 (5)
2.4程序总体框架 (6)
三.详细设计 (6)
3.1登陆界面 (7)
3.2功能服务 (21)
四.调试分析 (48)
五.程序不足与改进 (49)
六.课程心得总结 (49)
引言
经过对程序设计题目的分析可知,整个程序的设计实现大致可以分为五个模块,其中每个模块对应一个函数,他们分别是:图书的添加函数void add_book(void);删除图书的函数void delete_book(void);查询图书的函数void inquire_book(void);对图书进行修改的函数void revise_book(void);以及对图书进行排序的函数void sort_book(void);在这几个函数中,其功能的实现严格按照题目的要求:
1 图书信息录入函数:主要功能是从键盘上输入图书信息并将其写入文件中,作为图书馆的书库。
以便对以下的函数进行运行,此函数应是整个程序的基础。
2 查询图书函数:主要功能是按照一定的图书特征(图书名,图书作者)先将图书查询到。
3 删除图书函数:主要功能是将已存图书按照一定的图书特征(图书编号,图书名,图书作者,图书出版日期等)先将图书查询到,然后删除。
4 图书排序函数:主要功能是将已存图书按照一定的图书特征将图书进行详细的排序,具体可以分为按图书名排序,按图编号排序;按图书出版日期排序,按图书价格排序。
5 图书的修改函数:功能是将已录入的图书的编号,作者,出版日期,价钱等进行修改。
6退出函数:该函数主要实现退出运行界面的功能。
绪论
整个程序的设计实现大致可以分为五个模块,其中每个模块对应一个函数,他们分别是:图书的添加函数void add_book(void);删除图书的函数void delete_book(void);查询图书的函数void inquire_book(void);对图书进行修改的函数void revise_book(void);以及对图书进行排序的函数void sort_book(void);
1 需求分析
开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息。
使之能提供以下基本功能:
(1)图书信息录入功能(图书信息用文件保存)--输入
(2)图书信息浏览功能--输出
(3)查询功能、排序功能:
①按书名查询②按作者名查询③按照价钱排序④按出版时间排序
(4)图书信息的删除与修改
(5)学生登录和管理员登陆
(6)退出系统
程序扩展:
(7)管理员功能:
①学生信息管理
1:学生卡添加
2:学生卡信息查询
3:学生卡密码查询
4:学生卡删除
②图书信息管理
(8)学生功能:
①图书信息查询
通过此次课程设计,可以使我们增强自己的动手能力,并可以使自己编写的程序与程序之间的衔接更为自然,同时可以提高我们使用计算机解决实际问题的能力,了解并掌握C语言开发程序的全过程。
此外还可以较为综合地提高自己C语言编程能力及调试能力和自己对C语言语法的进一步认知,为自己的后续课程打好基础。
二概要设计
2.1 数据结构
该程序设计采用结构体和文件操作,用于实现对图书信息的存储,修改,查询及排序等功能。
2.2 数据需求
该程序需要系统输入及输出图书的编号,图书名,图书作者,图书出版日期以及图书价格等数据。
2.3 模块划分
该程序总体上分为6个模块,分别为:学生登录系统模块,管理员登陆系统模块,图书信息录入模块,图书信息修改模块,图书信息删除模块,图书信息查询模块及图书信息排序模块,学生卡添加模块,学生卡删除模块,学生卡信息查询模块,学生卡密码查询模块。
其中图书信息查询模块分为按书名查询,作者名字查询。
图书排序系统分为按图书编号排序,按图书价格排序,按图书出版时间排序。
各个模块之间相互独立但彼此之间有相互依附,通过彼此之间有规律的相互调用及参数的传递从而实现整个程序较为综合的功能。
简言之:
(1)void main_menu(void); 主菜单
(2)void student(void); 学生登录函数
(3)int stu_login(void); 学生登录验证
(4)void stu_find(void); 学生图书查询函数
1.void book_search_name(void); 书名查找
2.void book_search_author(void); 作者查找
3.void inquire_book(void); 查询图书(输出所有图书)
(5)void administrar(void); 管理员登录模块
(6)int adm_login(void); 管理员登录验证
(7)void ad_st_menu(void); 学生信息管理菜单
1.void add_card(void); 申请新学生卡
2.void delete_card(void); 删除学生卡
3.void passwordlookup(void); 学生卡密码查询
4.void inquire_stu(void); 查询学生卡(输出所有学生卡信息)
(8)void ad_bk_menu(void); 图书信息管理菜单
1.void add_book(void); 添加图书
2.void delete_book(void); 删除图书
3.void revise_book(void); 修改图书
4.void inquire_book1(void); 输出所有图书,管理员使用。
5.void sort_book(void); 图书排序菜单
①.void sort_book_num(void); 图书排序——编号
②.void sort_book_price(void); 图书排序——价格
③.void sort_book_time(void); 图书排序——出版时间
2.4 程序总体框架(如图2.4-1)
3.1
(1)基本介绍:用户进入当用户选择进入登录界面时(如图3.1.4-1所示),该界面会显示出“欢迎使用草原图书管理系统”字样和一个图书馆的图案,然后用户可以选择:学生登录,管理员登陆和退出系统。
选择学生登录时(如图3.1.4-2所示)需要登录学生卡号和密码经行身份验证。
选择管理员登录时(如图3.1.4-3所示)需要登录管理员账号和登录密码。
而当用户选择退出系统时,按任意键系统退出(如图 3.1.4-4所示)。
进入身份鉴定界面时,需要输入用户名及密码,允许输入三次密码。
(2)程序解析:首先,使用了基本的输入输出的标准库函数printf与scanf函数,将所需的提示语输出并实现用户选择的输入。
之后,用switch语句选择判断用户输入的操作,以确定后续操作。
其中在提示文字的排版上,我使用的是用空格键来做调整,这样做虽然麻烦耗时,但是可以精准的实现自己预期效果。
在身份鉴定操作界面,首先使用字符串数组将密码存放。
在密码输入时,使用的是密文登陆方式,即输入密码时,判断若密码不是“回车符”,就输出“*”(如图 3.1.4-5所示)并且密码还能够在发现输入错后进行退格处理,然后判断输入的密码是否与密码字符串数组中的一致,从而判断是否进入下一个选择服务界面。
输入密码时,用for循环语句限制用户只能输入三次密码,若三次全错,则提示输入密码次数已达上限按任意键退出。
(3)实验代码:
#include "header.h"
void main_menu(void)
{
char ch;
system("cls");
printf(" ==============================================\n");
printf(" 欢迎使用草原图书管理系统\n\n");
printf(" █████\n");
printf(" █田█田█\n");
printf(" █田█田█\n");
printf(" █田█田█\n");
printf(" █田█田█\n");
printf(" █████\n");
printf(" ◢██□██◣\n");
printf(" ==============================================\n\n"); printf(" 请选择您的登录模式\n\n");
printf(" 【1】学生登录【2】管理员登陆\n\n");
printf(" 【0】退出\n\n");
printf(" ==============================================\n"); printf("请输入数字0~~2:");
while(( ch=getch() ) && ( ch>'2' || ch<'0' )) //容错处理
printf("\n你的输入格式错误,请重新输入:");
switch( ch )
{
case '0':
break;
case '1':
student();
break;
case'2':
administrator();
break;
}
}
void administrator(void) //管理员登录模块菜单
{
if( adm_login() ) //登录成功
{
ad_menu();
return ;
}
else //登录失败
{
main_menu();
return ;
}
}
int adm_login(void) //管理员登录
{
int m ;
int i = 0;
int flag = 0;
char ch, key1[ 20 ] = {0};
FILE* fp=NULL;
ADMIN ad, ad1;
fp=fopen(".\\data\\administrator.txt", "r"); //判断是否有管理员注册
if(fp == NULL)
{
flag = 1;
}
else if( fgetc(fp) == EOF ) //未读取到有管理员注册
{
flag = 1;
}
if( flag )
{
system("cls");
printf("您还没有注册管理员,请先注册\n请输入账号:");
scanf("%s", &ad.num);
printf("请输入用户名:");
scanf("%s", &er);
printf("请输入密码:");
scanf("%s", &ad.key);
rc4_crypt( &ad.key, "952316946" ); //加密
if( fp != NULL )
fclose(fp);
fp = fopen(".\\data\\administrator.txt", "w");
fwrite(&ad, sizeof(ADMIN), 1, fp);
printf("注册成功!按任意键继续...\n");
getch();
fclose(fp);
}
system("cls");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("\t★欢迎使用管理员系统,请登录! ★\n");
printf("\t★★\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("\t请输入管理员账号:");
scanf("%s", &ad.num);
fp = fopen(".\\data\\administrator.txt", "r");
while(fread(&ad1, sizeof(ADMIN), 1, fp) != 0) //以数据块方式读出数据管理员账号
{
if(strcmp(ad1.num , ad.num) == 0 )
{
flag = 0;
break;
}
}
if( flag )
{
printf("没有找到此卡号,按任意键结束...\n");
getch();
fclose(fp);
return 0;
}
else
{
printf("\t请输入登录密码:");
while(( ch = getch() ) != '\r')
{
if(ch == '\b' && i != 0) //密码输入容错处理,退格
{
i--;
printf("\b \b");
continue ;
}
else
{
key1[ i++ ] = ch;
printf("*");
}
}
key1[i] = '\0';
strcpy(&ad.key, key1);
rc4_crypt(&ad.key, "952316946");
fread(&ad1, sizeof(ADMIN), 1, fp);
if(strcmp(&ad.key, &ad1.key) == 0 )
{
printf("\n登录成功,按任意键返回...");
strcpy(user_ad, &er);
getch();
fclose(fp);
return 1;
}
else
{
printf("\n对不起,密码输入错误,您还有3次机会重新输入正确密码~~~\n");
for(m = 2;m >= 0; m--)
{
while(( ch = getch() ) != '\r')
{
if(ch == '\b' && i != 0) //密码输入容错处理,退格
{
i--;
printf("\b \b");
continue ;
}
else
{
key1[ i++ ] = ch;
printf("*");
}
}
key1[i] = '\0';
strcpy(&ad.key, key1);
rc4_crypt(&ad.key, "952316946");
fread(&ad1, sizeof(ADMIN), 1, fp);
if(strcmp(&ad.key, &ad1.key) == 0 )
{
printf("\n登录成功,按任意键返回...");
strcpy(user_ad, &er);
getch();
fclose(fp);
return 1;
}
else if(m > 0)
printf("\n对不起,密码输入错误,您还有%d次机会重新输入正确密码~~~\n",m);
else
{
printf("您输入密码的次数已达上限不能继续输入,请按任意键退出~~~");
getch();;
fclose(fp);
return 0;
}
}
}
}
}
void student(void)// 学生登录
{
if( stu_login() ) //登录成功
{
stu_find();
return ;
}
else //登录失败
{
main_menu();
return ;
}
}
int stu_login(void) // 学生登录验证
{
i nt m ;
int i = 0;
int flag = 0;
char ch, key1[ 20 ] = {0};
F ILE* fp1=NULL;
if((fp1=fopen(".\\data\\studentcard.txt", "r")) == NULL ) //没有学生卡存在
{
printf("文件打开失败,按任意键结束...");
getch();
return 0;
}
else
{
system("cls");
int flag;
STU st, st1;
printf("请输入学号:");
scanf("%s", &st.num);
while(fread(&st1, sizeof(STU), 1, fp1) != 0) //以数据块方式读出数据学生卡号
{
if(strcmp(st1.num , st.num) == 0 )
{
flag = 0;
break;
}
}
if( flag )
{
printf("没有找到此学号,请查证或与管理员联系。
按任意键结束...\n");
getch();
fclose(fp1);
return 0;
}
else
{
printf("请输入登录密码:");
while(( ch = getch() ) != '\r')
{
if(ch == '\b' && i != 0) //密码输入容错处理,退格
{
i--;
printf("\b \b");
continue ;
}
else
{
key1[ i++ ] = ch;
printf("*");
}
}
key1[i] = '\0';
strcpy(&st.key, key1);
rc4_crypt(&st.key, "952316946"); //加密
if(strcmp(&st.key, &st1.key) == 0) //字符比较。
验证密码 {
printf("登录成功,按任意键返回...\n");
getch();
fclose(fp1);
return 1;
}
else
{
printf("\n对不起,密码输入错误,您还有3次机会重新输入正确密码~~~\n");
for(m = 2;m >= 0; m--)
{
while(( ch = getch() ) != '\r')
{
if(ch == '\b' && i != 0) //密码输入容错处理,退格
{
i--;
printf("\b \b");
continue ;
}
else
{
key1[ i++ ] = ch;
printf("*");
}
}
key1[i] = '\0';
strcpy(&st.key, key1);
rc4_crypt(&st.key, "952316946"); //加密
if(strcmp(&st.key, &st1.key) == 0) //字符比较。
验证密码
{
printf("登录成功,按任意键返回...\n");
strcpy(user_stu, &);
getch();
fclose(fp1);
return 1;
}
else if(m > 0)
printf("\n对不起,密码输入错误,您还有%d次机会重新输入正确密码~~~\n",m);
else
{
printf("您输入密码的次数已达上限不能继续输入,请按任意键退出~~~");
getch();;
fclose(fp1);
return 0;
}
}
}
}
}
}
(4)运行结果
图3.1.4-2
图3.1.4-3
图3.1.4-4
3.2功能服务
(1)基本介绍:功能服务分学生和管理员。
以学生身份登录的用户可以使用图书查询服务系统(如图3.2.4-1),其中有按书名查询(如图3.2.4-2)按作者查询(如图3.2.4.3)和输出所有图书信息(如图3.2.4-4)。
以管理员身份登录进入管理员系统,管理员系统分学生信息管理和图书管理两大功能(如图3.2.4-5),其中学生信息管理(如图3.2.4-6)里面分申请新学生卡号(如图3.2.4-7),删除卡号(如图3.2.4-8),查询学生卡号密码(3.2.4-9),查询学生卡(如图3.2.4-10)四大功能,图书管理分添加图书,删除图书,修改图书信息,查询所有图书信息和图书排序(如图3.2.4-11)五大功能。
其中的图书排序(如图3.2.4-12)分按编号排序(如图3.2.4-13),价格排序(如图3.2.4-14),出版时间排序(如图3.2.4-15)三种。
(2)程序解析:定义相关变量之后,使用printf与scanf输入选择的服务,并用getchar 读取选择,之后使用switch语句按照参数choice分别进行相应的后续函数调用。
(3)实验代码:
void stu_find(void) //学生查询图书系统
{
char n;
system("cls");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
printf("\t您好,欢迎进入学生图书查询系统\n\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");
printf("\t请选择查询图书的方式\n\n");
printf(" 【 1 】按书名查询【 2 】按作者\n");
printf(" 【 3 】显示所有图书信息【 0 】返回\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");
printf("请输入0~3:");
while(( n=getch() ) && ( n>'3' || n<'0' ))
printf("\n输入错误,请重新输入:");
switch(n)
{
case '0' : main_menu();
break;
case '1' : book_search_name();
break;
case '2' : book_search_author();
break;
case '3' : inquire_book();
break;
}
}
//图书查询——按书名查询
void book_search_name(void)
{
char name[30];
FILE* fp;
system("cls");
printf(" 欢迎使用图书查询服务\n\n");
printf("请输入要查询的书名:\n");
fflush( stdin );
scanf("%s", name);
if( ( fp = fopen(".\\data\\book.txt", "r") ) == NULL )
{
printf("数据读取失败,请与管理员联系,按任意键返回...");
getch();
stu_find();
return ;
}
int flag = 1;
BOOK book;
while( fread(&book, sizeof(BOOK), 1, fp) != 0)
{
if( strcmp( , name) == 0 )
int y, m, d;
flag = 0;
printf("\n你要查询的信息如下:\n\n");
printf("%-5s\t%-20s\t\%s\t%-5s\t%-10s\t%s\n", "编号", "书名", "作者", "价格","出版时间", "库存");
y = book.time_pub / 65536;
m = ( book.time_pub % 65536 ) / 256;
d = book.time_pub % 256;
printf("%-5d\t%-20s\t%s\t%.2f\t%-4d %02d %02d\t%d\n", book.num, &, &book.author, book.price, y, m, d, book.stock);
if( book.stock > 0 )
printf("\n此书库存为%d,可以借阅!借阅请记下图书编号!!!\n", book.stock);
else
printf("\n此书库存为0,不可借阅!\n");
break;
}
}
fclose(fp);
if ( flag )
printf("未找到此图书!请查证!");
printf("\n按任意键返回...");
getch();
stu_find();
return ;
}
//图书查询——按作者查询
void book_search_author(void)
{
char author[30];
FILE* fp;
system("cls");
printf(" 欢迎使用图书查询服务\n\n");
printf("请输入要查询书的作者:\n");
fflush( stdin );
scanf("%s", author);
if( ( fp = fopen(".\\data\\book.txt", "r") ) == NULL )
{
printf("数据读取失败,请与管理员联系,按任意键返回...");
getch();
stu_find();
return ;
}
int flag = 1;
BOOK book;
while( fread(&book, sizeof(BOOK), 1, fp) != 0)
{
if( strcmp( book.author, author) == 0 )
{
int y, m, d;
flag = 0;
if(times == 1) //确保只输出一次
{
printf("\n你要查询的信息如下:\n\n");
printf("%-5s\t%-20s\t\%s\t%-5s\t%-10s\t%s\n", "编号", "书名", "作者", "价格","出版时间", "库存");
times = 2;
}
y = book.time_pub / 65536;
m = ( book.time_pub % 65536 ) / 256;
d = book.time_pub % 256;
printf("%-5d\t%-20s\t%s\t%.2f\t%-4d %02d %02d\t%d\n", book.num, &, &book.author, book.price, y, m, d, book.stock);
if( book.stock > 0 )
printf("此书库存为%d,可以借阅!借阅请记下图书编号!!!\n\n", book.stock);
else
printf("此书库存为0,不可借阅!\n\n");
}
}
fclose(fp);
if ( flag )
printf("未找到图书!请查证!");
printf("\n按任意键返回...");
getch();
stu_find();
return ;
}
void inquire_book(void) //查询图书(输出所有图书)学生用
{
system("cls");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf(" 欢迎进入使用图书查询服务\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");
int y, m, d;
FILE* fp;
if( (fp = fopen(".\\data\\book.txt", "r")) == NULL )
{
printf("数据读取失败,按任意键返回...");
getch();
stu_find();
return ;
}
printf("%5s\t%-20s\t\%s\t%-5s\t%-10s\t%s\n", "编号", "书名", "作者", "价格","出版时间", "库存");
while( fread(&book1, sizeof(BOOK), 1, fp) != 0 )
{
y = book1.time_pub / 65536;
m = ( book1.time_pub % 65536 ) / 256;
d = book1.time_pub % 256;
printf("%05d\t%-20s\t%s\t%.2f\t%-4d %02d %02d\t%d\n", book1.num, &, &book1.author, book1.price, y, m, d, book1.stock);
}
fclose(fp);
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("\n按任意键返回...");
getch();
stu_find();
return ;
}
// 管理员系统
void ad_menu(void)
{
char n;
system("cls");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("您好,管理员%s,欢迎进入管理员系统\n\n", user_ad);
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("请选择服务选项\n\n");
printf("[ 1 ]学生信息管理\n");
printf("[ 2 ]图书管理\n");
printf("[ 0 ]返回\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("请输入0~2:");
while(( n=getch() ) && ( n>'2' || n<'0' ))
switch(n)
{
case '0' : main_menu(); break;
case '1' : ad_st_menu(); break;
case '2' : ad_bk_menu(); break;
}
}
void ad_st_menu(void) //学生信息管理
{
char n;
system("cls");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("\t★您好,管理员%s,欢迎进入管理员系统★\n", user_ad);
printf("\t★★\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("\t★请选择服务选项★\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("\t★【 1 】申请新卡号【 2 】删除卡号★\n");
printf("\t★★\n");
printf("\t★【 3 】查看卡号密码【 4 】查询学生卡★\n");
printf("\t★★\n");
printf("\t★【 0 】返回★\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("\t★请输入0~4:★\n");
printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
while(( n=getch() ) && ( n>'4' || n<'0' ))
printf("\n输入错误,请重新输入:");
switch(n)
{
case '0' : ad_menu(); break;
case '1' : add_card(); break;
case '2' : delete_card(); break;
case '3' : passwordlookup(); break;
case '4' : inquire_stu(); break; //查询学生卡(输出所有学生卡信息) }
}
void add_card(void) // 申请新学生卡
{
system("cls");
STU card;
if( (fp=fopen(".\\data\\studentcard.txt", "a+")) == NULL ) {
printf("数据读取失败!按任意键返回...");
getch();
ad_st_menu();
return ;
}
printf("请输入要申请的卡号:");
scanf("%s", &card.num);
printf("请输入要申请卡号的姓名:");
scanf("%s", &);
printf("请输入要申请卡号的密码:");
scanf("%s", &card.key);
rc4_crypt(&card.key, "952316946");
fwrite(&card, sizeof(card), 1, fp);
fclose(fp);
printf("注册成功!按任意键返回...");
getch();
ad_st_menu();
return ;
}
void delete_card(void) // 删除学生卡
{
system("cls");
FILE* fp=NULL, *fp1;
STU card, card1;
if( (fp=fopen(".\\data\\studentcard.txt", "a+")) == NULL ) {
printf("数据读取失败!按任意键返回...");
getch();
ad_st_menu();
return ;
}
printf("请输入要删除的卡号(如果卡号不存在,则不做修改):"); scanf("%s", &card.num);
fp1 = fopen(".\\data\\student.txt", "w");
while( fread(&card1, sizeof(STU), 1, fp) != 0 )
{
if( strcmp(&card1.num, &card.num) != 0)
{
fwrite(&card1, sizeof(STU), 1, fp1);
}
fclose(fp);
fclose(fp1);
fp1 = fopen(".\\data\\student.txt", "r");
fp=fopen(".\\data\\studentcard.txt", "w");
while(fread(&card, sizeof(STU), 1, fp1))
{
fwrite(&card, sizeof(STU), 1, fp);
}
fclose(fp);
fclose(fp1);
fp1 = fopen(".\\data\\student.txt", "w");
fclose(fp1);
printf("删除成功!按任意键返回...");
getch();
ad_st_menu();
return ;
}
void inquire_stu(void)//查询学生卡(输出所有学生卡信息)
{
system("cls");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf(" 欢迎进入使用学生卡查询服务\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");
FILE* fp;
STU stu;
if( (fp = fopen(".\\data\\studentcard.txt", "r")) == NULL )
{
printf("数据读取失败,按任意键返回...");
getch();
ad_st_menu();
return ;
}
printf("%-15s\t%-20s\n", "学号", "姓名");
while( fread(&stu, sizeof(STU), 1, fp) != 0 )
{
printf("%-15s\t%-20s\n", &stu.num, &);
}
fclose(fp);
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
getch();
ad_st_menu();
return ;
}
void passwordlookup(void) //学生卡密码查询
{
system("cls");
FILE* fp;
STU card, card1;
int flag=1;
if( (fp=fopen(".\\data\\studentcard.txt", "r")) == NULL )
{
printf("数据读取失败!按任意键返回...");
getch();
ad_st_menu();
return ;
}
printf("欢迎使用密码查询服务\n\n");
printf("请输入要查询的卡号:");
scanf("%s", &card.num);
while( fread(&card1, sizeof(STU), 1, fp) != 0 )
{
if( strcmp(&card1.num, &card.num) == 0)
{
flag = 0;
rc4_crypt(&card1.key, "952316946");
printf("你要查询卡号的信息如下:\n\n");
printf("学号姓名密码\n");
printf("%-15s%-15s%-6s\n", card1.num, , card1.key); break;
}
}
if( flag )
printf("\n没有找到此学号,请查证!\n");
fclose(fp);
printf("\n按任意键返回...\n");
getch();
ad_st_menu();
return ;
}
//图书信息管理
void ad_bk_menu(void)
{
system("cls");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("您好,管理员%s,欢迎进入管理员系统\n\n", user_ad);
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("请选择服务选项\n\n");
printf("【 1 】添加图书【 2 】删除图书\n\n");
printf("【 3 】修改图书【 4 】查询图书(所有图书信息)\n\n");
printf("【 5 】图书排序【 0 】返回\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("请输入数字0~5:");
while(( n=getch() ) && ( n>'5' || n<'0' ))
printf("\n输入错误,请重新输入:");
switch(n)
{
case '0' : ad_menu(); break;
case '1' : add_book(); break;
case '2' : delete_book(); break;
case '3' : revise_book(); break;
case '4' : inquire_book1(); break;
case '5' : sort_book(); break;
}
return ;
}
void add_book(void) //添加图书
{
system("cls");
int year, month, date;
FILE* fp;
BOOK book;
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf(" 欢迎进入使用图书添加服务\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");;
printf("请输入图书编号:");
scanf("%d", &book.num);
printf("请输入书名:");
scanf("%s", &);
printf("请输入作者:");
scanf("%s", &book.author);
printf("请输入价格:");
printf("请输入出版日期(空格隔开):");
scanf("%d %d %d", &year, &month, &date);
book.time_pub = year * 65536 + month * 256 + date ;
printf("请输入库存:");
scanf("%d", &book.stock);
if( ( fp = fopen(".\\data\\book.txt", "a+" ) ) == NULL )
{
printf("数据读取失败,按任意键返回...");
getch();
ad_bk_menu();
return ;
}
fwrite( &book, sizeof(BOOK), 1, fp);
fclose( fp );
printf("添加成功,按任意键返回...");
getch();
ad_bk_menu();
return ;
}
void delete_book(void) //删除图书
{
system("cls");
fflush(stdin);
FILE* fp, *fp1;
BOOK book, book1;
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf(" 欢迎进入使用图书删除服务\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");;
printf("请输入要删除图书的书名(如果不存在,则不做修改):");
gets(&);
if( ( fp = fopen(".\\data\\book.txt","a+" ) ) == NULL )
{
printf("数据读取失败,按任意键返回...");
getch();
ad_bk_menu();
return ;
}
fp1 = fopen(".\\data\\book1.txt","w" );
while(fread(&book1, sizeof(BOOK), 1, fp) != 0)
{
if(strcmp(&, &) != 0)
{
fclose( fp );
fclose( fp1 );
fp = fopen(".\\data\\book.txt","w" );
fp1 = fopen(".\\data\\book1.txt","r" );
while(fread(&book1, sizeof(BOOK), 1, fp1) != 0)
{
fwrite(&book1, sizeof(BOOK), 1, fp);
}
fclose( fp );
fclose( fp1 );
fp1 = fopen(".\\data\\book1.txt","w" );
fclose( fp1 );
printf("删除成功,按任意键返回...");
getch();
ad_bk_menu();
return ;
}
void revise_book(void) //修改图书
{
system("cls");
fflush(stdin);
int flag=1;
FILE* fp, *fp1;
BOOK book, book1;
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf(" 欢迎进入使用图书修改服务\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("请输入要修改图书的编号:");
scanf("%d", &book.num);
if( ( fp = fopen(".\\data\\book.txt","r" ) ) == NULL )
{
printf("数据读取失败,按任意键返回...");
getch();
ad_bk_menu();
return ;
}
while(fread(&book1, sizeof(BOOK), 1, fp) != 0)
{
if(book.num == book1.num)
{
fclose( fp );
if( flag ) //flag=1,表示没有找到
{
printf("没有找到此编号的图书,按任意键返回...");
getch();
ad_bk_menu();
return ;
}
fp1 = fopen(".\\data\\book1.txt","w" );
fp = fopen(".\\data\\book.txt","r" );
int yn=0;
while(fread(&book1, sizeof(BOOK), 1, fp) != 0)
{
if(book.num == book1.num)
{
int y, m, d;
printf("%5s\t%-20s\t\%s\t%-5s\t%-10s\t%s\n", "编号", "书名", "作者", "价格","出版时间", "库存");
y = book1.time_pub / 65536;
m = ( book1.time_pub % 65536 ) / 256;
d = book1.time_pub % 256;
printf("%05d\t%-20s\t%s\t%.2f\t%-4d %02d %02d\t%d\n", book1.num, &, &book1.author, book1.price, y, m, d, book1.stock);
printf("你确定要修改以上图书吗(y/n)\n");
char ch;
while(( ch=getch() ) && ( ch != 'y' && ch != 'n' ))
printf("\n输入错误,请重新输入:");
switch(ch)
{
case 'y' : printf("请输入编号:\n");
scanf("%d", &book1.num);
printf("请输入书名:\n");
scanf("%s", &);
printf("请输入作者:\n");
scanf("%s", &book1.author);
printf("请输入价格:\n");
scanf("%f", &book1.price);
printf("出版时间(yyyy mm dd):\n");
scanf("%d %d %d", &y, &m, &d);
book1.time_pub = y * 65536 + m * 256 + d ;
printf("请输入库存:\n");
case 'n' : yn = 1;
break;
}
}
fwrite(&book1, sizeof(BOOK), 1, fp1);
}
fclose(fp);
fclose( fp1 );
fp = fopen(".\\data\\book.txt","w" );
fp1 = fopen(".\\data\\book1.txt","r" );
while(fread(&book1, sizeof(BOOK), 1, fp1) != 0)
{
fwrite(&book1, sizeof(BOOK), 1, fp);
}
fclose( fp );
fclose( fp1 );
fp1 = fopen(".\\data\\book1.txt","w" );
fclose( fp1 );
if( yn )
printf("按任意键返回...");
else
printf("修改成功,按任意键返回...");
getch();
ad_bk_menu();
return ;
}
void inquire_book1(void) //输出所有图书管理员用
{
system("cls");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf(" 欢迎进入使用图书查询服务\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");
int y, m, d;
FILE* fp;
BOOK book1;
if( (fp = fopen(".\\data\\book.txt", "r")) == NULL )
{
printf("数据读取失败,按任意键返回...");
getch();
ad_bk_menu();
return ;
}
格","出版时间", "库存");
while( fread(&book1, sizeof(BOOK), 1, fp) != 0 )
{
y = book1.time_pub / 65536;
m = ( book1.time_pub % 65536 ) / 256;
d = book1.time_pub % 256;
printf("%05d\t%-20s\t%s\t%.2f\t%-4d %02d %02d\t%d\n", book1.num, &, &book1.author, book1.price, y, m, d, book1.stock);
}
fclose(fp);
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("\n按任意键返回...");
getch();
ad_bk_menu();
return ;
}
void sort_book(void) //图书排序菜单
{
system("cls");
fflush(stdin);
char ch;
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf(" 欢迎进入使用图书排序服务\n\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("[ 1 ]按编号排序\n");
printf("[ 2 ]按价格排序\n");
printf("[ 3 ]按出版时间排序\n");
printf("[ 0 ]返回\n");
printf("\n请选择排序方式(0~3):");
while(( ch=getch() ) && ( ch>'3' || ch<'0' ))
printf("\n输入错误,请重新输入:");
switch( ch )
{
case '1' : sort_book_num(); break;
case '2' : sort_book_price(); break;
case '3' : sort_book_time(); break;
case '0' : ad_bk_menu(); break;
}
return ;。