用C语言编写简易图书管理系统

1,查询功能

2,排序功能

3,统计总价格(并存入另一个文件夹中)

4,图书修改

5,图书借阅功能

在程序开始之前,需创建一个txt文件夹写入信息,我的txt文件保存在D盘的根目录下,所以books函数是D:…
如图
这个是这个程序需要的txt文件,如果不需要可以自己创建
详细设计:
程序中的主要调用函数功能在menu()函数的switch中,main函数只需调用menu()函数,在menu()函数中利用switch调用各个函数中的功能,在最外层添加do-while(1)死循环,在do-while上面先调用books()函数,将txt文件存入结构体变量中,然后在do-while中选择自己所需要的功能调用函数。在各个函数结尾都存在调用menu函数或者调用自己,若想结束程序,则必须先返回主菜单选择0确定结束程序即可。

功能要求:
1.将txt文件中的内容存入结构体数组中时,第一步应该用FILE *fp=fopen(“txt文件中的地址,需要添加后缀.txt”,”r”);可以适当加一个if语句判断fp是否等于NULL。先存入第一行,用一个单独的字符串数组存,然后可以用for。
循环或者while将后面的的信息依次一行行存入结构体中,并要在存储完了以后加上文件关闭fcolse()。
2.在主函数中调用菜单函数,利用菜单函数选项加入switch调用各函数的功能,并加入死循环,用退出选项调用函数退出。
3.图书查询功能,按书名查找,先用for循环判断这个书是否在已经存入的结构体数组中,并引入一个判断条件,如果实在数组中,则令那个int值为一个特定值,则就可以在函数外用if—else语句写存在后与不存在时的操作,当存在时,则打印第一行的标题与对应的图书,不存在时则提示无此书。在这个函数的后面还可以加入判断条件,是否继续查询,是的话就调用这个查询功能函数,不是则调用主菜单返回。
4.打印全部图书直接用for循环打印即可
5.排序图书的数量,用冒泡排序法,互换了数量的位置后将与其对应的编号图书名等也互换位置,字符串用strcpy复制,数值用赋值
6.重新定义一个总价数组,将将总价存入数组中,打开另一个文件,”w”只写,然后在第一行加入总价并存入文件中,用for循环将下面的信息存入另一个文件中。
7.先用图书名或者作家名查找是否存在此图书,如果存在则显示该图书的信息,然后提示你所要修改的选项,利用switch语句修改对应的选项,字符串用strcpy,数值用赋值,修改完后将文件打开重新存入文件夹中,然后在函数结尾提示是否继续修改图书操作即可。
8.借阅图书时,先查找是否有此图书,如果有判断其图书的数量是否大于0,大于0则将其数量减1,否则提示库存不足,查询最后一次还没有找到此书则提示无此书。
9.退出程序时用exit(0).

第一次写博客,不喜勿喷!!!

全部代码

#include  "stdio.h"
#include  "stdlib.h"              //system("cls")清空上面的内容用到的头文件 
#include  "string.h"
#define N 100
typedef struct book                //用了typedef以后定义结构体时候不用struct Book a[N],直接用Book a[N]; 
{
	int num;	            //编号
	char type[20];	     //分类 
	char name[20];        //书名
	char author[20];      //作者
	char press[30];     //出版社
	int quantity;         //数量 
	double price;          //价格
	char nume[7];            //txt文件中的第一行 
}Book;

Book a[N];

void menu();     //菜单
void books();    //将txt文件存入结构体 
void refer();    //1.查询
void show();     //2.打印全部图书
void amount();    //3.查看图书数量
void pr();         //4.统计价格
void alter();       //5.图书修改
void borrow();      //6.借阅图书 
void over();      //7.退出
 
