linux c练习 图书管理系统

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BOOKSIZE     2048
#define STUSIZE      1024

int gBookIndex = 0;  //用于书本数组的下标
int gStuIndex = 0;   //用于学生数组的下标
struct Book
{
	char book_name[32];
	char book_author[32];
	int borrow_flag;
	int book_count;
};
typedef struct Book book;

struct Student              
{
	char name[32];
	char id[32];
	char *booknum[5];
	int count;
};                             

typedef struct Student stu;

book *gBookInfo[BOOKSIZE] = {0};  //结构体指针数组,存放各个结构体的首地址。
stu *gStuInfo[STUSIZE] = {0};   //结构体指针数组

void InitLibrary()  //初始化(三本书)
{
	gBookInfo[gBookIndex] = (book *)malloc(sizeof(book) * 1);   
	if (NULL == gBookInfo[gBookIndex])
	{
		printf("malloc failure!\n");
	}
	strcpy(gBookInfo[gBookIndex]->book_name, "aaaa");
	strcpy(gBookInfo[gBookIndex]->book_author, "jack");
	gBookInfo[gBookIndex]->book_count = 5;     
	gBookInfo[gBookIndex]->borrow_flag = 1;                 
	gBookIndex++;

	gBookInfo[gBookIndex] = (book *)malloc(sizeof(book) * 1);  
	if (NULL == gBookInfo[gBookIndex])
	{
		printf("malloc failure!\n");
	}
	strcpy(gBookInfo[gBookIndex]->book_name, "bbbb");
	strcpy(gBookInfo[gBookIndex]->book_author, "jack");
	gBookInfo[gBookIndex]->book_count = 3;                  
	gBookInfo[gBookIndex]->borrow_flag = 1;  
	gBookIndex++;

	gBookInfo[gBookIndex] = (book *)malloc(sizeof(book) * 1);   
	if (NULL == gBookInfo[gBookIndex])
	{
		printf("malloc failure!\n");
	}
	//strcpy(gBookInfo[gBookIndex]->book_name, 
	strcpy(gBookInfo[gBookIndex]->book_name, "cccccccccccccc");
	strcpy(gBookInfo[gBookIndex]->book_author, "jack");
	gBookInfo[gBookIndex]->book_count = 2;                  
	gBookInfo[gBookIndex]->borrow_flag = 1;                
	gBookIndex++;
}

char *func[] = {"1、增加图书        2、查看图书"
		        "3、删除图书        4、修改图书,
		       	"5、借书            6、还书
		    	"7、借书情况        8、退出系统"};
void menu()
{
	int i;
	for (i = 0; i < sizeof(func) / sizeof(func[0]); i++)    //输出菜单界面
	{
		printf("%s\n", func[i]);
	}
}

void AddBook()
{
	char name[32] = {0};
	char author[32] = {0};
	int count = 0;
	int flag = 0;

	printf("请输入图书的名字、作者、本数、是否可借(1\0)\n");
	scanf("%s%s%d%d", name, author, &count, &flag);

	gBookInfo[gBookIndex] = (book *)malloc(sizeof(book) * 1);
	strcpy(gBookInfo[gBookIndex]->book_name, name);
	strcpy(gBookInfo[gBookIndex]->book_author, author);
	gBookInfo[gBookIndex]->book_count = count;
	gBookInfo[gBookIndex]->borrow_flag = flag;
	gBookIndex++;

	printf("图书录入成功!\n");
}

void ShowBook()
{
	char *book_info[] = {"书名","作者","本数","是否可借"};
	int i;
	printf("%-20s %-20s %-20s %-20s\n", book_info[0], book_info[1], book_info[2], book_info[3]);
	for (i = 0; i < gBookIndex; i++)
	{
		printf("%-20s %-20s %-20d %-20d\n", gBookInfo[i]->book_name, gBookInfo[i]->book_author, 
											gBookInfo[i]->book_count, gBookInfo[i]->borrow_flag);
	}
	sleep(1);      //执行挂起1秒 
}


