版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、山 東 科 技 大 學課 程 設(shè) 計 任 務(wù) 書軟件工程 專業(yè)2011 級 2班一、 課程設(shè)計題目:數(shù)據(jù)庫系統(tǒng)課程設(shè)計 二、 設(shè)計原始資料:數(shù)據(jù)庫系統(tǒng)概論 三、 設(shè)計應解決下列各主要問題:1.選擇一種高級語言實現(xiàn)下列語句的功能:CREATE TABLE (, )ALTER TABLE ADD DROPMODIFY 四、 設(shè)計說明書應有下列圖紙: 1.實現(xiàn)界面圖 2.流程圖3.功能結(jié)構(gòu)圖五、命題發(fā)出日期:2013年03月27日 設(shè)計應完成日期:2013年06月21日 設(shè)計指導教師(簽章):系主任(簽章):指導教師對課程的評語指導教師(簽章):年月日摘要本課程設(shè)計實現(xiàn)的是用C+實現(xiàn)SQL語句中的C
2、REATE TABLE以及ALTER TABLE的命令的部分功能。實現(xiàn)過程通過編寫若干個函數(shù)一次實現(xiàn)了命令識別、命令格式化、命令分解、命令判斷對錯等功能。對于表的結(jié)構(gòu),定義了相應的Table類,以及Column類,分別表示表的內(nèi)容以及表中每列的結(jié)構(gòu)。由于水平有限,本次設(shè)計沒有定義表級完整性約束,僅僅定義了列的完整性約束條件PRIMARY KEY以及UNIQUE代表部分列完整性約束,其他約束條件基本類似,沒有做過多定義。對于每個元組中的各數(shù)據(jù)類型定義了四類INT、DOUBLE、CHAR、CHAR(n)。由于表的元組個數(shù)是不固定的,使用了vector來定義一個Column向量,實現(xiàn)了可以無限添加表
3、的長度。同時由于vector的使用增加了存儲文件的難度,重寫了寫入文件的操作,實現(xiàn)了文件的任意存儲。對于命令的識別過程,使用string的相關(guān)操作,避免了使用char*會產(chǎn)生的指針操作的復雜性。通過適當?shù)奶鎿Q將命令分解為由若干空格分隔的詞組。每次識別一個詞組,可以方便的識別與存儲相關(guān)操作。借鑒了Java的編程規(guī)范,使得整體的設(shè)計顯得簡潔,避免了指針操作容易產(chǎn)生的錯誤,同時更容易理解設(shè)計的具體操作。關(guān)鍵字:vector;類;命令識別;C+;數(shù)據(jù)字典目錄1設(shè)計題目11.1所選題目11.2 設(shè)計要求11.3 開發(fā)環(huán)境12需求分析22.1題目分析22.2功能需求分析22.3數(shù)據(jù)流程分析33.設(shè)計43.
4、1 設(shè)計思想43.2 整體設(shè)計43.3 詳細設(shè)計54.實現(xiàn)64.1 基本界面64.2 輸入建表命令64.3 修改語句75.總結(jié)86.參考文獻9附錄101設(shè)計題目1.1所選題目1.選擇一種高級語言實現(xiàn)下列語句的功能:CREATE TABLE (, )ALTER TABLE ADD DROPMODIFY 1.2 設(shè)計要求(1) 能夠以命令方式執(zhí)行; (2) 能夠以程序方式執(zhí)行;(3) 提供課程設(shè)計報告。1.3 開發(fā)環(huán)境操作系統(tǒng): Windows 7;集成開發(fā)工具:Code:Blocks 10.05;開發(fā)語言: C/C+。2需求分析2.1題目分析脫離已有數(shù)據(jù)庫環(huán)境,采用C+實現(xiàn)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);系統(tǒng)執(zhí)行上面的CREATE TABLE語句后,就在數(shù)據(jù)庫中建立一個新的空“課程”表“Course”,并將有關(guān)“課程”表的定義及有關(guān)約束條件存放在數(shù)據(jù)字典中。(2) 修改基本表修改“Course”表,增加“學時”列,其數(shù)據(jù)類型
6、為整型。ALTER TABLE Course ADD Ctime INT;2.2功能需求分析用CREATE TABLE語句創(chuàng)建基本表:建表的同時定義與該表有關(guān)的完整性約束條件,并將這些完整性約束條件存入到系統(tǒng)的數(shù)據(jù)字典里。 用ALTER TABLE語句修改基本表:ADD子句用于增加新列和新的完整性約束條件,DROP子句用于刪除指定的完整性約束條件,MODIFY子句用于修改原有的列定義,包括修改列名和數(shù)據(jù)類型。2.3數(shù)據(jù)流程分析用戶根據(jù)自己的需求,定義自己的數(shù)據(jù)表名及各個屬性組及其數(shù)據(jù)類型,程序?qū)?shù)據(jù)表信息存入文件。開始數(shù)據(jù)表創(chuàng)建完成后用戶可通過數(shù)據(jù)表的修改功能對表進行增、刪、改的操作,以添加或
7、修改表的信息,并存入文件。N結(jié)束依據(jù)命令建立基本表或者修改基本表SQL命令是否匹配輸入SQL命令YY圖13.設(shè)計3.1 設(shè)計思想(介紹DBMS原型系統(tǒng)具有的功能以及性能要求)將DBMS的CREATE語句和ALTER語句的命令分別用C+中的函數(shù)實現(xiàn),建立幾個頭文件,實現(xiàn)如下功能:main.h /程序入口并定義對輸入字符串的處理myTable.h /包含實現(xiàn)建立表以及修改表的函數(shù)myFunc.h /定義一些關(guān)鍵字以及相應操作關(guān)鍵字的函數(shù)myFile.h /實現(xiàn)向文件中寫入數(shù)據(jù)以及讀取文件數(shù)據(jù)myClass.h /定義表的結(jié)構(gòu)以及表中列的結(jié)構(gòu)catchType.h /定義了一個判斷表中數(shù)據(jù)類型的函數(shù)
8、3.2 整體設(shè)計CREATE?開始輸入命令并對命令的進行格式化處理輸出命令錯誤,并要求重新輸入NYALTER?執(zhí)行CreatProc建表在讀取命令過程中出現(xiàn)錯誤就結(jié)束程序,并返回相應錯誤,最終無錯誤就建立表,并存儲在D:TAB.xdb中Y讀取D:TAB.xdb文件,在讀取命令過程中出現(xiàn)錯誤就結(jié)束程序,并返回相應錯誤,最終無錯誤就建立表,進行修改表并重新存儲圖2結(jié)束3.3 詳細設(shè)計數(shù)據(jù)存儲結(jié)構(gòu)(介紹關(guān)系表的物理存儲結(jié)構(gòu)、數(shù)據(jù)編碼方法)class Column /表中每一列的結(jié)構(gòu)public: Column() /構(gòu)造函數(shù)進行初始化 strLength = 0; priKey = 0; uniKe
9、y = 0; string cname; /該列的字段名 string attribute; /該列的屬性 int strLength; /當屬性為字符串時規(guī)定字符串/不允許超出strLength的長度 int priKey; /當為1表示為 完整性約束PRIMARY KEY int uniKey; /當為1表示為 完整性約束UNQUE vector intkey; /存儲數(shù)值類型為int的數(shù)據(jù) vector chkey; /存儲數(shù)值類型為char的數(shù)據(jù) vector doukey; /存儲數(shù)值類型為double的數(shù)據(jù) vector charkey;/存儲數(shù)值類型為string的數(shù)據(jù),且規(guī)定不
10、允/許超出strLength的長度;class Table /表的結(jié)構(gòu),一些具體函數(shù)實現(xiàn)未列出,private: string tableName; int colLen;public:vector col;;bool CreatProc(const string &s)/創(chuàng)建基本表bool AlterProc(const string &s)/修改基本表void outFile(Table &tab) /將表tab存儲到文件中void inFile(Table &tab) /從把文件中的數(shù)據(jù)讀取到tab中/表中的數(shù)據(jù)存儲在D:TAB.xdb中4.實現(xiàn)4.1 基本界面圖34.2 輸入建表命令以
11、CREATE TABLE Course(Cno DOUBLE PRIMARY KEY,Cname CHAR(40),Ccredit INT);為例,如圖4圖4文件結(jié)構(gòu)見圖5圖54.3 修改語句ALTER TABLE Course ADD Ctime INT;見圖6圖6文件結(jié)構(gòu)見圖7圖7其他修改語句(DROP、MODIFY)與詞句類似,在此不再一一羅列。5.總結(jié)本次數(shù)據(jù)庫課程設(shè)計用了近三個月的時間,基本實現(xiàn)了Create table以及Alter table的功能。對于輸入命令的識別過程中用到了C+中string類型的相關(guān)知識,由于起初string不太會用導致了很多錯誤,通過上網(wǎng)查閱相關(guān)資料將問
12、題一一解決。對于表中的列,以及列中的屬性的定義,用到了容器中的vector的概念。通過翻看一些實例以及多次的修改等,逐漸掌握了vector的使用方法。起初在對文件操作的時候由于沒有考慮到vector的可變因素,使用了ostream中writer的操作,導致數(shù)據(jù)的丟失以及不可控制,后來通過專門寫了對于表結(jié)構(gòu)的存儲方法將問題解決。文件存儲的結(jié)構(gòu),對于用到的字符串前面都有相應的字符串的長度,方便調(diào)用。對于列完整性約束,定義了0與1,通過識別相應的數(shù)字判斷是否為相應的約束條件,0代表不是,1代表是約束條件。本次課程設(shè)計借鑒了Java中的一些編程技巧,編程風格使用Java的方式,通過閱讀Java相關(guān)書籍
13、使我對Java產(chǎn)生濃厚的興趣,并堅定了學習Java的信念。作為軟件工程的學生,在本次課程數(shù)據(jù)過程中感覺自己的編程水平嚴重不足,缺少鍛煉。此次的課程設(shè)計讓我獲益匪淺,并且學會了對待問題只是細心還不夠,還需要有足夠的耐心才能最終做出滿意的作品。6.參考文獻1 數(shù)據(jù)庫系統(tǒng)概論第四版 王珊 薩師煊編著 高等教育出版社2 瘋狂Java講義第二版 李剛編著 電子工業(yè)出版社3 C+面向?qū)ο蟪绦蛟O(shè)計第二版 杜茂康 李昌兵 曹慧英 王永編著 電子工業(yè)出版社附錄程序代碼: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數(shù)據(jù)類型為:INT,CHAR,DOUBL
15、E,CHAR(n)endl t列完整性約束條件為:PRIMARY KEY,UNIQUEendl t%endlendl; cout 請輸入SQL命令,不區(qū)分大小寫,以;結(jié)束,可以任意換行: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/判斷數(shù)值數(shù)據(jù)類型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; /判斷字符串的位數(shù) 要求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數(shù)據(jù)類型設(shè)置錯誤endl; return false; return true;#endif / CATCHTYPE_HmyClass.h#ifndef MYCLASS_H#define MYCLASS_H#include #include #include using namespace std;class Column /表中每一列的結(jié)構(gòu)public: Column() strLength = 0; priKey = 0; uniKey = 0; s
22、tring cname; /該列的字段名 string attribute; /該列的屬性 int strLength; /當屬性為字符串時規(guī)定字符串不允許超出strLength的長度 int priKey; /當為1表示為 完整性約束PRIMARY KEY int uniKey; /當為1表示為 完整性約束UNQUE vector intkey; /存儲數(shù)值類型為int的數(shù)據(jù) vector chkey; /存儲數(shù)值類型為char的數(shù)據(jù) vector doukey; /存儲數(shù)值類型為double的數(shù)據(jù) vector charkey; /存儲數(shù)值類型為string的數(shù)據(jù),且規(guī)定不允許超出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; /數(shù)值類型const string yueshu = PRIMARY,UNIQUE,),; /0,1為完整性約束,2,3為語句是否結(jié)束的約束const string endCh = ,); /屬性結(jié)束符或建表結(jié)束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;/判斷數(shù)值的類型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;/判斷是否屬性結(jié)束或者表結(jié)束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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度草牧場承包經(jīng)營權(quán)租賃與農(nóng)業(yè)保險聯(lián)動合同3篇
- 二零二五版集裝箱租賃及售后服務(wù)合同樣本3篇
- 2025年度數(shù)字經(jīng)濟產(chǎn)業(yè)園區(qū)建設(shè)合同3篇
- 2025年移動辦公小程序定制開發(fā)與企業(yè)管理服務(wù)合同2篇
- 2024版成都市存量房屋買賣合同實施條例
- 二零二五版智能家居定制家具采購與售后保障合同3篇
- 2025年度餐飲行業(yè)食品安全風險評估合同21篇
- 二零二五河南事業(yè)單位100人招聘合同范本解讀與使用指南3篇
- 2024起重機械進出口貿(mào)易合同規(guī)范范本3篇
- 二零二五白酒定制酒生產(chǎn)與銷售合作合同3篇
- 春節(jié)英語介紹SpringFestival(課件)新思維小學英語5A
- 進度控制流程圖
- 2023年江蘇省南京市中考化學真題
- 【閱讀提升】部編版語文五年級下冊第四單元閱讀要素解析 類文閱讀課外閱讀過關(guān)(含答案)
- 供電副所長述職報告
- 現(xiàn)在完成時練習(短暫性動詞與延續(xù)性動詞的轉(zhuǎn)換)
- 產(chǎn)品質(zhì)量監(jiān)控方案
- 物業(yè)總經(jīng)理述職報告
- 新起點,新發(fā)展心得體會
- 深圳大學學校簡介課件
- 校園欺凌問題成因及對策分析研究論文
評論
0/150
提交評論