c语言实现图书管理系统

/*
	课程设计项目名称:图书查询系统
	作者:施瑞文
	时间:2018.3.4 
*/ 
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<conio.h>
#include<stdlib.h>
#define N sizeof(struct BOOK)

struct BOOK        //图书信息 
{
	char number[10];   //登录号 
	char name[10];     //书名 
	char author[10];    //作者名 
	char type[10];      //类型 
	char publish[10];  //出版单位 
	char time[8];        //出版时间 
	float price;       //价格 
	int num;         //数量 
	int x;
	struct BOOK *next;   //指针域 
};
typedef struct BOOK Book;
typedef Book *book;	 

void HideCursor();    //隐藏光标
void toxy(int x, int y);    //将光标移动到X,Y坐标处
void color(short x);     //设置颜色
void over();             //退出 
void menu();           //菜单 
void input_book();     //图书入库 
void save_book(book p);//将图书信息存入文件 
void find_book();      //查询 
void print_book();    //图书总览 
void del_book();     //删除图书 
void amend_book();    //修改信息 
book ss();
void find_name_book();  //按书名查询 
void find_author_book(); //按作者查询 
void find_number_book();  //按登录号查询
void find_publish_book();  //按出版社查询 
void fuzzy_search();     //模糊查找 

void HideCursor()     //隐藏光标
{
 CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void color(short x)
{
	if(x>=0&&x<=15)
	{
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
	}
	else
	{
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
	}
} 

void toxy(int x, int y)      //将光标移动到X,Y坐标处
{
COORD pos = { x , y };
HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out, pos); 
}

void menu()    //菜单 
{
	do
	{
		system("cls");  //清屏 
		HideCursor();  //隐藏光标 
		color(15);    //设置一个好看的颜色 
		char t;
		toxy(50,5);//将光标移动到(50,5)坐标处
		printf(" 图书查询管理系统");
		toxy(48,8);
		printf("|     1.图书入库      |");
		toxy(48,10);
		printf("|     2.修改信息      |");
		toxy(48,12);
		printf("|     3.删除信息      |");
		toxy(48,14);
		printf("|     4.图书查询      |");
		toxy(48,16);
		printf("|     5.图书总览      |");
		toxy(48,18);
		printf("|     6.退出软件      |");
		t=getch();    //不回显函数 
		switch(t)
		{
			case '1':input_book();break;
			case '2':amend_book();break;
			case '3':del_book();break;
			case '4':find_book();break;
			case '5':print_book();break; 
			case '6':over();break;
			default :break;
		}
	}while(1);
} 

book ss()      //将文件中的内容读出到链表中,返回值为表头地址 
{
	FILE *fp;       //文件指针 
	int n=0;
	book head=NULL;
	book p2,p,pr=NULL;
	fp=fopen("mybook","ab+");     //以只读的方式打开文件 
	if(fp==NULL)
	{
		printf("cannot open file\n");
	}
	while(!feof(fp))        //判断文件位置标志是否移动到文件末尾 
	{
	   n++;
	   	p=(book)malloc(N); //向内存申请一段空间 
	   fread(p,N,1,fp);     //将fp所指向的文件中的内容赋给p 
	   if(n==1)
	   {
	      head=p;
	      p2=p;
	    }
	    else             //创建链表 
	    {
	    	pr=p2;
	    	p2->next=p;
	    	p2=p;
		}
    }
    if(pr!=NULL)
       pr->next=NULL;
    else
       head=NULL;
    fclose(fp);    //关闭文件 
    return head;   //返回头指针 
}

