linux操作系统下图书管理系统的实现

系统要求链接:
话不多说,直接先放上同学们最需要的代码,再听我解释其中的工作原理。

main.cpp

#include <iostream>
#include"user.h"
#include"books.h"
using namespace std;

int main()
{
  userControl uc;
  uc.loadFromFile("user.txt");
  uc.login();
}

 user.h

#ifndef USER_H_INCLUDED
#define USER_H_INCLUDED

#include<iostream>
#include<string>
#include<list>
#include <fstream>
using namespace std;
class user
{
private:
    string ac;
    string name;
    string ps;
    double sf;
public:
    user();
    user(string,string,string,double);
    void setv();
    void resisginv();
    void setps(){cin>>ps;}
    void setac(){cin>>ac;}
    void setname(){cin>>name;}
    void setsf(){cin>>sf;}
    void display();
    string getac(){return ac;}
    string getname(){return name;}
    string getps(){return ps;}
    double getsf(){return sf;}

};
class userControl
{
private:
    list<user> listur;
    int ac;
public:
    userControl(int);
    void deletes();
    void loadFromFile(string filename);
    void display();
    void input();
    void resisgin();
    void Sort();
    void writeToFile(string filename);
    void login();
    void change();


};

#endif // USER_H_INCLUDED

user.cpp


#include"user.h"
#include"books.h"
#include"function.h"
#include<iostream>
#include<string>
#include<list>
#include <fstream>
using namespace std;
void mo(userControl* uc,list<user>::iterator iters);
user::user() {};
user::user(string a,string p,string n,double s):ac(a),ps(p),name(n),sf(s) {}
void user::setv()
{
    cout<<"输入账号:";
    cin>>ac;
    cout<<"输入密码:";
    cin>>ps;
    cout<<"输入姓名:";
    cin>>name;
    cout<<"输入权限:";
    cin>>sf;
}
void user::resisginv()
{
    cout<<"输入账号:";
    cin>>ac;
    cout<<"输入密码:";
    cin>>ps;
    cout<<"输入姓名:";
    cin>>name;
    sf=1;
    cout<<"注册成功!请输入新的账号密码!"<<endl;

}
void user::display()
{
    cout<<ac<<" "<<ps<<" "<<name<<" "<<sf<<endl;
}
userControl::userControl(int n):ac(n) {};
void userControl::deletes()
{
    string i;
    string choice;
    list<user>::iterator iter;
    cout<<"输入要删除的账号:";
      cin >> i;

    // 遍历列表
    for (iter = listur.begin(); iter != listur.end(); ++iter)
    {
        if(i==iter->getac())
        {
        cout << "要删除以下账号吗?(y/n)" << endl;
        cout << "账号:" << iter->getac() << endl;
         cin >> choice;
        if (choice == "y" || choice == "Y")
        {
            // 删除当前元素
            iter = listur.erase(iter);
            --iter; // 迭代器需要回退到上一个元素,因为erase函数会使迭代器失效
        }
    }
    }
}
void userControl::change()
{
    string i;
    string choice;
    list<user>::iterator iter;
    cout<<"输入要修改的账号:";
      cin >> i;

    // 遍历列表
    for (iter = listur.begin(); iter != listur.end(); ++iter)
    {
        if(i==iter->getac())
        {
            cout<<"是否修改账号?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setac();
            }
             cout<<"是否修改密码?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setps();
            }
             cout<<"是否修改名称?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setname();
            }
             cout<<"是否修改权限?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setsf();
            }

    }
    }
}

void userControl::loadFromFile(string filename)
{
    ifstream in(filename);
    if (!in)
    {
        cout << "File does not exist." << endl;
        return;
    }
    string a1,p1,n1;
    double s1;
    while(in>>a1>>p1>>n1>>s1)
    {
        user ur(a1,p1,n1,s1);
        listur.push_back(ur);
    }
    in.close();
}
void userControl::display()
{
    list<user>::iterator iter;
    for(iter=listur.begin(); iter!=listur.end(); iter++)
    {
        iter->display();
    }
}
void userControl::input()
{
    user s;
    s.setv();
    listur.push_back(s);
}
void userControl::resisgin()
{
    user s;
    s.resisginv();
    listur.push_back(s);
}
void userControl::writeToFile(string filename)
{
    ofstream out(filename,ios_base::out);
    if (!out)
    {
        cout << "Error: Cannot open file " << filename << endl;
        return;
    }
    list<user>::iterator iter ;
    for(iter=listur.begin(); iter!=listur.end(); iter++)
    {
        out   << iter->getac() << ' '
              << iter->getps() << ' '
              << iter->getname() << ' '
              << iter->getsf() << '\n';
    }
    out.close();
}
void userControl::login()
{
    booksControl* bc ;

    string ac;
    string ps;
    int counts=0;
    userControl* uc = this;
    int a=0;
    cout<<"输入账号:";
    cin>>ac;
    list<user>::iterator iter ;
    list<user>::iterator iters ;
    for(iter=listur.begin(); iter!=listur.end(); iter++)
    {

    }
    for(iter=listur.begin(); iter!=listur.end(); iter++)
    {
        if(ac==iter->getac())
        {
            do
            {
                cout<<"输入密码:";
                cin>>ps;
                if(ps!=iter->getps())
                {
                    cout<<"密码错误,请检查密码"<<endl;
                    counts++;
                    if(counts==3)
                    {
                        cout<<"密码错误三次,请稍后登录"<<endl;
                        break;
                    }
                }
                if(ps==iter->getps())
                {
                    cout<<"密码正确,正在登录系统中"<<endl;
                    a=1;
                    iters=iter;
                    break;
                }
            }
            while(ps!=iter->getps());
        }
    }
    iter--;
    if(ac!=iter->getac()&&a==0)
    {
        cout<<"没有这个账号或者忘记密码,是否创建新的账号(Y/N)"<<endl;
        resisgin();
        writeToFile("user.txt");
        login();
    }
    if(a==1)
    {
         mo(uc,iters);
    }
}

