数据库课程设计说明书---设计简易的数据库管理系统DBMS

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、设计要求:
(1) 设计内容
创建和修改表的定义:
1、实现:CREATE TABLE <表名> (<列名><数据类型>[<列完整性约束条件>][,<列名><数据类型>[<列完整性约束条件>]…][,<表完整性约束条件>] );
2、实现:ALTER TABLE <表名> [ADD <新列名><数据类型>[<列完整性约束>]] [DROP<列完整性约束名>][MODIFY <列名><数据类型>]。

(2) 设计要求
1、设计和实现表的物理存储结构;
2、语句以命令行和图形化界面两种形式实现;
3、分析设计内容,画出程序流程图,设计表的存储结构;
4、提交课程设计报告。

(3) 任务步骤
1、分析命令语句,得到表名、列名和数据类型等信息;
2、根据命令中的关键词确定表和字段的属性;
3、创建一个表文件,写入表结构信息;
4、打开一个表文件,修改表结构信息;
5、演示建立了一个表,并修改了表结构。

二、需求分析:
数据库系统能够有效地组织和管理大量的数据。

研究数据库管理系统的实现技术,对于掌握数据库系统的原理和技术,了解数据库系统的内部结构,开发高效的数据库应用系统,具有重要意义。

在建立了数据库之后,首先需要建立表,之后才能进行记录的插入。

这个程序的设计就是实现创建和修改表的定义。

三、设计思想:
(1)总体思路
此课程设计主要要完成的任务是创建和修改表的定义,因此程序中共包含四个可选项:“新建表”、“修改表”、“显示表的信息”、“保存操作并退出”。

另外,由于是数据库的操作,因此需要将建立的表的信息存储,在执行程序时应该调用已存储的表的信息,并且应该有日志文件以记录对表的操作。

下面依次介绍主要结构、保存表信息、提取表信息、日志文件和主菜单中的四个选项;
(2)主要结构
1、每一个都有一个固定结构,因此我首先建立了一个表的结构体,具体形式如下:
typedef struct
{
char table_name[10];//表名
int property_num;//属性的个数
char property_name[10000][10];//属性名
int property_type[1000];//属性类型(1=int,2=char)
int property_null[100];//属性是否为空(1=允许,2=不允许)
int property_key[10];//是否主码(1=是主键,2=不是主键)
}TABLE;
2、我用一个TABLE型的数组将所有的表联系在一起,具体定义为TABLE table[10000];
3、定义一个int型变量记录表的个数,具体定义为int table_num=0。

(3)保存表信息
首先打开或新建一个文本文档,取名为table.txt。

由于执行此程序时可能对之前存在的表进行内容或结构的修改,如果对表进行修改之后直接在table.txt中存储此表的原位置进行比较麻烦,因此,在保存表信息的处理上,我采用了一种较为简单的办法,即在对表进行所有的操作之后,将表信息存储到table.txt中,覆盖掉原来已经存储的表的信息。

这样则只需要一次存储就可以。

其次,储存表信息时,我采用的方法是首先存储表的个数,然后按照表的个数依次循环保存每一个表的信息。

在保存每一个表的信息时,首先保存这个表的表名,然后存储这个表所拥有的属性个数,然后按照属性的个数依次循环保存每一个属性的性质。

这样在提取的时候就比较简单。

(4)提取表信息
由于保存表信息时采用一定技巧,因此提取时只需要按照保存表信息的思路进行提取就可以了。

首先第一个提取出来的是里面保存的表的个数。

然后按照表的个数依次循环提取每一个表的信息。

在提取每一个表的信息时,首先提取的是这个表的表名,然后提取这个表所拥有的属性个数,然后按照属性的个数依次循环提取每一个属性的性质。

这些提取的表的信息依次存储在table[0]、table[1]……中。

(5)日志文件
在进行每项操作时都需要将操作记录到日志文件中,因此写入日志文件并没有一个特意制定的函数,而是在每一步操作后都有相应的语句记录相应的操作,例如,在打开程序进行读取表信息后需要记录“读取数据并初始化各项信息”。

(6)新建表
1、输入表名:建表的第一步就是需要输入表名,输入完成后进行检查,此表名是否已经存在,若已存在将提示错误信息,并要求重新输入;如正确,则进行下一步。

2、输入属性的个数:输入属性个数之后需要检查属性个数是否正确,即属性个数是否为非整数。

