C语言图书管理系统

图书管理系统

一、系统功能

图书管理系统要求实现图书管理的基本功能,包括图书的录入、删除、查找和导入/导出等。图书的属性包括书号、书名、第一作者、版次、出版社、出版年等信息。

功能要求:

1.创建:创建图书管理系统,用逐条输入的方式;

2.显示:分屏显示图书管理系统中的所有记录;

3.插入:向图书管理系统中插入一条记录;

4.删除:删除一条已经存在的记录项;

5.排序:以编号为依据升序排列所有记录项;

6.查找:根据用户输入的属性值查找符合条件的记录项;

7.导入/导出:可以从文件读入已有的图书管理系统,也可将系统中的图书信息导出到文件;

8.反序:以编号为依据将按序排列的记录项反序排列;

9.删除相同记录。

构建如图菜单系统,程序执行过程为:循环显示主菜单,用户在Give your choice:处输入选项,即按照功能列表输入0~10中的任意一个数字,按回车后,执行相应的功能。功能执行完毕,返回菜单。

二、菜单功能

各菜单项功能如下:

(1)Input Records(建立有序表)

从键盘上一次输入一条图书记录(书号、书名、第一作者、版次、出版社、出版年),以“书号”为序建立有序表。插入一条记录后,显示提示信息:确认是否输入下一条记录,如确认,继续输入,否则,退出输入功能。

(2)Display All Records(显示所有结点记录)

按顺序显示表中所有记录,每屏显示10条记录,按键继续显示下一屏。

(3)Insert a Record(插入一条结点记录)

在以“书号”为序排列的表中插入一条记录,插入后,表仍有序。输出插入成功的信息。

(4)Delete a Record(按“书号”查找,找到后删除该条结点记录)

输入待删除记录的“书号”,显示提示信息,让用户再次确认是否要删除。确认后,将该“书号”的记录删除。

(5) Sort(排序)

以“书号”为升序排列表中的记录。

(6)Query(查找并显示一个结点记录)

输入“书号”,查找该记录,找到后显示记录信息。

(7)Add Records from a Text File(从文件中添加数据到系统中)

用户可事前建立一个文件data.txt,存放多条待加入的记录。提示输入文件的文件名,然后从该文件中一次性加入多条图书记录。文件data.txt格式如下(可以使用英文或拼音表示中文信息):

注意:该文件中第一行的数字表示待添加的记录数,下面每行为图书记录。

(8)Write to a Text File(将系统中记录写入文件)

将图书管理系统中的全部记录写入文件records.txt,要求文件格式和文件data.txt相同。

(9)Reverse List(将表反序)

将表中的所有结点按“书号”反序存放。

(10)Delete the Same Records(删除相同记录)

删除书名、第一作者、版次、出版社、出版年均相同的记录。

(0)Quit(退出图书管理系统程序)

退出图书管理系统程序。

三、实现要求

1. 数据结构

用结构体数组实现图书信息的记录和管理。每个数组元素为一个结构体变量

在主函数中定义结构体数组Bookinfo books[NUM];用作记录存储,也可采用动态链表实现。

2. 各函数功能

以下函数原型说明中出现的函数为本课程设计的基本要求。请不要更改函数原型。

(1)数据输入

int Input(Bookinfo dictList[],int n);

从键盘输入若干条记录,依次存放到结构体数组dictList中,n为数组原有记录数,函数返回最后的记录数。

(2)输出数据

void Diplay(Bookinfo dictList[],int n);

显示所有图书信息,每10本暂停一次,n为数组元素个数。

(3)插入一条结点记录

int Insert(Bookinfo dictList[],int n, Bookinfo *s);

按书号序插入记录s,返回记录个数。

int Insert_a_record(Bookinfo dictList[],int n);

输入待插入的图书书号、书名、作者、版本号、出版社名、出版年等图书信息,调用Insert函数按书号作有序插入,输出插入成功信息,返回记录个数。

(4)删除一条结点记录

int Delete(Bookinfo dictList[],int n, char *book);

删除书名为book的第一条图书记录,返回数组中的记录数。

int Delete_a_record(Bookinfo dictList[],int n);

输入待删除的书名,经确认后调用Delete函数,同时列出同一书名的所有书目,输入待删除书目的书号,提示是否删除,确认后,输出删除成功与否的信息,返回数组中的记录数。

(5)排序

void Sort_by_ISBN(Bookinfo dictList[],int n);

数组按书号升序排列。

(6)查询数据

int Query(Bookinfo dictList[],int n, char *book);

查找并显示书名为book的所有记录,查找成功返回该书名记录个数,否则返回-1。

void Query_a_record(Bookinfo dictList[], int n);

输入待查找的书名,调用Query函数查找该书的记录,输出查找成功与否的信息和该书名的所有记录。

(7)从文件中整批输入数据

int AddfromText(Bookinfo dictList[],int n, char *filename);

从文件filename添加一批记录到数组中,调用Insert()函数作有序插入,返回添加记录后的新记录数。

(8)将记录写到文件

