第一篇:数据结构课程设计—西文图书管理系统
数据结构课程设计报告
课程名称:数据结构课程设计
课设题目: 西文图书管理系统 教师姓名:
郭
艳
本科生姓名:
王瑞林
本科生学号:
20121002932
班
号:
191124
日
期:2014年6月20日
题号:十
题目:西文图书管理
1.需求分析
图书管理系统对象有两个,包括读者和管理员。
读者的需求:借书,还书,续借,查询当前所借书籍还书截至日期,查询借阅历史,修改登陆密码。其中借书可以根据书号和书名两种方式查询借阅。
管理员的需求:采编入库,清除库存,注册读者,删除读者,根据书号查询书籍,修改管理员用户名和密码。
2.设计
2.1设计思想
(1)数据与操作特性:
有搜索,插入,删除操作。而数据有:读者信息,书籍信息,读者借阅书籍历史信息,书籍读者借阅历史信息,读者当前所借书籍信息。(2)数据结构设计:
数据的逻辑结构有线性结构和树形结构。
根据书号和书名建立两个B-树,便于读者查询借阅,其中关键字设置为书籍指针,便于找到书籍 后直接进行修改书籍信息。
读者和书籍的信息从文件中读取,由于会不断注册和删除读者以及新增删除书籍,因此书籍和读者的信息采用单链表存储。
读者的借阅历史和书籍的读者历史,都采用数组的形式存储,为了节省存储空间,每个借阅历史数组最大空间为15。超过15个借阅历史,则删除最早的借阅历史。2.2设计表示(1)数据类型定义
typedef struct //日期结构体类型 { int year;//记录年
int month;//记录月
int day;//记录日 }Date;//记录借阅者所借书籍的信息结构体 typedef struct {
char bookID[15];//书号 char name[15];//书名 char writer[15];//作者 Date bordate;//借阅时间 Date backdate;//还书时间
int flag;//是否续借,续借为1.否则为0
}BookHistory;//记录借阅者当前所借书籍的信息结构体 typedef struct {
char bookID[15];//书号 char name[15];//书名 char writer[15];//作者 Date bordate;//借阅时间 Date lastdate;//最后还书期限
int flag;//是否续借,续借为1.否则为0
}BookRec;//记录书籍被借阅的读者记录 typedef struct { char readerID[15];//记录读者的借阅证号 char readername[15];//读者的名字
Date bor;//记录读者的借书日期
Date back;//记录读者的还书日期 int flag;//借阅者是否有续借迹象(flag取值0或者1)}ReaderHistory;//记录读者信息的结构体类型(允许读者同时借阅五本书,每本书支持续借一次)typedef struct { char readerID[12];//记录读者的借书证号,一般是学号
//记录书的信息的结构体类型 typedef struct { char bookID[15];//书号 char title[15];//记录书名
char writer[15];//记录著者
int currentnum;//书现存量
int totalnum;//书总存量
int bortimes;//被借的历史总次数 //B_LQueue *B_LQH;
ReaderHistory RH[15];//借书者记录,规定链式队列的最大节点个数为15,来节省空间 char name[15];//读者的名字 char password[16];//读者登陆密码 BookRec rec[5];//读者现在所借书籍 int hn;//总借阅数量 //R_LQueue *R_LQH;
BookHistory bh[15];//记录读者的借阅记录,规定链式队列的最大节点个数为15,来节省空间 int bn;//读者现在所借书籍数量,最大数量为5本
}Reader;}Book;//根据 书名为关键字的B-树的结构体类型
typedef struct Namenode //根据书名为关键字建立的B树 {
typedef struct///根据书名建立的B树的搜索结果 {
//根据书号为关键字的B-树的结构体类型
typedef struct IDnode //根据书号为关键字建立的B树 {
typedef struct///根据书号建立的B树的搜索结果 {
//从文件中读取书籍数据后存储在单链表里 typedef struct BookNode {
//从文件中读取学生数据后存储在单链表里 typedef struct ReaderNode { Book SLbook;struct BookNode *next;BTIDnode *pt;////指向找到的节点指针 int i;//所找关键字在节点里的位置 int tag;//查找成功值为1,查找失败值为0 int n;//记录结点中的关键字(即书号)个数
Book *key[MAXM];//key[0...n-1],Maxsize个关键字(即书号)域 struct IDnode *chd[MAXM];//ptr[0...n],MAXM个指向子结点的指针域 BTNamenode *pt;////指向找到的节点指针 int i;//所找关键字在节点里的位置 int tag;//查找成功值为1,查找失败值为0 int n;//记录结点中的关键字(即书号)个数
Book *key[MAXM];//key[0...n-1],Maxsize个关键字(即书名)域
struct Namenode *chd[MAXM];//ptr[0...n],MAXM个指向子结点的指针域
struct Namenode *par;//指向父结点的指针域
}BTNamenode;}NameResult;struct IDnode *par;//指向父结点的指针域
}BTIDnode;}IDResult;}BookSLNode;Reader SLreader;struct ReaderNode *next;}ReaderSLNode;2.3详细设计
(1)登陆界面login():有管理员和读者登陆,都必须输入密码和用户名。
(2)管理员登陆adminer_login():管理员需输入登录名和密码,为了安全登录,将输入密码错误次数限制在5次。其中管理员密码和用户名以及初始用户名和密码从管理员文件里读出赋值给全局变量。当输入正确时,管理员功能界面函数admin_menu();当密码输入错误达6次以上,将调用锁定系统函数lock_admin_menu(),将系统锁定,下次进入系统时将不再显示登陆界面,而是初始管理员登陆。
(3)管理员采编入库insert_stock():输入新书的信息,调用SearchBTree_ID()按照书号在B-树搜索书籍,如果没有找到,返回书籍插入的位置,然后调用插入函数InsertBTree_Name(),InsertBTree_ID(),分别将书籍按书名和书号插入到相应的树中,同时将书籍信息插入到书籍链表里调用ListInsert_Book();同时将全局变量书籍总数booknum加1。
(4)管理员清除库存deletestock():根据书号书名搜索到书籍,在B-树中删除书籍,同时在书籍信息链表里删除。并将书籍总数booknum减1。
(5)管理员读者模块adminer_reader():有删除读者和注册读者两个功能,删除读者,按读者的ID查找到,在读者信息链表里删除读者,读者总数readernum减1;注册读者,初始密码为读者ID后6位,同时读者总数readernum加1。
(6)管理员修改用户名和密码adminer_change_password():连续两次输入新密码,两次结果一样,修改成功。
(7)学生登陆student_login():输入密码成功,调用 stu_menu()功能界面。(8)学生借书borrow():有两种搜索所借书籍的方式,按书名搜索,按书号搜索,使用相应的B-树搜索功能。借书成功后,将书籍信息写到读者当前所借书籍里面。并将书籍当前存量减1.(9)学生还书back():进入还书界面,将显示出读者当前所借书籍,让读者选择归还书籍。归还后将书籍从读者当前所借书籍里删除,此书当前存量加1,并将书籍信息写到读者借阅历史里面。
(10)学生续借renew():显示当前所借书籍信息,读者选择续借书目,当书籍信息的续借标志为0时可以续借,否则 不能续借,续借成功,将对应的读者当前所借书籍的续借标志置为1.(11)学生查询最后还书期限deadline():进入之后显示当前所借书籍信息,里面包含最后还书期限。
(12)学生查询借阅历史history():显示读者信息里面的借阅历史。
(13)学生修改密码change_reader_password():两次新密码输入一致,修改成功。(14)锁定系统admin_lock(),锁定系统后登陆lock_admin_menu():全局变量m_lock,当其值为1时解锁,值为0时锁定。
(15)建立读者书籍链表readreader(),readbook():首先从文件中读取读者总数,采用for循环,将每个读者信息写到链表里,在循环中,读取读者的ID、姓名、密码,然后读取读者当前所借书籍,采用for循环,将所借书籍信息写到数组里面,依次读取所借书籍信息。之后读取读者历史所借书籍数量,当数量大于15时,使用for循环,循环15次,依次读取书籍信息;如果 数量小于等于 15,采用for循环,循环当前借阅历史书籍数量次,将书籍信息写道数组中。然后将每个读者插入到链表里。书籍链表类似读者链表的建立。
(16)B-树的搜索插入删除功能(以按书名建立的B-树为例);搜索,SearchBTree_ID(),搜索成功返回搜索到的位置,搜索失败,返回插入的位置。Search_Name()函数将在当前节点搜索到关键字的位置。
插入,InsertBTree_Name(),如果为空,调用NewRoot_name()函数,建立根节点。如果不为空,将调用Insert_Name()将插入到节点里,判断是否大于最大关键字个数,如果大于,调用Split_Name()进行分裂。删除,并非自己完成,参考网上代码。
(16)建立B-树newBT():按书名建立,使用B树搜索功能,没有找到,将根据返回的位置进行插入。按书号的类似。
(17)打印文件printftxt():分别将书籍和读者 信息写到文件里,同时将管理员信息也写道文件中。在每个退出系统的接口中都进行调用此函数,保证文件不丢失,同时更新文件信息。
3.调试分析
在进行调试时,有很多内存读写错误,问题的根本原因是在进行结构体赋值前,没有将结构体里面包含的结构体或者数组链表进行初始化,导致问题十分严重普遍。
4.用户手册
首先登陆时有两种登陆:读者和管理员。然后管理员登陆功能有采编入库,清除库存,读者模块,书籍查询,修改密码和用户名。读者登陆有借书,还书,续借,修改密码,查询借阅历史,查询截至日期。
管理员登陆用户名:123456,密码:123456 管理员初始用户名:20121002932,初始密码:167350 读者的ID和密码请到reader.txt文件中查询,文件格式见下面说明。文件的格式: 1.reader.txt:
其中第一行的数字“4”为当前读者总数,第二行为: ID 名字 密码 第三行的数字”0“为当前所借书籍数量,之后为所借书籍信息: 书号 名称 作者 借阅时间年 月 日 最后还书日期年 月 日 是否续借 第三行数字 “0”为历史所借书籍数量,之后为所借书籍信息: 书号 名称 作者 借阅时间年 月 日 还书日期年 月 日 是否续借 2.book.txt:
第一行数字”4“为当前书籍总数 第二行为书籍信息:
书号 书名 作者 现存量 总存量
第三行数字”0“为读者借阅历史,以《飞鸟集》为例:
ID
姓名
借阅时间年 月 日
还书时间年 月 日 是否续借 20121002932 王瑞林
114
17
5 17 1 3.adminer.txt:
第一行:管理员名称;
第二行:管理员登陆密码; 第三行:管理员初始用户名; 第四行:管理员初始密码;
第五行:锁定系统标志,此时为未锁定状态。
5.测试数据及测试结果
初始登陆界面:
管理员登陆界面:
采编入库:
清除库存: 读者模块:
删除读者:
此时删除读者后,读者文件中应该不存在该读者。书籍查询:
修改用户名和密码:
修改用户名:
修改密码:
修改用户名和密码后,退出系统后,查看adminer.txt文件,第一行和第二行为用户名和密码,将改变为4567890。读者登陆:
读者借书:
当读者借书成功之后退出系统,在reader.txt文件中对应读者的ID信息的缩进的第二级为读者当前所借书籍数量和所借书籍信息,在此之后可以看到读者现在所借书籍信息 读者还书:
读者还书后,在reader.txt文件中,缩进的第三级为读者历史借阅书籍数量和书籍信息,此时应该看到刚才还书的信息。
读者续借:
当读者还书成功后,对应的当前所借书籍的flag值为1.查询借阅历史:
查询截至日期: 修改登录密码:
当修改成功之后,reader.txt文件中对应读者的信息密码修改为当前密码。
6.致谢
感谢郭老师的指导,让我们在实践中提高了合理设计数据结构的能力,巩固了课堂所学。同时感谢王鑫学姐,帮助我们调试程序,并传输经验。
7.参考文献
《数据结构—使用C语言》第四版 朱站立编著 《C程序设计》第四版 谭浩强编著
第二篇:图书管理系统 数据结构 课程设计
《数据结构》
课程设计报告书
一.课程设计题目
图书借阅管理系统
二.课程设计内容
实现图书管理信息系统的设计
(一)管理员功能:
①登录:输入管理员密码,若密码错误则不得执行管理员操作。
②添加新书:增加新的图书资料,同时需检查新书的图书编号是否已存在于原图书资料中,若已存在则应取消添加或提示重新输入。
③修改图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,允许修改,否则提示 无该图书信息。
④删除图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,允许删除,否则提示无该图书信息。删除对象包括该图书资料以及“图书状态”和“借阅人”中与此书相关的所有记录。
⑤查找图书:
A.按书号查找:通过编号查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。
B.按书名查找:通过书名查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。
C.按作者查找:通过作者查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。
⑥查看全部图书:显示所有图书资料,包括书号、书名、作者、状态和借阅人等信息。
⑦修改读者:通过姓名查询该读者信息,若该姓名存在,则显示已有信息,允许修改,否则提示无该读者信息。
⑧删除读者:通过姓名查询该读者信息,若该姓名存在,则显示已有信息,允许删除,否则提示无该读者信息。删除对象包括该读者姓名、班级、电话以及“图书状态”和“借阅人”中与此人相关的所有记录。
⑨查看所有读者:显示所有读者资料,包括姓名、班级、电话等信息。
(二)读者功能:
①登录:输入读者姓名,若未经注册则不得进入读者服务界面。②注册:新用户经注册方可登录系统并使用读者服务功能。③借书:
A.输入所需图书编号,判断该编号是否存在,若不存在则提示重新输入。
B.若所输入图书编号存在,则判断该书籍是否已被借出,若已借则不允许执行借书操作。
C.若所输入图书未借,则提示输入读者姓名,判断所输入读者姓名是否存在,若不存在则提示重新输入。D.若读者姓名存在,则允许执行借书操作。
E.借书处理包括在“图书状态”中加上“已借”标记。④还书:
A.输入所借书编号,判断该编号是否存在,若不存在则提示重新输入。B.判断该书是否已借出,若未借则不允许执行还书操作。C.借书处理包括在“图书状态”中加上“未借”标记。⑤查询图书:
A.按书号查找:通过编号查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。
B.按书名查找:通过书名查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。
C.按作者查找:通过作者查询该图书资料,若该编号存在,则显示图书信息,否则提示无该图书信息。
⑥查看借阅情况:输入读者姓名,若该姓名不存在则提示重新输入,若该姓名存在则显示该读者借阅信息。
三.算法设计
1.流程图(部分示例)
①管理员登录
②读者登录
③读者借阅图书
④管理员或读者按书名查找图书
2.代码实现
#include
#include
//将字符串BookFile替换原文件中的宏名称book #define ReaderFile “reader.txt” using namespace std;//**********读者结构体,用于存放读者基本信息********** class Reader {
private:
char rname[10];
char rclass[10];
char rtel[10];public:
Reader()//构造函数,实现数据初始化
{strcpy(rname,“");strcpy(rclass,”“);strcpy(rtel,”“);} //初始化
void set_rname(char *rn)//设置读者姓名
{strcpy(rname,rn);} //将rn的字符复制给rname
char * get_rname()//获得读者姓名
{return rname;} //返回rname的值
void set_rclass(char *rc)//设置班级
{strcpy(rclass,rc);}
char *get_rclass()
//获得班级
{return rclass;}
void set_rtel(char *rt)
//设置电话
{strcpy(rtel,rt);}
char *get_rtel()
//获得电话
{return rtel;}
void copy(Reader m)//读者Reader结构体copy函数
{strcpy(rname,m.get_rname());strcpy(rclass,m.get_rclass());strcpy(rtel,m.get_rtel());} };//*********读者管理结构体,实现对读者用户的管理********* class ReaderManage {
Reader readers[50];//定义读者结构体数组对象,最多50位
int length;
void readFile()
//读取读者文件函数
{
ifstream fread;//定义输入文件流对象fread
length=0;
//计数
if(!fread)
{cout<<”读取磁盘文件失败!“< fread.open(ReaderFile,ios::binary);//使文件流与文件关联,以二进制方式打开 int i=0; while((fread.read((char *)&readers[i],sizeof(Reader))))//计算并返回所占字节数 i++; length=i; fread.close();//关闭磁盘文件 } void saveFile()//保存读者文件 { ofstream fwrite; //定义输出文件流对象fwrite if(!fwrite) {cout<<”文件保存失败!n“;exit(1);} fwrite.open(ReaderFile,ios::binary);//使文件流与文件关联,以二进制方式打开 fwrite.write((char *)readers,length*sizeof(Reader));//计算并返回所占字节数 fwrite.close();//关闭磁盘文件 } public: ReaderManage()//构造函数,读取读者文件 {readFile();} ~ReaderManage()//析构函数,保存读者文件 {saveFile();} void add_reader(Reader r)//添加读者用户函数 { if(length>=50) {cout<<”对不起,注册人数已满!n“;return;} readers[length].copy(r);//调用读者结构体copy函数 length++;} int search(char *rn)//按姓名查找读者函数 { for(int i=0;i if(strcmp(readers[i].get_rname(),rn)==0)//判断是否相等 return i; return-1; } bool revise(Reader reader,int i)//修改读者资料函数 { readers[i].copy(reader);//调用读者结构体cpoy函数 return true;} void delete_reader(int index)//删除读者函数 { for(int i=index;i readers[i].copy(readers[i+1]);//用后面的地址覆盖前面的地址 length--;} bool log_reader(Reader r)//登录时判断读者用户是否存在函数,相当于遍历 { for(int i=0;i if(strcmp(readers[i].get_rname(),r.get_rname())==0) return true; return false; } void reg_reader()//注册用户函数 { char n[10]; //姓名name char c[10]; //班级class char t[10]; //电话tel Reader reader; cout<<”nt请输入您的姓名:“; cin>>n; cout<<”nt请输入您的所在班级:“; cin>>c; cout<<”nt请输入您的联系电话:“; cin>>t; reader.set_rname(n);//调用读者结构体设置读者姓名函数 reader.set_rclass(c);//调用读者结构体设置读者班级函数 reader.set_rtel(t);//调用读者结构体设置联系电话函数 add_reader(reader);//调用读者结构体添加读者函数 cout<<”nt注册成功!“;} void show_reader()//不带参的显示读者信息函数 { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆读★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班级ttt电话n“; for(int i=0;i { cout< cout<<”ttt“< cout<<”ttt“< } } void show_reader(int i)//带参的显示读者信息函数 { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆读★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班级ttt电话n“; cout< cout<<”ttt“< cout<<”ttt“< } }; //********书籍结构体,用于存放书籍基本信息******** class Book { private: char bnum[10]; //书号 char bname[20]; //书名 char bauthor[10]; //作者 char rname[10]; //借阅人 public: int tag; //状态标记判断指标(已借/在架)Book() //构造函数初始化信息 {strcpy(bnum,”“);strcpy(bname,”“);strcpy(bauthor,”“);strcpy(rname,”“);tag=0;} void set_bnum(char *no) //设置书号 {strcpy(bnum,no);} //把字符串no中的字符复制到字符串bnum中 char *get_bnum() //获得书号 { return bnum;} //返回值为bnum void set_bname(char *n) //设置书名 {strcpy(bname,n);} char *get_bname() //获得书名 {return bname;} void set_bauthor(char *a) //设置作者 {strcpy(bauthor,a);} char * get_bauthor() //获得作者姓名 {return bauthor;} void set_tag(int t) //状态设置 {tag=t;} void set_rname(char *rn) //设置借阅人 {strcpy(rname,rn);} char *get_rname() //获得借阅人姓名 {return rname;} void show_tag() //显示图书状态 { if(tag==1) {cout<<”已借“;} else {cout<<”在架“;} } void copy(Book m) //Book结构体copy函数 { strcpy(bnum,m.get_bnum()); //将获得书号函数里的返回值里的字符复制到bnum strcpy(bname,m.get_bname()); strcpy(bauthor,m.get_bauthor()); tag=0; } };//**********书籍管理结构体,实现管理书籍功能********** class BookManage { private: Book books[100]; //定义Book书籍结构体数组对象,最大容量100本 int length; void saveFile() //保存书籍文件 { ofstream fwrite;//定义输出文件流ofstream结构体对象fwrite if(!fwrite) {cout<<”文件保存失败!n“;exit(1); } fwrite.open(BookFile,ios::binary);//使文件流与文件建立关联,以二进制方式打开 fwrite.write((char *)books,length*sizeof(Book));//计算并返回所占字节数 fwrite.close(); //关闭磁盘文件 } void readFile() //读取书籍文件 { ifstream fread;//定义输入文件流对象fread length=0; if(!fread) {cout<<”文件读取失败!“< Book temp; //定义书籍结构体临时对象temp int i=0; fread.open(BookFile ,ios::binary);//使文件流与文件建立关联,以二进制方式打开 while((fread.read((char *)&books[i],sizeof(Book)))) i++; //每读完一次,指针后移一位,直到不能读出正确结果为止 length=i; fread.close();} public: BookManage() //构造函数,读取磁盘文件 { length=0; //从头读起,计数,最大100 readFile(); //调用读取文件函数 } ~BookManage() //析构函数,保存磁盘文件 { saveFile(); //调用保存文件函数 } bool add(Book book) //添加图书资料 { if(length>=100) { cout<<”对不起,储存已满,您无法继续添加!n“; return-1; } else { books[length].copy(book);//调用书籍结构体copy函数 length++; return(length-1); } } int bnu_search(char *bnu) //按书号查找书籍 { for(int i=0;i if(strcmp(books[i].get_bnum(),bnu)==0)//字符串比较,判断是否相等 return i; return-1; } int bna_search(char *bna) //按书名查找书籍 { for(int i=0;i if(strcmp(books[i].get_bname(),bna)==0)//判断 return i; return-1; } int bau_search(char *bau)//按作者查找书籍 { for(int i=0;i if(strcmp(books[i].get_bauthor(),bau)==0)//判断 return i; return-1; } int rn_search(char *rn)//按借阅人查找书籍 { for(int i=0;i if(strcmp(books[i].get_rname(),rn)==0)//判断 return i; return-1; } void revise(Book book,int i)//带参的修改书籍函数 {books[i].copy(book);} //调用Book结构体copy函数 void deleteBook(int index)//带参的删除书籍资料函数 { for(int i=index;i books[i].copy(books[i+1]);//用后面的地址将当前的地址覆盖 length--; } void show_book()//不带参的显示书籍函数 { cout<<” ☆☆☆☆☆☆☆☆☆☆☆书★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”书号“; cout.width(10); cout<<”书名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”状态“; cout.width(25); cout<<”借阅人n“; for(int i=0;i { cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } } void show_book(int i)//带参的显示书籍函数 { cout<<” ☆☆☆☆☆☆☆☆☆☆☆书★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”书号“; cout.width(10); cout<<”书名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”状态“; cout.width(25); cout<<”借阅人n“; cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } void br_book()//读者借、还书功能函数 { ReaderManage reader; int choi;//选择 int a; //图书状态指标(1已借2在架) char sh[10];//需要还书的书号 char dz[10];//读者姓名 cin>>sh; int index=bnu_search(sh);//定义一个变量等于查找到的书号 if(index>=0) { if(books[index].tag==1)//已借 a=1; if(books[index].tag==0)//在架 a=2; switch(a) { case 1: cout<<”nt该书目前状态为<已借出>n“; cout<<”nt请选择您需要的服务:1:还书 0:返回n“; cin>>choi; cin.ignore();//清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响 if(choi!=1&&choi!=0) { cout<<”nt操作有误,请重新选择(0/1)!n“; return; } else if(choi==1) { cout<<”nt请输入您的姓名:“; cin>>dz; cin.ignore(); int index1=reader.search(dz); if(index1==-1) { cout<<”nt对不起,系统无该读者记录,新用户请先注册!“; return; } else { strcpy(dz,”“);//将读者姓名已空白代替 books[index].set_rname(dz);//借阅人一项变为空白 books[index].set_tag(0);//图书状态变为在架 cout<<”nt还书成功!“< } }break; case 2: cout<<”nt该书目前状态为<在馆>n“; cout<<”nt请您需要的服务:1:借书 0:返回n“; cin>>choi; cin.ignore(); if(choi!=1&&choi!=0) { cout<<”nt操作有误,请重新选择(0/1)!n“; return; } else if(choi==1) { cout<<”nt请输入您的姓名:“; cin>>dz; int index1=reader.search(dz); if(index1==-1) { cout<<”nt对不起,系统无改读者记录,新用户请先注册!“; return; } else { books[index].set_rname(dz); books[index].set_tag(1); cout<<”nt借书成功!“< } }break; } } else { cout<<”nt对不起,系统无该书记录!“;} } bool in(int i)//判断图书是否在架函数 { if(books[i].tag==1) return false; return true; } };//**********菜单结构体,实现界面引导********** class Menu { BookManage bm; //定义书籍管理结构体对象bm ReaderManage rm; //定义读者管理结构体对象rm Reader r; //定义读者结构体对象r private: int choice; //菜单序号选择 int key; //管理员密码 public: void header() //页眉 { system(”color fd“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 图 书 借 阅 管 理 系 统 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“;} void log_menu() //主界面登录菜单 { system(”color fd“); header(); cout<<”nttt< 请 选 择 登 录 身 份 >n“; cout<<”ntttt1: 管理员nntttt2: 读 者nntttt0: 退 出nt您的选择是: “;choice: cin>>choice; cin.ignore(); //清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响 switch(choice) { case 1: log_admin(); //管理员登录,需密码验证 break; case 2: reader_lr(); //读者登录或注册 break; case 0: exit(1); //退出系统 break; default: cout<<”nt您的操作有误,请重新选择(0→2): “; goto choice; } } void admin_menu() //管理员管理菜单 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 系★统★管★理★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 添加新的图书资料 2: 修改已有图书资料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 删除已有图书资料 4: 查找已有图书资料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 查看所有图书资料 6: 修改读者用户信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 7: 删除读者用户信息 8: 查看所有读者信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 9: 返回系统登录界面 0: 退出图书管理系统 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt请选择您需要的服务序号: “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: //添加图书 addBook(); bm.~BookManage(); break; case 2: //修改图书 reviseBook(); bm.~BookManage(); break; case 3: //删除图书 delBook(); bm.~BookManage(); break; case 4: //查找图书 absearch_menu(); break; case 5: //查看全部图书 bm.show_book(); cout<<”nt显示完毕!“; system(”pause“); admin_menu(); break; case 6: //修改读者 reviseReader(); rm.~ReaderManage(); break; case 7: //删除读者 delReader(); rm.~ReaderManage(); break; case 8: //查看所有读者 rm.show_reader(); cout<<”nt显示完毕!“; system(”pause“); admin_menu(); break; case 9: //返回系统登录界面 system(”cls“); log_menu(); case 0: //退出系统 exit(1); break; default: cout<<”nt您的操作有误,请重新选择(0→7): “; goto choice; } } void reader_menu() //读者服务菜单 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 读★者★服★务★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 借 阅 图 书 2: 归 还 图 书 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 查 找 图 书 4: 借 阅 情 况 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 返 上 一 级 0: 退 出 系 统 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt请选择您需要的服务序号: “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: cout<<”nt请输入您欲借阅的图书书号: “; bm.br_book(); bm.~BookManage(); break; case 2: cout<<”nt请输入您欲归还的图书书号: “; bm.br_book(); bm.~BookManage(); break; case 3: bsearch_menu(); break; case 4: rn_search(); break; case 5: system(”cls“); reader_lr(); break; case 0: exit(1); break; default: cout<<”nt您的操作有误,请重新选择(0→5): goto choice; } } void bsearch_menu() //读者查找书籍菜单 { system(“color f2”); cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆ 书★籍★查★找★界★面 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 1: 按 书号查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 2: 按 书名查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 3: 按 作者查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 4: 返 回 上 级 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 0: 退 出 系 统 ☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”; int bsc;//book search choice cout<<“nt请输入您需要的服务序号: ”; cin>>bsc; cin.ignore(); switch(bsc){ case 1: bnu_search(); break; case 2: bna_search(); “; break; case 3: bau_search(); break; case 4: reader_menu(); break; case 5: exit(1); default: cout<<”nt操作有误,请重新选择<0→4>“; break; } } void absearch_menu() //管理员查找书籍菜单 { system(”color f2“); cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 书★籍★查★找★界★面 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 1: 按 书号查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 2: 按 书名查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 3: 按 作者查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 4: 返 回 上 级 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 0: 退 出 系 统 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; int bsc;//book search choice cout<<”nt请输入您需要的服务序号: “; cin>>bsc; cin.ignore(); switch(bsc) { case 1: bnu_search(); break; case 2: bna_search(); break; case 3: bau_search(); break; case 4: admin_menu(); break; case 5: exit(1); default: cout<<”nt操作有误,请重新选择<0→4>“; break; } } void reader_lr()//读者登录或注册菜单 { system(”cls“); header(); system(”color f1“); cout<<”nttt< 读 者 登 录 界 面 >n“; cout<<”nttt 1: 登 录t2: 注 册nnttt 3: 返 回t0: 退 出nt您的选择是: “; int rlc;//reader login choice choice: cin>>rlc; cin.ignore(); switch(rlc) { case 1: //已注册读者登录 cout<<”nt请输入您的姓名: “; char rn[10];//reader name cin>>rn; r.set_rname(rn); if(rm.log_reader(r)) { cout<<”nt登录成功!“; system(”pause“); reader_menu(); } else cout<<”nt登录失败!新用户请先注册!“; system(”pause“); reader_lr(); break; case 2: //新用户注册 rm.reg_reader(); rm.~ReaderManage(); system(”pause“); reader_lr(); break; case 3: system(”cls“); log_menu(); case 0: exit(1); break; default: cout<<”nt您的操作有误,请重新选择(0→2): goto choice; } } void log_admin() //管理员登录 { cout<<“nt请输入管理员密码:”; int key; cin>>key; if(key==14125) { cout<<“nt登录成功!nnt”; system(“pause”); admin_menu(); //管理员操作菜单 } else {cout<<“nt登录失败!原因是密码错误!n”; cout<<“nt请选择 <1:返回上一级菜单 0:退出系统> cin>>choice; cin.ignore(); switch(choice) ”;“; { case 1: system(”cls“); log_menu(); break; case 0: exit(1); break; default: cout<<”nt操作有误,请重新选择(0/1)“; } } } void rn_search() //按书号查找函数 { char rn[10];//reader name cout<<”nt请输入您的姓名:“; cin>>rn; int index=bm.rn_search(rn); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无您的借阅记录!“; cout<<”nt“; system(”pause“); reader_menu(); } void bnu_search() //按书号查找函数 { char bnu[10]; cout<<”nt请输入您要查找的书号:“; cin>>bnu; int index=bm.bnu_search(bnu); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无该书籍记录!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bna_search() //按书名查找函数 { cout<<”nt请输入您要查找的书名:“< char bna[20]; cin>>bna; int index=bm.bna_search(bna); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无该书籍记录!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bau_search() //按作者查找函数 { cout<<”nt请输入您要查找的作者:“< char bau[10]; cin>>bau; int index=bm.bau_search(bau); if(index>=0) bm.show_book(index); else cout<<”nt对不起,系统无该书籍记录!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void addBook() //新增书籍函数 { char numb[10]; //书号 char nameb[20]; //书名 char authorb[10];//作者 Book book; //书籍结构体对象book int tag1;input1:cout<<”nt请输入新书书号:“; cin>>numb; int index=bm.bnu_search(numb); if(index==-1) { cout<<”nt系统目前尚无该书记录,您可以继续操作!n“; cout<<”nt请输入新书书名:“; cin>>nameb; cout<<”nt请输入新书作者:“; cin>>authorb; tag1=0; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); book.set_tag(tag1); bm.add(book); cout<<”nt恭喜您!新书资料录入成功!“; } else { cout<<”nt对不起,该书号纪录已存在!请重新输入!“; goto input1; } system(”pause“); admin_menu();} void reviseBook() //修改书籍函数 { char numb[10]; char nameb[20]; char authorb[10]; Book book; int index=-1;input2: cout<<”nt请输入您要修改书籍的书号:“; cin>>numb; index=bm.bnu_search(numb); if(index==-1) { cout<<”nt对不起,您输入的书号不存在,请重新输入!“< goto input2; return; } bool sta=bm.in(index);//判断是否在馆 if(sta) { cout<<”nt该书目前处于<在架>状态,您可以继续操作!“; cout<<”nt请输入更改后的书名:“; cin>>nameb; cout<<”nt请输入更改后的作者:“; cin>>authorb; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); bm.revise(book,index); cout<<”nt恭喜您!书籍资料修改成功!“;} else cout<<”nt该书已被借出,请于读者归还后再进行相关操作!“< system(”pause“); admin_menu(); } void delBook() //删除书籍函数 { char numb[10]; cout<<”nt请输入您要删除书籍的书号:“; cin>>numb; int index=bm.bnu_search(numb); if(index>=0) { cout<<”nt您确定要删除该书记录吗(y/n) “; char y; cin>>y; if(y=='y'||y=='Y') { bm.deleteBook(index); cout<<”nt删除成功!“; } else cout<<”nt删除取消!“; } else cout<<”nt对不起,系统没有该图书记录!“; system(”pause“); admin_menu(); } void reviseReader()//修改读者用户函数 { char namer[10]; Reader reader;get1: cout<<”nt请输入你要修改读者用户的姓名: “; cin>>namer; int index=rm.search(namer); if(index==-1) { cout<<”nt对不起,系统无改读者记录,重新输入请按1,返回请按0: int a; cin>>a;get2: cin.ignore(); switch(a) { case 1: goto get1; break; case 0: system(“pause”); admin_menu(); break; default: cout<<“nt您的操作有误,请重新选择(0/1): ”; goto get2; } return; } “; else { char namer[10]; char classr[10]; char telr[10]; Reader reader; cout<<”nt请输入更改后的读者姓名:“; cin>>namer; cout<<”nt请输入更改后的班级名称:“; cin>>classr; cout<<”nt请输入更改后的联系电话:“; cin>>telr; reader.set_rname(namer); reader.set_rclass(classr); reader.set_rtel(telr); cout<<”nt是否真的修改该记录(y/n?):“; char y; cin>>y; if(y=='y'||y=='Y') { rm.revise(reader,index); cout<<”nt修改成功!n“; } else cout<<”nt操作取消!n“; } system(”pause“); admin_menu(); } void delReader() //删除读者用户函数 { cout<<”nt请输入您要删除的读者用户的姓名:“< char namer[10]; cin>>namer; int index=rm.search(namer); if(index>=0) { cout<<”nt是否真的删除该记录(y/n?): “; char y; cin>>y; if(y=='y'||y=='Y') { rm.delete_reader(index); cout<<”nt删除成功!n“; } else cout<<”nt操作取消!n“; } else cout<<”nt对不起,系统尚无该读者记录!“; system(”pause“); admin_menu(); } };//********主函数******** int main(){ system(”color fd“);Menu menu;//定义菜单结构体对象menu cout<<”ttt 文计091-1 庞丽萍 200990514125 “;cout<<”ttt 当前日期:2011-6-22 星期三“;cout<<”ttt 当前时间:08:00 “;cout<<”nttt ★ 欢 “;cout<<”★ 迎 “; } cout<<”★ 进 “;cout<<”★ 入 ★nn";menu.log_menu();return 0;四.程序正确性验证 1主页面 2.管理员登陆页面 3.图书添加 五.课程设计过程中出现的问题、原因及解决方法 1.用户登录密码时,不能使用暗码来保护密码。(未解决成功)2.每个界面都能退出到主页面,而不是直接跳出系统。(以解决)3.书名字长太多影响书籍、作者、数量等之间的一一对应关系。(为解决成功) 六.课程设计的主要收获 通过这几天学习设计图书信息管理系统,认识到一切看似简单的事情只有自己动手做,明白了其中的原理才会更好的把它变成自己的东西。图书管理系统主要用到了文件的输入输出,以及利用简单的顺序查找知识,加深了对数据结构的理解与应用。对于这次的课程设计,首先,许多知识不仅仅只是课本上的,需要我们自己去图书馆或网上收集资料。其次,编程过程终遇到各种错误,需要我们耐心分析,讨论,最后得出正确结果。第三,程序无错,进行调试,然后进行加工修改优化。 七.对今后课程设计的建议 希望老师可以分小组做课程设计,题目可以相应的增大难度。分组可以锻炼团对合作能力,队员可以相互讨论解决问题,彼此能够激发更多的思想,做出更完善的作品,同时也防止了互相拷贝的情况,让每个同学都积极的参与到设计中,而不是坐享其成。 数据结构大作业 121279044 伍杨 数据结构大作业 图书管理系统 工程管理 121279044 伍杨 目录一、二、三、题目要求...................................................................2 总体设计...................................................................2 编码实现...................................................................3 1)定义图书结构体.......................................................3 2)登记操作...............................................................4 3)查看操作...............................................................8 4)删除操作.............................................................11 5)Main函数...........................................................20四、五、六、调试与测试..............................................................26 五心得体会..............................................................28 用户手册.................................................................28 数据结构大作业 121279044 伍杨 一、题目要求 1)目的要求 本课程设计任务的目的是要求学生按照分析、设计、编码、调试和测试的软件开发过程独立完成管理系统设计,以及C语言算法的掌握,并能最终实现本系统的功能要求,通过这个程序可以学习到以前调试短程序没有的的经验。2)题目要求 实现图书管理信息系统的设计。要求实现图书添加、显示全部图书、查询、借阅和归还。主要考查利用文件的操作! 二、总体设计 数据结构大作业 121279044 伍杨 三、编码实现 1)定义图书结构体 struct book{ char bookname[20]; //书名 int NO; //书编号 char type[20]; //类型 int date; //到书日期 };struct person{ char name[10]; //姓名 char classes[20]; //班级 int number; //学号 char telephone[12]; //联系电话 int NO; //书编号 char bookname[20]; //书名 int borrowdate; //借书日期 int returndate; //还书日期 数据结构大作业 121279044 伍杨 2)登记操作 void new_book(){ FILE *fp;struct book b;//登记新书 int i,j; printf(“请朱老师输入此次收到的书本总数:”);if((fp=fopen(“shuku.txt”,“a”))==NULL){ printf(“File open error!n”);exit(0);} scanf(“%d”,&i); for(j=0;j printf(“请朱老师输入书名:”);scanf(“%s”,b.bookname);fprintf(fp,“%s”,b.bookname);printf(“请朱老师输入书编号:”);scanf(“%d”,&b.NO);fprintf(fp,“ %d”,b.NO);printf(“请朱老师输入类型:”);scanf(“%s”,b.type); 数据结构大作业 121279044 伍杨 } } fprintf(fp,“ %s”,b.type);printf(“请朱老师输入到书日期:”);scanf(“%d”,&b.date);fprintf(fp,“ %d”,b.date);if(fclose(fp)){ } printf(“Can not close the file!n”);exit(0);void new_person() { FILE *fp;struct person p;char choice; //登记借书 if((fp=fopen(“jieshujilu.txt”,“a”))==NULL){ printf(“File open error!n”);exit(0);} 数据结构大作业 121279044 伍杨 printf(“请朱老师输入借书人姓名:”);scanf(“%s”,p.name);fprintf(fp,“%s”,p.name);printf(“请朱老师输入借书人班级:”);scanf(“%s”,p.classes);fprintf(fp,“ %s”,p.classes);printf(“请朱老师输入借书人学号:”);scanf(“%d”,&p.number);fprintf(fp,“ %d”,p.number);printf(“请朱老师输入借书人联系电话:”);scanf(“%s”,p.telephone);fprintf(fp,“ %s”,p.telephone);printf(“请朱老师输入书编号:”);scanf(“%d”,&p.NO);fprintf(fp,“ %d”,p.NO);printf(“请朱老师输入书名:”);scanf(“%s”,p.bookname);fprintf(fp,“ %s”,p.bookname);printf(“请朱老师输入借书日期:”);scanf(“%d”,&p.borrowdate);fprintf(fp,“ %d”,p.borrowdate); 数据结构大作业 121279044 伍杨 printf(“请朱老师输入还书日期:”);scanf(“%d”,&p.returndate);fprintf(fp,“ %d”,p.returndate);printf(“nt您想继续吗?(y/n)”);scanf(“ %c”,&choice);if(choice=='Y'||choice=='y'){ } system(“cls”);new_person();if(fclose(fp)){ } printf(“Can not close the file!n”);exit(0);}实现程序对文件的读取 void Read(){ int i=0;int j=0;ifstream in(“Libra.txt”,ios::out);in>>i; 数据结构大作业 121279044 伍杨 nt; } all=i;if(i>0&&i<=Max){ in>>data[j].id>>data[j].name>>data[j].type>>data[j].status>>data[j].coufor(j=1;j<=i;j++){ } } in.close(); 3)查看操作 v void see_book(){ FILE *fp;long NO;char bookname[20];char type[20];long date;//查看书库记录 数据结构大作业 121279044 伍杨 } if((fp=fopen(“shuku.txt”,“r”))==NULL){ } printf(“File open error!n”);exit(0);while(!feof(fp)){ fscanf(fp,“%s%ld%s%ld”,bookname,&NO,type,&date);printf(“%-10s %-10ld %-10s %ldn”,bookname,NO,type,date);};if(fclose(fp)){ } printf(“Can not close the file!n”);exit(0);void see_person(){ //查看所有借书记录 数据结构大作业 121279044 伍杨 FILE *fp;char name[10]; char classes[20]; int number;char telephone[20]; int NO; char bookname[20]; int borrowdate; int returndate; fscanf(fp,“%s %s %ld %s %ld %s %ld %ld”,name,classes,&number,telephonwhile(!feof(fp)){ if((fp=fopen(“jieshujilu.txt”,“r”))==NULL){ } printf(“File open error!n”);exit(0);e,&NO,bookname,&borrowdate,&returndate);printf(“%-5s %-5s %ld %-5s %ld %-5s %ld %ldn”,name,classes,number,telephone,NO,bookname,borrowdate,returndate); 数据结构大作业 121279044 伍杨 } };if(fclose(fp)){ } printf(“Can not close the file!n”);exit(0); 4)删除操作 void delete_books() { int number;void deletebooks(); printf(“请输入您要删除的书编号:”);scanf(“%d”,&number);FILE *fp;struct book b; //删除旧书 数据结构大作业 121279044 伍杨 if((fp=fopen(“shuku.txt”,“r”))==NULL){ } printf(“不能打开此文件!n”);exit(0);while(!feof(fp)){ fscanf(fp,“%s %d %s %d”,b.bookname,&b.NO,b.type,&b.date); } if(b.NO==number){ } printf(“nnt***************图书信息*******************n”);printf(“nt图书书名:%25s”,b.bookname);printf(“nt----------”);printf(“nt图书编号:%25d”,b.NO);printf(“nt----------”);printf(“nt图书类型:%23s”,b.type);printf(“nt----------”);printf(“nt到书日期:%25d”,b.date);printf(“nt----------”); deletebooks(); 数据结构大作业 121279044 伍杨 } void deletebooks(){ while(!feof(fp)){ fscanf(fp,“%s %d %s %d”,b.bookname,&b.NO,b.type,&b.date);if((fp=fopen(“shuku.txt”,“r”))==NULL){ } if((fp1=fopen(“tempshuku.txt”,“w”))==NULL){ //建立一个临时文件 } printf(“不能打开此文件!n”);exit(0);printf(“不能打开此文件!n”);exit(0);printf(“nn确认删除?请再次输入书编号:”);scanf(“%d”,&number);FILE *fp,*fp1,*fp2,*fp3;int number;struct book b; 数据结构大作业 121279044 伍杨 } if(b.NO==number)continue;else fprintf(fp1,“%s %d %s %d”,b.bookname,b.NO,b.type,b.date);fclose(fp);fclose(fp1);if((fp2=fopen(“tempshuku.txt”,“r”))==NULL){ } if((fp3=fopen(“shuku.txt”,“w”))==NULL){ //清空书库 } while(!feof(fp2)){ //将临时文件的内容写人源文件 } fscanf(fp2,“%s %d %s %d”,b.bookname,&b.NO,b.type,&b.date);fprintf(fp3,“%s %d %s %d”,b.bookname,b.NO,b.type,b.date);printf(“不能打开此文件!n”);exit(0);printf(“不能打开此文件!n”);exit(0); 数据结构大作业 121279044 伍杨 } void delete_returnbook(){ if((fp=fopen(“jieshujilu.txt”,“r”))==NULL){ } printf(“不能打开此文件!n”);exit(0);printf(“n请输入所还书本的书编号:”);scanf(“%d”,&numbers);FILE *fp;int numbers;struct person p;void deletereturnbook();char choice;printf(“n 删除成功!n”);fclose(fp2);fclose(fp3); //删除借书记录 数据结构大作业 121279044 伍杨 while(!feof(fp)){ fscanf(fp,“%s %s %ld %s %ld %s %ld %ld”,p.name,p.classes,&p.number,p.telephone,&p.NO,p.bookname,&p.borrowdate,&p.returndate); if(p.NO==numbers){ printf(“nt***************图书信息*******************n”);printf(“nt借书人姓名:%20s”,p.name);printf(“nt----------”);printf(“nt借书人班级:%20s”,p.classes);printf(“nt----------”);printf(“nt借书人学号:%20d”,p.number);printf(“nt----------”);printf(“nt借书人联系电话:%20s”,p.telephone);printf(“nt----------”);printf(“nt图书编号:%24d”,p.NO);printf(“nt----------”);printf(“nt图书名称:%23s”,p.bookname);printf(“nt----------”);printf(“nt借书日期:%25d”,p.borrowdate);printf(“nt----------”);printf(“nt还书日期:%25d”,p.returndate); 数据结构大作业 121279044 伍杨 } } } printf(“nt----------”); deletereturnbook(); printf(“nt您想继续吗?(y/n)”);scanf(“ %c”,&choice);if(choice=='Y'||choice=='y'){ } system(“cls”);delete_returnbook();fclose(fp);void deletereturnbook(){ FILE *fp,*fp1,*fp2,*fp3;struct person p; int numbers;printf(“nn确认删除?请再次输入书编号:”); 数据结构大作业 121279044 伍杨 scanf(“%d”,&numbers);if((fp=fopen(“jieshujilu.txt”,“r”))==NULL){ } if((fp1=fopen(“tempbook.txt”,“w”))==NULL){ } printf(“不能打开此文件!n”);exit(0);printf(“不能打开此文件!n”);exit(0);while(!feof(fp)){ fscanf(fp,“%s %s %d %s %d %s %d %d”,p.name,p.classes,&p.number,p.telephone,&p.NO,p.bookname,&p.borrowdate,&p.returndate); if(p.NO==numbers)continue;else fprintf(fp1,“%s %s %d %s %d %s %d %d”,p.name,p.classes,p.number,p.telephone,p.NO,p.bookname,p.borrowdat 数据结构大作业 121279044 伍杨 e,p.returndate); fscanf(fp2,“%s %s %d %s %d %s %d %d”,p.name,p.classes,while(!feof(fp2)){ //将临时文件写人源文件 if((fp2=fopen(“tempbook.txt”,“r”))==NULL){ } if((fp3=fopen(“jieshujilu.txt”,“w”))==NULL){ } printf(“不能打开此文件!n”);exit(0);printf(“不能打开此文件!n”);exit(0);fclose(fp);fclose(fp1);} &p.number,p.telephone,&p.NO,p.bookname,&p.borrowdate,&p.returndate); fprintf(fp3,“%s %s %d %s %d %s %d %d”,p.name,p.数据结构大作业 121279044 伍杨 classes,p.number,p.telephone,p.NO,p.bookname,p.borrowdate,p.returndate); } printf(“n 删除成功!n”);fclose(fp2);fclose(fp3);} 5)Main函数 int main(void){ do{ printf(“nnn 图书馆管理系统na”);printf(“ *******************************************************n”);int choice;char choice2;struct book;struct person; 数据结构大作业 121279044 伍杨 printf(“ ***朱老师您好吖********功能选项: 登记******请按1,******n”);printf(“ ******************************* 查看/查询*请按2 ******n”);printf(“ ******************************* 删除***** 请按3 ******n”);printf(“ ******************************* 退出***** 请按0 ******n”);printf(“ *******************************************************nnn”);printf(“ 请选择功能:”);scanf(“%d”,&choice);switch(choice){ case 1: printf(“ 登记选项:新书登记请按1,借书登记请按2,返回请按3n”);printf(“请选择:”);scanf(“%d”,&choice);switch(choice){ case 1: system(“cls”); //清屏 printf(“新书资料登记:nn”);new_book(); //新书登记 printf(“登记完毕!n”);printf(“n”);scanf(“ %c”,&choice2);system(“cls”);break; 数据结构大作业 121279044 伍杨 case 2: system(“cls”);printf(“借书资料登记:nn”);new_person(); //借书登记 printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 3: } break;system(“cls”);break; case 2: printf(“ 查看/查询选项:书库查看请按1,总借书记录查看请按2,到期记录查询请按3,返回请按4n”); printf(“请选择:”);scanf(“%d”,&choice);switch(choice){ case 1: system(“cls”);printf(“欢迎朱老师进入书库!nn”); 数据结构大作业 121279044 伍杨 printf(“书名 书编号 类型 到书日期n”);printf(“-----------n”);see_book(); //书库显示 printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 2: system(“cls”);printf(“欢迎朱老师进入借书记录!nn”);printf(“姓名 班级 学号 联系电话 书编号 书名 借书日期 到书日期n”); printf(“-------------------------n”);see_person(); //借书记录显示 printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 3: system(“cls”);search_person(); //显示符合记录 printf(“n press anykey ”); 数据结构大作业 121279044 伍杨 scanf(“ %c”,&choice2);system(“cls”);break;case 4: } break;system(“cls”);break;case 3: printf(“ 删除选项:旧书删除请按1,借书记录删除请按2,返回请按3n”); printf(“请选择:”);scanf(“%d”,&choice);switch(choice){ case 1: system(“cls”);delete_books(); //删除ing printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 2: 数据结构大作业 121279044 伍杨 } system(“cls”);delete_returnbook(); //删除ing printf(“n press anykey ”);scanf(“ %c”,&choice2);system(“cls”);break;case 3: } break;system(“cls”);break;case 0: } system(“cls”);}while(choice!= 0);return 0; 数据结构大作业 121279044 伍杨 四、调试与测试 主菜单 登记 数据结构大作业 121279044 伍杨 查看 删除 生成的文件内信息 数据结构大作业 121279044 伍杨五、五心得体会 经过这次大作业,我觉得代码的编写,最主要的的是编程思想,语言其实不是太重要,思路最重要! 六、用户手册 程序执行文件为 lib sys.exe,打开执行文件后按提示操作即可 数据库课程设计 设计名称:图书管理系统 组员:尚靖伟(122068) 张红凯(122072)班级:计G121班 信息工程学院计算机系 2013年6月27日 “Oracle数据库应用设计”指导书 Oracle数据库管理与设计 目 录 目录.........................................................................................................................I 前言.......................................................................................................................II 第1部分 Oracle管理技术........................................................................................1 实验1 实验2 实验3 实验4 实验5 实验6 实验7 实验8 第2部分 数据库管理................................................................................................................1 角色和用户管理........................................................................................................6 表和视图管理............................................................................................................8 索引和序列管理......................................................................................................12 PL/SQL编程...........................................................................................................14 使用游标、存储过程和触发器..............................................................................22 表空间管理..............................................................................................................26 文件管理..................................................................................................................30 Oracle开发技术......................................................................................36 I Oracle数据库管理与设计 前 言 数据库技术是计算机科学中发展最快的领域之一。随着网络技术的不断发展,数据库技术与网络技术相结合,已经广泛应用于工作和生活的各个领域。同时,数据库技术及其应用已经成为国内外高校计算机专业和许多非计算机专业的必修或选修课程。 Oracle是当前最流行的大型关系数据库之一,支持包括32位Windows、64位Windows、OS、HP-UX、AIX5L、Solaris和Linux等多种操作系统,拥有广泛的用户和大量的应用案例,已成为大型数据库应用系统的首选后台数据库系统。 本实验课程要求学生全面了解Oracle数据库的特点和功能。从安装配置、安全性、可用性、互操作性、PL/SQL、可开发性、商业智能等多个方面,对Oracle数据库的各项技术进行学习和实验。 通过学习Oracle数据库安装、管理及开发,为今后从事Oracle数据库管理和开发工作打下良好的基础。 本实验课程共分2个部分。第1部分为Oracle的管理技术,由实验1至实验8组成,内容包括:(1)数据库管理;(2)角色和用户管理;(3)表和视图管理;(4)索引和序列管理;(5)PL/SQL编程;(6)使用游标、存储过程和触发器;(7)表空间;(8)文件管理。第2部分为Oracle开发技术,要求完成基于一定背景的管理信息系统的数据库设计,如学生信息管理系统、图书管理系统、人事信息管理系统、网上购物系统等。 II 第1部分 Oracle管理技术 第1部分 Oracle管理技术 实验1 数据库管理 目的和要求 (1)了解Oracle数据库的逻辑结构和物理结构;(2)了解Oracle Enterprise Manager的使用情况;(3)学习关闭和启动数据库实例的方法;(4)学习使用SQL语句创建数据库的方法;(5)学习使用SQL语句删除数据库的方法。 实验准备 首先要了解Oracle数据库的逻辑结构,包括方案(schema)对象、数据块(data block)、区间(extent)、段(segment)和表空间(tablespace)等。数据库由若干个表空间组成,表空间由表组成,段由区间组成,区间则由数据块组成。Oracle数据库的物理结构由构成数据库的操作系统文件所决定。每个Oracle数据库都由3种类型的文件组成:数据文件、日志文件和控制文件。这些数据库文件为数据库信息提供真正的物理存储。 Enterprise Manager 9i是Oracle 9i提供的新的管理工具,简称EM。使用它可以完成启动、关闭数据库,创建、删除数据库等功能。只有系统管理员或拥有CREATE DATABASE权限的用户才能创建数据库。可以在Enterprise Manager中通过图形界面创建数据库,也可以使用CREATE DATABASE语句创建数据库。 实验内容 本实验主要包括以下内容。 (1)练习使用不同方法启动和关闭数据库实例。 (2)练习使用不同方法创建和删除数据库,要使操作的数据库为用户管理数据库UserMan。 1.使用SHUTDOWN命令关闭数据库实例 练习使用SHUTDOWN命令关闭数据库实例,分别按以下方式启动数据库实例。 (1)正常关闭。等待当前所有已连接的用户断开与数据库的连接,然后关闭数据库。正常关闭的语句如下: SHUTDOWN NORMAL (2)立即关闭。回退活动事务处理并断开所有已连接的用户,然后关闭数据库。立即关闭的语句如下: SHUTDOWN IMMEDIATE 第1部分 Oracle管理技术 (3)事务处理关闭。完成事务处理后断开所有已连接的用户,然后关闭数据库。事务处理关闭的语句如下: SHUTDOWN TRANSACTIONAL (4)中止关闭。中止数据库实例,立即关闭数据库。中止关闭的语句如下: SHUTDOWN ABORT 每次执行SHUTDOWN语句关闭数据库实例之前,请执行STARTUP命令启动数据库。2.使用STARTUP命令启动数据库实例 练习使用STARTUP命令启动数据库实例,分别按以下方式启动数据库实例。(1)启动数据库实例时不装载数据库。执行此操作的命令如下: STARTUP NOMOUNT (2)启动数据库实例,装载数据库,但不打开数据库。通常在数据库维护时执行此操作,对应的命令如下: STARTUP MOUNT (3)启动数据库实例,装载数据库,打开数据库。执行此操作的命令如下: STARTUP OPEN 第1部分 Oracle管理技术 (4)强制实例启动。在遇到特殊异常的情况时,可以强制启动实例。强制启动实例的语句如下: STARTUP FORCE 该语句将数据库强行启动到OPEN模式。 (5)启动后限制对数据库实例的访问。执行此操作的命令如下: STARTUP RESTRICT 每次执行STARTUP语句启动数据库实例之前,请执行SHUTDOWN命令关闭数据库。3.使用ORACLE Enterprise Manager关闭数据库实例 按照下面的步骤关闭数据库实例。 (1)在数据库处于打开状态时,使用SYS用户以SYSDBA身份登录到Enterprise Manager。在主目录页面的“一般信息”栏目中,可以看到“关闭”按钮。 (2)单击“关闭”按钮,可以打开“主机和目标数据库身份证明”页面。用户需要拥有管理员的权限才能关闭数据库实例,包括主机操作系统的管理员和当前数据库实例的SYSDBA用户。 (3)输入完成后,单击“确定”按钮,打开“确认关闭”页面。 (4)单击“是”按钮,开始关闭数据库。关闭操作完成后,单击“刷新”按钮,打开“启动数据库实例”页面。 4.使用ORACLE Enterprise Manager启动数据库实例 按照下面的步骤启动数据库实例。 第1部分 Oracle管理技术 (1)使用SYS用户以SYSDBA身份登录到Enterprise Manager。 (2)单击“启动”按钮,打开“主机和目标数据库身份证明”页面。用户需要拥有管理员的权限才能启动数据库实例,包括主机操作系统的管理员和当前数据库实例的SYSDBA用户。 (3)输入完成后,单击“确定”按钮,打开“确认打开”页面。(4)单击“是”按钮,开始打开数据库。5.使用SQL语句创建数据库 按照如下条件创建数据库OracleDB(以SYSDBA的用户身份连接到数据库)。 (1)设置SYS用户的密码为SYSPWD,设置SYSTEM用户的密码为SYSTEMPWD。(2)使用已有的控制文件。 (3)指定日志文件组redo01.log,大小为100MB;指定日志文件组redo02.log,大小为100MB。设置最大的日志文件数量为10。 (4)定义日志文件组中最大的日志文件数量为5。(5)定义最大的数据文件数量为100。(6)定义数据库中最大的实例数量为1。(7)定义存储数据的字符集为US7ASCII。 (8)定义数据文件名称为SYS01.dbf,初始大小为100MB。(9)定义默认的表空间为tbs_1。(10)定义临时表空间为tempts1。 (11)定义临时文件为temp01.dbf,大小为10MB。CREATE DATABASE语句实例: CREATE DATABASE OracleDB USER SYS IDENTIFIED BY bipt123 USER SYSTEM IDENTIFIED BY bipt123 CONTROLFILE REUSE MAXLOGFILES 10 MAXLOGMEMBERS 5 MAXDATAFILES 100 MAXINSTANCES 1 LOGFILE GROUP 1(‘E:redo01.log’)SIZE 100M ,GROUP 2(E:redo02.log’)SIZE 100M ,CHARACTER SET US7ASCII DATAFILE ‘E:sys01.dbf’ SIZE 100M REUSE EXTENT MANAGEMENT LOCAL DEFAULT TABLESPACE tbs_1 DEFAULT TEMPORARY TABLESPACE tempts1 TEMPFILE ‘E:temp01.dbf’ SIZE 10M REUSE;6.使用SQL语句删除数据库 按照如下步骤删除数据库UserMan。 (1)在删除数据库之前,需要用户以SYSDBA或SYSOPER身份登录,代码如下: CONNECT SYS/SYSPWD AS SYSDBA;其中SYSPWD为SYS用户的密码,请根据实际情况输入。(2)关闭数据库,再以MOUNT模式启动数据库,代码如下: 第1部分 Oracle管理技术 SHUTDOWN IMMEDIATE;STARTUP MOUNT;(3)删除数据库,代码如下: DROP DATABASE; 第1部分 Oracle管理技术 实验2 角色和用户管理 目的和要求 (1)了解Oracle数据库用户和角色的概念;(2)学习使用SQL语句创建Oracle用户;(3)学习使用SQL语句创建Oracle角色;(4)学习使用SQL语句指定用户的角色。 实验准备 (1)了解Oracle数据库用户可以分为6种类型,即数据库管理员、安全官员、网络管理员、应用程序开发员、应用程序管理员和数据库用户; (2)了解角色是对用户的一种分类管理办法,不同权限的用户可以分为不同的角色;(3)了解使用CREATE ROLE语句创建角色的方法;(4)了解使用DROP ROLE语句删除角色的方法;(5)了解使用GRANT语句指定用户角色的方法;(5)了解使用CREATE USER语句创建用户的方法;(4)了解使用DROP USER语句删除用户的方法。 实验内容 本实验主要包括以下内容。 (1)练习使用SQL语句创建数据库角色; (2)练习使用SQL语句为数据库角色授予权限;(3)练习使用SQL语句指定用户角色;(4)练习使用SQL语句创建数据库用户。 1.使用SQL语句创建数据库角色 参照下面的步骤练习使用CREATE ROLE语句创建数据库角色。(1)以SYSTEM用户登录到SQL*PLUS。 (2)使用CREATE ROLE语句创建角色UserManRole,密码为myrolepwd,代码如下: CREATE ROLE UserManRole IDENTIFIED BY myrolepwd; 2.使用SQL语句为数据库角色授权 参照下面的步骤练习使用GRANT语句为数据库角色授权。(1)以SYSTEM用户登录到SQL*PLUS。 第1部分 Oracle管理技术 (2)使用GRANT语句将角色UserManRole授予CONNECT和RESOURCE权限,代码如下: --设置角色权限 GRANT CONNECT TO UserManRole;GRANT RESOURCE TO UserManRole; 3.使用SQL语句创建数据库用户 参照下面的步骤练习使用CREATE USER语句创建数据库用户。(1)以SYSTEM用户登录到SQL*PLUS。 (2)使用CREATE USER语句创建用户UserManAdmin,密码为UserPwd,代码如下: CREATE USER UserManAdmin IDENTIFIED BY UserPwd DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP; (3)使用GRANT语句对用户UserManAdmin授予系统权限UNLIMITED TABLESPACE,代码如下: --设置系统权限 GRANT UNLIMITED TABLESPACE TO UserManAdmin; 4.使用SQL语句指定用户角色 参照下面的步骤将用户UserMan指定为角色UserManRole。(1)以SYSTEM用户登录到SQL*PLUS。 (2)使用GRANT语句将用户UserMan指定为角色UserManRole,代码如下: GRANT UserManRole TO UserManAdmin; 第1部分 Oracle管理技术 实验3 表和视图管理 目的和要求 (1)了解Oracle表和视图的概念;(2)学习使用SQL语句创建表; (3)学习使用SELECT语句查询数据;(4)学习使用SQL语句创建视图。 实验准备 (1)了解表是数据库中最常用的数据存储单元,它包括所有用户可以访问的数据。作为关系型数据库,Oracle表由行和列组成。 (2)视图是一个虚拟的表,它在物理上并不存在。视图可以把表或其它视图的数据按照一定的条件组合起来,所以也可以把它看成是一个存储的查询。视图并不包含数据,它只是从基表中读取数据。 (3)了解使用CREATE TABLE语句创建表的方法。(4)了解使用SELECT语句查询数据的方法。(5)了解使用SQL语句创建视图的方法。 实验内容 本实验主要包括以下内容。 (1)练习使用SQL语句创建表; (2)练习使用SQL语句向表中插入数据;(3)练习使用SQL语句修改表中的数据;(4)练习使用SQL语句删除表中的数据;(5)练习使用SELECT语句查询数据;(6)练习使用SQL语句创建视图。 1.使用SQL语句创建表 使用CREATE TABLE语句创建用户信息表Users,结构如表1所示。 表1 表Users的结构 编 号 1 2 3 4 字段名称 UserId UserName UserType UserPwd 数据结构 NUMBER VARCHAR2 40 NUMBER 1 VARCHAR2 40 用户编号 用户名 用户类型(1 管理员用户,2 普通用户) 说 明 参照下面的步骤练习使用CREATE TABLE语句创建表Users。 (1)以实验2中创建的UserManAdmin用户登录到SQL*PLUS。(2)使用CREATE TABLE语句创建表Users,代码如下: CREATE TABLE UserManAdmin.Users(UserId UserName UserType Number Primary Key, Varchar2(40)NOT NULL, Number(1),第1部分 Oracle管理技术 UserPwd);Varchar2(40)使用CREATE TABLE语句创建用户登录信息表LoginInfo,结构如表2所示。 表2 表LoginInfo的结构 编 号 1 2 字段名称 UserId LoginTime 数据结构 NUMBER CHAR(20) 说 明 用户编号 登录时间 参照下面的步骤练习使用CREATE TABLE语句创建表LoginInfo。(1)以实验2中创建的UserManAdmin用户登录到SQL*PLUS。(2)使用CREATE TABLE语句创建表LoginInfo,代码如下: CREATE TABLE UserManAdmin.LoginInfo(UserId LoginTime);Number, CHAR(20)NOT NULL 2.使用SQL语句向表中插入数据 使用INSERT语句向表Users中插入用户数据,内容如表3所示。 表3 表Users中的数据 UserId 1 2 3 4 UserName Admin User Zhangsan Lisi UserType 2 2 2 UserPwd AdminPwd UserPwd ZhangsanPwd LisiPwd 参照下面的步骤练习使用INSERT语句向表Users中插入数据。(1)以实验2中创建的UserManAdmin用户登录到SQL*PLUS。(2)使用INSERT语句向表Users中插入数据,代码如下: INSERT INTO UserManAdmin.Users VALUES(1, ‘Admin’, 1, ‘AdminPwd’);INSERT INTO UserManAdmin.Users VALUES(2, ‘User’, 2, ‘UserPwd’);INSERT INTO UserManAdmin.Users VALUES(3, ‘Zhangsan’, 2, ‘ZhangsanPwd’);INSERT INTO UserManAdmin.Users VALUES(4, ‘Lisi’, 2, ‘LisiPwd’);COMMIT;使用INSERT语句向表LoginInfo中插入数据。内容如表4所示。参照下面的步骤练习使用INSERT语句向表LoginInfo中插入数据。(1)以实验2中创建的UserManAdmin用户登录到SQL*PLUS。(2)使用INSERT语句向表LoginInfo中插入数据,代码如下: INSERT INTO UserManAdmin.LoginInfo VALUES(1, ‘2012-5-15 10:33:02’);INSERT INTO UserManAdmin.LoginInfo VALUES(1, ‘2012-5-16 08:34:13’);INSERT INTO UserManAdmin.LoginInfo VALUES(1, ‘2012-5-17 09:13:11’);INSERT INTO UserManAdmin.LoginInfo VALUES(2, ‘2012-5-15 07:35:02’);INSERT INTO UserManAdmin.LoginInfo VALUES(2, ‘2012-5-16 08:11:54’);INSERT INTO UserManAdmin.LoginInfo VALUES(2, ‘2012-5-17 09:13:11’);INSERT INTO UserManAdmin.LoginInfo VALUES(3, ‘2012-5-15 08:34:02’);INSERT INTO UserManAdmin.LoginInfo VALUES(3, ‘2012-5-16 09:34:13’); 第1部分 Oracle管理技术 INSERT INTO UserManAdmin.LoginInfo VALUES(3, ‘2012-5-17 10:13:09’);INSERT INTO UserManAdmin.LoginInfo VALUES(4, ‘2012-5-15 11:34:02’);INSERT INTO UserManAdmin.LoginInfo VALUES(4, ‘2012-5-16 13:34:13’);INSERT INTO UserManAdmin.LoginInfo VALUES(4, ‘2012-5-17 15:13:12’);COMMIT; 表4 表LoginInfo中的数据 UserId 1 1 1 2 2 2 3 3 3 4 4 4 LoginTime 2012-5-15 10:33:02 2012-5-16 08:34:13 2012-5-17 09:13:11 2012-5-15 07:35:02 2012-5-16 08:11:54 2012-5-17 09:13:11 2012-5-15 08:34:02 2012-5-16 09:34:13 2012-5-17 10:13:09 2012-5-15 11:34:02 2012-5-16 13:34:13 2012-5-17 15:13:12 3.使用SQL语句修改表中的数据 使用UPDATE语句可以修改表Users中的数据。参照下面的步骤练习将表Users中Admin用户的密码修改为AdminPassword。 (1)以SYSTEM用户登录到SQL*PLUS。 (2)使用UPDATE语句将表Users中Admin用户的密码修改为AdminPassword,代码如下: UPDATE UserManAdmin.Users SET UserPwd=‘AdminPassword’ WHERE UserName=‘Admin’ (3)使用SELECT语句查看用户Admin的密码,代码如下: SELECT UserPwd FROM UserManAdmin.Users WHERE UserName=‘Admin’ 修改表 ALTER TABLE USERMANADMIN.LOGININFO MODIFY(LOGINTIME DATE)4.使用SQL语句删除表中的数据 使用DELETE语句可以删除表Users中的数据。参照下面的步骤练习将表Users中Zhansan用户的记录删除。 (1)以SYSTEM用户登录到SQL*PLUS。 (2)使用DELETE语句将表Users中Zhangsan用户的记录删除,代码如下: DELETE FROM UserManAdmin.Users WHERE UserName=‘Zhangsan’ (3)使用SELECT语句查看表Users中的数据,确认用户Zhangsan的记录是否被删除,代码如下: SELECT * FROM UserManAdmin.Users 5.使用SELECT语句查询数据 使用SELECT语句查询数据库中的用户数据,分别按以下方式查询数据库。 第1部分 Oracle管理技术 (1)查询表Users中的所有数据。 以SYSTEM用户登录到SQL*PLUS,然后执行如下代码: SELECT * FROM UserManAdmin.Users *代表UserManAdmin.Users中的所有字段。(2)在返回结果中使用自定义标题。 以SYSTEM用户登录到SQL*PLUS,然后执行如下代码: SELECT UserName AS 用户名, UserPwd AS 密码 FROM UserManAdmin.Users(3)设置查询条件。 查询所有普通用户的信息。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码: SELECT * FROM UserManAdmin.Users WHERE UserType=2 查询用户Admin的密码信息。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码: SELECT UserPwd FROM UserManAdmin.Users WHERE UserName=‘Admin’ (4)对查询结果进行排序。 查询所有普通用户的信息,并按用户名的降序排列结果集。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码: SELECT * FROM UserManAdmin.Users ORDER BY UserName DESC(5)对记录进行统计。 统计表Users中共有多少个用户记录。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码: SELECT COUNT(*)FROM UserManAdmin.Users(6)实现连接查询。 查看每个用户的登录记录。以SYSTEM用户登录到SQL*PLUS,然后执行如下代码: SELECT u.UserName, 1.LoginTime FROM Users u INNER JOIN LoginInfo 1 ON u.UserId=1.UserID 在上面的SELECT语句中涉及两个表:表Users和表LoginInfo。在FROM子句中,为每个表指定一个别名,表Users的别名为u,表LoginInfo的别名为1。 6.使用SQL语句创建视图 使用CREATE VIEW语句创建用户登录信息表UserLogin,代码如下: CREATE VIEW UserLogin AS SELECT u.UserName,l.LoginTime FROM UserManAdmin.Users u INNER JOIN UserManAdmin.LoginInfo l ON u.UserId=l.UserID; SELECT * FROM UserLogin; 第1部分 Oracle管理技术 实验4 索引和序列管理 目的和要求 (1)了解索引的概念和作用;(2)了解序列的概念和作用; (3)学习使用SQL语句创建索引;(4)学习使用SQL语句创建序列。 实验准备 (1)了解索引是对数据库表中一个或多个列的值进行排序的结构。可以利用索引快速访问数据库表中的特定信息。 (2)了解序列号是一个Oracle整数,最多可有38个数字。序列的作用是自动生成整型数值,作为表中标识字段的值。有许多表在创建时定义了一个标识字段,此字段的值需要由系统自动生成,每当插入一条新记录时,此字段的值自动加1。在Oracle中,这个功能由序列来实现。 (3)了解使用CREATE INDEX语句创建索引的方法。 (4)了解使用CREATE SEQUENCE语句创建序列的方法。 实验内容 本实验主要包括以下内容。 (1)练习使用SQL语句创建索引;(2)练习使用SQL语句创建序列; 1.使用SQL语句创建索引 使用CREATE INDEX语句在Users表的UserName字段上创建索引。代码如下: CREATE INDEX index_username ON UserManAdmin.Users(UserName)TABLESPACE Users; 2.在创建表的同时创建索引 在使用CREATE TABLE语句创建表的同时,可以为指定字段创建索引。创建表Employees,在字段EmpName上创建索引。表Employees的结构如表5所示。 表5 表Employees的结构 编 号 1 2 3 4 字段名称 EmpId EmpName Sex UserId 数据结构 NUMBER VARCHAR2(50)CHAR(2)NUMBER 说 明 编号 姓名 性别 用户编号 代码如下: CREATE TABLE UserManAdmin.Employees(EmpId EmpName Sex Number, VARCHAR2(50)UNIQUE, CHAR(2),第1部分 Oracle管理技术 UserId);Number 3.使用SQL语句创建序列 使用CREATE SEQUENCE语句创建序列。序列的最小值为1,并且没有最大值限制。序列的初始值为1,序列间隔为1。代码如下: CREATE SEQUENCE EMP_S MINVALUE 1 NOMAXVALUE START WITH 1 INCREMENT BY 1 NOCYCLE CACHE 20;2.在插入数据时使用序列 在使用INSERT语句向表Employees中插入数据时,可以使用序列EMP_S生成字段EmpId的值,代码如下: INSERT INTO UserManAdmin.Employees(EmpId, EmpName)VALUES(EMP_S.NEXTVAL, ‘Employee1’);INSERT INTO UserManAdmin.Employees(EmpId, EmpName)VALUES(EMP_S.NEXTVAL, ‘Employee2’);INSERT INTO UserManAdmin.Employees(EmpId, EmpName)VALUES(EMP_S.NEXTVAL, ‘Employee3’);COMMIT;SELECT * FROM UserManAdmin.Employees 第1部分 Oracle管理技术 实验5 PL/SQL编程 目的和要求 (1)了解PL/SQL语言的结构; (2)了解PL/SQL变量和常量的声明和使用方法;(3)学习条件语句的使用方法;(4)学习分支语句的使用方法;(5)学习循环语句的使用方法;(6)学习使用Oracle系统函数。 实验准备 首先要了解PL/SQL语言是结构化程序设计语言。块(Block)是PL/SQL程序中最基本的结构,所有PL/SQL程序都是由块组成的。PL/SQL的块由变量声明、程序代码和异常处理代码3部分组成。在PL/SQL中,常量和变量在使用前必须声明,可以使用DECLARE对变量进行声明。 实验内容 本实验主要包括以下内容。 (1)练习条件语句的使用方法;(2)练习分支语句的使用方法;(3)练习循环语句的使用方法;(4)练习使用Oracle系统函数。 1.使用条件语句 参照下面的步骤练习使用条件语句。 (1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。 SET ServerOutput ON;DECLARE Num INTEGER :=-11;BEGIN IF Num < 0 THEN dbms_output.put_line(‘负数’); ELSIF Num > 0 THEN dbms_output.put_line(‘正数’); ELSE dbms_output.put_line(‘0’); END IF;END; 第1部分 Oracle管理技术 2.使用分支语句 参照下面的步骤练习使用分支语句。 (1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。 SET ServerOutput ON;DECLARE varDAY INTEGER := 3; Result VARCHAR(20);BEGIN Result := CASE varDAY WHEN 1 THEN ‘星期一’ WHEN 2 THEN ‘星期二’ WHEN 3 THEN ‘星期三’ WHEN 4 THEN ‘星期四’ WHEN 5 THEN ‘星期五’ WHEN 6 THEN ‘星期六’ WHEN 7 THEN ‘星期日’ ELSE ‘数据越界’ END; dbms_output.put_line(Result);END; 第1部分 Oracle管理技术 3.使用循环语句 LOOP…EXIT…END语句:此语句的功能是重复执行循环体中的程序块,直到执行EXIT语句,退出循环。 LOOP…EXIT WHEN…END:此语句的功能是重复执行循环体中的程序块,直到满足EXIT WHEN后面的判断语句时,退出循环。 WHILE…LOOP…END LOOP语句:此语句的功能是当WHILE后面的条件语句成立时,重复执行循环体中的程序块。 参照下面的步骤练习使用循环语句。 (1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。 程序一: SET ServerOutput ON;DECLARE v_Num INTEGER := 1; v_Sum INTEGER := 0;BEGIN LOOP v_Sum := v_Sum + v_Num; dbms_output.put_line(v_Num); IF v_Num = 3 THEN EXIT; END IF; dbms_output.put_line(‘+’); v_Num := v_Num + 1; END LOOP; dbms_output.put_line(‘=’); dbms_output.put_line(v_Sum);END; 程序二: SET ServerOutput ON;DECLARE v_Num INTEGER := 1; v_Sum INTEGER := 0;BEGIN LOOP v_Sum := v_Sum + v_Num; 第1部分 Oracle管理技术 dbms_output.put_line(v_Num); EXIT WHEN v_Num = 3; dbms_output.put_line(‘+’); v_Num := v_Num + 1; END LOOP; dbms_output.put_line(‘=’); dbms_output.put_line(v_Sum);END; 程序三: SET ServerOutput ON;DECLARE v_Num INTEGER := 1; v_Sum INTEGER := 0;BEGIN WHILE v_Num <=3 LOOP v_Sum := v_Sum + v_Num; dbms_output.put_line(v_Num); IF v_Num < 3 THEN dbms_output.put_line(‘+’); END IF; v_Num := v_Num + 1; END LOOP; dbms_output.put_line(‘=’); dbms_output.put_line(v_Sum);END; 第1部分 Oracle管理技术 4.使用系统函数(1)数值型函数 ·ABS:返回给定数字表达式的绝对值。 ·CEIL:返回大于或等于所给数字表达式的最小整数。·FLOOR:返回小于或等于所给数字表达式的最大整数。·POWER:返回给定表达式指定次方的值。 ·ROUND:返回数字表达式并四舍五入为指定的长度或精度。(2)字符型函数 ·ASCII:返回字符表达式最左端字符的ASCII代码值。·LENGTH:返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。·UPPER:返回将小写字符数据转换为大写的字符表达式。(3)日期型函数 ·SYSDATE:返回当前日期和时间。·TO_CHAR:转换日期为字符串。 ·LAST_DAY:返回指定日期所在月份的最后一天的日期。这个函数可以被用来确定当前月中还剩下多少天。 ·MONTHS_BETWEEN:返回两个日期之间月的数目。(4)统计函数 ·COUNT:返回组中项目的数量。·MAX:返回表达式的最大值。·MIN:返回表达式的最小值。 参照下面的步骤练习使用系统函数。 (1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。 程序一: SET ServerOutput ON;BEGIN dbms_output.put_line(ABS(-4));END; 程序二: SET ServerOutput ON;BEGIN dbms_output.put_line(CEIL(116.24)); dbms_output.put_line(CEIL(-112.75)); dbms_output.put_line(CEIL(0));END; 第1部分 Oracle管理技术 程序三: SET ServerOutput ON;BEGIN dbms_output.put_line(FLOOR(116.24)); dbms_output.put_line(FLOOR(-112.75)); dbms_output.put_line(FLOOR(0));END; 程序四: SET ServerOutput ON;BEGIN dbms_output.put_line(POWER(15, 4));END; 程序五: SET ServerOutput ON;BEGIN dbms_output.put_line(ROUND(123.456, 2)); dbms_output.put_line(ROUND(123.456, 1)); dbms_output.put_line(ROUND(123.456, 0)); dbms_output.put_line(ROUND(123.456,-1)); dbms_output.put_line(ROUND(123.456,-2)); dbms_output.put_line(ROUND(123.456,-3));END; 程序六: SET ServerOutput ON;BEGIN dbms_output.put_line(ASCII(‘ABC’));END; 第1部分 Oracle管理技术 程序七: SELECT UserName, LENGTH(UserName)FROM UserManAdmin.Users WHERE UserType = 1;程序八: SET ServerOutput ON;BEGIN dbms_output.put_line(UPPER(‘abc’));END; 程序九: SET ServerOutput ON;BEGIN dbms_output.put_line(SYSDATE);END; 程序十: SET ServerOutput ON;BEGIN dbms_output.put_line(TO_CHAR(SYSDATE));END; 程序十一: SET ServerOutput ON;BEGIN dbms_output.put_line(LAST_DAY(SYSDATE));END; 第1部分 Oracle管理技术 程序十二: SET ServerOutput ON;DECLARE date1 VARCHAR(20):= ‘2010-05-17’; date2 VARCHAR(20):= ‘2010-10-17’;BEGIN dbms_output.put_line(END; MONTHS_BETWEEN(TO_DATE(date2,‘yyyy-mm-dd’), TO_DATE(date1, ‘yyyy-mm-dd’))); 程序十三: SELECT COUNT(UserName)FROM UserManAdmin.Users; 程序十四: SELECT MAX(UserId)FROM UserManAdmin.Users; 程序十五: SELECT MIN(UserId)FROM UserManAdmin.Users; 第1部分 Oracle管理技术 实验6 使用游标、存储过程和触发器 目的和要求 (1)了解游标的概念和工作原理;(2)了解存储过程的分类和使用方法;(3)了解触发器的概念; (4)学习编写和执行自定义过程;(5)学习编写和执行自定义函数;(6)学习创建和使用触发器。 实验准备 首先要了解游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了。将游标放置到某行后,即可对该行数据进行操作,最常见的操作是提取当前行数据。 了解PL/SQL包括3种存储过程,即过程、函数和程序包。 了解触发器是一种特殊的存储过程,当指定表中的数据发生变化时自动运行。 实验内容 本实验主要包括以下内容。 (1)练习创建和使用游标的方法; (2)练习编写和执行自定义过程的方法;(3)练习编写和执行自定义函数的方法;(4)练习创建和使用触发器的方法。 1.创建和使用游标 创建游标MyCursor,从表LoginInfo中读取指定用户的登录信息,操作步骤如下:(1)以UserManAdmin用户登录到SQL*PLUS。(2)执行如下程序: /*打开显示模式*/ SET ServerOutput ON;DECLARE CURSOR Mycursor(varUserName VARCHAR2)IS SELECT u.UserName,l.LoginTime FROM UserManAdmin.Users u, UserManAdmin.LoginInfo l WHERE u.UserId =l.UserId;BEGIN FOR var_LoginRecord IN MyCursor(‘Admin’)LOOP dbms_output.put_line(‘用户名:’ || var_LoginRecord.UserName || ‘, 登录时间:’ || var_LoginRecord.LoginTime); END LOOP;END; 第1部分 Oracle管理技术 2.编写和执行自定义过程 参照下面的步骤练习编写和执行自定义过程:(1)以UserManAdmin用户登录到SQL*PLUS。(2)执行如下程序,观察结果。 /*创建示例过程ResetPwd,此过程的功能是将表User中指定用户的密码重置为111111*/ CREATE OR REPLACE PROCEDURE UserManAdmin.ResetPwd(u_UserId IN NUMBER)AS BEGIN UPDATE UserManAdmin.Users SET UserPwd = ‘111111’ WHERE UserId = u_UserId;END; /*使用EXEXUTE命令可以调用过程。如,要将编号为1(用户Admin)的用户密码重置*/ EXECUTE UserManAdmin.ResetPwd(1);SELECT UserName, UserPwd FROM Users; 第1部分 Oracle管理技术 /*使用DROP PROCEDURE命令可以删除过程*/ DROP PROCEDURE UserManAdmin.ResetPwd; 3.编写和执行自定义函数 参照下面的步骤练习编写和执行自定义函数GetLastLogin,获取指定用户最后一次登录的时间。 (1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序: CREATE OR REPLACE FUNCTION GetLastLogin(n_name IN UserManAdmin.Users.UserName%Type)RETURN UserManAdmin.LoginInfo.LoginTime%Type AS outTime UserManAdmin.LoginInfo.LoginTime%Type;BEGIN SELECT MAX(l.LoginTime)INTO outTime FROM UserManAdmin.Users u join UserManAdmin.LoginInfo l on u.UserId = l.UserId WHERE u.UserName = ‘’|| n_name ||’’ ORDER BY l.LoginTime DESC; RETURN outTime;END; 4.创建和使用触发器 参照下面的步骤创建一个触发器MyTrigger,它的作用是当表Users中的记录被删除后,自动删除表LoginInfo中对应的用户登录记录,从而保证数据的完整性。 (1)以SYSTEM用户登录到SQL*PLUS。(2)执行如下程序,观察结果。 CREATE OR REPLACE TRIGGER UserManAdmin.MyTrigger AFTER DELETE ON UserManAdmin.Users FOR EACH ROW BEGIN DELETE FROM UserManAdmin.LoginInfo WHERE UserId = :old.UserId;END; 第1部分 Oracle管理技术 (3)执行下面的语句,观察删除用户Users后,在表LoginInfo中是否还存在其登录的记录。 DELETE FROM UserManAdmin.Users WHERE UserName =’User’; SELECT * FROM UserManAdmin.LoginInfo 第1部分 Oracle管理技术 实验7 表空间管理 目的和要求 (1)了解表空间的概念和工作原理; (2)学习创建、修改、查询和删除用户表空间; (3)学习创建、修改、查询、切换和删除撤销表空间。 实验准备 首先要了解表空间是Oracle数据库最高层次的逻辑存储结构,其中保存着由段、区和块等逻辑存储结构描述的各种模式对象。 Oracle表空间分为系统表空间、临时表空间、撤销表空间和用户表空间4种类型。用户表空间主要用来保存用户数据,其包含的数据文件称为用户数据文件,是DBA管理的主要表空间。 保存撤销记录的存储空间是撤销表空间。利用撤销表空间可以实现撤销事务、数据库恢复和数据的读一致性等功能。 实验内容 本实验主要包括以下内容。 (1)练习创建和使用用户表空间的方法;(2)练习创建和使用撤销表空间的方法。 1.创建本地管理方式的用户表空间 为Oracle数据库新建一个用户表空间,该表空间中包括2个数据文件,区的分配管理方式为AUTOALLOCATE或UNIFORM,段的存储管理方式为MANUAL或AUTO。操作步骤如下: (1)在SQL*Plus中执行CREATE TABLESPACE语句创建新的用户表空间,并通过查询V$TABLESPACE视图查看新建用户表空间情况。 Create tablespace newspace Datafile ‘D:oracleoradatanew01.dbf’ size 10m 第1部分 Oracle管理技术 (2)通过OEM控制台创建新的临时表空间,并查看新建用户表空间情况。 2.创建本地管理方式的临时表空间 为Oracle数据库新建一个临时表空间,该表空间中包括1个数据文件,并设置该表空间为默认临时表空间。操作步骤如下: (1)在SQL*Plus中执行CREATE TEMPORARY TABLESPACE语句创建新的临时表空间,设置该表空间为默认临时表空间,并通过查询V$TABLESPACE视图查看新建临时表空间情况。 CREATE TEMPORARY TABLESPACE newtemp tempfile 'D:oracleoradatanewtemp01.dbf' size 10m; select * from V$tablespace; (2)通过OEM控制台创建新的临时表空间,设置该表空间为默认临时表空间,并查看新建临时表空间情况。 3.改变表空间的可用性 将新建的用户表空间设置为脱机状态,之后再将其改为联机状态。操作步骤如下:(1)在SQL*Plus中执行ALTER TABLESPACE语句设置表空间为脱机状态,并通过查询DBA_TABLESPACES视图查看表空间的状态,之后再执行ALTER TABLESPACE语句设置表空间为联机状态。 Alter tablespace newspace Add datafile ‘D:oracleoradatanew02.dbf’ size 10m 第1部分 Oracle管理技术 (2)通过OEM控制台设置表空间为脱机状态或联机状态,并查看修改之后的表空间状态。 4.删除表空间 删除无用的表空间及其在磁盘上的数据文件。操作步骤如下: (1)在SQL*Plus中执行DROP TABLESPACE语句删除表空间及其在磁盘上的数据文件。 Drop tablespace newspace; (2)通过OEM控制台删除表空间及其在磁盘上的数据文件。 5.查询表空间的各种信息 查询表空间的各种信息。操作步骤如下:(1)在SQL*Plus中查询V$TABLESPACE、DBA_TABLESPACES、DBA_SEGMENTS、DBA_EXTENTS、DBA_FREE_SPACE、V_$DATAFILE和V$TEMPFILE动态性能视图获得表空间的信息。 (2)在OEM控制台中查询表空间的信息。 6.创建撤销表空间 在数据库建立后创建一个撤销表空间,并设置该表空间为默认撤销表空间。操作步骤如 第1部分 Oracle管理技术 下: (1)在SQL*Plus中执行CREATE UNDO TABLESPACE语句创建一个撤销表空间,并执行ALTER SYSTEM语句修改初始化参数UNDO_TABLESPACE,设置该撤销表空间为默认撤销表空间。 CREATE UNDO TABLESPACE undotb datafile 'D:oracleoradataundotb01.dbf' size 2m reuse; (2)通过OEM控制台向某一撤销表空间中添加新的数据文件,并查看新的数据文件情况。 7.查询撤销表空间的各种信息 查询表空间的各种信息。操作步骤如下: (1)在SQL*Plus中查询V$UNDOSTAT、V$ROLLSTAT、V$TRANSACTION、DBA_UNDO_EXTENTS动态性能视图获得撤销表空间的信息。 select * from V$tablespace; (2)利用V$UNDOSTAT动态性能视图计算撤销表空间所需要的存储空间。 第1部分 Oracle管理技术 实验8 文件管理 目的和要求 (1)了解初始化参数文件、控制文件、重做日志文件和数据文件的概念;(2)学习创建和使用初始化参数文件; (3)学习创建、备份、查询和删除控制文件;(4)学习创建和使用重做日志文件; (5)学习添加、移动、查询和删除数据文件。 实验准备 首先要了解初始化参数文件是Oracle实例运行所需的参数配置文件,Oracle数据库的物理结构、实例中的内存结构,以及启动后台进程的种类和数量等参数,都需要在初始化参数文件中设置,是数据库运行和性能调整的重要文件。初始化参数文件分为两类:PFILE和SPFILE。PFILE是文本形式的初始化参数文件,可以利用任何文本编辑器对它进行查看或编辑。SPFILE的作用同PFILE一样,但是该文件是二进制的,无法用文本编辑器查看或修改。 控制文件是一个非常小的二进制文件,其中存放有Oracle数据库物理结构(数据文件和重做日志文件等)的信息,是Oracle启动和运行必备的文件。 重做日志文件中保存着事物对数据库进行的修改的重做项,是数据库进行恢复的必要部分。重做日志文件分为联机重做日志文件和归档重做日志文件。 数据文件是Oracle主要的物理存储结构之一。一个表空间可以有多个数据文件,一个数据文件只属于一个表空间。数据文件可分成系统数据文件、撤销数据文件、临时数据文件和用户数据文件。 实验内容 本实验主要包括以下内容。 (1)练习创建和使用初始化参数文件;(2)练习创建和使用控制文件;(3)练习创建和使用重做日志文件;(4)练习添加和使用数据文件。 1.创建初始化参数文件 创建PFILE和SPFILE文件。操作步骤如下: (1)找到已有的PFILE文件,使用COPY或者在Windows资源管理器中使用复制/粘贴功能,创建一个新的PFILE文件。 (2)使用CREATE PFILE FROM SPFILE命令创建一个新的PFILE文件。 第1部分 Oracle管理技术 (3)利用OEM创建一个新的PFILE文件。 (4)使用CREATE SPFILE FROM PFILE命令创建一个新的SPFILE文件。create spfile='D:oracleora92databaseininew01.ora' pfile='D:oracleadminBIPT921pfile init.ora.23201322748'; from (5)利用OEM创建一个新的SPFILE文件。 2.修改初始化参数 修改SPFILE文件中的初始化参数。操作步骤如下: (1)在SQL*Plus中使用动态性能视图V$SYSTEM_PARAMETER查看初始化参数值和属性。 (2)使用ALTER SYSTEM SET 参数名=参数值 SCOPE=SPFILE | MEMORY | BOTH 第1部分 Oracle管理技术 命令修改其中的动态或静态的初始化参数。 (3)再使用动态性能视图V$SYSTEM_PARAMETER或在OEM中查看初始化参数值是否被修改。 (4)或者在OEM中修改其中的初始化参数,并查看初始化参数值和属性。3.备份控制文件 为Oracle数据库备份一个控制文件。操作步骤如下: (1)使用ALTER DATABASE BACKUP CONTROLFILE TO命令备份控制文件。 (2)在OEM控制台中备份控制文件。 4.查询控制文件信息 查询控制文件中的各种信息。操作步骤如下:(1)在SQL*Plus中查询V$CONTROLFILE、V$CONTROLFILE_RECORD_SECTION、V$PARAMETER动态性能视图获得控制文件的基本信息和记录文档段信息。 第1部分 Oracle管理技术 (2)在OEM控制台中查询控制文件的基本信息和记录文档段信息。 5.创建多路联机重做日志文件组 为Oracle数据库新建一个联机重做日志组,该组包含2个成员。操作步骤如下:(1)使用SYSDBA身份登录SQL*Plus。 (2)查询V$LOGLFILE视图,了解目前的重做日志文件组情况。 (3)执行ALTER DATABASE ADD LOGFILE命令增加一个重做日志文件组,该组包含2个成员。 (4)重新查询V$LOGLFILE视图,查看新建重做日志文件组情况。 6.使用LogMiner Viewer工具对重做日志文件进行分析 使用LogMiner Viewer工具分析重做日志文件,获得指定用户在规定的时间段内对数据库所进行的更改。操作步骤如下: (1)启动OEM控制台,登录Oracle管理服务器。(2)启动LogMiner Viewer。(3)设置查询条件。 (4)执行并分析查询结果。(5)保存分析结果。 7.向表空间中添加数据文件 向表空间中添加一个新的数据文件。操作步骤如下:(1)在SQL*Plus中使用ALTER TABLESPACE...ADD DATAFILE语句向某一表空间中添加一个数据文件,并通过查询DBA_DATA_FILES视图查看新建数据文件的情况。 ALTER TABLESPACE dtf add datafile 'D:oracleadminBIPT921pfileinit.ora.23201322748' size 10m reuse; 第1部分 Oracle管理技术 (2)通过OEM控制台添加新的数据文件,并查看新的数据文件情况。 8.移动单个数据文件 将表空间中某个数据文件从一个物理磁盘移动到另一个磁盘。操作步骤如下: (1)在SQL*Plus中使用ALTER TABLESPACE语句将包含有需要移动数据文件的表空间脱机。 ALTER TABLESPACE dtf offline; (2)在操作系统中,将数据文件复制到另一个磁盘上。 (3)使用ALTER TABLESPACE语句对表空间中的数据文件重命名。alter tablespace XDB rename datafile'XDB01.DBF'to'XDB02.DBF'(4)使用ALTER TABLESPACE语句重新使该表空间联机。ALTER TABLESPACE dtf online; (5)通过查询DBA_DATA_FILES视图获得移动后的数据文件信息。9.删除数据文件 删除无用的数据文件。操作步骤如下: (1)在SQL*Plus中使用ALTER DATABASE语句删除某一数据文件。 (2)通过OEM控制台删除某一数据文件。 10.查询数据文件的各种信息 查询数据文件的各种信息。操作步骤如下: 第1部分 Oracle管理技术 (1)在SQL*Plus中查询DBA_DATA_FILES、DBA_EXTENTS、DBA_FREE_SPACE、V$DATAFILE、V$DATAFILE_HEADER动态性能视图获得数据文件的信息。 (2)在OEM控制台中查询数据文件的信息。 第2部分 Oracle开发技术 第2部分 Oracle开发技术 设计目的 利用所学的有关数据库设计知识,设计一个基于Oracle数据库的信息管理系统。通过该部分的操作与实践,使学生能够在完成第一部分任务的基础上,进一步巩固Oracle数据库应用的方法和技术,提高基于Oracle数据库的应用程序综合设计能力。 设计任务 数据库设计: (1)通过对应用系统的数据库需求分析,确定系统的服务范围,绘制系统业务流程图,设计系统功能和绘制系统功能图,设计数据流图和数据字典; (2)采用自底向上的方法设计E-R图; (3)依据关系规范化原则设计应用系统数据库全局关系模式;(4)依照数据库全局关系模式设计数据库中各表的表结构。 界面设计:(1)数据库准备; (2)创建工程并添加所需控件;(3)主要功能模块的界面设计。 设计题目 1.图书管理系统 图书管理系统包括对所有图书基本信息的维护,实现图书管理的需求,包括图书档案、图书查询、图书资料统计和图书借阅、归还等功能。 图书管理系统读者信息用户图书信息管理图书借阅管理读者号读者名已借数量最大借阅数量用户名密码ISBN书名作者出版社数量图书借阅图书归还 第2部分 Oracle开发技术 建立角色: CREATE ROLE br IDENTIFIED BY asd;GRANT CONNECT TO br;GRANT RESOURCE TO br; 建立用户: CREATE USER Book IDENTIFIED BY asd DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP;授权: GRANT UNLIMITED TABLESPACE TO Book;GRANT br TO Book; 建立bookusers表 CREATE TABLE Book.BookUsers(UserId Number Primary Key, UserName Varchar2(40)NOT NULL, UserType Number(10), UserPwd Varchar2(40)); create table book.reader 第2部分 Oracle开发技术 (reader_id varchar(20)primary key, reader_name varchar(20), maxlend int, alreadylen int) create table borrow(reader_id varchar(20), ISBN varchar(20), lendtime date, returntime date, primary key(reader_id,ISBN))foreign key(reader_id)references book.reader(reader_id), foreign key(ISBN)references book(ISBN) 插入数据: INSERT INTO Book.BookUsers VALUES(1, ‘shang’, 1, ‘123’);INSERT INTO Book.BookUsers VALUES(2, ‘zhang’, 2, ‘456’); INSERT INTO Book.BookUsers VALUES(3, ‘shangjingwei’, 2, ‘asd123’);INSERT INTO Book.BookUsers VALUES(4, ‘zhanghongkai’, 2, ‘asd123’);COMMIT; 第2部分 Oracle开发技术 //创建序列 CREATE SEQUENCE userid MINVALUE 1 NOMAXVALUE START WITH 1 INCREMENT BY 1 NOCYCLE NOCACHE //触发器创建 CREATE OR REPLACE TRIGGER Book.NewMyTrigger before Insert ON Book.BookUsers FOR each row begin select userid.nextval into :new.userid from dual;END; string cmdString = “insert into Book.BookUsers(UserId,UserName,UserPwd)(xl_1.nextval,'” + student_numer.Text + “','” + password.Text + “')”;登录窗口: values 第2部分 Oracle开发技术 String oraString = “ Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=BOOK)));User ID=system;Password=asd”;//数据库连接语句 查询图书: String bookname = “";String bookisbn = ”“;String bmark = ”“;if(textBox1.Text!= ”“)bookisbn =(”ISBN = '“ + textBox1.Text + ”'“);if((textBox2.Text!= ”“)&&(textBox1.Text!= ”“))bookname =(”AND book_name='“ + textBox2.Text + ”'“);else if(textBox2.Text!= ”“)bookname =(”book_name='“ + textBox2.Text + ”'“);bmark = bookname + bookisbn; if(radioButton2.Checked){ //添加精确查询的代码 if(bmark!= ”“)dataCommand.CommandText = ”SELECT * FROM book.book WHERE “ + bmark;else if(bmark == ”“) 第2部分 Oracle开发技术 MessageBox.Show(”请输入查询数据!“);} else if(radioButton1.Checked){ if(textBox1.Text!= ”“)MessageBox.Show(”不支持ISBN的模糊查询!“);else { //添加模糊查询的代码 if(textBox2.Text!= ”“){ bookname =(”书名 like '%“ + textBox2.Text + ”%'“);dataCommand.CommandText = ”SELECT * FROM book.book WHERE “ + bookname;} else//查询所有图书 { dataCommand.CommandText = ”SELECT * FROM book.book“;} } } else MessageBox.Show(”请选择查询方式!“); OracleDataReader dataReader = dataCommand.ExecuteReader(); 第2部分 Oracle开发技术 BindingSource bs = new BindingSource();bs.DataSource = dataReader;this.dataGridView1.DataSource = bs;if(dataReader.Read()){ lnum = dataReader.GetInt32(3);ynum = dataReader.GetInt32(6);} dataConnection.Close();} SqlConnection dataConnection;//数据库连接类 SqlCommand dataCommand;//数据库命令类 读者信息: dataConnection.Open(); dataCommand.CommandText = ”SELECT * FROM book.reader WHERE reader_id='“ + uID + ”'“;OracleDataReader dataReader = dataCommand.ExecuteReader(); 第2部分 Oracle开发技术 BindingSource bs = new BindingSource();bs.DataSource = dataReader;this.dataGridView4.DataSource = bs;dataReader.Close();dataConnection.Close(); maxnum =(int)dataGridView4.Rows[0].Cells[”maxlend“].Value;dnum =(int)dataGridView4.Rows[0].Cells[”alredylend“].Value;ymaxnum =(int)dataGridView4.Rows[0].Cells[”maxyuyue“].Value;ydnum =(int)dataGridView4.Rows[0].Cells[”yiyuyue“].Value;} 还书: dataConnection.Open();String bookisbn;bookisbn = textBox5.Text;if(bookisbn!= ”“){ dataCommand.CommandText = ”DELETE FROM book.borrow WHERE ISBN='“ + bookisbn + ”'“;dataCommand.ExecuteNonQuery();dataCommand.CommandText = ”UPDATE book SET incount=incount+1 WHERE ISBN='“ + bookisbn + ”'“; 第2部分 Oracle开发技术 dataCommand.ExecuteNonQuery();dataCommand.CommandText = maxyuyue=maxyuyue-1 WHERE ISBN='” + bookisbn + “'”;dataCommand.ExecuteNonQuery();dataCommand.CommandText = “UPDATE alredylend=alredylend-1 WHERE reader_id='” + uID + “'”;dataCommand.ExecuteNonQuery();textBox5.Text = “";MessageBox.Show(”归还成功!“);dnum--; 实验总结: 通过这次课程设计,我收获了很多,对oracle数据库从一片空白到现在的有所了解。界面设计和代码用的是C#通过本次课程设计,我们对数据库的应用有了更深刻的体会。网络系统都是离不开数据库的支持的。数据库设计的是否合理,直接影响到系统的性能。数据库理论对于实际应用有很大的指导意义。 本次课程设计的名称是图书管理系统,由于我们能力有限,加之近期课程任务比较紧迫,所以我们负责的这个项目还有许多不完善的地方。可以说我们的这次系统是做的比较丑陋,功能还有很多不完善的地方。但是总的来说还是收获很大的,因为通过这次的团队合作,首先对数据库和C#有了进一步的了解,并且深深体会到团队合作的重要性,还有合理的团队分工是非常重要的。并且能在最后将前台程序和后台数据库连接起来运行,也对我们是一个比较大的挑战,而且我们也成功的做到了这一点。本次的图书管理系统,在功能上仅实现了图书,用户,图书类别和用户的注册管理,只是一些非常基础的功能,没有设计添加图书的功能。此外,该系统原先计划设计的一些功能也没有实现。系统完全实现的功能实现图书信息的删除、更改和查看等。 最后也非常感谢向胜军老师对我们本次课程设计的指导及最后验收的评价。我们也会吸取本次设计经验,为以后的设计继续努力。 reader SET ”UPDATE book SET 摘要 摘要 随着计算机技术的飞速发展,电子信息化慢慢替代了企业管理的传统管理手法,采用管理系统是能够有效提高管理效率的。图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,包含很多的信息数据的管理,现今,有很多的图书馆都是初步开始使用,甚至尚未使用计算机进行信息管理。图书馆若采取手工方式对图书资料和图书借阅情况进行人工管理,由于资料繁多,手工处理的工作量大,整体管理效率低下,也不方便读者对图书资料的查阅。为了提高日常的图书管理效率,本文针对通常的图书管理流程,设计了一个面向对象图书管理系统。本系统中包含六个功能模块:图书馆基本信息,借书,还书,读 者维护,图书维护,管理员维护。 summary With the rapid development of computer technology, electronic information technology gradually replaced the traditional management of enterprise management methods, management system, can effectively improve the efficiency of management.Library as a kind of information resource collection and distribution center, library and user lending data is various, contains a lot of information data management, today, there are a lot of libraries are preliminary started using, hasn't even use a computer for information management.If libraries adopt manual approach to artificial management books and materials and library, because the material is various, manual processing workload is big, the overall management efficiency is low, also not convenient to readers of books and materials inspection.In order to improve the efficiency of books management, this paper usually books management processes, an object-oriented books management system management system is designed.This system contains six modules: basic information, library books, and books, the reader maintenance, maintenance, administrators to maintain.1共30页第三篇:图书管理系统(含源代码)c语言_数据结构课程设计报告
第四篇:Oracle课程设计 图书管理系统
第五篇:图书管理系统课程设计摘要