void menu()										  //@@@@@@@@@@@@@@@@@@@@菜单 
{
	books();
	do
	{
		int n;
		printf(" __________________________________\n"); 
		printf("|******---------------------******|\n");
		printf("|      欢迎进入图书管理系统       |\n"); 
		printf("|                                 |\n");
		printf("|                                 |\n");
		printf("|                                 |\n");
		printf("|                                 |\n");
		printf("|                                 |\n");
		printf("|  *       1.图书查询          *  |\n");
		printf("|  *       2.打印全部图书      *  |\n");
		printf("|  *       3.图书数量排序      *  |\n");     //按数量排序 
		printf("|  *       4.统计价格          *  |\n");   //统计每本书的总价及所有图书的总价
		printf("|  *       5.图书修改          *  |\n");
		printf("|  *       6.借阅图书          *  |\n");
		printf("|  *       0.退出              *  |\n");
		printf("|                                 |\n");
		printf("|                                 |\n");
		printf("|                                 |\n");
		printf("|                                 |\n");
		printf("|******---------------------******|\n");
		printf("|_________________________________|\n");
		printf("                 注:输入对应序号!\n"); 
		scanf("%d",&n);
		fflush(stdin);
		switch( n )
		{
			case 1 : refer();   break;
			case 2 : show();    break;
			case 3 : amount();  break;
			case 4 : pr();      break;
			case 5 : alter();   break;
			case 6 : borrow();  break;
			case 0 : over();    break;
			default :break;
		}
	}while(1); 
}
void books()                                      //@@@@@@@@@@@@@@@@@@@@@@@将txt文件存入结构体 
{
	int n = 0;
    FILE *fr = fopen("D:\JK0627.txt","r+"); 
    if(fr == NULL) {
        printf("打开文件出错。\n");
        return 1;
    }
                               //存入第一行
    fscanf(fr,"%s\t%s\t%s\t%s\t%s\t%s\t%s",&a[0].nume,&a[1].nume,&a[2].nume,&a[3].nume,&a[4].nume,&a[5].nume,&a[6].nume);                  
	while(!feof(fr)) {                           //      feof(fr)有两个返回值:   如果遇到文件结束,函数feof(fr)的值为非零值,否则为0
	                     	//存入1~10行       整数类的必须加入地址符,字符串可要可不要 
        fscanf(fr,"%d\t%s\t%s\t%s\t%s\t%d\t%lf\n",&a[n].num,&a[n].type,&a[n].name,&a[n].author,&a[n].press,&a[n].quantity,&a[n].price);
        n++;
    }
    fclose(fr);
}