void WriteText(Bookinfo dictList[],int n,char *filename);

将数组中的记录全部写入文件filename中。

(9)将表反序存放

void  Reverse(Bookinfo dictList[]);

按书号反序存放表。

(10)删除雷同记录

int DeleteSame(Bookinfo dictList[], int n);

删除数组中书名、作者、版本号、出版社名、出版年均相同的记录,n为数组原有记录数,函数返回最后的记录数。

(0)退出管理系统

void Quit(Bookinfo dictList[]);

退出系统时,释放动态存储空间。

其他函数

void Display_Main_Menu();

显示主菜单。

实验过程中可以根据需要适当增加函数,以使程序算法更清晰明了。

其中部分函数是我补充添加的(具体看代码标注)。

#include
#include
#include
typedef struct          //定义数据类型
{
	char ISBN[10];      //书号
	char book[30];      //书名
	char author[20];    //作者
	int edition;        //版本号
	char press[50];     //出版社名
	int year;           //年份
}Bookinfo;

int Input(Bookinfo dictList[],int n)       // 从键盘输入若干条记录,依次存放到结构体数组dictList中,返回最后的记录数
{
	int m,i;                               //m:要输入的本数,i循环控制量

	printf("请输入要输入图书的本数\n");
	scanf("%d",&m);
	getchar();
	printf("\n");
	for(i=0;i0) p=j;                                                     //当左边的大,则保持原来排序
		}
		if(p!=i)                                                              //当右边的大,则进行替换
		{
			ls=dictList[i];
			dictList[i]=dictList[p];
			dictList[p]=ls; 
		}
	}
	printf("排序完成\n");
}

void Sort_by_name(Bookinfo dictList[],int n)      //数组按书名升序排列,同书号排序的逻辑
{
		int i,j,p,bj;
		Bookinfo ls;

	for(i=0;i0) p=j;
		}
		if(p!=i)
		{
			ls=dictList[i];
			dictList[i]=dictList[p];
			dictList[p]=ls;
		}
	}
	printf("排序完成\n");
}

int Insert(Bookinfo dictList[],int n,Bookinfo *s) //有序插入
{
	int i,j,p;

	for(i=0;i<=n;i++)
	{
		p=strcmp(dictList[i].book,(*s).book);                    //将插入数据的放到第i个
		if(i=n)                                                  //如果插入的在最后,则直接插入
		{
			dictList[i]=*s;
			i=n+1;
			j=n+1;
		}
		if(p>0)                               
		{
			for(j=n;j>i;j--) dictList[j]=dictList[j-1];          //如果插入的在中间,则将插入点之后的数据向右挪动一个位置
			dictList[i]=*s;
			i=n+1;
		}
        
	}
	return(n+1);
}

int Insert_a_record(Bookinfo dictList[ ],int n)  //有序插入
{
	Bookinfo mmp,*s;
	s=&mmp;
	getchar();
	printf("书号:");
	gets(mmp.ISBN);
	printf("书名:");
	gets(mmp.book);
	printf("作者:");
	gets(mmp.author);
	printf("版本号:");
	scanf("%d",&mmp.edition);
	getchar();
	printf("出版社名:");
	gets(mmp.press);
	printf("出版年份:");
	scanf("%d",&mmp.year);
	getchar();
	n=Insert(dictList,n,s);
	Sort_by_ISBN(dictList,n);
	printf("插入成功"); 
	return n;
}



int Query(Bookinfo dictList[],int n,Bookinfo *book)       //查找并显示书名为book的所有记录,查找成功返回该书记录个数,失败则返回0
{
	int i,p,t,m=0;

	for(i=0;i0)
		printf("找到了%d本名为%s的书!",a,cz.book);
	else
		printf("没有找到名称为%s的书",cz.book);
}

void WritetoText(Bookinfo dictList[],int n,char *filename)         //将记录写到文件里
{
	int i;
	FILE *fp;

	fp=fopen(filename,"w");
	if(fp==NULL)
	{
		printf("不能打开文件\n");
		exit(1);                                                  //没打开成功就exit
	}
	fprintf(fp,"%d\n",n);
	//fprintf(fp,"书号          书名    作者     版本号     出版社      出版年份\n");
	//fprintf(fp,"--------------------------------------------------------------\n");
	for(i=0;iauthor,b.author);                                         //这个是将后面的赋给前面的a
strcpy(a->book,b.book);
a->edition = b.edition;
strcpy(a->ISBN,b.ISBN);
strcpy(a->press,b.press);
a->year = b.year;
}

int SameBook(Bookinfo a, Bookinfo b)                                        //这个是判断是否为重复书籍的函数,删除同书的函数循环调用此函数
{
	return !strcmp(a.author, b.author)                                      //如果找到了作者、书名、出版社、出版编号、日期相同的书,则该书为相同书
		&& !strcmp(a.book, b.book)
		&& (a.edition == b.edition)
		&& !strcmp(a.press, b.press)
		&& (a.year == b.year);
}

