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

📄 dbdb.cpp

📁 数据库模拟系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "windows.h"
#include "iostream.h"
#include "power.h"

void mainmenu();
table NULLTABLE;	//空表,初始化的时候定义NULLTABLE.key_no=-1
table t[MAX_TNUM];
view vi[MAX_VIEWNUM];
index ind[MAX_TNUM];

int t_num=0;
int i_num=0;
int v_num=0;



void fileread()
{
	FILE *fp;
	if((fp=fopen("table.txt","r"))==NULL)
	{
		printf("不存在table.txt文件,请检查后再使用.");
		fclose(fp);
		exit(-1);
	}	
	fread(&t_num,sizeof(int),1,fp);	
	fread(t,sizeof(table),MAX_TNUM,fp);	
	fclose(fp);

//下面读取view.txt的内容。
	if((fp=fopen("view.txt","r"))==NULL)
	{
		printf("不存在view.txt文件,请检查后再使用.");
		fclose(fp);
		exit(-1);
	}	
	fread(&v_num,sizeof(int),1,fp);	
	fread(vi,sizeof(view),MAX_VIEWNUM,fp);	
	fclose(fp);
//下面添加读取index.txt的代码
	if((fp=fopen("index.txt","r"))==NULL)
	{
		printf("不存在index.txt文件,请检查后再使用.");
		fclose(fp);
		exit(-1);
	}	
	fread(&i_num,sizeof(int),1,fp);	
	fread(ind,sizeof(index),MAX_TNUM,fp);	
	fclose(fp);

}
void filewrite()
{
	FILE *fp;
//写入table.txt的代码
	if((fp=fopen("table.txt","w"))==NULL)
	{
		printf("不存在table.txt文件,请检查后再使用.");
		getchar();
		exit(-1);
	}
	fwrite(&t_num,sizeof(int),1,fp);
	fwrite(t,sizeof(table),MAX_TNUM,fp);
	fclose(fp);
//以下是写入dic.txt的代码
	int i,j;
	if((fp=fopen("dic.txt","w"))==NULL)
	{
		printf("不存在dic.txt文件,请检查后再使用.");
		getchar();
		exit(-1);
	}
	for(i=0;i<t_num;i++)
	{
		fprintf(fp,"表名:%s   属性数量:%d   主键:%s",t[i].tname,t[i].pro_num,t[i].key);
		fprintf(fp,"\n----------------------------------------------------\n");
		for(j=0;j<t[i].pro_num;j++)
			fprintf(fp,"%s(%c)    ",t[i].proname[j],t[i].protype[j]);
		fprintf(fp,"\n\n\n");
	}
	fclose(fp);
//以下是写入view.txt的代码
	if((fp=fopen("view.txt","w"))==NULL)
	{
		printf("不存在view.txt文件,请检查后再使用.");
		getchar();
		exit(-1);
	}
	fwrite(&v_num,sizeof(int),1,fp);
	fwrite(vi,sizeof(view),MAX_VIEWNUM,fp);
	fclose(fp);
//以下是写入index.txt的代码
	if((fp=fopen("index.txt","w"))==NULL)
	{
		printf("不存在index.txt文件,请检查后再使用.");
		getchar();
		exit(-1);
	}
	fwrite(&i_num,sizeof(int),1,fp);
	fwrite(ind,sizeof(index),MAX_TNUM,fp);
	fclose(fp);
}
bool IsRecEqu(table *r,int i,table *s,int j)
{
	int p;
	if(r->pro_num!=s->pro_num)		//属性个数不匹配
		return false;
	for(p=0;p<s->pro_num;p++)		//属性名字不匹配
		if(strcmp(s->proname[p],r->proname[p])!=0)
			return false;
	for(p=0;p<r->pro_num;p++)
		if(strcmp(r->record[i][p],s->record[j][p])!=0)
			return false;
	return true;
}
bool IsTableSameType(table *t1,table *t2)
{
	int p;
	if(t1->pro_num!=t2->pro_num)
	{
		printf("ErrorNo1:unequal number of properities.");
		return false;
	}
	for(p=0;p<t1->pro_num;p++)
		if(strcmp(t1->proname[p],t2->proname[p])!=0)
		{
			printf("ErrorNo2:different proname[%d]",p);
			return false;
		}
	return true;
}
int strtonum(char *str)
{
	int i=0,sum=0;
	while(str[i]!='\0')
	{
		sum=sum*10;
		sum=sum+str[i]-48;
		i++;
	}
	return sum;
}
void tablecreate()
{
	clrscr();
	char mn[MAX_TNAME];
	char ck[MAX_PROLEN];
	table tnew;
	int nnum;
	int i,j,k;
	printf("建表操作");
        printf("输入新建表的名称:");
	gets(mn);
	//添加重名处理与错误处理
	strcpy(tnew.tname,mn);	//新表表名
	printf("输入新建表的属性个数:");
	cin>>nnum;
	//添加错误处理
	
	tnew.pro_num=nnum;
	//开始循环输入属性名称;
	//注意重名的属性
	i=0;
	while(i<tnew.pro_num)
	{
		printf("\n请输入第%d个属性名称:",i+1);
		gets(mn);
		//重名处理!!!!!
		strcpy(tnew.proname[i],mn);
		printf("\n请输入第%d个属性类型n=num  c=char:",i+1);
		//错误处理,不符合的类型要排除掉!
		cin>>tnew.protype[i];
		i++;
	}

	//定义主键,主键是唯一表示一个记录的属性,必须要有主键.主键的位置是tnew.key,主键在属性中的下标.
	printf("主键对于一个表是必不可少的.\n");
	printf("请输入主键的名称,输入错误则自动选择第一个属性:");
	gets(ck);
	for(i=0;i<tnew.pro_num;i++)
	{
		if(strcmp(ck,tnew.proname[i])==0)
		{
			tnew.key_no=i;
			strcpy(tnew.key,ck);
			goto nex1;
		}
	}
	printf("\n输入错误,主键自动选择为第一个属性:\a%s",tnew.proname[0]);
	strcpy(tnew.key,tnew.proname[0]);
	tnew.key_no=0;
nex1:;
	tnew.re_num=0;		//记录表设置为空
	for(i=0;i<MAX_RECNUM;i++)
		for(j=0;j<MAX_PRONUM;j++)
			for(k=0;k<MAX_PROLEN;k++)
				tnew.record[i][j][k]='\0';	//初始化记录表
	t[t_num++]=tnew;
	printf("\n建表成功,回车返回上一级菜单.");
	getchar();
}
void tabledrop()
{
	clrscr();
	char mn[MAX_TNAME];
	int i,j;
	printf("表删除操作");
	printf("输入删除的表名:");
	gets(mn);
	//添加错误处理
	for(i=0;i<t_num;i++)
		if(strcmp(mn,t[i].tname)==0)
		{
			//i的值就是要删除的表的位置.
			for(j=i;j<t_num-1;j++)
				t[j]=t[j+1];
			t_num--;
			goto ll;
		}
	printf("未找到要删除的表,请确认输入.");
	getchar();
	return;
ll:;
	
	printf("表%s被成功的删除!回车返回上一级菜单.",mn);
	getchar();
}