books.h

#ifndef BookS_H_INCLUDED
#define BookS_H_INCLUDED

#include<iostream>
#include<string>
#include<list>
#include <fstream>
#include <sstream>
using namespace std;

class Book
{
public:
    string recordnum;
    string booknum;
    string title;
    string author;
    string press;
    int nums;
    int outs;

    Book() {}
    Book(string rd,string bn,string t, string a,string p,int n, int y) :recordnum(rd),booknum(bn),title(t), author(a),press(p),nums(n), outs(y) {}
    string getrn()
    {
        return recordnum;
    }
    string getbn()
    {
        return booknum;
    }
    string gettitle()
    {
        return title;
    }
    string getauthor()
    {
        return author;
    }
    string getpress()
    {
        return press;
    }
    int getnums()
    {
        return nums;
    }
    int getouts()
    {
        return outs;
    }
    void setrn()
    {
        cin>>recordnum;
    }
    void setbn()
    {
        cin>>booknum;
    }
    void settitle()
    {
        cin>>title;
    }
    void setauthor()
    {
        cin>>author;
    }
    void setpress()
    {
        cin>>press;
    }
    void setnums()
    {
        cin>>nums;
    }
    void setouts()
    {
        cin>>outs;
    }
    void outsplus()
    {
        outs++;
    }
     void outsback()
    {
        outs--;
    }
    int intgetrn()
    {
        int t;
        istringstream ss(recordnum);
        ss>>t;
        return t;
    }
    friend ostream& operator<<(ostream& os, const Book& b)
    {
        os <<b.recordnum<<" "<<b.booknum<< " " <<b.title<< " " << b.author<< " " << b.press<< " " << b.nums<< " " << b.outs;
        return os;
    }
    friend istream& operator>>(istream& is, Book& b)
    {
        getline(is, b.recordnum, ' ');
        getline(is, b.booknum, ' ');
        getline(is, b.title, ' ');
        getline(is, b.author, ' ');
        getline(is, b.press, ' ');
        is >> b.nums>>b.outs;
        is.ignore();
        return is;

    }
};

class booksControl
{
private:
    list<Book> books;
    int bnf[2][1000]= {0,0};

public:
    void addBook(Book book)
    {
        books.push_back(book);
    }
    void sortbn()
    {
        int i,j,t;
        list<Book>::iterator iter;
        iter= prev(books.end());
        string rn=iter->getrn();
        istringstream ss(rn);
        ss>>t;
        for(j=0; j<t; j++)
        {
            for(i=j; i<t; i++)
            {
                if(bnf[1][j]>bnf[1][i])
                {
                    swap(bnf[0][j],bnf[0][i]);
                    swap(bnf[1][j],bnf[1][i]);
                }
            }
        }
        ofstream out("main_index.txt");
        for(j=0; j<t; j++)
        {
            out<<bnf[0][j]<<" "<<bnf[1][j]<<endl;
        }
        out.close();
    }
    void inputBook()
    {
        string recordnum1;
        string booknum1;
        string title1;
        string author1;
        string press1;
        int nums1;
        int outs1;
        int t;
        list<Book>::iterator iter;
        for (iter = books.begin(); iter != books.end(); ++iter)
        {
            recordnum1=iter->getrn();
        }
        istringstream ss(recordnum1);
        ss>>t;
        t++;
        ostringstream sss;
        sss << t;
        recordnum1=sss.str();
        cout<<"输入书号";
        cin>>booknum1;
        cout<<"输入书名:";
        cin>>title1;
        cout<<"输入作者";
        cin>>author1;
        cout<<"输入出版社";
        cin>>press1;
        cout<<"输入书籍数量";
        cin>>nums1;
        cout<<"输入借出数量";
        cin>>outs1;
        Book book(recordnum1,booknum1,title1,author1,press1,nums1,outs1);
        books.push_back(book);
    }

