第一篇:数据结构图书管理报告
一.实验目的
图书管理:
图书管理基本业务活动包括:对一本书的采编入库、清除库存。借阅和归还等等。试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。
二.实验内容
计一个计算机管理系统完成图书管理基本业务。【基本要求】
1)每种书的登记内容包括书号、书名、著作者、现存量和库存量; 2)对书号建立索引表(线性表)以提高查找效率; 3)系统主要功能如下:
*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;*归还:注销对借阅者的登记,改变该书的现存量。
三.实验步骤(可选)
1.图书馆基本操作函数
void delbook(){ tag=1;}//设置删除标记 1:已删 0:未删
void addreader(int n,char *na)//增加读者
{
tag=0;
no=n;
strcpy(name,na);
for(int i=0;i borbook[i]=0;} void borrowbook(int bookid)//借书操作 { for(int i=0;i { if(borbook[i]==0) { borbook[i]=bookid; return; } } } int retbook(int bookid)//还书操作 { for(int i=0;i { if(borbook[i]==bookid) { borbook[i]=0; return 1; } } return 0;} void disp()//读出读者信息 { cout << setw(5)<< no < for(int i=0;i if(borbook[i]!=0) cout << borbook[i] << “|”; cout << “]”< 2.读者类库,实现建立读者的个人资料 class RDatabase { private: int top; //读者记录指针 Reader read[Maxr];//读者记录 public: RDatabase() //构造函数,将reader.txt读到read[]中 { Reader s; top=-1; fstream file(“reader.txt”,ios::in);//打开一个输入文件 while(1){ file.read((char *)&s,sizeof(s)); if(!file)break; top++; read[top]=s;} file.close(); //关闭 reader.txt } void clear()//删除所有读者信息 { top=-1;} int addreader(int n,char *na)//添加读者时先查找是否存在{ Reader *p=query(n);if(p==NULL){ top++; read[top].addreader(n,na); return 1;} return 0;} Reader *query(int readerid)//按编号查找 { for(int i=0;i<=top;i++) if(read[i].getno()==readerid && read[i].gettag()==0) { return &read[i]; } return NULL;} void disp()//输出所有读者信息 { for(int i=0;i<=top;i++) read[i].disp();} void readerdata();//读者库维护 ~RDatabase()//析构函数,将read[]写到reader.txt文件中 { fstream file(“reader.txt”,ios::out); for(int i=0;i<=top;i++) if(read[i].gettag()==0) file.write((char *)&read[i],sizeof(read[i])); file.close();} };void RDatabase::readerdata(){ char choice;char rname[20];int readerid;Reader *r;while(choice!='0'){ cout <<“读者维护:t1.新增t2.更改t3.删除t4.查找t5.显示t6.全删t0.退出”< cin >> choice; switch(choice) { case '1': cout << “输入读者编号:”; cin >> readerid; cout << “输入读者姓名:”; cin >> rname; addreader(readerid,rname); break; case '2': cout << “输入读者编号:”; cin >> readerid; r=query(readerid); if(r==NULL) { cout << “ 该读者不存在”< break; } cout << “输入新的姓名:”; cin >> rname; r->setname(rname); break; case '3': cout << “ 输入读者编号:”; cin >> readerid; r=query(readerid); if(r==NULL) { cout <<“ 该读者不存在” << endl; break; } r->delbook(); break; case '4': cout << “读入读者编号:”; cin >> readerid; r=query(readerid); if(r==NULL) { cout <<“该读者不存在”<< endl; break; } r->disp(); break; case '5': disp(); break; case '6': clear(); break; default:cout<<“输入错误,请从新输入:”;break; } } } 四.实验的结果及分析。 实验结果: 实验结果分析:图书管理系统分为图书管理和会员管理两大部分。设计一个图书类Book,包括一本图书的基本管理功能。再设计一个图书库类BDatabase,具有以下私有数据:int top;//图书记录指针Book book[Maxb];//图书记录。在其构造函数中,将book.txt文件的所有录入读到book[]中。处理完毕,在析构函数中将book[]中的所有未删除记录笑道book.txt文件中,中间的处理是对book[]进行的。设计一个读者类Reader,包括一个读者的基本管理功能。在其构造函数中,将reader.txt文件的所有记录读到read[]中。处理完毕,在析构函数中将read[]中的所有未删除记录写到reader.txt文件中,中间的处理都是对reader[]进行的。 五.实验中出现的问题、解决方法和心得体会 本实验是这个学期的最后一个实验,我选择的是图书管理系统的设计。这个实验的设计有一定的难度,花费 的时间比较长。虽然做过了很多实验,但是这个实验操作中还是遇到了很多问题,所以特意到图书馆专门借了几本关于数据结构程序设计方面的书,希望能对知识有更深层次的理解。一切准备就绪,把平时写的相关的程序出来参考,对比,慢慢才找到一些感觉,把源程序写出来。比起前面的几个实验,这个设计的功能完成的比较全面,也有原因是有前面的实验作为基础。 虽然这学期的数据结构课程已经学完,但这并不是学习编程的结束。虽然做了很多份设计,但基本还要参考资料或问老师和同学,所以,在以后的学习中,还应该继续多做题,多独立思考,争取在编程上取得一定的进步,点点滴滴积累下来的能量是无穷的。所以我要脚踏实地、从点滴做起。 《数据结构》 课程设计报告书 一.课程设计题目 图书借阅管理系统 二.课程设计内容 实现图书管理信息系统的设计 (一)管理员功能: ①登录:输入管理员密码,若密码错误则不得执行管理员操作。 ②添加新书:增加新的图书资料,同时需检查新书的图书编号是否已存在于原图书资料中,若已存在则应取消添加或提示重新输入。 ③修改图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,允许修改,否则提示 无该图书信息。 ④删除图书:通过编号查询该图书资料,若该编号存在,则显示已有信息,允许删除,否则提示无该图书信息。删除对象包括该图书资料以及“图书状态”和“借阅人”中与此书相关的所有记录。 ⑤查找图书: 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.书名字长太多影响书籍、作者、数量等之间的一一对应关系。(为解决成功) 六.课程设计的主要收获 通过这几天学习设计图书信息管理系统,认识到一切看似简单的事情只有自己动手做,明白了其中的原理才会更好的把它变成自己的东西。图书管理系统主要用到了文件的输入输出,以及利用简单的顺序查找知识,加深了对数据结构的理解与应用。对于这次的课程设计,首先,许多知识不仅仅只是课本上的,需要我们自己去图书馆或网上收集资料。其次,编程过程终遇到各种错误,需要我们耐心分析,讨论,最后得出正确结果。第三,程序无错,进行调试,然后进行加工修改优化。 七.对今后课程设计的建议 希望老师可以分小组做课程设计,题目可以相应的增大难度。分组可以锻炼团对合作能力,队员可以相互讨论解决问题,彼此能够激发更多的思想,做出更完善的作品,同时也防止了互相拷贝的情况,让每个同学都积极的参与到设计中,而不是坐享其成。 数据结构课程设计报告 课程名称:数据结构课程设计 课设题目: 西文图书管理系统 教师姓名: 郭 艳 本科生姓名: 王瑞林 本科生学号: 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程序设计》第四版 谭浩强编著 数据结构大作业 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,打开执行文件后按提示操作即可 停车场管理系统 ——数据结构课程设计程序设计书 小组成员: 彭路 20131344031 崔琦 20131344028 徐佳 20131344027 范福龙 20121344024 班级 : 13软件工程1班 时间:2014.12.22 目录 一、程序设计目标 二、问题描述 三、需求分析 四、概要设计 五、详细设计 六、源程序清单 七、软件说明书 八、测试报告 九、课程设计总结 一、程序设计目标 本管理程序由c/c++语言完成,实现了对停车场收费问题的处理。本程序保证了程序的健壮性和操作性,在阅读过使用说明书之后可以轻松使用。本管理系统假设车辆在停车场时一直有人在驾驶,或者说停车场的每块停车位均可智能移动。并假设车辆进出场耗时不计,且时间均为整数类型。最后自动或者人工完成收费。 二、问题描述 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 三、需求分析 根据问题描述,可把本停车场抽象成一个栈存储类型s1,需要输入最大停车容量n。每当输入’A’时即为有车辆申请进入停车场操作,此时需要判断停车场是否有空位,如果有空位,那么这辆车可以进入停车场,即为执行一次压栈操作(push),并记录进入停车场的时间t1,并输出位置p1;如果停车场没有空位,那么这辆车在门外便道等候,并输出位置p2。根据问题描述,可以把此门外便道抽象成一个队列存储类型q,而每有一辆车进入门外便道,即相当于进行一次插入队列操作(push)。每当输入’D’时即为有车辆申请离开停车场操作,此时需要判断该车辆在停车场的位置。如果该车位于停车场最外侧即相当于栈顶,那么该车可以直接批准离开并根据输入的离开时间t2计算出停车时间t2-t1,根据该车本次停车时间完成收费后即可成功驶出停车场,即相当于成功弹出栈顶元素(pop);如果该车没有位于停车场最外侧,事实上,这也是大多数的情况,那么需要将该车外侧的车依次(即为挡路的车)移动进一个临时停车场,根据问题描述,可以将该临时停车场抽象成另一个栈存储类型s2,那么此次移动操作相当于将栈中某元素以上的元素依次压入另一个栈(push)。当申请离开的车驶出停车场后,在临时停车场的车辆依次进入停车场,此操作相当于将栈s2内元素依次弹出栈(pop)并压入栈s1(push)。此时判断门外便道上有无等待进入停车场的车辆,如果有的话,门外便道上第一辆车可以进入停车场,并记录进入时间t1,此次操作相当于取出队列q的队首元素并将其压入栈s1中。而输入’E’时,即退出系统。至此,所有分析结束。 四、概要设计 根据需求分析,解决此问题需要构建一个Cars类型的结构体,构建一个CarNode类型的节点结构体以构建SQueue类型的队列结构体,并需要构建一个SQstack类型的栈结构体。接下来,分别定义队列和栈的各项基本操作函数。最后,完成菜单函数以实现各项操作。 五、详细设计 本程序定义了三个头文件,manager_cars.h、manager_stack.h、manager_queue.h。分别实现了Cars类型的结构体、SQueue类型的队列结构体、SQstack类型的栈结构体以及队列的相关操作函数和栈的相关操作函数。具体如下: 1、manager_cars.h sq->lastCar=car;sq->firstCar->nextCar=NULL;sq->length=0;} //进入队列操作 void enterSQueue(SQueue *sq,int num,int t){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));car->headCar.condition='D';car->headCar.number=num;car->headCar.time=t;car->headCar.position=2; car->nextCar=NULL;sq->lastCar->nextCar=car;sq->lastCar=car;sq->length++;} //出队列操作 void exceedSQueue(SQueue *sq){ if(sq->firstCar==sq->lastCar) return;CarNode *car=(CarNode *)malloc(sizeof(CarNode));car=sq->firstCar->nextCar;sq->firstCar->nextCar=car->nextCar;sq->length--;if(sq->lastCar==car) sq->lastCar=sq->firstCar;free(car); } //检测队列存在 int SQueueEmpty(SQueue sq){ if(sq.firstCar==sq.lastCar) return 1;else return 0;} //获取队首元素 void getSQueue(SQueue sq,Cars *e){ if(sq.firstCar==sq.lastCar) return;*e=sq.firstCar->nextCar->headCar;S.base;} extern int GetTop(SQstack S,Cars *e)//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR { if(S.top == S.base)return 0; *e = *(S.top-1); return 1; } extern int Push(SQstack*S,Cars e)//插入元素e为新的栈顶元素 { if(S->top cout<<“请正确输入Y或N:”< scanf(“%c”,&flag); getchar();} while(flag=='Y'){ flag='C'; Cars car; SQstack park;//定义栈并初始化 InitStack(&park); SQueue street;//定义队列并初始化 setSQueue(&street); cout<<“请输入本停车场最多可提供的车位数:”; scanf(“%d”,&maxNum); getchar(); cout<<“请输入每小时停车费:”; cin>>Pprice; cout< cout<<“请输入到达(A)/离开(D)信息,车牌号,时间(格式为A 1 5):”; cin>>car.condition>>car.number>>car.time; //scanf(“%c %d %d”,&car.condition,&car.number,&car.time); //getchar(); while(car.condition!='E'&&car.number!=0&&car.time!=0) { switch(car.condition) { case 'A': { enterPark(car,park,street); break; } case 'D': { int lasttime; lasttime=outOfPark(car,park,street,car.number,car.time); cout< cout<<“此车在停车场停留了”< } default :cout<<“请输入正确的格式!”< } cin>>car.condition>>car.number>>car.time; //scanf(“%c %d %d”,&car.condition,&car.number,&car.time); Cars headCar;struct CarNode *nextCar;}CarNode; typedef struct { CarNode *firstCar;CarNode *lastCar; int length;}SQueue;//建队列链表 void setSQueue(SQueue *sq){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));sq->firstCar=car;sq->lastCar=car;sq->firstCar->nextCar=NULL;sq->length=0;} //进入队列操作 void enterSQueue(SQueue *sq,int num,int t){ CarNode *car=(CarNode *)malloc(sizeof(CarNode));car->headCar.condition='D';car->headCar.number=num;car->headCar.time=t;car->headCar.position=2; car->nextCar=NULL;sq->lastCar->nextCar=car;sq->lastCar=car;sq->length++;} //出队列操作 void exceedSQueue(SQueue *sq){ if(sq->firstCar==sq->lastCar) return;CarNode *car=(CarNode *)malloc(sizeof(CarNode));car=sq->firstCar->nextCar;sq->firstCar->nextCar=car->nextCar;sq->length--;if(sq->lastCar==car) sq->lastCar=sq->firstCar;free(car); } //检测队列存在 int SQueueEmpty(SQueue sq){ if(sq.firstCar==sq.lastCar) return 1;else return 0;} //队首元素 void getSQueue(SQueue sq,Cars *e){ if(sq.firstCar==sq.lastCar) return;*e=sq.firstCar->nextCar->headCar;} //队列长度 int SQueueLength(SQueue sq){ int len=0;if(sq.firstCar!=sq.lastCar)len=sq.length;return len;} #endif manager_stack.h #include #ifndef manager_stack_h #define manager_stack_h #define STACK_INIT_SIZE 100 //栈的存储空间初始分配量 #define STACKINCREMENT 10 //栈的存储空间分配增量 typedef struct SQstack //栈的结构体 { Cars * base;Cars * top;int stacksize;S.base;} extern int GetTop(SQstack S,Cars *e)//若栈不为空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR { if(S.top == S.base)return 0; *e = *(S.top-1); return 1; } extern int Push(SQstack*S,Cars e)//插入元素e为新的栈顶元素 { if(S->top-S->base >= S->stacksize) { S->base =(Cars *)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(Cars)); if(!S->base)return 0; S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++ = e; return 1; } extern int Pop(SQstack *S,Cars *e)//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR { if(S->top == S->base)return 0; *e = *--S->top; return 1; } #endif 七、软件说明书 1、打开系统,输入Y进入管理系统。 2、接下来按提示输入停车场的可供使用的车位数。 3、按提示输入该停车场每小时收费标准。 4、按提示输入到达后者离开信息,例如A 1 5,D 1 10。 5、输入E 0 0并输入N,退出系统。 八、测试报告 1、如图,当打开系统时出现此界面,输入Y为进入系统,输入N为退出系统。 2、如图,如果输入错误会提示出错,并重新输入。 3、如图,输入Y后,按提示依次输入停车场可提供的最大车位数和每小时的停车费。 4、如图,输入A 1 5后,提示进入停车场的信息。 5、如图,输入A 2 10,A 3 15后,依次显示提示信息。 6、如图,输入D 1 20后,分别显示便道进入停车场的3号车和1号车的收费情况。 7、如图,输入E 0 0,再按提示输入N,即可退出系统。 九、课程设计总结 通过团队对该问题分析,互相补充了观点,增强了对该题目正确认识。队员们进行了缜密的需求分析,并分工完成各文件和函数的编写。队员们纷纷表示,这绝对是一个以前不能想象到的任务。通过对该系统的编写、实现,着实增强了队员们的团队意识以及对数据结构的进一步的理解。当程序成功运行后,队员们都非常兴奋,虽然本系统仍有瑕疵,但是可以说这是队员们的心血。 0第二篇:图书管理系统 数据结构 课程设计
第三篇:数据结构课程设计—西文图书管理系统
第四篇:图书管理系统(含源代码)c语言_数据结构课程设计报告
第五篇:数据结构课程设计报告_15_停车场管理