void input_book()    //图书录入 
{
	do
	{
		system("cls");
		color(10);
		char t;
		book p;
		p=(book)malloc(N);     //申请空间 
		//输入图书信息
		toxy(48,8);
		printf("请输入图书登录号(小于10位数):");    
		scanf("%s",p->number);getchar();
		toxy(48,10);
		printf("请输入书名(小于10位数):");
		scanf("%s",p->name);getchar();
		toxy(48,12);
		printf("请输入作者名(小于10位数):");
		scanf("%s",p->author);getchar();
		toxy(48,14);
		printf("请输入图书类别(小于10位数):");
		scanf("%s",p->type);getchar();
		toxy(48,16);
		printf("请输入图书出版单位(小于10位数):");
		scanf("%s",p->publish);getchar();
		toxy(48,18);
		printf("请输入图书出版时间(小于8位数):");
		scanf("%s",p->time);getchar();
		toxy(48,20);
		printf("请输入图书价格:");
		scanf("%f",&p->price);getchar();
		toxy(48,22);
		printf("请输入图书数量:");
		scanf("%d",&p->num);
		save_book(p);
		toxy(48,24);
		printf("正在保存....");
		Sleep(500);   //暂停0.5秒 
		system("cls");
		toxy(46,8);
		printf("-------------------------");
		toxy(46,9);
		printf("|                       |");
		toxy(46,10);
		printf("| 保存成功!是否继续?  |");
		toxy(46,12);
		printf("| 1.是             2.否 |");
		toxy(46,13);
		printf("|                       |");
		toxy(46,14);
		printf("-------------------------");
		while(1)    //利用死循环可有效防止其他按键干扰 
		{
			t=getch();
			if(t=='1')
			{
				break;
			 } 
			 else if(t=='2')
			 {
			 	menu();
			 }
		}
	}while(1);
	
} 

