数据库课程设计物联网.doc_第1页
数据库课程设计物联网.doc_第2页
数据库课程设计物联网.doc_第3页
数据库课程设计物联网.doc_第4页
数据库课程设计物联网.doc_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

课程设计说明书课程名称: 数据库系统课程设计 专 业: 物联网 班级: 2014-2 设 计 人: 刘玉昊 学 号: 201401061421 山 东 科 技 大 学2016年 6 月 24 日山 东 科 技 大 学课 程 设 计 任 务 书一、 课程设计题目: 数据库系统课程设计二、 设计原始资料:数据库系统概论(第五版)三、 设计应解决下列各主要问题:1、账户创建以及主账户对其他账户的授权及收回权限2、CREATE、SELECT、INSERT、DELETE、UPDATE语句的实现以及查错3、help database 的表信息输出查询4、使用数据结构以及C+中STL库来创建索引以及存储数据表5、使用文件操作来实现表信息的存储以及读取四、 设计说明书应附有下列图纸:1.实现界面图2.流程图3.功能结构图五、 小组分工说明:个人独立完成 六、命题发出日期:2016-6-19设计完成日期:2016-6-24 指导教师评语成绩: 指导教师(签章):年月日山东科技大学学生课程设计1.需求分析说明22.设计概要说明22.1程序设计思想22.2程序运行流程图33.程序实现说明43.1User类的实现43.2File类的实现43.3Create的实现63.4Insert的实现63.5Delete的实现63.6Update的实现73.6Alter的实现73.7Select的实现73.8Grand的实现74.程序调试过程75.程序运行演示86.课程设计总结157.参考文献16附录1 系统完整程序171.需求分析说明本次课程设计在codeblocks编译环境下,采用C+高级语言以及数据结构的相关知识,开发一个具有基础功能的数据库管理系统。基本功能有: (1)账户创建以及主账户对其他账户的授权及收回权限 (2)CREATE、SELECT、INSERT、DELETE、UPDATE语句的实现以及查错 (3)help database 的表信息输出查询 (4)使用数据结构以及C+中STL库来创建索引以及存储数据表 (5)使用文件操作来实现表信息的存储以及读取2.设计概要说明2.1程序设计思想此次程序设计使用C+的类进行对数据的封装。以用户类User为最高级别类,在这个类的基础之上,再对每一个表进行操作,如果有权限就操作,没权限就不能操作。语句分析以及语义错误采用的是字符串处理的方式,每次把输入的字符串就行分析,分解出这个字符串内包含的所有单词,这些单词中不包含 , 、; 、(、)。然后对这所有的单词进行解析,因为在每个位置相应的出现的应该是固定的单词,所以可以直接判断这个单词是不是合法,如果合法就继续,不合法就可以提示语义错误。对于任何一种操作,都是以;为字符串的结束符,表示着一次输入端的结束,我在字符串读取的时候是以单个字符为基础进行输入的,所以又这个分号的存在也极大的方便了数据的读入。在每一次程序运行起来的时候,都会创建一个user类和file类,先把文件中保存的账户的所有信息都读取到user中,以及把文件中所有表的信息全部读入到file中,然后登陆,进行一些列的操作,在每次操作之前都会去询问一次此次操作是否有权限。2.2程序运行流程图Create Main用户登陆创建用户 离开读取文件中读取数据InsertAlterUpdateDeleteGrand把数据写入文件离开3.程序实现说明3.1User类的实现class Userprivate: map user_pass; /账户密码与账号匹配 vector user_name; /用户名 map user_id; /用户的id,从1开始 int main_user100; /是否是admin用户; int have_pow_in_op100100; /某个用户是否具有某个权利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_main(string name); /是否是admin void create_new_user(string name, string pass);/创建新用户 void read_user(); /从文件读取所有用户信息 bool add_pow(int where, int op); /账户添加权限 bool revoke_pow(int where, int op); /删除权限 void write_to_user(); /把账户写入文件中 void show_user(); /显示所有用户信息;其中大部分使用的是 map,vector string 实现的存储数据,这些STL的容器方便快捷比较好用。3.2File类的实现struct property string _name; / 属性名 string data_type; / 属性的数据类型 bool is_key; / 是否为主键 bool _unique; / 是否唯一 string len; / 数据长度 string NUMERIC; property() property(string _name, string _date_type, bool _is_key, bool _unique, string _len = , string _NUMERIC = ) _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 all_file_name; / 创建的所有的表的名字 map id; / 每一个表的id vector property_inf100;/ 某个表所包含的属性 vector schedule100; / 某个表的所有信息 map file_pro_id100; / 某个表的属性id int _vis100100; / 某个表的某个属性是否显示public: void show_file(string name); /显示表信息 int get_id(string name); /获取文件id int get_pro_num(string name); /获取某一个表的属性个数 bool delete_pro(int where, int ver); /删除某一列 bool delete_pro_row(int where, int row); /删除某一行 bool update_file_info(string name, vector info); /更新表的信息 bool insert_file_name(string name); /插入新的表名 bool insert_file_info(string name, vector info); /插入某个表的信息 bool insert_list(string name, vector pro); /插入新的表 bool insert_file_id(string name, map id); /插入某个表的属性id vector get_property(string name); /获取某个表的属性名 map get_pro_id(string name); /获取某个表的属性id vector get_all_table_name(); /获取所有的表名 vector get_file_info(string name); /获取某个表的所有信息 bool read_file(); /读文件 bool write_to_file(); /写文件;其中information实现的是对某一条信息的存储,property实现的是对某一种属性的存储,而file则是对这两种信息的整合。3.3Create的实现对于已经解析好的单词,那么我们就可以进行create判断了,首先前两个单词一定要是“Create”和“Table”,此部分要忽略大小写,即把输入的这两个单词全部转为大写再与“CREATE” “TABLE”进行判断,匹配成功之后,第三个单词就是表名了,这个地方要注意查询一下这个表名是否在之前已经出现过,保存下表名来。后面紧跟的一定是属性名,保存下来,再下一个单词一定是数据类型了,和所有能够实现的数据类型进行匹配,如果存在这个数据类型继续下一步,否则就提示错误。一次判断后面的属性。在创建完成之后一次输出显示出所有属性的数据类型,长度,限制条件等一系列的数据。3.4Insert的实现Insert的实现,我个人实现的是多条数据同时插入。判断的时候,第一个单词一定是“INSERT”这个没问题,第三个一定是表名,去判断一下这个表是否存在,然后找到”VALUES”,对这后面的数据进行存储。多条输出举例:Insert into student Values(19, HH), (20, JJ);3.5Delete的实现Delete的实现也比较简单,因为所有表的数据全部才在程序内存里,所以我在删除的时候没有直接删除内存,而是标记某一条信息是否存在,用vis数组标记, 等于1表示存在,这样涉及到一个问题,在创建表的时候要把所有vis都标记成1。3.6Update的实现更新操作就是把原来的数据替换掉了而已,没有什么难处,每次把更新的数据找出来,然后for循环直接找到相应的要改的数据,顶替到即可。3.6Alter的实现Alter是对某一列的删除或者增加,也是使用的delete的思想,delete的思想是把某一行是否输出标记出来,而删除列可以同理直接标记某一列是否存在即可。3.7Select的实现Select是这所有里面最难的一个,因为功能太多,而时间比较短,实现的也比较少的功能,直接云算法=,=,一系列的运算符,并且可以使用and操作,也可以选某几列输出,也可以直接用* 输出所有的数据。select就是在 * 和 属性名这一部分的判断要区分开,别的地方就没有难点了。3.8Grand的实现Grand是给用户赋予权限的,这个操作只允许在admin下才能执行,这个时候,在user类中的 is_main 函数就可以用上力了。4.程序调试过程(1)印象最深刻的时候就是文件操作上的问题,在读取到一个表的所有信息之后,再进行其他操作的时候,只可以识别名字,而其他的操作都不能使用了,调了好长时间,还以为ifstream 这些数据流的问题呢,后来在读完之后是正确的,然后在另一个文件里面是错误的,才找到真正错在哪。自己把表名的索引弄错了。(2)在删除列的时候因为是直接标记的,所以输出列的条数的时候,会多,后来想了想是自己并没有真实的删除某条消息,所以在输出个数的时候还是可以查到的。(3)Create是调试最多的,在解析单词的时候,我是每次遇到某个字符就说明得到一个单词,该放进信息内部了,但是有一次创建失败,我把所有读取的单词输出了一次,结果发现单词分析错了,少了一个遇到换行就存单词的问题。(4)在程序执行之后,得到了很多的warning,然后去看了一下提示,要求是 容器的返回数据个数数据类型是 unsigned int,而我们两个数在比较的时候是一个int,一个unsigned,所以不同数据类型引起了warning。5.程序运行演示(1)首先我们输入2去注册一个用户。(2)注册成功之后,因为这个是空账号,admin没有对他进行权限赋予,测一下create是否可以使用。(3)提示了没有权限。上面的“Change account;”是切换账号,我们现在切换一下账号到admin,目的是为 acm这个账户赋值。(4)选择1进行登录admin这样就可以看得出,create被授权,额可以创建表了。(5)重新回到admin,来测试一系列功能,首先测试CREATE;然后再创建一次提示名字重复。(6)插入数据Insert 测试(7)insert有条件测试,没插入的全为空(8)Select测试这是选择大于号的全表AND和小于号测试。(9)Update测试(10)delete操作把年龄为18的砍掉(11)Alter测试增加老师这一列。(12)Alter中drop的实现(13)help database测试6.课程设计总结从构思到实现,中间断断续续的写了接近两个星期的代码,大约1400+行,期间遇到过很多问题,但还是一点一点解决掉了。我对文件流操作一直不熟,自己去网上百度学习了一下感觉还比较好用。其实直接ifstream这些操作是相对来说不安全的,因为我们可以直接从文档中打开即可查看表的内容,更好的是可以使用二进制文件进行操作,这样就可以带来极大的安全性和方便性的优势。包括自己去答辩的时候,老师告诉了我正则表达式,这是一种很方便的判断字符串的方法,相对于自己写的字符串处理很多很多情况都没法处理到,既麻烦,又不高效。自身的代码和内容的实现上仍然存在着相当多的问题,需要自己去慢慢改正,自己距离优秀还差一大块。继续加油提高代码能力。7.参考文献1王珊,萨师煊.数据库系统概论(第5版).北京:高等教育出版社,2014.92杜茂康,李昌乐,曹慧英,王永.C+面向对象程序设计(第2版).北京:电子工业出版社,2011.73孙承爱,赵卫东.程序设计基础(第2版).北京:科学出版社,2010.94严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,附录1 系统完整程序main函数:#include #include Get_Word.h#include Enter_Into.husing namespace std;int main() _enter Enter; Enter._begin(); return 0;Get_word.h的实现#ifndef GET_WORD_H_INCLUDED#define GET_WORD_H_INCLUDED#include #include #include #include #include #include #include #include using namespace std;class Anal_Wordprivate: vector word; /单词集合public: int Analysis(string s); / 把输入的一个字符串进行分析成每一个单词 void show(); / 输出所有分析出来的单词 vector get_word(); / 把分析出来的单词返回;void Anal_Word:show() for(int i = 0; i (int)word.size(); i+) cout wordi . endl;vector Anal_Word: get_word() return 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 wh; for(int i = 0; i (int)s.size(); i+)/ if(!isdigit(si) & !isalpha(si) & si != ; & si != , & si != ( & si != ) & si != & si != t)/ return 0;/ if(si != & si != , & si != ( & si != ) & si != t & si != ; & si != n) _begin += si; if(si = () bracket +; if(si = ) bracket -; if(si 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 - whi 0 & wh(int)wh.size()-1 = (int)word.size() return 0; return 1;Enter_Into() /进入主界面#ifndef ENTER_INTO_H_INCLUDED#define ENTER_INTO_H_INCLUDED#include #include #include #include #include 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( 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, INSERT, DELETE, UPDATE, ALTER;map 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(| 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 Up, Write 3 to Leavenn); 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.judge(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(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 Paseword: ); 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) 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_idSELECT = 6;power_idHELP = 7;power_idCREATE = 1; power_idINSERT = 2;power_idDELETE = 4;power_idUPDATE = 3; power_idALTER = 5; int _ok = enter_interface(); if(_ok = 0) return ; printf(+-+n); printf(| Notes |n); printf(| |n); printf(| 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(| 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 = Anal.Analysis(str);/ Anal.show(); if(!ok) Error; continue; vector 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)/ printf(.n); if(!user.is_main(user_name) cout No permissionn; continue; vector 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 (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 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_name), power_ida

温馨提示

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

评论

0/150

提交评论