⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data_operate.cpp

📁 图书管理系统,DOS界面,输入书籍保存信息
💻 CPP
字号:
#include "stdafx.h"
#include "Data_Operate.h"
#include "DataDefine.h"
#include "OtherFunc.h"
#include <string.h>
#include <conio.h>

///////////////////////////////////////////////////////////////////////
//
// 函数名       : GetDataPoint
// 功能描述     : 加载文件并填充data结构
// 参数         : BookData data[MAXSIZE]
// 返回值       : bool 表示出是否成功
//
///////////////////////////////////////////////////////////////////////
bool GetDataPoint(BookData data[MAXSIZE])
{
	FILE *fp;
	if((fp=fopen("data","rb"))==NULL)//只读加载
	{

		return false;//失败
	}
	int i;
	for(i=0;i<MAXSIZE;i++)//填充各个数据数组
	{
		fseek(fp,i*sizeof(BookData),0);//数组号*bookdata结构字长=新的元素所在偏移
		if(!fread(&data[i],sizeof(BookData),1,fp))//每次读入数据长度为bookdata结构字长
		{
			fclose(fp);//关闭
			return false;
		}
	}
	return true;
}

///////////////////////////////////////////////////////////////////////
//
// 函数名       : InsertData
// 功能描述     : 插入数据
// 返回值       : bool 当没有存储空间时失败
//
///////////////////////////////////////////////////////////////////////
bool InsertData()
{
	FILE *fp;

	BookData data[MAXSIZE];
	FreeData(data);//free for safe
	GetDataPoint(data);
	unsigned int uFree=MAXSIZE+1; //初使总是大于最大储存,做为一个辨别数据是否已满条件
	for(int i=0;i<MAXSIZE;i++)
	{
		if(!data[i].uBokno)//找空余的数组元素,当书号为0时认为是一个空元素
		{
			uFree=i;
			break;
		}
	}
	if(uFree>MAXSIZE)//uFree=MaxSize+1>MaxSize说明没有空元素了
	{
		gotoxy(0,18);//定位显示
		printf("没有存储空间了,请先删除!\nPress any key to continue...");
		getche();
		return false;
	}
	//书号      书名      作者      出版社    单价
	//12345678901234567890123456789012345678901234567890
	//0         1         2         3         4
	gotoxy(0,18);
	printf("输入书号:");
	scanf("%d",&data[uFree].uBokno);
	getchar();
		
	printf("输入书名:");
	scanf("%s",&data[uFree].szBookName);
	getchar();
	
	printf("输入作者:");
	scanf("%s",&data[uFree].szAuthor);
	getchar();
	
	printf("输入出版社:");
	scanf("%s",&data[uFree].szPublic);
	getchar();
	
	printf("输入单价:");
	scanf("%f",&data[uFree].uPrize);
	getchar();
	
	printf("输入数量:");
	scanf("%d",&data[uFree].uQuantity);
	getchar();
	
	fp=fopen("data","w+");//改写模式

	fwrite(data,MAXSIZE*sizeof(BookData),1,fp);//写的长度为全部data元素
	fclose(fp);
	return true;
}


///////////////////////////////////////////////////////////////////////
//
// 函数名       : DeleteData
// 功能描述     : 删除数据
// 参数         : BookData data[MAXSIZE]
// 返回值       : void 
//
///////////////////////////////////////////////////////////////////////
void DeleteData(BookData data[MAXSIZE])
{
	FILE *fp;
	unsigned int iBuf;
	gotoxy(0,18);
	printf("请输入你要删除的书号:");
	scanf("%d",&iBuf);
	getchar();
	for(int i=0;i<MAXSIZE;i++)
	{
		if(data[i].uBokno==iBuf)//找匹配元素
		{
			data[i].uBokno=0;//书号清零成为一个空元素
			
			fp=fopen("data","w+");
			fwrite(data,MAXSIZE*sizeof(BookData),1,fp);
			fclose(fp);
			return;
		}
	}
	printf("没有找到书号为%d的数据,删除失败!",iBuf);
	getche();
	
}


///////////////////////////////////////////////////////////////////////
//
// 函数名       : EditData
// 功能描述     : 编辑数据
// 参数         : BookData data[MAXSIZE]
// 返回值       : void 
//
///////////////////////////////////////////////////////////////////////
void EditData(BookData data[MAXSIZE])
{
	FILE *fp;
	unsigned int iBuf;
	gotoxy(0,18);
	printf("请输入你要编辑的书号:");
	scanf("%d",&iBuf);
	getchar();
	for(int i=0;i<MAXSIZE;i++)//一个个元素找到所在数组位置
	{
		if(data[i].uBokno==iBuf)//找到了
		{
			gotoxy(0,19);
			
			printf("输入书名:");
			scanf("%s",&data[i].szBookName);
			getchar();
						
			printf("输入作者:");
			scanf("%s",&data[i].szAuthor);
			getchar();
						
			printf("输入出版社:");
			scanf("%s",&data[i].szPublic);
			getchar();
						
			printf("输入单价:");
			scanf("%f",&data[i].uPrize);
			getchar();

			printf("输入数量:");
			scanf("%d",&data[i].uQuantity);
			getchar();

			fp=fopen("data","w+");
			fwrite(data,MAXSIZE*sizeof(BookData),1,fp);//写
			fclose(fp);
			return;
		}
	}
	printf("没有找到书号为%d的数据,编辑失败!",iBuf);
}