int DeleteSame(Bookinfo dictList[], int n)                                            //删除相同的书籍
{
	int i, j;
	int newLen = n;
	for (i = 0; i < newLen - 1; i++) 
	{

		for (j = i + 1; j < newLen; j++) 
		{
			if (SameBook(dictList[i], dictList[j]))
			{
				for (int k = j; k < n - 1; k++)
				{
					dictList[k] = dictList[k + 1];                      //向左挪动一个位置                            
				}
				--newLen,--j;
			}

		}
	}
	printf("已删除相同的书籍数据,返回记录数为: %d", newLen);
	return newLen;
}

int menu_select()                                   //我设计的菜单
{
	int sn;
	system("cls");                      //清屏
	 printf("                                           The Book Manangement Systemm                   \n");
	printf("                     |--------------------------------------------------------------------|\n");
	printf("                     |                              Menu                                  |\n");
	printf("                     |--------------------------------------------------------------------|\n");
	printf("                     |                     1 Input Records                                |\n");
	printf("                     |                     2 Display All Records                          |\n");
	printf("                     |                     3 Insert a Record                              |\n");
	printf("                     |                     4 Delete a Record                              |\n");
	printf("                     |                     5 Sort                                         |\n");
	printf("                     |                     6 Query                                        |\n");
	printf("                     |                     7 Add Records from a Text File                 |\n");
	printf("                     |                     8 Write to a Text File                         |\n");
	printf("                     |                     9 Correct a record                             |\n");
	printf("                     |                     10 Search author                               |\n");
	printf("                     |                     11 Reverse                                     |\n");
	printf("                     |                     12 Delete The Same Records                     |\n");
	printf("                     |                     13 Sort by name                                |\n");
	printf("                     |                     0 Quit                                         |\n");
	printf("                     |--------------------------------------------------------------------|\n");
	printf("                                         Please enter your choice(0~13):   ");

	for(; ;)                                 //用死循环判断用户是否输入的是13的数字,如果输入14则提示错误重输
	{
		scanf("%d",&sn);
		if(sn<0||sn>13)
			printf("\n输入错误,重选0~13:");
		else
			break;
	}
	return sn;
}

void Correct(Bookinfo dictList[],int n)   //显示所有记录,并对其中某一个进行修改
{
	char xg[30];
	int i,bj,m;
	
	Display(dictList,n);
	system("pause");
	printf("请输入所要修改图书记录的书号:\n");
	scanf("%s",xg);
	for(i=0;i6)
			printf("\n输入错误,重选1~6:");
		else
			break;
		}
	}
	
}
}

void search_author(Bookinfo dictList[],int n)                         //查询作者在该管理系统有多少本书
{
	int i,t,p,count=0;
	char sm[30],*author; 
	printf("Input author_name\n");
	getchar();
	gets(sm);
	author=&sm[0];
	for(i=0;i-1.5f; y-=0.1f)
    {
        for(x=-1.5f; x<1.5f; x+=0.05f)
        {
            a = x*x+y*y-1;
            char c = a*a*a-x*x*y*y*y<=0.0f?'*':' '; 
            putchar(c);  
        }
        printf("\n");
   }
   return 0;
}
int main()
{
	system("color B5");                                 //将菜单变为浅紫色
	int n=0;
	char i;
	Bookinfo dictList[50];
	Bookinfo favorites[50];
	for(;;)
	{
		switch(menu_select())                    //老师给的交互系统
		{
		case 1:
			{
				n=Input(dictList,n);
				system("pause");
				break;
			}
		case 2:
			{
				Display(dictList,n);
				system("pause");
				break;
			}
		case 3:
			{
				n=Insert_a_record(dictList,n);
				system("pause");
				break;
			}
		case 4:
			{
				n=Delete_a_record(dictList,n);
				system("pause");
				break;
			}
		case 5:
			{
				
				Sort_by_ISBN(dictList,n);
				system("pause");
				break;
			}
		case 6:
			{
				Query_a_record(dictList,n);
				system("pause");
				break;
			}
		case 7:
			{
				char *filename,s[30];
				printf("请输入文件名\n");
				scanf("%s",s);
				filename=s;
				n=AddfromText(dictList,n,filename);
				system("pause");
				break;
			}
		case 8:
			{
				char *filename,s[30];
				printf("请输入文件名\n");
				scanf("%s",s);
				filename=s;
				WritetoText(dictList,n,filename);
				system("pause");
				break;
			}
		case 9:
			{
				Correct(dictList,n);
				system("pause");
				break;
			}
		case 10:
			{
				search_author(dictList,n);
				system("pause");
				break;
			}
		case 11:
			{
				Reverse(dictList,n);
				system("pause");
				break;
			}
		case 12:
			{
				n = DeleteSame(dictList,n);
				system("pause");
				break;
			}
		case 13:
			{
				Sort_by_name(dictList,n);
				system("pause");
				break;
			}
		case 0:
			{
				play();
				printf("                         Goodbye!");
				printf("\n\n\n");
				system("pause");
				exit(0);
			}
		}
	}
}

你可能感兴趣的:(图书管理系统,学习,c语言,开发语言)