C++实现图书管理程序

本文实例为大家分享了C++实现图书管理程序的具体代码,供大家参考,具体内容如下

主文件

#include <iostream>
#include "library.h"
#include "info.h"//读取帮助文件 
 
using namespace std;
 
int main() 
{
    char choice='w'; 
    string bookid;
    int readerid;//图书、读者编号 
    RDatabase ReaderDB; //读者库 
    Reader *r; 
    BDatabase BookDB; //图书库 
    Book *b; 
    int i=1;
    
    while(choice!='0') 
    { 
        cout <<"\n\n\t\t\t 图 书 管 理 系 统\n\n\n"; 
        cout <<"\t\t\t1: 借 书\n\n\t\t\t2: 还 书 \n\n\t\t\t3: 图 书 维 护\n\n\t\t\t4: 读 者 维 护\n\n\t\t\t5: 帮 助\n\n\t\t\t0: 退 出"<<endl; 
        cin >> choice; 
        switch (choice) 
        { 
            case '1': 
                    cout <<" |借书|\n读者编号(1~"<<Maxr<<"):";  
                    cin >>readerid;
                    r=ReaderDB.query(readerid);//按编号查找 
                    if (NULL==r) //查找是否有该读者 
                    { 
                        cout <<"不存在该读者,不能借书"<<endl; 
                        break; 
                    }
                     
                    cout <<" 图书编号(n-n-n-x):"; 
                    bookid=input_ISBN();  
                    b=BookDB.query(bookid); //查找是否有该书 
                    if (b==NULL) 
                    { 
                        cout <<"不存在该图书,不能借书"<< endl; 
                        break; 
                    }
                     
                    if (b->borrowbook()==0)//存在该书的情况下查找该书是否已借出 
                    { 
                        cout << " 该图书已借出,不能借书"<< endl; 
                        break; 
                    } 
                    r->borrowbook(b->getISBN());//成功借书
                    cout<<"借书成功!"<<endl; 
                    break; 
            case '2': 
                    cout<<"|还书|\n 读者编号(1~"<<Maxr<<"):"; 
                    cin >>readerid;
                    if (r==NULL) 
                    { 
                        cout <<"不存在该读者,不能还书" << endl; 
                        break; 
                    }
                     
                    cout <<"图书编号(n-n-n-x):"; 
                    bookid=input_ISBN();
                    r=ReaderDB.query(readerid); 
                    b=BookDB.query(bookid); 
                    if (b==NULL) 
                    { 
                        cout <<"不存在该图书,不能还书" <<endl; 
                        break; 
                    }
                     
                    b->retbook();  
                    r->retbook(b->getISBN()); //还书成功 
                    break; 
            case '3': 
                    BookDB.bookdata(); //图书维护 
                    break; 
            case '4': 
                    ReaderDB.readerdata(); //读者维护 
                    break;
            case '5':
                    read_info(); 
            case '0':
                    break; 
            default:
                    cout<<"输入错误,请重新输入:"; 
        
        } 
    } 
    
    return 0; 
} 

acquire_date.h

//获取系统时间 
#include <iostream>
#include <ctime> /* time.h in C */
using namespace std;
 
struct Time
{
       int y;
       int m;
       int d;
};
 
 
Time acquire_time()
{
    time_t now;    
    struct tm *fmt;
    Time t;
    
    time(&now);
    fmt = localtime(&now);
    
    t.y=fmt->tm_year%100;//获取年月日 
    t.m=fmt->tm_mon+1;
    t.d=fmt->tm_mday;
    cout<<t.y<<"年"<<t.m<<"月"<<t.d<<"日"<<endl;
    
    return t;
}

delete_space.h

//去空格 
#include <iostream>
#include <string>
 
using namespace std;
 