void amend_book()    //修改图书信息 
{
	do
	{
		system("cls");
		color(10);
		book head,p;
		int i=11,j=0,x;
		char ch,t;
		FILE *fp;    //文件指针 
		char _name[10];
		char number[10];   //登录号 
		char name[10];     //书名 
		char author[10];    //作者名 
		char type[10];      //类型 
		char publish[10];  //出版单位 
		char time[8];        //出版时间 
		float price;       //价格 
		int num;         //数量 
		head=ss();
		p=head;
		toxy(48,10);
		printf("请输入你要修改的图书的书名:");
		gets(_name); 
		while(p!=NULL)    //初始化p->x为0 
		{
			p->x=0;
			p=p->next;
		}
		p=head;    //让p重新指向表头 
		toxy(20,5);
		printf("***********************************************图书信息******************************************************");
		toxy(20,8);
		printf("-------------------------------------------------------------------------------------------------------------");
		toxy(20,9);
		printf("登录号        书名        作者名         图书类别         出版单位         出版时间          价格        数量");
		toxy(20,10);
		printf("-------------------------------------------------------------------------------------------------------------");
		while(p!=NULL)
		{
			if(p!=NULL&&strcmp(p->name,_name)==0)
			{
				toxy(20,i);
				j++;
				printf("%d:%s%14s%14s%14s   %14s   %18s         %.2f%12d\n",j,p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num);
				p->x=j;    //给符合查询标准的结点标号 
				i++;
			}
			p=p->next;
		}
		if(j==0)                   //如果j=0,即没有进入前面的搜索循环,也就是没有找到相应的信息 
		{ 
			toxy(50,i);
			printf("没有找到相应的信息!(按0返回,按1重新搜索)");
			while(1)               //死循环是为了防止除0和1的其他按键干扰 
			{
				ch=getch();
				if(ch=='0')
				{
					menu();break;
				}
				else if(ch=='1')
				{
					break;
				}
			}
			if(ch=='1')     //如果输入的ch等于1,则结束本次循环 
			   continue;
		}
		while(1)
		{
			toxy(45,i);
			printf("请输入您要修改的图书的编号:");
			scanf("%d",&x);getchar();
			if(x>j||x==0)     
			{
				toxy(45,++i);
				printf("输入错误,请重新输入!");
				Sleep(500);
			}
			else
			{
				break;
			}
		}
		p=head;     //让p重新指向表头 
		while(p!=NULL&&p->x!=x)   //遍历链表查询符合条件的结点 
		{
			p=p->next;
		}
		if(p)    //如果p不为空 
		{
			system("cls");
			//输入要修改的信息 
			toxy(48,8);
			printf("请输入图书登录号(小于10位数):");
			scanf("%s",number);getchar();strcpy(p->number,number);
			toxy(48,10);
			printf("请输入书名(小于10位数):");
			scanf("%s",name);getchar();strcpy(p->name,name);
			toxy(48,12);
			printf("请输入作者名(小于10位数):");
			scanf("%s",author);getchar();strcpy(p->author,author);
			toxy(48,14);
			printf("请输入图书类别(小于10位数):");
			scanf("%s",type);getchar();strcpy(p->type,type);
			toxy(48,16);
			printf("请输入图书出版单位(小于10位数):");
			scanf("%s",publish);getchar();strcpy(p->publish,publish);
			toxy(48,18);
			printf("请输入图书出版时间(小于8位数):");
			scanf("%s",time);getchar();strcpy(p->time,time);
			toxy(48,20);
			printf("请输入图书价格:");
			scanf("%f",&price);getchar();p->price=price;
			toxy(48,22);
			printf("请输入图书数量:");
			scanf("%d",&num);getchar();p->num=num;
		}
		color(7);
		toxy(46,8);
		printf("-------------------------");
		toxy(46,9);
		printf("|                       |");
		toxy(46,10);
		printf("|     是否确认修改?    |");
		toxy(46,12);
		printf("| 1.是             2.否 |");
		toxy(46,13);
		printf("|                       |");
		toxy(46,14);
		printf("-------------------------");
		while(1)   //利用死循环防止其他按键干扰 
		{
			t=getch();
			if(t=='1')
			{
				break;
			} 
			else if(t=='2')
			{
				menu();
			}
		}
		system("cls");
		toxy(46,10);
		printf("正在修改,请稍后....");
		fp=fopen("mybook","wb");   //以只写的方式打开名为mybook的二进制文件,打开的同时清空文件中的内容 
		if(fp==NULL)
		{
			printf("cannot open file"); 
		}
		if(fwrite(head,N,1,fp)!=1)   //将head写入fp所指向的文件中 
		{
			printf("write error!"); 
		}
		fclose(fp);   //关闭文件 
		if(head!=NULL)   //如果head不为空 
		{
			p=head->next;     //让p指向第二个结点 
			fp=fopen("mybook","ab");   //以追加的方式打开文件 
			if(fp==NULL)
			{
				printf("cannot open file");
			}
			while(p!=NULL)
			{
				if(fwrite(p,N,1,fp)!=1)//将p写入fp所指向的文件中
				{
					printf("write error!");
				}
				p=p->next;
			}
			fclose(fp);  //关闭文件 
		}
		Sleep(500);   //暂停0.5秒 
		system("cls");
		toxy(46,10);
		printf("修改成功!即将自动返回主菜单....");
		Sleep(500);
		break;
	}while(1);
}