    void saveToFile(const string& filename) const
    {
        ofstream outfile(filename);

        if (!outfile.is_open())
        {
            cout << "无法打开文件" << endl;
            return;
        }

        for (const auto &b : books)
        {
            outfile<< b << endl;
        }

        outfile.close();
    }

    void readFromFile(const string &filename)
    {
        ifstream infile(filename);
        if (!infile.is_open())
        {
            cout << "无法打开文件" << endl;
            return;
        }

        books.clear();

        while (infile.good())
        {
            Book book;
            infile >> book;

            if (infile.fail())
                break;
            addBook(book);
            string recordnum1;
            string booknum1;
            int t1,t2;
            list<Book>::iterator iter;
            int i=0;
            for (iter = books.begin(); iter != books.end(); ++iter)
            {
                recordnum1=iter->getrn();
                booknum1=iter->getbn();
                istringstream ss(recordnum1);
                ss>>t1;
                istringstream sss(booknum1);
                sss>>t2;
                bnf[0][i]=t1;
                bnf[1][i]=t2;
                i++;
            }
            sortbn();
        }
        infile.close();
    }
    void changebooks()
    {
        string i;
        string choice;
        list<Book>::iterator iter;
        cout<<"输入要修改的书籍记录号:";
        cin >> i;
        // 遍历列表
        for (iter = books.begin(); iter != books.end(); ++iter)
        {
            if(i==iter->getrn())
            {
                cout<<"是否修书号?(y/n)"<<endl;
                cin>>choice;
                if(choice=="y"||choice=="Y")
                {
                    iter->setbn();
                }
                cout<<"是否修改书名?(y/n)"<<endl;
                cin>>choice;
                if(choice=="y"||choice=="Y")
                {
                    iter->settitle();
                }
                cout<<"是否修改作者?(y/n)"<<endl;
                cin>>choice;
                if(choice=="y"||choice=="Y")
                {
                    iter->setauthor();
                }
                cout<<"是否修改出版社?(y/n)"<<endl;
                cin>>choice;
                if(choice=="y"||choice=="Y")
                {
                    iter->setpress();
                }
                cout<<"是否修改书籍数量?(y/n)"<<endl;
                cin>>choice;
                if(choice=="y"||choice=="Y")
                {
                    iter->setnums();
                }
                cout<<"是否修改借出书数?(y/n)"<<endl;
                cin>>choice;
                if(choice=="y"||choice=="Y")
                {
                    iter->setouts();
                }
            }
        }
    }
    void printAllBooks() const
    {
        for (const auto &b : books)
        {
            cout<< "记录号: "<<b.recordnum<<" ";
            cout<< "书号: "<<b.booknum <<" ";
            cout<< "书名: "<<b.title<<" ";
            cout<< "作者: "<<b.author<<" ";
            cout<< "出版社: "<<b.press<<" ";
            cout<< "书籍总量: "<<b.nums<<" ";
            cout<< "借出本数: "<<b.outs<<endl;
        }
    }
    void ReadLineData(int line)
    {
        ifstream in("books.txt");
        string temp;
        int i=0;
        while(getline(in,temp)&&i<line-1)
        {
            i++;
        }
        in.close();
        cout<<temp<<endl;
    }
    void bnfinf()
    {
        int sh=0,i=0,t,k=0;
        list<Book>::iterator iter;
        iter= prev(books.end());
        string rn=iter->getrn();
        istringstream ss(rn);
        ss>>t;
        cout<<"输入要寻找的书号:";
        cin>>sh;
        int left = 0;
        int right = t-1;
        int mid;
        while(left<=right)
        {
            mid =(left+right)>>1;
            if(bnf[1][mid]<sh)
            {
                left = mid +1;
            }
            else if(bnf[1][mid]>sh)
            {
                right = mid -1;
            }
            else
            {
                ReadLineData(bnf[0][mid]);
                break;
            }
            if(left > right )
                cout<<"不存在该图书。"<<endl;
        }
    }
    string Bnfinf()
    {
        int sh=0,i=0,t,k=0;
        string choice="0";
        list<Book>::iterator iter;
        iter= prev(books.end());
        string rn=iter->getrn();
        istringstream ss(rn);
        ss>>t;
        cin>>sh;
        int left = 0;
        int right = t-1;
        int mid;
        while(left<=right)
        {
            mid =(left+right)>>1;
            if(bnf[1][mid]<sh)
            {
                left = mid +1;
            }
            else if(bnf[1][mid]>sh)
            {
                right = mid -1;
            }
            else
            {
                ostringstream sss;
                sss << bnf[1][mid];
                return  sss.str();
            }
            if(left > right )
                return choice;
        }
    }
    bool bntf(string bn)
    {
        string choice;
        list<Book>::iterator iter;
        // 遍历列表
        for (iter = books.begin(); iter != books.end(); ++iter)
        {
            if(bn==iter->getbn())
            {
                if(iter->getnums()>iter->getouts())
                    return true;
                else
                    return false;
            }

    }
    }
    void Outplus(string booknum1)
    {
         list<Book>::iterator iter;
        for (iter = books.begin(); iter != books.end(); ++iter)
        {
            if(booknum1==iter->getbn())
            {
                iter->outsplus();
                cout<<"添加成功!"<<endl;
                saveToFile("books.txt");
            }
    }

    }
    void Outback(string booknum1)
    {
         list<Book>::iterator iter;
        for (iter = books.begin(); iter != books.end(); ++iter)
        {
            if(booknum1==iter->getbn())
            {
                iter->outsback();
                cout<<"归还成功!"<<endl;
                saveToFile("books.txt");
            }
    }

    }
};

