archieve-projects/书店-图书-CPP/单文件可编译版源文件.cpp

657 lines
17 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <time.h>
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
//#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"<<setw(25)<<"期刊名"<<setw(20)<<"出版社"<<setw(15)<<"价格"<<setw(15)<<"库存" << endl;
for (int i = 0; i < Jcount; i++) cout << i + 1 << "\t" << Journals[i];
cout << endl;
}
//输出所有Book
void BooksPrint()
{
cout << "———————— 书籍类 ————————" << endl;
cout.setf(ios_base::left);
cout << "序号\tISBN\t\t" << setw(25) << "书名" << setw(20) << "作者" << setw(15) << "价格" << setw(15) << "库存" << endl;
for (int i = 0; i < Bcount; i++) cout << i + 1 << "\t" << Books[i];
cout << endl;
}
void Admin::statics()
{
char c;
if (flag)
{
cout << "------------------------------------------" << endl;
cout << setw(25) << internal << "销售统计" << endl;
cout << "总销售额:" << TTotal << endl;
cout << "是否将销售额导出至文件Y/N"; cin >> 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
超级管理员
刘燕
李溦
钟琳
选此项以新建账户
*/