基于TXT文本的简单图书管理系统

  1
////////////////////////////////////////////////////////////////////////////////////// 2 3 //SqList.h 顺序表数据结构C++类定义(基类) 4 5 ////////////////////////////////////////////////////////////////////////////////////// 6 //#ifndef MYHEAD_H 7 // #define MYHEAD_H 8 // #include"myhead.h" 9 //#endif 10 typedef int Status; 11 #define LIST_MAX_SIZE 10 12 #define LISTINCREMENT 3 //顺序表使用的一些常量说明 13 #define ERROR 0 14 #define OK 1 15 ////////////////////////////////////////////////////////////////////////////////////// 16 #include<assert.h> 17 //顺序表数据结构C++声明(基类) 18 template <typename ElemType> 19 class SqList 20 { 21 public: 22 23 int n; 24 25 int bin_Search(ElemType key); //有序顺序表折半查找 26 27 void clear(); //把顺序表置空 28 29 Status deleteElem(int i, ElemType& e); //删除第i个元素 30 31 Status getElem(int i, ElemType& e); //取第i个元素 32 33 int getLength(); //求顺序表中元素的个数 34 35 int getListSize(); //取顺序表空间的大小 36 37 Status insert(int i, ElemType e); //在第i个元素之前插入一个元素 38 39 bool isEmpty(); //判断顺序表是否置空 40 41 int locateElem(ElemType e, Status(*compare)(ElemType, ElemType)); //查找第1个与e满足compare()关系的元素的序号 42 43 Status nextElem(ElemType e, ElemType& next_e); //返回某元素的后继 44 45 SqList<ElemType> operator =(SqList <ElemType> rightL);//重载赋值运算符的定义 46 47 Status priorElem(ElemType e, ElemType& prior_e);//返回某元素的前驱 48 49 int sequentialSearch(ElemType e);//在顺序表中查找某元素 50 51 52 //******************************系统自动调用构造函数及析构函数声明************************************// 53 54 SqList(); 55 56 virtual ~SqList(); 57 58 SqList(const SqList<ElemType>& otherL); //顺序表拷贝初始化构造函数 59 60 void SqList<ElemType>::input(); 61 62 void SqList<ElemType>::display() const; 63 64 void SqList<ElemType>::randSqList(); 65 66 //**************************求并、交、差集****************************************// 67 68 //求两顺序表的并集 69 void unionSet(SqList <ElemType> firstL, SqList <ElemType> secondL); 70 71 72 protected: 73 ElemType *elem; 74 int listSize; 75 //int n; 76 }; 77 78 /////////////////////////////////////////////////////////////////////////////////// 79 80 //顺序表数据结构C++类的实现 81 82 ////////////////////////////////////////////////////////////////////////////////// 83 84 //折半查找 85 template <typename ElemType> 86 int SqList<ElemType>::bin_Search(ElemType key) 87 { 88 int low, mid, high; 89 low = 0, high = n - 1; 90 while (low <= high) 91 { 92 mid = (low + high) / 2; 93 if (elem[mid] == key) 94 return mid + 1; 95 else if (elem[mid]<key) 96 low = mid + 1; 97 else 98 high = mid - 1; 99 } 100 return 0; 101 } 102 103 //把顺序表置空 104 template <typename ElemType> 105 void SqList<ElemType>::clear() 106 { 107 n = 0; 108 } 109 110 //删除第i个元素 111 template <typename ElemType> 112 Status SqList<ElemType>::deleteElem(int i, ElemType& e) 113 { 114 115 if (i<1 || i>n) return ERROR; 116 e = elem[i - 1]; 117 for (int j = i + 1; j <= n; ++j) 118 elem[j - 2] = elem[j - 1]; 119 --n; 120 return OK; 121 } 122 123 //取第i个元素 124 template <typename ElemType> 125 Status SqList<ElemType>::getElem(int i, ElemType& e) 126 { 127 if (i<1 || i>n) 128 return ERROR; 129 e = elem[i - 1]; 130 return OK; 131 } 132 133 //求顺序表中元素个数 134 template <typename ElemType> 135 int SqList<ElemType>::getLength() 136 { 137 return n; 138 } 139 140 //取顺序表存储空间的大小 141 template <typename ElemType> 142 int SqList<ElemType>::getListSize() 143 { 144 return listSize; 145 } 146 147 //在第i个元素之后插入一个元素 148 template <typename ElemType> 149 Status SqList<ElemType>::insert(int i, ElemType e) 150 { 151 ElemType *newbase; 152 153 if (i<0 || i>n + 1) return ERROR; 154 155 if (n >= listSize) 156 { 157 newbase = new ElemType[listSize + LISTINCREMENT]; 158 assert(newbase != 0); 159 for (int j = 1; j <= n; ++j) 160 newbase[j - 1] = elem[j - 1]; 161 162 delete[] elem; 163 elem = newbase; 164 listSize += LISTINCREMENT; 165 } 166 for (int j = i+1; j+1<n-1; j++) 167 elem[j+1] = elem[j]; 168 elem[i] = e; 169 ++n; 170 return OK; 171 } 172 //判断顺序表是否为空 173 template <typename ElemType> 174 bool SqList<ElemType>::isEmpty() 175 { 176 return n ? false : true; 177 } 178 179 //查找第i个与额满足compare()关系的元素 180 template <typename ElemType> 181 int SqList<ElemType>::locateElem(ElemType e, Status(*compare)(ElemType, ElemType)) 182 { 183 int i = 1; 184 for (i = 1; i <= n && !(*compare)(elem[i - 1], e); ++i); 185 186 if (i <= n) 187 return i; 188 else 189 return 0; 190 } 191 192 //返回某元素的后继 193 template <typename ElemType> 194 Status SqList<ElemType>::nextElem(ElemType e, ElemType& next_e) 195 { 196 int i = locateElem(e, equal); 197 if (i<1 || i == n) 198 return ERROR; 199 else 200 getElem(i + 1, next_e); 201 return OK; 202 } 203 204 //重载赋值运算符的定义 205 template <typename ElemType> 206 SqList<ElemType> SqList<ElemType>::operator=(SqList<ElemType>rightL) 207 { 208 if (this != &rightL) 209 { 210 if (listSize<rightL.listSize) 211 { 212 delete[] elem; 213 elem = new ElemType[rightL.listSize]; 214 assert(elem != 0); 215 listSize = rightL.listSize; 216 } 217 n = rightL.n; 218 for (int i = 1; i <= n; ++i) 219 elem[i - 1] = rightL.elem[i - 1]; 220 } 221 return *this; 222 } 223 224 //返回某元素的前驱 225 template <typename ElemType> 226 Status SqList<ElemType>::priorElem(ElemType e, ElemType& prior_e) 227 { 228 int i = locateElem(e, equal); 229 230 if (i <= 1) 231 return ERROR; 232 else 233 getElem(i - 1, prior_e); 234 return OK; 235 } 236 237 //在顺序表中顺序查找某元素 238 template <typename ElemType> 239 int SqList<ElemType>::sequentialSearch(ElemType key) 240 { 241 for (int i = 1; i <= n; && key != elem[i - 1]; ++i); 242 243 if (i <= n) 244 return i; 245 else 246 return 0; 247 } 248 249 //**************************系统自动调用初始化构造函数****************************// 250 251 //构造函数 252 template <typename ElemType> 253 SqList<ElemType>::SqList() 254 { 255 elem = new ElemType[LIST_MAX_SIZE]; 256 assert(elem != 0); 257 listSize = LIST_MAX_SIZE; 258 n = 0; 259 } 260 261 //顺序表析构函数 262 template <typename ElemType> 263 SqList<ElemType>::~SqList() 264 { 265 delete[] elem; 266 } 267 268 //顺序表初始化构造函数 269 template <typename ElemType> 270 SqList<ElemType>::SqList(const SqList<ElemType>& otherL) 271 { 272 elem = new ElemType[otherL.listSize]; 273 assert(elem != 0); 274 listSize = otherL.listSize; 275 n = otherL.n; 276 for (int i = 1; i <= n; ++i) 277 elem[i - 1] = otherL.elem[i - 1]; 278 } 279 280 ////////////////////////////////////////////////////////////////////////////////////// 281 282 //输入顺序表 283 template <typename ElemType> 284 void SqList<ElemType>::input() 285 { 286 cout << "请输入顺序表元素的个数:"; 287 cin >> n; 288 cout << "请输入顺序表:"; 289 for (int i = 0; i<n; ++i) 290 cin >> elem[i]; 291 } 292 293 294 // 输出顺序表 295 296 template <typename ElemType> 297 void SqList<ElemType>::display() const 298 { 299 cout << "当前顺序表有" << n << "个元素,分别为:" << endl; 300 for (int i = 1; i <= n; ++i) 301 cout << "[" << i << "] "; 302 cout << endl; 303 for (int i = 1; i <= n; ++i) 304 cout << " " << elem[i - 1] << " "; 305 cout << endl; 306 cout << endl; 307 } 308 309 310 //随机生成顺序表 311 312 template <typename ElemType> 313 void SqList<ElemType>::randSqList() 314 { 315 srand((unsigned)time(NULL)); 316 317 cout << "用以下随机数作为当前顺序表的元素:" << endl; 318 319 for (int i = 0; i<listSize; i++) 320 { 321 elem[i] = rand() % 100 + 1; 322 cout << elem[i] << " "; 323 n++; 324 } 325 cout << endl; 326 // cout<<endl<<"输出随机生成的顺序表,"; 327 /*for(int i=1;i<=n;++i) 328 cout<<"["<<i<<"] "; 329 cout<<endl; 330 for(int i=1;i<=n;++i) 331 cout<<" "<<elem[i-1]<<" "; 332 cout<<endl;*/ 333 //display( ); 334 } 335 336 337 //////////////////////////////////////////////////////////////////////////////// 338 339 //功能:判断两整数是否相等 340 //输入:函数的值参a和b为需要比较的两个整数 341 //输出:若a等于b,函数的返回值为OK;否则为ERROR 342 Status equal(int a, int b) 343 { 344 if (a == b) 345 return OK; 346 else 347 return ERROR; 348 } 349 350 //功能:判断一个整数是否大于另一个整数 351 //输入:函数的值参a和b为需要比较的两个整数 352 //输出:若a大于b,函数的返回值为OK;否则为ERROR 353 Status great(int a, int b) 354 { 355 if (a>b) 356 return OK; 357 else 358 return ERROR; 359 } 360 361 //功能:判断一个整数是否小于另一个整数 362 //输入:函数的值参a和b为需要比较的两个整数 363 //输出:若a小于b,函数的返回值为OK;否则为ERROR 364 Status small(int a, int b) 365 { 366 if (a<b) 367 return OK; 368 else 369 return ERROR; 370 } 371 372 ////////////////////////////////////////////////////////////////////////////////////// 373 374 //求两顺序表的并集 375 template <typename ElemType> 376 void SqList <ElemType>::unionSet(SqList <ElemType> firstL, SqList <ElemType> secondL) 377 { 378 ElemType e; 379 SqList <ElemType> thirdL(firstL); 380 381 for (int i = 1; i <= secondL.getLength(); ++i) 382 { 383 cout << thirdL.n << endl; 384 secondL.getElem(i, e); 385 if (!firstL.locateElem(e, equal)) 386 { //++thirdL.n; 387 thirdL.insert(thirdL.n + 1, e); 388 } 389 } 390 thirdL.display(); 391 }
//派生图书信息类
#include"Sqlist.h"
#include<string>
#include <sstream>
#include <strstream>
using namespace std;//用string必带
enum book
{
    children_book,
    learn_book,
    tool_book,
    story_book,
    Science_book
};
struct Book_data
{
    int ID;
    string name;
    double price;
    book type;
    bool borrow;
};
class Dc_wr
{
private:    static int n;
public:
    static bool  Write_dc(string a,string b)//追加
    {
        ofstream f1(b, ios::app);
        if (!f1)
            return false;//打开文件失败则结束运行
        f1 << a << endl;//使用插入运算符写文件内容
        f1.close();//关闭文件
        n++;
        return true;
    }
    static bool  Write_fg(string a, string b)//覆盖
    {
        ofstream f1(b);
        if (!f1)
            return false;//打开文件失败则结束运行
        f1 << a << endl;//使用插入运算符写文件内容
        f1.close();//关闭文件
        n++;
        return true;
    }
    static bool  Read_dc(string &a,string b)
    {
        ifstream f1(b);
        if (!f1)
        {
            f1.close();
            return false;
        }
        f1 >> a;
        f1.close();
        return true;
    }
    static bool  Read_zline(string &a, int b,string c)
    {
        ifstream f1(c);
        if ((!f1) && b <= n)
        {
            f1.close();
            return false;
        }
        for (int i = 1; i <= b; i++)
            f1 >> a;
        f1.close();
        return true;

    }
    static bool Read_star(string &a, int b)//程序开始时取出文本指定行数据返回字符串
    {
        string c;//接受不要的行字符串
        ifstream f1("library.txt");
        for (int i = 1; i <= b; i++)
        {
            if (i == b)
            {
                f1 >> c;
                if (c != "")
                {
                    a = c;
                    f1.close();
                    return true;
                }
                else
                {
                    f1.close();
                    return false;
                }
            }
            f1 >> c;
            if (c == "")
            {
                f1.close();
                return false;
            }
        }
        f1.close();
        return false;
    }
    static bool Del(int b)
    {
        string a;
        ofstream f2("library(复本).txt", ios::app);
        if (!f2)
            return false;
        ifstream f1("library.txt");
        if (!f1)
            return false;
        for (int i=0; ;i++)
        {
            f1 >> a;
            if (i == b)
                continue;
            if (a == "#")
            {
                f2 << a;
                break;
            }
            f2 << a;
        }
        f2.close();
        f1.close();
        ofstream f3("library.txt", ios::trunc);
        ifstream f4("library.txt(复本).txt");
        for (;;)
        {
            f4 >> a;
            f3 << a;
            if (a == "#")
                break;
        }
    
    }
    static bool  txt_to_txt(string b, string c, bool s)//用b覆盖c 清空b s为假添加#结束标记
    {
        string a;
        ofstream f2(c, ios::trunc);//of写  if读  ios::trunc清空原文本后打开
        ifstream f1(b);
        for (;;)
        {
            f1 >> a;
            if (a == "#")//遇到结束标记则关闭
                break;
            if (a == "")//读出字符串为空则关闭
                break;
            a = a + '
';//换行
            f2 << a;
        }
        f2.close();
        if (!s)//根据参数判断是否给予结束标记
        {
            Dc_wr::Write_dc("#", c);
        }
        return true;
    }

};
class Book_in :public  SqList<Book_data>
{
public:
    ~Book_in()
    {

        Class_totxt();
        Dc_wr::Write_dc("#", "library(复本).txt");//加上结束标记方便下一次程序对文本读取
    }
    int Find_book(int ID);
    int Find_book(string name);
    bool Add_book(Book_data e,bool a);
    string Record_tostring(Book_data e);
    void  txt_toclass();
    void  Out_book(int i);
    void  Borrow_book();
    void Class_totxt();
    void Return_book();
    void Change_book();
};


