精华内容
下载资源
问答
  • 主要为大家分享了C语言图书借阅系统源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • c语言图书借阅系统源码.zip
  • C语言图书借阅系统

    2013-06-05 10:41:47
    适合刚上手的C语言爱好者参照学习使用,简单易懂
  • 图书借阅系统源码 。
  • c语言实现图书借阅系统

    千次阅读 多人点赞 2019-06-12 23:21:00
    #include <stdio.h> #include <string.h> #include <stdlib.h>...struct book //定义图书结构体 { int num; // 书号 char name[20]; //书名 char publish[20]; // 出版社 s...
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <conio.h>
    
    
    struct book  //定义图书结构体
    {
    	int num;  // 书号
    	char name[20];  //书名
    	char publish[20];  // 出版社
        struct time //定义时间结构体
    	{
    		int year,month,day; //年月日
    	}t;
    	int jie;// 定义 借的状态
    
    }bk[20];
    
    int N;   // N可以理解为 录入的图书的数量
    
    	
    int mymainmenu()   //主菜单
     {   
    	int x;  
    	printf("\n\n\n\n");   
    	printf("\t\t|-------------------------------------------------------------|\n");
    	printf("\t\t|                     |\n");   
    	printf("\t\t|    ======================    |\n");   
    	printf("\t\t|      欢迎光临图书管理系统     |\n");   
    	printf("\t\t|    ======================    |\n");   
    	printf("\t\t|                     |\n");   
    	printf("\t\t|      1.管理员模式          |\n");   
    	printf("\t\t|      2.客户模式           |\n");   
    	printf("\t\t|      3.退出系统           |\n");   
    	printf("\t\t|--------------------------------------------------------------|\n");   
        printf("\n\t\t请输入您的选择:");   
    	scanf("%d",&x);   
    	return x; 
    }
    char mima[20] = "mm";  //密码
     
    int mimayanzheng()  //密码验证
    { 
        char mm[20];   //用来存放输入的密码
    		 printf("\n");   
    		 printf("\t\t     ======================    \n");   
    		 printf("\t\t      欢迎使用管理员模式      \n");   
    		 printf("\t\t     ======================    \n");   
    		 printf("\n");   
    		 printf("\t\t     请输入密码:"); 
    	     scanf("%s",&mm);
    	if(!strcmp(mm,mima))  //比较输入的密码 是否 与原密码相同
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    
    }
    
    int xiugaimima()   //修改密码
    {
    	char mima_temp[20];//用来存放用户输入的密码
    	char new_mima[20];   //存放第一次新密码
    	char new_mima1[20];  //存放第二次新密码
    
    	printf("请输入原始密码:\n");
    	scanf("%s",&mima_temp);
    	if(!strcmp(mima_temp,mima))  //比较原始密码 与 用户输入的密码
    	{
    		printf("请输入新密码:\n");
    		scanf("%s",&new_mima);
    		printf("请再输一次:\n");
    		scanf("%s",&new_mima1);
    		if(!strcmp(new_mima1,new_mima)) //比较 两次修改后输入的密码
    		{
    			strcpy(mima,new_mima); //将 新密码 拷贝给 原始密码
    			printf("密码修改成功,请牢记,按任意键返回。。。\n");
    			getch();
    			return 0;
    		}
    		else
    		{
    			printf("错误!两次输入的密码不一致,按任意键返回。。。\n");
    			getch();
    			return 1;
    		}
    	}
    	else
    	{
    		printf("原始密码错误,按任意键返回。。。\n");
    		getch();
    	}
    }
    
    int adm()  //管理员模式
    {   
    	int x; 
    		 system("cls");
     		 printf("\n\n\n\n");   
     		 printf("\t\t|-------------------------------------------------------------|\n");   
    		 printf("\t\t|                     |\n");   
    		 printf("\t\t|    ======================    |\n");   
    		 printf("\t\t|        管理员模式        |\n");  
    		 printf("\t\t|    ======================    |\n");   
    		 printf("\t\t|                     |\n");   
     		 printf("\t\t|      1.录入图书信息        |\n");  
    		 printf("\t\t|      2.查看图书信息        |\n");   
    		 printf("\t\t|      3.修改图书信息        |\n");   
    		 printf("\t\t|      4.修改管理密码        |\n");   
    		 printf("\t\t|      5.退出系统          |\n");  
    		 printf("\t\t|-------------------------------------------------------------|\n");   
    		 printf("\n\t\t请输入您的选择:");   
    		 scanf("%d",&x);   
    	return x; 
    } 
    
    void xiugai_name()        //按书名来修改信息      
    {
    	char name[20];  //用来存放想要修改的 书名
    	int i;   //循环下标
    	int k = 0;// 标记书名是否存在
    	printf("输入你想要修改的书名,按“exit”退出:\n");
    	do
    	{
    		scanf("%s",&name);
    		if(!strcmp(name,"exit"))
    		{
    			break;
    		}
    		for(i=0;i<N;i++)
    		{
    			if(!strcmp(name,bk[i].name))
    			{
    				k++;
    				printf("该书的信息为:\n");
    				 printf("\t编号    图书名称     出版社        出版时间     状态\n");
    				printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    				if(bk[i].jie == 1)
    				{
    					printf("已被借阅\n");
    				}
    				else
    				{
    					printf("可以借阅\n");	
    				}
    				printf("现在请输入新的信息:\n");
    				printf("请输入书的编号:\n");
    				scanf("%d",&bk[i].num);
    				printf("请输入书的名称:\n");
    				scanf("%s",&bk[i].name);
    				printf("请输入书的出版社:\n");
    				scanf("%s",&bk[i].publish);
    				printf("请输入书的出版时间(用逗号隔开,英文的逗号哦!):\n");
    				scanf("%4d,%2d,%d",&bk[i].t.year,&bk[i].t.month,&bk[i].t.day);
    				printf("该书是否已经被借阅,已经借阅输入‘1’,未被借阅输入‘0’:\n");
    				scanf("%d",&bk[i].jie);
    			//	if(bk[i].jie == 1)
    			//		{
    			//			printf("恭喜你信息修改成功,按任意键返回。。。\n");
    			//			getch();
    			//			break;
    			//		}
    			//		else
    			//		{								
    			//			 printf("恭喜你信息修改成功,按任意键返回。。。\n");
    			//			 getch();
    			//			 break;
    			//		}
    			//}
    			//else
    			//{
    			//	break;
    			//}
    			}
    		}
    		if(k == 0)
    		{
    			system("cls");
    			printf("您输入的书名不存在,请重新输入(按“exit”退出):\n");
    		}
    		else
    		{
    			 printf("恭喜你信息修改成功,按任意键返回。。。\n");
    						 getch();
    						 break;
    		}
    	}while(1);
    }
    
    void xiugai_num() //按书号修改图书
    {
    	int num;  //用来存放 想要 修改的书号
    	int i;  //循环下标变量
    	int k = 0; //用来标记 该书是否存在
    	printf("请输入你想要修改的图书的书号(按'0'退出):\n");
    	do
    	{
    		scanf("%d",&num);
    		if(num == 0)
    		{
    			break;
    		}
    		for(i=0;i<N;i++)
    		{
    			if(num == bk[i].num)
    			{
    				k++;
    				printf("该书的信息为:\n");
    				 printf("\t编号    图书名称     出版社        出版时间     状态\n");
    				printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    				if(bk[i].jie == 1)
    				{
    					printf("已被借阅\n");
    				}
    				else
    				{
    					printf("可以借阅\n");	
    				}
    				printf("现在请输入新的信息:\n");
    				printf("请输入书的编号:\n");
    				scanf("%d",&bk[i].num);
    				
    				printf("请输入书的名称:\n");
    				scanf("%s",&bk[i].name);
    				
    				printf("请输入书的出版社:\n");
    				scanf("%s",&bk[i].publish);
    					
    				printf("请输入书的出版时间(用逗号隔开,英文的逗号哦!):\n");
    				scanf("%4d,%2d,%d",&bk[i].t.year,&bk[i].t.month,&bk[i].t.day);
    				printf("该书是否已经被借阅,已经借阅输入‘1’,未被借阅输入‘0’:\n");
    				scanf("%d",&bk[i].jie);
    			//	if(bk[i].jie == 1)
    			//		{			
    			//			printf("恭喜你信息修改成功,按任意键返回。。。\n");
    			//			getch();
    			//			break;
    			//		}
    			//		else
    			//		{			
    			//			 printf("恭喜你信息修改成功,按任意键返回。。。\n");
    			//			 getch();
    			//			 break;
    			//		}
    			//}
    			//else
    			//{
    			//	break;
    			//}
    			}
    		}
    		if(k == 0)
    		{
    			system("cls");
    			printf("您输入的书号不存在,请重新输入(按“0”退出):\n");
    		}
    		else
    		{
    			printf("恭喜你信息修改成功,按任意键返回。。。\n");
    						 getch();
    						 break;
    		}		
    	}while(1);
    }
    
    void dele_name()   //按 书名删除
    {                                        
    	int i; //循环下标变量
    	char name[20]; //用来存放输入的书名
    	char new_name[20];  //定义一个空数组
    	int k = 0;//用来标记 是否存在该书
    	char c[2];    //用来表示   是否删除图书               
    	printf("请输入您想要删除的书名(输入”exit”退出):\n");
    	while(1)
    	{
    		scanf("%s",&name);
    		if(!strcmp(name,"exit"))
    		{
    			break;
    		}
    		for(i=0;i<N;i++)
    		{
    			if(!strcmp(name,bk[i].name))
    			{
    				k++;
    				printf("该书的信息为:\n");
    				printf("\t编号    图书名称     出版社        出版时间     状态\n");
    				printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    				if(bk[i].jie == 1)
    				{
    					printf("已被借阅\n");
    				}
    				else
    				{
    					printf("可以借阅\n");	
    				}
    				printf("\t是否要删除此书('y' or 'n'):\n");
    				scanf("%s",&c); 
    				if(!strcmp(c,"y"))
    				{
    					strcpy(bk[i].name,new_name);     //空数组 拷贝给 已有书名
    					bk[i].num = 0;                   //令书号值为0
    					strcpy(bk[i].publish,new_name);  //空数组 拷贝给  已有出版社  
    					bk[i].t.year = 0;                //令年  = 0  
    					bk[i].t.month = 0;               //令月  = 0
    					bk[i].t.day = 0;                 //令日  = 0  
    					printf("\t删除成功!\n");
    					getch();
    					break;
    				}
    				else
    				{
    					printf("用户取消操作,任意键返回。。。");
    					getch();
    					break;
    				}
    			}
    		/*	else
    			{
    				break;
    			}*/
    		}
    		if(k == 0)
    		{
    			system("cls");
    			printf("未找到该书,请重新输入(输入“exit”退出):\n");
    		}
    		else
    		{
    			break;
    		}
    	}
    }
    
    void dele_num()   //按 书号删除
    {
    	int i;//循环下标变量
    	int k = 0; //标记是否存在该书
    	int num; //存放输入的书号
    	char new_name[20];//定义一个空数组
    	char c[2];//用来表示   是否删除图书
    	printf("请输入您想要删除的书名的书号(输入”0”退出):\n");
    	while(1)
    	{
    		scanf("%d",&num);
    		if(num == 0)
    		{
    			break;
    		}
    		for(i=0;i<N;i++)
    		{
    			if(num == bk[i].num)
    			{
    				k++;
    				printf("该书的信息为:\n");
    				printf("\t编号    图书名称     出版社        出版时间     状态\n");
    				printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    				if(bk[i].jie == 1)
    				{
    					printf("已被借阅\n");
    				}
    				else
    				{
    					printf("可以借阅\n");	
    				}
    				printf("\t是否要删除此书('y' or 'n'):\n");
    				scanf("%s",&c); 
    				if(!strcmp(c,"y"))
    				{
    					strcpy(bk[i].name,new_name);
    					bk[i].num = 0;
    					strcpy(bk[i].publish,new_name);
    					bk[i].t.year = 0;
    					bk[i].t.month = 0;
    					bk[i].t.day = 0;
    					printf("\t删除成功!\n");
    					getch();
    					break;
    				}
    				else
    				{
    					printf("用户取消操作,任意键返回。。。");
    					getch();
    					break;
    				}
    			}
    			/*else
    			{
    				break;
    			}*/
    		}
    		if(k == 0)
    		{
    			system("cls");
    			printf("未找到该书,请重新输入(输入“0”退出):\n");
    		}
    		else 
    		{
    			break;
    		}
    	}
    }
    
    void dele_all()  //删除所有图书
    {
    	char c[2]; //用来表示 是否 删除
    	printf("\t继续操作会删除所有图书信息,是否继续(“y” or “n”)");
    	scanf("%s",&c);
    	if(!strcmp(c,"y"))
    	{
    		N = 0;  //N等于0 也就是令录入的图书数量为零 即删除了所有图书
    		printf("\t删除成功\n");
    		getch();
    	}
    	else
    	{
    		printf("\t操作取消,任意键返回。。。\n");
    		getch();
    	}
    }
    
    void dele()  //删除图书
    {
    	int x;	
    	do
    	{
    		system("cls");
    		printf("\t\t|-------------------------------------------------------------|\n");
        		printf("\t\t|         =====================        |\n");
        		printf("\t\t|              删除图书信息               |\n");
        		printf("\t\t|         =====================        |\n");
        		printf("\t\t|                                         |\n");
        		printf("\t\t|            1.按书名删除                 |\n");
        		printf("\t\t|            2.按书号删除                 |\n");
    		printf("\t\t|            3.删除所有图书               |\n");
        		printf("\t\t|            4.返回主菜单                 |\n");
        		printf("\t\t|-------------------------------------------------------------|\n");
    		printf("\t\t请输入您的选项:");
    		scanf("%d",&x);
    		switch(x)
    		{
    			case 1:system("cls");dele_name();break;/*按书名删除*/
    			case 2:system("cls");dele_num();break;/*按书号删除*/
    			case 3:system("cls");dele_all();getch();break;/*删除所有图书*/
    		}
    	}while(x!=4);
    }
    
    /***********修改图书信息*********/
    void xiugai()
    {
        int x;
        do
        {
    		system("cls");
    		printf("\n\n\n\n");
       	 	printf("\t\t|-------------------------------------------------------------|\n");
       	 	printf("\t\t|         =====================        |\n");
        		printf("\t\t|               修改图书信息              |\n");
        		printf("\t\t|         =====================        |\n");
        		printf("\t\t|                                         |\n");
        		printf("\t\t|            1.按书名查找                 |\n");
        		printf("\t\t|            2.按书号查找                 |\n");
        		printf("\t\t|            3.删除图书                   |\n");
        		printf("\t\t|            4.返回主菜单                 |\n");
        		printf("\t\t|-------------------------------------------------------------|\n");
        		printf("\t\t请输入您的选择:");
        		scanf("%d",&x);
        		switch(x)
        		{
          	  		case 1:system("cls");xiugai_name();break;/*按书名查找名修改信息*/
          	  		case 2:system("cls");xiugai_num();break;/*按书号查找并修改信息*/
    				case 3:system("cls");dele();break;							
        		}
        }while(x!=4);
    }
    
    /********建立图书信息库********/
    void xinxi()  
    {   
    	int i;   
    		system("cls");   
    		printf("\t\t     =====================    \n");   
    		printf("\t\t        录入图书信息       \n");   
    		printf("\t\t     =====================    \n\n");  
    		printf("\t\t请输入您要录入的数量:");  
    		scanf("%d",&N);   
    	for(i=0;i<N;i++)   
    	{  
    			printf("\t\t请输入第%d本书的编号:",i+1);     
    			scanf("%d",&bk[i].num);     
    			printf("\t\t请输入第%d本书的名称:",i+1);     
    			scanf("%s",bk[i].name);     
    			printf("\t\t请输入第%d本书的出版社:",i+1);     
    			scanf("%s",bk[i].publish);     
    			printf("\t\t请输入第%d本书的出版时间(用逗号隔开):",i+1);     
    			scanf("%d,%d,%d",&bk[i].t.year,&bk[i].t.month,&bk[i].t.day);     
    			printf("\t\t该书是否已经被借阅,已被借阅输入'1',未被借阅输入'0':");     
    			scanf("%d",&bk[i].jie);  
    			printf("--------------------------------------------------------------------------------\n");   
    	}  
    		system("cls");   
    		printf("\t\t     =====================    \n");   
    		printf("\t\t        信息录入完成       \n");   
    		printf("\t\t     =====================    \n");   
    		printf("\n\t\t       按任意键继续...\n"); 
    }
     
    void showbook_name()  //管理员————按书名查看
    {
    	 //int i;
      //   char name[20];
    	 //printf("请输入需要查看的书名:\n");                      
    	 //scanf("%s",&name);
    	 //for(i=0;i<N;i++)
    	 //{
    		// if(strcmp(name,bk[i].name)!=0 || N == 0)  //如果当 输入的书名与想要查看的书名 比较时 不相等 或者 录入图书数量 为0  则数据不存在
    		// {
    		//	 printf("数据不存在...\n");
    		//	 system("pause");
    		//	
    		// }
    		// else
    		// {
    		//		printf("\t编号    图书名称     出版社        出版时间     状态\n");
    		//		printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    		//	 if(bk[i].jie == 1)
    		//	 {
    		//		 printf("\t\t已借阅\n");
    		//	 }
    		//	 else
    		//	 {
    		//		 printf("\t\t未借阅\n");
    		//	 }
    		// }
    	 //}
    	int i,k=0; //i是局部变量一定记住, ,k用来标记书的借阅状态。
    	char name[20];
    	printf("请输入需要查看的书名:\n");
    	scanf("%s",&name);                              
    	for(i=0;i<N;i++)
    	{
    		if(!strcmp(name,bk[i].name))
    		{		 
    			   printf("\t编号    图书名称     出版社        出版时间     状态\n");
    			   printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    			 if(bk[i].jie == 1)
    			 {
    				 printf("\t\t已借阅\n");
    			 }
    			 else
    			 {
    				 printf("\t\t未借阅\n");
    			 }
    			 k++;
    			 printf("\t按任意键返回。。。\n");
    		}
    	}
    	if(k == 0)
    	{
    		printf("该书不存在,任意键返回。。。\n");
    	}
    }
    
    void showbook_num()  //管理员————按书号查看
    {
    	int i,k=0; //i是局部变量一定记住, ,k用来标记书的借阅状态。
    	int num;
    	printf("请输入需要查看的书号:\n");
    	scanf("%d",&num);                              
    	for(i=0;i<N;i++)
    	{
    		if(num==bk[i].num)
    		{		 
    			   printf("\t编号    图书名称     出版社        出版时间     状态\n");
    			   printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    			 if(bk[i].jie == 1)
    			 {
    				 printf("\t\t已借阅\n");
    			 }
    			 else
    			 {
    				 printf("\t\t未借阅\n");
    			 }
    			 k++;
    			 printf("\t按任意键返回。。。\n");
    		}
    	}
    	if(k == 0)
    	{
    		printf("该书不存在,任意键返回。。。\n");
    	}
    }
    
    void weijieyue()  //管理员————未借阅的图书
    {
    	int i,k=0;
    	if(bk[0].num == 0&&bk[0].t.year == 0 || N == 0)   //如果 结构体中 bk【】数组中存放 的第一个 数据 书号 为零 年 为零 或 数量为零 则 数据不存在
    		{
    			printf("数据不存在,请先录入数据...\n");
    			printf("按任意键返回...\n");
    		}
    	for(i=0;i<N;i++)
    	{		
    			if(bk[i].jie == 0)
    			{
    				printf("\t编号    图书名称     出版社        出版时间     状态\n");
    				printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    				printf("您可以借阅此书...\n");
    				k++;
    			}
    	}
    	if(k == 0)
    		printf("目前没有可借阅的图书,按任意键继续。。。\n");
    }
    
    void yijieyue()  //管理员————已经借阅的图书
    {
    	int i,k=0;
    	if(bk[0].num == 0&&bk[0].t.year == 0 || N == 0)   //如果 结构体中 bk【】数组中存放 的第一个 数据 书号 为零 年 为零 或 数量为零 则 数据不存在
    	{
    		printf("数据不存在,请先录入数据。。。\n");
    		printf("按任意键返回...\n");
    	}
    	else
    	{
    		for(i=0;i<N;i++)
    		{
    			if(bk[i].jie == 1)
    			{
    				printf("\t编号    图书名称     出版社        出版时间     状态\n");
    				printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    				printf("很遗憾,此书已被接走。。。\n");
    				k++;
    			}
    		}
    		if(k == 0)
    			printf("目前没有任何书借出。按任意键继续。。。\n");
    	}
    }
    
    void show_all_book()  //管理员————查看所有图书
    {
    	int i;
    	if(bk[0].num == 0&&bk[0].t.year == 0 || N == 0)  //如果 结构体中 bk【】数组中存放 的第一个 数据 书号 为零 年 为零 或 数量为零 则 数据不存在
    	{
    		printf("数据不存在,请先录入数据。。。\n");
    	}
    	else
    	{
    		printf("\t编号    图书名称     出版社        出版时间     状态\n");
    		for(i=0;i<N;i++)
    		{		
    			printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    			if(bk[i].jie == 1)
    			{
    				printf("已借阅\n");
    			}
    			else
    			{
    				printf("未借阅\n");
    			}
    		}
    
    
    	}
    }
    
    void show() //管理员———查看图书信息
    {
    	int x; 
    	do
    	{
    		 system("cls");   
    		 printf("\n\n\n\n");    
    		 printf("\t\t|-------------------------------------------------------------|\n");    
    		 printf("\t\t|                     |\n");    
    		 printf("\t\t|     =====================    |\n");    
    		 printf("\t\t|       查看图书信息        |\n");    
    		 printf("\t\t|     =====================    |\n");    
    		 printf("\t\t|                     |\n");    
    		 printf("\t\t|      1.按书名查找         |\n");    
    		 printf("\t\t|      2.按书号查找         |\n");    
    		 printf("\t\t|      3.查看所有未借阅图书     |\n");    
    		 printf("\t\t|      4.查看所有已借阅图书     |\n");    
    		 printf("\t\t|      5.查看所有图书        |\n");    
    		 printf("\t\t|      6.返回主菜单         |\n");    
    		 printf("\t\t|-------------------------------------------------------------|\n");    
    		 printf("\n\t\t请输入您的选择:");    
    		 scanf("%d",&x);    
    		 switch(x)    
    		 {       
    			 case 1:system("cls");showbook_name();getch();break;/*按书名查看*/     
    			 case 2:system("cls");showbook_num();getch();break;/*按书号查看*/       
    			 case 3:system("cls");weijieyue();getch();break;/*查看未借阅图书*/       
    			 case 4:system("cls");yijieyue();getch();break;/*查看已借阅图书*/   
    			 case 5:system("cls");show_all_book();getch();break;/*查看所有图书*/    
    		 }                   
    	}while(x!=6);
    
    } 
    
    int peo()  //客户模式
    {
    	int x;
    	printf("\n\n\n\n");
        printf("\t\t|-------------------------------------------------------------|\n");
        printf("\t\t|                                         |\n");
        printf("\t\t|        ======================        |\n");
        printf("\t\t|               欢迎光临                  |\n");
        printf("\t\t|        ======================        |\n");
        printf("\t\t|                                         |\n");
        printf("\t\t|           1.查看图书信息                |\n");
        printf("\t\t|           2.借阅图书                    |\n");
        printf("\t\t|           3.退出系统                    |\n");
        printf("\t\t|-------------------------------------------------------------|\n");
        printf("\n\t\t请输入您的选择:");
        scanf("%d",&x);
        return x;
    }
    
    void jie_name()                 
    {
    	char name[20];   
    	int i;
    	char n[2];       //用来表示 是否 借阅 
    	int k = 0;      
    	system("cls");
    	printf("请输入书名:\n");
    	while(1)
    	{
    		scanf("%s",&name);
    		for(i=0;i<N;i++)
    		{
    			if((!strcmp(name,bk[i].name))&&(bk[i].jie == 0))  //比较输入书名与已有书名相等时 且 未借阅  时 执行 if语句
    			{
    				k++;
    				printf("\t编号    图书名称     出版社        出版时间     状态\n");
    				printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    				printf("可以借阅\n");
    				printf("您是否需要借阅此书:'y' or 'n' \n");
    				scanf("%s",&n);
    				if(!strcmp(n,"y"))
    				{
    					bk[i].jie = 1;
    					printf("借阅成功,按任意键返回。。。\n");
    					getch();
    					break;
    				}
    				else 
    				{
    					if(!strcmp(n,"n"))
    					{
    						printf("借阅取消,按任意键返回。。。\n");
    						getch();
    					}
    					else 
    					{
    						printf("输入有错,按任意键返回。。。\n");  
    						getch();
    					}	
    					break;
    				}
    			}
    			/*else
    			{
    				break;
    			}*/
    
    		}
    		if(k == 0)
    		{
    				printf("不存在该书,或该书已经借出!请正确输入图书名称!\n");
    				printf("按任意键返回。。。\n");
    				getch();
    				break;
    		}
    
    		else 
    		{
    				break;
    		}
    		
    	}
    }
    
    void jie_num()
    {
    	int i;
    	int num;
    	int k = 0;
    	char n[2];  //用来表示 是否借阅
    	system("cls");
    	printf("请输入书名的书号:\n");
    	while(1)
    	{
    		scanf("%d",&num);
    		for(i=0;i<N;i++)
    		{
    			if((num == bk[i].num)&&(bk[i].jie == 0)) //比较输入书号与已有书号相等时 且 未借阅  时 执行 if语句
    			{
    				k++;
    				printf("\t编号    图书名称     出版社        出版时间     状态\n");
    				printf("\t%-7d %-8s %-12s   %4d年%2d月%2d日 ",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);
    				printf("可以借阅\n");
    				printf("您是否需要借阅此书:'y' or 'n' \n");
    				scanf("%s",&n);
    				if(!strcmp(n,"y"))
    				{
    					bk[i].jie = 1;
    					printf("借阅成功,按任意键返回。。。\n");
    					getch();
    					break;
    				}
    				else 
    				{
    					if(!strcmp(n,"n"))
    					{
    						printf("借阅取消,按任意键返回。。。\n");
    						getch();
    					}
    					else 
    					{
    						printf("输入有错,按任意键返回。。。\n");  
    						getch();
    					}	
    					break;
    				}
    			}
    			/*else
    			{
    				break;
    			}
    */
    		}
    		if(k == 0)
    		{
    				printf("不存在该书,或该书已经借出!请正确输入图书名称!\n");
    				printf("按任意键返回。。。\n");
    				getch();
    				break;
    		}
    
    		else 
    		{
    				break;
    		}
    		
    	}
    }
    
    void jieyue()   //借阅图书
    {
    	int x;
        do
        {
    		system("cls");
    		printf("\n\n\n\n");
    		printf("\t\t|-------------------------------------------------------------|\n");
    		printf("\t\t|         =====================        |\n");
    		printf("\t\t|                借阅图书                 |\n");
    		printf("\t\t|         =====================        |\n");
    		printf("\t\t|                                         |\n");
    		printf("\t\t|            1.按书名借阅                 |\n");
    		printf("\t\t|            2.按书号借阅                 |\n");
    		printf("\t\t|            3.查看所有图书               |\n");
    		printf("\t\t|            4.返回主菜单                 |\n");
    		printf("\t\t|-------------------------------------------------------------|\n");
    		printf("\t\t请输入您的选择:");
    		scanf("%d",&x);
    		switch(x)
    		{
    			case 1:system("cls");jie_name();getch();break;/*按书名借阅*/
    			case 2:system("cls");jie_num();getch();break;/*按书号借阅*/
    			case 3:system("cls");show_all_book();getch();break;/*查看所有图书*/
    		}
        }while(x!=4);
    
    }
    
    int main()  /*主函数*/
    {
    	int n,s,x,t;  //s用来接收主菜单的值   n来接收管理员模式的值  x来接受客户模式的值
    	do
    	{
    	    system("cls");
    		s = mymainmenu();
    		switch(s)
    		{
    			case 1 : system("cls");
    					 t=mimayanzheng(); //t来存放 密码 错误与正确 的 返回值
    					do
    					{
    						if(t == 1)
    						{
    							n = adm();
    							switch(n)
    							{
    								case 1:system("cls");xinxi();getch();break;/*录入信息*/    
    								case 2:system("cls");show();break;/*查看信息*/            
    								case 3:system("cls");xiugai();break;/*修改信息*/    
    								case 4:system("cls");xiugaimima();break;/*修改密码*/
    							}
    						}
    						else
    						{
    							printf("密码错误,按任意键返回。。。\n");
    							getch();
    							break;
    						}
    					}while(n!=5);break; 
    			
    			case 2 : 
    				    do
    					{
    						system("cls");
    						x = peo();
    						switch(x)
    						{
    							case 1:system("cls");show();break;//查看图书信息
    							case 2:system("cls");jieyue();break;//借阅图书
    						}
    					}while(x!=3);break;
    		}
    	}while(s!=3);
    	system("cls");
    	printf("\n\n\n\n\n\n                            \t\t谢谢使用!!!\n");
        getch();//等待用户 输入 一个字符  然后继续执行下面语句
    
    	return 0;
    }
    

    代码虽然不是原创,但是代码是根据已有代码运行结果自己实现的,与原代码还是有一定的不同,或者说自己的代码还有些繁琐的代码写的不足,不好的地方

    展开全文
  • 一、前言作为一只大四狗,最近还跟着大二同学修了一门课(当然不是之前没通过啦),课程是高级语言课程设计,高级语言指的是C语言 :),内容是做一个XX管理系统,我选择了图书管理系统,先介绍下我做的系统: ...

    一、前言

    作为一只大四狗,最近还跟着大二同学修了一门课(当然不是之前没通过啦),课程是高级语言课程设计,高级语言指的是C语言 :),内容是做一个XX管理系统,我选择了图书管理系统,先介绍下我做的系统:

    • 主要功能:
      • 读者信息管理:添加、修改、删除、查询读者信息。
      • 图书信息管理:添加图书、修改图书、删除图书、查询图书
      • 图书借阅归还:图书借阅和归还,以及列出借阅情况。
      • 信息统计汇总:图书总量统计、图书借阅统计等。
    • 日志功能:记录用户、图书、借阅相关信息的日志。
    • 参与对象:管理员和用户,管理员主要指图书馆相关工作负责人员,用户指老师或者教工,可以从图书馆借书。
    • 数据存储格式:文件。
    • 数据组织方式:链表。
    • 界面:ncurses库。
    • 其它:CMake组织项目、GitHub版本控制:代码地址 、Linux操作系统运行。

    为了体现我大学四年也不是白念的,当然得体现出逼格,那就从界面下手,于是我选择了ncurses这个终端字符库,最后的界面是这样的:

    这里写图片描述

    整个界面分为三部分,上面显示系统名称和时间,用户登录之后还会显示用户名;左下是整个程序的功能菜单部分;右下是系统日志,负责动态显示添加用户、添加图书、借阅书籍等操作;三个部分由三个线程负责,但是由于ncurses库本身不是线程安全的(多个线程同时操作输出会出现问题),因此需要用互斥锁来互斥控制输出流程,后边会详细说。

    二、ncueses库的使用

    (1)介绍
    简而言之就是一个终端下使用的,可以让你改变字符输出位置输出颜色并且创建窗口的图形库,更多介绍参见这里
    (2)安装

    $ sudo yum install ncurses-devel   //RedHat
    $ sudo apt-get install libncurses5-dev libncursesw5-dev  //Ubuntu

    (3)使用
    有关它的使用,参考下面两篇文章和作者 非常详细 的代码示例,基本上就可以上手了:

    文章一:NCURSES 函数简要参考:讲解ncurses的初始化、输入输出、颜色、窗口等等。
    文章二:NCURSES Programming HOWTO中文版:作者有许多小例子。
    参考三:代码示例

    三、遇到的问题

    (1)ncurses图形库不是线程安全的,之前设计的界面如下所示:

    这里写图片描述

    但是发现三个线程同时输出之后乱码,最后这个问题在stackoverflow上得到了明确: https://stackoverflow.com/questions/47878870/when-use-ncurses-in-multi-threaded-the-terminal-garbled,确实是由于线程安全问题引起的,最后加互斥锁解决,简易代码如下:

    #include <stdio.h>
    #include <ncurses.h>
    #include <pthread.h>
    #include <time.h>
    #include <unistd.h>
    
    pthread_mutex_t MUTEX;  /* mutex for sync display */
    
    #define LOCK pthread_mutex_lock(&MUTEX)
    #define UNLOCK pthread_mutex_unlock(&MUTEX)
    
    typedef struct _WIN_struct {
        int startx, starty;
        int height, width;
    } WIN;
    
    WIN winTitle;      /* title win */
    WIN winMenu;   /* Main menu win */
    WIN winNews;       /* win news */
    
    WINDOW *create_newwin(int height, int width, int starty, int startx) {
        WINDOW *local_win;
        local_win = newwin(height, width, starty, startx);
        box(local_win, 0, 0);
        wrefresh(local_win);
        return local_win;
    }
    
    char *getTimeNow() {
        time_t rawtime;
        struct tm *timeinfo;
        time(&rawtime);
        timeinfo = localtime(&rawtime);
        return asctime(timeinfo);
    }
    
    void *threadfunc_title(void *p) {
        WINDOW *windowTitle;
        LOCK;
        windowTitle = create_newwin(winTitle.height, winTitle.width, winTitle.starty, winTitle.startx);
        UNLOCK;
    
        /* show title and time */
        for (;;) {
            sleep(1);
        }
    
    }
    
    void *threadfunc_menu(void *p) {
        WINDOW *windowMenu;
        LOCK;
        windowMenu = create_newwin(winMenu.height, winMenu.width, winMenu.starty, winMenu.startx);
        UNLOCK;
    
        for (;;) {
            /* now do nothing */
            sleep(1);
        }
    
    }
    
    void *threadfunc_news(void *p) {
        WINDOW *windowNews;
        LOCK;
        windowNews = create_newwin(winNews.height, winNews.width, winNews.starty, winNews.startx);
        UNLOCK;
    
        for (;;) {
            sleep(1);
        }
    }
    
    void initWin(WIN *p_win, int height, int width, int starty, int startx) {
        p_win->height = height;
        p_win->width = width;
        p_win->starty = starty;
        p_win->startx = startx;
    }
    
    
    int main(int argc, char *argv[])
    {
        pthread_t pidTitle;
        pthread_t pidMenu;
        pthread_t pidNews;
    
        initscr();
        start_color();
        cbreak();
        keypad(stdscr, TRUE);
        noecho();
    
        /* init location */
        initWin(&winTitle, LINES*0.25, COLS, 0 , 0);
        initWin(&winMenu, LINES*0.75, COLS*0.60, LINES*0.25, 0);
        initWin(&winNews, LINES*0.75, COLS*0.40, LINES*0.25, COLS*0.60);
    
        pthread_create(&pidTitle, NULL, threadfunc_title, NULL);
        pthread_create(&pidMenu, NULL, threadfunc_menu, NULL);
        pthread_create(&pidNews, NULL, threadfunc_news, NULL);
    
        pthread_join(pidTitle, NULL);
        pthread_join(pidMenu, NULL);
        pthread_join(pidNews, NULL);
    
        endwin();
        return 0;
    }

    (2)while (!feof(fp)) 来判断文件结尾是不可靠的,feof(fp)判断文件结尾指的是:文件最后一个字符的下一个字符,具体参考 https://baike.baidu.com/item/feof/10942186?fr=aladdin ,使用 fread的弊端是它的返回值不能区分是到了文件结尾还是遇到了错误:

    这里写图片描述

    这是之前的代码:

    int readUser() {
        FILE *fp;
        user *p = (user *) malloc(sizeof(user));
        user *q = (user *) malloc(sizeof(user));
        USER_HEAD = p;
        USER_MAXID = -1;
    
        fp = fopen(USER_PATH, "r+");
        if (fp == NULL) {
            fp = fopen(USER_PATH, "w+");
            free(q);
            return 0;
        }
    
        while (!feof(fp)) {
            fscanf(fp, "%d %s %s %s %s %d\n", &(q->user_id), q->user_stid,
                   q->user_name, q->user_address, q->user_mail, &(q->user_status));
    
            /* update USER_MAXID*/
            if (q->user_id > USER_MAXID) {
                USER_MAXID = q->user_id;
            }
    
            p->next = q;
            p = q;
            q = (user *) malloc(sizeof(user));
        }
    
        p->next = NULL;
        free(q);
        fclose(fp);
        return 0;
    }
    

    最后使用read读取,加O_CREATE也可以防止文件不存在:

    int readUser() {
        int fd;
        int size;
        user *p = (user *) malloc(sizeof(user));
        user *q = (user *) malloc(sizeof(user));
        USER_HEAD = p;
        USER_MAXID = 0;
    
        fd = open(USER_PATH, O_RDONLY | O_CREAT, S_IRUSR | S_IWUSR);
        if (fd == -1) {
            perror("open");
            exit(1);
        }
    
        while ((size = read(fd, q, sizeof(user))) != 0) {
            if (q->user_id > USER_MAXID) {
                USER_MAXID = q->user_id;
            }
            p->next = q;
            p = q;
            q = (user *) malloc(sizeof(user));
        }
    
        p->next = NULL;
        free(q);
        close(fd);
        return 0;
    }

    (3)c语言如何获取系统时间:使用localtime()和asctime()返回的字符串中会包含\n,不太友好,这可能是历史原因,具体参考:http://www.developerq.com/article/1494738998,自己封装一个去掉\n字符,代码如下:

    char *getTimeNow() {
        char *timestr;
        time_t rawtime;
        struct tm *timeinfo;
        time(&rawtime);
        timeinfo = localtime(&rawtime);
        timestr = asctime(timeinfo);
        /* del \n */
        timestr[strlen(timestr) - 1] = '\0';
        return timestr;
    }

    [完]

    展开全文
  • 图书借阅系统是纯C语言编写的,没有搭载数据库,纯手工编写,VS编写的,建议用VS打开,欢迎下载学习。
  • 图书借阅管理系统,我们刚自己做的,能运营的代码,完整实验报告,都是你需要的~
  • C语言程序设计,图书借阅管理系统,在TC下可以运行出来,就算不运行也有截屏,不用担心。
  • C语言数据结构应用(图书借阅系统) /**************************************************** @title: 数据结构实验 @name: <实验2-1> 线性表(顺序表)的应用--我的图书馆 @object: [实验目的] 应用...

    C语言数据结构应用(图书借阅系统)

     

    /****************************************************
      @title: 数据结构实验
      @name: <实验2-1> 线性表(顺序表)的应用--我的图书馆
      @object:
          [实验目的]
              应用线性表解决问题.
              有若干图书,借出的书需要登记下来. 
              用两个线性表分别保存现有图书和借书信息,
              并实现增加新书,借书,还书,打印等功能.
              学习命令式程序界面的编写方法.
          [实验提示]
              1. 在book.h中描述了描述书的Book类型,还有
              几个有关函数函数可以调用. 
              2. 在sqlist.h中完成顺序表的各种操作. 
              3. 借书时,输入书名,若有存书,则从存书表中
              删除,插入借书表.
              4. 还书时,输入书名,若借过此书,则从借书表
              中删除,插入存书表. 
      @include:
          用到的头文件
      @usage:
          请查看"TO-DO列表",根据要求完成代码
      @copyright: BTC 2005, Zhuang Bo
      @author: Zhuang Bo
      @date: 2005
      @description:
    *****************************************************/
    
    #include <cstdlib>
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    
    #include "book.h"
    #define ElemType Book    //使用Book作为线性表元素的类型 
    #include "sqlist.h"
    
    SqList s;        //存书表 
    SqList b;        //借书表 
    
    void SystemInitialize();
    void SystemTerminate();
    void SystemRun();
    
    int main(int argc, char *argv[])
    {
        
        SystemInitialize();    
        SystemRun();    
        SystemTerminate();    
        
        system("PAUSE");
        return 0;
    }
    
    void SystemInitialize ()
    {
        InitList ( s );
        InitList ( b );
        
        Book mybooks[] = {
            {"C Programming Language"},
            {"Data Structures"},
            {"C++ Programming Language"},
            {"Effactive C++"},
            {"More Effactive C++"},
            {"Design Patterns"}
        };    
        for ( int i=0; i<6; i++ )
            ListInsert( s, i, mybooks[i]); 
    }
    
    void SystemRun()
    {
        char GetCommand();
        void DoCommand (char cmd);
        char cmd;
        
        do {
            cmd = GetCommand();
            DoCommand(cmd);
        } while ( cmd!='q' );
    }
    
    char GetCommand ()
    {
        char str[64];
       printf("\na:新书 b:借书 r:还书 p:打印 q:退出\n" );
        printf(".");
        //cin.getline(str,64);
        read(str);
    	return str[0];
    }
    
    void DoCommand ( char cmd )
    {
        void AddNewBook();
        void BorrowBook();
        void ReturnBook();
        void PrintBookLists();
        
        switch ( cmd ) {
        case 'a':
            AddNewBook();
            break;
        case 'b':
            BorrowBook();
            break;
        case 'r':
            ReturnBook();
            break;
        case 'p':
            PrintBookLists();
            break;
        case 'q':
            break;
        default:
            printf("命令错误"); 
        }
    }
    
    void AddNewBook()
    {
        Book abook;
        
        printf( "\n输入新书名:");
        ReadBook(abook);
        if ( ListInsert(s,1,abook) )
            printf( "入库成功" );
        else
            printf( "入库失败" );
    }
    
    void BorrowBook()
    {
        Book abook;
        int k;
        
        printf("\n借书书名:");
        ReadBook(abook);
        k = LocateElem(s,abook,BookEqual);
        if ( k!=0 ) {
            // TODO (#1#): 借书 
             ListDelete(s,k,abook);
    		 ListInsert(b,k,abook);
            //-------------------------------------
    
           printf("\n借书成功" );
        } else
          printf( "\n查无此书" );
    }
    
    void ReturnBook()
    {
        Book abook;
        int k;
        
       printf( "\n还书书名:");
        ReadBook(abook);
        k = LocateElem(b,abook,BookEqual);
        if ( k!=0 ) {
            // TODO (#1#): 还书 
            ListInsert(s,k,abook);
    		 ListDelete(b,k,abook);
            //-------------------------------------
            printf("\n还书成功" );
        } else
            printf( "\n查无此书" );
    }
    
    void PrintBookLists()
    {
       printf( "库存 %d本书\n" , ListLength(s) );
        ListTraverse ( s, PrintBook );
        printf( "\n借出%d本书 " , ListLength(b)  );
        ListTraverse ( b, PrintBook );
    }
    
    void SystemTerminate () 
    {
        DestroyList ( s );
        DestroyList ( b );
    }
    


     

     

     

     

     

    /*
      Name: sqlist.h
      Copyright: 
      Author: 
      Date: 21-03-05 20:21
      Description: 
    */
    
    #ifndef SQLIST_H_INCLUDED
    #define SQLIST_H_INCLUDED
    
    #include "ds.h" //for Status,OK ...
    
    #ifndef ElemType
    #define ElemType int /* 数据元素类型默认为 int */
    #define ELEMTYPE_TAG
    #endif
    
    /**********************************************************
    *  顺序表的存储结构定义 
    ***********************************************************/
    #define LIST_INIT_SIZE 100 /* 存储空间初始分配容量 */
    #define LISTINCREMENT 10 /* 存储空间分配的增量 */
    typedef struct {
        ElemType *elem;    //存储空间基址
        int length;        //当前长度 
        int listsize;      //当前已分配的存储空间(元素个数) 
    } SqList;
    
    /**********************************************************
    *  顺序表的基本操作声明
    ***********************************************************/
    
    //创建并初始化为空表 
    Status InitList(SqList &L);
    
    //销毁整个表(从此之后不再可用) 
    Status DestroyList(SqList &L);
    
    //将表L置空 
    Status ClearList(SqList &L);
    
    //判断表L是否为空表 
    bool ListEmpty(SqList L);
    
    //求表L的长度 
    int ListLength(SqList L);
    
    //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR 
    Status GetElem(SqList L, int i, ElemType &e);
    
    template <typename T> bool equal(T a, T b)
    {
        return a==b;
    }
    //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 
    //    compare(a,b) 为比较函数,匹配时返回true,否则返回false 
    //                 这里默认使用equal进行比较 
    
    int LocateElem(SqList L, ElemType e, 
          bool (*compare)(ElemType,ElemType));
    
    //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR
    Status ListInsert(SqList &L, int i, ElemType e);
    
    //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR 
    Status ListDelete(SqList &L, int i, ElemType &e);
    
    //遍历表L,对每个元素调用visit(x). 
    Status ListTraverse(SqList L, Status (*visit)(ElemType));
     
    
    /**********************************************************
    *  顺序表的基本操作的实现
    ***********************************************************/
    
    //创建并初始化为空表 
    Status InitList(SqList &L)
    {
        // TODO (#1#): 创建空表 
    	L.elem=(ElemType *)malloc(LIST_INIT_SIZE *sizeof(ElemType));
    	L.length=L.listsize=0;
        L.listsize=LIST_INIT_SIZE;
        return OK;
        //-------------------------------------
    }
    
    //销毁整个表(从此之后不再可用) 
    Status DestroyList(SqList &L)
    {
        // TODO (#1#): 销毁表 
    	if(L.elem){
    		free(L.elem);
    		return OK;
    	}
    	else 
        return ERROR;
        //-------------------------------------
    }
    
    //将表L置空 
    Status ClearList(SqList &L)
    {
        // TODO (#1#): 清空表
    	if(L.elem==NULL){
    	   L.length=0;
    	   return OK;
    	}else
        return ERROR;
        //-------------------------------------
    }
    
    //判断表L是否为空表 
    bool ListEmpty(SqList L)
    {
        // TODO (#1#): 顺序表判空 
    	if (L.length==0)    return false;
    	else return OK;
        //-------------------------------------
    }
    
    //求表L的长度 
    int ListLength(SqList L)
    {
        // TODO (#1#): 求顺序表长度
    	return L.length;
       
        //-------------------------------------
    }
    
    //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR 
    Status GetElem(SqList L, int i, ElemType &e)
    {
        // TODO (#1#): 取元素
    	if(i<1||i>L.length)
        return ERROR; 
    	e=L.elem[i-1];
    	return OK;
        //-------------------------------------
    }
    
    //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 
    //    compare(a,b) 为比较函数,匹配时返回true,否则返回false 
    int LocateElem(SqList L, ElemType e, bool (*compare)(ElemType,ElemType))
    {
        // TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素
        for (int j=0; j<L.length; j++)
            if ( compare(L.elem[j],e) )  return j+1;
        return 0;
        //-------------------------------------
    }
    
    
    //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR
    Status ListInsert(SqList &L, int i, ElemType e)
    {
        // TODO (#1#): 在链表中插入元素
    	if (i<1||i>L.length+1)    return ERROR;
    	for(int j=L.length;j>=i;j--)
        	L.elem[j]=L.elem[j-1];
                      L.elem[i-1]=e;
       	L.length++;
    	return OK;
    	//-------------------------------------
    }
    
    //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR 
    Status ListDelete(SqList &L, int i, ElemType &e)
    {
        // TODO (#1#): 在顺序表中删除元素
    	if(i<1||i>L.length)
        return ERROR;
    	for(int j=i;j<=L.length;j++)
    		L.elem[j-1]=L.elem[j];
    	--L.length;
    	return OK;
        //-------------------------------------
    }
    
    //遍历表L,对每个元素调用visit(x). 
    Status ListTraverse(SqList L, Status (*visit)(ElemType))
    {
        // TODO (#1#): 遍历顺序表 
        for (int j=0; j<L.length; j++)
            if ( ! visit(L.elem[j]) )  return ERROR;
        return OK;
        //-------------------------------------
    }
    
    
    #ifdef ELEMTYPE_TAG
    #undef ElemType
    #undef ELEMTYPE_TAG
    #endif
    
    #endif  // SQLIST_H_INCLUDED
    


     

     

     

    展开全文
  • 这是一个功能完善的图书借阅系统课程设计,内含的程序,和课程设计报告。并有界面。
  • c语言图书管理系统

    2014-07-03 19:54:51
    基于C语言基础的图书管理系统。实现对图书的增删查改,以及学生借阅、退还书籍的记录,并且可以管理员身份对书籍进行查询
  • C语言 图书管理系统(课程设计)

    万次阅读 多人点赞 2018-12-28 09:13:06
    C语言编程模拟一个简单的图书管理系统,主要包括图书的库存信息,每一本书的借阅信息以及每一个人的借书信息。 系统功能: (1)借阅资料管理(对相关资料进行添加,删除,修改,查询等操作) (2)借阅管理...

    图书管理系统

    任务背景:
    18级软件工程大一上学期C语言课程设计。

    编写目的:
    把学习的C语言知识运用到实际上,强化能力。

    任务描述:
    C语言编程模拟一个简单的图书管理系统,主要包括图书的库存信息,每一本书的借阅信息以及每一个人的借书信息。

    系统功能:
    (1)借阅资料管理(对相关资料进行添加,删除,修改,查询等操作)
    (2)借阅管理(包括借出操作,还书操作,续借处理)
    (3)读者管理(定义读者借书数量和相关的借阅时间等信息)
    (4)统计分析(当前借阅和相关资料状态,资料状态统计,借阅统计)

    系统设计分析(程序流程图,函数模块分析):

    程序源代码:
    添加链接描述

    /*图书管理系统   终极确定版*/ 
    
    #include<stdio.h>
    #include<stdlib.h>  //有system函数
    #include<conio.h>   //有通过控制台进行数据输入和数据输出的函数
    #include<string.h>  //有字符数组
    #include<math.h>
    #define  LEN   sizeof(struct library)//有关图书信息的结构体
    #define  LEN1  sizeof(struct reader) //有关读者信息的结构体
    
    struct library//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%图书馆结构体
    {
    	int xcl;//库存
    	float price;//单价
    	char name[20],author[20],chuban[20],kind[20],shuhao[20];
    	struct library *next;
    };
    
    
    struct reader//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%读者结构体
    {
    	int zhenghao;
    	char mingzi[20],riqi[20],zname[20];
    	struct reader *next;
    };
    
    
    void mainmenu()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~主菜单
    { 
    	system ("cls");//清除屏幕先前显示的内容 ,往下运行(在stdlib.h头文件中) 
    	printf("\n\n\n				^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ");
    	printf("\n\n\n						1.__库存图书信息__\n\n");
    	printf("\n\n 						2.__借阅图书系统__\n\n");
    	printf("\n\n 						3.__退出管理系统__\n\n");
    	//printf("\n\n 					 ^~^请您按键选择and回车确定哦~.~\n\n\n");
    	printf(" 				^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ ^.^ \n");
    }
    
    
    void menu1() //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~显示 图书信息 菜单
    { 
    	system ("cls");
    	printf("\n\n\n				 ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ");
    	printf("\n\n 				    		1.__图书入库__\n\n");
    	printf("\n 						2.__图书清理__\n\n");
    	printf("\n 						3.__图书查询__\n\n");
    	printf("\n 						4.__库存概览__\n\n");
    	printf("\n 						5..返回上一层..\n\n");
    	//printf("\n 					^~^请您按键选择and回车确定哦*.*\n\n");
    	printf(" 				 ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ ^~^ \n");
    }
    
    
    void menu2() //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~显示 借阅系统 菜单
    { 
    	system ("cls");
    	printf("请输入书号,书名,作者或类别查询:\n");
    	printf("类别(科学技术 语言文学 政治经济 历史地理 意识形态 艺术)\n\n");
    }
    
    
    void main1()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~main1函数
    {
    	void tsgxx();//声明 图书馆信息 函数 
    	void jieshuxitong();//声明 借书系统 函数
    	char choose;
    	
    	mainmenu();//显示主菜单 
    	scanf("%c",&choose);
    	
    	switch(choose)//功能函数选择
    	{ 
    		case '1':	tsgxx();
    					break;
    					
    		case '2':	jieshuxitong();	
    					break;	
    					
    		case '3':   system ("cls");
    					printf("\n\n\n  删改内容已经保存了呢 ^、^\n\n\n  任意键安全退出哦 ^、^\n\n");
    					exit(0);//exit关闭所有文件,终止正在执行的程序。exit(0):正常退出
    					break;
    	}
    }
    
    
    void tsgxx()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~图书馆信息函数
    { 
    	void tsjinku();//声明 图书进库 函数 
    	void shanchu();//声明 删除图书信息 函数 
    	void chaxunts();//声明 查询图书 函数 
    	void kucunxinxi();//声明 显示库存 函数 
    	char choose;
    	
    	menu1();//显示 图书信息 菜单 
    	getchar();//吞掉一个显示出menu1函数后的进行下一步的回车      
    	                                                                                                                         
    	scanf("%c",&choose);
    	
    	for (;;)//在返回上一级前循环输入                                                                                                                                                    //??? 
    		switch(choose)
    		{ 
    			case '1':	tsjinku();
    						break;
    			case '2':	shanchu();
    						break;
    			case '3':	chaxunts();
    						break;
    			case '4':	kucunxinxi();
    						break;
    			case '5':	main1();//返回上一级 
    						break;
    		}
    }
    
    
    int kucungs()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~统计库存图书文本个数函数
    { 
    	FILE *fp;//定义一个指针 
    	int txcl=0,n;
    	float tprice=0;
    	char tname[20]={'\0'},tauthor[20]={'\0'},tchuban[20]={'\0'},tkind[20]={'\0'},tshuhao[20]={'\0'};
    	
    	fp=fopen("library.txt","r");//打开文件  fopen("文件名.文件类型","权限"); 
    	
    	for (n=0;!feof(fp);n++)//逐个读文件(feof(fp):检测是否以及读取到文件尾部,到达尾部返回1,否则返回0)
    		fscanf(fp,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&txcl,&tprice);
    	n--;
    	
    	fclose(fp);//关闭文件
    	return (n);//返回个数
    }
    
    
    int duzhegs()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~统计读者文本个数函数
    { 
    	FILE *fp;
    	int zhenghao=0,n;
    	char mingzi[20]={'\0'},riqi[20]={'\0'},zname[20]={'\0'};
    	
    	fp=fopen("reader.txt","r");//打开文件
    	
    	for (n=0;!feof(fp);n++)//逐个读文件
    		fscanf(fp,"%d%s%s%s ",&zhenghao,&mingzi,&riqi,&zname);
    		
    	fclose(fp);//关闭文件
    	return (n);//返回个数
    }
    
    
    void tsjinku()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~图书进库函数
    { 
    	FILE *fp;
    	int xcl=0,n=0;
    	float price=0;
    	char name[20]={'\0'},author[20]={'\0'},kind[20]={'\0'},chuban[20]={'\0'},shuhao[20]={'\0'};
    	char hitkey; 
    	
    	system ("cls");
    	
    	if ((fp=fopen("library.txt","a"))==NULL)//打开图书馆文件,不存在此文件则新建
    	{ 
    		fp=fopen("library.txt","w");
    		fclose(fp);
    	}
    	
    	fp=fopen("library.txt","a");//追加写打开进行录入数据 
    	
    	printf("\n	请您输入需要添加的图书信息:\n\n	书号	书名	作者	出版社	类别	进库量	单价");
    	printf("\n\n	(类别:哲学,文学,教育,艺术,科学,教材,小说,其它)\n	(书号:(XXX) )\n"); 
    	
    	for (;hitkey!=27;)//如果输入一组数据后敲了回车键则循环输入 
    	{ 
    		if (n!=0)
    			printf("请输入:\n");//从第二次输入开始提示请输入 
    			
    		scanf("%s%s%s%s%s%d%f",shuhao,name,author,chuban,kind,&xcl,&price);		
    		fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",shuhao,name,author,chuban,kind,xcl,price);
    		
    		printf("继续输入请按回车\n结束输入请按Esc\n");
    		n++;
    		
    		hitkey=getch();//记录敲击进来的键                                                                                                                                          		
    		for (;hitkey!=13&&hitkey!=27;)//13:\r回车  27:ESC退出                                                                                                                          
    			hitkey=getch();//敲击错误可重复敲击 
    	}
    	fclose(fp);
    	
    	printf("\n保存成功,按任意键返回上一层!");
    	getch();
    	tsgxx();//返回上一层
    }
    
    
    void shanchu()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~删除图书信息
    { 
    	struct library *head=NULL;
    	struct library *p,*p1,*p2;
    	int txcl=0,n=0,j,i;
    	float tprice=0;
    	char tname[20]={'\0'},tauthor[20]={'\0'},tchuban[20]={'\0'},tkind[20]={'\0'},ttname[20]={'\0'},tshuhao[20]={'\0'};
    	char hitkey;
    	FILE *fp;
    	
    	if ((fp=fopen("library.txt","r"))==NULL)//打开文件
    	{ 
    		system ("cls");
    		
    		printf("\n库存图书为零!无法删除图书!\n请按任意键返回\n");
    		getch();
    		
    		tsgxx();
    	}
    	else
    	{ 
    		system ("cls");
    		
    		printf("\n请输入你要删除的书名:");//输入删除图书书名
    		scanf("%s",&ttname);
    		
    		printf("\n确认删除请回车,取消请按Esc\n");
    		
    		hitkey=getch();
    		
    		for(;hitkey!=13&&hitkey!=27;)
    			hitkey=getch();
    			
    		if (hitkey==27)
    			tsgxx();
    		
    		fp=fopen("library.txt","r");
    		
    		for (j=0;!feof(fp);)//读文件夹信息,统计在库图书个数
    		{ 
    			j++;
    			fscanf(fp,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&txcl,&tprice);
    		}
    		
    		fclose(fp);
    		
    		fp=fopen("library.txt","r");
    		
    		for (i=1;i<j;i++)
    		{ 
    			fscanf(fp,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&txcl,&tprice);
    			
    			if (strcmp(ttname,tname))//比较名字,将不同名字的信息复制到链表                                                                                     //??? 
    			{ 
    				n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
    				if (n==1)//建立链表
    				{ 
    					p1=p2=(struct library*)malloc(LEN);
    					head=p1;
    				}
    				else
    				{ 
    					p2->next=p1;
    					p2=p1;
    					p1=(struct library*)malloc(LEN);//新建链表
    				}
    				
    				strcpy(p1->shuhao,tshuhao);//复制书号
    				strcpy(p1->name,tname);//复制书名
    				strcpy(p1->author,tauthor);//复制作者名字
    				strcpy(p1->chuban,tchuban);//复制出版社
    				strcpy(p1->kind,tkind);//复制类别
    				p1->xcl=txcl;//复制个数
    				p1->price=tprice;//复制单价
    			}
    		}
    		
    		if (n==0)//如果图书只有一项且这一项刚好和要删除的相同
    		{ 
    			head=NULL;
    		}
    		else//建立链表的最后剩余一个储存空间,所以封底
    		{
    			p2->next=p1;
    			p1->next=NULL;
    			fclose(fp);
    		}
    	}
    	
    	fp=fopen("library.txt","w");//清空文件,只写打开,然后关闭
    	fclose(fp);
    	
    	fp=fopen("library.txt","a");//追加文件
    	p=head;
    	
    	for (;p!=NULL;)//把链表内容覆盖到文件
    	{
    		fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",p->shuhao,p->name,p->author,p->chuban,p->kind,p->xcl,p->price);
    		p=p->next;
    	}
    	
    	fclose(fp);//关闭文件
    	system ("cls");
    	
    	printf("\n删除成功 \n按任意键返回上一层\n");
    	getch();//返回上一层
    	tsgxx();
    }
    
    
    void chaxunts()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~查询函数
    {
    	FILE *fp;
    	char choose;
    	int txcl=0,n=0,k=0,i,l;
    	float tprice=0;
    	char tname[20]={'\0'},tauthor[20]={'\0'},chazhao[20]={'\0'},tchuban[20]={'\0'},
    	tshuhao[20]={'\0'},tkind[20]={'\0'};
    	
    	if ((fp=fopen("library.txt","r"))==NULL)//打开文件
    	{ 
    		system ("cls");
    		printf("\n记录文件不存在!按任意键返回");
    		getch();
    		tsgxx();
    	}
    	
    	l=kucungs();//获得库存图书个数
    	menu2();//提示输入菜单 
    	scanf("%s",chazhao);
    	system ("cls");
    	
    	for (i=0;i<l;i++)
    	{ 
    		fscanf(fp,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&txcl,&tprice);//读文件信息
    		if(!strcmp(chazhao,tshuhao)||!strcmp(chazhao,tname)||!strcmp(chazhao,tauthor)||!strcmp(chazhao,tkind))//在库存图书里面模糊检索 
    		{
    			if (k==0)
    			{
    				printf("查询结果:\n\n");
    				printf("书号\t书名\t作者\t\t出版社\t\t类别\t\t现存量\t单价\n");
    			}
    			printf("%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",tshuhao,tname,tauthor,tchuban,tkind,txcl,tprice);
    			k++;
    		}
    	}
    	
    	if (k==0)//没有这本书 
    	{ 
    		system ("cls");
    		printf("\n无符合记录!\n");
    		getch();
    		tsgxx();
    	}
    	
    	fclose(fp);
    	getch();//返回
    	tsgxx();
    }
    
    	
    void kucunxinxi()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~显示库存图书信息
    {
    	FILE *fp;
    	int xcl=0,n=0,i=0,j=0;
    	float price=0;
    	char name[20]={'\0'},author[20]={'\0'},kind[20]={'\0'},chuban[20]={'\0'},shuhao[20]={'\0'};
    	
    	if ((fp=fopen("library.txt","r"))==NULL)//打开文件夹
    	{
    		system ("cls");
    		printf("\n记录文件不存在!");
    	}
    	n= kucungs();
    	
    	if (n==0)
    	{ 
    		system ("cls");
    		printf("\n无任何记录!");
    	}
    	
    	fp=fopen("library.txt","r");//打开只读文件
    	system ("cls");
    	printf("书号\t书名\t作者\t\t出版社\t\t类别\t\t库存量\t单价\n");
    	
    	for (i=0;i<n;i++)//输出所有在库图书信息
    	{
    		fscanf(fp,"%s%s%s%s%s%d%f",shuhao,name,author,chuban,kind,&xcl,&price);
    		printf("%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",shuhao,name,author,chuban,kind,xcl,price);
    	}
    	
    	fclose(fp);
    	printf("\n按任意键返回\n");
    	getch();//返回
    	tsgxx();
    }
    
    
    void menu3() //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~显示借书系统主菜单
    {
    	system ("cls");
    	
    	printf("\n 				`~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` ");
    	printf("\n\n						1.借书登记\n\n");
    	printf("\n\n						2.还书登记\n\n");
    	printf("\n\n						3.借阅情况查看\n\n");
    	printf("\n\n						4.返回上一层\n\n");
    	//printf("\n\n					^~^请按键选择and回车确定哦 *·*\n");
    	printf("\n 				`~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~` `~`\n ");	
    	
    	return ;
    }
    
    
    void jieshuxitong()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~借书系统函数
    { 
    	void jieshu();
    	void huanshu();
    	void duzhexinxi();//函数声明
    	char choose;
    	
    	menu3();
    	getchar();//吞掉一个显示出menu3函数后的进行下一步的回车 
    	
    	scanf("%c",&choose);//选择功能
    	
    	for (;;)
    		switch(choose)
    		{ 
    			case '1':	jieshu();
    						break;	
    						
    			case '2':	huanshu();
    						break;
    						
    			case '3':	duzhexinxi();
    						break;
    						
    			case '4':	main1();
    						break;
    		}
    }
    
    
    void jieshu()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~借书函数
    {
    	FILE *fp,*fp3;
    	struct library *head=NULL;
    	struct library *p,*p1,*p2;
    	int txcl=0,i,loop,zhenghao=0,n=0,k=0,t=0,flag=0;
    	float tprice=0;
    	char tname[20]={'\0'},tauthor[20]={'\0'},tchuban[20]={'\0'},tkind[20]={'\0'},tshuhao[20]={'\0'},
    	ttname[20]={'\0'},mingzi[20]={'\0'},riqi[20]={'\0'},zname[20]={'\0'};
    	char hitkey=0;
    	
    	system ("cls");
    	
    	{
    		if ((fp=fopen("library.txt","r"))==NULL)//打开图书馆文件
    	    {
    			system ("cls");
    			printf("\n 图书馆无库存!按任意键退出!");
    			getch();
    			exit (0);
    		}
    		else
    		{
    			{
    				printf("\n请输入借阅书名:\n请输入:\n");//输入书名
    				scanf("%s",zname);
    				k= kucungs();//统计图书馆文件个数
    				for (i=0;i<k;i++)//读入图书馆信息,存储到链表
    				{
    					fscanf(fp,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&txcl,&tprice);
    					n++;
    					if (n==1)
    					{ 
    						p1=p2=(struct library*)malloc(LEN);
    						head=p1;
    					}
    					else
    					{ 
    						p2->next=p1;
    						p2=p1;
    						p1=(struct library*)malloc(LEN);//新建链表
    					}
    				
    					strcpy(p1->shuhao,tshuhao);//复制书号	
    					strcpy(p1->name,tname);//复制书名
    					strcpy(p1->author,tauthor);//复制作者
    					strcpy(p1->chuban,tchuban);//复制出版社
    					strcpy(p1->kind,tkind);//复制类别
    					p1->xcl=txcl;//复制现存量
    					p1->price=tprice;//复制单价
    				}
    			
    				if (n==0)
    					head=NULL;
    				else
    				{
    					p2->next=p1;
    					p1->next=NULL;
    					fclose(fp);
    				}
    			}
    		}
    		
    		p=head;
    		for (;p!=NULL;)//读链表
    		{
    			if(!(strcmp(p->name,zname)))//判断要借书的是否存在
    			{
    				flag=1;//标记取1
    				loop=p->xcl;//现存量减1
    				(p->xcl)--;
    			}
    			p=p->next;
    		}
    		
    		if(flag&&(loop>0))//存在借书书名且现存量大于0,把库存量变化后的链表存入文件
    		{ 
    			fp=fopen("library.txt","w");
    			fclose(fp);
    			fp=fopen("library.txt","a");
    			p=head;
    			
    			for (;p!=NULL;)
    			{
    				fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",p->shuhao,p->name,p->author,p->chuban,p->kind,p->xcl,p->price);
    				p=p->next;
    			}
    			free(p);//把链表内容覆盖文件
    			fclose(fp);
    		}
    			
    		if(flag&&(loop>0))//存在借书书名且现存量大于0
    		{
    			{
    				if ((fp3=fopen("reader.txt","r"))==NULL)//建读者文件夹
    				{ 
    					fp3=fopen("reader.txt","w");//打开只读文件
    					fclose(fp3);			
    				}			
    				fp3=fopen("reader.txt","a");//以附加的方式打开文件		
    			}
    				
    			{
    				{
    					if (n!=0)
    						printf("\n请按以下格式输入读者信息:\n 证号 姓名 归还日期 借书书名\n请输入:");//录入读者信息
    						
    					scanf("%d %s %s %s",&zhenghao,&mingzi[20],&riqi[20],&zname[20]);
    					fprintf(fp3,"\n%-8d%-23s%-18s%-10s\n",zhenghao,&mingzi[20],&riqi[20],&zname[20]);
    					fp=fopen("library.txt","w");//删除图书馆文件信息
    					fclose(fp);
    					fp=fopen("library.txt","a");//重新追加信息
    					p=head;
    					
    					for (;p!=NULL;)//把链表内容覆盖图书馆文件
    					{
    						fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",p->shuhao,p->name,p->author,p->chuban,p->kind,p->xcl,p->price);	
    						p=p->next;
    					}
    					
    					fclose(fp);
    					fclose(fp3);
    					printf("成功!按任意键返回\n");
    					getch();//返回
    					
    					jieshuxitong();//调用借阅系统
    				}
    			}
    			jieshuxitong();//调用借阅系统
    		}
    		else
    			printf("此书已被借完!按任意键返回!");//否则输出此书已被借完
    
    		getch();//返回		
    		jieshuxitong();//调用借阅系统
    	}
    }
    
    
    void huanshu()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~还书函数
    {
    	FILE *fp,*fp3;	
    	struct reader *head=NULL;
    	struct reader *p,*p1,*p2;
    	struct library *lhead1=NULL;
    	struct library *zp1,*lp1,*lp2;
    	int txcl=0,i;
    	float tprice=0;
    	char tname[20]={'\0'},tauthor[20]={'\0'},tkind[20]={'\0'},
    	tchuban[20]={'\0'},ttname[20]={'\0'},tshuhao[20]={'\0'};
    	int ttzhenghao=0,tzhenghao=0,n=0,k=0,t=0,flag=0;
    	char tmingzi[20]={'\0'},triqi[20]={'\0'},tzname[20]={'\0'},ttzname[20]={'\0'};
    	char hitkey=0;
    	
    	system ("cls");
    	
    	{	
    		if ((fp=fopen("reader.txt","r"))==NULL)//不存在读者文件,则输出不能还书
    		{
    			system ("cls");
    			printf("\n 不存在借书者!按任意键退出!");
    			getch();
    			exit (0);
    		}
    		else
    		{
    			{			
    				printf("\n请输入读者证号和书名:\n请输入:");	
    				scanf("%d %s",&ttzhenghao,ttzname);//输入还书证号和书名
    				k=duzhegs();//获取读者文件夹信息个数
    				
    				for (i=0;i<k;i++)//读取读者文件夹信息
    				{
    					fscanf(fp,"%d%s%s%s\n ",&tzhenghao,tmingzi,triqi,tzname);
    					if((ttzhenghao==tzhenghao)&&!strcmp(ttzname,tzname))//如果证号书名存在,则标记为1
    					flag=1;//strcmp:将两个字符串进行比较返回比较结果,相同返回0 
    				}
    				fclose(fp);
    				
    				fp=fopen("reader.txt","r");//打开读者文件
    				if(flag)
    				{	
    					for (i=0;i<k;i++)//将读者文件复制到链表
    					{
    						fscanf(fp,"%d%s%s%s\n ",&tzhenghao,tmingzi,triqi,tzname);//读取文件信息	
    						if(!((ttzhenghao==tzhenghao)&&!strcmp(ttzname,tzname)))
    						{ 
    							n++;
    							if (n==1)
    							{ 
    								p1=p2=(struct reader*)malloc(LEN1);//新建链表开辟内存 
    								head=p1;//head指向第一个节点 
    							}
    							else
    							{ 
    								p2->next=p1;
    								p2=p1;
    								p1=(struct reader*)malloc(LEN1);//新建链表
    							}
    							
    							p1->zhenghao=tzhenghao;//复制证号
    							strcpy(p1->mingzi,tmingzi);//复制读者名字						
    							strcpy(p1->riqi,triqi);//复制日期						
    							strcpy(p1->zname,tzname);//复制书名					
    						}
    					}
    					
    					if (n==0)
    						head=NULL;
    					else
    					{
    						p2->next=p1;				
    						p1->next=NULL;					
    						fclose(fp);				
    					}
    					
    					fp=fopen("reader.txt","w");//清空读者文件
    					fclose(fp);
    					
    					fp=fopen("reader.txt","a");//追加信息
    					
    					p=head;
    					
    					for (;p!=NULL;)//把链表内容覆盖读者文件			
    					{				
    						fprintf(fp,"\n%-8d%-23s%-18s%-10s\n",p->zhenghao,p->mingzi,p->riqi,p->zname);						
    						p=p->next;					
    					}
    					
    					free(p);				
    					fclose(fp);				
    				}
    			}
    		}
    	}
    	
    	if(flag)//标记为1,即还书时
    	{
    		{
    			{
    				printf("确认还书请按回车!");
    				
    				for (;hitkey!=13&&hitkey!=27;)
    				
    				hitkey=getch();
    				
    				if (hitkey==13)
    					printf("成功!按任意键返回!");
    				
    				n=0;flag=0;
    				fp3=fopen("library.txt","r");//打开图书馆文件
    				k=kucungs();//获取图书馆文件个数
    				
    				for (i=0;i<k;i++)//将图书馆文件复制到链表
    				{					
    					fscanf(fp3,"%s%s%s%s%s%d%f",tshuhao,tname,tauthor,tchuban,tkind,&txcl,&tprice);//读取信息					
    					n++;				
    					if (n==1)				
    					{ 
    						lp1=lp2=(struct library*)malloc(LEN);//新建链表
    						lhead1=lp1;
    					}
    					else
    					{ 
    						lp2->next=lp1;
    						lp2=lp1;
    						lp1=(struct library*)malloc(LEN);//新建链表
    					}
    					
    					strcpy(lp1->shuhao,tshuhao);//复制书号				
    					strcpy(lp1->name,tname);//复制书名			
    					strcpy(lp1->author,tauthor);//复制作者					
    					strcpy(lp1->chuban,tchuban);//复制出版社					
    					strcpy(lp1->kind,tkind);//复制类别					
    					lp1->xcl=txcl; //复制现存量					
    					lp1->price=tprice;//复制单价					
    				}
    				
    				if (n==0)
    				{
    					lhead1=NULL;
    				}
    				else				
    				{				
    					lp2->next=lp1;				
    					lp1->next=NULL;	
    					fclose(fp3);		
    				}
    			}
    		}
    		
    		zp1=lhead1;		
    		for (;zp1!=NULL;)
    		{		
    			if(!(strcmp(zp1->name,ttzname)))//寻找书名相同			
    			++(zp1->xcl);//现存量加1			
    			zp1=zp1->next;
    		}
    		
    		fp3=fopen("library.txt","w");//清空图书馆文件
    		fclose(fp);
    		fp3=fopen("library.txt","a");//追加信息
    		zp1=lhead1;
    		
    		for (;zp1!=NULL;)//把链表内容覆盖图书馆文件
    		{
    			fprintf(fp3,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",		
    				zp1->shuhao,zp1->name,zp1->author,zp1->chuban,zp1->kind,zp1->xcl,zp1->price);		
    			zp1=zp1->next;
    		}
    		
    		fclose(fp3);
    		getch();//返回
    		jieshuxitong();//调用借阅系统
    	}
    	else
    		printf("不存在此信息!按任意键返回!");
    	
    	getch();//返回
    	jieshuxitong();//调用借阅系统
    }
    
    
    void duzhexinxi()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~显示读者借书情况函数
    {
    	FILE *fp;
    	int zhenghao=0,xcl=0,n=0,i=0,j=0;
    	char mingzi[20]={'\0'},riqi[20]={'\0'},zname[20]={'\0'};
    	
    	if ((fp=fopen("reader.txt","r"))==NULL)//打开读者文件夹
    	{
    		system ("cls");
    		printf("\n记录文件不存在!");
    	}
    	n=duzhegs();
    	
    	if (n==0)
    	{ 
    		system ("cls");
    		printf("\n无任何记录!");
    	}
    	
    	fp=fopen("reader.txt","r");
    	system ("cls");
    	printf("\n证号\t读者姓名\t\t还书日期\t书名\n");
    	
    	for (i=0;i<n;i++)//输出文件信息
    	{	
    		fscanf(fp,"%d%s%s%s\n ",&zhenghao,mingzi,riqi,zname);	
    		printf("\n%-8d%-23s%-18s%-10s\n", zhenghao,mingzi,riqi,zname);
    	}
    	
    	fclose(fp);
    	printf("\n按任意键返回\n");
    	getch();//返回
    	jieshuxitong();//调用借阅系统
    }
    
    void begin()
    {
    	char num;
    	printf("\n\n\n\n					教师端登录请按 1 \n\n					学生端登录请按 2 \n\n");
    	scanf("%c",&num);getchar();
    }
    
    int main()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~主函数调用
    {
    	system("color 3F");//蓝色背景白色字体 
    	begin();
    	main1();
    	return 0;
    }
    
    												   ——2018.12.28
    												   ——by Z方 的 '^旧时光~'
    
    展开全文
  • 借阅状态:");  scanf("%s",&book[i].State);  printf("是否继续输入?1 继续 0 退出:");  scanf("%d",&choice);  recordcnt&...
  • 课程设计报告 课程设计题目 家庭财务管理系统 学生姓名: 专 业: 信息工程 班 级: 指导教师: 2018 年 1 月 8 日 1.需求分析 根据家庭账务管理的需要建立一个 家庭账务管理系统以方便对家庭日常 收入及支出进行记录和...
  • C 语言图书管理系统课程设计,主要实现功能,图书管理、图书借阅、用户管理、借阅管理
  • 第三章 图书管理系统的设计与实现 3.1系统的需求分析 图书登记管理系统作为一个应用软件将为学校的老师和学生提供一个对学校图书馆深入了解并借阅还书的平台根据系统界面的提示信息对图书馆信息进行查询初始化等操作...
  • 实用文档 北 京 师 范 大 学 珠 海 分 校 C 程序设计实践报告 ...2013 年 4 月 11 日 大全 实用文档 1 题目与要求 编写一个图书管理系统除了书上的功能之外还要能做到读者借书还书查看书籍排行榜看到书籍的 借阅记录
  • C语言实现的图书管理系统,数据用文件的方式存储。 该系统的主要功能: 添加数目、删除数目、查询数目; 添加读者、删除读者、查询读者; 借出图书、归还图书、记录借阅信息; 显示所有数目、...
  • 一、 设计题目与要求: 1、 图书管理: 1)增加图书 2)查询图书 3)删除图书 4)借阅图书 5)归还图书 6)图书遍历 2、会员管理: 1)增加会员 2)查询会员 3)删除会员 4)借书信息 5)会员遍历
  • c语言编的图书借阅管理系统~~~ 软件技术课程设计~~~~~~~~~~~~~~~~~~

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 205
精华内容 82
关键字:

c语言图书借阅系统

c语言 订阅