C++图书管理系统

#include <iostream>
#include <fstream>//文件输入输出
#include<iomanip>//控制输出格式
#include<string>
#include<time.h>//时间输出
using namespace std;
//书本类
class Book
{
   
protected:
    string code,name,author,press,time;
    int deadline;//借书期限
    double price;//价格
    bool Is_Lend;//书是否被借出
public:
    bool Is_teacher;
    static int Book_Number;
    Book(string c,string n,string a,string p,double pr)
    {
   
        code=c;name=n;author =a;press =p;
        price =pr;Is_Lend=0;Book_Number++;
    };
    Book(){
   Is_Lend=false;}
    string Gettime(){
   return time;}
    string GetCode(){
   return code;}
    string GetName(){
   return name;}
    string GetAuthor(){
   return author;}
    string GetPress(){
   return press;}
    int GetDeadline(){
   return deadline;}
    double GetPrice(){
   return price;}
    bool GetIs_Lend(){
   return Is_Lend;}
    void SetDeadline(int);
    void SetTime(string);
    void SetIs_Lend(bool);
    void SetCode(string);
    void SetName(string);
    void SetAuthor(string);
    void SetPress(string);
    void SetPrice(float);
    void Display();
    friend const std::string getCurrentSystemTime();//获取现在的时间
    friend istream& operator >> (istream &stream,Book &b);//重载操作符>>
    friend ostream& operator << (ostream &stream,Book &b);//重载操作符<<
};
ostream &operator << (ostream &stream,Book &b)
{
   
    stream<<"编号"<<setw(9)<<b.code<<" 书名:"<<setw(9)
    <<b.name<<" 作者:"<<setw(9)<<b.author<<" 出版社:"
    <<setw(9)<<b.press<<" 单价:"<<setw(5)<<b.price<<endl;
    return stream;
}
istream &operator >> (istream &stream,Book &b)
{
   
    cout<<"请输入编号:";
    stream>>b.code;
    cout<<"请输入书名:";
    stream>>b.name;
    cout<<"请输入作者名:";
    stream>>b.author;
    cout<<"请输入出版社:";
    stream>>b.press;
    cout<<"请输入单价:";
    stream>>b.price;
    return stream;
}
//获取系统当前时间的函数.
const string getCurrentSystemTime()
{
   
    time_t t;
    struct tm lt;
    time (&t);
    localtime_s (&lt,&t);//转为时间结构。
    char date[60] = {
   0};
    sprintf_s(date, "%d-%02d-%02d %02d:%02d:%02d",
            (int)lt.tm_year + 1900,(int)lt.tm_mon + 1,(int)lt.tm_mday,
            (int)lt.tm_hour,(int)lt.tm_min,(int)lt.tm_sec);
    return string(date);
}
void Book::SetDeadline(int a){
   deadline =a;}
void Book::SetTime(string a){
   time =a;}
void Book::SetIs_Lend(bool a){
   Is_Lend =a;}
void Book::Display()//用来展示借书情况
{
   
    cout<<"编号"<<setw(9)<<GetCode()<<" 书名:"<<setw(9)
    <<GetName()<<" 作者:"<<setw(9)<<GetAuthor()<<" 出版社:"
    <<setw(9)<<GetPress()<<" 单价:"<<setw(5)<<GetPrice()<<" 借书时间:"
    <<setw(10)<<Gettime()<<" 借书期限:"<<GetDeadline()<<"天"<<endl;
}
void Book::SetCode(string code1)
{
   code=code1;}
void Book::SetName(string name1)
{
   name=name1;}
void Book::SetAuthor(string author1)
{
   author=author1;}
void Book::SetPress(string press1)
{
   press=press1;}
void Book::SetPrice(float price1)
{
   price=price1;}
int Book::Book_Number=0;