#endif // BookS_H_INCLUDED

reader.h

#ifndef readerS_H_INCLUDED
#define readerS_H_INCLUDED

#include<iostream>
#include<string>
#include<list>
#include <fstream>
using namespace std;
class Reader {
public:
    string readernums;
    string name;
    string workplace;
    string phone;
    int nums;
    int outs;

    Reader() {}
    Reader(string r, string na,string w,string p,int n, int o) : readernums(r), name(na),workplace(w),phone(p),nums(n), outs(o) {}
    string getrn(){return readernums;}
    string getname(){return name;}
    string getworkplace(){return workplace;}
    string getphone(){return phone;}
    int getnums(){return nums;}
    int getouts(){return outs;}
    void setrn(){cin>>readernums;}
    void setname(){cin>>name;}
    void setworkplace(){cin>>workplace;}
    void setphone(){cin>>phone;}
    void setnums(){cin>>nums;}
    void setouts(){cin>>outs;}
    void show(){
            cout<< "读者号:"<<readernums<<" ";
	        cout<< "读者名:"<<name<<" ";
            cout<< "单位:"<<workplace<<" ";
            cout<< "联系方式:"<<phone<<" ";
            cout<< "可借书数:"<<nums<<" ";
	        cout<< "已借书数:"<<outs<<" \n";
        }
    void outsplus()
    {
        outs++;
    }
    void outsback()
    {
        outs--;
    }
    friend ostream& operator<<(ostream& os, const  Reader& b) {
        os << b.readernums << " " << b.name << " " << b.workplace<<" "<<b.phone<< " " << b.nums<< " " << b.outs;
        return os;
    }

    friend istream& operator>>(istream& is,  Reader& b) {
        getline(is, b.readernums, ' ');
        getline(is, b.name, ' ');
        getline(is, b.workplace, ' ');
        getline(is, b.phone, ' ');
        is >> b.nums>>b.outs;
        is.ignore();
        return is;

    }
};

class ReaderControl {
private:
    list<Reader> listrd;

public:
    void addReader(Reader reader){listrd.push_back(reader);}
    void inputReader() {
    string readernums1;
    string name1;
    string workplace1;
    string phone1;
    int nums1;
    int outs1;
    cout<<"输入读者号:";
    cin>>readernums1;
    cout<<"输入读者名:";
    cin>>name1;
    cout<<"输入单位:";
    cin>>workplace1;
    cout<<"输入联系方式:";
    cin>>phone1;
    cout<<"输入可借书数:";
    cin>>nums1;
    cout<<"输入已借数书数量:";
    cin>>outs1;
        Reader reader(readernums1,name1,workplace1,phone1,nums1,outs1);
        listrd.push_back(reader);
        }

    void saveToFile(const string& filename) const {
        ofstream outfile(filename);

		if (!outfile.is_open()) {
		    cout << "无法打开文件" << endl;
		    return;
		}

		for (const auto &b : listrd) {
			outfile << b << endl;
		}

		outfile.close();
    }

