《C++项目实训指导书.docx》由会员分享,可在线阅读,更多相关《C++项目实训指导书.docx(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、中小企业桌面应用系统开发实训指导书工程一 饮料自动贩卖机模拟程序一、工程需求1. 工程描述本工程模拟饮料自动售卖机的销售过程。顾客首先进展投币,机器显示投币金额。接下 来顾客选择要购置的饮料,假设投币金额足够并且所购饮料存在,则提示用户在出口处取走 饮料,同时找零。假设投币金额缺乏,显示提示信息。假设所购饮料已经售完,显示售完信息。2. 效果图33. 功能说明图 1-1 饮料自动贩卖机工程效果图(1) 只承受 10 元、5 元、2 元、1 元和 0.5 元的纸币和硬币。(2) 顾客一次只能投入上述一种金额的纸币或硬币,当用户重复投入时货币金额累加。(3) 销售的饮料包括5 种:可口可乐2 元、
2、百事可乐2 元、橙汁3 元、咖啡5 元、纯洁水1.5 元。(4) 系统通过必要的提示信息,提示用户完成相应的操作。(5) 假设顾客所购置的饮料已经售完,则进展提示并询问用户是否购置其它的饮料。(6) 完成一次售卖后,系统自动进展结算找零。二、工程分析依据系统功能要求,首先设计处理钱币的类和商品信息类。处理钱币的类主要完成与钱币相关的工作,如给顾客找零等过程。商品信息类主要用来处理与商品相关的工作,如获得商品信息等操作。还需要设计一个自动贩卖机类来实现饮料的售卖过程。在这个类里面,将钱币类和商品信息类作为其数据成员。同时定义了包含 5 个 GoodsInfo 对象的数组,负责保存饮料的三个信息:
3、名称、价格和库存量,并且可以反响这些信息。工程需要用到类与类之间的一种关系:has-a 拥有关系,has-a 关系是指一个对象包含另一个对象,即一个对象是另一个对象的成员。三、工程设计1. 类的设计依据上述的设计思想,设计了 “MoneyCounter 类”、“GoodsInfo 类”和“DrinkMachine 类”3 个类。(1) MoneyCounter 类的设计图 1-2MoneyCounter 类图数据成员float input_money;用于记录顾客投币金额函数成员MoneyCounter;构造函数,初始化顾客投币金额为 0.00MoneyCounter 析构函数void get
4、money;提示顾客投币float money_from_buyer;返回投币金额void clear;清空,预备下一轮投币void return_money(float);返回找的零钱(2) GoodsInfo 类的设计图 1-3GoodsInfo 类图数据成员string name ;用于记录饮料名称float price;用于记录饮料的单价inttotal;用于记录饮料的总库存数函数成员GoodsInfo;构造函数,初始化饮料信息GoodsInfo 析构函数void set_goods(string, float, int);设置每种饮料的属性:名称,价格,数量string goods_
5、name; 返回饮料的名称float goods_price;返回饮料的价格int goods_number;返回饮料的数量(3) DrinkMachine 类的设计图 1-4DrinkMachine 类图数据成员MoneyCounter moneyctr;定义 MoneyCounter 的对象,实现投币、找零等功能GoodsInfo v_goods5;定义 GoodsInfo 的对象,实现商品信息的维护,此处设计了5 种饮料,详见该类的实现函数成员DrinkMachine;构造函数,初始化自动售货机中的商品信息DrinkMachine析构函数void showchoices;显示饮料选择信息
6、void inputmoney;猎取顾客投入钱币bool goodsitem(int);检查饮料状况void return_allmoney;返回钱数2. 主程序设计在主函数中,首先定义了一个DrinkMachine 类自动售货机类的对象dri,并未显式地定义 MoneyCounter 类和 GoodsInfo 类的对象。但是在DrinkMachine 类中含有MoneyCounter 类和 GoodsInfo 类的数据成员。其次设计一个两重循环,外循环的持续条件是顾客连续购置,内循环的持续条件是顾客连续重复投币,即顾客可以反复投币直至投够为止。当顾客购置成功或不再连续购置时流程中止。程序流程
7、图如图 1-5 所示。图 1-5 程序流程图工程二 超市收银系统模拟一、工程需求1. 工程描述模拟“美特好”超市购物过程,依据货物清单,选定所购货物种类和数量,实现收银结账。2. 效果图效果图如图 2-1 所示。图 2-1 超市收银系统效果图3. 功能说明(1) 显示超市库存商品信息。(2) 显示购物流程提示信息。(3) 实现购物过程,反复输入所购各种商品的索引和购置数量,直到商品索引号输入”-1” 完毕购物流程。(4) 实现收银,依据顾客所交现金,自动找零。二、工程分析在本工程中,超市收银系统应具备四大根本功能:商品治理、货架治理、购物篮治理和收银治理。货架治理实现库中某种商品的入库、出库、
8、查询及显示等功能。需要建立一个货架类, 通过调用相应的函数来实现。每种商品有单价、条形码、商品名称等属性。商品治理类实现了设置、猎取商品信息, 复制商品信息等功能。购物篮治理就是一个小型的货架治理,可以用货架类来实现。收银实现商品的结账、找零等任务。需要建立一个收银台类,通过调用相应的函数来实现。其中,需要留意以下一些问题:从货架拿货时,应当把商品拿一局部出去,通过把商品“复制”一份出去来实现。“货架”上有形形色色的商品,因此,这个类需要向量这个容器来容纳这些商品。向量中仅存储商品对象是不够的,由于商品没有量的概念,到底容器中包含多少件此类商品还需要 用另外一个变量来表示,通过把商品对象和商品
9、数量集成到一个构造体中来实现。如何构建购物篮对象?认真想一下,“购物篮”就是一个小型的货架,因此可以用“货架” 类模拟一个购物篮。三、工程设计1. 类的设计依据上述的设计思想,设计了“商品类”、“货架类”和“收银台类”3 个类,这3 个类的声明局部在“counter.h”中实现,3 个类的成员函数的实现局部在文件“counter.cpp”中完成。其中商品类CGoods 类负责完成商品信息的存储、猎取、复制等,货架类CStore 类负责完成库中商品的入库、出库、查询及显示等。收银台类CCounter 类负责完成商品的结账、找零等任务。另外在counter.h 文件中还定义了一个表示货架商品对象的
10、构造SStoreElement,它有两个成员,一个是商品对象的指针,一个是此类商品的数目。货架中的每个商品都是这个构造类型的。(1) CGoods 类商品类的设计图 2-2 CGoods 类的构造数据成员intm_iIndex用于记录商品索引,作用类似于条形码。stringm_strName用于记录商品名称。doublem_dUnitPrice用于记录商品单价。函数成员CGoods( int iIndex, string strName, double dUnitPrice )构造函数,用来建立一个商品, 建立商品时给出商品索引、商品名及单价。virtual CGoods(void)析构函数,
11、用来进展清理工作。stringGetName(void) const猎取商品名称。intGetIndex(void) const猎取商品索引。doubleGetUnitPrice(void) const猎取商品单价。 voidSetUnitPrice(double dUnitPrice)设置商品单价。CGoods *Clone复制本类商品,但初始商品数目为 0。(2) 构造体tagStoreElement/货架元素数据类型typedefstructtagStoreElementCGoods *pGoods;/商品指针intiNum;/记录商品数量StoreElement, *pStoreEle
12、ment;图 2-3 构造体tagStoreElement(3) CStore 类货架类的设计图 2-4 CStore 类的构造数据成员vector m_vStore用于存储顾客所选商品的向量。函数成员CStore构造函数,用来进展初始化工作。virtual CStore析构函数,在此调用成员函数DeleteAllGoods删除货架中全部的商 品。bool AddGoods(CGoods *pGoods, int iNum)该成员函数用来向货架增加商品,假设货架中已经有了同类商品,那么只增加此类商品的数目。其中,pGoods欲增加的商品对象, iNum增加的数量。返回值:true成功, fal
13、se失败。intQueryGoods(const string &strName)该成员函数是重载函数,用来查询商品。其中,strName要查询的商品的名字。返回值:商品数量。intQueryGoods(int iIndex)该成员函数是重载函数,用来查询商品。其中,iIndex 要查询的商品的索引号。返回值:商品数量。int DeleteGoods(const string &strName, int iNum) 该成员函数是重载函数,用来删除商品。其中,strName商品名字,iNum删除数目,-1 为全部删除。返回值:剩余商品数量。int DeleteGoods(int iIndex,
14、int iNum) 该成员函数是重载函数,用来删除商品。其中,iIndex商品索引号,iNum删除数目,-1 为全部删除。返回值:剩余商品数量。void DeleteAllGoods(void)该成员函数用来删除购物篮中的全部商品。vector* GetAllGoods(void)该成员函数用来猎取货架的全部商品。返回值:全部商品信息组成的向量。pStoreElement GetGoods(int iIndex) 该成员函数是重载函数,用来猎取某种商品。其中, iIndex商品索引号。返回值:假设货架存在此类商品,则返回此类商品的存储元素指针, 否则返回NULL。pStoreElement G
15、etGoods(const string &strName) 该成员函数是重载函数,用来猎取某种商品。其中,strName商品名称。 返回值:假设货架存在此类商品,则返回此类商品的存储元素指针,否则返回NULL。void Print 该成员函数用来打印货架全部货物清单,包括商品索引号、商品名、数量及单价。(4) CCounter 类收银台类的设计图 2-5 CCounter 类的构造数据成员CStore *m_pBasket定义购物篮指针m_pBasket。doublem_dCash记录共收取现金数额。函数成员CCounter(CStore *pBasket)构造函数,用来进展初始化工作,设置
16、购物篮指针和购物篮商品金额,初始金额为 0.0。virtual CCounter(void)析构函数,用来进展清理工作。double Bill(void)该成员函数用来计算购物篮中商品金额。返回值:购物篮中商品金额。double Count(double dCash) 该成员函数用来收钱找零。其中,dCash顾客所交现金。返回值:给顾客的找零。double GetCash 该成员函数用来返回共收取顾客的现金金额。返回值:收取顾客的现金金额。2. 主程序设计(1) 函数设计CStore* PrepareStore该函数用于最初“进货”,即往货架存入一批商品,包括这些商品的商品索引、商品名称、数量
17、及单价,即创立一个商店。返回值:CStore *pStore 为Cstore 类的指针,代表一个货架。void usage该函数用为用户显示操作提示,即告知“客人”超市购物的购物流程。返回值:无(2) 主函数设计在 main函数中,首先分别对三个类定义一个超市、一个购物篮和一个收银台对象, 然后定义了一个顾客交钱的变量,并初始化为 0。利用上诉类的其它成员函数来实现购物过程。具体流程如图 3-6。图 2-6 主程序调用流程图7工程三 工资个人所得税计算器一、工程需求1. 工程描述从 2023 年 1 月 1 日起,工资个人所得税标准从 1600 元起征。对每月收入超过 3000 元以上的局部征
18、税,适用5%至 45%的 9 级超额累进税率。即:计税金额=每月工资3000 元,个人所得税计税金额税率速算扣除数。税率表如表 3-1 所示。试开发个人所得税计算器。本月应纳税所得额表 3-1税率表税率速算扣除数(元)不超过 1500 元3%0超过 1500 元至 4500 元10%105超过 4500 元至 9000 元20%555超过 9000 元至 35000 元25%1005超过 35000 元至 55000 元30%2755超过 55000 元至 80000 元35%5505超过 80000 元45%135052. 效果图103. 功能说明图 3-1 效果图定义一个对话框对输入的个人
19、工资,计算所得税。二、工程分析依据工程需求,需要利用 MFC 环境定义一个菜单;一个输入对话框类,供给个人月收入的输入界面;另外定义一个PayTax 类,在PayTax 类中定义了数据成员:个人月收入和个人所得税,定义了成员函数:税率计算函数。最终在对话框上输出了相应的缴纳税额。三、工程设计1. 类的设计基于上述分析,本工程需要设计一个类PayTax。图 3-2PayTax 类图数据成员double income;工资月收入。double output;个人所得税。函数成员PayTax(double money);带参构造函数。double calculate;计算个人所得税。在类视图Clas
20、s View 上选中Example2 classes 点击右键选择New Class,弹出New Class 对话框,在Class type 中选择一般类Generic Class,在 Class Information 的Name 单项选择框中输入类名PayTax,点击OK 按钮,如图 4-3 所示。图 3-3 创立PayTax 类完成后在类视图Class View 中消灭类PayTax。在文件视图的Header Files 下找到PayTax.h 文件双击翻开,其中已经消灭该类的声明,添加成员函数calculate,修改构造函数PayTax 的声明,添加变量成员income,output
21、的声明。在文件视图的Source Files 下找到PayTax.cpp 文件双击翻开,可以看到构造函数和析构函数的定义已经存在,在其下添加成员函数 calculate的定义和修改构造函数 PayTax 的定义。2. 对话框设计在资源视图Resource View 上选择Dialog,点击右键,选择Insert Dialog,在对话框内添加静态文本Static Text 和编辑框Edit Box 控件并修改属性,上面的Edit 控件的ID 为IDC_EDIT1,下面的 Edit 控件的ID 为 IDC_EDIT2,而且由于 IDC_EDIT2 控件用于个人所得税的输出,所以设计其属性中的Bor
22、der 为 False,Read-only 为 True,如图 3-4 所示。对话框的设计结果如图 3-5 所示。图 3-4对 话 框 IDC_EDIT2属 性 的 修改图 3-5 对话框设计结果双击对话框弹出Add Class 对话框,保持默认值添加一个类Creat a new class ,点击 OK 按钮。在图 3-6 所示对话框中填写对话框类名inputdlg,点击确定。图 3-6 创立对话框类在 View 菜单下选择MFCClass Wizard 菜单项,切换到Member Variable 标签页。修改成员变量的名称和类型。其中IDC_EDIT1 的成员变量名为m_income,类
23、型为double, 代表个人收入;IDC_EDIT2 的成员变量名为m_output,类型为double,代表个人所得税, 点击 OK 退出。设计结果如图 4-7 所示。图 3-7 对话框类成员变量的设计结果从菜单View 中翻开类向导Class wizard,如图 3-8 所示。在 Object IDs 中选择IDOK,在 Class name 中选择 Inputdlg,在 Message 中选择 COMMAND 后,点击 Add function 按钮,弹出对话框,默认菜单成员函数的名字为 OnOK,点击 OK 按钮,则在 Member function 中添加了成员函数,该函数是Inpu
24、tdlg 类的成员函数,点击Edit Code 按钮可以对函数进展编辑。3. 菜单设计图 3-8 设计对话框成员函数在资源视图Resource View 上点击Menu,双击翻开 IDR_MAINFRAME,修改菜单项, 设置菜单Tax 的 ID 为 ID_MENUTax,如图 3-9 所示。图 3-9 设计菜单从菜单 View 中翻开类向导 Class wizard,如图 3-10 所示。在 Object IDs 中选择ID_MENUTax,在 Class name 中选择CExample1 View,在 Message 中选择COMMAND 后,点击Add function 按钮,弹出对话
25、框,默认菜单成员函数的名字为OnMENUTax,点击 OK 按钮,则在 Member function 中添加了成员函数,该函数是 CExample2 View 类的成员函数,单击Edit Code 按钮可以对函数进展编辑。菜单调用流程图见图 3-11。图 3-10MFC 类向导图 3-11 菜单调用流程图工程四 复数的四则运算一、工程需求1. 工程描述复数 a=x1+y1i 和 a=x2+y2i 的四则运算公式如下:,试编写程序对输入的两个复数进展加减乘除四则运算,并在屏幕上输出计算结果。2. 效果图3. 功能说明图 4-1 工程效果图(1) 进展加“”,减“”,乘“*”,除“/”运算符重载
26、,对输入的两个复数对象输出其运算结果。(2) 当其次个复数b 的实部和虚部同时为 0 时,除法不能运算,需要提示。(3) 设计输出函数,对于计算结果的虚部为负数的状况能进展处理。如 2-2i 不要输出为2+-2i。二、工程分析依据工程需求,需要利用 MFC 环境定义了一个菜单;一个输入对话框类,供给个两个复数的输入界面;另外定义一个complex 类,在 complex 类中定义了数据成员:实部值和虚部值,定义了成员函数:声明白友元加号运算符重载函数、友元减号运算符重载函数、友元乘号运算符重载函数、友元除号运算符重载函数、实部值猎取函数和虚部值猎取函数。最终在视图区输出了两个复数的运算结果。本
27、工程的重点是如何使用运算符重载函数来进展复数对象的四则运算,由于在 MFC 环境中不能重载输入和输出运算符,需要独立设计复数输出函数。本工程的难点在于复数的虚部计算结果为负数时的输出函数设计。三、工程设计1. 类的设计本工程需要设计一个类complex。图 4-2 complex 类图数据成员double real;复数实部。double imag;复数虚部。函数成员complex;默认构造函数。complex(double,double);带参构造函数。friend complex operator + (complex &c1,complex&c2); 友元运算符重载函数。friend c
28、omplex operator - (complex &c1,complex&c2);友元运算符重载函数。friend complex operator * (complex &c1,complex&c2);友元运算符重载函数*。friend complex operator / (complex &c1,complex&c2); 友元运算符重载函数/。double getr;读出实部值函数。double geti;读出虚部值函数。2. 对话框设计在资源视图Resource View 上选择Dialog,点击右键,选择Insert Dialog,在对话框内添加静态文本Static Text 和
29、编辑框Edit Box 控件并修改属性,对话框的设计结果如图 4-3 所示。图 4-3 设计对话框双击对话框弹出Add Class 对话框,保持默认值添加一个类Creat a new class ,点击 OK 按钮。在弹出的对话框中填写对话框类名inputdlg,点击确定。在 View 菜单下选择MFCClass Wizard 菜单项,切换到Member Variable 标签页。添加成员变量的名称和类型m_ar 和m+ai 是 a 复数的实部和虚部,m_br 和m+bi 是 b 复数的实部和虚部。设计结果如图 4-4 所示。3. 菜单设计图 4-4 对话框类成员变量的设计结果在资源视图Res
30、ource View 上点击Menu,双击翻开 IDR_MAINFRAME,修改菜单项, 设置菜单complex 的 ID 为 ID_MENUcomplex,如图 4-5 所示。图 4-5 设计菜单从菜单 View 中翻开类向导 Class wizard,如图 4-6 所示。在 Object IDs 中选择ID_MENUcomplex, 在 Class name 中选择 CExample4View, 在 Message 中选择COMMAND 后,点击 Add function 按钮,弹出对话框,默认菜单成员函数的名字为OnMENUcomplex,点击OK 按钮,则在Member functio
31、n 中添加了成员函数,该函数是CExample4View 类的成员函数,单击Edit Code 按钮可以对函数进展编辑。图 4-6 MFC 类向导为了实现复数对象的输出,在 Example4View 类中定义了 output函数。该函数在Example4View.h 文件中的声明为: void output(complex num,CString sign,int y); 在Example4View.cpp 文件中的定义为:void CExample4View:output(complex num,CString sign,int y)为了防止其次个复数的实部和虚部同时为 0 不能进展除法,在对话框 inputdlg 中添加了 OnOK函数,该函数是 inputdlg 类的成员函数,单击 Edit Code 按钮可以对其进展编辑, 如图 4-7 所示。菜单调用流程图见图 4-8。图 4-7 添加对话框Ok 按钮函数图 4-8 菜单调用流程图
限制150内