C图书管理系统,结构体数组

在这里插入图片描述
效果如上

在这里插入图片描述
一共就这几个函数

#include<stdio.h>
#include<string.h>
#define BOOK_NUM 50

void addBook();
void login_interface();
void login_password();
void choose_identify();
void lover();
void change_password();
void searching();
void quit();
void borrow();
void rank();

typedef struct book{
	char name[10];
	double price;
	int inventory;
	int numbers;  
}BOOK;
char sys_password[10]={"11"};   //密码 
int book_num=0;            //不同下标书的总数 
int book_number=0;           //某本书的编号  一共输入了多少个书编号 
BOOK bk[BOOK_NUM];         //结构体数组 
int borrow_nums[50];        //借阅书总数
//int booknum_notcover;       //书的数量不被覆盖	
//主函数  
int main(){
		 char d;
 while(1){  //一直玩 
    printf(" \n");
    printf(" \n");
    printf(" \n");
	printf("                              WELCOME LIBRARY MANAGER :\n");//进入界面 
	printf("\n");
	printf("\n");
    //登录密码函数 
	login_password(); 	
GOGO: 
    //选择识别函数
   	choose_identify();	
	printf("                              进入菜单请输入Y/y: \n");
	scanf(" %c",&d);
	system("cls");			
	if(d=='Y'||d=='y'){		
      goto 	GOGO;
	 
	 } 
	return 0; 
 }
}
//登录密码函数 
void login_password(){
   printf("密码函数:\n");
   char enter_password[10]; 
PASSWORD_AGAIN:   
   printf("请输入密码:\n");
   scanf("%s",enter_password);
   if(strcmp(sys_password,enter_password)==0){
   	//choose_identify();
   }
   else{
  		 printf(" enter password invalid!! please again :\n");
  		 goto PASSWORD_AGAIN;
	  }
}
//选择识别函数
void choose_identify(){
	
	char a;
	login_interface(); 
	printf("choose_identify------选择识别函数:\n");	
	printf("please enter a optin<*.*>请输入菜单选项:\n");
	scanf(" %c",&a);
	switch(a){
	 case '0':lover();                       break;	
	 case '1':addBook();                    break;         //调用添加新书函数 
	 case '2':change_password();            break;
	 case '3':searching();                  break;     //检索 
	 case '4':borrow();                     break;     //借阅 
	 case '5':rank();                       break; 
	 default :printf(" input is invaid!:\n");  break; 
	}
} 
//检索函数 
void searching(){
	int i=0;
	BOOK *p;
	p= bk;	
	if(book_num>0){
	//	printf("键入新书名please enter the book`s name this %d !!book:\n",book_number);
	for(i=0;i<=book_number-1;i++){  //某书的初始值为1,所以减去1从头开始检索 
		 	printf("\n");
	 	printf("请输入书名please enter the book`s name:%s\n",(p+i)->name);
	 	printf("请输入书索引please enter the book`s invontory:%d\n",(p+i)->inventory);
	 	printf("请输入书价格please enter the book`s price:%.4lf\n",(p+i)->price);
	 	printf("请输入书数量please enter the book`s numbers:%d",(p+i)->numbers);
	 	printf("\n");
	} 
	}
	else{
	   printf("没有书,请添加not have  book :\n");
	}		
} 
//改密码函数
void change_password(){
printf("change_password-------------改密码函数:\n");
char new_password1[10];
char new_password2[10];
  //重新登录
  	login_password();
NEW_PASSWORD:
	system("cls");
  	printf("please enter a new password键入新密码:\n");
  	scanf(" %s",new_password1);
  	printf("please enter a new password again 键入旧密码:\n");
  	scanf(" %s",new_password2);
  	//密码对比 
  	if(strcmp(new_password1,new_password2)==0){
  		printf("更改成功请重新输入Change  password sccessful !plesase login again !:\n");
  		//密码覆盖
  		strcpy(sys_password,new_password2);
  		login_password(); 
	  }
  	else{
  		printf("两次密码不一致,The two passwords are inconsistent,please try again:\n");
  		goto   NEW_PASSWORD;
	  }
} 
//界面函数
void login_interface(){   
    //lover();
    
    printf("                                           =======================\n");

    printf("                                           WELCOME LIBRARY MANAGER \n");
    printf("			  ======================****************=========================\n");
    printf(" \n");
	printf("			  =                                                   	        =\n");
	printf(" \n");
	printf("			  =    【0】Return to main screen   【1】adding new books       =\n");
	printf(" \n");
	printf("			  =    【2】change password         【3】sreaching              =\n");
	printf(" \n");
	printf("		 	  =    【4】 borrow                 【5】rank                   =\n");
	printf(" \n");
	printf("			  =                                                             =\n");
	printf("			  ==========================*********==============================\n");
} 
//添加新书函数 
void addBook(){
	 //j;
    int i; 
    //int booknum_notcover;  //书不被之前的书覆盖 
	char cntinu;
	BOOK *p;		
	p=bk;	
START:	   
    for(i=book_number;i<50;i++){     //书下标的循环 从上一本书的下表开始。 
    //while(i=book_number){
	printf("键入新书名please enter the book`s name this %d !!book:\n",book_number);
	scanf("%s",(p+i)->name);
	printf("键入新书索引please enter the book`s inventory:\n");
	scanf("%d",&bk[i].inventory);     //&(bk+m)->date
	printf("键入新书价格please enter the book`s price:\n");
	scanf("%lf",&(p+i)->price); 
	printf("键入新书数量please enter the book`s numbers:\n");
	scanf("%d",&(p+i)->numbers);
	book_num=book_num+(p+i)->numbers; 
	book_number++;     //添加到第几本书         
	printf("退出请键入Y/y,out please press Y/y:\n");
	scanf(" %c",&cntinu);	
	  if(cntinu=='Y'||cntinu=='y'){
	  	printf("已退出OUTLINE!:\n");
	  	system("cls");	  	
	  	 	break;
	  }
	  
//	 else{
//	 	goto START;人家又不是自己不会跳 脱裤子放屁 
//	 } 
}
	
}
//退出函数
void quit(){
//choose_identify();
   system("pause"); 
    system("cls");	
}
//借阅函数
void borrow(){
	int i,j,z;        //书的数量 可以为负数 ,解决第0号书的问题,0号书借走以后,数量可以为负数  
 //书的数组地址,书的 数组地址不可以为负数。 
	BOOK *p;
	char next;	
	char borrow_name[10];
	p=bk;
	int y=1;
	//j=*((p+i)->number);  //Z某本书的数量 ******	
NEXT_BORROW:	 
	printf("键入要的借书名please enter book`s name to borrow:\n");
	scanf("%s",borrow_name);
	
	                                        //解决了 书的数量为负数的问题;小于0的时候 就输出 没书了
		//printf("书的总数%d\n",book_num);								    
	   if(book_num>0){  //图书管还有书的时候 
	      // printf(" *************** !!!:\n");    
		for(z=0;z<=book_num;z++){            //书的编号 
	   	//	for(i=0;i<=(p+z)->numbers;i++){         //指向某本书的 数量 
	  	 if(strcmp(borrow_name,bk[z].name)==0 && bk[z].numbers>0){    //判断这本书的书名以及余量 
		 // printf("bk[i].name:%s\n",bk[i].name);
		   printf("借书成功,borroW successful !!!:\n");
		    (p+z)->numbers--;//这本书的数量减去1     //书的数量变量的问题,一直在弹出没有书 
			 book_num--; //书的总数减去1
			 borrow_nums[z]++; //借阅书总数++

    		if(strcmp(borrow_name,bk[z].name)==0){	//判断 借到书之后的流程    
				printf("继续借书请按Y/y NEXT TO borrow?please enter a word Y/y:\n");			
				scanf(" %c",&next);  //输入  失败=   这个地方是不报错的 
	     		if(next=='Y'||next=='y'){    //继续借书 分支语句可以 只有 if  
					printf("enter  Y:\n");		
						goto   NEXT_BORROW;	   	    	 
        		}
		 		 else{   
					break;
		  				}				 		
				}
		 			else{       //没有借到书 退出 
						printf("没有这本书,或 余量不足  NOT have this book:\n");
	      					//break;	
	      			 }			
   			}
	
				}

			}
		   		 else{
					printf("本地没有书 THERE NOT have  book !!!:\n");		
	          	 }	 
	   	
	}                                     						 