void tableprint(table *t1)
{
	int m,n;
	printf("\n-----------------------------------------\n");
	for(m=0;m<t1->pro_num;m++)
		printf("%s\t",t1->proname[m]);
	printf("\n-----------------------------------------\n");
	for(m=0;m<t1->re_num;m++)
	{
		for(n=0;n<t1->pro_num;n++)
			printf("%s\t",t1->record[m][n]);
		printf("\n");
	}
}
void recordinsert()
{
	clrscr();
	char mn[MAX_TNAME];
	char mq[MAX_TNAME];
	int i,j;
	printf("记录插入操作");
	printf("输入插入的表名:");
	gets(mn);
	
	//添加错误处理
	for(i=0;i<t_num;i++)
		if(strcmp(mn,t[i].tname)==0)
		{
			//i的值就是要删除的表的位置.
			goto ll;
		}
	printf("未找到要删除的表,请确认输入.");
	getchar();
	return;
ll:;//找到表所在位置,接下来是插入记录动作,表t[i]是查到的表.
	//添加判断,是否可以继续添加记录而不达到满值.错误处理
	strcpy(mq,mn);		//本函数到最后用到mq变量
	if(t[i].re_num>=MAX_RECNUM)
	{
		printf("该表已经达到记录的最大值!无法插入.");
		getchar();
		return;
	}
	for(j=0;j<t[i].pro_num;j++)
	{
		printf("\n请输入属性%s的值:",t[i].proname[j]);
		gets(mn);
		//添加错误处理,包括主键不可以重复等等.
		strcpy(t[i].record[t[i].re_num][j],mn);		//把属性值赋给相应的记录属性位置.
				//re_num++
		//////////////////////////////////////////////////////////////////////////////////////////////////////////
	}
	t[i].re_num++;

	printf("\n表%s已经被成功地插入了一个新记录!回车返回上一级菜单.",mq);
	getchar();
}

