




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精品文檔課程設(shè)計說明書課程名稱: 數(shù)據(jù)庫系統(tǒng)課程設(shè)計 專 業(yè): 物聯(lián)網(wǎng) 班級: 2021-2 設(shè) 計 人: 劉玉昊 學(xué) 號: 202101061421 山 東 科 技 大 學(xué)2021年 6 月 24 日山 東 科 技 大 學(xué)課 程 設(shè) 計 任 務(wù) 書一、 課程設(shè)計題目: 數(shù)據(jù)庫系統(tǒng)課程設(shè)計二、 設(shè)計原始資料:?數(shù)據(jù)庫系統(tǒng)概論第五版?三、 設(shè)計應(yīng)解決以下各主要問題:1、賬戶創(chuàng)立以及主賬戶對其他賬戶的授權(quán)及收回權(quán)限2、CREATE、SELECT、INSERT、DELETE、UPDATE語句的實現(xiàn)以及查錯3、help database 的表信息輸出查詢4、使用數(shù)據(jù)結(jié)構(gòu)以及C+中STL庫來創(chuàng)立索引以及
2、存儲數(shù)據(jù)表5、使用文件操作來實現(xiàn)表信息的存儲以及讀取四、 設(shè)計說明書應(yīng)附有以下圖紙:1.實現(xiàn)界面圖2.流程圖3.功能結(jié)構(gòu)圖五、 小組分工說明:個人獨(dú)立完成 六、命題發(fā)出日期:2021-6-19設(shè)計完成日期:2021-6-24 指導(dǎo)教師評語成績: 指導(dǎo)教師簽章:年月日歡迎下載精品文檔1.需求分析說明22.設(shè)計概要說明22.1程序設(shè)計思想22.2程序運(yùn)行流程圖33.程序?qū)崿F(xiàn)說明43.1User類的實現(xiàn)43.2File類的實現(xiàn)43.3Create的實現(xiàn)63.4Insert的實現(xiàn)63.5Delete的實現(xiàn)63.6Update的實現(xiàn)73.6Alter的實現(xiàn)73.7Select的實現(xiàn)73.8Grand的實
3、現(xiàn)74.程序調(diào)試過程75.程序運(yùn)行演示86.課程設(shè)計總結(jié)157.參考文獻(xiàn)16附錄1 系統(tǒng)完整程序171.需求分析說明本次課程設(shè)計在codeblocks編譯環(huán)境下,采用C+高級語言以及數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識,開發(fā)一個具有根底功能的數(shù)據(jù)庫管理系統(tǒng)。根本功能有: 1賬戶創(chuàng)立以及主賬戶對其他賬戶的授權(quán)及收回權(quán)限 2CREATE、SELECT、INSERT、DELETE、UPDATE語句的實現(xiàn)以及查錯 3help database 的表信息輸出查詢 4使用數(shù)據(jù)結(jié)構(gòu)以及C+中STL庫來創(chuàng)立索引以及存儲數(shù)據(jù)表 5使用文件操作來實現(xiàn)表信息的存儲以及讀取2.設(shè)計概要說明2.1程序設(shè)計思想此次程序設(shè)計使用C+的類進(jìn)行
4、對數(shù)據(jù)的封裝。以用戶類User為最高級別類,在這個類的根底之上,再對每一個表進(jìn)行操作,如果有權(quán)限就操作,沒權(quán)限就不能操作。語句分析以及語義錯誤采用的是字符串處理的方式,每次把輸入的字符串就行分析,分解出這個字符串內(nèi)包含的所有單詞,這些單詞中不包含 , 、; 、(、)。然后對這所有的單詞進(jìn)行解析,因為在每個位置相應(yīng)的出現(xiàn)的應(yīng)該是固定的單詞,所以可以直接判斷這個單詞是不是合法,如果合法就繼續(xù),不合法就可以提示語義錯誤。對于任何一種操作,都是以;為字符串的結(jié)束符,表示著一次輸入端的結(jié)束,我在字符串讀取的時候是以單個字符為根底進(jìn)行輸入的,所以又這個分號的存在也極大的方便了數(shù)據(jù)的讀入。在每一次程序運(yùn)行起
5、來的時候,都會創(chuàng)立一個user類和file類,先把文件中保存的賬戶的所有信息都讀取到user中,以及把文件中所有表的信息全部讀入到file中,然后登陸,進(jìn)行一些列的操作,在每次操作之前都會去詢問一次此次操作是否有權(quán)限。2.2程序運(yùn)行流程圖Create Main用戶登陸創(chuàng)立用戶 離開讀取文件中讀取數(shù)據(jù)InsertAlterUpdateDeleteGrand把數(shù)據(jù)寫入文件離開3.程序?qū)崿F(xiàn)說明3.1User類的實現(xiàn)class Userprivate: map <string, string> user_pass; /賬戶密碼與賬號匹配 vector <string> user
6、_name; /用戶名 map <string, int> user_id; /用戶的id,從1開始 int main_user100; /是否是admin用戶; int have_pow_in_op100100; /某個用戶是否具有某個權(quán)利public: bool judge(string name, string pass); /判斷賬號密碼是否正確 int get_id(string name); /獲取某個表名的id bool have_op(int id, int op) /判斷某個賬號是否有某個操作 return have_pow_in_opidop; bool is_
7、main(string name); /是否是admin void create_new_user(string name, string pass);/創(chuàng)立新用戶 void read_user(); /從文件讀取所有用戶信息 bool add_pow(int where, int op); /賬戶添加權(quán)限 bool revoke_pow(int where, int op); /刪除權(quán)限 void write_to_user(); /把賬戶寫入文件中 void show_user(); /顯示所有用戶信息;其中大局部使用的是 map,vector string 實現(xiàn)的存儲數(shù)據(jù),這些STL的容
8、器方便快捷比擬好用。3.2File類的實現(xiàn)struct property string _name; / 屬性名 string data_type; / 屬性的數(shù)據(jù)類型 bool is_key; / 是否為主鍵 bool _unique; / 是否唯一 string len; / 數(shù)據(jù)長度 string NUMERIC; property() property(string _name, string _date_type, bool _is_key, bool _unique, string _len = "", string _NUMERIC = ""
9、;) _name = _name, data_type = _date_type, is_key = _is_key, _unique = _unique, len = _len, NUMERIC = _NUMERIC; bool friend operator < (property a, property b) return a._name < b._name; ;struct information string all100; int vis100;class _fileprivate: vector <string> all_file_name; / 創(chuàng)立的所
10、有的表的名字 map <string, int> id; / 每一個表的id vector <property> property_inf100;/ 某個表所包含的屬性 vector <information> schedule100; / 某個表的所有信息 map <string,int> file_pro_id100; / 某個表的屬性id int _vis100100; / 某個表的某個屬性是否顯示public: void show_file(string name); /顯示表信息 int get_id(string name); /獲取
11、文件id int get_pro_num(string name); /獲取某一個表的屬性個數(shù) bool delete_pro(int where, int ver); /刪除某一列 bool delete_pro_row(int where, int row); /刪除某一行 bool update_file_info(string name, vector <information> info); /更新表的信息 bool insert_file_name(string name); /插入新的表名 bool insert_file_info(string name, vect
12、or <information> info); /插入某個表的信息 bool insert_list(string name, vector <property> pro); /插入新的表 bool insert_file_id(string name, map <string, int> id); /插入某個表的屬性id vector <property> get_property(string name); /獲取某個表的屬性名 map <string, int> get_pro_id(string name); /獲取某個表的屬
13、性id vector <string> get_all_table_name(); /獲取所有的表名 vector <information> get_file_info(string name); /獲取某個表的所有信息 bool read_file(); /讀文件 bool write_to_file(); /寫文件;其中information實現(xiàn)的是對某一條信息的存儲,property實現(xiàn)的是對某一種屬性的存儲,而file那么是對這兩種信息的整合。3.3Create的實現(xiàn)對于已經(jīng)解析好的單詞,那么我們就可以進(jìn)行create判斷了,首先前兩個單詞一定要是“Creat
14、e和“Table,此局部要忽略大小寫,即把輸入的這兩個單詞全部轉(zhuǎn)為大寫再與“CREATE “TABLE進(jìn)行判斷,匹配成功之后,第三個單詞就是表名了,這個地方要注意查詢一下這個表名是否在之前已經(jīng)出現(xiàn)過,保存下表名來。后面緊跟的一定是屬性名,保存下來,再下一個單詞一定是數(shù)據(jù)類型了,和所有能夠?qū)崿F(xiàn)的數(shù)據(jù)類型進(jìn)行匹配,如果存在這個數(shù)據(jù)類型繼續(xù)下一步,否那么就提示錯誤。一次判斷后面的屬性。在創(chuàng)立完成之后一次輸出顯示出所有屬性的數(shù)據(jù)類型,長度,限制條件等一系列的數(shù)據(jù)。3.4Insert的實現(xiàn)Insert的實現(xiàn),我個人實現(xiàn)的是多條數(shù)據(jù)同時插入。判斷的時候,第一個單詞一定是“INSERT這個沒問題,第三個一定
15、是表名,去判斷一下這個表是否存在,然后找到VALUES,對這后面的數(shù)據(jù)進(jìn)行存儲。多條輸出舉例:Insert into student Values(19, HH), (20, JJ);3.5Delete的實現(xiàn)Delete的實現(xiàn)也比擬簡單,因為所有表的數(shù)據(jù)全部才在程序內(nèi)存里,所以我在刪除的時候沒有直接刪除內(nèi)存,而是標(biāo)記某一條信息是否存在,用vis數(shù)組標(biāo)記, 等于1表示存在,這樣涉及到一個問題,在創(chuàng)立表的時候要把所有vis都標(biāo)記成1。3.6Update的實現(xiàn)更新操作就是把原來的數(shù)據(jù)替換掉了而已,沒有什么難處,每次把更新的數(shù)據(jù)找出來,然后for循環(huán)直接找到相應(yīng)的要改的數(shù)據(jù),頂替到即可。3.6Alte
16、r的實現(xiàn)Alter是對某一列的刪除或者增加,也是使用的delete的思想,delete的思想是把某一行是否輸出標(biāo)記出來,而刪除列可以同理直接標(biāo)記某一列是否存在即可。3.7Select的實現(xiàn)Select是這所有里面最難的一個,因為功能太多,而時間比擬短,實現(xiàn)的也比擬少的功能,直接云算法=,>,>=,一系列的運(yùn)算符,并且可以使用and操作,也可以選某幾列輸出,也可以直接用* 輸出所有的數(shù)據(jù)。select就是在 * 和 屬性名這一局部的判斷要區(qū)分開,別的地方就沒有難點了。3.8Grand的實現(xiàn)Grand是給用戶賦予權(quán)限的,這個操作只允許在admin下才能執(zhí)行,這個時候,在user類中的
17、is_main 函數(shù)就可以用上力了。4.程序調(diào)試過程1印象最深刻的時候就是文件操作上的問題,在讀取到一個表的所有信息之后,再進(jìn)行其他操作的時候,只可以識別名字,而其他的操作都不能使用了,調(diào)了好長時間,還以為ifstream 這些數(shù)據(jù)流的問題呢,后來在讀完之后是正確的,然后在另一個文件里面是錯誤的,才找到真正錯在哪。自己把表名的索引弄錯了。2在刪除列的時候因為是直接標(biāo)記的,所以輸出列的條數(shù)的時候,會多,后來想了想是自己并沒有真實的刪除某條消息,所以在輸出個數(shù)的時候還是可以查到的。3Create是調(diào)試最多的,在解析單詞的時候,我是每次遇到某個字符就說明得到一個單詞,該放進(jìn)信息內(nèi)部了,但是有一次創(chuàng)立
18、失敗,我把所有讀取的單詞輸出了一次,結(jié)果發(fā)現(xiàn)單詞分析錯了,少了一個遇到換行就存單詞的問題。4在程序執(zhí)行之后,得到了很多的warning,然后去看了一下提示,要求是 容器的返回數(shù)據(jù)個數(shù)數(shù)據(jù)類型是 unsigned int,而我們兩個數(shù)在比擬的時候是一個int,一個unsigned,所以不同數(shù)據(jù)類型引起了warning。5.程序運(yùn)行演示1首先我們輸入2去注冊一個用戶。2注冊成功之后,因為這個是空賬號,admin沒有對他進(jìn)行權(quán)限賦予,測一下create是否可以使用。3提示了沒有權(quán)限。上面的“Change account;是切換賬號,我們現(xiàn)在切換一下賬號到admin,目的是為 acm這個賬戶賦值。4選
19、擇1進(jìn)行登錄admin這樣就可以看得出,create被授權(quán),額可以創(chuàng)立表了。5重新回到admin,來測試一系列功能,首先測試CREATE;然后再創(chuàng)立一次提示名字重復(fù)。6插入數(shù)據(jù)Insert 測試7insert有條件測試,沒插入的全為空8Select測試這是選擇大于號的全表AND和小于號測試。9Update測試10delete操作把年齡為18的砍掉11Alter測試增加老師這一列。12Alter中drop的實現(xiàn)13help database測試6.課程設(shè)計總結(jié)從構(gòu)思到實現(xiàn),中間斷斷續(xù)續(xù)的寫了接近兩個星期的代碼,大約1400+行,期間遇到過很多問題,但還是一點一點解決掉了。我對文件流操作一直不熟,
20、自己去網(wǎng)上百度學(xué)習(xí)了一下感覺還比擬好用。其實直接ifstream這些操作是相對來說不平安的,因為我們可以直接從文檔中翻開即可查看表的內(nèi)容,更好的是可以使用二進(jìn)制文件進(jìn)行操作,這樣就可以帶來極大的平安性和方便性的優(yōu)勢。包括自己去辯論的時候,老師告訴了我正那么表達(dá)式,這是一種很方便的判斷字符串的方法,相對于自己寫的字符串處理很多很多情況都沒法處理到,既麻煩,又不高效。自身的代碼和內(nèi)容的實現(xiàn)上仍然存在著相當(dāng)多的問題,需要自己去慢慢改正,自己距離優(yōu)秀還差一大塊。繼續(xù)加油提高代碼能力。7.參考文獻(xiàn)1王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論(第5版).北京:高等教育出版社,2021.92杜茂康,李昌樂,曹慧英,王永.
21、C+面向?qū)ο蟪绦蛟O(shè)計(第2版).北京:電子工業(yè)出版社,2021.73孫承愛,趙衛(wèi)東.程序設(shè)計根底(第2版).北京:科學(xué)出版社,2021.94嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版).北京:清華大學(xué)出版社,附錄1 系統(tǒng)完整程序main函數(shù):#include <iostream>#include "Get_Word.h"#include "Enter_Into.h"using namespace std;int main() _enter Enter; Enter._begin(); return 0;Get_word.h的實現(xiàn)#ifndef GET
22、_WORD_H_INCLUDED#define GET_WORD_H_INCLUDED#include <cstdio>#include <iostream>#include <algorithm>#include <string>#include <vector>#include <map>#include <set>#include <iomanip>using namespace std;class Anal_Wordprivate: vector <string> word; /
23、單詞集合public: int Analysis(string s); / 把輸入的一個字符串進(jìn)行分析成每一個單詞 void show(); / 輸出所有分析出來的單詞 vector <string> get_word(); / 把分析出來的單詞返回;void Anal_Word:show() for(int i = 0; i < (int)word.size(); i+) cout << wordi << "." << endl;vector <string> Anal_Word: get_word() r
24、eturn word;int Anal_Word:Analysis(string s) if(s.size() = 0 | ss.size() - 1 != '') return 0; string _begin; int bracket = 0; int mark = 0; vector <int> wh; for(int i = 0; i < (int)s.size(); i+)/ if(!isdigit(si) && !isalpha(si) && si != '' && si !=
25、9;,' && si != '(' && si != ')' && si != ' ' && si != 't')/ return 0;/ if(si != ' ' && si != ',' && si != '(' && si != ')' && si != 't' && si != '
26、9; && si != 'n') _begin += si; if(si = '(') bracket +; if(si = ')') bracket -; if(si < 0) return 0; if(si = ',' | si = ')' | si = ' ' | si = '(' | si = '' | si = 't' | si = 'n') && !mark && _be
27、gin.size() > 0 && s0 != 't') word.push_back(_begin); _begin.clear(); if(si = ',' && s.size() > 0 && s0 !='t') wh.push_back(word.size(); if(bracket != 0) return 0; if(wh.size() = 0) return 1; for(int i = 0; i < (int)wh.size() - 1; i+) if(whi+1
28、- whi < 1) return 0; if(int)wh.size() > 0 && wh(int)wh.size()-1 = (int)word.size() return 0; return 1;Enter_Into /進(jìn)入主界面#ifndef ENTER_INTO_H_INCLUDED#define ENTER_INTO_H_INCLUDED#include <cstdio>#include <iostream>#include <vector>#include <string>#include "
29、File.h"#include "Create_Table.h"#include "Insert_Into.h"#include "Delete_Table.h"#include "Update_Table.h"#include "Alter_Table.h"#include "Select_table.h"#include "User.h"#include "Get_Word.h"#define Error printf(&
30、quot;<< SQL statement errorn")using namespace std;/*CREATE TABLE STUDENT ( NAME CHAR(80) UNIQUE, AGE NUMERIC(30, 20), NUM INT PRIMARY KEY, COU INT UNIQUE);CREATE TABLE STUDENT ( AGE INT);*/string power100 = "","SELECT", "UPDATE", "CREATE", "INS
31、ERT", "DELETE", "UPDATE", "ALTER"map <string, int> power_id;class _enterpublic: _enter() void _begin(); / 開始輸入;int op;string user_name, user_pass;_file file; / 文件User user;int enter_interface() printf("+-+n"); printf("| |n"); printf("
32、| Welcome To My Sql |n"); printf("| |n"); printf("| 1.Login |n"); printf("| 2.Set Up |n"); printf("| 3.Leave |n"); printf("| |n"); printf("| |n"); printf("+-+nnn"); printf("Write 1 to 'Login', Write 2 to 'Set
33、 Up', Write 3 to 'Leave'nn"); while(true) printf(">> "); scanf("%d", &op); if(op = 1) int _count = 0; while(true) printf(">>UserName: "); cin >> user_name; printf(">>Paseword: "); cin >> user_pass; if(user.jud
34、ge(user_name, user_pass) if(!user.is_main(user_name) printf("Sucess! You shoud use the admin to add power!n"); else printf("Sucess! You can add the power to other user!n"); return 1; _count+; if(_count >= 3) printf("Failed!n You is not the user!n"); return 0; printf(
35、"Sorry, the account with this keycode was not foundnn"); return 1; else if(op = 2) int _count = 0; while(true) printf(">>UserName: "); cin >> user_name; printf(">>Paseword: "); cin >> user_pass; string two_pass; printf(">>Confirm Pasew
36、ord: "); cin >> two_pass; if(user_pass != two_pass) printf("Password is not equal.n"); else if(user.get_id(user_name) printf("Account already existsn"); else printf("Success!n"); user.create_new_user(user_name, user_pass); return 1; _count+; if(_count >= 3
37、) printf("Sorry, Set Up failed!n"); return 0; return 1; else if(op = 3) return 0; else printf("Does not recognize the command, try againn"); void _enter:_begin() file.read_file(); user.read_user();/ user.show_user(); power_id"SELECT" = 6;power_id"HELP" = 7;pow
38、er_id"CREATE" = 1; power_id"INSERT" = 2;power_id"DELETE" = 4;power_id"UPDATE" = 3; power_id"ALTER" = 5; int _ok = enter_interface(); if(_ok = 0) return ; printf("+-+n"); printf("| Notes |n"); printf("| |n"); printf("
39、;| 1.Support Create/Select/Insert/Delete/Updata |n"); printf("| 2.Support Grand/Revoke |n"); printf("| 3.Support 'help database' |n"); printf("| 4.Write 'Change Account;' |n"); printf("| 5.All operation is case-insensitive |n"); printf(&qu
40、ot;| 6.Write 'Say you again' to leave |n"); printf("| |n"); printf("+-+nnn"); int _id = user.get_id(user_name); while(true) cout << ">>" string str; char s; while(s = getchar() != EOF) str += s; if(s = '') break; Anal_Word Anal; bool ok
41、= Anal.Analysis(str);/ Anal.show(); if(!ok) Error; continue; vector <string> word; word = Anal.get_word();/ if(word.size() < 5) / Error;/ continue;/ if(to_big(word0) = "CHANGE" && to_big(word1) = "ACCOUNT") enter_interface(); else if(to_big(word0) = "GRAND&q
42、uot;)/ printf(".n"); if(!user.is_main(user_name) cout << "No permissionn" continue; vector <string> add; string oth_name; for(int i = 1; i < (int)word.size(); i+) if(to_big(wordi) = "TO") oth_name = wordi+1; break; add.push_back(wordi); for(int j = 0; j &
43、lt; (int)add.size(); j+) user.add_pow(user.get_id(oth_name), power_idto_big(addj); else if(to_big(word0) = "REVOKE") if(!user.is_main(user_name) cout << "No permissionn" continue; vector <string> add; string oth_name; for(int i = 1; i < (int)word.size(); i+) if(to_big(wordi) = "FROM") oth_name = wordi+1; break; add.push_back(wordi); for(int j = 0; j < (int)add.size(); j+) user.revoke_pow(user.get_id(oth_n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 消防員客觀練習(xí)題庫及答案
- 消防員個人工作總結(jié)
- 湘藝版小學(xué)音樂六年級上冊《我的祖國》教案
- 2025年年中國食品飲料項目建議書
- 2025年耐高溫濾料合作協(xié)議書
- 教育心理學(xué)與健康生活的結(jié)合點
- 如何運(yùn)用心理學(xué)優(yōu)化教學(xué)策略
- 教育品牌危機(jī)公關(guān)快速響應(yīng)策略與實施
- 全球醫(yī)療教育的新模式與挑戰(zhàn)
- 教育技術(shù)與商業(yè)培訓(xùn)的融合探索
- 汽車網(wǎng)銷電話邀約話術(shù)培訓(xùn)
- 江蘇省南京市2024-2025學(xué)年高二(下)期末物理試卷
- 煤礦掘進(jìn)試題庫及答案
- 妊娠期合并闌尾炎的護(hù)理
- 2025至2030中國焦化行業(yè)市場發(fā)展分析及發(fā)展趨勢與前景報告
- 音樂數(shù)據(jù)分析與用戶行為研究-洞察闡釋
- 2025至2030中國電子級磷酸行業(yè)市場發(fā)展分析及市場需求與投資方向報告
- 電力維修搶險方案(3篇)
- 民警心理健康課件
- 公路養(yǎng)護(hù)統(tǒng)計培訓(xùn)
- 2025年河南省中考語文試卷真題(含答案)
評論
0/150
提交評論