面向对象程序设计实验 图书管理系统

本文档描述了一个使用面向对象编程方法设计的图书管理系统,包括系统管理员、图书管理员、学生和教师的管理功能,如图书借阅、归还、信息查看、图书增删改查、用户注册登录等。系统采用map容器存储账号,利用虚函数处理不同用户类型的特定操作,并覆盖文件输入输出操作。实验展示了类的定义、构造函数、虚函数、继承、容器使用等多个面向对象概念的应用,但存在用户界面和异常处理等方面的改进空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图书管理系统

一、实验题目分析

本次实验要求综合运用面向对象程序设计方法,设计实现一个相对完整的图书管理系统。其中包括系统管理员、图书管理员、学生以及教师的的操作。支持系统用户的图书借阅、图书管理、用户管理等功能。图书借阅管理主要包括图书借阅、图书归还、借阅信息查看等功能。图书管理主要包括图书的增加、删除、修改、查看、统计等功能。用户管理主要包括用户注册、登录、修改密码、修改个人信息、设置用户类型等功能。
考虑到账号为数字类型,且长度大小不固定,故不采用数组,而选择map容器,来进行各类账号的存储,且其中各类用户都可以进行借阅操作,但是部分地方不同,于是采用虚函数来进行此处处理。由于需要从文件中读取数据以及用户输入数据,所以对文件以及用户的输入输出“<<”和“>>”都进行了重载。
二、实验设计在这里插入图片描述
本实验设计了Person类,借阅等相关操作都在Person类中实现,个别部分如老师与学生借书时常、借书数量有差异采取虚函数方式,在派生类中重新定义。且除此之外,对图书管理员类BookManager以及系统管理员类SystemManager类中的方法还进行了扩展,其除了借阅相关操作外,还可以进行增加删除图书,进行图书数量统计、更改用户类型等操作。
本实验采用map容器存储,以避免定义静态数组占用较大空间的情况。且针对不同的用户设计了相应的入口函数。

#include<iostream>
#include<string>
#include<fstream>
#include<map>

using namespace std;

int system_manger_number;
int book_manager_number;
int teacher_number;
int student_number;
int book_number;
int log_number;


int current_user_type = 0;
int have_account;
int user_number;
string user_password;
string user_name;
string user_gender;
string book_title;
string writer_name;
int current_oparatiion = 0;
int log_id;
int book_id;
int year;
int month;
int day;
bool is_borrowed;

int student_user_type = 1;
int teacher_user_type = 2;
int system_manager_user_type = 3;
int book_manager_user_type = 4;
int student_max_borrow_number = 10;
int teacher_max_borrow_number = 20;
int student_max_borrow_day = 20;
int teacher_max_borrow_day = 30;
int manager_max_borrow_number = 15;
int manager_max_borrow_day = 20;

class SystemManager;
class BookManager;
class Student;
class Teacher;
class Book;
class Log;

map<int, SystemManager> map_system_manager;
map<int, SystemManager>::iterator iter_system_manager;
map<int, BookManager> map_book_manager;
map<int, BookManager>::iterator iter_book_manager;
map<int, Student> map_student;
map<int, Student>::iterator iter_student;
map<int, Teacher> map_teacher;
map<int, Teacher>::iterator iter_teacher;
map<int, Book> map_book;
map<int, Book>::iterator iter_book;
map<int, Log> map_log;
map<int, Log>::iterator iter_log;


class Book {
   
private:
    int book_id;
    string book_title;
    string writer_name;
    int is_borrowed;

public:

    Book(int book_id = 0, string book_title = "", string writer_name = "", int is_borrowed = 0) :book_id(book_id), book_title(book_title), writer_name(writer_name), is_borrowed(0) {
   };
    int getBookId() {
    return book_id; }
    string getBookTitle() {
    return book_title; }
    string getWriterName() {
    return writer_name; }
    int getIsBorrowed() {
    return is_borrowed; }

    void setBookId(int bi) {
   
        book_id = bi;
    }
    void setBookTitle(string bt) {
   
        book_title = bt;
    }
    void setWriterName(string wn) {
   
        writer_name = wn;
    }
    void setBorrowed() {
   
        is_borrowed = 1;
    }
    void setFree() {
   
        is_borrowed = 0;
    }
    friend ofstream& operator<<(ofstream& out, Book& a) {
   
        out << a.book_id << " "
            << a.book_title << " "
            << a.writer_name << " "
            << a.is_borrowed << "\n";
        return out;
    }
    friend ifstream& operator>>(ifstream& in, Book& a) {
   
        in >> a.book_id
            >> a.book_title
            >> a.writer_name
            >> a.is_borrowed;
        return in;
    };
    friend istream& operator<<(istream& in, Book& a) {
   
        in >> a.book_id
            >> a.book_title
            >> a.writer_name
            >> a.is_borrowed;
        return in;
    }
    friend ostream& operator<<(ostream& out, Book& a) {
   
        out << a.book_id << "\t"
            << a.book_title << "\t"
            << a.writer_name << "\t";
            if(a.is_borrowed){
   
                cout<<"已借出\n";
            }else{
   
                cout<<"可借阅\n";
            }
        return out;
    }

};
class Log {
   
private:
    int log_id;
    int user_number;
    string user_name;
    int is_borrowing;
    int is_returning;
    int book_id;
    string book_title;
    string writer_name;
    int year;
    int month;
    int day;

public:
    int getLogId() {
    return log_id; }
    int getUserNumber() {
    return user_number; }
    string getUserName() {
    return user_name; }
    int getIsBorrowing() {
    return is_borrowing; }
    int getIsReturning() {
    return is_returning; }
    int getBookId() {
    return book_id; }
    string getBookTitle() {
    return book_title; }
    string getWriterName() {
    return writer_name; }
    int getYear() {
    return year; }
    int getMonth() {
    return month; }
    int getDay() {
    return day; }
    Log(int log_id = 0,
        int user_number = 0,
        string user_name = "",
        int is_borrowing = 0,
        int is_returning = 0,
        int book_id = 0,
        string book_title = "",
        string writer_name = "",
        int year = 0,
        int month = 0,
        int day = 0) :
        log_id(log_id),
        user_number(user_number),
        user_name(user_name),
        is_borrowing(is_borrowing),
        is_returning(is_returning),
        book_id(book_id),
        book_title(book_title),
        writer_name(writer_name),
        year(year),
        month(month),
        day(day)
    {
   };