///////////////////////////////////////////////////////////////////////
//
// 函数名       : OrderData
// 功能描述     : 排序
// 参数         : BookData data[MAXSIZE]
// 返回值       : void 
//
///////////////////////////////////////////////////////////////////////
void OrderData(BookData data[MAXSIZE])
{
	
	gotoxy(0,18);
	printf("1.书号 2.书名 3.作者 4.出版社 5.单价 6.数量\n以哪个关键字进行排序?");
	BookData data2[MAXSIZE];//新的排序后的数组
	int i,j;//循环变量
	unsigned int iLess=0,k;//暂存较小的项-整型
	char szLess[12]="";//暂存较小的项-字符
	float fLess=0;//暂存较小的项-浮点
	FILE *fp;
	bool IsUseNewData=true;//是不是真的进行了排序,作为最后是不是要将新数组写入文件的标准
	switch(getche())
	{
		case 0x31:
	
			for(i=0;i<MAXSIZE;i++)//填充新数组的循环
			{
				for(j=0;j<MAXSIZE;j++)//在旧数组中寻找的循环
				{
					if(data[j].uBokno)//是不是一个有效元素
					{
						if(iLess>=data[j].uBokno||iLess==0)//发现数组中比iLess还要小的项或是第一次填充iLess
						{
							iLess=data[j].uBokno;//复制过去
							k=j;//记住是旧数组中第几项
						}
					}
				}
				memcpy(&data2[i],&data[k],sizeof(BookData));//内存copy将旧数组中某个元素复制到新元素中
				iLess=0;//清零重新来
				data[k].uBokno=0;//将旧数组元素无效
			}
			break;
		case 0x32:
			
			for(i=0;i<MAXSIZE;i++)
			{
				for(j=0;j<MAXSIZE;j++)
				{
					if(data[j].uBokno)
					{
						if(strcmp(szLess,data[j].szBookName)>=0||szLess[0]=='\0')//同前,strcmp可比较字符大小
						{
							strcpy(szLess,data[j].szBookName);
							k=j;
						}
					}
				}
				memcpy(&data2[i],&data[k],sizeof(BookData));
				szLess[0]='\0';
				data[k].uBokno=0;
			}
			break;
		case 0x33:
			for(i=0;i<MAXSIZE;i++)
			{
				for(j=0;j<MAXSIZE;j++)
				{
					if(data[j].uBokno)
					{
						if(strcmp(szLess,data[j].szAuthor)>=0||szLess[0]=='\0')
						{
							strcpy(szLess,data[j].szAuthor);
							k=j;
						}
					}
				}
				memcpy(&data2[i],&data[k],sizeof(BookData));
				szLess[0]='\0';
				data[k].uBokno=0;
			}
			break;
		case 0x34:
			for(i=0;i<MAXSIZE;i++)
			{
				for(j=0;j<MAXSIZE;j++)
				{
					if(data[j].uBokno)
					{
						if(strcmp(szLess,data[j].szPublic)>=0||szLess[0]=='\0')
						{
							strcpy(szLess,data[j].szPublic);
							k=j;
						}
					}
				}
				memcpy(&data2[i],&data[k],sizeof(BookData));
				szLess[0]='\0';
				data[k].uBokno=0;
			}
			break;
		case 0x35:
			for(i=0;i<MAXSIZE;i++)
			{
				for(j=0;j<MAXSIZE;j++)
				{
					if(data[j].uBokno)
					{
						if(fLess>data[j].uPrize||fLess==0)
						{
							fLess=data[j].uPrize;
							k=j;
						}
					}
				}
				memcpy(&data2[i],&data[k],sizeof(BookData));
				fLess=0;
				data[k].uBokno=0;
			}
			break;
		case 0x36:
			for(i=0;i<MAXSIZE;i++)
			{
				for(j=0;j<MAXSIZE;j++)
				{
					if(data[j].uBokno)
					{
						if(iLess>=data[j].uQuantity||iLess==0)
						{
							iLess=data[j].uQuantity;
							k=j;
						}
					}
				}
				memcpy(&data2[i],&data[k],sizeof(BookData));
				iLess=0;
				data[k].uBokno=0;
			}
			break;
		default:
			printf("\n无效菜单序号,请重新输入!\nPress any key to continue!");
			getche();
			IsUseNewData=false;
			break;
	}
	if(IsUseNewData)//没有进行过排序就不写文件夹袄
	{
		fp=fopen("data","w+");
		fwrite(data2,MAXSIZE*sizeof(BookData),1,fp);
		fclose(fp);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -