
高级语言程序设计(2)课程设计
一 程序设计说明书
【设计题目】 图书馆借阅管理
图书管理员主要是日常操作以下几个工作环节:图书订购、新书验证、书目录入、图书登记、读者信息管理、借阅书登记、图书信息注销和读者信息注销等,而系统管理员统筹管理图书的系统相关事宜,比如权限维护、日志维护、增删用户和管理系统后台数据等。图书馆会有图书分类,比如科普类、文学类等,并且图书馆会对借阅的图书做限制,拥有资格的读者,才可以借阅相应的图书,当然读者访问图书馆时,图书管理员会对他们的浏览、借阅信息进行记录。5.后置条件 无 6.扩展点 无 7.相关的数据 读者信息、 图书信息, 预借信息 8.问题说明 无 预借图书用例日期 2014.4.6 版本 草案 说明 草案版本 作者 梁燕 1.简要说明 本用例描述图书管理员为读者进行图书预借的操作 2.事件流 (1) 基本流 a、 图书管理员在接收到读者的请求后, 验证读者信息。
【基本要求】
1读者库类RDatabase中,其构造函数中,将read.txt文件中所有读入读者记录rede[]中。处理完毕,在析构函数中将read[]中的所有未删记录写入到read.txt中。
比如,在类的构造函数中分配内存,在析 构函数中却没有释放该内存,但是因为这个类是一个singleton,所以内存泄漏只会发生一次。从上图中可以看出,一个在也平常不过的构造函数实例化过程了,最后红色错误标记,因为没有添加new关键字,所以并没有实例化对象,因为在构造器函数中加了一判断是否是构造函数,否则会报错,可以保证上文的对象是实例化出来的对象,然而当我在写该案例时,我不经意间把构造函数的return返回值为一个数组时,底下的person.constructor发生了变化,其指向为array,当时自己很纳闷,为什么明明perso对象是构造器函数personmessage()函数实例化出来的对象,按以往的解释,应当指向的是personmessage构造函数啊,根据以往的知识百思不得姐,便立马度娘了一下,扫了一些博客的解释,才恍然大悟,其实这个问题在很久以前自己也提到过,一时却没注意的,当实例化一个构造函数时,在你声明构造函数后,其系统隐性的会主动在构造函数的原型下创建一个construcor属性,personmessage.prototype.constrcuor = personmessage。现在我们来看构造函数中冒号初始化和函数初始化的问题,类构造函数的作用是创建一个类的对象时,调用它来构造这个类对象的数据成员,一要给出此数据成员分 配内存空间,二是要给函数数据成员初始化,构造数据成员是按数据成员在类中声明的顺序进行构造。
3 利用构造函数完成读者和图书数据初始化,完成内存分配。程序结束前,析构函数完成所申请的堆内存空间。
4 编写主函数,对所编写的矩阵类进行全面测试。要求用户界面采用菜单方式。测试中需要读者和图书数据通过I/O流从磁盘文件读入,同时显示在屏幕上。得到的数据通过I/O流写入磁盘文件保存,同时显示在屏幕上。
5 源程序中要有充分的注释,报告中要有详细的流程图和文字材料。
【类的设计】
该程序包含了四个类,如下:
1.Reader类,有读者的基本管理功能,具有以下私有数据:
int tag;//删除标记 1:已删;0:未删
int no;//读者编号
char name[10];//读者姓名
int borbook[Maxbor];//所借图书
2.读者库类Rdatabase, 具有以下私有数据:
int top;//读者记录指针
Reader read[Maxr];//读者记录
3.图书库类Book,有一本图书的基本功能,有以下私有数据:
int tag;//删除标记 1:已删;0:未删
int no;//图书编号
char name[20];//书名
int onshelf;//是否在架 1在架 0已借
4.图书库类BDatabase,有以下私有数据:
int top;//图书记录指针
Book book[Maxb];//图书记录
【特殊函数的设计说明】
构造函数
1.Reader类中构造函数Reader(),初始化函数;
现在我们来看构造函数中冒号初始化和函数初始化的问题,类构造函数的作用是创建一个类的对象时,调用它来构造这个类对象的数据成员,一要给出此数据成员分 配内存空间,二是要给函数数据成员初始化,构造数据成员是按数据成员在类中声明的顺序进行构造。 } 类厂本身是一个管理组件实例化的类. 在 xpcom 中, 类厂要实现 nsifactory 接口, 它们就象上面的代码一样要使用类厂设计模式来封装对象的构造和初始化.封装构造函数 的例子是一个简单的无状态的类厂版本, 实际的编程要复杂一些, 一般的类厂都需要保存状态. 类厂至少应该保存那些对象已经被创建了的信息. 如果类厂管理的实例被存放在一个动态联接库中, 还需要知道什么时候可以卸载这个动态联接库. 当类厂保存了这样的信息, 就可以向类厂查询一个对象是否已经被创建.另一个需要保存的信息是关于单件. 如果一个类厂已经创建了一个单件类型的类, 后续的创建该单件的函数调用将返回已经创建的对象. 尽管有更好的工具和方式来管理单件, 开发人员可能仍然需要通过这种方式来保证只有一个单件对象被创建.厂模式可以完全利用函数来做, 状态可以保存在全局变量中。而类中的成员函数缺省都是内联的,如果你在类定义时就在类内给出函数,那当然最好.如果你在类中未给出成员函数定义,而你又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的.而且刚说了,内联函数最好放在头文件内,所以最好在类定义的头文件里把类的内联函数都实现了.。
3.Book类中构造函数Book(),初始化函数;
4.图书库类BDatabase中,其构造函数中,将book.txt文件中所有读入图书记录book[]中。
拷贝构造函数
Reader类中的拷贝构造函数将getname()的返回值读者姓名拷贝到setname()中,Book类中的拷贝构造函数将getname()函数的返回值图书名拷贝到图书名设置函数setname()中。
析构函数
1.读者库类RDatabase中,其析构函数~Rdatabase(),将read[]中的所有未删记录写入到read.txt中;
2.图书库类BDatabase中,其析构函数~Bdatabase(),将book[]中的所有未删记录写入到book.txt中。
运算符重载
重载了“=”,当比较读者编号和图书编号时,重载;重载位运算符“〈〈”和“〉〉”等。
【主要函数算法流程图】
【程序的使用方法】
1.进入操作页面,按提示操作;
2.首先,新增图书和读者信息,之后就可以对以存在的信息进行操作;
3.操作当中,可以随时增加,更改和删除图书或读者信息;
4.当选择退出时,进行清屏。
二 程序上机调试报告
【语法错误及其排除】
1.在敲程序时,有很多拼写错误,例好多处把Readdata()误打Readdate();结束的分号,在不同的输入法状态下输入,这些小错误刚开始很难发现,不过有了经验,就很容易了。
2.创建新的构造函数时,使用出现了错误。重载构造函数要注意函数的访问权限c语言图书管理系统课设,结果就不会出现错误。
【算法错误及其排除】
1.读者类中借书操作函数中,采用循环语句时判断读者已借图书量时for(int i=0;i<Maxbor;i++)误写为for(int i=1;i<Maxbor;i++),使循环发生错误。
sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个 char*得到具体错误提示。所有作为函数参数的数组名称总是可以通过编译器转换为指针,在其它所有情况下,数组的声明就是数组,指针的声明就是指针,两者不能混淆,但在使用数组(在语句或表达式中引用)时,数组总是可以写成指针的形式,两者可以互换,数组下标表达式总是可以改写为带偏移量的指针表达式,当一个数组名出现在一个表达式中时c语言图书管理系统课设,它会被转换为指向该数组第一个元素的指针。4)编译完成后将如图19所示,此时注意编译窗口中的信息,如果有编译错误,将要对源程序进行修改,然后再重新编译,直到没有错误为止。
三 程序测试结果
【收获及体会】
除了课堂外,课程设计是最能学到东西的,最考验人的。在做课程设计这段时间,时刻都感觉自己有好多不懂,要学的太多了!经过这次课程设计,让我对C++这门语言有了更深的认识,操作能力有了提高。要想得到敲的代码运行出来后的满足感,需要耐心细心,毅力以及充沛的体力。只有经过多次编辑,多次编译,再多次运行,才能编写出更好的程序,有时候需要多次的更正才达到所要的运行结果。学习编程,需要多揣摩,实践,实践,再实践,编程技能才能更上一层楼,此外还得多向高手请教!
【源程序代码】
//********************
//图书馆借阅管理
//班级:
//学号:
//姓名:
//********************
#include<iostream.h>
#include<iomanip.h>
#include<string.h>
#include<fstream.h>
const int Maxr=1000;//最多的读者
const int Maxb=10000;//最多的图书
const int Maxbor=8;//每位读者最多借8本书
class Reader //读者类
{
int tag;//删除标记 1已删;0未删
int no;//读者编号
char name[10];//读者姓名
int borbook[Maxbor];//所借图书
public :
Reader(){}//构造函数
char *getname(){return name;}//获取读者姓名
int gettag(){return tag;}//获取删除标记
int getno(){return no;}//获取读者编号
void setname(char na[])//设置读者姓名
{
strcpy(name,na);
}
void delbook(){tag=1;}//设置删除标记
void addreader(int n,char *na)//增加读者
{
tag=0;
no=n;
strcpy(name,na);
for(int i=0;i<Maxbor;i++)
borbook[i]=0;
}
void borrowbook(int bookid)//借书操作
{
for(int i=0;i<Maxbor;i++)
{
if(borbook[i]==0)
{

borbook[i]=bookid;
}
}
}
int retbook(int bookid)//还书操作
{
for(int i=0;i<Maxbor;i++)
{
if (borbook[i]==bookid)
{
borbook[i]=0;
return 1;
}
}
return 0;
}
void disp()//输出读者信息
{
cout<<setw(5)<<no<<setw(10)<<name<<"借书编号:";
for(int i=0;i,Maxbor;i++)
if(borbook[i]!=0)
cout<<borbook[i]<<endl;
}
};
class RDatabase//读者库类
{
int top;//读者记录指针
Reader read[Maxr];//读者记录
public:
RDatabase()//构造函数,将reader.txt读到read[]中
{
Reader s;
top=-1;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-113888-1.html
是谁在搞
#易烊千玺##易烊千玺献声小王子#千千