應用程序設計:圖書管理系統模板(數組+文件)

概述
        主要包括圖書的庫存信息,每一本書的借閱信息以及每個人的借書信息。
系統功能:
    (1)借閱資料管理(對相關資料進行添加,刪除,修改,查詢等操做)
    (2)借閱管理(包括借出操做,還書操做)
    (3)讀者管理(讀者等級:可分爲教師,學生。並定義每類讀者可借書數量)
    (4)統計分析(當前借閱和相關資料狀態。統計分析借閱排行榜,資料狀態統計,借閱統計,顯示全部至當日到期未還書信息等功能分析)(感謝同窗的支持)數組

若是喜歡鏈表的能夠參考https://blog.csdn.net/qq_30253757/article/details/85340411緩存

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fp;//定義文件指針fp,指向文件的起始地址
struct bbb
	{
		char name[10];
		char writer[10];
		char num[12];
		char addr[8];
		char time [8];
		char price[8];
	}book;	
int main()
{ 
	int t,i=1;
	char menu();//菜單 
	void list();//顯示 
	void input();//輸入 
	void search1();//按書名查詢 
	void search2();//按做者名查詢 
	void modify();//修改 
	void del();//刪除
	void jieyue();//借閱 
 	printf("請輸入登陸號(1):\n");//登陸號爲1; 
	    scanf("%d",&t);
		if(t==1)
		{
 
		while(1)
			{
				switch(menu())
				{
					case '0':t=1;break;
					case '1':input();break;
					case '2':list();break;
					case '3':search1();break;//bookname search 
					case '4':search2();break;//writer search
					case '5':modify();break;
					case '6':del();break;
					case '7':exit(0);break;
					case '8':jieyue();break;
					default :break;
				}
			}
		}
		else printf("登陸名錯誤!請從新輸入:\n");main();//exit(1);
	return 0;
}
 