string input_ISBN()
{
    bool ifGo=1;
    char n='0';
    string names="0";
    cout<<"(输入ISBN)"<<endl;
    while(ifGo==1){ 
                    int i=0;
                    int f=0; 
                    while(cin>>n) 
                    {
                        if(n>='0'&&n<='9'&&i<3){
                           names+=n;
                           f++;}
                        else if(n=='-'&&i<3&&f!=0){
                               names+=n;
                               i++;
                               }
                            else if(i==3&&((n>='a'&&n<='z')||(n>='A'&&n<='Z')||(n>='0'&&n<='9')))
                                {
                                   names+=n;
                                   cin.clear();
                                   cin.sync();
                                   ifGo=0;
                                   break;
                                }
                                else{
                                    cout<<"输入错误!请重新输入:";
                                    names="0";
                                    ifGo=1;
                                    cin.clear();
                                    cin.sync();
                                    i=0;
                                    f=0;
                                    } 
                    }
                    }
    string names1;
    for(int j=1;j<names.length();j++)
        names1+=names[j];
    return names1;
}     

info.h

//读取帮助文件 
#include <fstream>
#include <iostream>
 
using namespace std;
 
const int l=100;//每一行的长度
 
void read_info()
{
    ifstream ios("help.txt");
    char s[l];//用于读取文件中的一行 
   
    for(int j=0;j<l;j++)
        s[j]='\t';
    while( ios.getline(s,l))
    {
           for(int i=0;i<l;i++)
           {
            if(s[i]!='\t')
               cout<<s[i];
           }
           cout<<endl;
           for(int j=0;j<l;j++)
           s[j]='\t';
    }
}

library.h

//主功能实现 
#include <iostream> 
#include <iomanip> 
#include <string> 
#include <fstream>//输入/输出文件流类  
#include "delete_space.h"
#include "acquire_date.h"//获取系统日期 
 
using namespace std;
 
const int Maxr=100;//最多的读者 
const int Maxb=100;//最多的图书 
const int Maxbor=8;//每位读者最多借八本书 
const int bkNlen=20;//图书名字长度
const int rdNlen=20;//读者及作者名字长度 
const int Maxday=60;//读书借阅期(以日算) 
enum Genre{fic,nfic,per,bio,chi,unk};/*fic-fiction,nfic-nonfiction,per-periodical,
                                       bio-biography,chi-children,unk-unknown*/
 
//读者类,实现对读者的信息的描述 
class Reader 
{ 
private:
        bool tag; //删除标记 1:已删 0:未删 
        int num; //读者编号 
        char name[rdNlen]; //读者姓名 
        string borbook[Maxbor];//所借图书
        Time bortime[Maxbor];//借书时间 
public: 
        Reader() {} 
        char *getname() {return name;} //获取姓名 
        bool gettag() {return tag;} //获取删除标记 
        int getnum() {return num;} //获取读者编号 
        
        void setname(char na[]) //设置姓名 
        { 
          strcpy(name,na); 
        } 
        void delbook(){ tag=1; }//设置删除标记 1:已删 0:未删 
        
        void addreader(int n,char *na)//增加读者 
        { 
            tag=0; 
            num=n; 
            strcpy(name,na); 
            for(int i=0;i<Maxbor;i++) 
            borbook[i]="0"; 
        } 
        
        void borrowbook(string bookid)//借书操作 
        { 
            for(int i=0;i<Maxbor;i++) 
            { 
                if (borbook[i]=="0") 
                { 
                    borbook[i]=bookid;
                    bortime[i]=acquire_time(); 
                    return; 
                } 
            } 
        } 
 
        int retbook(string bookid)//还书操作 
        { 
            for(int i=0;i<Maxbor;i++) 
            { 
                if(borbook[i]==bookid) 
                { 
                    borbook[i]="0";
                    bortime[i].y=0;
                    bortime[i].m=0;
                    bortime[i].d=0; 
                    return 1; 
                } 
            } 
            return 0; 
        } 
        
        void check()//检查是否欠费 
        {
             Time t=acquire_time();
             for(int i=0;i<Maxbor;i++)
             {
                     if((bortime[i].y!=0&&bortime[i].m!=0&&bortime[i].d!=0)
                        &&((t.y-bortime[i].y)*365+(t.m-bortime[i].m)*30+(t.d-bortime[i].d))>Maxday)
                        cout<<"欠费"<<endl;
             }
             cout<<"不欠费"<<endl;
        }
        