//热度排行函数
void rank(){
 int i,j;
 int c;
 BOOK *p;
 p=bk;
//遍历图书馆里的书、根据索引 
//将他们存入不同的变量
//变量的冒泡排序 	
//根据索引搞
//printf("  RANK:%d\n",book_number+1);
if(borrow_nums[0]>0){               
  for(i=0;i<book_number;i++){
	printf("\n");	
	  for(j=0;j<book_number-i-1;j++){       //冒泡排序 
		if(borrow_nums[i]<borrow_nums[i+1]){    //
			c=borrow_nums[i+1];
			borrow_nums[i+1]=borrow_nums[i];
			borrow_nums[i]=c;
		 }		
       }
   	 printf(" BOOK:%s RANK:%d\n",(p+i)->name,borrow_nums[i]);	
   }
 }	
}	 	  	
//心 
void lover(){
		float a,x,y;
	for(y=1.5f; y>-1.5f; y-=0.1f)
	{   

		for(x=-1.5f; x<1.5f; x+=0.05f)
		{
			a = x*x+y*y-1;
			//这里的@符号即为打印出的心形图案符号,可更改
			char ch = a*a*a-x*x*y*y*y<=0.0f?'@':'            '; 
			putchar(ch);  
			//或者putchar(a*a*a-x*x*y*y*y<=0.0f?'*':' ');
		}
		//printf("\n");
		  system("pause");	
	}
}

**总结:**算是个小项目把,难度不大,里面用到了 指针,指针的调用,以及结构体,还复习了一下冒泡算法。

有点难度的点:就是在处理借书时的各个变量,借书的本书,借的书的编号,这些地方我都用了,全局变量来处理,虽然不是很好,但是我也不想折腾了。。。
已解决与没有解决的BUG:√1借书函数,只借一本书 第二本第三本借不到
√2rank函数
√3书不被之前的书覆盖
√4索引的时候 显示不出来后面加的书、

5请输入新密码 循环

√6书没了还能借到
√7书的数量为负数

√8借不到后面两本书,一直借 第一本书 的数量减少

9 没有书不要显示出来
√11书总体数量有问题
12按任意键继续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值