void recorddel()
{
	clrscr();
	char mn[MAX_TNAME];
	char mq[MAX_TNAME];
	char zj[MAX_PROLEN];
	int i,j,k;
	printf("记录删除操作");
	printf("输入删除记录的表名:");
	gets(mn);

	//添加错误处理
	for(i=0;i<t_num;i++)
		if(strcmp(mn,t[i].tname)==0)
		{
			//i的值就是要删除的表的位置.
			goto ll;
		}
	printf("未找到要删除记录的表,请确认输入.");
	getchar();
	return;
ll:;
	//找到表所在位置,接下来是插入记录动作,表t[i]是查到的表.
	//添加判断,是否可以继续添加记录而不达到满值.错误处理
	strcpy(mq,mn);		//本函数到最后用到mq变量
	if(t[i].re_num<=0)
	{
		printf("该表无记录!无法删除.");
		getchar();
		return;
	}
	printf("输入要删除记录的主键值:");
	gets(zj);	//输入主键的值
	//添加错误处理,判断是否有词记录
	for(j=0;j<t[i].re_num;j++)
	{
		if( strcmp( t[i].record[j][t[i].key_no] , zj ) ==0)
			goto findkey1;
	}

	printf("未找到该记录,请确认输入.");
	getchar();
	return;
	//找到该记录,开始进行删除操作.j就是要删除的记录的下标
findkey1:;
	for(;j<t[i].re_num-1;j++)
	{
		for(k=0;k<t[i].pro_num;k++)
			strcpy(t[i].record[j][k],t[i].record[j+1][k]);
	}
	t[i].re_num--;
	printf("\n表%s已经被成功地删除了一个记录!回车返回上一级菜单.",mq);
	getchar();
}



void recordupdate()
{
	clrscr();
	char mn[MAX_TNAME];
	char mq[MAX_TNAME];
	char zj[MAX_PROLEN];
	int i,j,k;
	printf("记录更改操作");
	printf("输入记录所在的表名:");
	gets(mn);
	
	//添加错误处理
	for(i=0;i<t_num;i++)
		if(strcmp(mn,t[i].tname)==0)
		{
			//i的值就是要删除的表的位置.
			goto ll;
		}
	printf("未找到要删除的表,请确认输入.");
	getchar();
	return;
ll:;//找到表所在位置,接下来是插入记录动作,表t[i]是查到的表.
	//添加判断,是否可以继续添加记录而不达到满值.错误处理
	strcpy(mq,mn);		//本函数到最后用到mq变量
	if(t[i].re_num<=0)
	{
		printf("该表记录值为0!无法更改.");
		getchar();
		return;
	}
	//从这里开始搜寻主键的值
	 printf("输入记录主键值:");
	gets(zj);	//输入主键的值
	//添加错误处理,判断是否有词记录
	printf("   key_no=%d   ",t[i].key_no);
	for(j=0;j<t[i].re_num;j++)
	{
		if( strcmp( t[i].record[j][t[i].key_no] , zj ) ==0)
			goto findkey1;
	}
	printf("未找到该记录,请确认输入.");
	getchar();
	return;
	//找到该记录,开始进行删除操作.j就是记录的下标,i是表的下标
findkey1:;
	
	for(k=0;k<t[i].pro_num;k++)
	{
		printf("\n请输入属性%s的值:",t[i].proname[k]);
		gets(mn);
		//添加错误处理,包括主键不可以重复等等.
		strcpy(t[i].record[j][k],mn);		//把属性值赋给相应的记录属性位置.
				//re_num++
	}

	printf("\n表%s成功修改了一条记录!回车返回上一级菜单.",mq);
	getchar();	
} 
void outputrec()
{
	clrscr();
	int i,j,k;
	for(i=0;i<t_num;i++)
	{
		printf("\n表名:%s   属性个数:%d    主键:%s",t[i].tname,t[i].pro_num,t[i].key);
		printf("\n----------------------------------------------------------------\n");
		for(j=0;j<t[i].pro_num;j++)

⌨️ 快捷键说明

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