        void disp()//读出读者信息 
        { 
            check();
            cout << setw(10) << num <<setw(20) << name<<"借书编号:["; 
            for(int i=0;i<Maxbor;i++) 
                if(borbook[i]!="0") 
                cout << borbook[i] << "|"; 
            cout << "]"<<endl; 
        } 
                    
}; 
 
 
class RDatabase//读者类库,管理建立读者的个人资料 
{ 
    private: 
            int top; //读者数组最高下标 
            Reader read[Maxr];//读者记录 
    public: 
            RDatabase() //将reader.txt读到read[]中 
            { 
                Reader s; 
                top=-1; 
                fstream file("reader.txt",ios::in);//打开一个输入文件 
                while (true) 
                { 
                    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].getnum()==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='7'; 
    char rname[rdNlen]; 
    int readerid; 
    Reader *r; 
    while (choice!='0') 
    { 
        cout <<"\n\n\t\t\t读 者 维 护\n\n\n\t\t 1: 新 增\n\n\t\t 2: 更改\n\n\t\t 3: 删 除\n\n\t\t 4: 查 找\n\n\t\t 5: 显 示\n\n\t\t 6: 全 删\n\n\t\t 0: 退出"<<endl; 
        cin >> choice; 
        switch (choice) 
        { 
            case '1': 
                    cout << "输入读者编号(1~"<<Maxr<<"):"; 
                    cin >> readerid; 
                    cout << "输入读者姓名:"; 
                    cin >> rname; 
                    addreader (readerid,rname); 
                    break; 
            case '2': 
                    cout << "输入读者编号(1~"<<Maxr<<"):";  
                    cin >> readerid; 
                    r=query(readerid); 
                    if (r==NULL) 
                    { 
                        cout << " 该读者不存在 "<<endl; 
                        break; 
                    } 
                    cout << "输入新的姓名:"; 
                    cin >> rname; 
                    r->setname(rname); 
                    break; 
            case '3': 
                    cout << " 输入读者编号(1~"<<Maxr<<"):"; 
                    cin >> readerid; 
                    r=query(readerid); 
                    if (r==NULL) 
                    { 
                        cout <<" 该读者不存在" << endl; 
                        break; 
                    } 
                    r->delbook(); 
                    break; 
            case '4': 
                    cout << "输入读者编号(1~"<<Maxr<<"):"; 
                    cin >> readerid; 
                    r=query(readerid); 
                    if (r==NULL) 
                    { 
                        cout <<"该读者不存在"<< endl; 
                        break; 
                    } 
                    r->disp(); 
                    break; 
            case '5': 
                    disp(); 
                    break; 
            case '6': 
                    clear(); 
                    break; 
            default:
                    cout<<"输入错误,请重新输入:"; 
        } 
    } 
} 

 
//图书类,实现对图书的描述,图书的编号,书名,借出,还入等 
class Book 
{ 
private: 
        bool tag;//删除标记 1:已删 0:未删 
        string ISBN;//图书编号 
        char name[bkNlen];//书名 
        char author[rdNlen];//作者名 
        Genre kind;//图书类型 
        bool onshelf;//是否在架 1:在架 0:已借 
public: 
        Book(){} 
        char *getname() { return name; }//获取书名
        char *getauthor(){return author;}//获取作者
        string getkind(); //获取图书类型 
        string getISBN(){ return ISBN; }//获取图书ISBN 
        bool gettag(){ return tag; }//获取删除标记 
        
        void setname(char na[])//设置书名 
        { 
            strcpy(name,na); 
        }
         
        void setauthor(char au[])//设置作者名 
        { 
            strcpy(author,au); 
        }
        
        void setkind(Genre g)//设置图书类型 
        {
             kind=g;
        }
        
        void delbook(){ tag=1;}//删除图书 
        
