c++大作业书籍信息管理系统

#include<iostream>
#include<windows.h>//与 system("cls");连用实现清屏操作
#include <fstream>//对文件进行操作所包含的头文件
#include<stdio.h>//使用Sleep()需包含的头文件
#include <cstring>
#include<iomanip>
using namespace std;
const unsigned  short MAX =11;
class book
{
private:
    string bookEntrynumber;//书籍登录号
    string bookname;//书籍名称
    string authorname;//作者姓名
    string booktype;// 书籍分类
    string publishaddress;//书籍出版单位
    string  publishtime;//书籍出版时间
    string bookprice;//书籍价格
public:
    book* next;
    string getbookEntrynumber()//get函数实现private数据在类外调用
    {
        return bookEntrynumber;
    }
    string getbookname()
    {
        return bookname;
    }
    string getauthorname()
    {
        return authorname;
    }
    string getbooktype()
    {
        return booktype;
    }
    string getpublishaddress()
    {
        return publishaddress;
    }
    string getpublishtime()
    {
        return publishtime;
    }
    string getbookprice()
    {
        return bookprice;
    }
    friend istream& operator>>(istream& in, book& p);//重载输入
    friend ostream& operator<<(ostream& out, book& p);//重载输出
    void  m_bookEntrynumber()//输入图书数据 book_Entry_number
    {
        cin >> bookEntrynumber;
    }
    void m_bookname()// 输入图书数据book_name
    {
        cin >> bookname;
    }
    void m_authorname()// 输入图书数据author_name
    {
        cin >> authorname;
    }
    void m_booknumber()// 输入图书数据book_number
    {
        cin >> booktype;
    }
    void m_publishaddress()// 输入图书数据publish_address
    {
        cin >> publishaddress;
    }
    void m_publishtime()// 输入图书数据publish_time
    {
        cin >> publishtime;
    }
    void m_bookprice()// 输入图书数据book_price
    {
        cin >> bookprice;
    }
    void Exchangebook(book* q);//进行图书信息交换
};
istream& operator>>(istream& in, book& p)//实现重载输入
{
    in >> p.bookEntrynumber >> p.bookname >> p.authorname >> p.booktype >> p.publishaddress >> p.publishtime >> p.bookprice;
    return in;
}
ostream& operator<<(ostream& out, book& p)//实现重载输出 (固定输出数据宽度为MAX,左对齐,
{
    out << setw(MAX) << setiosflags(ios::left) << p.bookEntrynumber << "\t\t";
    out << setw(MAX) << setiosflags(ios::left) << p.bookname << "\t\t";
    out << setw(MAX) << setiosflags(ios::left) << p.authorname << "\t\t";
    out << setw(MAX) << setiosflags(ios::left) << p.booktype << "\t\t";
    out << setw(MAX) << setiosflags(ios::left) << p.publishaddress << "\t\t";
    out << setw(MAX) << setiosflags(ios::left) << p.publishtime << "\t\t";
    out << setw(MAX) << setiosflags(ios::left) << p.bookprice << endl;
    return out;
}
class LibraryManager//图书馆管理类
{
public:
    LibraryManager();//图书管理类的构造函
    void Menu();//图书管理系统菜单
    void ExitManager();//退出系统
    void Addbook(book** q);//增加图书信息
    void showbook(book* q);//显示图书信息
    void Deletebook(book** q);//删除图书信息
    void amendbook(book* q);//修改图书信息
    void FINDbook(book* q);//查找图书信息
    void sortbook(book* q);//按照图书价格排序
    void Exchangebook(book* q);//排序时用来信息交换
    void SaveData(book* q);//将图书数据保存在新文件中
    int  initbook(book** q);//从文件中读出图书信息
private:
    book* abook;//book类指针指向链表头
    book* zbook;//book类指针指向链表尾
};
LibraryManager::LibraryManager()//图书管理类的构造函数
{
    abook = NULL;
    initbook(&abook);//将链表头部地址传给 init_book
}
int  LibraryManager::initbook(book** q)//从文件中读出图书信息
{
    int j = 0;//用来计录读取信息数
    ifstream infile("书籍信息.txt", ios::in);//从书籍信息.txt文件中读取数据
    if (!infile)
    {
        cout << "书籍载入失败" << endl; //书籍载入失败
        Sleep(200);
        system("cls");
        return 0;
    }
    while (!infile.eof())
    {
        book* temp;
        temp = new book;
        infile >> (*temp);
        if (infile.eof()) { break; }//读取到文件尾,结束
        j++;
        if (*q == NULL)//检查链表是否为空链表
        {
            temp->next = NULL;
            *q = temp;
        }
        else
        {
            temp->next = NULL;
            (zbook)->next = temp;
        }
        zbook = temp;
    }
    if (j == 0) {
        cout << "书籍文件为空" << endl;
        Sleep(200);
        system("cls");
    }
    else 
    {
        cout << "从文件中读取数据" << endl;
        Sleep(300);
        system("cls");
    }
    infile.close();
    return 1;
}
void LibraryManager::Menu()
{
    cout << "------------欢迎使用图书信息管理系统------------------" << endl;
    cout << "        1---增加图书信息      2---显示图书信息 " << endl;
    cout << "        3---删除图书信息      4---修改图书信息 " << endl;
    cout << "        5---查找图书信息      6---按照价格排序 " << endl;
    cout << "        7--图书数据保存在新文件中并退出系统" << endl;
    cout << "------------------------------------------------------" << endl;
    cout << "请输入您的选择--->";
    char  m;
    try 
    {
        cin >> m;
        if (m < '1' || m>'8') throw - 1;
    }
    catch (int)
    {
        cout << "输入有误,请重新输入" << endl;
        cin >> m;
    }
    switch (m)//根据用户的选择进行功能实现
    {
    case '1':  Addbook(&abook); break;//增加图书信息
    case '2':  showbook(abook); break;//显示图书信息
    case '3':  Deletebook(&abook); break;//删除图书信息
    case '4':  amendbook(abook); break;//修改图书信息
    case '5':  FINDbook(abook); break;//查找图书信息
    case '6':  sortbook(abook); break;//按照登录号排序
    case '7':  SaveData(abook); cout << "欢迎下次使用" << endl; exit(0); break;//将图书数据保存在新文件中
    case '8':  initbook(&abook); break;
    }
}//从文件中读出图书信息
void  LibraryManager::Addbook(book** q)//增加图书信息
{
    char m;
    cout << "请输入图书信息" << endl;
    book* p;//定义book类指针
    p = new book;//为p申请存储空间
    cout <<"本书编号              本书书籍名称          本书作者姓名              本书分类                 本书出版单位       本书出版时间            本书书籍价格" << endl;
    cin >> *p;
    if (*q == NULL)//检查链表是否为空链表
    {
        p->next = NULL;
        *q = p;
    }//如果链表为空则把链表头指向p
    else
    {
        p->next = NULL;//p是倒数第二个节点,next指针中保存这尾节点的地址值,p指向尾节点
        (zbook)->next = p;//如果链表不为空则把链表尾指向p
    }
    zbook = p;
    cout << "添加成功,是否继续添加:是c,否d:" << endl;
    cin >> m;
    while (m != 'c' && m != 'd')
    {
        cout << "输入错误,请重新输入:" << endl;
        cin >> m;
    }
    if (m == 'c')
    {
        Addbook(&abook);
        exit(0);
    }
    else
    {
        cout << "正在返回到菜单,请勿操作" << endl;
        Sleep(200);
        system("cls");//清屏
        Menu();
        exit(0);
    }
}
void  LibraryManager::showbook(book* q)//显示图书信息
{
    book* m = q;//定义book类指针指向链表地址
    int k = 0, j = 0;//k控制换行,j记录书籍本书
    cout << "本书编号              本书书籍名称          本书作者姓名              本书分类                 本书出版单位       本书出版时间            本书书籍价格" << endl;
    while (m != NULL)
    {
        cout << *m << endl;
        k++; j++;
        if (k > 10)//每 11个数据换行
        {
            cout << endl << endl; k = k - 11;
        }
        m = m->next;
    }
    cout << "一共展示" << j << "本图书" << endl;
    system("pause");
    cout << "正在返回到菜单,请勿操作" << endl;
    Sleep(200);
    system("cls");
    Menu();
    exit(0);
}
void  LibraryManager::amendbook(book* q)//修改图书信息
{
    string mp;
    char  h;
    book* p, ctemp;
    p = q;
    cout << "请输入要修改的图书的登录号:输入NO返回菜单" << endl;
    cin >> mp;
    if (mp == "NO") { system("cls"); Menu(); exit(0); }//返回菜单
    while (p != NULL)
    {
        if (p->getbookEntrynumber() == mp)break;//已查找到
        else { p = p->next; }
    }
    if (p == NULL)//未查找到
    {
        cout << "无此图书" << endl; 
        Sleep(300);
        amendbook(q);
        exit(0);
    }
    else
    {
        system("cls");
        ctemp = *p;
        cout << "以下为图书信息:" << endl;
        cout << "本书编号              本书书籍名称          本书作者姓名              本书分类                 本书出版单位       本书出版时间            本书书籍价格" << endl;
        cout << *p << endl;
        cout << "********************************" << endl;
        cout << "本书编号0" << endl;
        cout << "本书书籍名称1" << endl;
        cout << "本书作者姓名2" << endl;
        cout << "本书分类3" << endl;
        cout << "本书出版单位4" << endl;
        cout << "本书出版时间5" << endl;
        cout << "本书书籍价格6" << endl;
        cout << "********************************" << endl;
        cout << "7返回菜单" << endl;
        cout << "请选择要修改的信息:0,1,2,3,4,5,6对应相应信息";
        try
        {
            cin >> h;
            if (h < '1' || h>'8') throw - 1;
        }
        catch (int)
        {
            cout << "输入错误,请重新输入" << endl;
            cin >> h;
        }
        cout << "输入修改后的信息" << endl;
        switch (h)
        {
        case '0':p->m_bookEntrynumber(); break;
        case '1':p->m_bookname(); break;
        case '2':p->m_authorname(); break;
        case '3':p->m_booknumber(); break;
        case '4':p->m_publishaddress(); break;
        case '5':p->m_publishtime(); break;
        case '6':p->m_bookprice(); break;
        case '7':Sleep(200);
            system("cls");
            Menu();
            exit(0); break;
        }
        cout << "修改后图书信息为" << endl;
        cout << "本书编号              本书书籍名称          本书作者姓名              本书分类                 本书出版单位       本书出版时间            本书书籍价格" << endl;
        cout << *p << endl;
        system("pause");
        cout << "无此图书" << endl; cout << "正在返回到菜单,请勿操作" << endl;
        Sleep(200);
        system("cls");
        Menu();
        exit(0);
    }
};
void  LibraryManager::SaveData(book* q)//保存图书数据在新文件中( (若文件不存在则新建)
{
    book* m = q; book* btemp;
    fstream outfile("书籍信息.txt", ios::out);// 书籍信息.txt
    if (!outfile)
    {
        cout << "书籍文件保存失败" << endl;
        exit(0);
    }
    while (m != NULL)//链表不为空
    {
        outfile << *m;//把链表中数据输入文件保存,每保存一个释放一个
        btemp = m;
        m = m->next;
        delete btemp;//释放链表空间
    }
    outfile.close();//关闭文件
}
void  LibraryManager::FINDbook(book* q)//查找图书信息
{
    char p;
    cout << "按作者名查找书籍(请输入n)" << endl;
    cout << "按书籍名查找书籍(请输入s)" << endl;
    cout << "返回菜单(请输入f)" << endl;
    try
    {
        cin >> p;
        if (p!='n'&&p!='s'&&p!='f') throw - 1;
    }
    catch (int)
    {
        cout << "输入有误,请重新输入" << endl;
        cin >>p;
    }
    if (p == 'n')
    {
        string j;
        book* z;
        z = q;
        int i = 0;
        cout << "请输入需查找书籍的作者名" << endl;
        cin >> j;
        while (z != NULL)
        {
            if (z->getauthorname() == j)//已找到此书籍
            {
                cout << "该图书信息如下" << endl;
                cout << "本书编号              本书书籍名称          本书作者姓名              本书分类                 本书出版单位       本书出版时间            本书书籍价格" << endl;
                cout << *z;
                z = z->next;
                i++;
            }
            else { z = z->next; }//未找到,继续寻找
        }
        if (z == NULL)//最终未找到
        {
            cout << "无此图书" << endl;
            Sleep(200);
            FINDbook(q);
            exit(0);
        }
        else
        {
            system("pause");
            system("cls");
            Menu();
            exit(0);
        }
    }

    else if(p=='s')// 按书名搜索
    {
        string j;
        book* z;
        z = q;
        int i = 0;
        cout << "请输入需查找书籍的书名" << endl;
        cin >> j;
        while (z != NULL)
        {
            if (z->getbookname() == j)//已找到此书籍
            {
                cout << "该图书信息如下" << endl;
                cout << "本书编号              本书书籍名称          本书作者姓名              本书分类                 本书出版单位       本书出版时间            本书书籍价格" << endl;
                cout << *z;
                z = z->next;
                i++;
            }
            else { z = z->next; }//未找到,继续寻找
        }
        if (z == NULL)//最终未找到
        {
            cout << "无此图书" << endl;
            Sleep(200);
            FINDbook(q);
            exit(0);
        }
        else
        {
            system("pause");
            system("cls");
            Menu();
            exit(0);
        }
    }
    else if (p == 'f')
    {
        system("pause");
        system("cls");
        Menu();
        exit(0);
    }
}
void  LibraryManager::Deletebook(book** q)//删除图书信息
{
    string m;//需输入的图书的登录号
    book* w; book* ww;
    w = *q;
    cout << "请输入需删除图书的登录号" << endl;
    cin >> m;
    if (w->getbookEntrynumber() == m)//从链表头找到该图书
    {
        cout << "该图书原本信息如下" << endl;
        cout <<"本书编号              本书书籍名称          本书作者姓名              本书分类                 本书出版单位       本书出版时间            本书书籍价格" << endl;
        cout << *w;
        (*q) = (*q)->next;//移动链表头到下一位置
        delete w;//释放原链表头地址
        cout << "该图书信息已删除" << endl;
        Sleep(300);
        system("cls");
        Menu();
        exit(0);
        if (w == NULL)//最终未找到
        {
            cout << "无此图书" << endl;
            Sleep(300);
            Deletebook(q);
            exit(0);
        }
        else 
        {
            cout << "该图书原本信息如下" << endl;//已找到该图书
            cout << "本书编号              本书书籍名称          本书作者姓名              本书分类                 本书出版单位       本书出版时间            本书书籍价格" << endl;
            cout << *w;
            ww->next = w->next;
            delete w;//删除信息
            cout << "该图书信息已删除" << endl;
            Sleep(500);
            system("cls");
            Menu();
            exit(0);
        }
        while (w != NULL)
        {
            if (w->getbookEntrynumber() == m)break;
            else
            {
                ww = w;//锁定目标图书的下一地址
                w = w->next;
            }
        }
        if (w == NULL)
        {
            cout << "查询不到该图书" << endl << "正在返回" << endl;
            Sleep(500);
            Deletebook(q);
            exit(0);
        }
    }
    Sleep(200);
    system("cls");
    Menu();
    exit(0);
}
void  LibraryManager::sortbook(book* q)//按照价格排序(对整个链表进行排序 )
{
    book* p = q, * m = q;
    int Long = 0, i, j;
    char k;
    cout << "1.按价格增长排序2.按价格降序排序" << endl;
    try
    {
        cin >> k;
        if (k < '1' || k>'2') throw - 1;
    }
    catch (int)
    {
        cout << "输入错误,请重新输入" << endl;
        cin >> k;
    }
    while (m != NULL)//链表是否为空
    {
        Long++;//计算链表长度
        m = m->next;
    }
    m = q;
    for (i = 0; i < Long - 1; i++)
    {
        p = m;
        for (j = 0; j < Long - 1; j++)
        {
            if (k == '1') 
            {
                if (p->getbookprice() > p->next->getbookprice())//按价格增长排序
                {
                    p->Exchangebook(p->next);
                }
            }
            if (k == '2') 
            {
                if (p->getbookprice() < p->next->getbookprice())//按价格降序排序
                {
                    p->Exchangebook(p->next);
                }
            }
            p = p->next;
        }
    }
    cout << "图书正在排序中,请稍候" << endl;
    Sleep(200);
    system("cls");
    Menu();
    exit(0);
}
void book::Exchangebook(book* q)//交换书籍参数
{
    string book_Entry_number = this->getbookEntrynumber();
    string book_name = this->getbookname();
    string author_name = this->getauthorname();
    string book_number = this->getbooktype();
    string publish_address = this->getpublishaddress();
    string  publish_time = this->getpublishtime();
    string book_price = this->getbookprice();
    this->bookEntrynumber = q->getbookEntrynumber();
    this->bookname = q->getbookname();
    this->authorname = q->getauthorname();
    this->booktype = q->getbooktype();
    this->publishaddress = q->getpublishaddress();
    this->publishtime = q->getpublishtime();
    this->bookprice = q->getbookprice();
    q->bookEntrynumber = book_Entry_number;
    q->bookname = book_name;
    q->authorname = author_name;
    q->booktype = book_number;
    q->publishaddress = publish_address;
    q->publishtime = publish_time;
    q->bookprice = book_price;
}
int main()
{
    LibraryManager manager;
    manager.Menu();//调用菜单
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_64605223/article/details/122294980