首页 > 其他分享 >图书管理系统二次开发

图书管理系统二次开发

时间:2024-03-06 15:22:06浏览次数:22  
标签:cout 管理系统 void next book printf 二次开发 图书 string

图书管理系统
以下为源代码:

include

include

include

using namespace std;
class user; class common; class vip; class honored;
class book
{
protected:
string book_name;
string author;
string publisher;
double price;
book* next;
public:
book() :next(NULL) {};
void addbook(book); //添加书籍
void showbook(book
); //展示书籍
void deletbook(book); //删除书籍
void loadbook(book
);
void savebook(book);
friend user;
};
void book::addbook(book
p)
{
book* p1 = p;
while (p->next != NULL)
{
p = p->next;
}
book* p2 = new book;
cout << "请输入书名:" << endl;
cin >> p2->book_name;
cout << "请输入作者:" << endl;
cin >> p2->author;
cout << "请输入出版社:" << endl;
cin >> p2->publisher;
cout << "请输入价格:" << endl;
cin >> p2->price;
if (cin.fail()) {
cin.clear();
cin.ignore(1000, '\n');
system("cls");
cout << "无效输入!" << endl;
return;
}
p->next = p2;
system("cls");
cout << "添加成功!" << endl;
}
void book::showbook(book* p)
{
if (p->next == NULL)
{
cout << "目前无书籍信息!\t\t" << endl;
return;
}
p = p->next;
int n = 1;
while (1)
{
cout << "NO." << n << ":" << '\t' << endl;
cout << "书名:" << "《" << p->book_name << "》" << '\t';
cout << "作者:" << p->author << '\t';
cout << "出版社:" << p->publisher << '\t';
cout << "价格:" << p->price << '\n';
if (p->next == NULL)break;
p = p->next;
n++;
}
}
void book::deletbook(book* p)
{
if (p->next == NULL)
{
cout << "目前无书籍信息!\t\t" << endl;
return;
}
string na; cout << "请输入要删除的书名:" << endl; cin >> na;
while (1)
{
if (p->next->book_name != na)
{
p = p->next;
if (p->next == NULL)
{
system("cls");
cout << "没有这本书的信息!" << endl << endl;
break;
}
}
else
{
cout << "找到了!" << endl;
cout << "—————————————————————————————————————————————————————————\n";
cout << "书名:" << "《" << p->next->book_name << "》" << '\t';
cout << "作者:" << p->next->author << '\t';
cout << "出版社:" << p->next->publisher << '\t';
cout << "价格:" << p->next->price << '\n';
cout << "—————————————————————————————————————————————————————————\n\n";
cout << "是否删除该书籍信息?" << endl;
cout << "1) 是\t0)否" << endl;
int a; cin >> a;
switch (a)
{
case 0:
{ break; }
case 1:
{
p->next = p->next->next;
system("cls");
cout << "删除成功!" << endl;
break;
}
default:
cout << "ERROR!" << endl;
}
break;
}
}
}
void book::loadbook(book* p)
{
ifstream fin;
fin.open("book.txt", ios::in);
if (!fin)
{
cout << "文件打开失败!" << endl;
exit(1);
}
string name;
while (fin >> name)
{
book* newnode = new book;
newnode->book_name = name;
fin >> newnode->author;
fin >> newnode->publisher;
fin >> newnode->price;
p->next = newnode;
p = p->next;
}
fin.close();
}
void book::savebook(book* p)
{
ofstream fout;
fout.open("book.txt", ios::out);
if (!fout)
{
cout << "文件打开失败!" << endl;
exit(1);
}
while (p->next != NULL)
{
fout << p->next->book_name << "\t";
fout << p->next->author << "\t";
fout << p->next->publisher << "\t";
fout << p->next->price << "\n";
p = p->next;
}
fout.close();
}
class user
{
protected:
string ID; //用户ID
string key; //用户密码
string adress; //用户地址
double pay;
string status; //用户身份
book* list; //购物车
public:
user(string, string, string);
string getID() { return ID; } //取用户ID
string getadress() { return adress; }//取用户地址
string getkey() { return key; } //取用户密码
void main_user(); //用户界面
void main_shop_list(); //购物车管理界面
void showbook(); //显示书籍信息
void addbook(book); //向购物车中添加书籍
void deletebook(book
); //从购物车中删除书籍
void load(book); //从文件读入购物车信息
void save(book
); //向文件输出购物车信息
int signin(string i, string k) //用户登录函数
{
if (i == ID && k == key) return 1;
else return 0;
}
void showbuyer(); //显示用户信息
void sum(book); //购物车结算函数
};
user::user(string I, string k, string ad)
{
ID = I; key = k; adress = ad; status = "user";
list = new book();
}
void user::addbook(book
p)
{
book* p1 = new book;
p1->loadbook(p1);
p1->showbook(p1);
if (p1->next == NULL)
{
cout << "购物车当前为空!" << endl;
return;
}
cout << endl << "请输入要添加的书籍名称:" << endl;
string name; cin >> name;
while (p1->next != NULL)
{
if (p1->next->book_name == name)
{
cout << "找到了!" << endl;
cout << "—————————————————————————————————————————————————————————\n";
cout << "书名:" << "《" << p1->next->book_name << "》" << '\t';
cout << "作者:" << p1->next->author << '\t';
cout << "出版社:" << p1->next->publisher << '\t';
cout << "价格:" << p1->next->price << '\n';
cout << "—————————————————————————————————————————————————————————\n\n";
cout << "是否将此书加入购物车?" << endl;
cout << "1) 是\t0)否" << endl;
int o; cin >> o;
if (o == 1)
{
while (p->next != NULL)
p = p->next;
p->next = p1->next;
p1->next->next = NULL;
system("cls");
cout << "添加成功!" << endl;
break;
}
else if (o == 0)
{
break;
}
else
{
cout << "请输入正确指令!" << endl;
break;
}
}
p1 = p1->next;
}
if (p1->next == NULL)
{
cout << "未找到符合条件的书籍!" << endl;
}
}
void user::deletebook(book* p)
{
if (p->next == NULL)
{
cout << "购物车当前为空!" << endl;
return;
}
cout << endl << "请输入要删除的书籍名称:" << endl;
string name; cin >> name;
int i = 0;
while (p->next != NULL)
{
if (p->next->book_name == name)
{
i++;
cout << "找到了!" << endl;
cout << "—————————————————————————————————————————————————————————\n";
cout << "书名:" << "《" << p->next->book_name << "》" << '\t';
cout << "作者:" << p->next->author << '\t';
cout << "出版社:" << p->next->publisher << '\t';
cout << "价格:" << p->next->price << '\n';
cout << "—————————————————————————————————————————————————————————\n\n";
cout << "是否将此书从购物车中移除?" << endl;
cout << "1) 是\t0)否" << endl;
int o; cin >> o;
if (o == 1)
{
p->next = p->next->next;
system("cls");
cout << "删除成功!" << endl;
break;
}
else if (o == 0)
{
break;
}
else
{
cout << "请输入正确指令!" << endl;
break;
}
}
p = p->next;
}
if (i == 0)
{
cout << "未找到符合条件的书籍!" << endl;
}
}
void user::load(book* p)
{
if (p->next != NULL)p->next = NULL;
string fname = this->ID + ".txt";
ifstream fin;
fin.open(fname, ios::in);
if (!fin)
{
cout << "文件打开失败!" << endl;
exit(1);
}
string name;
book* p1 = new book;
book* p2 = p1;
list->loadbook(p1);
while (fin >> name)
{
book* newnode = new book;
newnode->book_name = name;
fin >> newnode->author;
fin >> newnode->publisher;
fin >> newnode->price;
while (p1->next != NULL)
{
if (p1->next->book_name == newnode->book_name)
{
newnode->author = p1->next->author;
newnode->publisher = p1->next->publisher;
newnode->price = p1->next->price;
break;
}
else p1 = p1->next;
}
if (p1->next != NULL)
{
p->next = newnode;
p = p->next;
p1 = p2;
}
}
fin.close();
}
void user::save(book* p)
{
string fname = this->ID + ".txt";
ofstream fout;
fout.open(fname, ios::out);
if (!fout)
{
cout << "文件打开失败!" << endl;
exit(1);
}
while (p->next != NULL)
{
fout << p->next->book_name << "\t";
fout << p->next->author << "\t";
fout << p->next->publisher << "\t";
fout << p->next->price << "\n";
p = p->next;
}
fout.close();
}
void user::main_user()
{
int o;
while (1)
{
system("cls");
printf("\n\n\n");
printf("\t\t\t\t\t+------------------------------+\n");
printf("\t\t\t\t\t|--------------用户-----------|\n");
printf("\t\t\t\t\t+-------------------------------+\n");
printf("\t\t\t\t\t\t1 查看书籍\n");
printf("\t\t\t\t\t\t2 管理购物车\n");
printf("\t\t\t\t\t\t3 查看个人信息\n");
printf("\t\t\t\t\t\t4 登出\n");
printf("\n\n\n");
printf("\t\t\t\t\t请输入你想实现的功能前的代号:\n");
printf("\t\t\t\t");
cin >> o;
switch (o)
{
case 1:
{
system("cls");
showbook();
break;
}
case 2:
{
main_shop_list();
break;
}
case 3:
{
showbuyer();
break;
}
case 4:
{return; }
default:
{cout << "请输入正确指令!" << endl << endl; }
}
system("pause");
}
}
void user::main_shop_list()
{
this->load(list);
while (1)
{
system("cls");
cout << this->getID() << "的购物车:" << endl << endl;
list->showbook(list);
printf("\n\n\n");
printf("\t\t\t\t\t+-------------DoKiDoKi----------+\n");
printf("\t\t\t\t\t|--------------购物车-----------|\n");
printf("\t\t\t\t\t+-------------------------------+\n");
printf("\t\t\t\t\t\t1 向购物车中添加书籍\n");
printf("\t\t\t\t\t\t2 从购物车中删除书籍\n");
printf("\t\t\t\t\t\t3 结算\n");
printf("\t\t\t\t\t\t4 退出购物车\n");
printf("\n\n\n");
printf("\t\t\t\t\t请输入你想实现的功能前的代号:\n");
printf("\t\t\t\t");
int o;
cin >> o;
switch (o)
{
case 1:
{
addbook(list);
break;
}
case 2:
{
deletebook(list);
break;
}
case 3:
{
sum(list);
break;
}
case 4:
{
save(list);
return;
}
default:
{cout << "指令错误!" << endl; }
}
system("pause");
}
}
void user::showbook()
{
ifstream fin;
fin.open("book.txt", ios::in);
if (!fin)
{
cout << "文件打开失败!" << endl;
exit(1);
}
int i = 0;
while (fin >> list->book_name)
{
cout << "NO." << ++i << endl;
fin >> list->author;
fin >> list->publisher;
fin >> list->price;
cout << "书名:" << "《" << list->book_name << "》" << '\t';
cout << "作者:" << list->author << '\t';
cout << "出版社:" << list->publisher << '\t';
cout << "价格:" << list->price << endl;
}
fin.close();
}
void user::showbuyer()
{
cout << "用户名:" << getID() << endl;
cout << "用户地址:" << getadress() << endl;
cout << "用户身份:" << status << endl;
}
void user::sum(book* p)
{
double pay = 0;
while (p->next != NULL)
{
pay += p->next->price;
p = p->next;
}
cout << "用户 " << this->getID() << " 应付" << pay << "元" << endl;
}
class admin //管理员类
{
private:
string ID;
string key;
string status;
book* list;
public:
string getID() { return ID; } //取管理员ID
string getkey() { return key; } //取管理员密码
admin(string i, string k)
{
ID = i; key = k; status = "ad"; list = new book;
}
int signin()
{
string i, k;
cout << "请输入账号:";
cin >> i;
cout << "请输入密码:";
cin >> k;
if (i == ID && k == key) return 1;
else return 0;
}
void main_ad();
};
void admin::main_ad()
{

list->loadbook(list);
while (1)
{
    system("cls");
    printf("\n\n\n");
    printf("\t\t\t\t\t+------------------------------+\n");
    printf("\t\t\t\t\t|--------------管理员-----------|\n");
    printf("\t\t\t\t\t+-------------------------------+\n");
    printf("\t\t\t\t\t\t1 查看书籍\n");
    printf("\t\t\t\t\t\t2 添加书籍\n");
    printf("\t\t\t\t\t\t3 删除书籍\n");
    printf("\t\t\t\t\t\t4 保存登出\n");
    printf("\n\n\n");
    printf("\t\t\t\t\t请输入你想实现的功能前的代号:\n");
    printf("\t\t\t\t");
    int o;
    cin >> o;
    switch (o)
    {
    case 1:
    {system("cls");
    list->showbook(list);
    break;
    }
    case 2:
    {
        list->addbook(list);
        break;
    }
    case 3:
    {
        list->deletbook(list);
        break;
    }

case 4:
{
list->savebook(list);
return;
}
default:
{ cout << "请输入正确指令!" << endl << endl; }
}
system("pause");
}
}
int main()
{
admin A("admin", "160922");
user B("me", "19170", "中国某省某市某区");
while (1)
{
system("cls");
printf("\n\n\n");
printf("\t\t\t\t\t+-------------------------------+\n");
printf("\t\t\t\t\t|-----------图书购买系统--------|\n");
printf("\t\t\t\t\t+-------------------------------+\n");
printf("\t\t\t\t\t\t1 管理员登录\n");
printf("\t\t\t\t\t\t2 用户登录\n");
printf("\t\t\t\t\t\t3 退出\n");
printf("\n\n\n");
printf("\t\t\t\t\t请输入你想实现的功能前的代号:\n");
printf("\t\t\t\t");
int o;
cin >> o;
switch (o)
{
case 1:
{
if (A.signin() == 1)
{
A.main_ad();
}
else cout << "账号或密码错误" << endl;
break;
}
case 2:
{
string id, k;
cout << "请输入账号:"; cin >> id;
cout << "请输入密码:"; cin >> k;
if (id == "me" && k == "19170")
{
B.main_user();
break;
}
else
cout << "账号或密码错误" << endl;
break;
break;
}
case 3:
{ return 0; }
default:
{ cout << "请输入正确指令!" << endl << endl; }
}
system("pause");
}
}

