数据库课程设计-柳汝滕_第1页
数据库课程设计-柳汝滕_第2页
数据库课程设计-柳汝滕_第3页
数据库课程设计-柳汝滕_第4页
数据库课程设计-柳汝滕_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、山 东 科 技 大 学课 程 设 计 任 务 书软件工程 专业2011 级 2班一、 课程设计题目:数据库系统课程设计 二、 设计原始资料:数据库系统概论 三、 设计应解决下列各主要问题:1.选择一种高级语言实现下列语句的功能:CREATE TABLE (, )ALTER TABLE ADD DROPMODIFY 四、 设计说明书应有下列图纸: 1.实现界面图 2.流程图3.功能结构图五、命题发出日期:2013年03月27日 设计应完成日期:2013年06月21日 设计指导教师(签章):系主任(签章):指导教师对课程的评语指导教师(签章):年月日摘要本课程设计实现的是用C+实现SQL语句中的C

2、REATE 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.设计43.

4、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语言中的CREA

5、TE 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; uniKe

9、y = 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.hu

14、sing 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,DOUBL

15、E,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+=2;

16、 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(Inp

17、utString.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; inFile

18、(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 CATCHTYPE_

19、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; sf1

20、 = 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; s

22、tring 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的数据,且规定不允许超出strL

23、ength的长度;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) co

24、ut UNIQUE; 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#includ

25、e #include #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 a

26、me.size() ame tab.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) c

27、out文件打开失败tabNameLen; fTABin.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(); a

28、me = colName; fTABin colAttributeLen; 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

29、#ifndef MYFUNC_H#define MYFUNC_H#include 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相应的大写形

30、式 string temp(s); for(int i=0; i(int)s.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 isEndC

31、h(const string &s) for (int i = 0; i 2; 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); re

32、turn result;#endif / MYFUNC_HmyTable.h#ifndef MYTABLE_H#define MYTABLE_H#include myFile.h#include myFunc.h#include myClass.h#include catchType.hbool CreatProc(const string &s) Column te; string str=s; int myCol = -1; Table tab; string temp = make_Upper(getWord(str); if(temp != CREATE) coutCREATE出错en

33、dl; return false; temp = make_Upper(getWord(str); if(temp != TABLE) coutTABLE出错endl; return false; temp = getWord(str); tab.setTableName(temp); temp = getWord(str); if(temp!=() cout第一个(处出错endl; return false; temp = getWord(str); if (temp = ) cout该表为空表endl; return false; while(true) tab.col.push_back

34、(te); tab.col+myCame = temp; if (catchType(tab,str,myCol) = false) return false; temp = make_Upper(getWord(str); switch(isYueshu(temp) case 0: string tf = str,sf; sf = make_Upper(getWord(tf); if (sf = KEY) tab.colmyCol.priKey = 1; getWord(str); else cout完整性约束定义错误endl; return false; break; case

35、1: tab.colmyCol.uniKey = 1; break; case 2: break; case 3: goto k1; default: cout完整性约束定义错误endl; return false; temp = getWord(str); switch(isEndCh(temp) case 0: temp = getWord(str); break; case 1: goto k1; break; default: break; k1: tab.setColLen(int)tab.col.size(); outFile(tab); return true;bool Alte

36、rProc(const string &s) Column te; string str=s; int myCol = -1; Table tab; string temp = make_Upper(getWord(str); if(temp != ALTER) coutALTER出错endl; return false; temp = make_Upper(getWord(str); if(temp != TABLE) coutTABLE出错endl; return false; inFile(tab); myCol = (int)tab.col.size()-1; /myCOl代表着col列的最后一列 tem

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论