C++购书系统——来自班里某位同学的小学期作业

这是一个购书系统,模拟网上购书的流程。用户可以在这个小程序里输入对应的数字进行浏览书籍信息,查看用户信息,查找书籍,购买书籍以及查询个人订单的操作。

以下为程序代码:

#include <iostream>
using namespace std;
#include<fstream>
#include<stdlib.h>
#include<conio.h>
#include<sstream>
#include<iomanip>
#include<windows.h>
#include<string>
#include"book.h"
#include"buy.h"
#include"search.h"
//#include"strclass.h"
void main()
{
    book gx;
    search cz;
    search yh;
    cout<<"                                            *********************************"<<endl;
    cout<<"                                            **        1.购书人信息         **"<<endl;
    cout<<"                                            **        2.图书信息           **"<<endl;
    cout<<"                                            **        3.图书查找           **"<<endl;
    cout<<"                                            **        4.购书               **"<<endl;
    cout<<"                                            **        5.订单信息           **"<<endl;
    cout<<"                                            *********************************"<<endl;
    int choice;
    cout<<"请输入数字查询:";
    cin>>choice;
    cout<<endl;
    //int i=0,buyerid,flag;
    //book * c[2];
    switch(choice)
    {
    case 1:    
            //cout<<"购书人信息:\n\n";
            yh.searchorder();
        break;
    case 2:
            cout<<"\n图书信息:\n\n";
            gx.display();
        break;
    case 3:
        cout<<"\n\n图书查找:";
            cz.searchorder ();
        break;
    case 4:
        cout<<"购书人编号:";
        //cin>>xs;
        break;
    case 5:
        /*cout<<"\n\n";
        cout<<"\n\t正在退出系统,请稍等";
        cout<<"\n\t\t\t\t\t\t\t\\t\t\t";
        cout<<"\n\t期待您下次光临!";
    for(i=0;i<25;i++)
    {                                 
        switch(i%4)
        {
        case 1:cout<<".";break;
        case 2:cout<<".";break;
        case 3:cout<<".";break;
        case 0:cout<<".";break;
        }
    }
    cout<<endl;
        exit(0);    */
        break;
    }
}
class buyer       //基类
{
protected:
    string name;      //姓名
    int buyerID;      //购书人编号
    string address;   //购书人地址
    double pay;       //购书金额
public:
    buyer();
    buyer(string n,int b,string a,double p);
    string getbuyname();     //取姓名
    string getaddress();     //取地址
    double getpay();     //取应付金额
    int getid();     //取购书人编号
    virtual void display()=0;     //显示函数
    virtual void setpay(double=0)=0;
};
class member:public buyer    //会员类
{
    int leaguer_grade;    //会员级别
public:
    member(string n,int b,int l,string a,double p):buyer(n,b,a,p)
    {leaguer_grade=l;}    //构造函数
    void display();    //显示函数
    void setpay(double p);
};

class honoured_guest:public buyer          //贵宾类    
{
    double discount_rate;          //折扣率
public:
    honoured_guest(string n,int b,double r,string a,double p):buyer(n,b,a,p)
    {
        discount_rate=r;}            //构造函数
    void display();          //显示函数
    void setpay(double p);          //计算购书金额
};

class layfolk:public buyer          //普通人类
{
public:
    layfolk(string n,int b,string a,double p):buyer(n,b,a,p)
    { }          //构造函数
    void display();          //显示函数
    void setpay(double p);           //计算购书金额
};
buyer::buyer()          //基类的构造函数
{
    name=" ";
    buyerID=0;
    address=" ";
    pay=0;
}
buyer::buyer(string n,int b,string a,double p) //基类的构造函数
{
    name=n;
    buyerID=b;
    address=a;
    pay=p;
}
double buyer::getpay()      //取购书金额
{
    return pay;
}
string buyer::getaddress()     //取购书人地址
{
    return address;}