源程序运行及功能

该图书管理系统的功能包括添加书籍、展示书籍、删除书籍、加载书籍和保存书籍等。系统使用了类的概念,包括了图书类和用户类。

缺陷分析

在阅读源代码时,我发现了一些潜在的缺陷和改进点:

  1. 输入验证不完善:在添加书籍功能中,对于价格的输入没有进行有效的验证,导致用户可以输入非法的价格。
  2. 错误处理不完善:在输入无效数据时,系统没有给出明确的错误提示,而是简单地清屏并输出"无效输入",这对用户来说不够友好。
  3. 文件操作不安全:在加载书籍和保存书籍的功能中,使用了文件操作,但没有进行错误处理和异常处理,可能导致文件打开失败或写入失败的情况。

改进建议

为了改进这些缺陷,我提出以下建议:

  1. 输入验证:在添加书籍功能中,应该对价格进行有效的验证,确保用户输入的价格是合法的数字。
  2. 错误处理:在输入无效数据时,应该给出明确的错误提示,告知用户输入的数据无效,并要求重新输入。
  3. 异常处理:在文件操作中,应该添加适当的异常处理机制,以处理文件打开失败或写入失败的情况,并向用户显示错误信息。

改进过程

在进行二次开发时,我按照上述建议进行了改进。具体的改进过程和代码修改可以在我的博客文章中找到。