        void addbook(string s1,char *na,char *au,Genre g)//增加图书 
        { 
            tag=0; 
            ISBN=s1; 
            strcpy(name,na); 
            strcpy(author,au); 
            kind=g;
            onshelf=1; 
        } 
        
        bool borrowbook()//借书操作 (并查找是否在架) 
        { 
            if (onshelf==1) 
            { 
            onshelf=0; 
            return 1; 
            } 
            return 0; 
        }
         
        void retbook()//还书操作 
        { 
            onshelf=1; 
        } 
        void disp()//输出图书 
        { 
            cout <<setw(10)<<ISBN
                 <<setw(10)<<"《"<<name<<"》"
                 <<setw(10)<<"("<<author<<")"
                 <<setw(15)<<getkind() 
                 <<setw(10)<<(onshelf==1? "在架":"已借") <<endl; 
        }
}; 
 
string Book::getkind()//返回图书类型 
{
       switch(kind)
       {
                   case 0:
                        return"fiction";
                        break;
                   case 1:
                        return "nonfiction";
                        break;
                   case 2:
                        return "periodical";
                   case 3:
                        return "biography";
                   case 4:
                        return "children";
                   default:
                           return "unknow";
       }
}
 
bool operator==(Book &b1,Book&b2)//判断两本书的ISBN号是否相等  1-相同 0-不同 
{
     if(b1.getISBN()==b2.getISBN())
        return 1;
     return 0;
}
bool operator!=(Book &b1,Book&b2)//判断两本书的ISBN号是否不等  1-不同 0-相同 
{
     if(b1.getISBN()!=b2.getISBN())
        return 1;
     return 0;
}
 
//图书库类,实现对图书的维护,查找,删除等 
class BDatabase 
{ 
    private: 
            int top; //图书数组最高下标 
            Book book[Maxb]; //图书记录 
    public: 
            BDatabase()//将book.txt读到book[]中 
            { 
                Book b; 
                top=-1; 
                fstream file("book.txt",ios::in); 
                while (true) 
                { 
                    file.read((char *)&b,sizeof(b)); 
                    if (!file) break; 
                    top++; 
                    book[top]=b; 
                } 
                file.close(); 
            } 
            void clear()//全删 
            { 
                top=-1; 
            } 
            int addbook(string s1,char *na,char *au,Genre g)//增加图书 
            { 
                Book *p=query(s1); 
                if (p==NULL) 
                { 
                    top++; 
                    book[top].addbook(s1,na,au,g); 
                    return 1; 
                }
               else{
                   cout<<"已存在该ISBN号!请检查输入!"<<endl;
                   return 0;
                   }
            } 
            
            Book *query(string bookid)//查找图书 
            { 
                for (int i=0;i<=top;i++) 
                if (book[i].getISBN()==bookid &&book[i].gettag()==0)//找到并且未删 
                { 
                    return &book[i]; 
                } 
                return NULL; 
            } 
            
            void bookdata();//图书库维护 
            
            void disp() 
            { 
                for (int i=0;i<=top;i++) 
                if (book[i].gettag()==0) 
                book[i].disp(); 
            } 
            
            ~BDatabase()//将book[]写到book.txt文件中 
            
