当前位置 博文首页 > yumoz:[C基础修炼] [C课程设计]C语言课程设计之图书管理系统

    yumoz:[C基础修炼] [C课程设计]C语言课程设计之图书管理系统

    作者:[db:作者] 时间:2021-07-29 22:03

    #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();//删除 
     	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;
    					default :break;
    				}
    			}
    		}
    		else printf("登录名错误!请重新输入:\n");main();//exit(1);
    	return 0;
    }
    
    char menu()//显示菜单界面并
    {
    	char n;
    	system("cls");
    	system ("color 1D");
    	printf("\t\t****************欢迎使用图书管理系统**************\n");
    	printf("\t\t* 丨              1.输入图书信息                丨*\n");
    	printf("\t\t* 丨              2.显示图书信息                丨*\n");
    	printf("\t\t* 丨              3.按书名查找图书信息          丨*\n");
    	printf("\t\t* 丨              4.按作者查找图书信息          丨*\n");
    	printf("\t\t* 丨              5.修改图书信息                丨*\n");
    	printf("\t\t* 丨              6.删除图书记录                丨*\n");
    	printf("\t\t* 丨              7.退出图书管理系统            丨*\n");
    	printf("\t\t************************************************\n");
    	printf("  请选择菜单命令: ");
    	while(1)
    	{
    		do
    		{
    			fflush(stdin);//清除缓存
    			printf("\n输入菜单(1--7):"); 
    			scanf("%c",&n); 
    		} while(n <'0' || n >'8'); //不满足条件继续重新输入,满足条件跳出循环结构程序流程向下     
    		return n;//返回值返回给主函数,用以选择功能模块
    	}
    }  
    void input()//录入 
    {
    	char ch;
    	fp = fopen("book.txt","ab");//以追加方式打开文件,如果文件不存在则建立该文件
    	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("---------------------------------------------------------");
    		getchar();
    		fwrite(&book,sizeof(book),1,fp);
    		printf("\n是否继续输入新的图书信息?\n");
    		printf("请选择(Y/N):");
    		ch=getchar();
    	}while(ch == 'y' || ch == 'Y');
    	getchar();
    	printf("是否返回主菜单?按回车键返回");
    	getchar();
    	fclose(fp);//关闭文件防止数据丢失
    }
    void list()//显示 
    {
    
    	fp = fopen("book.txt","r");//以只读方式(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);//清除缓存
    }
    

    编译器为dev C++ ,第一次发多有不足,请指正。

    cs