string buyer::getbuyname()     //取购书人名字
{return name;}
int buyer::getid()     //取购书人编号
{return buyerID;}
void member::display()     //会员类的显示函数
{
    cout<<"购书人姓名:"<<name<<"\t";
    cout<<"购书人编号:"<<buyerID<<"\t";
    cout<<"购书人为会员,级别:"<<leaguer_grade<<"\n";
    cout<<"地址:"<<address<<"\n";
}
void member::setpay(double p)     //会员类的计算购书金额
{
    if (leaguer_grade==1)     //会员级别为1
        pay=.95*p+pay;
    else if(leaguer_grade==2)     //会员级别为2
        pay=.90*p+pay;
    else if(leaguer_grade==3)     //会员级别为3
        pay=.85*p+pay;
    else if(leaguer_grade==4)     //会员级别为4
        pay=.8*p+pay;
    else if(leaguer_grade==5)     //会员级别为5
        pay=.7*p+pay;
    else
        cout<<"级别错误!";
}
void honoured_guest::display()          //贵宾类的显示函数
{
    cout<<"购书人姓名:"<<name<<"\t";
    cout<<"购书人编号:"<<buyerID<<"\t";
    cout<<"购书人为贵宾!折扣率为:"<<discount_rate*100<<"%\n";
    cout<<"地址:"<<address<<"\n\n";
}
void honoured_guest::setpay(double p)     //贵宾类计算购书金额
{
    pay=pay+(1-discount_rate)*p;
}
void layfolk::display()      //普通类显示函数
{
    cout<<"购书人姓名:"<<name<<"\t";
    cout<<"购书人编号:"<<buyerID<<"\t";
    cout<<"购书人为普通人"<<"\n";
    cout<<"地址:"<<address<<"\n\n";
}
void layfolk::setpay(double p)      //普通类计算购书金额
{
    pay=pay+p;
}
class search{
public:
    //search();
    int searchorder();
    int search_order(const char *filename,int id);
    void searchd(const char *filename);
};
int search::search_order(const char *filename,int id)
{
    ifstream in;
    in.open("order.txt",ios::in|ios::binary);
    if(!in.is_open())
    {
        cout<<"file open error"<<endl;
        return -1;
    }
    else
    {
        stringstream ss;
        while (in.peek()!=EOF)
        {
            int start=in.tellg();
            string line;
            getline(in,line);
            ss<<line;
            int curID;
            ss>>curID;
            if(curID==id)
            {
                in.close();
                return start;
            }
            ss.str("");
        }
        cout<<"对不起您查找订单编号不存在!"<<endl;
        in.close();
    }
    return -1;
}

void search::searchd(const char *filename)
{
    cout<<"请输入你要查找的订单编号:";
    int id;
    cin>>id;
    int pos=search_order("order.txt",id);
    string line;
    fstream in;
    in.open("order.txt",ios::in|ios::binary);
    in.seekp(pos,ios::beg);
    getline(in,line);
    cout.setf(ios::left);
    cout<<line<<endl;
}
int search::searchorder()
{
    searchd("order.txt");
    return 0;
}
#include"string.h"
class string
{friend ostream& operator<<(ostream& S,const string&Str);         //重载<<
friend istream& operator>>(istream& S, string&Str);         //重载>>
public:
    string();
    string(const string&Str);
    void operator=(const string&Str);         //重载=
    ~string();
    string(char*p);
private:
    short m_Length;         //字符串长度
    char*m_Data;         //字符串开始地址
};
string::string()
{m_Length=1;
m_Data=new char [m_Length];
memcpy(m_Data,"",m_Length);
};
string::string(const string&Str)
{m_Length=Str.m_Length ;
m_Data=new char[m_Length];
memcpy(m_Data,Str.m_Data ,m_Length);
};
string::string(char*p)
{m_Length=strlen(p)+1;
m_Data=new char [m_Length];
memcpy(m_Data,p,m_Length);
};
void string::operator =(const string&Str)
{if(&Str!=this)
{delete []m_Data;
m_Length=Str.m_Length ;
m_Data=new char[m_Length];
memcpy(m_Data,Str.m_Data ,m_Length);
}
return;
};
string::~string ()
{delete []m_Data;
};
ostream& operator<<(ostream& S,const string& Str)
{short i;
for(i=0;i<Str.m_Length -1;i++)
S<<Str.m_Data [i];
return S;
};
istream& operator>>(istream& S,string& Str)
{const short BUFLEN=256;
char Buf[BUFLEN];
if (S.peek()=='\n')
S.ignore ();
S.getline (Buf,BUFLEN,'\n');
Str=Buf;
return S;
};

