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

📄 dbdb.cpp

📁 数据库模拟系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		{
			printf("%s\t",t[i].proname[j]);
		}
		printf("\n----------------------------------------------------------------\n");
		for(k=0;k<t[i].re_num;k++)
		{
			for(j=0;j<t[i].pro_num;j++)
				printf("%s\t",t[i].record[k][j]);
			printf("\n");
		}
		printf("\n\n按回车键输出下一张表...\n");
		getchar();
	}
	printf("\n表输出结束,按回车返回上一级菜单.");
	getchar();
}
void outputts()		//表的基本信息
{
	clrscr();
	int i,j;
	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++)
		{
			printf("%s(%c)\t",t[i].proname[j],t[i].protype[j]);
		}
		printf("\n\n");
	}
	getchar();
}
void initialize()
{
	int i,j,k,p;
	t_num=0;
	NULLTABLE.key_no=-1;	//空表的定义就是key_no是-1的表,也是一种标识
	for(i=0;i<MAX_TNUM;i++)
	{
		for(j=0;j<MAX_PRONUM;j++)
			t[i].key[j]='\0';
		t[i].key_no=0;
		t[i].pro_num=0;
		t[i].re_num=0;
		for(j=0;j<MAX_PRONUM;j++)
			t[i].protype[j]='\0';
		for(j=0;j<MAX_PRONUM;j++)
			for(k=0;k<MAX_PROLEN;k++)
				t[i].proname[j][k]='\0';
		for(j=0;j<MAX_TNAME;j++)
			t[i].tname[j];
		for(j=0;j<MAX_RECNUM;j++)
			for(k=0;k<MAX_PRONUM;k++)
				for(p=0;p<MAX_PROLEN;p++)
					t[i].record[j][k][p]='\0';
	}
}
table yununion(table *t1,table *t2)
{
	table tnew;	//结果集
	int k,p,m,q;
		if(!IsTableSameType(t1,t2))
	{
		printf("\n所输入的两个表并不是同一个类型的!");
		getchar();
		return NULLTABLE;
	}
//并操作,把T1表赋值给结果集
	tnew.key_no=t1->key_no;
	tnew.pro_num=t1->pro_num;
	tnew.re_num=t1->re_num;
	strcpy(tnew.key,t1->key);
	strcpy(tnew.tname,"T");
	for(k=0;k<t1->pro_num;k++)
	{
		strcpy(tnew.proname[k],t1->proname[k]);
		tnew.protype[k]=t1->protype[k];
	}
	for(k=0;k<tnew.re_num;k++)
		for(p=0;p<tnew.pro_num;p++)
			strcpy(tnew.record[k][p],t1->record[k][p]);	//表T就是结果集

	for(p=0;p<t2->re_num;p++)
		for(q=0;q<t1->re_num;q++)
		{
			if(IsRecEqu(t1,q,t2,p))	//记录相等。
				break;
			if((q==t1->re_num-1)&&(!IsRecEqu(t1,q,t2,p)))
			{
				for(m=0;m<t1->pro_num;m++)
					strcpy(tnew.record[tnew.re_num][m],t2->record[p][m]);
				tnew.re_num++;
			}
		}
	return tnew;
}
table yunjiao(table *t1,table *t2)
{
	table tnew;
	int m,q,p,k;
	//这里加入,如果两个表不是同类表的错误处理
	if(!IsTableSameType(t1,t2))
	{
		
		printf("所输入的两个表并不是同一个类型的!");
		getchar();
		return NULLTABLE;
	}
	tnew.key_no=t1->key_no;	
	tnew.pro_num=t1->pro_num;	//使结果集T的表类型和R,S相同
	tnew.re_num=0;		//把空集Φ给结果集T
	strcpy(tnew.key,t1->key);
	strcpy(tnew.tname,"T");
	for(k=0;k<t1->pro_num;k++)
	{
		strcpy(tnew.proname[k],t1->proname[k]);
		tnew.protype[k]=t1->protype[k];
	}
//交操作开始

	for(p=0;p<t2->re_num;p++)
		for(q=0;q<t1->re_num;q++)
		{
			if(IsRecEqu(t1,q,t2,p))	//记录相等。
			{
				for(m=0;m<t1->pro_num;m++)
					strcpy(tnew.record[tnew.re_num][m],t2->record[p][m]);
				tnew.re_num++;
				break;
			}
		}
	return tnew;
}
table yundiff(table *t1,table *t2)
{
	table tnew;
	int k,m,n,p,q;
		//这里加入,如果两个表不是同类表的错误处理
	if(!IsTableSameType(t1,t2))
	{
		
		printf("所输入的两个表并不是同一个类型的!");
		getchar();
		return NULLTABLE;
	}
	
	tnew.key_no=t1->key_no;
	tnew.pro_num=t1->pro_num;
	tnew.re_num=t1->re_num;
	strcpy(tnew.key,t1->key);
	strcpy(tnew.tname,"T");
	for(k=0;k<t1->pro_num;k++)
	{
		strcpy(tnew.proname[k],t1->proname[k]);
		tnew.protype[k]=t1->protype[k];
	}
	for(k=0;k<tnew.re_num;k++)
		for(p=0;p<tnew.pro_num;p++)
			strcpy(tnew.record[k][p],t1->record[k][p]);	//表T就是结果集,结果集的内容就是R
//开始差操作
	for(p=0;p<t2->re_num;p++)
		for(q=0;q<tnew.re_num;q++)
		{
			if(IsRecEqu(&tnew,q,t2,p))	//记录相等。
			{
				for(m=q;m<tnew.re_num;m++)
					for(n=0;n<tnew.pro_num;n++)
						strcpy(tnew.record[m][n],tnew.record[m+1][n]);
				tnew.re_num--;
				break;
			}
		}
	return tnew;
}
table yunshadow(table *t1,char pro[MAX_PRONUM][MAX_PROLEN],int k)
{
	table tnew;
	int m,n,p;
	for(m=0;m<=k;m++)
	{
		strcpy(tnew.proname[m],pro[m]);
		//这里tnew.protype就不多做了,因为实用性不强,并且操作比价复杂。
	}
	tnew.pro_num=k;
	tnew.key_no=0;
	tnew.re_num=t1->re_num;
	strcpy(tnew.tname,"T");
	for(m=0;m<t1->re_num;m++)		//记录的变化
	{
		for(n=0;n<t1->pro_num;n++)	//属性的变化
		{
			for(p=0;p<tnew.pro_num;p++)
				if(strcmp(t1->proname[n],tnew.proname[p])==0)
				{
					strcpy(tnew.record[m][p],t1->record[m][n]);
				}	//找到对应项,加入到新表中去
		}
	}
	return tnew;
}
table yunsel0(table *t1,char *sx,int ysf,int shu,char *str)	//检查好了再往函数里传
{
	table tnew;
	int m,n,k;
	//先初始化tnew表,使得tnew表与t1表同类型
	tnew.pro_num=t1->pro_num;
	tnew.key_no=t1->key_no;
	tnew.re_num=0;
	strcpy(tnew.tname,"T");
	for(m=0;m<t1->pro_num;m++)
		strcpy(tnew.proname[m],t1->proname[m]);
	//再判断sx区域的下标是多少。
	for(k=0;k<tnew.pro_num;k++)
		if(strcmp(tnew.proname[k],sx)==0)
			break;
	//k就是sx的下标,后面用着方便!!!
	for(m=0;m<t1->re_num;m++)
	{
		//1.=  2.≠  3.≤  4.≥  5.<  6.>
		if(ysf==1)		//1.=
		{
			if(strcmp(t1->record[m][k],str)==0)
			{
				for(n=0;n<t1->pro_num;n++)
					strcpy(tnew.record[tnew.re_num][n],t1->record[m][n]);
				tnew.re_num++;
			}
		}
		else if(ysf==2)	//2.≠
		{
			if(strcmp(t1->record[m][k],str)!=0)
			{
				for(n=0;n<t1->pro_num;n++)
					strcpy(tnew.record[tnew.re_num][n],t1->record[m][n]);
				tnew.re_num++;
			}
		}
		else if(ysf==3)	//3.≤
		{
			if(strtonum(t1->record[m][k])<=shu)
			{
				for(n=0;n<t1->pro_num;n++)
					strcpy(tnew.record[tnew.re_num][n],t1->record[m][n]);
				tnew.re_num++;
			}
		}
		else if(ysf==4)	//4.≥
		{
			if(strtonum(t1->record[m][k])>=shu)
			{
				for(n=0;n<t1->pro_num;n++)
					strcpy(tnew.record[tnew.re_num][n],t1->record[m][n]);
				tnew.re_num++;
			}
		}
		else if(ysf==5)	//5.<
		{
			if(strtonum(t1->record[m][k])<shu)
			{
				for(n=0;n<t1->pro_num;n++)
					strcpy(tnew.record[tnew.re_num][n],t1->record[m][n]);
				tnew.re_num++;
			}
		}
		else	//ysf==6//6.>
		{
			if(strtonum(t1->record[m][k])>shu)
			{
				for(n=0;n<t1->pro_num;n++)
					strcpy(tnew.record[tnew.re_num][n],t1->record[m][n]);
				tnew.re_num++;
			}
		}
	}
	return tnew;
}
void relationunion()
{
	clrscr();
	char mn[MAX_TNAME];
	table tnew;	//结果集
	int i,j;
	
	printf("并运算操作:R∪S");
	
	 printf(" のR的表名:");
	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]是查到的表.
	printf("输入关系S的表名:");
	gets(mn);
	//添加错误处理
	for(j=0;j<t_num;j++)
		if(strcmp(mn,t[j].tname)==0)		//j的值就是表的位置.
			goto lll;
	printf("未找到表,请确认输入.");
	getchar();
	return;