bool Book_in::Add_book(Book_data e, bool a)//把e添加到类  如果a为真则添加到存本
{
    if (a)
    {
        string record = Record_tostring(e);
        Dc_wr::Write_dc(record, "library.txt");
        cout << record << "添加到文本成功" << endl;
    }
    string record = Record_tostring(e);
    if (insert(n, e))
    {
        cout << record << "填加到class成功" << endl;
        return true;
    }
    else
        return false;
}
string Book_in::Record_tostring(Book_data e)
{
    string chge;
    strstream change;
    string record = "";
    change << e.ID;
    change >> chge;
    record = record + chge + "|" + e.name;
    strstream change3;
    change3 <<e.price;
    change3 >> chge;
    record = record + "|" + chge;
    switch (e.type)
    {
    case children_book:record = record + "|" + "1"; break;
    case learn_book:record = record + "|" + "2"; break;
    case tool_book:record = record + "|" + "3"; break;
    case story_book:record = record + "|" + "4"; break;
    case Science_book:record = record + "|" + "5"; break;
    default:
        break;
    };
    if (e.borrow)
    record = record + "|" + "1"; 
    else
    record = record + "|" + "2";
    return record;
}
void Book_in::txt_toclass()
{
    int x, y;
    Book_data e;//把分割好的字符串转化为相应的类型赋值成为一个Bool_data类型
    for (int p=1;;p++)//p控制接受输出字符串的数组
    {
        int i = 0;
        string a;
        string data[5];
        Book_data check;
        if (!Dc_wr::Read_star(a, p))
            return;
        //if (a == "#")
        //    return;
        for each (char b in a)//利用for each取出字符串存放在数组
        {
            if (i == 5)//1个Book_data中有5值
                break;
            if (b != '|')
            {
                data[i] = data[i] + b;
            }
            else
            {
                i++;
            }
        }
        //对应的数据类型转换
        stringstream f1;
        f1 << data[0];
        f1 >> e.ID;

        e.name = data[1];


        stringstream f2;
        f2 << data[2];
        f2 >> e.price;

        stringstream f3;
        f3 << data[3];
        f3 >> x;
        switch (x)
        {
        case 1: e.type = children_book; break;
        case 2: e.type = learn_book; break;
        case 3: e.type = tool_book; break;
        case 4: e.type = story_book; break;
        case 5: e.type = Science_book; break;
        default:
            break;
        }

        stringstream f4;
        f4 << data[4];
        f4 >> y;
        switch (y)
        {
        case 1: e.borrow = true; break;
        case 2: e.borrow = false; break;
        default:
            break;
        }
        //对应的数据类型转换
        if (check.ID == e.ID)
            return;
       Add_book(e, false);//把Book_data 填加到类
       check = e;
    }
}
void Book_in::Out_book(int i)
{
        cout << elem[i].ID << "   " << elem[i].name << "   " << elem[i].price << "   ";
        switch (elem[i].type)
        {
        case children_book:cout << "儿童类" << "      "; break;
        case learn_book:cout << "学习类" << "       "; break;
        case tool_book:cout << "工具类" << "      "; break;
        case story_book:cout << "小说类" << "      "; break;
        case Science_book:cout << "科学类" << "      "; break;
        default:
            break;
        };
        if (elem[i].borrow)
            cout << "被借阅" << endl;
        else
            cout << "未被借阅" << endl;
}
int Book_in::Find_book(int ID)
{
    for (int i = 0; i <=n - 1;i++)
    {
        if (elem[i].ID == ID)
        {
            Out_book(i);
            return i;
        }
    }
    cout << "没有找到相关书籍" << endl;
    return -1;
}
int Book_in::Find_book(string name)
{
    for (int i = 0; i <= n - 1; i++)
    {
        if (elem[i].name == name)
        {
            Out_book(i);
            return i;
        }
    }
    cout << "没有找到相关书籍" << endl;
    return -1;
}
void Book_in::Borrow_book()
{
    int ID;
    int i;
    char t;
    p:
    cout << "请输入书籍ID" << endl;
    cin >> ID;
    i = Find_book(ID);
    if (i+1)
    {
        if (!elem[i].borrow)
        {
            cout << "该书现在可以借出" << endl;
            cout << "是否借书?(y or anykey)" << endl;
            cin >> t;
            if (t == 'y')
                elem[i].borrow = true;
            cout << "OK" << endl;
        }
        else
            cout << "该书现在已经被借走" << endl;
    }
    else
    {
        cout << "没有找到请重新输入" << endl;
        goto   p;
    }
}
void Book_in::Class_totxt()
{
    Book_data e;
    string a;
    for (int i = 1; i <= n; i++)
    {
        getElem(i, e);
        a=Record_tostring(e);
        if (i == 1)
            Dc_wr ::Write_fg(a, "library(复本).txt");//第一行覆盖原文本
        else
            Dc_wr ::Write_dc(a, "library(复本).txt");//追加
    }
}
void Book_in::Return_book()
{
    int ID;
    int i;
    cout << "请输入书籍ID" << endl;
    cin >> ID;
    i = Find_book(ID);
    if (i + 1)
    {
        elem[i].borrow = false;
        cout << "已完成还书!" << endl;
    }
}
void Book_in::Change_book()
{
    int ID;
    int change;
    int i;
    cout << "请你输入你要修改书的ID" << endl;
    cin >> ID;
    i = Find_book(ID);
    if (i + 1)
    {
        cout << "找到图书!" << endl;
    }
    else
    {
        cout << "未找到图书" << endl;
        return;
    }
    cout << "请输入要修改的项:"<<"1.ID" << "    2.书名"<< "   3.价格"<< "   4.书类"<< "   5.是否被借阅"<<"6.删除整个书的信息"<< endl;
    cin >> change;
    switch (change)
    {
    case 1:
    {
        int a;
        cout << "请输入你要改的ID" << endl;
        cin >> a;
        elem[i].ID = a;
        cout << "修改成功!" << endl;
    }; break;
    case 2:
    {
        string a;
        cout << "请输入你要改的书名" << endl;
        cin >> a;
        elem[i].name = a;
        cout << "修改成功!" << endl;
    }; break;
    case 3:
    {
        int a;
        cout << "请输入你要改的价格" << endl;
        cin >> a;
        elem[i].price = a;
        cout << "修改成功!" << endl;
    }; break;
    case 4:
    {
        int a;
        string  c[] = { "儿童类", "学习类", "工具类", "小说类", "科学类" };
        cout << "请输入你要修改的书的类别(1." << c[0] << "   2." << c[1] << "   3." << c[2] << "   4." << c[3] << "   5." << c[4] << endl;
        cin >> a;
        switch (a)
        {
        case 1: elem[i].type = children_book; break;
        case 2: elem[i].type = learn_book; break;
        case 3: elem[i].type = tool_book; break;
        case 4: elem[i].type = story_book; break;
        case 5: elem[i].type = Science_book; break;
        default:
            break;
        }
        cout << "修改成功!" << endl;
    }; break;
    case 5:
    {
        if (elem[i].borrow)
            elem[i].borrow = false;
        else
            elem[i].borrow = true;
        cout << "修改成功!" << endl;
    }
    case 6:
    {
        Book_data a;
        deleteElem(i+1, a);
        cout << "修改成功!" << endl;
    }
    default:
        break;
    }
}
//mian  
#include<iostream>
#include<fstream>
//#include"Query_sequence.h"
#include"Book_information.h"
using namespace std;
int Dc_wr::n = 0;
int Menu()
{
    int choice;
    system("cls");
    cout << "****************************************************图书管理系统****************************************************" << endl;
    //cout << "①⑧⑨⑩" << endl;
    cout << "▓ ①增加图书                                                                                                      ▓" << endl;
    cout << "▓ ②查看现有图书                                                                                                  ▓" << endl;
    cout << "▓ ③借书                                                                                                          ▓" << endl;
    cout << "▓ ④还书                                                                                                          ▓" << endl;
    cout << "▓ ⑤修改图书                                                                                                      ▓" << endl;
    cout << "▓ ⑥查找书籍                                                                                                      ▓" << endl;
    cout << "****************************************************图书管理系统****************************************************" << endl;
    cout << "请选择:";
    cin >> choice;
    return choice;
}
void Add(Book_in& library)
{
    Book_data a;
    //Book_data b;
    //Book_data c;
    book type;
    int  b;
    string o;
    string  c[] = { "儿童类", "学习类", "工具类", "小说类", "科学类" };
    cout << "请输入ID" << endl;
    cin >> a.ID;
    cout << "请输入书名" << endl;
    cin >> a.name;
    cout << "请输入书的价格" << endl;
    cin >> a.price;
book_type_xuanz:
    cout << "请输入数的类别(1." << c[0] << "   2." << c[1] << "   3." << c[2] << "   4." << c[3] << "   5." << c[4] << endl;
    cin >> b;
    switch (b)
    {
    case 1: a.type = children_book; break;
    case 2: a.type = learn_book; break;
    case 3: a.type = tool_book; break;
    case 4: a.type = story_book; break;
    case 5: a.type = Science_book; break;
    default:cout << "选择错误!请重新选择" << endl; goto book_type_xuanz;
    };
    getchar();
    cout << "书是否被借出(n OR y)" << endl;
    cin >> o;
    if (o == "n")
        a.borrow = false;
    else
        a.borrow = true;
    library.Add_book(a, true);
    //a.ID = 1;
    //a.borrow = false;
    //a.name = "first";
    //a.price = 12;
    //a.type = tool_book;
    //b.ID = 2;
    //b.borrow = false;
    //b.name = "scend";
    //b.price = 13;
    //b.type = learn_book;
    //c.ID = 3;
    //c.borrow = true;
    //c.name = "third";
    //c.price = 14;
    //c.type = story_book;
    //library.Add_book(a,true);
    //library.Add_book(b,true);
    //library.Add_book(c,true);
}
int main()
{
    Book_in library;//一个图书类
    int choice;//用户菜单选择
    Book_data h;
    Dc_wr::txt_to_txt("library(复本).txt", "library.txt",true);//以复本覆盖存本
    library.txt_toclass();//根据存本提出字符串转化为类
    start:
    choice=Menu();
    switch (choice)
    {
    case 1:
    {
        for (char m = 'y'; m != 'n';)
        {
            Add(library);
            getchar();
            cout << "是否继续添加?(n OR y)" << endl;
                m=getchar();
        }

    }
        break;
    case 2:
    {
        if (library.n == 0)
        {
            cout << "" << endl;
        }
        cout << "ID" << "     " << "书名" << "    " << "价格" << "   " << "类型" << "       " << "是否被借阅" << endl;
        for (int i = 0; i <=library.n - 1; i++)
              library.Out_book(i); 
    }; break;
    case 3:
    {
        library.Borrow_book();
    }
        ; break;
    case 4:
    {
        library.Return_book();
    }
        ; break;
    case 5:
    {
        library.Change_book();
    }
        ; break;
    case 6:
    {
        int p;
        int ID;
        string name;
        cout << "通过ID查找输入1 通过书名查找输入2" << endl;
        cin >> p;
        if (p == 1)
        {
            cout << "请输入ID" << endl;
            cin >> ID;
            cout << "相关信息" << endl;
            library.Find_book(ID);
        }
        else
        {
            cout << "请输入书名" << endl;
            cin >> name;
            cout << "相关信息" << endl;
            library.Find_book(name);
        }

    }
    default:
        break;
    };
    char k;
    cout << "是否继续选择?(anykey or y)" << endl;
    cin >> k;
    if (k == 'y')
        goto start;
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/cyh1282656849/p/5644060.html