若属性个数错误则将提示错误信息,并要求重新输入,按任意键就可回到输入属性个数的界面并重新输入;若正确,则进行下一步。

3、输入属性名:按照上面输入的属性个数,将依次循环直到所有的属性都输入完成。

输入属性性质的第一步就是输入属性名。

输入属性名之后,需要检查与此表中已经存在的属性的属性名是否相同,若有相同的,则将提示错误信息,并要求重新输入,按任意键就可回到输入属性名的界面并重新输入;若正确,则进行下一步。

4、选择属性类型;选择属性类型之后,需要判断选择是否正确,若不正确,则将提示错误信息,并要求重新输入,按任意键就可回到输入属性类型的界面并重新输入;若正确,则进行下一步。

5、选择属性是否允许为空:选择属性是否允许为空之后,需要判断选择是否正确,若不正确,则将提示错误信息,并要求重新输入,按任意键就可回到输入属性是否允许为空的界面并重新输入;若正确,则进行下一步。

6、选择属性是否为主键:选择属性是否为主键之后,需要判断选择是否正确,若不正确,则将提示错误信息,并要求重新输入,按任意键就可回到输入属性是否为主键的界面并重新输入;若正确,则进行下一步。

属性是否为主键输入完成后还需要检查一步,若选择的属性允许
为空且此属性为主键,则将属性是否允许为空改为不允许。

7、依次循环3-6步,直到所有的属性全部输入完毕。

将此表的信息赋值到table[table_num]中。

完成表的建立,记录操作,并提示建表成功,按任意键返回主菜单。

(7)修改表
1、选择操作:若没有可修改的表,则显示无表可修改,否则显示可以进行的操作,并进行选择,并检查输入的选择是否正确,若不正确,则将提示错误信息,并要求重新选择,按任意键就可回到选择操作的界面并重新输入;若正确,则跳到指定的操作的界面。

2、修改表名:若选的是“修改表名”,则提示输入表名,输入完成后进行检查,此表名是否已经存在,若已存在将提示错误信息,并要求重新输入;如正确,则提示修改表名成功,按任意键返回主菜单,并在日志文件中记录相对应的操作。

3、增加属性:若选的是“增加属性”,则依次需要输入属性名、属性类型、属性是否允许为空、属性是否为主键。

输入之后也需要进行检查,检查过程如建表时类似。

若不正确,则提示相应的信息,并返回输入界面重新输入;若正确,则提示增加属性成功,按任意键返回主菜单,并在日志文件中记录相对应的操作。

4、删除属性:若选的是“删除属性”,则需要选择删除哪个属性,输入之后进行判断,若选择不正确,则提示错误信息,并返回选择界面重新选择;如正确,则提示删除属性成功,按任意键返回主菜单,并在日志文件中记录相对应的操作。

5、修改属性:若选的是“修改属性”,则需要选择修改哪个属性,输入之后进行判断,若选择不正确,则提示错误信息,并返回选择界面重新选择;如正确,则显示该属性的原性质,并且输入新性质,此处如同新增加的属性类似,并在日志文件中记录相对应的操作。

(8)显示表的信息
此处比较简单,若没有可显示的表,则显示无表可显示,否则将已经存在的表的信息全部显示,并提示显示表的信息完毕,按任意键返回主菜单。

(9)保存操作并退出
将表的信息存储到table.txt中,并退出程序。