void del_book()   //删除信息 
{
	do
	{
		system("cls");
		color(9);
		FILE *fp;
		book head,p,pre=NULL; 
		int j=0,x,i=11;
		char name[10];
		char t,c,ch;
		head=ss();    //调用函数,返回表头地址 
		toxy(48,10);
		printf("请输入你要删除的图书的书名:");
		scanf("%s",name);
		p=head;
		while(p!=NULL)
		{
			p->x=0;
			p=p->next;
		}
		p=head;
		toxy(20,5);
		printf("***********************************************图书信息******************************************************");
		toxy(20,8);
		printf("-------------------------------------------------------------------------------------------------------------");
		toxy(20,9);
		printf("登录号        书名        作者名         图书类别         出版单位         出版时间          价格        数量");
		toxy(20,10);
		printf("-------------------------------------------------------------------------------------------------------------");
		while(p!=NULL)
		{
			if(p!=NULL&&strcmp(p->name,name)==0)
			{
				toxy(20,i);
				j++;
				printf("%d:%s%14s%14s%14s   %14s   %18s         %.2f%12d\n",j,p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num);
				p->x=j;
				i++;
			}
			p=p->next;
		}
		if(j==0)                   //如果j=0,即没有进入前面的搜索循环,也就是没有找到相应的信息 
		{ 
			toxy(50,i);
			printf("没有找到相应的信息!(按0返回,按1重新搜索)");
			while(1)               //死循环是为了防止除0和1的其他按键干扰 
			{
				ch=getch();
				if(ch=='0')
				{
					menu();break;
				}
				else if(ch=='1')
				{
					break;
				}
			}
			if(ch=='1')     //如果输入的ch等于1,则结束本次循环 
			   continue;
		}
		while(1)
		{
			toxy(45,i);
			printf("请输入您要删除的图书的编号:");
			scanf("%d",&x);getchar();
			if(x>j||x==0)
			{
				toxy(45,++i);
				printf("输入错误,请重新输入!");
				Sleep(500);
			}
			else
			{
				break;
			}
		}
		color(7);
		toxy(46,8);
		printf("-------------------------");
		toxy(46,9);
		printf("|                       |");
		toxy(46,10);
		printf("|     是否确认删除?    |");
		toxy(46,12);
		printf("| 1.是             2.否 |");
		toxy(46,13);
		printf("|                       |");
		toxy(46,14);
		printf("-------------------------");
		while(1)
		{
			t=getch();
			if(t=='1')
			{
				break;
			} 
			else if(t=='2')
			{
				menu();
			}
		}
		p=head;
		while(p!=NULL&&p->x!=x)
		{
			pre=p;
			p=p->next;
		}
		if(p!=NULL)
		{
			if(pre==NULL)
			{
				head=head->next;
			}
			else
			{
				pre->next=p->next;
			}
		}
		free(p);
		fp=fopen("mybook","wb");
		if(fp==NULL)
		{
			printf("cannot open file"); 
		}
		if(fwrite(head,N,1,fp)!=1)
		{
			printf("write error!"); 
		}
		fclose(fp);
		if(head!=NULL)
		{
			p=head->next;
			fp=fopen("mybook","ab");
			if(fp==NULL)
			{
				printf("cannot open file");
			}
			while(p!=NULL)
			{
				if(fwrite(p,N,1,fp)!=1)
				{
					printf("write error!");
				}
				p=p->next;
			}
			fclose(fp);
		}
		system("cls");
		toxy(46,10);
		printf("正在删除,请稍后....");
		Sleep(500);
		system("cls");
		toxy(46,8);
		printf("-------------------------");
		toxy(46,9);
		printf("|                       |");
		toxy(46,10);
		printf("|  删除成功,是否继续? |");
		toxy(46,12);
		printf("| 1.是             2.否 |");
		toxy(46,13);
		printf("|                       |");
		toxy(46,14);
		printf("-------------------------");
		while(1)
		{
			c=getch();
			if(c=='1')
			{
				break;
			}
			else if(c=='2')
			{
				menu();
			}
		}
	}while(1);
}