void refer()                                     //@@@@@@@@@@@@@@@@@@@@@@@ 图书查询 
{
	int i,n,m=0,p;
	char nam[30];
	system("cls");
	printf("请输入您要查询的书名:");
	scanf("%s",&nam);
	fflush(stdin);
	for( i=0; i < 10; i++ )
	{
		if( strcmp(nam,a[i].name) == 0 ){              
			m = 1;
			p = i;                   //       p值为了记录i为多少,方便后面使用 
			break;
		}
	}
	if( m = 1) {
		system("cls");
		printf("*************************************************图书总览***********************************************\n");
		printf("--------------------------------------------------------------------------------------------------------\n");
                         //         打印第一行
		printf("%s\t%s\t\t%s\t\t%s\t\t%s\t\t\t%s\t\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);   
                          //         打印特定行 
		printf("%d\t%-10s\t%s\t%-10s\t%-20s\t%d\t\t%.2lf\n",a[p].num,a[p].type,a[p].name,a[p].author,a[p].press,a[p].quantity,a[p].price);    
		printf("--------------------------------------------------------------------------------------------------------\n");
	}else {
			printf("馆内无此书!");
	}
	printf("\n\n-----------------------\n");
	printf("|   是否继续查询?    |\n");
	printf("| 1.是     2.否   |\n");
	printf("-----------------------\n");
	scanf("%d",&n); 
	if( n==1 ){
		refer();
	}
	else if( n==2 ){
      system("cls");
		menu();
	}
}

void show()                                  //@@@@@@@@@@@@@@@@@@@ 打印全部图书
{
	system("cls");
	int i;
	char n;
	printf("*************************************************图书总览***********************************************\n");
	printf("--------------------------------------------------------------------------------------------------------\n");
	printf("%s\t%s\t\t%s\t\t%s\t\t%s\t\t\t%s\t\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
	for( i=0; i<10; i++ )
	{
		printf("%d\t%-10s\t%s\t%-10s\t%-20s\t%d\t\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);
	}
	printf("--------------------------------------------------------------------------------------------------------\n");
	printf("\n按任意字符回车返回主菜单!\n");
	fflush(stdin);
	n=getchar();
	system("cls");
	menu();
}

void amount()                                     //@@@@@@@@@@@@@@@查看图书数量
{
	int i,j;
	char n;
	for( i=0; i<10-1; i++ )
	{
		for( j=0; j<10-1-i; j++ )
		{
			if( a[j].quantity > a[j+1].quantity )                                      //冒泡排序法 
			{
				int m;
				double p;
				char b[30];
				m = a[j].quantity; a[j].quantity = a[j+1].quantity; a[j+1].quantity = m;		//当数量互换了位置以后,其对应的价格以及分类也要对应互换位置 
				m = a[j].num; a[j].num = a[j+1].num; a[j+1].num = m;
				p = a[j].price; a[j].price = a[j+1].price; a[j+1].price = p;
				strcpy(b,a[j].type); strcpy(a[j].type,a[j+1].type); strcpy(a[j+1].type,b);
				strcpy(b,a[j].name); strcpy(a[j].name,a[j+1].name); strcpy(a[j+1].name,b);
				strcpy(b,a[j].author); strcpy(a[j].author,a[j+1].author); strcpy(a[j+1].author,b);
				strcpy(b,a[j].press); strcpy(a[j].press,a[j+1].press); strcpy(a[j+1].press,b);
			}
		}
	}
	system("cls");								//将重新排序的结果打印 
	printf("*************************************************图书总览***********************************************\n");
	printf("--------------------------------------------------------------------------------------------------------\n");
	printf("%s\t%s\t\t%s\t\t%s\t\t%s\t\t\t%s\t\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
	for( i=0; i<10; i++ )
	{
		printf("%d\t%-10s\t%s\t%-10s\t%-20s\t%d\t\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);
	}
	printf("--------------------------------------------------------------------------------------------------------\n");
	printf("\n按任意字符回车返回主菜单!\n");
	fflush(stdin);
	n=getchar();
	system("cls");
	menu();
}

void pr()                                       //  @@@@@@@@@@@@@@@@@@@统计价格
{
	int i;
	char n;
	double b[10],sum=0.0;
	for( i=0; i<10; i++ )
	{
		b[i] = a[i].price*a[i].quantity;                          //重新定义的一个b数组   将图书的数量与对应的价格相乘 
		sum = sum + b[i];
	}
	FILE *fp = fopen("D:\ZJ0627.txt","w");                                  //将总价格一起写入另一个文件夹中 
	fprintf(fp,"%s\t%s\t%s\t\t%s\t\t%s\t\t\t%s\t%s\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume,"总价");
	for( i=0; i<10; i++ ){
	                     	//存入1~10行
        fprintf(fp,"%d\t%s\t%-20s\t%s\t\t%-30s\t%d\t%.2lf\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price,b[i]);
    }
    fprintf(fp,"\t\t\t\t\t\t\t\t\t\t%s\t%.2lf","总价",sum);       //最后一行写入总价    
    if( fp != NULL )
    {
    	system("cls");
    	printf("恭喜你,存入文件夹成功!\n");
	}
	fclose(fp);
	printf("\n按任意字符回车返回主菜单!\n");
	fflush(stdin);
	n=getchar();
	system("cls");
	menu();
}

void alter()                                      // @@@@@@@@@@@@@@@@@@@图书修改
{
	system("cls");
	char b[20],c[20];
	int i,n,m;
	double p;
	printf("输入你要修改的图书名或作家名:");
	fflush(stdin);
	scanf("%s",&b);
	for( i=0; i<10; i++ )
	{
		if( strcmp( b , a[i].name ) == 0 || strcmp( b , a[i].author) == 0 )
		{
			system("cls"); 
			printf("*************************************************图书总览***********************************************\n");
			printf("--------------------------------------------------------------------------------------------------------\n");
	                    //         打印第一行
			printf("%s\t%s\t\t%s\t\t%s\t\t%s\t\t\t%s\t\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);   
	               //         打印1~10行 
			printf("%d\t%-10s\t%s\t%-10s\t%-20s\t%d\t\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);    
			printf("--------------------------------------------------------------------------------------------------------\n");
			printf("\n注:编号(0),分类(1),书名(2),作者(3),出版社(4),数量(5),单价(6)\n输入您要修改的选项的序号:");
			fflush(stdin);
			scanf("%d",&n);
			switch( n )
			{
				system("cls");
				case 0:printf("输入你要修改后的[%s]:",a[0].nume);fflush(stdin);scanf("%d",&m);a[i].num = m;     //   整数赋值 
				if( a[i].num == m ){	printf("修改成功!\n");	}	break;
				case 1:printf("输入你要修改后的[%s]:",a[1].nume);fflush(stdin);scanf("%s",&c);strcpy(a[i].type,c);   //字符拷贝strcpy 
				if( strcmp(a[i].type,c) == 0 ){	printf("修改成功!\n");	}	break;
				case 2:printf("输入你要修改后的[%s]:",a[2].nume);fflush(stdin);scanf("%s",&c);strcpy(a[i].name,c);
				if( strcmp(a[i].name,c) == 0 ){	printf("修改成功!\n");}	break;
				case 3:printf("输入你要修改后的[%s]:",a[3].nume);fflush(stdin);scanf("%s",&c);strcpy(a[i].author,c);
				if( strcmp(a[i].author,c) == 0 ){	printf("修改成功!\n");}	break;
				case 4:printf("输入你要修改后的[%s]:",a[4].nume);fflush(stdin);scanf("%s",&c);strcpy(a[i].press,c);
				if( strcmp(a[i].press,c) == 0 ){	printf("修改成功!\n");}	break;
				case 5:printf("输入你要修改后的[%s]:",a[5].nume);fflush(stdin);scanf("%d",&m);a[i].quantity = m;
				if( a[i].quantity == m ){	printf("修改成功!\n");} 	break;
				case 6:printf("输入你要修改后的[%s]:",a[6].nume);fflush(stdin);scanf("%lf",&p);a[i].price = p;
				if( a[i].price==p  ){	printf("修改成功!\n");}	break;
				default :printf("修改失败!\n");	break;
			}
			FILE *f = fopen("D:\JK0627.txt","w");                   //  修改成功后重新存入文件中 
			fprintf(f,"%s\t%s\t%s\t\t%s\t\t%s\t\t\t%s\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
			for( i=0; i<10; i++ )
			{
				fprintf(f,"%d\t%s\t%-20s\t%s\t\t%-30s\t%d\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);
			}
			if( f != NULL )
		    {
		    	printf("存入文件夹成功!\n");
			}
			else
			{
				printf("存入文件夹失败!\n");
			}
			fclose(f);
			printf("-----------------------\n");
			printf("|      继续修改?     |\n");
			printf("| 1.确定     2.取消   |\n");
			printf("-----------------------\n");
			fflush(stdin);
			scanf("%d",&n);
			if( n==1 ){
				alter();
			}else{
				system("cls");
				menu();
			}
		}else if( i == 9){
			printf("你所要修改的图书不在书库中,请重新输入!\n");
			printf("-----------------------\n");
			printf("|      继续修改?     |\n");
			printf("| 1.确定     2.取消   |\n");
			printf("-----------------------\n");
			fflush(stdin);
			scanf("%d",&n);
			if( n==1 ){
				alter();
			}else{
				system("cls");
				menu();
			}
		}
	}
}

void borrow()                                 //@@@@@@@@@@@@@@@@@借阅图书 
{
	system("cls");
	int i,n;
	char b[20];
	printf("输入你要借阅的书籍:");
	scanf("%s",&b);
	for( i=0; i<10; i++ )
	{
		if( strcmp( b , a[i].name ) == 0  )          //判断是否有对应相等 
		{
			if( a[i].quantity > 0 )
			{
				a[i].quantity = a[i].quantity - 1;            //   如果数量大一0 数量减一 
				printf("\n\n借出成功!");
				FILE *f = fopen("D:\JK0627.txt","w");                    //减一后再将结果重新存入文件 
				fprintf(f,"%s\t%s\t%s\t\t%s\t\t%s\t\t\t%s\t%s\n",a[0].nume,a[1].nume,a[2].nume,a[3].nume,a[4].nume,a[5].nume,a[6].nume);
				for( i=0; i<10; i++ )
				{
					fprintf(f,"%d\t%s\t%-20s\t%s\t\t%-30s\t%d\t%.2lf\n",a[i].num,a[i].type,a[i].name,a[i].author,a[i].press,a[i].quantity,a[i].price);
				}
				if( f != NULL )
			    {
			    	printf("存入文件夹成功!\n");
				}
				else
				{
					printf("存入文件夹失败!");
				}
				fclose(f);
				printf("-----------------------\n");
				printf("|      继续借阅?     |\n");
				printf("| 1.确定     2.取消   |\n");
				printf("-----------------------\n");
				fflush(stdin);
				scanf("%d",&n);
				if( n==1 ){
					borrow();
				}else{
					system("cls");
					menu();
				}
			}else{
				printf("次书库存不足!\n");
				printf("-----------------------\n");
				printf("|      继续借阅?     |\n");
				printf("| 1.确定     2.取消   |\n");
				printf("-----------------------\n");
				fflush(stdin);
				scanf("%d",&n);
				if( n==1 ){
					borrow();
				}else{
					system("cls");
					menu();
				}
			}
		}else if( i == 9 ){
			printf("书库中无此书!\n");
			printf("-----------------------\n");
			printf("|      继续借阅?     |\n");
			printf("| 1.确定     2.取消   |\n");
			printf("-----------------------\n");
			fflush(stdin);
			scanf("%d",&n);
			if( n==1 ){
				borrow();
			}else{
				system("cls");
				menu();
			}
		}
	}
}

void over()                                //@@@@@@@@@@@@@@@@@@退出程序 
{
	int n;
	system("cls");
	printf("-----------------------\n");
	printf("|   您确定要退出吗?  |\n");
	printf("| 1.确定     2.取消   |\n");
	printf("-----------------------\n");
	scanf("%d",&n);
	if( n==1 ){
		exit(0);                  //结束程序 
	}
	else if( n==2 ){
		system("cls");
		menu();               // 返回菜单 
	}
} 
int main() 
{
    menu();
	return 0;                                                                                                            
}

运行结果:
选择自己所需要的功能即可

  • 43
    点赞
  • 190
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小凯77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值