            { 
                fstream file("book.txt",ios::out); 
                for (int i=0;i<top;i++) 
                if (book[i].gettag()==0) 
                file.write((char *)&book[i],sizeof(book[i])); 
                file.close(); 
            } 
}; 
 
void BDatabase::bookdata() 
{ 
    char choice='w'; 
    char bname[bkNlen];
    char aname[rdNlen];
    int bkind;
    Genre bkind1;
    string bookid; 
    Book *b; 
    while (choice!='0') 
    { 
        cout <<"\n\n\n\t\t\t图 书 维 护 \n"<<endl; 
        cout<<"\t\t1: 新 增\n \t\t2: 更 改\n\t\t3: 删 除\n\t\t4: 查 找\n\t\t5: 显示\n\t\t6: 全 删\n\t\t0: 退 出"<<endl; 
        cin >> choice; 
        switch (choice) 
        { 
            case '1': 
                    cout <<"输入图书编号(n-n-n-x):"<<endl; 
                    bookid=input_ISBN();
                    cout <<"输入图书书名:"<<endl; 
                    cin >>bname;
                    cout<<"输入作者姓名:"<<endl;
                    cin>>aname;
                    cout<<"输入图书类型:\n1-fiction,2-nonfiction,3-periodical,4-biography,5-children"<<endl;
                    cin>>bkind;
                    if(bkind<6&&bkind>0)
                       bkind1=Genre(bkind-1);
                    else
                       bkind1=Genre(5);
                    addbook(bookid,bname,aname,bkind1); 
                    break; 
            case '2': 
                    cout << "输入图书编号(n-n-n-x):"<<endl; 
                    cin >> bookid; 
                    b=query(bookid); 
                    if (b==NULL) 
                    { 
                        cout << " 该图书不存在 "<<endl; 
                        break; 
                    } 
                    cout <<"输入新的书名:"<<endl; 
                    cin >>bname; 
                    b->setname(bname);
                    cout <<"输入新的作者名:"<<endl; 
                    cin >>aname; 
                    b->setauthor(aname);
                    cout <<"输入新的类型:\n1-fiction,2-nonfiction,3-periodical,4-biography,5-children"<<endl; 
                    cin >>bkind;
                    if(bkind<6&&bkind>0)
                       bkind1=Genre(bkind-1);
                    b->setkind(bkind1); 
                    break; 
            case '3': 
                    cout <<"输入图书编号(n-n-n-x):"<<endl; 
                    cin >> bookid; 
                    b=query(bookid); 
                    if (b==NULL) 
                    { 
                        cout <<"该图书不存在" << endl; 
                        break; 
                    } 
                    b->delbook(); 
                    break; 
            case '4': 
                    cout <<"输入图书编号(n-n-n-x):"<<endl; 
                    cin >> bookid; 
                    b=query(bookid); 
                    if (b==NULL) 
                    { 
                        cout <<"该图书不存在"<< endl; 
                        break; 
                    } 
                    b->disp(); 
                    break; 
            case '5': 
                    disp(); 
                    break; 
            case '6': 
                    clear(); 
                    break; 
            case '0':
                    break;
            default:
                    cout<<"输入错误,请重新输入:"; 
            } 
    } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++图书管理系统程序源代码

    本文实例为大家分享了C++图书管理系统程序的具体代码,供大家参考,具体内容如下 大一期末c++综合实验,功能基本都实现了,但是代码写的有些繁琐,还有很大的优化空间,仅供参考. 实验要求 实验目的: 1.能够综合运用面向对象程序设计方法,设计实现一个相对完整信息管理应用程序.2.能够适当进行题目分析.实验设计.核心代码描述.实验结果分析等. 实验:设计并编写一个C++风格应用程序,模拟一个图书管理系统应用程序,支持系统用户的图书借阅.图书管理.用户管理等功能.图书借阅管理主要包括图书借阅.图书归还

  • C++实现图书管理系统课程设计

    本文实例为大家分享了C++实现图书管理系统的具体代码,供大家参考,具体内容如下 大一 C++课设,没有用分文件的形式,只是把菜单页面单独分开了.用的是链表,都是一些基础的东西.另外采用了二维数组来保存读者借书信息,并将二维数组读入文件中. 功能: 1.首先是注册,登录,找回密码和修改密码功能,登录和注册使用了多态,并且登录页面采用了*符号加密.2.管理员在删除图书时,若用户此时已将此书借走,则会将此书从用户的借书书单中删去,实现了动态管理.3.容错率极高,每个页面都有返回上一页面的功能.4.每个

  • C++顺序表实现图书管理系统

    本文为大家分享了C++顺序表实现图书管理系统的具体代码,供大家参考,具体内容如下 图书信息表包括以下10项常用的基本操作:图书信息表的创建和输出.排序.修改.逆序存储.最贵图书的查找.最爱图书的查找.最佳位置图书的查找.新图书的入库.旧图书的出库.图书去重. 代码: #include<iostream> #include<iomanip> #include<string> using namespace std; //函数结果状态代码 #define OK 1 #def

  • C++编写实现图书管理系统

    C++编写的一个图书管理系统,供大家参考,具体内容如下 2018大一的课设,搬到这纪念一下,共1200多行代码 为图书管理人员编写一个图书管理系统,图书管理系统的设计主要是实现对图书的管理和相关操作,包括3个表:图书信息表——存储图书的基本信息,包括书号.书名.作者.出版社.出版日期.存馆数量.定价等.读者信息表——存储读者的基本信息,包括学号.姓名.学院.专业班级等.图书借阅表——存储读者借书的相关信息,包括学号.姓名.书号.书名.借阅日期.应还日期.归还日期等. 用菜单选择方式完成了以下功能

  • C++实现小型图书管理系统

    本文实例为大家分享了C++实现小型图书管理系统的具体代码,供大家参考,具体内容如下 因为课程设计的原因,需要实现一个小型图书管理系统 包含功能: 问题描述: 设计一个系统,对图书信息进行管理,信息描述:有关该系统基本信息的描述,如:图书名称.图书编号.单价.作者.存在状态.借书人姓名.性别.学号等. 基本要求: 基本功能: 1.新进图书基本信息的输入.2.图书基本信息的查询.3.对撤消图书信息的删除.4.为借书人办理注册.5.办理借书手续(非注册会员不能借书).6.办理还书手续.7.统计图书库存

  • C++实现简单的图书管理系统

    今天再为大家介绍另一个常用的管理系统--图书管理系统,希望大家可以亲自动手实践一下,下面就与大家一起分享我的劳动成果. 图书信息包括:登录号.书名.作者名.分类号.出版单位.出版时间.价格等.试设计一图书信息管理系统,使之能提供以下功能: (1)图书信息录入功能(图书信息用文件保存) (2)图书信息浏览功能 (3)查询和排序功能:(至少一种查询方式)         .按书名查询         .按作者名查询 (4)图书信息的删除与修改 分享代码如下 #include<iostream.h>

  • C++实现图书管理系统

    闲来无事,用C++做了一个图书管理系统,主要有借书.还书.图书管理.用户管理等功能,主要用到的技术有容器和文件,以及类的封装 #include <iostream> #include <list> #include <algorithm> #include <string.h> #include <fstream> #include <stdlib.h> using namespace std; class Mybook; class

  • C++实现图书管理系统简易版

    本文实例为大家分享了C++实现图书管理系统的具体代码,供大家参考,具体内容如下 包括管理员端和学生端,可以对图书进行借阅,归还,还可以修改账号登陆密码等 #include<iostream> #include<string> #include<string.h> #include<cstdio> #include<conio.h> #include<fstream> #include<cstring> #include&l

  • C++项目开发实现图书管理系统

    本文实例为大家分享了C++实现图书管理系统的具体代码,供大家参考,具体内容如下 一.需求分析 1.可以实现添加一条新的图书信息(图书名,图书编号,图书价格,图书作者)2.可以查看全部图书条目3.可以删除指定的某条图书记录 二.系统设计 2.1系统功能介绍 1.添加新图书模块:该模块可以实现将新图书信息录入到系统并将图书信息保存到文件中.2.浏览全部图书模块:可以通过该模块获取文件中全部图书信息,确定图书是否存在,及方便删除.3.删除图书模块:可以根据图书在文件中的记录号删除某条图书记录. 2.2

  • C++实现图书管理系统最新版

    图书管理系统设计,供大家参考,具体内容如下 一.问题描述及功能要求 (1)图书信息录入功能(图书信息用文件保存) (2)图书信息浏览功能 (3)查询和排序功能:(至少一种查询方式) .按书名查询 .按作者名查询 (4)图书信息的删除与修改 二.代码实现 带有注释 废话不说,直接代码,欢迎指正. 大家CV可能有不兼容的情况,可以滴滴,尽可能解决问题地回复. #include<iostream> #include<stdio.h> #include <stdlib.h> #

随机推荐