说是C语言程序设计的课设,实际上和上学期的数构的课设没什么区别,换了个系统而已,也不知道学校老师为啥要多一门这个课设。不过还是有所收获的,会改了很多常见的BUG,还把系统做的有点花里胡哨的(功能多了点)。等以后有空,还想再完善一下这个简易的图书管理系统,毕竟老师给了我一个“界面设计还可以再优化”的建议,而且有些地方还有些小毛病要改正。
图书出入库管理系统具体的功能包括:登陆注册、图书入库(管理员专属权限)、图书销售(购物车功能)、查看图书列表及库存情况、添加图书(加入购物车)、删除图书、数据保存、数据备份等功能,如图1所示。两个bk数组的数据分别来自文件book.txt和文件buy.txt,us数组的数据来自文件user.txt,三个数组作为数据基础,所有的功能操作都围绕着这三个数组,影响这三个数组,其数据的变化最终也要分别保存到对应的三个文件中。
基本功能:通过该系统可以进行图书信息显示、图书入库、图书销售、图书查询、图书删除等操作。
可选功能:通过该系统可以进行系统登录身份权限验证,分为普通用户和管理员两种权限身份,不同权限,可使用的功能不同。
添加图书时需要录入以下内容:书名、作者、类型、出版社、书号、价格、库存数量。
#include
#include
#include
#include
#include
#define MAXNUM 100 /*书库中书籍种类可能达到的最大数量*/
//账号状态及界面功能标识符,pyth和gly分别表示普通用户和管理员的身份;cklb和gwc分别表示查看列表和购物车的功能
int ptyh=0,gly=0,cklb=0,gwc=0;
//创建三个顺序表(书库书籍、购物车书籍、帐号)
typedef struct /*书籍定义*/
{char bkname[10]; /*书名*/
char auname[10]; /*作者*/
char type[5]; /*类型*/
char press[21]; /*出版社*/
int bknum; /*书号*/
float price; /*价格*/
int num; /*库存数量*/
} BOOK;
typedef struct
{
BOOK bk[MAXNUM]; /*通过类型定义变量,书库书籍信息数组*/
int TotalBook; /*最后一个元素在数组中的位置,即下标,空表为-1 */
}BookList; /*书籍信息表的顺序存储结构类型为BookList */
BookList book_list; /*定义书库书籍信息顺序表*/
BookList book_buy_list; /*定义购物车书籍信息顺序表*/
typedef struct /*帐号定义*/
{char name[10]; /*用户名*/
char pass[10]; /*密码*/
char type[10]; /*类型(管理员/普通用户)*/
}USER;
typedef struct
{
USER us[MAXNUM]; /*通过类型定义变量,帐号信息数组*/
int TotalUser; /*最后一个元素在数组中的位置,即下标,空表为-1 */
}UserList; /*帐号信息表的顺序存储结构类型为UserList */
UserList user_list; /*定义帐号信息顺序表*/
//创建字符串来存储文本的名称
char b[10]="book.txt";
char buy[10]="buy.txt";
char t1[10]="普通用户";
char t2[10]="管理员";
//将硬盘帐号信息文件中的数据读入对内存的book_list顺序表中
void ReadData(){
FILE *fp;
int i;
if ((fp=fopen("book.txt","rb"))==NULL){
printf("Can not open the file!\n");return;
}
fread(&book_list.TotalBook,sizeof(int),1,fp);
for(i=0;i<book_list.TotalBook;i++)
{
fread(&book_list.bk[i],sizeof(BOOK),1,fp);
}
fclose(fp);
}
//将硬盘帐号信息文件中的数据读入对内存的book_buy_list顺序表中
void ReadData_buy(){
FILE *fp;
int i;
if ((fp=fopen("buy.txt","rb"))==NULL){
printf("Can not open the file!\n");return;
}
fread(&book_buy_list.TotalBook,sizeof(int),1,fp);
for(i=0;i<book_buy_list.TotalBook;i++)
{
fread(&book_buy_list.bk[i],sizeof(BOOK),1,fp);
}
fclose(fp);
}
//将硬盘帐号信息文件中的数据读入对内存的user_list顺序表中
void ReadData_user(){
FILE *fp;
int i;
if ((fp=fopen("user.txt","rb"))==NULL)
{printf("Can not open the file!\n");return;}
fread(&user_list.TotalUser,sizeof(int),1,fp);
for(i=0;i<user_list.TotalUser;i++)
{
fread(&user_list.us[i],sizeof(USER),1,fp);
}
fclose(fp);
}
//将内存中三种顺序表的变化,分别存入对应的硬盘文件中
void WriteData(){
FILE *fp;
if ( (fp=fopen("book.txt","wb"))==NULL){
printf("Can not open the file!\n");return;
}
fwrite(&book_list.TotalBook , sizeof(int) , 1 ,fp);
fwrite(book_list.bk,sizeof(BOOK),book_list.TotalBook,fp);
fclose(fp);
}
void WriteData_buy(){
FILE *fp;
if ( (fp=fopen("buy.txt","wb"))==NULL){
printf("Can not open the file!\n");return;
}
fwrite(&book_buy_list.TotalBook , sizeof(int) , 1 ,fp);
fwrite(book_buy_list.bk,sizeof(BOOK),book_buy_list.TotalBook,fp);
fclose(fp);
}
void WriteData_user(){
FILE *fp;
int i;
if ((fp=fopen("user.txt","wb"))==NULL)
{printf("Can not open the file!\n");return;}
fwrite(&user_list.TotalUser , sizeof(int) , 1 ,fp);
for(i=0;i<user_list.TotalUser;i++)
{
fwrite(&user_list.us[i],sizeof(USER), 1,fp);
}
fclose(fp);
}
//列表显示模块
void look(BookList *L){
int i=1,s=1; //s为图书在列表中的序号 ,不是下标,是下标+1
printf("\t%-8s%-16s%-16s%-16s%-24s%-10s%-10s%-10s\n",
"序号","书名","作者","类型","出版社","书号","价格","数量");
printf("\t--------------------------------------------------------------------------------\n");
for (i=0;i<L->TotalBook;i++,s++)
printf("\t%-8d%-16s%-16s%-16s%-24s%-10d%-10.2f%-10d\n",s,L->bk[i].bkname,L->bk[i].auname,L->bk[i].type,L->bk[i].press,L->bk[i].bknum,L->bk[i].price,L->bk[i].num);
printf("\t--------------------------------------------------------------------------------\n");
}
//图书删除模块
void del(BookList *L){
int k,i=-1;
BOOK E,*e;
e=&E;
do{
system("cls");
look(L);
printf("请输入要删除图书的序号(输入0返出):");
scanf("%d",&i); //i表示图书序号,不是下标
if(i==0) break;
if((i<1)||(i>L->TotalBook+1))
{
printf("删除位置不合法!\n");
printf("信息删除失败!\n");
}
*e= L->bk[i-1]; /* 将删除的元素存放到e所指向的变量中*/
for(k=i;k<L->TotalBook;k++)
L->bk[k-1]=L->bk[k]; /*将后面的元素依次前移*/
L->TotalBook--;
printf("该图书删除成功!\n");
if(ptyh==1) WriteData_buy();
if(gly==1) WriteData();
system("pause");
}while(i);
return;
}
//图书入库模块
void bookin(BookList *L){
BOOK add;
int k,i;
do{
if(gly==1){
system("cls");
look(L);
printf("\t请输入图书要插入的位置(输入0返回):");
scanf("%d",&i);
if(i==0) break;
printf("\t请输入要插入的信息\n");
printf("\t请输入图书的书名:");
scanf("%s",add.bkname);
printf("\t请输入图书的作者:");
scanf("%s",add.auname);
printf("\t请输入图书的类型:");
scanf("%s",add.type);
printf("\t请输入图书的出版社:");
scanf("%s",add.press);
printf("\t请输入图书的书号:");
scanf("%d",&add.bknum);
printf("\t请输入图书的价格:");
scanf("%f",&add.price);
printf("\t请输入图书的数量:");
scanf("%d",&add.num);
if( (i<1)||(i>L->TotalBook+2) ){ /*首先判断插入位置是否合法*/
printf("\t插入位置i值不合法\n");
printf("\t信息插入失败!\n");
}
if(L->TotalBook>=MAXNUM-1){
printf("\t表已满无法插入\n");
printf("\t信息插入失败!\n");
}
for(k=L->TotalBook-1;k>=i-1;k--) /*其后元素后移*/
L->bk[k+1]=L->bk[k];
L->bk[i-1]=add; /*数据插入,第i个元素的下标为i-1*/
L->TotalBook++;
printf("\t图书入库成功!\n");
WriteData();
}
else if(ptyh==1){
printf("\t请输入想要加入购物车的图书编号(输入0退出):");
scanf("%d",&i);
if(i==0) break;
if(L->TotalBook>=MAXNUM-1){
printf("\t购物车已满,无法加入\n");
}
L->bk[L->TotalBook]=book_list.bk[i-1]; /*数据插入,第i个元素的下标为i-1*/
L->TotalBook++;
printf("\t图书加入购物车成功!\n");
WriteData_buy();
}
}while(i);
}
//图书购买模块
void bookbuy(){
int i,j;
float sum=0;
printf("\t您购买的有:\n");
for(i=0;i<=book_buy_list.TotalBook;i++){
sum=sum+book_buy_list.bk[i].price;
for(j=0;j<=book_list.TotalBook;j++){
if(strcmp(book_list.bk[j].bkname,book_buy_list.bk[i].bkname)==0){
book_list.bk[j].num--;
if(book_list.bk[j].num==0){
BOOK E,*e;
e=&E;
*e= book_list.bk[j]; /* 将删除的元素存放到e所指向的变量中*/
for(j;j<book_list.TotalBook;j++)
book_list.bk[j]=book_list.bk[j+1]; /*将后面的元素依次前移*/
book_list.TotalBook--;
}
break;
}
}
printf("\t%s %.2f\n",book_buy_list.bk[i].bkname,book_buy_list.bk[i].price);
}
WriteData();
FILE *fp;
fp=fopen("buy.txt","w");//假如打开的是1.txt文件
fclose(fp);//这样就清空了内容,简单!
book_buy_list.TotalBook=-1;
printf("\n下单成功,应付%.2f元!",sum);
}
//图书查询
void query(){
char a[20];
int s,b;
do{
int i=0,x=1,bj=0; /*i为扫描计数器,初值为0,即从第一个元素开始比较;b用于判断图书是否有找到*/
printf("\t1. 根据关键字查找\n");
printf("\t2. 根据价格/数量查找\n");
printf("\t请选择查找方式(输入0返回):");
scanf("%d",&s);
if(s==1){
printf("\t请输入关键字:");
scanf("%s",a);
}else if(s==2){
printf("\t请输入价格/数量:");
scanf("%d",&b);
}else break;
printf("\n\n\t--------------------------------------------------------------------------------\n");
printf("\t%-8s%-16s%-16s%-16s%-30s%-10s%-10s%-10s\n","序号","书名","作者","类型","出版社","书号","价格","数量");
printf("\t--------------------------------------------------------------------------------\n"); /*若找到,则输出该医生信息*/
for(i=0;i<=book_list.TotalBook;i++)
{
if(s==1){
if((strcmp(book_list.bk[i].bkname,a)==0)||(strcmp(book_list.bk[i].auname,a)==0)||(strcmp(book_list.bk[i].type,a)==0)){
printf("\t%-8d%-16s%-16s%-16s%-30s%-10d%-10.2f%-10d\n",x,book_list.bk[i].bkname,book_list.bk[i].auname,book_list.bk[i].type,book_list.bk[i].press,book_list.bk[i].bknum,book_list.bk[i].price,book_list.bk[i].num);
bj=1; x++; //若找到则将b变为1,说明系统中有图书符合要求,需输出该图书的信息。
}
else continue;
}else{
if(b==book_list.bk[i].num || b==book_list.bk[i].price){
printf("\t%-8d%-16s%-16s%-16s%-30s%-10d%-10.2f%-10d\n",x,book_list.bk[i].bkname,book_list.bk[i].auname,book_list.bk[i].type,book_list.bk[i].press,book_list.bk[i].bknum,book_list.bk[i].price,book_list.bk[i].num);
bj=1; x++; //若找到则将b变为1,说明系统中有图书符合要求,需输出该图书的信息。
}
else continue;
}
}
if(bj==0) printf("暂无该书!\n"); /*若b依旧为0,说明没找到,则输出无*/
printf("\t--------------------------------------------------------------------------------\n");
}while(s);
}
//图书列表/购物车查看模块
void booklist(BookList *L){
int ph,s;
if(cklb==1){
if(ptyh==1){
do{
system("cls");
look(L);
printf("\t0. 退出\n");
printf("\t1. 图书查找\n");
printf("\t2. 加入购物车\n");
printf("\t----------------------------------\n");
printf("\t请输入您要进行的操作的序号:");
scanf("%d",&s);
switch(s) //根据选择项调用对应的函数
{ case 0: break;
case 1:
system("cls");
query();
getch();break; /*图书查找功能*/
case 2:
BookList *L1;
L1=&book_buy_list;
bookin(L1);
getch();break; /*加入购物车功能*/
}
}while(s); //当选择主菜单中序号0时,结束程序
}else if(gly==1){
do{
system("cls");
look(L);
printf("\t0. 退出\n");
printf("\t1. 图书删除\n");
printf("\t----------------------------------\n");
printf("\t请输入您要进行的操作的序号:");
scanf("%d",&ph);
switch(ph) //根据选择项调用对应的函数
{ case 0: break;
case 1:
system("cls");
BookList *L1;
L1=&book_list;
del(L1);
getch();break; /*图书删除功能*/
}
}while(ph); //当选择主菜单中序号0时,结束程序
}
}else if(gwc==1){
do{
system("cls");
look(L);
printf("\t0. 退出\n");
printf("\t1. 删除\n");
printf("\t2. 结算\n");
printf("\t----------------------------------\n");
printf("\t请输入您要进行的操作的序号:");
scanf("%d",&ph);
switch(ph) //根据选择项调用对应的函数
{ case 0: break;
case 1:
system("cls");
BookList *L1;
L1=&book_buy_list;
del(L1);
getch();break; /*购物车图书删除功能*/
case 2:
system("cls");
bookbuy();
getch();break; /*图书购物结算功能*/
}
}while(ph); //当选择主菜单中序号0时,结束程序
}
}
//图书管理系统初始界面
void view_user(){ //用户界面
int sel;
ReadData_buy();
ReadData();
do{
system("cls"); //清屏
printf("\t设计者:陈佳婷 班级:计科184\n");
printf("\t程序设计课程设计(C/C++)\n");
printf("\t---------------------------------\n");
printf("\t欢迎进入图书出入库管理系统(%s)\n",t1);
printf("\t---------------------------------\n");
printf("\t0. 退出\n");
printf("\t1. 查看图书列表\n");
printf("\t2. 查看购物车\n");
printf("\t----------------------------------\n");
printf("\t请输入您要进行的操作的序号:");
scanf("%d",&sel);
switch(sel) //根据选择项调用对应的函数
{ case 0: break;
case 1:
system("cls");
cklb=1;gwc=0;
BookList *L1;
L1=&book_list;
booklist(L1);
getch();break; /*查看图书列表功能*/
case 2:
system("cls");
cklb=0;gwc=1;
BookList *L2;
L2=&book_buy_list;
booklist(L2);
getch();break; /*查看购物车功能*/
}
}while(sel); //当选择主菜单中序号0时,结束程序
}
void view(){ //管理员界面
int sel,w;
ReadData();
do{
system("cls"); //清屏
printf("\t设计者:陈佳婷 班级:计科184\n");
printf("\t程序设计课程设计(C/C++)\n");
printf("\t---------------------------------\n");
printf("\t欢迎进入图书出入库管理系统(%s)\n",t2);
printf("\t---------------------------------\n");
printf("\t0. 退出\n");
printf("\t1. 查看图书列表\n");
printf("\t2. 图书入库\n");
printf("\t----------------------------------\n");
printf("\t请输入您要进行的操作的序号:");
scanf("%d",&sel);
switch(sel) //根据选择项调用对应的函数
{ case 0: break;
case 1:
system("cls");
cklb=1;gwc=0;
BookList *L1;
L1=&book_list;
booklist(L1);
getch();break; /*查看图书列表功能*/
case 2:
system("cls");
BookList *L2;
L2=&book_list;
bookin(L2);
getch();break; /*图书入库功能*/
}
}while(sel); //当选择主菜单中序号0时,结束程序
}
//登陆界面
void login(){
system("cls"); //清屏
int a;
char u[10];
char p[10];
printf("\t---------------------------------\n");
printf("\t设计者:陈佳婷 班级:计科184\n");
printf("\t程序设计课程设计(C/C++)\n");
printf("\t-----欢迎登陆JT图书管理系统-----\n");
printf("\t用户名:\n");
scanf("%s",u);
printf("\t密码:\n");
scanf("%s",p);
for(int i=0;i<user_list.TotalUser;i++){
if(ptyh==1){
if((strcmp(u,user_list.us[i].name) == 0) && (strcmp(p,user_list.us[i].pass) == 0)&& (strcmp(t1,user_list.us[i].type) == 0)){
view_user(); //进入图书管理系统初始界面
return;
}
}else if(gly==1){
if((strcmp(u,user_list.us[i].name) == 0) && (strcmp(p,user_list.us[i].pass) == 0)&& (strcmp(t2,user_list.us[i].type) == 0)){
view(); //进入图书管理系统初始界面
return;
}
}
}
printf("账号或密码错误!请重新输入\n");
system("pause"); //屏幕停顿
system("cls"); //清屏
login();
}
//注册界面
void reg(){
system("cls"); //清屏
char user[10];
char pass[10];
int a;
USER add;
UserList *L;
L=&user_list;
printf("\t---------------------------------\n");
printf("\t设计者:陈佳婷 班级:计科184\n");
printf("\t程序设计课程设计(C/C++)\n");
printf("\t-----欢迎来到JT图书管理系统-----\n");
printf("\t您正在进行注册帐号操作\n");
printf("\t用户名:\n");
scanf("%s",add.name);
printf("\t密码:\n");
scanf("%s",add.pass);
if(ptyh==1) strcpy(add.type,t1);
else if(gly==1) strcpy(add.type,t2);
//将新注册的账户信息插入账户信息顺序表
if(L->TotalUser >= MAXNUM)//判断顺序表是否 已满??
{
printf("Seqlist has been full\n");
return ;
}
L->us[L->TotalUser]=add;
L->TotalUser++;
printf("注册成功!输入0进入登录界面:");
WriteData_user();
scanf("%d",&a);
if(a==0){
system("cls"); //清屏
login();
}
}
//身份判断界面
void id(){
int a,b;
printf("\t---------------------------------\n");
printf("\t设计者:陈佳婷 班级:计科184\n");
printf("\t程序设计课程设计(C/C++)\n");
printf("\t-----欢迎登陆JT图书管理系统-----\n");
printf("\t1、普通用户\n");
printf("\t2、管理员\n");
printf("\t请输入您的登陆身份(输入序号):");
scanf("%d",&a);
printf("\n");
printf("\t--------------------------------------------------\n");
while(a!=1 && a!=2){
printf("\t请输入正确的序号(1或2)!\n");
printf("\t请输入您的登陆身份(输入序号):");
scanf("%d",&a);
printf("\n");
printf("\t--------------------------------------------------\n");
}
if(a==1){ptyh=1;gly=0;}
else if(a==2){ptyh=0;gly=1;}
printf("\t1、已有帐号\n");
printf("\t2、还未注册账号\n");
printf("\t请选择您的帐号状态(输入序号):");
scanf("%d",&b);
printf("\n");
printf("\t--------------------------------------------------\n");
while(b!=1 && b!=2){
printf("\t请输入正确的序号(1或2)!\n");
printf("\t请选择您的帐号状态(输入序号):");
scanf("%d",&b);
printf("\n");
printf("\t--------------------------------------------------\n");
}
if(b==1) login();
else reg();
}
//主函数
int main(){
ReadData_user();
id();
}