四、程序流程图:
接下图
接上图
五、主要源程序:
(1)定义表结构体
typedef struct
{
char table_name[10];//表名
int property_num;//属性的个数
char property_name[10000][10];//属性名
int property_type[1000];//属性类型(1=int,2=char)
int property_null[100];//属性是否为空(1=允许,2=不允许) int property_key[10];//是否主码(1=是主键,2=不是主键) }TABLE;
(2)读取表信息
void read_from_file()
{
alfp1=fopen("table.txt","r");
fscanf(alfp1,"%d",&table_num);
for(int i=0;i<table_num;i++)
{
fscanf(alfp1,"%s",&table[i].table_name);
fscanf(alfp1,"%d",&table[i].property_num);
for(int j=0;j<table[i].property_num;j++)
{
fscanf(alfp1,"%s",&table[i].property_name[j]);
fscanf(alfp1,"%d",&table[i].property_type[j]);
fscanf(alfp1,"%d",&table[i].property_null[j]);
fscanf(alfp1,"%d",&table[i].property_key[j]);
}
}
fclose(alfp1);
}
(3)写入表信息
void write_to_file()
{
alfp1=fopen("table.txt","w");
fprintf(alfp1,"%d\n",table_num);
for(int i=0;i<table_num;i++)//表
{
fprintf(alfp1,"%s %d\n",table[i].table_name,table[i].property_num);
for(int j=0;j<table[i].property_num;j++)//属性
fprintf(alfp1,"%s %d %d %d\n",table[i].property_name[j],table[i].property_type[j], table[i].property_null[j],table[i].property_key[j]);
fprintf(alfp1,"\n");
}
fclose(alfp1);
}
(4)创建表
void createtable()
{
TABLE newtable;//用来存储新创建的表
//step1:输入表名
int tablename_is_right=0;
while(!tablename_is_right)
{
system("cls");
gotoxy(4,3);printf("表名:");
gotoxy(10,3);scanf("%s",&newtable.table_name);
//判断表名是否已经存在
int name_is_equal=0;
for(int i=0;i<table_num;i++)
{
if(compare(newtable.table_name,table[i].table_name)==0)
name_is_equal=1;
}
if(name_is_equal==1)
{
gotoxy(4,5);printf("表%s已经存在,按任意键返回重新输入......",newtable.table_name);
getch();
}
else tablename_is_right=1;
}//表名while
//step2:输入属性个数
int propertynum_is_right=0;
while(!propertynum_is_right)
{
system("cls");
gotoxy(4,3);printf("表名: %-10s\n",newtable.table_name);
gotoxy(4,4);printf("属性个数:");
gotoxy(14,4);scanf("%d",&newtable.property_num);
//判断属性个数是否正确
if(newtable.property_num<=0)
{
gotoxy(4,6);printf("您输入的属性个数有误,按任意键重新输入......\n");
getch();
}
else propertynum_is_right=1;
}//属性个数while
int i;//i代表循环中的属性
int j;//j代表在i之前的属性
for(i=0;i<newtable.property_num;i++)//i代表属性个数0,1,2......
{
//step3:输入属性名
int propertyname_is_right=0;
while(!propertyname_is_right)
{
system("cls");
gotoxy(4,3);printf("表名: %-10s\n",newtable.table_name);
gotoxy(4,4);printf("属性个数: %d\n",newtable.property_num);
printf(" -----------------------------------------------------\n");
printf(" 属性名属性类型是否允许为空是否为主键 \n"); printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n"); printf(" -----------------------------------------------------\n");
for(j=0;j<i;j++)
{
gotoxy(4,9+j);printf("属性%2d: %-10s %d %d %d",j+1,
newtable.property_name[j],newtable.property_type[j],newtable.property_null[j] ,newtable.property_key[j]);
}
gotoxy(4,i+9);printf("属性%2d:",i+1);
gotoxy(15,i+9);scanf("%s",&newtable.property_name[i]);
//判断属性名是否存在
int name_is_equal=0;
for(j=0;j<i;j++)
{
if(compare(newtable.property_name[i],newtable.property_name[j])==0)
name_is_equal=1;
}
if(name_is_equal==1)
{
gotoxy(4,10+newtable.property_num);printf("属性%s已经存在,按任意键返回重新输入......",newtable.property_name[i]);
getch();
}
else propertyname_is_right=1;
}//属性名while
//step4:选择属性类型
int propertytype_is_right=0;
while(!propertytype_is_right)
{
system("cls");
gotoxy(4,3);printf("表名: %-10s\n",newtable.table_name);
gotoxy(4,4);printf("属性个数: %d\n",newtable.property_num);
printf(" -----------------------------------------------------\n");
printf(" 属性名属性类型是否允许为空是否为主键\n"); printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n"); printf(" -----------------------------------------------------\n");
for(j=0;j<i;j++)
{
gotoxy(4,9+j);printf("属性%2d: %-10s %d %d %d",j+1, newtable.property_name[j],newtable.property_type[j],newtable.property_null[j] ,newtable.property_key[j]);
}
gotoxy(4,i+9);printf("属性%2d: %-10s",i+1,newtable.property_name[i]);
gotoxy(31,i+9);scanf("%d",&newtable.property_type[i]);
//判断选择的属性类型是否正确
if(newtable.property_type[i]!=1&&newtable.property_type[i]!=2) {
gotoxy(4,i+9+2);printf("您选择的属性类型有误,按任意键重新选
择......\n");
getch();
}
else propertytype_is_right=1;
}//属性类型while
//step5:选择是否允许为空
int propertynull_is_right=0;
while(!propertynull_is_right)
{
system("cls");
gotoxy(4,3);printf("表名: %-10s\n",newtable.table_name);
gotoxy(4,4);printf("属性个数: %d\n",newtable.property_num);
printf(" -----------------------------------------------------\n");
printf(" 属性名属性类型是否允许为空是否为主键 \n"); printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n"); printf(" -----------------------------------------------------\n");
for(j=0;j<i;j++)
{
gotoxy(4,9+j);printf("属性%2d: %-10s %d%d %d",j+1, newtable.property_name[j],newtable.property_type[j],newtable.property_null[j] ,newtable.property_key[j]);
}
gotoxy(4,i+9);printf("属性%2d: %-10s %d",i+1,newtable.property_name[i],newtable.property_type[i]) ;
gotoxy(48,i+9);scanf("%d",&newtable.property_null[i]);
//判断选择是否正确
if(newtable.property_null[i]!=1&&newtable.property_null[i]!=2) {
gotoxy(4,i+9+2);printf("您的选择有误,按任意键重新选择......\n");
getch();
}
else propertynull_is_right=1;
}//是否允许为空while
//step6:选择是否为主键
int propertypropertykey_is_right=0;
while(!propertypropertykey_is_right)
{
system("cls");
gotoxy(4,3);printf("表名: %-10s\n",newtable.table_name);
gotoxy(4,4);printf("属性个数: %d\n",newtable.property_num);
printf(" ----------------------------------------------\n");
printf(" 属性名属性类型是否允许为空是否为主键 \n"); printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n");
printf(" -------------------------------------------------\n");
for(j=0;j<i;j++)
{
gotoxy(4,9+j);printf("属性%2d: %-10s %d %d %d",j+1,
newtable.property_name[j],newtable.property_type[j],newtable.property_null[j],new table.property_key[j]);
}
gotoxy(4,i+9);printf("属性%2d: %-10s %d %d",i+1,
newtable.property_name[i],newtable.property_type[i],newtable.property_null[i]);
gotoxy(61,i+9);scanf("%d",&newtable.property_key[i]);
//判断选择是否正确
if(newtable.property_key[i]!=1&&newtable.property_key[i]!=2) {
gotoxy(4,i+9+2);printf("您的选择有误,按任意键重新选择......\n");
getch();
}
else propertypropertykey_is_right=1;
//主键的非空属性应该为不允许空
if(newtable.property_key[i]==1&&newtable.property_null[i]==1)
{
gotoxy(4,i+9+2);printf("该属性设为主键,因此改为不允许为空,按任意键继续......\n");
getch();
newtable.property_null[i]=2;
system("cls");
gotoxy(4,3);printf("表名: %-10s\n",newtable.table_name);
gotoxy(4,4);printf("属性个数: %d\n",newtable.property_num);
printf(" -------------------------------------------\n");
printf(" 属性名属性类型是否允许为空是否为主键\n"); printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n"); printf(" -----------------------------------------------\n");
for(j=0;j<=i;j++)
{
gotoxy(4,9+j);printf("属性%2d: %-10s %d %d %d",j+1, newtable.property_name[j],newtable.property_type[j],newtable.property_null[j] ,newtable.property_key[j]);
}
if(i==newtable.property_num-1) printf("\n");
}
}//是否为主键while
}//属性for
//step7:记录操作
int year,mon,day,hour,min,sec;
getcurrenttime(&year,&mon,&day,&hour,&min,&sec);
fprintf(alfp2,"\n[%d年%d月%d日%d:%d:%d]执行如下操作:\n",year,mon,day,hour,min,sec);
fprintf(alfp2,"用户建立表成功,表的内容是:表名:%s,表属性个数:%d,主键有:", newtable.table_name,newtable.property_num);
for(int k=0;k<newtable.property_num;k++)//记录主键
{
if(newtable.property_key[k]==1) fprintf(alfp2,"%s、",newtable.property_name[k]);
}
fputc('\n',alfp2);
//step8:建表成功
printf("
---------------------------------------------------------------\n");
table[table_num]=newtable;
table_num++;
gotoxy(4,11+newtable.property_num);printf("建表成功,按任意键返回......");
getch();
menu();
}
(5)修改表
void altertable()
{
if(table_num==0)
{
system("cls");
printf("\n\n\n");
printf(" 没有可修改的表,按任意键返回......");
getch();
menu();
}
else
{
//step1:选择操作选项
int choice;
int choice_is_right=0;
while(!choice_is_right)
{
system("cls");
printf("\n\n");
printf(" 请选择您要进行的修改操作(1-%d):\n\n",4*table_num);
printf("\n");
printf(" 表名操作操作操作操作\n");
printf(" -------------------------------------------------\n");
for(int i=0;i<table_num;i++)
printf("%-10s %2d:修改表名%2d:增加属性%2d:删除属性 %2d:修改属性\n",
table[i].table_name,i*4+1,i*4+2,i*4+3,i*4+4);
printf(" -------------------------------------------------\n");
gotoxy(35+(4*table_num)/10+(4*table_num)/100,3);scanf("%d",&choice);
//判断选择的操作选项是否正确
if(choice<1||choice>4*table_num)
{
gotoxy(4,10+table_num);printf("您的选择有误,按任意键重新选择......");
getch();
}
else
{
choice_is_right=1;
int choice2=choice%4;//代表表的序列
switch(choice2)
{
case 1:// step2:修改表名
{
char newtablename[10];
int tablename_is_right=0;
while(!tablename_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 表名操作操作操作操作\n");
printf(" ------------------------\n");
for(int i=0;i<table_num;i++)
printf(" %-10s %2d:修改表名%2d:增加属性 %2d:删除属性 %2d:修改属性\n",
table[i].table_name,i*4+1,i*4+2,i*4+3,i*4+4);
printf("
---------------------------------------------------------------------\n");
gotoxy(4,8+table_num);printf("原表名:%-10s 新表名:",table[choice/4].table_name);
gotoxy(32,8+table_num);scanf("%s",&newtablename);
int tablename_is_equal=0;
//判断表名是否已经存在
for(int k=0;k<table_num;k++)
{
if(k!=choice/4)
{
if(compare(newtablename,table[k].table_name)==0)
tablename_is_equal=1;
}
}
if(tablename_is_equal>0)
{
gotoxy(4,10+table_num);printf("%s表已经存在,按任意键重新输入......\n",newtablename);
getch();
}
else
tablename_is_right=1;
}//while
//记录操作
int year,mon,day,hour,min,sec;
getcurrenttime(&year,&mon,&day,&hour,&min,&sec);
fprintf(alfp2,"\n[%d年%d月%d日%d:%d:%d]执行如下操作:\n",year,mon,day,hour,min,sec);
fprintf(alfp2,"修改表名成功,表%s的表名被修改为%s",table[choice/4].table_name,newtablename);
//代换原来的
for(int n=0;n<10;n++)
table[choice/4].table_name[n]=newtablename[n];
//修改表名成功
gotoxy(4,10+table_num);printf("表名修改成功,按任意键返回......");
getch();
menu();
break;
}//case1
case 2:// step3:增加属性
{
//属性名
char newpropertyname[10];
int propertyname_is_right=0;
while(!propertyname_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 请填写表%s新增加的属性:\n",table[choice/4].table_name);
printf("\n");
printf(" ---------------------------------\n");
printf(" 属性名属性类型是否允许为空是否为主键\n"); printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n");
printf(" --------------------------\n");
for(int m=0;m<table[choice/4].property_num;m++)
{
gotoxy(4,10+m);printf("属性%2d: %-10s %d %d %d\n",m+1,
table[choice/4].property_name[m],table[choice/4].property_type[m],table[choice/4] .property_null[m],table[choice/4].property_key[m]);
}
printf(" 属性%2d:",table[choice/4].property_num+1);
gotoxy(15,10+table[choice/4].property_num);scanf("%s",&newpropertyname);
//判断属性名是否已经存在
int propertyname_is_equal=0;
for(int l=0;l<table[choice/4].property_num;l++)
{
if(compare(newpropertyname,table[choice/4].property_name[l])==0)
propertyname_is_equal=1;
}
if(propertyname_is_equal>0)
{
gotoxy(4,12+table[choice/4].property_num);printf("表中已经存在名为%s的属性,按任意键重新输入......\n",newpropertyname);
getch();
}
else
{
propertyname_is_right=1;
for(int n=0;n<10;n++) table[choice/4].property_name[table[choice/4].property_num][n]=newpropertyname[n] ;
}
}//属性名while
//属性类型
int propertytype_is_right=0;
while(!propertytype_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 请填写表%s新增加的属性:\n",table[choice/4].table_name);
printf("\n");
printf(" ----------------------------\n");
printf("属性名属性类型是否允许为空是否为主键\n"); printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n");
printf(" --------------------------\n");
for(int m=0;m<table[choice/4].property_num;m++)
{
gotoxy(4,10+m);printf("属性%2d: %-10s %d %d %d\n",m+1,
table[choice/4].property_name[m],table[choice/4].property_type[m],table[choice/4] .property_null[m],table[choice/4].property_key[m]);
}
printf(" 属性%2d: %-15s",table[choice/4].property_num+1,table[choice/4].property_name[tab le[choice/4].property_num]);
gotoxy(31,10+table[choice/4].property_num);scanf("%d",&table[choice/4].property_t ype[table[choice/4].property_num]);
//判断选择的属性类型是否正确
if(table[choice/4].property_type[table[choice/4].property_num]!=1&&table[choi ce/4].property_type[table[choice/4].property_num]!=2)
{
gotoxy(4,12+table[choice/4].property_num);printf("
您选择的数据类型有误,按任意键重新选择......\n");
getch();
}
else propertytype_is_right=1;
}//属性类型while
//是否允许为空
int propertynull_is_right=0;
while(!propertynull_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 请填写表%s新增加的属性:\n",table[choice/4].table_name);
printf("\n");
printf(" ------------------------\n");
printf("属性名属性类型是否允许为空是否为主键\n"); printf(" (1=int 2=float)(1=是 2=否)(1=是 2=否)\n");
printf(" -------------------------------\n");
for(int m=0;m<table[choice/4].property_num;m++)
{
gotoxy(4,10+m);printf("属性%2d:%-10s%d %d %d\n",m+1,
table[choice/4].property_name[m],table[choice/4].property_type[m],table[choice/4] .property_null[m],table[choice/4].property_key[m]);
}
printf(" 属性%2d: %-15s %d",table[choice/4].property_num+1,
table[choice/4].property_name[table[choice/4].property_num],table[choice/4].p roperty_type[table[choice/4].property_num]);
gotoxy(48,10+table[choice/4].property_num);scanf("%d",&table[choice/4].property_n ull[table[choice/4].property_num]);
//判断选择的是否允许空是否正确
if(table[choice/4].property_null[table[choice/4].property_num]!=1&&table[choi ce/4].property_null[table[choice/4].property_num]!=2)
{
gotoxy(4,12+table[choice/4].property_num);printf("您的选择有误,按任意键重新选择......\n");
getch();
}
else propertynull_is_right=1;
}//是否允许为空while
//是否为主键
int propertypropertykey_is_right=0;
while(!propertypropertykey_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 请填写表%s新增加的属性:\n",table[choice/4].table_name);
printf("\n");
printf(" ---------------------------\n");
printf("属性名属性类型是否允许为空是否为主键\n");
printf("(1=int 2=float)(1=是 2=否) (1=是 2=否)\n");
printf(" ----------------------------------\n");
for(int m=0;m<table[choice/4].property_num;m++)
{
gotoxy(4,10+m);printf("属性%2d: %-10s %d %d %d\n",m+1,
table[choice/4].property_name[m],table[choice/4].property_type[m],table[choice/4] .property_null[m],table[choice/4].property_key[m]);
}
printf(" 属性%2d: %-15s %d %d",table[choice/4].property_num+1,
table[choice/4].property_name[table[choice/4].property_num],
table[choice/4].property_type[table[choice/4].property_num],
table[choice/4].property_null[table[choice/4].property_num]);
gotoxy(61,10+table[choice/4].property_num);scanf("%d",&table[choice/4].property_k ey[table[choice/4].property_num]);
//判断选择是否为主键是否正确
if(table[choice/4].property_key[table[choice/4].property_num]!=1&&table[choic e/4].property_key[table[choice/4].property_num]!=2)
{
gotoxy(4,12+table[choice/4].property_num);printf("您的选择有误,按任意键重新选择......\n");
getch();
}
else propertypropertykey_is_right=1;
//主键的非空属性应该为不允许空
if(table[choice/4].property_key[table[choice/4].property_num]==1&&table[choice/4] .property_null[table[choice/4].property_num]==1)
{
table[choice/4].property_null[table[choice/4].property_num]=2;
gotoxy(4,12+table[choice/4].property_num);printf("该属性设为主键,因此改为不允许为空,按任意键继续......\n");
getch();
system("cls");
printf("\n\n\n");
printf(" 请填写表%s新增加的属性:\n",table[choice/4].table_name);
printf("\n");
printf(" ------------\n");
printf(" 属性名属性类型
是否允许为空是否为主键\n");
printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n");
printf(" ---------------------------\n");
for(int m=0;m<table[choice/4].property_num;m++)
{
gotoxy(4,10+m);printf("属性%2d: %-10s %d %d %d\n",m+1,
table[choice/4].property_name[m],table[choice/4].property_type[m],table[choice/4]
.property_null[m],table[choice/4].property_key[m]);
}
printf(" 属性%2d: %-15s %d %d %d\n",table[choice/4].property_nu
m+1,
table[choice/4].property_name[table[choice/4].property_num],
table[choice/4].property_type[table[choice/4].property_num],
table[choice/4].property_null[table[choice/4].property_num],
table[choice/4].property_key[table[choice/4].property_num]);
}
}//是否为主键while
//记录操作
int year,mon,day,hour,min,sec;
getcurrenttime(&year,&mon,&day,&hour,&min,&sec);
fprintf(alfp2,"\n[%d年%d月%d日%d:%d:%d]执行如下操作:\n",year,mon,day,hour,min,sec);
fprintf(alfp2,"添加属性成功,表%s中添加了一条新属性,属性名为%s,",table[choice/4].table_name,table[choice/4].property_name[table[choice/4].p roperty_num]);
if(table[choice/4].property_type[table[choice/4].property_num]==1)
fprintf(alfp2,"属性类型为:int,");
else fprintf(alfp2,"属性类型为:char,");
if(table[choice/4].property_null[table[choice/4].property_num]==1)
fprintf(alfp2,"允许为空,");
else fprintf(alfp2,"不允许为空,");
if(table[choice/4].property_key[table[choice/4].property_num]==1)
fprintf(alfp2,"该属性为主键\n");
else fprintf(alfp2,"该属性不为主键\n");
//添加属性成功
printf("
--------------------------------------------------------------\n");
table[choice/4].property_num++;
gotoxy(4,12+table[choice/4].property_num);printf("添加属性成功,按任意键返回......\n");
getch();
menu();
break;
}//case2
case 3:// step4:删除属性
{
if(table[choice/4].property_num==0)
{
system("cls");
gotoxy(4,3);printf("没有可删除的属性,按任意键返回......");
getch();
menu();
}
else
{
int choice2_is_right=0;
int choice2;
while(!choice2_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 表%s中的属性有:\n\n",table[choice/4].table_name);
printf("---------------------------------------------printf(" ");
for(int p=0;p<table[choice/4].property_num;p++)
printf("属性%2d ",p+1);
printf("\n\n");
printf(" 属性名: ");
for(p=0;p<table[choice/4].property_num;p++)
printf("%-15s",table[choice/4].property_name[p]);
printf("\n-------------------------------\n\n");
printf(" 请输入您想删除的属性号
(1-%d):",table[choice/4].property_num);
gotoxy(33,12);scanf("%d",&choice2);
if(choice2<1||choice2>table[choice/4].property_num)
{
gotoxy(4,14);printf("您的选择有误,按任意键重新选择......");
getch();
}
else choice2_is_right=1;
}//删除属性while
//记录操作
int year,mon,day,hour,min,sec;
getcurrenttime(&year,&mon,&day,&hour,&min,&sec);
fprintf(alfp2,"\n[%d年%d月%d日 %d:%d:%d]执行如下操作:\n",year,mon,day,hour,min,sec);
fprintf(alfp2,"删除成功,表%s的属性%s被删除\n",table[choice/4].table_name,table[choice/4].property_name[choice2-1]);
//删除属性成功
gotoxy(4,14);printf("删除属性%s成功,按任意键返回......",table[choice/4].property_name[choice2-1]);
for(int q=choice2-1;q<table[choice/4].property_num-1;q++)
for(int r=0;r<10;r++)
table[choice/4].property_name[q][r]=table[choice/4].property_name[q+1][r];
table[choice/4].property_num--;
getch();
menu();
break;
}
}//case 3
case 0:// step5:修改属性
{
if(table[choice/4-1].property_num==0)
{
system("cls");
gotoxy(4,3);printf("没有可修改的属性,按任意键返回......");
getch();
menu();
}
else
{
int choice3_is_right=0;
int choice3;
while(!choice3_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 表%s中的属性有:\n\n",table[choice/4-1].table_name);
printf(" ------------------\n");
printf(" ");
for(int p=0;p<table[choice/4-1].property_num;p++)
printf("属性%2d ",p+1);
printf("\n\n");
printf(" 属性名:");
for(p=0;p<table[choice/4-1].property_num;p++)
printf("%-15s",table[choice/4-1].property_name[p]);
printf("\n ---------------\n\n");
printf(" 请输入您想修改的属性号(1-%d):",table[choice/4-1].property_num);
gotoxy(33,12);scanf("%d",&choice3);
if(choice3<1||choice3>table[choice/4-1].property_num)
{
gotoxy(4,14);printf("您的选择有误,按任意键重新选择......");
getch();
}
else choice3_is_right=1;
}//删除属性while
//属性名
char newpropertyname[10];
int propertyname_is_right=0;
while(!propertyname_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 请输入属性%s的新性质:\n",table[choice/4-1].property_name[choice3-1]);
printf("\n");
printf(" ------------------------\n");
printf(" 属性名属性类型是否允许为空是否为主键\n");
printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n");
printf(" ----------------------\n");
gotoxy(4,10);printf("原性质: %-10s %d %d %d\n",table[choice/4-1].property _name[choice3-1],
table[choice/4-1].property_type[choice3-1],table[choice/4-1].property_null[ch oice3-1],table[choice/4-1].property_key[choice3-1]);
printf(" 新性质:");
gotoxy(15,11);scanf("%s",&newpropertyname);
//判断属性名是否已经存在
int propertyname_is_equal=0;
for(int l=0;l<table[choice/4-1].property_num;l++)
{
if(l!=choice3-1)
{
if(compare(newpropertyname,table[choice/4-1].property_name[l])==0)
propertyname_is_equal=1;
}
}
if(propertyname_is_equal>0)
{
gotoxy(4,13);printf("表中已经存在名为%s的属性,按任意键重新输入......\n",newpropertyname);
getch();
}
else
propertyname_is_right=1;
}//属性名while
//属性类型
int newpropertytype;
int propertytype_is_right=0;
while(!propertytype_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 请输入属性%s的新性质:\n",table[choice/4-1].property_name[choice3-1]);
printf("\n");
printf(" ------------------------\n");
printf(" 属性名属性类型是否允许为空是否为主键\n");
printf(" (1=int 2=float) (1=
是 2=否) (1=是 2=否)\n");
printf(" --------------------\n");
gotoxy(4,10);printf("原性质: %-10s %d %d %d\n",table[choice/4-1].property
_name[choice3-1],
table[choice/4-1].property_type[choice3-1],table[choice/4-1].property_null[ch oice3-1],table[choice/4-1].property_key[choice3-1]);
printf(" 新性质: %-15s",newpropertyname);
gotoxy(31,11);scanf("%d",&newpropertytype);
//判断选择的属性类型是否正确
if(newpropertytype!=1&&newpropertytype!=2)
{
gotoxy(4,13);printf("您选择的数据类型有误,按任
意键重新选择......\n");
getch();
}
else propertytype_is_right=1;
}//属性类型while
//是否允许为空
int newpropertynull;
int propertynull_is_right=0;
while(!propertynull_is_right)
{
system("cls");
printf("\n\n\n");
printf(" 请输入属性%s的新性质:\n",table[choice/4-1].property_name[choice3-1]);
printf("\n");
printf(" ------------------------------\n");
printf(" 属性名属性类型
是否允许为空是否为主键\n");
printf(" (1=int 2=float) (1=是 2=否) (1=是 2=否)\n");
printf(" -------------------------\n");
gotoxy(4,10);printf("原性质: %-10s %d %d %d\n",table[choice/4-1].property
_name[choice3-1],
table[choice/4-1].property_type[choice3-1],table[choice/4-1].property_null[ch oice3-1],table[choice/4-1].property_key[choice3-1]);
printf(" 新性质: %-10s %d",newpropertyname,newpropertytype);。

相关文档
最新文档