void BorrowBook()
{
	char name[32] = {0};	
	char id[32] = {0};
	char book_name[32] = {0};

	printf("请输入姓名\n");
	scanf("%s", name);

	int i, j;     //遍历数组,判断该学生是否借过书
	for (i = 0; i < gStuIndex; i++)
	{
		if (strcmp(gStuInfo[i]->name, name) == 0)   //匹配,曾借过书
		{	
			if (gStuInfo[i]->count >= 5)   //一个人最多借5本			
			{
				printf("可借数目已经达到上限,无法借出\n");
				return;
			}
			else   //借过书,但不够五本			
			{
				printf("您之前借过书,请输入书名\n");	
				scanf("%s", book_name);
				for (j = 0; j < gBookIndex; j++)//判断书是否可借
				{
					if (strcmp(gBookInfo[j]->book_name, book_name) == 0)
					{
						if (gBookInfo[j]->borrow_flag == 0)
						{
							printf("剩余0本,不可借\n");
							return;
						}
						else
						{
							break;
						}
					}
					if (j == gBookIndex - 1)
					{
						printf("书名不存在\n");
						return;
					}
				}
				gBookInfo[j]->book_count--;       //被借了一本,就少了一本
				if(gBookInfo[j]->book_count == 0)
				{
					gBookInfo[j]->borrow_flag = 0;
				}


				int k;
				for(k=0;k<gStuInfo[i]->count+1;k++)
				{
		
					if(gStuInfo[i]->booknum[k] == 0)  //
					{		
						gStuInfo[i]->booknum[k] = (char *)malloc(sizeof(char) * 1); 
						strcpy(gStuInfo[i]->booknum[k],book_name);
					}
				}
				gStuInfo[i]->count++;
			    printf("借书成功\n");
			return;
			}
		}
		printf("\n");
	}


	//如果遍历数组结束,没有匹配到,说明没有借过书	
	printf("您之前没有借过书,请输入学号、书名\n");
	scanf("%s%s", id, book_name);
		
	for (i = 0; i < gBookIndex; i++)     //判断书本存不存在
	{
		if (strcmp(gBookInfo[i]->book_name, book_name) == 0)
		{
			if (gBookInfo[i]->borrow_flag == 0)
			{
				printf("书本不可借\n");
				return;
			}
			else
			{
				gBookInfo[i]->book_count--; //减少一本	
			    if(gBookInfo[i]->book_count == 0)
				{
					gBookInfo[i]->borrow_flag = 0;
				}
				break;
			}
		}
		if (i == gBookIndex - 1)
		{
			printf("书名不存在\n");
			return;
		}
	}

	gStuInfo[gStuIndex] = (stu *)malloc(sizeof(stu) * 1);  //录入借书学生的信息
	int count0;
	for(count0=0;count0<5;count0++)
	{
		gStuInfo[gStuIndex]->booknum[count0] = 0;
	}

	gStuInfo[gStuIndex]->booknum[0] = (char *)malloc(sizeof(char) * 1); 
	gStuInfo[gStuIndex]->count = 0;     
	strcpy(gStuInfo[gStuIndex]->name, name);
	strcpy(gStuInfo[gStuIndex]->id, id);
	strcpy(gStuInfo[gStuIndex]->booknum[0], book_name);
	gStuInfo[gStuIndex]->count++;    

	gStuIndex++;
	printf("%d\n",gStuIndex);
	printf("借书成功\n");

	printf("\n");
}


void back()
{
	if( 0 == gStuIndex )
	{	
		printf("暂时无学生借书\n");
	}
	else
	{
	printf("请输入姓名:");
	char name[32];
	scanf("%s",name);
	
	int i,j,k;    
	for (i = 0; i < gStuIndex; i++)
	{
		if (strcmp(gStuInfo[i]->name, name) == 0)   //匹配,曾经借过书		{
			printf("请输入书名:");
			char book_name[32];
			scanf("%s",book_name);
			
			for (j = 0; j < gBookIndex; j++)    //判断书本是否存在
			{
				if (strcmp(gBookInfo[j]->book_name, book_name) == 0)
				{
					for(k=0;k<gStuInfo[i]->count;k++)
					{	
						if(strcmp(gStuInfo[i]->booknum[k],book_name) == 0)
						{
							gStuInfo[i]->booknum[k]=0;	
							free(gStuInfo[i]->booknum[k]);
							break;
						}
					}
									
					gStuInfo[i]->count--;
					gBookInfo[j]->book_count++;
					printf("还书成功\n");
					break;
				}
				if( j == gBookIndex-1 )
				{	
					printf("书名输入错误,请重新输入\n");
		        }
			}
			int t;         
		}
	  }
	}
	printf("\n");
}
	

