版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《数据库管理系统原理与设计》课程设计华中农业大学计算机科学系11级学号:20113102005**姓名:魏*20113102005**何*20113102005**陶*一、系统主要功能模块CreateSchemaRcg():识别CREATESCHEMA语句,并记录紧跟其后的模式(将被创立文件夹)名称。CreateTableRcg():识别CREATETABLE语句,记录紧跟其后的表名称并修改标志Flag。CREATETABLE():根据CreateTableRcg()记录的表名在指定目录下创立文本以保存表的根本信息。InsertRcg():识别ISERT语句,记录被插入表的表名并修改标志Flag。INSERT():根据InsertRcg()中记录的表名,在相应表〔文本〕中按一定的规定插入相关信息。SelectRcg():识别SELECT语句,记录要选的属性及所属表的表名,并且修改标志Flag。SELECT():根据SelectRcg()中记录的相关内容在指定目录下创立文本以保存查询的内容。DropTableRcg():识别DROP语句,记录要删除的表的表名并且修改标志Flag。DROPTABLE():根据DropTableRcg()中的记录删除相应得表〔文本〕。DropSchemaRcg():识别DROPSCHEMA语句,记录要删除的模式名称并修改标志Flag。DROPSCHEMA():根据DropSchemaRcg()中的记录删除相应的模式。EXIT():识别EXIT语句并修改标志Flag。简单的异常处理机制,如有语法错误提示错误并给用户重新输入的时机。二、技术路线和实现方法技术:1.字符串处理:SQL语句以字符串形式接受,然后进行匹配,匹配失败提示错误信息,假设匹配成功那么进入相应功能模块,对字符串进行解析,抽取其中关键单词存入事先定义好的容器内,然后进行相应操作。2.文件操作:创立目录〔创立文件夹〕、在指定目录下创立文本文件、向指定目录下的文件内写入内容、从指定目录下的文本中读取内容、在指定目录下删除指定文件、删除指定目录〔该目录必须为空,否那么先递归删除目录下的文件或文件夹,再删除该目录〕。3.参数的传递:全局变量,局部变量交替使用,地址传递和值传递。4.程序整体架构模块化思路清晰,对于每个操作都有功能两个模块,一个进行匹配,一个那么在匹配成功的根底上完成操作。5.其中参加一些包括路径的拼接、界面简单处理等实现方法:1.对字符串的解析:程序内部有事先定义好的标准语句如CREATESCHEMAschemanameCREATETABLEtablenameINSERT等。在接受字符串后,将标准语句放到字符串中匹配,如果匹配成功就返回程序要选择的操作类型和相关文件信息。在操作模块中再对语句进行深度剖析,抽取要进行操作的详细信息。如:CREATETABLESTUDENT(IDCHAR(10),NAMECHAR(12),AGEINT,MERCHAR(5),COURSECHAR(10));创立一个结构体数组structList{ charListName[10];//存放ID,NAME等属性信息;charValueType[10];//存放属性对应值的类型如CHAR或INT; intLen;//记录值的大小长度如char(10)长度限制为10个字符;};根据语句规那么从中抽取出相关信息存放到结构体数组中,接下来就能从数组中取出相关信息进行具体操作。文件操作:这其实是一件相当麻烦的一件事情,难点在于我们抽取得到的文件夹和文件路径都存在字符串变量中,并且仅仅是文件和文件夹得最后一层目录,要得到文件、文件夹的完整目录就要对目录进行拼接,所以先给模式指定一个目录,之后该模式下建的表就存在该目录下,再对文件操作的过程中一般参数都是直接路径而不是变量表示,可以用fstream文件流操作,也可以用系统命令system等其他方法。在对匹配成功后选择操作过程采用switchcase结构:减少了不必要的匹配过程和操作过程降低了时间复杂度。同时保证了各个功能的执行可以是无序的。While〔〕{匹配1;匹配2;......Switch(flag){Case0:操作0Case1:操作1Case2:操作2....}}运行效果 1.用户界面 3.创立模式后会在桌面出现一个模式名命名的文件夹,用来存放该模式下创立的表创立表,在当前模式下创立表,那么在对应文件夹内生成以表名命名的文本文件 插入数据,执行后会在相应文本内增加插入内容查询,输入查询在桌面生成文件SELECT,后续查询结果统一放在桌面文件SELECT中删除表,执行后会在当前模式下删除相应表,即在文件夹中以表名命名的文本被删除 9.删除表删除模式,如果要删除的模式内有表存在,那么先删除该模式下所有的表,再删除模式,即先删除对应文件夹内所有文本,再删除空的文件夹EXIT退出并保存相关内容程序流程图Sql语句标准CREATESCHEMAweijunDBCREATESCHEMAXXXXCREATETABLESTUDENT(IDCHAR(10),NAMECHAR(12),AGEINT,MERCHAR(5),COURSECHAR(10));无主码,记录可重复CREATETABLECOURSE(IDCHAR(10),NAMECHAR(12),TEACHERCHAR(20),ROOMCHAR(10),NUMINT);CREATETABLEXXXX(XXCHAR(10),XXCHAR(12),XXCHAR(20),XXCHAR(10),XXINT...);INSERTINTOSTUDENT(ID,NAME,AGE,MER,COURSE)VALUES('00507','weijun',15,'NO','ENGLISH')INSERTINTOSTUDENT(ID,NAME,AGE,MER,COURSE)VALUES('00508','WANG',50,'NO','MATH')INSERTINTOSTUDENT(ID,NAME,AGE,MER,COURSE)VALUES('00506','HUANG',90,'YES','CHINESE')SELECTID,NAME,AGE,MERFROMSTUDENT属性有序SELECTID,NAMEFROMSTUDENTDROPTABLESTUDENTDROPTABLECOURSEDROPSCHEMAweijunDBEXIT源代码#include<iostream>#include<string>#include<fstream>#include<cstring>#include<windows.h>#include<direct.h>#include<stdlib.h>#include<stdio.h>usingnamespacestd;chardatabasename[10];//模式名路径连接时用到charDirLoc[]="C:\\Users\\Administrator\\Desktop\\\0";//指定路径intl;///////////////////////////////////////////////////////////////////////////识别CREATEDATABASE/////////////////////////////////////////////////////////////////////////voidCreateSchemaRcg(charoperationDB[],int&Flag,charFileName[]){ intflag=0;inti,j; charCreateSchema[15]="CREATESCHEMA";//匹配CREATESCHEMA for(i=0;i<=13;i++) {if(operationDB[i]==CreateSchema[i]) {flag=1; } else { flag=0; break; } } if(flag==1) { Flag=1; for(i=14,j=0;;i++,j++) { if(operationDB[i]!='\0') { FileName[j]=operationDB[i];//抽取模式名 databasename[j]=operationDB[i]; }else{FileName[j]='\0';databasename[j]='\0';break;} } }}/////////////////////////////////////////////////////////////////////////识别CREATETABLE///////////////////////////////////////////////////////////////////////voidCreateTableRcg(charoperation[],int&Flag,charFileName[]){Flag=0;inti,j,k;intflag=0;charCreateTable[14]="CREATETABLE";//匹配CREATETABLEfor(i=0;i<30;i++)FileName[i]='';for(k=0;k<10;k++){if(databasename[k]!='\0'){FileName[k]=databasename[k];}else{FileName[k]='\\';//路径连接**********************************************break;}} for(i=0;i<=12;i++) {if(operation[i]==CreateTable[i])//匹配CREATETABLE {flag=1; } else { flag=0; break; } } if(flag==1) { Flag=2;//返回操作类型 for(i=13,k=k+1;;i++,k++) { if(operation[i]!='\0') { FileName[k]=operation[i]; }else{FileName[k]='\0';break;} } FileName[k]='.'; FileName[k+1]='t';//给文件名加尾椎,txt及文本文件 FileName[k+2]='x'; FileName[k+3]='t'; FileName[k+4]='\0'; } //weijunDB\\STUDENT.txt**************连接后的文件目录}////////////////////////////////////////////////////////////////////创立TABLE/////////////////////////////////////////////////////////////////voidCREATETABLE(charFileName[],int&Flag){structList{ charListName[10];charValueType[10];//存储表的相关信息 intLen;};charCreateTableSql[100];charFileLoc[65];inti,j,k,m;cin.getline(CreateTableSql,100,';');Listlist[10]={{"","",0},{"","",0},{"","",0},{"","",0},{"","",0},{"","",0},{"","",0},{"","",0},{"","",0},{"\n","",0},//初始化结构体数组};//最多只能有10个属性列for(i=0;i<50;i++){if(DirLoc[i]!='\0')FileLoc[i]=DirLoc[i];elsebreak;}for(j=0;j<30;j++,i++){if(FileName[i]!='\n')FileLoc[i]=FileName[j];//连接,拼出文件完整路径elsebreak;}if(CreateTableSql[0]!='('||CreateTableSql[strlen(CreateTableSql)-1]!=')'){Flag=0;//简单检测语法错误}elseif(Flag!=0)//没语法错误,解析字符串,进行表相关信息抽取{{m=1,k=0;j=0; for(i=0;i<strlen(CreateTableSql);i++) {if(CreateTableSql[i]==''&&((CreateTableSql[i-1]>='a'&&CreateTableSql[i-1]<='z')||(CreateTableSql[i-1]>='A'&&CreateTableSql[i-1]<='Z'))){m=2;k=0;continue;}if(CreateTableSql[i]==','){m=1;k=0;j++;continue;}if(CreateTableSql[i]==';')break;if((CreateTableSql[i]>='a'&&CreateTableSql[i]<='z')||(CreateTableSql[i]>='A'&&CreateTableSql[i]<='Z'))//如果遇到字母那么开始识别并抽取相关信息{if(m==1){list[j].ListName[k]=CreateTableSql[i];k++;}if(m==2){list[j].ValueType[k]=CreateTableSql[i];k++;}continue;} }}//下面创立文件,存储表信息ifstreaminf;ofstreamouf;inf.open(FileLoc,ios::out);if(inf!=0)cout<<endl<<FileName<<"已经创立!"<<endl<<endl;if(inf==0)//如果表不存在,就创立{inf.close();ouf.open(FileLoc);if(ouf)cout<<endl<<FileName<<"创立成功!"<<endl<<endl;fstreamTABLE(FileName,ios_base::out|ios_base::app);for(intx=0;x<=9;x++){TABLE<<list[x].ListName;}TABLE<<endl;Flag=0;}//system("notepadSTUDENT.txt");}elsecout<<endl<<"语法错误!"<<endl<<endl;Flag=0;}//////////////////////////////////////////////////////////////////////////识别INSERT/////////////////////////////////////////////////////////////////////voidInsertRcg(charoperation[],int&Flag,charFileName[]){for(inti=0;i<30;i++)FileName[i]='';//文件名初始化if(Flag==0){ charInsert[8]="INSERT"; intflag=0; for(inti=0;i<6;i++) {if(operation[i]==Insert[i])//匹配INSERT {flag=1; } else { flag=0; break; } } if(flag==1) Flag=3;//匹配正确,返回操作类型}}///////////////////////////////////////////////////////////////////////////INSERT实现///////////////////////////////////////////////////////////////////////voidINSERT(int&Flag){charInsertSqlType[100];//INTO后面语句charInsertSqlValue[100];//VALUES后面的语句charfilename[30]="";cin.getline(InsertSqlType,100,'\n');cin.getline(InsertSqlValue,100,'\n');charFileName[20]="";charInto[6]="INTO";charValues[7]="VALUES";inti,j,k;structData{chartype[10];charvalue[10];//存储将要插入信息的属性和类型};Datadata[10]={{"",""},{"",""},{"",""},{"",""},{"",""},{"",""},{"",""},{"",""},{"",""},{"",""},};for(i=0,j=0;i<100;i++,j++){if(i<5){if(Into[i]==InsertSqlType[i])Flag=7;else{Flag=0;}j--;continue;}elseif(Flag!=0){if((InsertSqlType[i]>='a'&&InsertSqlType[i]<='z')||(InsertSqlType[i]>='A'&&InsertSqlType[i]<='Z'))FileName[j]=InsertSqlType[i];if(InsertSqlType[i]==''){FileName[j]='\0';break;}//抽取文件名continue;}}for(j=0,k=0;i<100;i++,j++){if((InsertSqlType[i]>='a'&&InsertSqlType[i]<='z')||(InsertSqlType[i]>='A'&&InsertSqlType[i]<='Z'))data[k].type[j]=InsertSqlType[i];//抽取属性信息if(InsertSqlType[i]==','){j=-1;k++;}if(InsertSqlType[i]==')')break;}k=0;for(i=0,j=0;i<100;j++,i++){if(i<6){j--;if(Values[i]==data[k].type[j])Flag=7;elseFlag=0;continue;}if(InsertSqlValue[i]==','){k++;j=-1;continue;}if((InsertSqlValue[i]>='a'&&InsertSqlValue[i]<='z')||(InsertSqlValue[i]>='A'&&InsertSqlValue[i]<='Z')||(InsertSqlValue[i]>='0'&&InsertSqlValue[i]<='9')){data[k].value[j]=InsertSqlValue[i];//抽取即将插入数据的值continue;}if(InsertSqlValue[i]==')')break;j--;}for(k=0;k<10;k++){if(databasename[k]!='\0'){filename[k]=databasename[k];}else{filename[k]='\\';//路径操作同上*****************************break;}} for(i=0,k=k+1;;i++,k++) { if(FileName[i]!='\0') { filename[k]=FileName[i]; }else{filename[k]='\0';break;} } filename[k]='.'; filename[k+1]='t'; filename[k+2]='x'; filename[k+3]='t'; filename[k+4]='\0'; fstreamSTUDENT(filename,ios_base::out|ios_base::app);for(intx=0;x<=9;x++)//向已存在文本中参加新的数据记录{STUDENT<<data[x].value;}STUDENT<<endl;cout<<endl<<"插入记录成功!"<<endl<<endl;//system("notepadSTUDENT.txt");}////////////////////////////////////////////////////////////////////////////SELECT识别//////////////////////////////////////////////////////////////////////////voidSelectRcg(charoperation[],int&Flag,charFileName[],chartype[10][10]){charselect[]="SELECT\0";inti,j,k;for(i=0;i<30;i++)FileName[i]='';for(i=0,j=0,k=0;i<40;i++){if(i<=6){if(operation[i]==select[i])//匹配"SELECT\0"Flag=6;else{Flag=0;break;}}else{if((operation[i]>='a'&&operation[i]<='z')||(operation[i]>='A'&&operation[i]<='Z')){type[k][j]=operation[i];//将要查询的属性列抽取出来存入type[][]j++;continue;}if(operation[i]==','){type[k][j]='\0';k++;l=k;j=0;continue;}if(operation[i]=='\n'){type[k][j]='\0';break;}}}}////////////////////////////////////////////////////////////////////////////SELECT实现//////////////////////////////////////////////////////////////////////////voidSELECT(charFileName[],int&Flag,chartype[10][10]){charfrom[]="FROM\0";charselectfilename[20];inti,j,k;charFileLoc[65];cin.getline(selectfilename,20,'\n');for(k=0;;k++){if(DirLoc[k]!='\0')FileName[k]=DirLoc[k];//提取文件名elsebreak;}for(i=0;;k++,i++){if(databasename[i]!='\0')//路径操作************************{FileName[k]=databasename[i];}else{FileName[k]='\\';break;}}for(k++,i=0;i<20;i++){if(i<=4){if(selectfilename[i]==from[i])Flag=6;else{Flag=0;break;}}else{if((selectfilename[i]>='a'&&selectfilename[i]<='z')||(selectfilename[i]>='A'&&selectfilename[i]<='Z')){FileName[k]=selectfilename[i];k++;continue;}if(selectfilename[i]='\n')break;if(selectfilename[i]='\0')continue;}}FileName[k]='.'; FileName[k+1]='t'; FileName[k+2]='x'; FileName[k+3]='t';FileName[k+4]='\0';///////////////////////抽取工作已完成,下面为查询过程。/////////////////////////////////ifstreamfin;//读取文件中内容charbuff[10][100];//用来存放从文件中读出内容k=0;fin.open(FileName,ifstream::in);//翻开文件while(fin.good()){fin.getline(buff[k],200);//每次读一行存入buff[k]//cout<<"*****"<<buff[k]<<"****"<<endl;//打印在屏幕上k++;}//cout<<k<<endl;fin.close();/*for(j=0;j<10*l;j++)cout<<buff[0][j];cout<<endl;for(j=0;j<10*l;j++)cout<<"";//保证第二行为空行cout<<endl;for(i=2;i<k;i++){for(j=0;j<10*l;j++)cout<<buff[i][j];cout<<endl;//打印在屏幕上}*////////////////////////////////////////////////////////////////////////////////////for(i=0;i<50;i++){if(DirLoc[i]!='\0')FileLoc[i]=DirLoc[i];elsebreak;}for(j=0;j<30;j++,i++){if(FileName[i]!='\n')FileLoc[i]=FileName[j];//文件路径操作elsebreak;}ifstreaminf;ofstreamouf;inf.open("C:\\Users\\Administrator\\Desktop\\SELECT.txt",ios::out);if(inf==0){inf.close();ouf.open(dir);if(ouf)cout<<endl<<"查询成功!"<<endl<<endl;fstreamTABLE(dir,ios_base::out|ios_base::app);for(j=0;j<10*l;j++)TABLE<<buff[0][j];//查询结果写入文本中TABLE<<endl;for(j=0;j<10*l;j++)TABLE<<"";//保证第二行为空行TABLE<<endl;for(i=2;i<k-1;i++){for(j=0;j<10*l;j++)TABLE<<buff[i][j];TABLE<<endl;}Flag=0;//system("notepadSTUDENT.txt");}elsecout<<endl<<"语法错误!"<<endl<<endl;Flag=0;}///////////////////////////////////////////////////////////////////////////////DROPTABLE识别/////////////////////////////////////////////////////////////////////////voidDropTableRcg(charoperation[],int&Flag,charFileName[]){if(Flag==0){for(intp=0;p<20;p++){FileName[p]='';}//FileName="";Flag=0; intflag=0;inti,j; charDropTable[12]="DROPTABLE"; for(i=0;i<=10;i++) {if(operation[i]==DropTable[i])//匹配"DROPTABLE" {flag=1; } else { flag=0; break; } } if(flag==1) { Flag=4; for(j=0;;i++,j++) { if(operation[i]!='\0') { FileName[j]=operation[i];//抽取文件名称 }else{FileName[j]='\0';break;} } }}}//////////////////////////////////////////////////////////////////////////DropTable实现////////////////////////////////////////////////////////voidDROPTABLE(charFileName[],int&Flag){inti,j=0;chartable[]="STUDENT\0";for(i=0;i<7;i++){if(table[i]==FileName[i])j++;}if(j==7)system("DEL/fweijunDB\\STUDENT.txt");//调用系统功能删除表elsesystem("DEL/fweijunDB\\COURSE.txt");cout<<endl<<"成功删除"<<FileName<<"表!"<<endl<<endl;}///////////////////////////////////////////////////////////////////////////////DROPDATABASE识别/////////////////////////////////////////////////////////////////////////voidDropSchemaRcg(charoperationDB[],int&Flag,charFileName[]){if(Flag==0){for(intp=0;p<20;p++){FileName[p]='';}//FileName="";Flag=0; intflag=0; inti,j; charDropSchema[13]="DROPSCHEMA"; for(i=0;i<=11;i++) {if(operationDB[i]==DropSchema[i])//匹配"DROPSCHEMA" {flag=1; } else { flag=0; break; } } if(flag==1) { Flag=5; for(j=0;;i++,j++) { if(operationDB[i]!='\0') { FileName[j]=operationDB[i]; }else{FileName[j]='\0';//抽取模式名break;} } }}}//////////////////////////////////////////////////////////////////////////DropDATABASE实现////////////////////////////////////////////////////////voidDROPSCHEMA(charFileName[],int&Flag){system("DEL/fweijunDB\\STUDENT.txt");system("DEL/fweijunDB\\COURSE.txt");system("DEL/fSELECT.txt");//先删除文件再删除空的文件夹system("RMDIRweijunDB");Flag=7;cout<<endl<<"成功删除模式"<<FileName<<"!"<<endl<<endl;}/////////////////////////////////////////////////////////////////EXIT退出//////////////////////////////////voidEXIT(charoperation[],int&Flag){charEXIT[5]="EXIT"; for(inti=0;i<=4;i++) {if(operation[i]==EXIT[i]) {Flag=7; } else { Flag=0; cout<<endl<<"语法错误!请重新输入!"<<endl<<endl; break; } }}/////////////////////////////////////////////////////////////////////////////主函数///////////////////////////////////////////////////////////////////////intmain(){system("color0A");//控制背景和字体颜色cout<<"-----------------------------------------------"<<endl;cout<<"||"<<endl;cout<<"|数据库课程设计|"<<endl;cout<<"||"<<endl;cout<<"|小型DBMS|"<<endl;cout<<"||"<<endl;cout<<"||"<<endl;cout<<"|魏俊何舒林陶伟峰|"<<endl;cout<<"||"<<endl;cout<<"|——2013\\06\\20|"<<endl;cout<<"-----------------------------------------------"<<endl<<endl;;cout<<"请按任意键继续...";getchar();//等待从键盘接受一个字符cout<<endl<<"欢送使用MINIDBMS系统!"<<endl<<endl;cout<<
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国结直肠癌诊疗规范重点2026
- 公厕维修改造工程施工方案设计
- 滨海广场铝板幕墙安装工程技术交底大全
- 中国基础教育改革深度分析报告(2026年):从政策文本到实践落地的系统性变革
- 2025年中国质量协会QC小组活动专业能力(初级)综合能力测试题及答案四
- 发光字施工方案
- 法制教育活动学习心得感悟范文5篇
- 乘用车企业激光落料加工配送规范(征求意见稿)
- 场址最大可信地震动评估导则-随机有限断层法征求意见稿
- 人教版九年级上册数学25.2用列举法求概率课件
- 《甘肃省自然村(组)通硬化路建设技术指南》
- 劳动课制作风筝课件
- 高标农田建设标准劳务分包合同
- 中国近现代史纲要之第六章-新
- MOOC 管理学原理-武汉理工大学 中国大学慕课答案
- 5G华为优化中级认证考试题库(浓缩500题)
- AI技术对教育的影响
- 以就业为导向的技工院校人才培养模式
- 2019年12月大学英语三级(A级)真题试卷(题后含答案及解析)
- EPC总承包项目采购方案
- 压花艺术课件
评论
0/150
提交评论