	void readFromFile(const string &filename) {
	    ifstream infile(filename);

	    if (!infile.is_open()) {
	        cout << "无法打开文件" << endl;
	        return;
	    }

	    listrd.clear();

	    while (infile.good()) {
	        Reader reader;
	        infile >> reader;

			if (infile.fail())
				break;

	        addReader(reader);
	    }

	    infile.close();
	}
	void printAllreaders() const {
	    for (const auto &b : listrd) {
            cout<< "读者号:"<<b.readernums<<" ";
	        cout<< "读者名:"<<b.name<<" ";
            cout<< "单位:"<<b.workplace<<" ";
            cout<< "联系方式:"<<b.phone<<" ";
            cout<< "可借书数:"<<b.nums<<" ";
	        cout<< "已借书数:"<<b.outs<<" \n";
	    }
	}
	void deletereader()
	{
    string i;
    string choice;
    list<Reader>::iterator iter;
    cout<<"输入要删除的读者号:";
      cin >> i;

    // 遍历列表
    for (iter = listrd.begin(); iter != listrd.end(); ++iter)
    {
        if(i==iter->getrn())
        {
        cout << "要删除以下账号吗?(y/n)" << endl;
        cout << "账号:" << iter->getrn() << endl;
         cin >> choice;
        if (choice == "y" || choice == "Y")
        {
            // 删除当前元素
            iter = listrd.erase(iter);
            --iter; // 迭代器需要回退到上一个元素,因为erase函数会使迭代器失效
        }
    }
    }
	}
     string findreadernum()
     {
    string i;
    string choice="0";
    list<Reader>::iterator iter;
      cin >> i;
    // 遍历列表
    for (iter = listrd.begin(); iter != listrd.end(); ++iter)
    {
        if(i==iter->getrn())
        {
           return i;
        }
    }
    iter--;
    if(i!=iter->getrn())
    {
        return choice;
    }
     }
	 void finfreader()
    {
    string i;
    string choice;
    list<Reader>::iterator iter;
      cin >> i;
    // 遍历列表
    for (iter = listrd.begin(); iter != listrd.end(); ++iter)
    {
        if(i==iter->getrn())
        {
            iter->show();
        }
    }
    iter--;
    if(i!=iter->getrn())
    {
        cout<<"没有这个读者"<<endl;
    }
    }
	void changereaders()
	{
    string i;
    string choice;
    list<Reader>::iterator iter;
    cout<<"输入要修改的读者号:";
      cin >> i;
    // 遍历列表
    for (iter = listrd.begin(); iter != listrd.end(); ++iter)
    {
        if(i==iter->getrn())
        {
            cout<<"是否修改读者号?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setrn();
            }
             cout<<"是否修改读者名?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setname();
            }
             cout<<"是否修改单位?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setworkplace();
            }
             cout<<"是否修改联系方式?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setphone();
            }
            cout<<"是否修改可借书数?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setnums();
            }
            cout<<"是否修改已借书数?(y/n)"<<endl;
            cin>>choice;
            if(choice=="y"||choice=="Y")
            {
                iter->setouts();
            }
    }
    }
	}
	void Outplus(string readernum1)
    {
         list<Reader>::iterator iter;
        for (iter = listrd.begin(); iter != listrd.end(); ++iter)
        {
            if(readernum1==iter->getrn())
            {
                iter->outsplus();
                cout<<"添加成功!"<<endl;
            }
    }
     saveToFile("reader.txt");
    }
   void Outback(string readernum1)
    {
         list<Reader>::iterator iter;
        for (iter = listrd.begin(); iter != listrd.end(); ++iter)
        {
            if(readernum1==iter->getrn())
            {
                iter->outsback();
                cout<<"添加成功!"<<endl;
            }
    }
     saveToFile("reader.txt");
    }
};

#endif // readerS_H_INCLUDED

bookio.h

#ifndef BOOKIO_H_INCLUDED
#define BOOKIO_H_INCLUDED

