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