1、山 东 科 技 大 学课 程 设 计 任 务 书软件工程 专业2011 级 2班一、 课程设计题目:数据库系统课程设计 二、 设计原始资料:数据库系统概论 三、 设计应解决下列各主要问题:1.选择一种高级语言实现下列语句的功能:CREATE TABLE (, )ALTER TABLE ADD DROPMODIFY 四、 设计说明书应有下列图纸: 1.实现界面图 2.流程图3.功能结构图五、命题发出日期:2013年03月27日 设计应完成日期:2013年06月21日 设计指导教师(签章):系主任(签章):指导教师对课程的评语指导教师(签章):年月日25摘要本课程设计实现的是用C+实现SQL语句中
2、的CREATE TABLE以及ALTER TABLE的命令的部分功能。实现过程通过编写若干个函数一次实现了命令识别、命令格式化、命令分解、命令判断对错等功能。对于表的结构,定义了相应的Table类,以及Column类,分别表示表的内容以及表中每列的结构。由于水平有限,本次设计没有定义表级完整性约束,仅仅定义了列的完整性约束条件PRIMARY KEY以及UNIQUE代表部分列完整性约束,其他约束条件基本类似,没有做过多定义。对于每个元组中的各数据类型定义了四类INT、DOUBLE、CHAR、CHAR(n)。由于表的元组个数是不固定的,使用了vector来定义一个Column向量,实现了可以无限添
3、加表的长度。同时由于vector的使用增加了存储文件的难度,重写了写入文件的操作,实现了文件的任意存储。对于命令的识别过程,使用string的相关操作,避免了使用char*会产生的指针操作的复杂性。通过适当的替换将命令分解为由若干空格分隔的词组。每次识别一个词组,可以方便的识别与存储相关操作。借鉴了Java的编程规范,使得整体的设计显得简洁,避免了指针操作容易产生的错误,同时更容易理解设计的具体操作。关键字:vector;类;命令识别;C+;数据字典目录1设计题目11.1所选题目11.2 设计要求11.3 开发环境12需求分析22.1题目分析22.2功能需求分析22.3数据流程分析33.设计4
4、3.1 设计思想43.2 整体设计43.3 详细设计54.实现64.1 基本界面64.2 输入建表命令64.3 修改语句75.总结86.参考文献9附录101设计题目1.1所选题目1.选择一种高级语言实现下列语句的功能:CREATE TABLE (, )ALTER TABLE ADD DROPMODIFY 1.2 设计要求(1) 能够以命令方式执行; (2) 能够以程序方式执行;(3) 提供课程设计报告。1.3 开发环境操作系统: Windows 7;集成开发工具:Code:Blocks 10.05;开发语言: C/C+。2需求分析2.1题目分析脱离已有数据库环境,采用C+实现SQL语言中的CR
5、EATE TABLE以及 ALTER TABLE中的如下功能。CREATE TABLE (, )ALTER TABLE ADD DROPMODIFY 例:(1) 建立一个课程表Cno:课程编号;Cname:课程名; Ccredit:学分。CREATE TABLE Course(Cno DOUBLE PRIMARY KEY,Cname CHAR(40),Ccredit INT);系统执行上面的CREATE TABLE语句后,就在数据库中建立一个新的空“课程”表“Course”,并将有关“课程”表的定义及有关约束条件存放在数据字典中。(2) 修改基本表修改“Course”表,增加“学时”列,其数据
6、类型为整型。ALTER TABLE Course ADD Ctime INT;2.2功能需求分析用CREATE TABLE语句创建基本表:建表的同时定义与该表有关的完整性约束条件,并将这些完整性约束条件存入到系统的数据字典里。 用ALTER TABLE语句修改基本表:ADD子句用于增加新列和新的完整性约束条件,DROP子句用于删除指定的完整性约束条件,MODIFY子句用于修改原有的列定义,包括修改列名和数据类型。2.3数据流程分析用户根据自己的需求,定义自己的数据表名及各个属性组及其数据类型,程序将数据表信息存入文件。开始数据表创建完成后用户可通过数据表的修改功能对表进行增、删、改的操作,以添
7、加或修改表的信息,并存入文件。N结束依据命令建立基本表或者修改基本表SQL命令是否匹配输入SQL命令YY图13.设计3.1 设计思想(介绍DBMS原型系统具有的功能以及性能要求)将DBMS的CREATE语句和ALTER语句的命令分别用C+中的函数实现,建立几个头文件,实现如下功能:main.h /程序入口并定义对输入字符串的处理myTable.h /包含实现建立表以及修改表的函数myFunc.h /定义一些关键字以及相应操作关键字的函数myFile.h /实现向文件中写入数据以及读取文件数据myClass.h /定义表的结构以及表中列的结构catchType.h /定义了一个判断表中数据类型的
8、函数3.2 整体设计CREATE?开始输入命令并对命令的进行格式化处理输出命令错误,并要求重新输入NYALTER?执行CreatProc建表在读取命令过程中出现错误就结束程序,并返回相应错误,最终无错误就建立表,并存储在D:TAB.xdb中Y读取D:TAB.xdb文件,在读取命令过程中出现错误就结束程序,并返回相应错误,最终无错误就建立表,进行修改表并重新存储图2结束3.3 详细设计数据存储结构(介绍关系表的物理存储结构、数据编码方法)class Column /表中每一列的结构public: Column() /构造函数进行初始化 strLength = 0; priKey = 0; uni
9、Key = 0; string cname; /该列的字段名 string attribute; /该列的属性 int strLength; /当属性为字符串时规定字符串/不允许超出strLength的长度 int priKey; /当为1表示为 完整性约束PRIMARY KEY int uniKey; /当为1表示为 完整性约束UNQUE vector intkey; /存储数值类型为int的数据 vector chkey; /存储数值类型为char的数据 vector doukey; /存储数值类型为double的数据 vector charkey;/存储数值类型为string的数据,且规
10、定不允/许超出strLength的长度;class Table /表的结构,一些具体函数实现未列出,private: string tableName; int colLen;public:vector col;;bool CreatProc(const string &s)/创建基本表bool AlterProc(const string &s)/修改基本表void outFile(Table &tab) /将表tab存储到文件中void inFile(Table &tab) /从把文件中的数据读取到tab中/表中的数据存储在D:TAB.xdb中4.实现4.1 基本界面图34.2 输入建表命
11、令以CREATE TABLE Course(Cno DOUBLE PRIMARY KEY,Cname CHAR(40),Ccredit INT);为例,如图4图4文件结构见图5图54.3 修改语句ALTER TABLE Course ADD Ctime INT;见图6图6文件结构见图7图7其他修改语句(DROP、MODIFY)与词句类似,在此不再一一罗列。5.总结本次数据库课程设计用了近三个月的时间,基本实现了Create table以及Alter table的功能。对于输入命令的识别过程中用到了C+中string类型的相关知识,由于起初string不太会用导致了很多错误,通过上网查阅相关资料
12、将问题一一解决。对于表中的列,以及列中的属性的定义,用到了容器中的vector的概念。通过翻看一些实例以及多次的修改等,逐渐掌握了vector的使用方法。起初在对文件操作的时候由于没有考虑到vector的可变因素,使用了ostream中writer的操作,导致数据的丢失以及不可控制,后来通过专门写了对于表结构的存储方法将问题解决。文件存储的结构,对于用到的字符串前面都有相应的字符串的长度,方便调用。对于列完整性约束,定义了0与1,通过识别相应的数字判断是否为相应的约束条件,0代表不是,1代表是约束条件。本次课程设计借鉴了Java中的一些编程技巧,编程风格使用Java的方式,通过阅读Java相关
13、书籍使我对Java产生浓厚的兴趣,并坚定了学习Java的信念。作为软件工程的学生,在本次课程数据过程中感觉自己的编程水平严重不足,缺少锻炼。此次的课程设计让我获益匪浅,并且学会了对待问题只是细心还不够,还需要有足够的耐心才能最终做出满意的作品。6.参考文献1 数据库系统概论第四版 王珊 萨师煊编著 高等教育出版社2 疯狂Java讲义第二版 李刚编著 电子工业出版社3 C+面向对象程序设计第二版 杜茂康 李昌兵 曹慧英 王永编著 电子工业出版社附录程序代码:main.cpp#include #include #include #include #include #include myTable.
14、husing namespace std;int main() string o_str,InputString; string str_1; vector str_list; / 存放分割后的字符串 char yes_no; do system(cls); cout * endl; cout CREATE TABLE (endl ,endl endl .);endlendl ALTER TABLE ADD endl ALTER TABLE DROP endl ALTER TABLE MODIFY endl; cout * endlendl t%endl t数据类型为:INT,CHAR,DOU
15、BLE,CHAR(n)endl t列完整性约束条件为:PRIMARY KEY,UNIQUEendl t%endlendl; cout 请输入SQL命令,不区分大小写,以;结束,可以任意换行:endl; getline(cin,InputString,;); int temp = (int)InputString.size(); for(int i=0; itemp; i+) if(InputString.at(i)=n) InputString.replace(i,1,1, ); if(InputString.at(i)=() InputString.replace(i,1, ( ); i+=
16、2; temp+=2; if(InputString.at(i)=) InputString.replace(i,1, ) ); i+=2; temp+=2; if(InputString.at(i)=,) InputString.replace(i,1, , ); i+=2; temp+=2; temp = (int)InputString.size(); for(int i=0; itemp; i+) if(i!=temp-1&InputString.at(i)= &InputString.at(i+1)= ) InputString.erase(i,1); i-; temp-; if(I
17、nputString.at(0)= ) InputString.erase(0,1); temp-; InputString.replace(temp,1, ;); cout您输入的命令为:InputStringendl; string linshiStr = InputString; string linshi = make_Upper(getWord(linshiStr); if ( linshi = CREATE) if(CreatProc(InputString) cout建表成功endl; coutY_N; if (Y_N = Y|Y_N = y) Table myTab; inFi
18、le(myTab); myTab.showTable(); else cout建表失败endl; else if ( linshi = ALTER) if(AlterProc(InputString) cout修改表成功endl; coutY_N; if (Y_N = Y|Y_N = y) Table myTab; inFile(myTab); myTab.showTable(); else cout修改表失败endl; else cout您输入的命令有误endl; coutyes_no; while(yes_no=Y|yes_no=y);catchType.h#ifndef CATCHTYP
19、E_H#define CATCHTYPE_H#include #include myTable.h/判断数值数据类型bool catchType(Table &tab,string &str,int myCol) /属性类型 int char double char(n) string temp; temp = make_Upper(getWord(str); switch(isType(temp) case 0: tab.colmyCol.attribute = INT; break; case 1: /判断是为字符串还是字符类型 string tf = str,sf1,sf2,sf3; s
20、f1 = getWord(tf); sf2 = getWord(tf); sf3 = getWord(tf); int sfi; /判断字符串的位数 要求sfi20 stringstream sf; sf sfi; if (sf1 = (&sf3 = ) tab.colmyCol.attribute = STRING; tab.colmyCol.strLength = sfi; getWord(str); getWord(str); getWord(str); else tab.colmyCol.attribute = CHAR; /couttest*1*endl; break; case 2
21、: tab.colmyCol.attribute = DOUBLE; /couttest*3*endl; break; default: cout数据类型设置错误endl; return false; return true;#endif / CATCHTYPE_HmyClass.h#ifndef MYCLASS_H#define MYCLASS_H#include #include #include using namespace std;class Column /表中每一列的结构public: Column() strLength = 0; priKey = 0; uniKey = 0;
22、 string cname; /该列的字段名 string attribute; /该列的属性 int strLength; /当属性为字符串时规定字符串不允许超出strLength的长度 int priKey; /当为1表示为 完整性约束PRIMARY KEY int uniKey; /当为1表示为 完整性约束UNQUE vector intkey; /存储数值类型为int的数据 vector chkey; /存储数值类型为char的数据 vector doukey; /存储数值类型为double的数据 vector charkey; /存储数值类型为string的数据,且规定不允许超出st
23、rLength的长度;class Table private: string tableName; int colLen;public: vector col; void showTable() cout表名:getTableName()endl; int Len = (int)col.size(); for (int i = 0; iLen; i+) cout属性名:ameendl; cout类型:coli.attributeendl; cout约束条件:; if (coli.priKey = 1) cout PRIMARY KEY; if (coli.uniKey = 1) cout UN
24、IQUE; if (coli.priKey != 1&coli.uniKey != 1) cout无; coutendl; void setColLen(int Len = 0) colLen = Len; int getColLen() return colLen; string getTableName() return tableName; void setTableName(const string &str) tableName = str; ;#endif / MYCLASS_HmyFile.h#ifndef MYFILE_H#define MYFILE_H#include #in
25、clude #include myClass.husing namespace std;/写入文件操作void outFile(Table &tab) ofstream fTABout(D:TAB.xdb,ios:out); if(!fTABout) cout文件打开失败endl; exit(1); fTABouttab.getTableName().size() tab.getTableName()endl; fTABouttab.getColLen()endl; for (int i =0 ; i tab.getColLen(); i+) fTABout ame.size() ame ta
26、b.coli.attribute.size() tab.coli.attribute tab.coli.strLength tab.coli.priKey tab.coli.uniKeyendl; fTABout.close();/读取文件操作void inFile(Table &tab) Column te; char TableName50; int colLen,tabNameLen,colNameLen,colAttributeLen; ifstream fTABin(D:TAB.xdb,ios:in); if(!fTABin) cout文件打开失败tabNameLen; fTABin
27、.get(); fTABin.get(TableName,tabNameLen+1); fTABin.get(); tab.setTableName(TableName); fTABincolLen; fTABin.get(); tab.setColLen(colLen); char colName50,colAttribute50; for (int i =0 ; i colNameLen; fTABin.get(); fTABin.get(colName,colNameLen+1); fTABin.get(); ame = colName; fTABin colAttributeLen;
28、fTABin.get(); fTABin.get(colAttribute,colAttributeLen+1); fTABin.get(); tab.coli.attribute = colAttribute; fTABin tab.coli.strLength; fTABin.get(); fTABintab.coli.priKey; fTABin.get(); fTABintab.coli.uniKey; fTABin.get(); fTABin.close();#endif / MYFILE_HmyFunc.h#ifndef MYFUNC_H#define MYFUNC_H#inclu
29、de using namespace std;const string type = INT,CHAR,DOUBLE; /数值类型const string yueshu = PRIMARY,UNIQUE,),; /0,1为完整性约束,2,3为语句是否结束的约束const string endCh = ,); /属性结束符或建表结束const string alterP = ADD,DROP,MODIFY; /修改表相应的操作string make_Upper(const string &s) /输出字符串s相应的大写形式 string temp(s); for(int i=0; i(int)s
30、.length(); i+) tempi=toupper(si); return temp;/判断数值的类型int isType(const string &s) for(int i = 0; i3; i+) if(typei = s) return i; return -1;/判断约束的类型int isYueshu(const string &s) for (int i = 0; i 5; i+) if(yueshui = s) return i; return -1;/判断是否属性结束或者表结束int isEndCh(const string &s) for (int i = 0; i 2
31、; i+) if(endChi = s) return i; return -1;/判断修改表的操作int isAlter(const string &s) for (int i = 0; i 3; i+) if (alterPi = s) return i; return -1;/从特定按照空格隔开的S字符串中读取一个单词或符号string getWord(string &s) string result; result=s.substr(0,s.find( ); s.erase(0,s.find( )+1); return result;#endif / MYFUNC_HmyTable.h#ifndef MYTABLE_H#define MYTABLE_H#i
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。
Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1
陕公网安备 61072602000132号 违法和不良信息举报:0916-4228922