void print_book()   //图书总览 
{
	system("cls");
	color(6);
	book head,p;
	int i=11;
	int sum=0;
	head=ss();
	toxy(20,5);
	printf("***********************************************图书总览******************************************************");
	toxy(20,8);
	printf("-------------------------------------------------------------------------------------------------------------");
	toxy(20,9);
	printf("登录号        书名        作者名         图书类别         出版单位         出版时间          价格        数量");
	toxy(20,10);
	printf("-------------------------------------------------------------------------------------------------------------");
	if(head==NULL)
	{
		toxy(45,11);
		printf("书库暂时没有书哦~赶快去添加几本吧^_^(按任意键返回)");
		getch();
		menu();
	}
	p=head;
	while(p!=NULL)
	{
		toxy(20,i);
		printf("%s%14s%14s%14s   %14s   %18s         %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num);
		i++;
		sum+=p->num;//计算图书总量 
		p=p->next;
	}
	toxy(48,7);
	printf("图书总量为:%d",sum);
	toxy(45,i);
	printf("按任意键返回");
	getch();//不回显函数 
}

void find_book()  //查询图书 
{
	do
	{
		system("cls");  //清屏 
		color(8);
		char t;
		toxy(50,5);
		printf(" 图书查询");
		toxy(48,8);
		printf("|     1.书名  查询      |");
		toxy(48,10);
		printf("|     2.作者  查询      |");
		toxy(48,12);
		printf("|     3.登录号查询      |");
		toxy(48,14);
		printf("|     4.出版社查询      |");
		toxy(48,16);
		printf("|     5.模糊  查询      |");
		toxy(50,18);
		printf("按0返回主菜单");
		t=getch();
		switch(t)
		{
			case '0':menu();break;
			case '1':find_name_book();break;
			case '2':find_author_book();break;
			case '3':find_number_book();break;
			case '4':find_publish_book();break;
			case '5':fuzzy_search();break;
			default :break;
		 } 
	}while(1);
}

void find_name_book()  //按名字查询 
{
	system("cls");
	color(8);
	book head,p;
	int i=11;
	head=ss();
	char name[10];
	toxy(48,8);
	printf("请输入您要查询图书的书名:");
	gets(name);
	toxy(48,10);
	printf("正在查询....");
	Sleep(500);
	p=head;
	toxy(20,5);
	printf("***********************************************图书总览******************************************************");
	toxy(20,8);
	printf("-------------------------------------------------------------------------------------------------------------");
	toxy(20,9);
	printf("登录号        书名        作者名         图书类别         出版单位         出版时间          价格        数量");
	toxy(20,10);
	printf("-------------------------------------------------------------------------------------------------------------");
	while(p!=NULL)
	{
		if(p!=NULL&&strcmp(p->name,name)==0)
		{
			toxy(20,i);
			printf("%s%14s%14s%14s   %14s   %18s         %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num);
			i++;
		}
		p=p->next;
	}
	toxy(45,i);
	printf("按任意键返回!");
	getch();
	find_book();
}

void find_author_book()   //按作者名查询 
{
	system("cls");
	color(8);
	book head,p;
	int i=11;
	head=ss();
	char author[10];
	toxy(48,8);
	printf("请输入您要查询图书的作者名:");
	gets(author);
	toxy(48,10);
	printf("正在查询....");
	Sleep(500);
	p=head;
	toxy(20,5);
	printf("***********************************************图书总览******************************************************");
	toxy(20,8);
	printf("-------------------------------------------------------------------------------------------------------------");
	toxy(20,9);
	printf("登录号        书名        作者名         图书类别         出版单位         出版时间          价格        数量");
	toxy(20,10);
	printf("-------------------------------------------------------------------------------------------------------------");
	while(p!=NULL)
	{
		if(p!=NULL&&strcmp(p->author,author)==0)
		{
			toxy(20,i);
			printf("%s%14s%14s%14s   %14s   %18s         %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num);
			i++;
		}
		p=p->next;
	}
	toxy(45,i);
	printf("按任意键返回!");
	getch();
	find_book();
}

void find_number_book()   //按图书编号查询 
{
	system("cls");
	color(8);
	book head,p;
	int i=11;
	head=ss();
	char number[10];
	toxy(48,8);
	printf("请输入您要查询图书的登录号:");
	gets(number);
	toxy(48,10);
	printf("正在查询....");
	Sleep(500);
	p=head;
	toxy(20,5);
	printf("***********************************************图书总览******************************************************");
	toxy(20,8);
	printf("-------------------------------------------------------------------------------------------------------------");
	toxy(20,9);
	printf("登录号        书名        作者名         图书类别         出版单位         出版时间          价格        数量");
	toxy(20,10);
	printf("-------------------------------------------------------------------------------------------------------------");
	while(p!=NULL)
	{
		if(p!=NULL&&strcmp(p->number,number)==0)
		{
			toxy(20,i);
			printf("%s%14s%14s%14s   %14s   %18s         %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num);
			i++;
		}
		p=p->next;
	}
	toxy(45,i);
	printf("按任意键返回!");
	getch();
	find_book();
}

void find_publish_book()   //按出版商查询 
{
	system("cls");
	color(8);
	book head,p;
	int i=11;
	head=ss();
	char publish[10];
	toxy(48,8);
	printf("请输入您要查询图书的出版社:");
	gets(publish);
	toxy(48,10);
	printf("正在查询....");
	Sleep(500);
	p=head;
	toxy(20,5);
	printf("***********************************************图书总览******************************************************");
	toxy(20,8);
	printf("-------------------------------------------------------------------------------------------------------------");
	toxy(20,9);
	printf("登录号        书名        作者名         图书类别         出版单位         出版时间          价格        数量");
	toxy(20,10);
	printf("-------------------------------------------------------------------------------------------------------------");
	while(p!=NULL)
	{
		if(p!=NULL&&strcmp(p->publish,publish)==0)
		{
			toxy(20,i);
			printf("%s%14s%14s%14s   %14s   %18s         %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num);
			i++;
		}
		p=p->next;
	}
	toxy(45,i);
	printf("按任意键返回!");
	getch();
	find_book();
}

void fuzzy_search()   //模糊查询 
{
	system("cls");
	color(8);
	book head,p;
	int i=11;
	head=ss();
	char information[10];
	toxy(48,8);
	printf("请输入您要查询图书的信息:");
	gets(information);
	toxy(48,10);
	printf("正在查询....");
	Sleep(500);
	p=head;
	toxy(20,5);
	printf("***********************************************图书总览******************************************************");
	toxy(20,8);
	printf("-------------------------------------------------------------------------------------------------------------");
	toxy(20,9);
	printf("登录号        书名        作者名         图书类别         出版单位         出版时间          价格        数量");
	toxy(20,10);
	printf("-------------------------------------------------------------------------------------------------------------");
	while(p!=NULL)
	{
		if(p!=NULL&&(strcmp(p->name,information)==0||strcmp(p->author,information)==0||strcmp(p->number,information)==0||strcmp(p->publish,information)==0))
		{
			toxy(20,i);
			printf("%s%14s%14s%14s   %14s   %18s         %.2f%12d\n",p->number,p->name,p->author,p->type,p->publish,p->time,p->price,p->num);
			i++;
		}
		p=p->next;
	}
	toxy(45,i);
	printf("按任意键返回!");
	getch();
	find_book();
}

void save_book(book p)   //将p中内容写入文件 
{
	FILE *fp;    //文件指针 
	fp=fopen("mybook","ab");   //以追加的方式打开名字为mybook的二进制文件 
	if(fp==NULL)
	{
		printf("cannot open file");
	}
	if(fwrite(p,N,1,fp)!=1)   //将p所指向的一段大小为N的内容存入fp所指向的文件中 
	{
		printf("write error");
	}
	fclose(fp);    //关闭文件  
 } 
 
void over()       //退出软件 
{
	char t;
	toxy(48,11);
	printf("-----------------------");
	toxy(48,12);
	printf("|   您确定要退出吗?  |");
	toxy(48,14);
	printf("| 1.确定     2.取消   |");
	toxy(48,15);
	printf("-----------------------");
	while(1)
	{
		t=getch();         //输入t
		switch(t)
		{
			case '1':
			system("cls");
		    color(6);
			toxy(48,10);
			printf("正在安全退出....");
			Sleep(1000);     //暂停1秒 
			system("cls");
			color(8);
			toxy(48,10);
			printf("已安全退出软件");
			toxy(48,12);
			printf("谢谢使用!");
			toxy(48,14);
			printf("by-by^_^");
			exit(0);  break; //终止程序 
			case '2':
			menu(); break;   //调用函数,进入菜单 
			default :break;
		}
	}
} 
 
main()   //简洁明了的主函数 
{
	menu();//菜单 
}


  • 127
    点赞
  • 457
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值