整体的购书分为5个模块:

总流程图:

购书流程:

输入1进入购书人信息查找,输入其编号,在buyers.txt中查找对应的信息并输出。输入2后,显示book.txt中所有的图书信息。输入3进入图书查找,输入图书编号,在book.txt中查找对应的信息并输出。输入4进入购书界面,选择选择购买方式(普通购买或会员购买或贵宾购买),在buyers.txt中查找对应的购书人信息并输出。再输入购买图书的编号,在book.txt中查找对应的信息并输出。最后输入所选图书单价,根据是普通人或会员或贵宾的优惠方式计算实付金额并输出。将购书人信息、所购图书信息、实付金额存入order.txt中。输入5进入订单查找,输入编号,在order.txt中查找对应的信息并输出。

以下是运行界面截图:

(1)网上购书结账系统界面:

(2)输入1,查找购书人信息。

若输入不在buyers.txt中的用户编号,显示查找的用户信息不存在。(有错误输入处理)

(3)输入2,查看所有图书信息。

(4)输入3,输入图书编号,查找图书信息。

若输入不在book.txt中的图书编号,显示查找的图书不存在。(有错误输入处理)

(5)输入4,进入购书界面。选择购买方式,输入购书人编号及图书编号,进行购书。

一开始运行代码的时候,中文出现了乱码,在慌乱了一下后我请教了度娘也算是顺利的解决了问题。通过读代码,我发现这门课程的知识还学得有些不扎实,遗忘的知识点还挺多的,刚开始有些不知所云。之后,我把代码相应的课程书籍翻开,看到不明白的地方,就翻书重新学习一遍这个知识点。一点一点,如同蚕食桑叶一般把所有代码看完了,整个过程大概花费了近三个小时。相当于又小小的简单复习了一遍C++。代码整体的流程还是很清晰的,有购书人及书本编号输入错误的提示,运行界面简洁易懂,但是不能随意返回,点错了就只能从头开始。在输入2看到所有图书信息后,还需要记下图书编号,再重新运行代码。之后输入4进入购书界面,输入购买人和图书编号才能完成购买。如果浏览完图书信息能直接选择进入购买界面或者返回上一级菜单会更便于操作。通过这次运行代码把所学过的知识重新温故了一边,实在受益匪浅。