void change()
{	
	printf("输入所要修改的书名:");
	char bookname1[32];
	scanf("%s",bookname1);
	int num,flag;

	char bookname[32];
	char author[32];
	int i,j;
	for (i = 0; i < gBookIndex; i++)
	{
		if (strcmp(gBookInfo[i]->book_name, bookname1) == 0)
		{
			printf("修改书名输入1,修改作者输入2,修改本数输入3,修改可借状态输入4\n");
			printf("请输入(1/2/3/4):");
			scanf("%d",&j);
			
			if(1 == j)
			{
				printf("请输入修改后的作者:");
				scanf("%s",bookname);
				strcpy(gBookInfo[i]->book_name, bookname );
				printf("修改成功\n");
			}
			else if(2 == j)
			{
				printf("请输入修改后的本数:");
				scanf("%s",author);
				strcpy(gBookInfo[i]->book_author,author );
				printf("修改成功\n");
			}
			else if( 3 == j )
			{
				printf("请输入修改后的本数:");
				scanf("%d",&num);
				gBookInfo[i]->book_count = num;
				printf("修改成功\n");
			}
			else if( 4 == j )
			{
				printf("请输入修改后的可借状态");
				scanf("%d",&flag);
				if( flag == 0 || flag == 1 )
				{
					gBookInfo[i]->borrow_flag = flag;
					printf("修改成功\n");
				}
				else
				printf("输入错误\n");
			}
			else
			{
				printf("输入错误\n");
			}
			break;
		}
			
		if( i == gBookIndex-1 )
		{	
			printf("书名输入错误\n");
		}
	}
	printf("\n");
}


void delet()
{
	int i,j;	
	char bookname[32]={0};
	printf("请输入要删除的书名:");
	scanf("%s",bookname);

	for (i = 0; i < gBookIndex; i++)
	{
		if (strcmp(gBookInfo[i]->book_name, bookname) == 0)
		{
			for(j=i;j<gBookIndex-1;j++)
			{
				strcpy(gBookInfo[j]->book_name,gBookInfo[j+1]->book_name);
				strcpy(gBookInfo[j]->book_author,gBookInfo[j+1]->book_author);
				gBookInfo[j]->borrow_flag=gBookInfo[j+1]->borrow_flag;
				gBookInfo[j]->book_count=gBookInfo[j+1]->book_count;
			}
			free(gBookInfo[gBookIndex]);
			gBookInfo[gBookIndex]=NULL;
			gBookIndex--;
			printf("删除成功\n");
			break;
		}
		if( i == gBookIndex-1 )
		{
			printf("书名输入错误\n");
		}
	}
	printf("\n");
}

void borrowstate()
{	
	printf("共有%d的人借了书\n",gStuIndex);
	printf("\n");

	if(gStuIndex == 0)
	{
		printf("\n");
	}
	else
	{
		char *borrow_info[4] = {"姓名“,"学号","借书本数","书名"”};
		printf("%-20s %-20s %-20s %-20s\n", borrow_info[0], borrow_info[1], borrow_info[2], borrow_info[3]);
		int i,j;
		for(i=0;i<gStuIndex;i++)
		{
			printf("%-20s %-20s %-10d  ",gStuInfo[i]->name,gStuInfo[i]->id,gStuInfo[i]->count);
			for(j=0;j<gStuInfo[i]->count;j++)
			{
				printf("%s	",gStuInfo[i]->booknum[j]);
			}
			printf("\n");
		}
		printf("\n");
	}
}



int main()
{
	InitLibrary();
	int choice;

	system("clear");   //清屏
	while (1)
	{
		menu();
		scanf("%d", &choice);

		switch(choice)
		{
			case 1:   //增加图书
				AddBook();
				break;
			case 2:   //查看图书
				ShowBook();
				break;
			case 3: 
				delet();//删除图书
				break;
			case 4:
				change();//借书
				break;
			case 5:	  //还书
				BorrowBook();
				break;
			case 6: 
				back();//杩樹功
				break;
			case 7:
			    borrowstate();//借书情况
				break;
			case 8:
				exit(0);   //退出整个代码			
				break;
		}
	}
	return 0;
}

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值