结论

通过对图书管理系统的分析和改进,我意识到在软件开发过程中,我们需要关注输入验证、错误处理和异常处理等方面,以提高软件的稳定性和用户体验。

标签:cout,管理系统,void,next,book,printf,二次开发,图书,string
From: https://www.cnblogs.com/keji-tu/p/18056687

相关文章

  • 基于C语言中国象棋项目的二次开发
    这是一个由C语言所编写的中国象棋项目,以下给出原项目的链接、代码、运行截图。原项目链接:https://blog.csdn.net/weixin_45590872/article/details/109308798原C语言代码如下:点击查看代码#include<stdio.h>#include<conio.h>#include<string.h>#include<stdlib.h>#includ......
  • C语言-猜拳游戏二次开发
    引言当探究猜拳游戏的魅力时,人们往往会陶醉于其古老的历史和简单的规则之中。作为一种源远流长的竞技娱乐活动,猜拳游戏早已深入人们的生活,成为一种普遍且愉快的社交互动方式。然而,这看似简单的游戏背后却蕴含了深刻的智慧。在短暂的选择过程中,参与者不仅在思考自己的选择,更需要推......
  • 基于图书购买系统的二次开发
    这是大一学习c++的一位同学的大作业,里面存在着诸多缺点,我对其中的一部分进行了改进,增加了一部分功能,但是还是有一些bug我至今修复不了。这是系统原本的功能。在此基础上我添加了书籍排序,查找书籍和删除书籍的功能,并且对增加书籍进行了修改。首先我先讲讲对增加书籍的修改可......
  • Python实现五子棋人机对战的二次开发
    Python实现人机对战的二次开发    在网上找到了一个使用python实现五子棋游戏,其中通过加入一个简单的AI算法实现了人机对战的功能,我觉得这个人机对战还是蛮有意思的,下面我分析一下五子棋游戏的规则、棋盘表示方法、AI算法的实现原理以及代码实现过程。最后二次开发时引入新的......
  • 基于unity和c#的障碍跑酷游戏的二次开发
    一、设计背景近年来,虚拟现实技术取得了突飞猛进的发展,为游戏行业带来了新的机遇。通过将跑酷游戏与虚拟现实技术相结合,可以为玩家提供更加真实、沉浸式的游戏体验,让玩家仿佛置身于现实世界中的跑酷场景中。现代游戏越来越注重玩家之间的互动和竞技。跑酷游戏可以设置多人在线模......
  • 基于java的彩票选号系统的二次开发
    引言:在网上看到了一个较为简易的基于java的彩票选号系统,其主要通过后台生成中奖号码,用户选择并输入号码的方式进行,界面设计较为的简陋,源代码也只实现了较为基础的功能,并存在一些问题,比如用户输入错误时的逻辑问题;故而我在源代码的基础上进行了一定的界面美化和功能的补全,以下先附......
  • 基于Struts2 MVC的人事管理系统的二次开发
    引言这系统是一个基于JavaWeb开发和Struts2框架的简单用户管理系统。主要功能包括用户的登录、注册、查看用户列表、更新用户信息、以及删除用户等操作。系统使用了MySQL数据库存储用户信息,通过DAO模式实现了数据访问逻辑的分离。通过Struts2框架,实现了前后端的交互,通过XML配置......
  • 自习室管理系统二次开发
    引言自习室是大学中非常重要的地方,自习室学习氛围比较浓,安静得只剩下奋笔疾书和键盘敲击的声音,更加适合需要备考和考研的学生。当学生们在某一时间暂时没课时,也可以到自习室进行短暂的学习。自习室作为面对全体师生都可以活动的场所,完善的自习室管理系统和相应的规章制度尤为重要......
  • 基于c++的排雷小游戏二次开发
    源代码地址https://blog.csdn.net/weixin_45906253/article/details/121237647?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-9-121237647-blog-129464051.235^v43^pc_blog_bottom_relevance_base7&......
  • 基于清晰度优先的安卓图片压缩工具的二次开发小记。
    原程序:https://github.com/lexluthors/CompressTools-Android工具特性:这是和微信压缩效果类似的压缩方式,采用底层压缩。尽量无损压缩图片,保持清晰度最优。可以对比原生方法bitmap.compress(CompressFormat.JPEG,quality,fileOutputStream);占用内存少,支持压缩生成原图分......