#include #include #include #include #include //#include “Book.h” //#include “Admin.h” #define MAXSIZE 10000 using namespace std; //全局变量 string ID_Value; //存储新建账户名 string ID[5]; //存储ID列表 int ID_flag; //存储ID操作序号 fstream file; //文件对象 void MainLoop(); //声明RUNTIME函数 //book.h static int Bcount = 2; static int Jcount = 2; static double TTotal; static int flag = 0; class BookBase { private: string ISBN = "00000000"; string Bname = "默认书籍"; int stock = 0; double price = 0; double total = 0; public: BookBase() {}; BookBase(string is, string nam, int s, double p) { ISBN = is; Bname = nam; stock = s; price = p; } string getISBN() const { return ISBN; } string getName() const { return Bname; } int getStock() const { return stock; } double getPrice() const { return price; } double getTotal() const { return total; } void modISBN(string i) { ISBN = i; } void modName(string n) { Bname = n; } void modStock(int st) { stock = st; } void modPrice(double pr) { price = pr; } void addStock(int s) { stock += s; cout << "库存增加成功!目前库存为:" << getStock() << endl; } void outStock(int s) { if (s <= stock) { stock -= s; cout << "销售成功!目前库存为:" << getStock() << endl; total = s * price; TTotal += total; cout << "销售额为:" << getTotal() << endl; flag = 1; } else { cerr << "库存不足,请检查,目前库存仅有" << getStock() << "。" << endl; return; } } }; //期刊类 class Journal :public BookBase { private: string express; public: Journal() {}; Journal(string is, string nam, int s, double p, string exp) :BookBase(is, nam, s, p) { express = exp; } friend ostream& operator<<(ostream& output, const Journal& j); string getExpress() const { return express; } void modExpress(string ex) { express = ex; } }; //输出流运算符重载 ostream& operator<<(ostream& output, const Journal& j) { cout.setf(ios_base::left); output << j.getISBN() << "\t" << setw(25) << j.getName() << setw(20) << j.getExpress() << setw(15) << j.getPrice() << setw(15) << j.getStock() << endl; return output; } //书籍类 class Book :public BookBase { private: string author; public: Book() {}; Book(string is, string nam, int s, double p, string au) :BookBase(is, nam, s, p) { author = au; } friend ostream& operator<<(ostream& output, const Book& b); string getAuthor() const { return author; } void modAuthor(string au) { author = au; } }; //输出流运算符重载 ostream& operator<<(ostream& output, const Book& b) { cout.setf(ios_base::left); output << b.getISBN() << "\t" << setw(25) << b.getName() << setw(20) << b.getAuthor() << setw(15) << b.getPrice() << setw(15) << b.getStock() << endl; return output; } /* * 以上为书籍相关类及成员函数,以下为管理员类及其成员函数 */ //Admin.h class Admin { private: string ID; public: Admin() {}; string getID() const { return ID; } Admin(string id) { ID = id; cout << this->getID() << ",欢迎您登陆管理系统!所有权限已开启。" << endl; } void changeID(string id) { ID = id; } void AddBook(); void DelBook(); void SearchBook(); void inStock(); void outStock(); void printAll(); void statics(); void modify(); }; //预置书籍类数据 static Book Books[MAXSIZE] = { Book("9787302257646","程序设计基础",190,25,"张三"), Book("9787302219972","单片机技术及应用",182,32,"李四") }; //预置期刊类数据 static Journal Journals[MAXSIZE] = { Journal("9787302257611","电脑爱好者",200,32,"北京大学出版社"), Journal("9787302257622","无线电年刊",190,35,"江西财大出版社") }; //输出所有Journal void JournalsPrint() { cout << "———————— 期刊类 ————————" << endl; cout.setf(ios_base::left); cout << "序号\tISBN\t\t"<> c; if(c=='Y' || c=='y') { ofstream file; file.open("销售额.txt", ios::out); file << "总销售额:" << TTotal << endl; file.close(); cout << "导出成功!" << endl; } cout << "------------------------------------------" << endl; } else { cerr << "无任何销售记录!" << endl; } } //添加新书籍 void NewBook() { string ISBN; string Bname; int stock; double price; string author; cout << "------------------------------------------" << endl; cout << "正在添加新的书籍信息,当前已有书籍数目:" << Bcount << endl; cout << "输入ISBN号:"; cin >> ISBN; cout << "请输入书名:"; cin >> Bname; cout << "请输入库存:"; cin >> stock; cout << "请输入价格:"; cin >> price; cout << "请输入作者名:"; cin >> author; Books[Bcount] = Book(ISBN, Bname, stock, price, author); Bcount++; cout << "添加成功!" << endl; } //添加新期刊 void NewJournal() { string ISBN; string Bname; int stock; double price; string express; cout << "正在添加新的期刊信息,当前已有期刊数目:" << Bcount << endl; cout << "输入ISBN号:"; cin >> ISBN; cout << "请输入期刊名:"; cin >> Bname; cout << "请输入库存:"; cin >> stock; cout << "请输入价格:"; cin >> price; cout << "请输入作者名:"; cin >> express; Journals[Jcount] = Journal(ISBN, Bname, stock, price, express); Jcount++; cout << "添加成功!" << endl; } //增加书刊 void Admin::AddBook() { int select = 1; cout << setw(20) << ">>>>>>>>>>增加书刊<<<<<<<<<<" << endl << setw(20) << "1.书籍类" << endl << setw(20) << "2.期刊类" << endl << setw(20) << "0.退出该操作" << endl; while (select) { cout << "要对哪类进行增加操作(输入0返回主菜单):"; cin >> select; if (select < 0 || select > 2) { cerr << "非法值,请重新输入。" << endl; continue; } else { switch (select) { case 1: NewBook(); continue; case 2: NewJournal(); continue; case 0: break; } } } } //删除书刊 void Admin::DelBook() { string s = "1"; while (1) { cout << "请输入作者名、出版社名、期刊名、书名或ISBN号(输入0返回主菜单):"; cin >> s; if (s == "0") break; //退出判断 int flag = 0; //查找成功状态符 //查找书籍类 for (int i = 0; i < Bcount; i++) if (Books[i].getAuthor() == s || Books[i].getISBN() == s || Books[i].getName() == s) { flag = 1; cout << "发现目标书籍如下,是否删除该书籍信息?(Y 是 / N 否)" << endl << "------------------------" << endl << Books[i] << "------------------------" << endl << "请选择:"; char c; cin >> c; if (c == 'Y' || c == 'y') { for (int j = i; j < Bcount - 1; j++) { Books[j] = Books[j + 1]; } Bcount--; } else continue; } else continue; //查找期刊类 for (int i = 0; i < Jcount; i++) if (Journals[i].getExpress() == s || Journals[i].getISBN() == s || Journals[i].getName() == s) { flag = 1; cout << "发现目标期刊如下,是否删除该期刊信息?(Y 是 / N 否)" << endl << "------------------------" << endl << Journals[i] << "------------------------" << endl << "请选择:"; char c; cin >> c; if (c == 'Y' || c == 'y') { for (int j = i; j < Jcount - 1; j++) { Journals[j] = Journals[j + 1]; } Jcount--; } else continue; } else continue; if (flag)cout << "删除成功!" << endl; else cerr << "未找到目标书籍。" << endl; } } //入库 void Admin::inStock() { int select = 1; cout << setw(20) << ">>>>>>>>>>入库书刊<<<<<<<<<<" << endl << setw(20) << "1.书籍类" << endl << setw(20) << "2.期刊类" << endl << setw(20) << "0.退出该操作" << endl; while (select) { cout << "要对哪类进行入库操作(输入0返回主菜单):"; cin >> select; if (select < 0 || select > 2) { cerr << "非法值,请重新输入。" << endl; continue; } else { switch (select) { case 1: { BooksPrint(); int a, b; cout << "要操作的书籍编号是:"; cin >> a; if (a<1 || a>Bcount) { cerr << "序号错误,请检查。" << endl; break; } cout << "要增加的库存量是:"; cin >> b; Books[a - 1].addStock(b); continue; } case 2: { JournalsPrint(); int a, b; cout << "要操作的期刊编号是:"; cin >> a; if (a<1 || a>Jcount) { cerr << "序号错误,请检查。" << endl; break; } cout << "要增加的库存量是:"; cin >> b; Books[a - 1].addStock(b); continue; } case 0: break; } } } } //修改书籍类 void modifyBook() { int select = 1; BooksPrint(); int a, b; string s; int st; double pr; cout << "要操作的书籍编号是:"; cin >> a; if (a<1 || a>Bcount) { cerr << "序号错误,请检查。" << endl; } else { cout << "1.ISBN\t2.书籍名称\t3.作者\t4.库存量\t5.价格\t0.放弃修改" << endl << "要修改的信息是:"; cin >> b; switch (b) { case 1: cout << "输入修改后的信息:"; cin >> s; Books[a - 1].modISBN(s); cout << Books[a - 1] << "修改成功!" << endl; break; case 2: cout << "输入修改后的信息:"; cin >> s; Books[a - 1].modName(s); cout << Books[a - 1] << "修改成功!" << endl; break; case 3: cout << "输入修改后的信息:"; cin >> s; Books[a - 1].modAuthor(s); cout << Books[a - 1] << "修改成功!" << endl; break; case 4: cout << "输入修改后的信息:"; cin >> st; Books[a - 1].modStock(st); cout << Books[a - 1] << "修改成功!" << endl; break; case 5: cout << "输入修改后的信息:"; cin >> pr; Books[a - 1].modPrice(pr); cout << Books[a - 1] << "修改成功!" << endl; break; case 0: break; } } } //修改期刊类 void modifyJournal() { int select = 1; JournalsPrint(); int a, b; string s; int st; double pr; cout << "要操作的书籍编号是:"; cin >> a; if (a<1 || a>Bcount) { cerr << "序号错误,请检查。" << endl; } else { cout << "1.ISBN\t2.书籍名称\t3.出版社\t4.库存量\t5.价格\t0.放弃修改" << endl << "要修改的信息是:"; cin >> b; switch (b) { case 1: cout << "输入修改后的信息:"; cin >> s; Journals[a - 1].modISBN(s); cout << Journals[a - 1] << "修改成功!" << endl; break; case 2: cout << "输入修改后的信息:"; cin >> s; Journals[a - 1].modName(s); cout << Journals[a - 1] << "修改成功!" << endl; break; case 3: cout << "输入修改后的信息:"; cin >> s; Journals[a - 1].modExpress(s); cout << Journals[a - 1] << "修改成功!" << endl; break; case 4: cout << "输入修改后的信息:"; cin >> st; Journals[a - 1].modStock(st); cout << Journals[a - 1] << "修改成功!" << endl; break; case 5: cout << "输入修改后的信息:"; cin >> pr; Journals[a - 1].modPrice(pr); cout << Journals[a - 1] << "修改成功!" << endl; break; case 0: break; } } } //修改书籍信息 void Admin::modify() { int select = 1; cout << setw(20) << ">>>>>>>>>>修改书刊信息<<<<<<<<<<" << endl << setw(20) << "1.书籍类" << endl << setw(20) << "2.期刊类" << endl << setw(20) << "0.退出该操作" << endl; while (select) { cout << "要对哪类进行修改操作(输入0返回主菜单):"; cin >> select; if (select < 0 || select > 2) { cerr << "非法值,请重新输入。" << endl; continue; } else { switch (select) { case 1: modifyBook(); continue; case 2: modifyJournal(); continue; case 0: break; } } } } //入库 void Admin::outStock() { int select = 1; cout << setw(20) << ">>>>>>>>>>销售书刊<<<<<<<<<<" << endl << setw(20) << "1.书籍类" << endl << setw(20) << "2.期刊类" << endl << setw(20) << "0.退出该操作" << endl; while (select) { cout << "要对哪类进行销售操作(输入0返回主菜单):"; cin >> select; if (select < 0 || select > 2) { cerr << "非法值,请重新输入。" << endl; continue; } else { switch (select) { case 1: { BooksPrint(); int a, b; cout << "要操作的书籍序号是:"; cin >> a; if(a<1 || a>Bcount) { cerr << "序号错误,请检查。" << endl; break; } cout << "销售的库存量是:"; cin >> b; Books[a - 1].outStock(b); continue; } case 2: { JournalsPrint(); int a, b; cout << "要操作的期刊序号是:"; cin >> a; if (a<1 || a>Jcount) { cerr << "序号错误,请检查。" << endl; break; } cout << "要销售的库存量是:"; cin >> b; Books[a - 1].outStock(b); continue; } case 0: break; } } } } //输出所有库存 inline void Admin::printAll() { BooksPrint(); JournalsPrint(); } //输出ID.txt void ID_OUT() { file.open("ID.txt", ios::out); if (!file) { cerr << "未检测到账户列表文件ID.txt!保存失败。" << endl; exit(1); } for (int i = 0; i < 5; i++) file << ID[i] << endl; file.close(); } //读入ID.txt void ID_IN() { file.open("ID.txt", ios::in); if (!file) { cerr << "未检测到预置账户列表文件ID.txt,请查看源代码末端的注释,现已使用默认测试账户登录。" << endl; ID_Value = "超级管理员"; MainLoop(); } for (int i = 0; i < 5; i++) file >> ID[i]; file.close(); } //切换账户 void ID_Switch() { ID_IN(); for (int i = 0; i < 5; i++) cout << i + 1 << "\t" << ID[i] << endl; cout << "请选择要登录的账户:"; cin >> ID_flag; if (ID_flag == 5 && ID[ID_flag-1] == "选此项以新建账户") { string tmp; cout << "请输入新账户的ID:"; cin >> tmp; ID[4] = ID_Value = tmp; cout << "新建账户成功并已写入账户列表!您现在拥有所有权限。" << endl; ID_OUT(); } else if (ID_flag < 1 || ID_flag>5) { cerr << "该账户不存在!程序将退出。" << endl; abort(); } else ID_Value = ID[ID_flag - 1]; cout << "-----------------------------------------------" << endl; } //导出库存信息 void fileOut() { file.open("书籍.txt", ios::out); file<<"ISBN\t\t" << setw(25) << "书名" << setw(20) << "作者" << setw(15) << "价格" << setw(15) << "库存" << endl; for (int i = 0; i < Bcount; i++) file << Books[i]; file.close(); file.open("期刊.txt", ios::out); cout.setf(ios_base::left); file << "ISBN\t\t" << setw(25) << "期刊名" << setw(20) << "出版社" << setw(20) << "价格" << setw(15) << "库存" << endl; for (int i = 0; i < Jcount; i++)file << Journals[i]; cout << "已成功输出为'书籍.txt'与'期刊.txt'" << endl; file.close(); } //欢迎 void MainLoop() { cout << "===============================" << endl << setw(30) << "欢迎使用小型书店进销存管理系统" << endl << "===============================" << endl << "注:该程序仅用于江西财经大学张老师《C++程序设计语言》课程之期末综合性实验报告,作者:刘燕、李溦、钟琳" << endl << "-----------------------------------------------" << endl << "预置账户列表:" << endl; ID_Switch(); MainLoop(); } //运行中函数 void MainLoop() { Admin admin(ID_Value); int select = 1; while (select) { cout << setw(20) << "————————————————" << endl << "当前用户:" << admin.getID() << endl << "1.查看当前库存" << endl << "2.增加书刊信息" << endl << "3.修改书刊信息" << endl << "4.删除书刊信息" << endl << "5.增加书刊库存" << endl << "6.书刊销售系统" << endl << "7.当前财务统计" << endl << "8.更改管理员ID" << endl << "9.切换登录账户" << endl << "10.将库存信息输出至文件" << endl << "0.退出书店系统" << endl << setw(20) << "————————————————" << endl; cout << "请输入操作序号:"; cin >> select; if (select < 0 || select >10) { cerr << "非法值,请重新输入。" << endl; continue; } else { switch (select) { case 1: admin.printAll(); continue; case 2: admin.AddBook(); continue; case 3: admin.modify();continue; case 4: admin.DelBook(); continue; case 5: admin.inStock(); continue; case 6: admin.outStock(); continue; case 7: admin.statics(); continue; case 8: { string id; cout << "输入目标ID:"; cin >> id; admin.changeID(id); ID[ID_flag - 1] = id; cout << "更改成功!当前ID为" << id << endl; ID_OUT(); continue; } case 9: system("cls"); MainLoop(); break; case 10: fileOut(); continue; case 0: break; } } } } //主函数 int main() { MainLoop(); return 0; } /* 本程序使用外部文件实现了预置账户切换功能模块,该文件如下: ** 可将下方附件置于编译完成的exe文件目录中,但由于做了异常处理,缺失文件不会导致程序不可用 ** ID.txt 超级管理员 刘燕 李溦 钟琳 选此项以新建账户 */