static string LogName;//记录当前登陆用户的用户名
//用户类
class User
{
   
protected:
    string name;//用户姓名
    string key;//用户密码
    bool Is_Admin,Is_Librarian,Is_Reader;//什么用户类型
public:
    void key_change(User *U);//修改用户密码
    int  Judge();//判断用户类型
    static int User_Number;
    User(){
   Is_Admin=0;Is_Librarian=0;Is_Reader=1;};//默认读者类型
    void Setname(string name1);
    void Setkey(string key1);
    void SetIdentity(bool ad,bool li,bool re )//设置用户类型
    {
   Is_Admin=ad;Is_Reader=re;Is_Librarian=li;}
    string Getname(){
   return name;}
    string Getkey(){
   return key;}
    bool GetisAd(){
   return Is_Admin;}
    bool Getisli(){
   return Is_Librarian;}
    bool Getisre(){
   return Is_Reader;}
};
void User::key_change(User *U)
{
   
    int find=0;string key,key1;
    for(int i=0;i<User::User_Number;i++)
    {
   
        if(U[i].Getname()==LogName)
        {
   
            find=i;break;
        }
    }
    cout<<"请输入原密码:";
    cin>>key;
    if(key==U[find].Getkey())
    {
   
        cout<<"请输入新密码:";
        cin>>key;
        cout<<"再输入一次新密码:";
        cin>>key1;
        if(key==key1)
        {
   
            U[find].Setkey(key);
            cout<<"修改成功!"<<endl;
        }
        else
        {
   
            cout<<"两次密码输入不一致,修改失败!"<<endl;
        }
    }
    else
    {
   
        cout<<"密码错误!"<<endl;
    }
}
int User::Judge()
{
   
    if(Is_Librarian==1)return 5;
    else if(Is_Admin==1)return 6;
    else return 7;
};
void User::Setname(string name1)
{
   
    name=name1;
};
void User::Setkey(string key1)
{
   
    key=key1;
};

int User::User_Number=0;
class Log
{
   
public:
    User tp;//存储登陆成功的用户的信息
    int number;//存储当前用户信息对应的User类中下标值
    void Login(User *p);//登陆
    void SignIN(User *p);//注册
    Log(){
   number=0;};
    bool Is_Log;//判断是否登陆成功。
};

