📄 dbdb.cpp
字号:
{
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 + -