C语言程序设计课设——图书出入库管理系统

图书出入库管理系统

C语言程序设计课设

说是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();
}

你可能感兴趣的:(c语言,数据结构)