void Log::SignIN(User *p)
{
   
    int f1;string a,b,bb;
    while(1)
    {
   
        f1=1;
        cout<<"请输入用户名:";
        cin>>a;
        for(int i=0;i<=User::User_Number;i++)
        {
   
            if(p[i].Getname()==a)
            {
   
                cout<<"用户名已存在,请重新输入."<<endl;f1=0;
            }
        }
        if(f1==0){
   };
        if(f1==1) {
   break;}
    }
    while(1)
    {
   
        cout<<"请设置密码:";
        cin>>b;
        cout<<"再次输入密码:";
        cin>>bb;
        if(bb!=b)
        {
   
            cout<<"两次密码不一致,请重新输入."<<endl;
        }
        if(bb==b)
        {
   
            break;
        }
    }
    //将注册成功的用户信息存储到user类里。
    (p+User::User_Number)->Setname(a);
    (p+User::User_Number)->Setkey(b);
    (p+User::User_Number)->SetIdentity(0, 0, 1);
    tp.Setname(a);
    number=User::User_Number;
    User::User_Number++;
};
void Log::Login(User *p)
{
   
    string a,b;int flag=0;
    cout<<"请输入账号:"<<endl;
    cin>>a;
    cout<<"请输入密码:"<<endl;
    cin>>b;
    for(int i=0;i<User::User_Number;i++)
    {
   
        if(a==p[i].Getname()&&b==p[i].Getkey())
        {
   
            tp.SetIdentity(p[i].GetisAd(), p[i].Getisli(), p[i].Getisre());
            flag=1;tp.Setname(a);tp.Setkey(b)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图书馆流通管理软件 作为面向对象程序设计的第一步,在实际系统中,识别对象和类是很重要的。在这里,我们以图书馆流通管理系统为例,介绍识别对象与类的一般方法。 1、对象和类的识别 在一个信息系统内识别对象最简单也是最主要的方法是对具体事物的属性和功能进行分析,一旦识别到一个对象,就能识别出相同类型的所有对象,把它们归纳为类。 图书馆流通系统内,有书、读者、借书证、管理人员、借书还书行为等对象和事件,他们分别各是一个群体。例如每个图书馆都有几万甚至几十万册图书,每册图书都是一个对象,它们形成图书类(在此暂时用Item款目表示)。相应的,在图书流通系统内,还可以得到以下类: 读者(Reader)类,在图书馆注册的每位借书人都是一个读者类的对象; 图书借阅信息类(Loan),每次发生借书行为,都产生一个借阅信息的对象; 管理人员类(Manager),是借书还书行为的操作人。 借书证对象虽然是实实在在的对象,但每位读者对应一本借书证,且只需要知道其编号,因此不需要另外定义类,只作为读者类的一个数据成员。 同一个信息系统,从不同的角度分析,或根据要求的不同,有不同的侧重面,这样建立的对象模型不同,可能得出的分类方法也不同。 2、对象属性的识别 每个对象的情况称为对象的属性,同类型的对象具有共同的属性,只是每个对象的属性值不一定相同。属性是对一个对象状态的描述,如“在馆图书类”,从流通管理的角度来看,应包含书名Title、作者名Author、分类号IndexCode、册数Number、条码号BarCode等属性。 其它类的属性如下: 读者类,包含姓名Name、职务Position、年龄Age、借书证编号Code等。一个读者允许借阅若干册书,在此用一个Item的数组items保存相应信息。另外对读者所借书册数要统计,定义一个计数的成员Counter; 图书借阅信息类,包含所借书item、借书人reader、借书操作员manager等; 管理人员类,包含姓名Name、年龄Age、工号Code等; 管理人员类只有在发生借书行为时才作为操作人员记录下来,可以作为借书信息类的一个数据成员记录备查,程序中未定义其对象。 同一个类(对象),从不同的角度分析,或根据要求的不同,描述它的属性也可能不一致。 3、对象功能的确定 对象的功能指为了达到目的必须执行的动作,或是对象对所发生事件的反应。功能也可称为对象的操作。 在图书馆流通管理系统内,图书类应包含为各属性赋值(Set…)的操作、读取条码(GetCode)和显示图书基本信息(Show)的操作,另外还定义了缺省构造函数和拷贝构造函数。 读者类,需定义为各属性赋值(Set…)的操作、读取借书证号的操作,借书和还书需要向所借书数组中添加或减少书,定义AddBook和DelBook两个操作,还有显示所借书的操作ShowBooks。 4、对象和类的标记 在这里采用科德(Coad)定义的面向对象方法的描述符号,这一方法是Peter Coad和Ed YourDon于1990年提出的,这一方法的优点是图形简单、易于理解和掌握,但对类和对象属性的访问权限无法进行有效的描述。 科德标记法中,使用一个圆角矩形表示类,矩形内部分为三个部分,上部写类名,中部写属性(数据成员),下部表示该类的操作(函数成员)。对象是类的实例,在科德标记法中,在相应类标记外加一个圆角矩形框表示对象,并将矩形内部的表示类名的地方写上对象名,如图4.15。 科德表示法可形象地用扑克牌示意图来表示。如图4.16,一个类可能有0个或1个2个3个甚至更多对象,但没有实例化以前,它们在图上只画一个圆角矩形,就像一叠扑克牌,只看见最上面的一张牌;当把这叠牌散开时,它们是若干个对象,就像类被实例化了。 科德标记法还有表示连接的符号,如图4.17,一个带线段的半圆弧表示A是通用类,B是特殊类,中间带空心三角形的线段表示A类包含B类即整体与部分的关系,中间带实心箭头的线段表示A向B发送消息,一段实线表示对象之间的连接线。 根据上面对的图书馆流通管理系统的分析,在图4.18中,用科德标记法表示Item, Reader, Manager, Loan四个类,它们的数据成员及其类型、函数成员的原型都在图中标出,但无法标出它们的访问权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值