char menu()//顯示菜單界面並
{
	char n;
	printf("歡迎使用圖書管理系統**************\n");
	printf("1.輸入圖書信息;\n");
	printf("2.顯示圖書信息;\n");
	printf("3.按書名查找圖書信息;\n");
	printf("4.按做者查找圖書信息;\n");
	printf("5.修改圖書信息;\n");
	printf("6.刪除圖書記錄;\n");
	printf("7.退出圖書管理系統;\n");
	printf("8.查看可借閱量和時間;\n");
	printf("************************************************\n");
	printf("  請選擇菜單命令: ");
	while(1)
	{
		do
		{
			fflush(stdin);//清除緩存
			printf("\n輸入菜單(1--8):"); 
			scanf("%c",&n); 
		} while(n <'0' || n >'9'); //不知足條件繼續從新輸入,知足條件跳出循環結構程序流程向下     
		return n;//返回值返回給主函數,用以選擇功能模塊
	}
}  
void input()//錄入 
{
	char ch;
	int i=0;
	struct bbb cache[5005];
	FILE *xi=fopen("book.txt","rb+");
	while(fread(&cache[i],sizeof(book),1,xi) == 1)
	{ 
		i++;
	}
	int huan=i;
	fclose(xi);
	do
	{ 
		//fflush(stdin);
		printf("請輸入書名:");
		scanf("%s",book.name);
		printf("請輸入做者:");
		scanf("%s",book.writer);
		printf("請輸入圖書編號:");
		scanf("%s",book.num);
		printf("請輸入出版社:");
		scanf("%s",book.addr);
		printf("請輸入出版時間:");
		scanf("%s",book.time);
		printf("請輸入價格:");
		scanf("%s",book.price);	
		printf("---------------------------------------------------------");
		int flag=0;
		for(i=0;i<huan;i++)
		{
			if(strcmp(cache[i].num,book.num)==0)
			{
				printf("\n已有此圖書\n");
				flag=1;
				break;
			}
		}
		if(flag==1)
			{
				ch=='y';
			}
		else
			cache[huan++]=book;
		printf("\n是否繼續輸入新的圖書信息?\n");
		printf("請選擇(Y/N):");
		getchar();
		ch=getchar();
	}while(ch == 'y' || ch == 'Y');
	getchar();
	fp = fopen("book.txt","wb");//以覆蓋方式打開文件,若是文件不存在則創建該文件
	for(int m=0;m<huan;m++)
	{
		fwrite(&cache[m],sizeof(book),1,fp);
	}
	printf("按回車鍵返回主菜單");
	getchar();
	fclose(fp);//關閉文件防止數據丟失
}
void list()//顯示 
{
 
	fp = fopen("book.txt","rb");//以只讀方式(r) 
	printf("      書名    做者     分類號    出版單位    時間     價格\n");
	while(fread(&book,sizeof(book),1,fp) == 1)
	{ 
		printf("%10s%8s",book.name,book.writer);
		printf("%10s%8s%12s%10s\n",book.num,book.addr,book.time,book.price  );		
	}
	getchar();
	printf("按回車鍵返回主菜單!");
	getchar();//等待用戶查看命令,按回車鍵返回
	fclose(fp);//關閉文件
}
void search1()//bookname search
{
	char name[10];
	printf("請輸入要查找的書名:");
	fflush(stdin);//清除緩存
	gets(name);
	fp = fopen("book.txt","rb");//以二進制只讀方式打開文件
	while(!feof(fp))//判斷文件是否到達末尾
	{
		fread(&book,sizeof(book),1,fp);
		if(strcmp(name,book.name) == 0) 
		{
			printf("已找到目標圖書:\n");
			printf("      書名      做者      分類號    出版單位    時間    價格\n");
			printf("%10s%10s ",book.name,book.writer);
			printf("%10s%8s%10s%10s\n ",book.num,book.addr,book.time,book.price  );
			printf("\n按回車鍵返回主菜單\n");			
			getchar();//等待用戶查看命令,按回車鍵流程向下
			break;//跳出此條件語句
		}
	}
	if(feof(fp))//判斷文件指針是否指向文件末尾
	{
		printf("您所查詢的圖書不存在");
		getchar();//等待用戶查看信息,按回車鍵流程向下
	}
	fclose(fp); //關閉文件
	fflush(stdin);//清除緩存
}
void search2()//writer search
{
	char writer[10];
	printf("請輸入要查找的做者名:\n");
	fflush(stdin);//清除緩存
	gets(writer);
	fp = fopen("book.txt","rb");//以二進制只讀方式打開文件
	while(!feof(fp))//判斷文件是否到達末尾
	{
		fread(&book,sizeof(book),1,fp);
		if(strcmp(writer,book.writer) == 0) 
		{
			printf("已找到目標圖書:\n");
			printf("      書名      做者      分類號    出版單位    時間    價格\n");
			printf("%10s%10s ",book.name,book.writer);
			printf("%10s%8s%10s%10s\n ",book.num,book.addr,book.time,book.price  );
			printf("\n按回車鍵返回主菜單");			
			getchar();//等待用戶查看命令,按回車鍵流程向下
			break;//跳出此條件語句
		}
	}
	if(feof(fp))//判斷文件指針是否指向文件末尾
	{
		printf("您所查詢的圖書不存在");
		getchar();//等待用戶查看信息,按回車鍵流程向下
	}
	fclose(fp); //關閉文件
	fflush(stdin);//清除緩存
}
void modify()//修改
{
 	char modname[10],name[10],writer[10],numx[12],addrx[8],time[8],price[8];//定義臨時的數組用來存放臨時數據
	int a,b,c,d,f,g=1;
	int flag;
	char ch;
	FILE *fp1,*fp2;//聲明兩個文件指針fp1,fp2
	printf("請輸入修改的圖書名:\n");
	fflush(stdin);//清除緩存
	gets(modname);
	do
	{
		if((fp1 = fopen("book.txt","rb")) == NULL)//用只讀方式打開一個二進制文件,若是返回的指針爲空
		{
			printf("\n不能打開 book.txt文件");
			getchar();
			exit(1);//跳出此條件語句
		}
		if((fp2 = fopen("temp.txt","wb")) == NULL)//用只寫方式打開一個二進制文件,若是返回的指針爲空
		{
			printf("\n不能打開 book.txt文件");
			getchar();
			exit(1);//跳出此條件語句
		}
		printf("請輸入要改的圖書名\n");
		gets(modname);
		flag=0;
		while(fread(&book,sizeof(book),1,fp1) == 1)
		{
			if(strcmp(book.name,modname) == 0)
			{
				printf("修改圖書名嗎?(1)");
				scanf("%d",&a);
				getchar();
				if(a == 1)
				{
					printf("請輸入圖書名:");
					gets(name);
					strcpy(book.name, name);
				} 
					printf("修改做者嗎?(2)");
				scanf("%d",&b);
				getchar();//等待用戶確認
				if(b == 2)
				{
					printf("請輸入做者:");
					gets(writer);
					strcpy(book.writer,writer);
				} 
				printf("修改分類號嗎?(3)");
				scanf("%d",&c);
				getchar();//等待用戶確認
				if(c == 3)
				{
					printf("請輸入分類號:");
					gets(numx);
					strcpy(book.num,numx);
				}
				printf("修改出版單位嗎?(4)");
				scanf("%d",&d);
				getchar();
 
				if(d == 4)
				{
					printf("請輸入出版單位:");
					gets(addrx);
					strcpy(book.addr,addrx);
				}
				printf("修改出版時間嗎?(5)");
				scanf("%d",&f);
				getchar();
 
				if(f == 5)
				{
					printf("請輸入出版時間:");
					gets(time);
					strcpy(book.time,time);
				}
					printf("修改價格嗎?(6)");
				scanf("%d",&g);
				getchar();
 
				if(g == 6)
				{
					printf("請輸入價格:");
					gets(price);
					strcpy(book.price,price);
				}
				flag=1;
			
			}		
			fwrite(&book,sizeof(book),1,fp2);//將數據做爲一個總體一次性寫入磁盤文件
		}
		fclose(fp1);
		fclose(fp2);	
		if(flag == 1)
		{
			printf("修改爲功");
			remove("book.txt");//刪除原文件
			rename("temp.txt","book.txt");//將臨時文件命名爲book.txt
		}
		else
		{
			printf("找不到此記錄");
			getchar();
		}
		printf("繼續修改嗎?(y/n)");
		ch=getchar();//接受字符
		getchar();
	}while(ch == 'Y' || ch == 'y');
}
void del()//刪除
{
	char name[10];
	int flag;
	char ch;
	FILE *fp1,*fp2;//聲明兩個文件指針fp1,fp2
	do
	{
		if((fp1 = fopen("book.txt","rb")) == NULL)
		{
			printf("\n不能打開 book.txt文件");
			getchar();
			exit(1);
		}
		if((fp2 = fopen("temp.txt","wb")) == NULL)
		{
			printf("\n不能打開 book.txt文件");
			getchar();
				exit(1);
		}
		printf("請輸入要刪除的圖書名:");
		fflush(stdin);//清除緩存
		gets(name);
		flag = 0;
		while(!feof(fp1))//判斷文件fp1是否指向文件末尾
		{
			fread(&book,sizeof(book),1,fp1);
			if(strcmp(name,book.name) == 0)
			{
				flag = 1;
			}
			else
			{
				fwrite(&book,sizeof(book),1,fp2);//將數據做爲一個總體一次性寫入磁盤文件
			}
		}
		fclose(fp1);//關閉文件
		fclose(fp2);//關閉文件
 
		if(flag == 1)
		{
			remove("book.txt");//移除文件
			rename("temp.txt","book.txt");
			printf("刪除成功!\n");
		}
		else
		{
			printf("找不到圖書名");
			remove("temp.txt");//移除文件
		}
		printf("繼續刪除其餘圖書名嗎?(y/n)");
		fflush(stdin);//清除緩存
		ch = getchar();
		getchar();
	}while(ch == 'y' || ch == 'Y');
	fflush(stdin);//清除緩存
}
void jieyue()
{
	char ch;
	int n;
	printf("請選擇您的身份:1.教師 2.學生\n");
	scanf("%d",&n);
	switch(n)
	{
	case 1:
        	printf("您可借閱圖書數目爲8本,可借閱時間爲4周\n");
	        break;
	case 2:
	        printf("您可借閱圖書數目爲4本,可借閱時間爲2周\n");
	        break;
	default:
		    printf("不存在此身份\n");
		    break;
    }
	ch=getchar();
}
相關文章
相關標籤/搜索