using namespace std;
#include"user.h"
#include"books.h"
#include"reader.h"
#include<iostream>
#include<string>
#include<list>
#include <fstream>
class bookio
{
private:
    string readernum;
    string booknum;
    string outdata;
    string indata="未归还";
    string remark;
public:
    bookio();
    bookio(string r,string b,string o):readernum(r),booknum(b),outdata(o) {};
    bookio(string r,string b,string o,string i):readernum(r),booknum(b),outdata(o),indata(i) {};
    void setrn()
    {
        cin>>readernum;
    }
    void setbn()
    {
        cin>>booknum;
    }
    void setod()
    {
        cin>>outdata;
    }
    void setid(string indata1)
    {
        indata=indata1;
    }
    void display();
    string getrn()
    {
        return readernum;
    }
    string getbn()
    {
        return booknum;
    }
    string getod()
    {
        return outdata;
    }
    string getid()
    {
        return indata;
    }

};
class bookioControl
{
private:
    list<bookio> listbio;
public:
    bookioControl() {};
    void outbook()
    {
        string readernum1;
        string booknum1;
        string outdata1;
        string indata1="未归还";
        ReaderControl rc;
        booksControl bc;
        list<bookio>::iterator iterbio;
        list<Book>::iterator iterbk;
        list<Reader>::iterator iterd;
        rc.readFromFile("reader.txt");
        bc.readFromFile("books.txt");
        cout<<"输入读者号";
        readernum1=rc.findreadernum();
        cout<<"输入书号:";
        booknum1=bc.Bnfinf();
        cout<<"输入借书日期:";
        cin>>outdata1;
        cout<<readernum1<<booknum1<<endl;
        if(readernum1=="0")
        {
            cout<<"不存在该读者"<<endl;
        }
        else if(booknum1=="0")
        {
            cout<<"不存在该图书"<<endl;
        }
        else if(bc.bntf(booknum1)==false)
        {
            cout<<"该图书库存为空"<<endl;
        }
        else
        {
            bookio bio(readernum1,booknum1,outdata1,indata1);
            listbio.push_back(bio);
            ofstream out("bookio.txt");
            if (!out)
            {
                cout << "Error: Cannot open file"  << endl;
                return;
            }
            for(iterbio=listbio.begin(); iterbio!=listbio.end(); iterbio++)
            {
                out   << iterbio->getrn() << ' '
                      << iterbio->getbn() << ' '
                      << iterbio->getod() << ' '
                      << iterbio->getid() << '\n';
            }
            out.close();
        }
        bc.Outplus(booknum1);
        rc.Outplus(readernum1);
    };
    void inbook()
    {
        ifstream in("bookio.txt");
        if (!in)
        {
            cout << "File does not exist." << endl;
            return;
        }
        string readernum1;
        string booknum1;
        string outdata1;
        string indata1;
        while(in>>readernum1>>booknum1>>outdata1>>indata1)
        {
            bookio bio(readernum1,booknum1,outdata1,indata1);
            listbio.push_back(bio);
        }
        in.close();
        ReaderControl rc;
        booksControl bc;
        list<bookio>::iterator iterbio;
        list<Book>::iterator iterbk;
        list<Reader>::iterator iterd;
        rc.readFromFile("reader.txt");
        bc.readFromFile("books.txt");
        cout<<"输入读者号";
        readernum1=rc.findreadernum();
        cout<<"输入书号:";
        booknum1=bc.Bnfinf();
        cout<<"输入还书日期:";
        cin>>indata1;
        if(readernum1=="0")
        {
            cout<<"不存在该读者"<<endl;
        }
        else if(booknum1=="0")
        {
            cout<<"不存在该图书"<<endl;
        }
        else
        {
            for(iterbio=listbio.begin(); iterbio!=listbio.end(); iterbio++)
            {
                if(iterbio->getrn()==readernum1 && iterbio->getbn()==booknum1)
                {
                    cout<<"找到该借书记录"<<endl;
                     if(iterbio->getid()!="未归还")
                     {
                         cout<<"该图书已归还"<<endl;
                     }
                    else if(indata1<outdata1)
                    {
                        string choice;
                        cout<<"还书日期有误!是否重新输入还书日期?(y/n)"<<endl;
                        cin>>choice;
                        if(choice=="Y"||choice=="y")
                        {
                            cin>>indata1;
                        }
                        else
                            return;
                    }
                    iterbio->setid(indata1);
                    ofstream out("bookio.txt");
                    for(iterbio=listbio.begin(); iterbio!=listbio.end(); iterbio++)
                    {
                        out   << iterbio->getrn() << ' '
                              << iterbio->getbn() << ' '
                              << iterbio->getod() << ' '
                              << iterbio->getid() << '\n';
                    }
                    out.close();
                    bc.Outback(booknum1);
                    rc.Outback(readernum1);
                    return;
                }
            }
            cout<<"不存在该图书信息"<<endl;
        }
        cout<<"还书"<<endl;
    };
};


#endif // BOOKIO_H_INCLUDED

function.h

#ifndef FUNCTION_H_INCLUDED
#define FUNCTION_H_INCLUDED

#include<iostream>
#include<string>
#include<list>
#include <fstream>
#include"user.h"
#include"books.h"
#include"reader.h"
#include"bookio.h"
using namespace std;
void bf(booksControl book,list<user>::iterator iters)
{
    int i;
    cout<<"*****图书信息查询*****"<<endl;
    do
    {
        cout<<"1.按书号查询"<<endl;
        cout<<"2.按书名查询"<<endl;
        cout<<"3.按作者查询"<<endl;
        cout<<"4.按出版社查询"<<endl;
        cout<<"5.返回主菜单"<<endl;
        cin>>i;
        switch(i)
        {
        case 1:
            book.bnfinf();
            break;
        case 2:

            break;
        case 3:

            break;
        case 4:

            break;
        case 5:

            break;
        }
    }
    while(i!=5);
}

void uo(userControl* uc,list<user>::iterator iters)
{
    int i;
    string oldps;
    string out="N";
    if(iters->getsf()==2)
    {
        cout<<"权限不足,无法访问"<<endl;
        return;
    }
    cout<<"******用户管理子系统*****"<<endl;
    do
    {
        cout<<"1.用户信息输入"<<endl;
        cout<<"2.用户信息修改"<<endl;
        cout<<"3.用户信息删除"<<endl;
        cout<<"4.用户信息显示"<<endl;
        cout<<"5.用户密码修改"<<endl;
        cout<<"6.返回主菜单"<<endl;
        cin>>i;
        switch(i)
        {
        case 1:
            if(iters->getsf()!=3)
            {
                cout<<"权限不足,无法访问"<<endl;
            }
            else if(iters->getsf()==3)
            {
                uc->input();
                uc->writeToFile("user.txt");
            }
            break;
        case 2:
            if(iters->getsf()==1||iters->getsf()==2)
            {
                cout<<"权限不足,无法访问"<<endl;
            }
            else if(iters->getsf()==3)
            {
                uc->change();
                uc->writeToFile("user.txt");
            }
            break;
        case 3:
            if(iters->getsf()==1||iters->getsf()==2)
            {
                cout<<"权限不足,无法访问"<<endl;
            }
            else if(iters->getsf()==3)
            {
                uc->deletes();
                uc->writeToFile("user.txt");
            }

            break;
        case 4:
            if(iters->getsf()==1||iters->getsf()==2)
            {
                cout<<"权限不足,无法访问"<<endl;
            }
            else if(iters->getsf()==3)
            {
                uc->display();
            }
            break;
        case 5:
            cout<<"输入原密码:";
            cin>>oldps;
            while(iters->getps()!=oldps)
            {
                cout<<"原密码错误,请重新输入或者退出(N):";
                cin>>oldps;
                if(oldps==out)
                    break;
            }
            if(iters->getps()==oldps)
            {
                cout<<"输入新密码:";
                iters->setps();
                cout<<"修改成功"<<endl;
                uc->writeToFile("user.txt");
            }
            break;

        case 6:
            break;
        }
    }
    while(i!=6);
}