lll:;//找到表所在位置,表t[j]是查到的表.
	//表S与表R。。。。。表R i  表S j
//下面开始进行两个表的并操作********************************************
	//这里加入,如果两个表不是同类表的错误处理
	if((tnew=yununion(&t[i],&t[j])).key_no==-1)
		return ;
	printf("\n结果关系是:");

	tableprint(&tnew);		//输出表
	printf("\n输出了结果,回车返回上一级菜单.");
	getchar();
}
void relationjiao()
{ 
	clrscr();
	char mn[MAX_TNAME];
	int i,j;
//	int m,n;
	table tnew;		//结果集
	
	printf("交运算操作:R∩S");
	
	 printf("のR的表名:");
	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]是查到的表.
	printf("输入关系S的表名:");
	gets(mn);
	//添加错误处理
	for(j=0;j<t_num;j++)
		if(strcmp(mn,t[j].tname)==0)		//j的值就是表的位置.
			goto lll;
	printf("未找到表,请确认输入.");
	getchar();
	return;
lll:;//找到表所在位置,表t[j]是查到的表.
	//表S与表R。。。。。表R i  表S j
	if((tnew=yunjiao(&t[i],&t[j])).key_no==-1)
		return;
	
	printf("\n结果关系是:");
	tableprint(&tnew);		//输出表
	printf("\n输出了结果,回车返回上一级菜单.");
	getchar();
}
void relationdiff()
{
	clrscr();
	char mn[MAX_TNAME];
	int i,j;
//	int m,n;
	table tnew;
	
	printf("差运算操作:R-S");
	
	printf("のR的表名:");
	gets(mn);
	//添加错误处理
	for(i=0;i<t_num;i++)
		if(strcmp(mn,t[i].tname)==0)
		{
			//i的值就是表的位置.
			goto eodrp;
		}
	printf("未找到表,请确认输入.");
	getchar();
	return;
eodrp:;//找到表所在位置,表t[i]是查到的表.
	printf("输入关系S的表名:");
	gets(mn);
	//添加错误处理
	for(j=0;j<t_num;j++)
		if(strcmp(mn,t[j].tname)==0)		//j的值就是表的位置.
			goto eodrp1;
	printf("未找到表,请确认输入.");
	getchar();
	return;
eodrp1:;//找到表所在位置,表t[j]是查到的表.
	//表S与表R。。。。。表R i  表S j
	if((tnew=yundiff(&t[i],&t[j])).key_no==-1)
		return;
	printf("\n结果关系是:");
//*************************************************************
	tableprint(&tnew);		//输出表
	printf("\n输出了结果,回车返回上一级菜单.");
	getchar();
}

void relationshadow()
{
	clrscr();
	char mn[MAX_TNAME];
	char sx[MAX_PROLEN];
	char pro[MAX_PRONUM][MAX_PROLEN];
	table tnew;
	int i,k;
	int p,q;
	

⌨️ 快捷键说明

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