C++购书系统的更多相关文章

  1. 亲测可用!在线购书系统项目分享(Java)

    项目简介 项目来源于:https://gitee.com/suimz_admin/BookShop 一个基于JSP+Servlet+Jdbc的书店系统.涉及技术少,易于理解,适合JavaWeb初学者学 ...

  2. JSP+Servlet+C3P0+Mysql实现的简单新闻系统

    项目简介 项目来源于:https://gitee.com/glotion/servlet-jsp_news 本系统基于JSP+Servlet+C3P0+Mysql.涉及技术少,易于理解,适合JavaW ...

  3. JSP+Servlet+JDBC+mysql实现的个人日记本系统

    项目简介 项目来源于:https://gitee.com/wishwzp/Diary 本系统基于JSP+Servlet+Mysql 一个基于JSP+Servlet+Jdbc的个人日记本系统.涉及技术少 ...

  4. Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统

    项目简介 项目来源于:https://gitee.com/sunnyandgood/OnlineMusic 本系统基于Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统.简单 ...

  5. Android学习之路——简易版微信为例(二)

    1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样, ...

  6. Java 实验案例(类和对象篇)

    实验任务 任务一:手机类的封装 任务二:基于控制台的购书系统 任务三:简单的投票程序 实验内容 任务一:手机类的封装 任务目的 理解和掌握面向对象的设计过程 掌握类的结构和定义过程 掌握构造方法及其重 ...

  7. 最全的计算机Java毕业设计题目大全 附 源码

    本文提供数百个计算机毕设题目可以参考 并提供成品源码下载,都是从网上收集而来 源码技术全部采用java+MySQL开发,并结合了其他技术如ssm,ssh,jsp等等. 下载链接在文末! 以下是项目名称 ...

  8. [项目分享]JSP+Servlet+JDBC实现的云端汽修后台管理系统

    本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/chenlinSir/CloudDemo-servlet 难度等级:简单 基于JSP+Servlet+Jdbc的云端 ...

  9. [项目分享]JSP+Servlet+JDBC实现的学生信息管理系统

    本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/liu_xu111/JavaWeb01 这次分享一个学生管理系统,我感觉这是程序员在大学时期的毕设和课程设计选择最多 ...

随机推荐

  1. 【机器学习】--EM算法从初识到应用

    一.前述 Em算法是解决数学公式的一个算法,是一种无监督的学习. EM算法是一种解决存在隐含变量优化问题的有效方法.EM算法是期望极大(Expectation Maximization)算法的简称,E ...

  2. TypeScript 中非代码模块的导入

    需要理解的是,TypeScript 作为语言,他只处理代码模块.其他类型的文件这种非代码模块的导入,讲道理是通过另外的打包工具来完成的,比如 Web 应用中的图片,样式,JSON 还有 HTML 模板 ...

  3. DotNetCore跨平台~EFCore数据上下文的创建方式

    回到目录 对于DotNetCore来说,把大部分组件者放在DI容器里,在startup中进行注入,在类的构造方法中进行使用,如果某些情况下,无法使用这种DI的方式,也可以自己控制数据上下文的生产过程, ...

  4. 滤波器——BoxBlur均值滤波及其快速实现

    个人博客地址:滤波器--BoxBlur均值滤波及其快速实现 动机:卷积核.滤波器.卷积.相关 在数字图像处理的语境里,图像一般是二维或三维的矩阵,卷积核(kernel)和滤波器(filter)通常指代 ...

  5. 教你编写百度搜索广告过滤的chrome插件

    1 前言 目前百度搜索列表首页里,广告5条正常内容是10条,而且广告都是前1到5条的位置,与正常内容的显示样式无异.对于我们这样有能力的开发者,其实可以简单的实现一个chrome插件,在百度搜索页面里 ...

  6. Vue源码解析(一):入口文件

    在学习Vue源码之前,首先要做的一件事情,就是去GitHub上将Vue源码clone下来,目前我这里分析的Vue版本是V2.5.21,下面开始分析: 一.源码的目录结构: Vue的源码都在src目录下 ...

  7. Git开发分支使用与管理规范

    最稳定的代码放在 master 分支上(相当于 SVN 的 trunk 分支),我们不要直接在 master 分支上提交代码,只能在该分支上进行代码合并操作,例如将其它分支的代码合并到 master ...

  8. Windows Server 2008 中iis反向代理设置

    1.安装 IIS(Windows专业版自带,如果是server版系统,需要通过功能管理器安装(无需下载)) urlrewrite插件,https://www.iis.net/downloads/mic ...

  9. 命令模式 Command 行为型 设计模式(十八)

    命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...

  10. 外观模式 门面模式 Facade 结构型 设计模式(十三)

    外观模式(FACADE) 又称为门面模式   意图 为子系统中的一组接口提供一个一致的界面 Facade模式定义了一个高层接口,这一接口使得这一子系统更加易于使用. 意图解析 随着项目的持续发展,系统 ...