void ro(list<user>::iterator iters)
{
    int i;
    if(iters->getsf()!=3)
    {
        cout<<"权限不足"<<endl;
        return;
    }
    cout<<"******读者管理子系统*****"<<endl;
    ReaderControl rc;
    rc.readFromFile("reader.txt");
    do
    {
        cout<<"1.读者信息输入"<<endl;
        cout<<"2.读者信息修改"<<endl;
        cout<<"3.读者信息删除"<<endl;
        cout<<"4.读者信息查询"<<endl;
        cout<<"5.读者信息显示(按读者姓氏排序)"<<endl;
        cout<<"6.返回主菜单"<<endl;
        cin>>i;
        switch(i)
        {
        case 1:
            rc.inputReader();
            rc.saveToFile("reader.txt");
            break;
        case 2:
            rc.changereaders();
            rc.saveToFile("reader.txt");
            break;
        case 3:
            rc.deletereader();
            rc.saveToFile("reader.txt");
            break;
        case 4:
            rc.finfreader();
            break;
        case 5:
            rc.printAllreaders();
            break;
        case 6:

            break;
        }
    }
    while(i!=6);
}
void bo(list<user>::iterator iters)
{
    int i;
    if(iters->getsf()==3)
    {
        cout<<"权限不足"<<endl;
        return;
    }
    cout<<"******图书管理子系统*****"<<endl;
    booksControl book;
    book.readFromFile("books.txt");
    do
    {
        cout<<"1.图书信息输入"<<endl;
        cout<<"2.图书信息修改"<<endl;
        cout<<"3.图书信息查询"<<endl;
        cout<<"4.汇总统计"<<endl;
        cout<<"5.返回主菜单"<<endl;
        cin>>i;
        switch(i)
        {
        case 1:
            if(iters->getsf()==1)
            {
                cout<<"权限不足,无法访问"<<endl;
            }
            else if(iters->getsf()==3||iters->getsf()==2)
            {
                book.inputBook();
                book.saveToFile("books.txt");
            }
            break;
        case 2:
            if(iters->getsf()==1)
            {
                cout<<"权限不足,无法访问"<<endl;
            }
            else if(iters->getsf()==3||iters->getsf()==2)
            {
                book.changebooks();
                book.saveToFile("books.txt");
            }
            break;
        case 3:
            book.readFromFile("books.txt");
            bf(book,iters);
            break;
        case 4:
            book.printAllBooks();
            break;
        case 5:

            break;
        }
    }
    while(i!=5);
}
void bmo(list<user>::iterator iters)
{
    int i;
    if(iters->getsf()!=2)
    {
        cout<<"权限不足,无法访问"<<endl;
        return;
    }
    system("cls");
    bookioControl bioc;
    cout<<"******图书流通管理子系统*****"<<endl;
    do
    {
        cout<<"1.借书处理"<<endl;
        cout<<"2.还书处理"<<endl;
        cout<<"3.返回主菜单"<<endl;
        cin>>i;
        switch(i)
        {
        case 1:
            bioc.outbook();
            break;
        case 2:
            bioc.inbook();
            break;
        case 3:

            break;
        }
    }
    while(i!=3);
}
void mo(userControl* uc,list<user>::iterator iters)
{
    int i;
    cout<<"欢迎进入图书管理系统主菜单"<<endl;
    do
    {
        cout<<"1.用户管理"<<endl;
        cout<<"2.读者管理"<<endl;
        cout<<"3.图书管理"<<endl;
        cout<<"4.图书流通管理"<<endl;
        cout<<"5.退出系统"<<endl;
        cin>>i;
        switch(i)
        {
        case 1:
            uo(uc,iters);
            break;
        case 2:
            ro(iters);
            break;
        case 3:
            bo(iters);
            break;
        case 4:
            bmo(iters);
            break;
        case 5:
            break;
        }
    }
    while(i!=5);
}



#endif // FUNCTION_H_INCLUDED

可执行的代码就是上面的部分,有人就会问了,“为什么出了user有cpp文件,其他头文件没有cpp文件呢?”,这个地方作者本人比较懒,在写头文件的时候之间就实现了函数,所以不需要cpp文件去实现头文件中定义的函数,一来这样写我认为比较方便修改与临时添加函数,二来就是windows上移植到linux时可以减少文件的传送量。