    friend ofstream& operator<<(ofstream& out, Log& a) {
   
        out << a.log_id << " "
            << a.user_number << " "
            << a.user_name << " "
            << a.is_borrowing << " "
            << a.is_returning << " "
            << a.book_id << " "
            << a.book_title << " "
            << a.writer_name << " "
            << a.year << " "
            << a.month << " "
            << a.day
            << "\n";
        return out;
    }
    friend ifstream& operator>>(ifstream& in, Log& a) {
   
        in >> a.log_id >>
            a.user_number >>
            a.user_name >>
            a.is_borrowing >>
            a.is_returning >>
            a.book_id >>
            a.book_title >>
            a.writer_name >>
            a.year >>
            a.month >>
            a.day;
        return in;
    };
    friend istream& operator<<(istream& in, Log& a) {
   
        in >> a.log_id >>
            a.user_number >>
            a.user_name >>
            a.is_borrowing >>
            a.is_returning >>
            a.book_id >>
            a.book_title >>
            a.writer_name >>
            a.year >>
            a.month >>
            a.day;
        return in;
    }
    friend ostream& operator<<(ostream& out, Log& a) {
   

        out << a.log_id << "\t"
            << a.user_number << "\t"
            << a.user_name << "\t"
            << a.is_borrowing << "\t"
            << a.is_returning << "\t"
            << a.book_id << "\t"
            << a.book_title << "\t"
            << a.writer_name << "\t"
            << a.year << "\t"
            << a.month << "\t"
            << a.day << "\t"
            << "\n";
        return out;
    }

};

class Person {
   
protected:
    int user_number;
    string user_password;
    string user_name;
    string user_gender;
    int current_borrow_number;
    int user_type;//student 1; teacher 2; system manager 3; book manager 4;
    int max_borrow_number;//manager 15 student 10 teacher 20 ;
public:
    Person(int user_number = 0,
        string user_password = "",
        string user_name = "",
        string user_gender = "",
        int current_borrow_number = 0,
        int user_type = 0,
        int max_borrow_number = 0) :user_number(user_number), user_password(user_password), user_name(user_name), user_gender(user_gender), current_borrow_number(current_borrow_number), user_type(user_type), max_borrow_number(max_borrow_number) {
   };
    int getUserNumber() {
   
        return user_number;
    }
    string getUserPassWord() {
   
        return user_password;
    }
    string getUserName() {
   
        return user_name;
    }
    string getUserGender() {
   
        return user_gender;
    }
    int getCurrentBorrowNumber() {
   
        return current_borrow_number;
    }
    int getUserType() {
   
        return user_type;
    }
    int getMaxBorrowNumber() {
   
        return max_borrow_number;
    }

    void setUserNumber(int a) {
   

        user_number = a;
    }
    void setUserPassword(string a) {
    user_password = a; }
    void setUserName(string a) {
    user_name = a; }
    void setUserGender(string a) {
    user_gender = a; }

    virtual void showBorrowDay()=0;
    virtual bool judgeQuota()=0;
    virtual bool judgeOverTime(int)=0;
    void userChangePassword() {
   
        cout << "当前为修改密码功能:\n";
        cout << "新密码:";
        cin >> user_password;
        setUserPassword(user_password);
        cout << "修改密码成功!";
    }
    void changeInformations() {
   
        cout << "当前为修改个人信息功能:\n";
        cout << "修改姓名为:";
        cin >> user_name;
        setUserName(user_name);
        cout << "修改姓名成功!\n";
        cout << "修改性别为:";
        cin >> user_gender;
        setUserGender(user_gender);
        cout << "修改性别成功!\n";

    }
    void borrowBook() {
   
        try {
   
            showBorrowDay();
            if (judgeQuota()) {
   
                int a=0;
                throw a;
            }
            cout << "请输入书号:";
            cin >> book_id;
            if(map_book[book_id].getIsBorrowed()){
   
                double b=0;
                throw b;
            }
            log_id = ++log_number;
            //cout<<"log_number:"<<log_number<<endl;
            cout << "请输入当前日期\n";
            cout << "年:";
            cin >> year;
            cout << "月:";
            cin >> month;
            cout << "日:";
            cin >> day;
            current_borrow_number++;
            map_book[book_id].setBorrowed();
            map_log[log_id] = Log(log_id, user_number, user_name, 1, 0, book_id, map_book[book_id].getBookTitle(), map_book[book_id].getWriterName(), year, month, day);
            cout << "借阅成功!\n";

        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值