main.cpp

在主函数中只有短短几行,是整个系统进入的开始。

user.cpp

我的想法是先就创建一个空的user对象,从user对象的函数中设置了登录的函数,登录函数从user.txt文件中读取比对用户输入的账号是否存在,如果存在着继续输入密码,由于我将用户的信息都是读取到user对象组成的list列表,所以可以通过迭代器寻找到该账号所对应对象,在通过该对象的函数返回密码的字符串进行比对,如果正确则进行下一步进入到菜单界面。

function.h

该文件是整个系统的核心,说白了就是全部的菜单都在这一个文件中,感觉这应该是最简单的部分,就是一大堆的switch和case组合的东西,要注意的就是在每个菜单的函数中要传入最开始登录用户这个对象,因为要通过这个对象(当前对象)获取相应的权限(其实就是判断1,2,3这几个数),同理每个不同的子系统要传入不同类型对象的list链表,这样才能便于在对应的函数中调用对应模块的功能。

reader.h

由于user,reader,books三个文件中实现的部分功能存在相似之处,所以我在这里只详细介绍一下reader(读者管理)的功能实现。

首先,我们要定义reader类,用来实现存储每个单独的读者信息,由于未知后续的操作,所以我编写了返回每个成员变量的函数,以及相应的修改函数。并且这里还使用到了友元函数用来文件的读取与输出。接下来就是编写readerControl类,他的作用就像是一根绳子将每个单独的对象串在一起来管理,其中最基础的部分就是如何将文件中的内容准确的读取到链表中去,我在这里展示了其中的一种做法,当然只要能将数据读取与输出,用什么方法都无所谓了。

使用push_back将构造函数初始化好的对象直接加入链表,这一步对于c++而言十分简便,所以该系统并不推荐使用c语言编写,至于输入,修改,删除等一系列操作则都是对迭代器遍历链表的反复操作,具体细节见详细代码。

books.h

该文件中较为特殊的就是对于书籍的查询,将文件书的记录号以及书号通过迭代器一一获取,(由于本人在初次编写时将记录号以及书号的类型定义为了string类型,故需要将其转换为int类型,如果你的记录号以及书号原本就是int类型则不需要这一步),将获取到的书号以及记录号存入一个长度为迭代器返回最后一个对象的记录号长度(n)的二维数组之中(2列n行),然后对书号进行从小到大的排序(该过程在将文件信息导入链表中同步进行),排序之后的数组就可以使用二分法查找对应的书号,再过书号获取对应的记录号,返回记录号之后就可以定位文件中书籍所在的具体位置进行输出。(由于时间有限,暂时只完成主索引部分)

bookio.h

借书还书部分是整个系统最综合的部分,需要使用到前面的reader和books文件,还需添加相应的函数实现对于书籍数目的变动,以及对于读者借阅书籍数量的变动。

总的来说也没多少人看到这里,爱看就看,不看拿上代码就肘也无所谓,但我希望读者能够保持自己的独立思考,结合我的代码对于自己的系统进行修改,而不是照搬使用。

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Linux系统下,可以使用C语言编写一个简单的图书管理系统。以下是一个简单的示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_BOOKS 100 struct book { int id; char title[50]; char author[50]; int year; }; struct book books[MAX_BOOKS]; int num_books = 0; void add_book() { struct book new_book; printf("Enter book ID: "); scanf("%d", &new_book.id); printf("Enter book title: "); scanf("%s", new_book.title); printf("Enter book author: "); scanf("%s", new_book.author); printf("Enter year of publication: "); scanf("%d", &new_book.year); books[num_books] = new_book; num_books++; printf("Book added successfully!\n"); } void view_books() { printf("ID\tTitle\tAuthor\tYear\n"); for (int i = 0; i < num_books; i++) { struct book current_book = books[i]; printf("%d\t%s\t%s\t%d\n", current_book.id, current_book.title, current_book.author, current_book.year); } } void search_books() { char search_term[50]; printf("Enter search term: "); scanf("%s", search_term); printf("ID\tTitle\tAuthor\tYear\n"); for (int i = 0; i < num_books; i++) { struct book current_book = books[i]; if (strstr(current_book.title, search_term) != NULL || strstr(current_book.author, search_term) != NULL) { printf("%d\t%s\t%s\t%d\n", current_book.id, current_book.title, current_book.author, current_book.year); } } } int main() { int choice; while (1) { printf("\n1. Add book\n"); printf("2. View books\n"); printf("3. Search books\n"); printf("4. Quit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: add_book(); break; case 2: view_books(); break; case 3: search_books(); break; case 4: exit(0); default: printf("Invalid choice!\n"); } } return 0; } ``` 这个程序定义了一个结构体 `book` 表示一本书,每本书有一个ID、标题、作者和出版年份。程序使用一个数组 `books` 来存储所有的书籍,并提供了三个基本操作:添加书籍、查看所有书籍和搜索书籍。可以通过在终端中运行程序来使用这些操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值