《最新C++项目实训指导书.doc》由会员分享,可在线阅读,更多相关《最新C++项目实训指导书.doc(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC+项目实训指导书深圳信息职业技术学院中小企业桌面应用系统开发实训指导书项目一 饮料自动贩卖机模拟程序一、项目需求1项目描述本项目模拟饮料自动售卖机的销售过程。顾客首先进行投币,机器显示投币金额。接下来顾客选择要购买的饮料,如果投币金额足够并且所购饮料存在,则提示用户在出口处取走饮料,同时找零。如果投币金额不足,显示提示信息。如果所购饮料已经售完,显示售完信息。2效果
2、图图1-1 饮料自动贩卖机项目效果图3功能说明(1)只接受10元、5元、2元、1元和0.5元的纸币和硬币。(2)顾客一次只能投入上述一种金额的纸币或硬币,当用户重复投入时货币金额累加。(3)销售的饮料包括5种:可口可乐(2元)、百事可乐(2元)、橙汁(3元)、咖啡(5元)、纯净水(1.5元)。(4)系统通过必要的提示信息,提示用户完成相应的操作。(5)若顾客所购买的饮料已经售完,则进行提示并询问用户是否购买其它的饮料。(6)完成一次售卖后,系统自动进行结算找零。 二、项目分析根据系统功能要求,首先设计处理钱币的类和商品信息类。处理钱币的类主要完成与钱币相关的工作,如给顾客找零等过程。商品信息类
3、主要用来处理与商品相关的工作,如获得商品信息等操作。还需要设计一个自动贩卖机类来实现饮料的售卖过程。在这个类里面,将钱币类和商品信息类作为其数据成员。同时定义了包含5个GoodsInfo对象的数组,负责保存饮料的三个信息:名称、价格和库存量,并且可以反馈这些信息。项目需要用到类与类之间的一种关系:has-a 拥有关系,has-a关系是指一个对象包含另一个对象,即一个对象是另一个对象的成员。三、项目设计1类的设计根据上述的设计思想,设计了“MoneyCounter类”、“GoodsInfo 类”和“DrinkMachine类”3个类。(1) MoneyCounter类的设计图1-2 MoneyC
4、ounter类图数据成员float input_money; 用于记录顾客投币金额函数成员MoneyCounter(); 构造函数,初始化顾客投币金额为0.00MoneyCounter() 析构函数void getmoney(); 提示顾客投币float money_from_buyer(); 返回投币金额void clear(); 清空,准备下一轮投币void return_money(float); 返回找的零钱(2)GoodsInfo 类的设计图1-3 GoodsInfo类图数据成员string name ; 用于记录饮料名称float price; 用于记录饮料的单价int total
5、; 用于记录饮料的总库存数函数成员 GoodsInfo(); 构造函数,初始化饮料信息GoodsInfo() 析构函数void set_goods(string, float, int); 设置每种饮料的属性:名称,价格,数量string goods_name();返回饮料的名称float goods_price(); 返回饮料的价格int goods_number(); 返回饮料的数量(3)DrinkMachine类的设计图1-4 DrinkMachine类图数据成员MoneyCounter moneyctr; 定义MoneyCounter的对象,实现投币、找零等功能 GoodsInfo v
6、_goods5; 定义GoodsInfo的对象,实现商品信息的维护,此处设计了5种饮料,详见该类的实现函数成员DrinkMachine(); 构造函数,初始化自动售货机中的商品信息DrinkMachine() 析构函数void showchoices(); 显示饮料选择信息void inputmoney(); 获取顾客投入钱币bool goodsitem(int); 检查饮料状况void return_allmoney(); 返回钱数2主程序设计在主函数中,首先定义了一个DrinkMachine类(自动售货机类)的对象dri,并未显式地定义MoneyCounter类和GoodsInfo类的对象
7、。但是在DrinkMachine类中含有MoneyCounter类和GoodsInfo类的数据成员。其次设计一个两重循环,外循环的持续条件是顾客继续购买,内循环的持续条件是顾客继续重复投币,即顾客可以反复投币直至投够为止。当顾客购买成功或不再继续购买时流程中止。程序流程图如图1-5所示。图1-5 程序流程图 项目二 超市收银系统模拟一、项目需求1项目描述模拟“美特好”超市购物过程,根据货物清单,选定所购货物种类和数量,实现收银结账。2效果图效果图如图2-1所示。 图2-1 超市收银系统效果图3功能说明(1)显示超市库存商品信息。(2)显示购物流程提示信息。(3)实现购物过程,反复输入所购各种商
8、品的索引和购买数量,直到商品索引号输入”-1”结束购物流程。(4)实现收银,根据顾客所交现金,自动找零。二、项目分析在本项目中,超市收银系统应具备四大基本功能:商品管理、货架管理、购物篮管理和收银管理。货架管理实现库中某种商品的入库、出库、查询及显示等功能。需要建立一个货架类,通过调用相应的函数来实现。每种商品有单价、条形码、商品名称等属性。商品管理类实现了设置、获取商品信息,复制商品信息等功能。购物篮管理就是一个小型的货架管理,可以用货架类来实现。收银实现商品的结账、找零等任务。需要建立一个收银台类,通过调用相应的函数来实现。其中,需要注意以下一些问题:从货架拿货时,应该把商品拿一部分出去,
9、通过把商品“复制”一份出去来实现。“货架”上有形形色色的商品,因此,这个类需要向量这个容器来容纳这些商品。向量中仅存储商品对象是不够的,因为商品没有量的概念,到底容器中包含多少件此类商品还需要用另外一个变量来表示,通过把商品对象和商品数量集成到一个结构体中来实现。如何构建购物篮对象?仔细想一下,“购物篮”就是一个小型的货架,因此可以用“货架”类模拟一个购物篮。三、项目设计1类的设计根据上述的设计思想,设计了“商品类”、“货架类”和“收银台类”3个类,这3个类的声明部分在“counter.h”中实现,3个类的成员函数的实现部分在文件“counter.cpp”中完成。其中商品类(CGoods类)负
10、责完成商品信息的存储、获取、复制等,货架类(CStore类)负责完成库中商品的入库、出库、查询及显示等。收银台类(CCounter类)负责完成商品的结账、找零等任务。另外在counter.h文件中还定义了一个表示货架商品对象的结构SStoreElement,它有两个成员,一个是商品对象的指针,一个是此类商品的数目。货架中的每个商品都是这个结构类型的。(1)CGoods类(商品类)的设计图2-2 CGoods类的结构数据成员int m_iIndex 用于记录商品索引,作用类似于条形码。string m_strName 用于记录商品名称。double m_dUnitPrice 用于记录商品单价。函
11、数成员CGoods( int iIndex, string strName, double dUnitPrice ) 构造函数,用来建立一个新商品,建立商品时给出商品索引、商品名及单价。virtual CGoods(void) 析构函数,用来进行清理工作。string GetName(void) const 获取商品名称。int GetIndex(void) const 获取商品索引。double GetUnitPrice(void) const 获取商品单价。 void SetUnitPrice(double dUnitPrice) 设置商品单价。CGoods *Clone() 复制本类商品
12、,但初始商品数目为0。(2)结构体tagStoreElement /货架元素数据类型typedef struct tagStoreElement CGoods *pGoods; /商品指针 int iNum; /记录商品数量StoreElement, *pStoreElement;图2-3 结构体tagStoreElement(3)CStore类(货架类)的设计图2-4 CStore类的结构数据成员vector m_vStore 用于存储顾客所选商品的向量。函数成员CStore() 构造函数,用来进行初始化工作。virtual CStore() 析构函数,在此调用成员函数DeleteAllGo
13、ods()删除货架中所有的商品。bool AddGoods(CGoods *pGoods, int iNum) 该成员函数用来向货架增加商品,假如货架中已经有了同类商品,那么只增加此类商品的数目。其中,pGoods欲增加的商品对象,iNum增加的数量。返回值:true成功, false失败。int QueryGoods(const string &strName) 该成员函数是重载函数,用来查询商品。其中,strName要查询的商品的名字。返回值:商品数量。int QueryGoods(int iIndex) 该成员函数是重载函数,用来查询商品。其中,iIndex要查询的商品的索引号。返回值:
14、商品数量。int DeleteGoods(const string &strName, int iNum) 该成员函数是重载函数,用来删除商品。其中,strName商品名字,iNum删除数目,-1为全部删除。返回值:剩余商品数量。int DeleteGoods(int iIndex, int iNum) 该成员函数是重载函数,用来删除商品。其中,iIndex商品索引号,iNum删除数目,-1为全部删除。返回值:剩余商品数量。void DeleteAllGoods(void) 该成员函数用来删除购物篮中的所有商品。vector* GetAllGoods(void) 该成员函数用来获取货架的所有商
15、品。返回值:所有商品信息组成的向量。pStoreElement GetGoods(int iIndex) 该成员函数是重载函数,用来获取某种商品。其中,iIndex商品索引号。返回值:如果货架存在此类商品,则返回此类商品的存储元素指针,否则返回NULL。pStoreElement GetGoods(const string &strName) 该成员函数是重载函数,用来获取某种商品。其中,strName商品名称。 返回值:如果货架存在此类商品,则返回此类商品的存储元素指针,否则返回NULL。void Print() 该成员函数用来打印货架全部货物清单,包括商品索引号、商品名、数量及单价。(4)
16、CCounter类(收银台类)的设计图2-5 CCounter类的结构数据成员CStore *m_pBasket 定义购物篮指针m_pBasket。double m_dCash 记录共收取现金数额。函数成员CCounter(CStore *pBasket) 构造函数,用来进行初始化工作,设置购物篮指针和购物篮商品金额,初始金额为0.0。virtual CCounter(void) 析构函数,用来进行清理工作。double Bill(void) 该成员函数用来计算购物篮中商品金额。返回值:购物篮中商品金额。double Count(double dCash) 该成员函数用来收钱找零。其中,dCa
17、sh顾客所交现金。 返回值:给顾客的找零。double GetCash()该成员函数用来返回共收取顾客的现金金额。返回值:收取顾客的现金金额。2主程序设计(1)函数设计CStore* PrepareStore()该函数用于最初“进货”,即往货架存入一批商品,包括这些商品的商品索引、商品名称、数量及单价,即创建一个商店。返回值: CStore *pStore为Cstore类的指针,代表一个货架。void usage()该函数用为用户显示操作提示,即告诉“客人”超市购物的购物流程。返回值: 无(2)主函数设计在main()函数中,首先分别对三个类定义一个超市、一个购物篮和一个收银台对象,然后定义了
18、一个顾客交钱的变量,并初始化为0。利用上诉类的其它成员函数来实现购物过程。具体流程如图3-6。图2-6 主程序调用流程图项目三工资个人所得税计算器一、项目需求1项目描述从2006年1月1日起,工资个人所得税标准从1600元起征。对每月收入超过3000元以上的部分征税,适用5%至45%的9级超额累进税率。即:计税金额=每月工资3000元,个人所得税计税金额税率速算扣除数。税率表如表3-1所示。试开发个人所得税计算器。表3-1 税率表 本月应纳税所得额 税率 速算扣除数(元) 不超过1500元3%0 超过1500元至4500元10%105 超过4500元至9000元20%555 超过9000元至3
19、5000元25%1005 超过35000元至55000元30%2755 超过55000元至80000元35%5505 超过80000元45%135052效果图 图3-1效果图 3功能说明定义一个对话框对输入的个人工资,计算所得税。二、项目分析根据项目需求,需要利用MFC环境定义一个菜单;一个输入对话框类,提供个人月收入的输入界面;另外定义一个PayTax类,在PayTax类中定义了数据成员:个人月收入和个人所得税,定义了成员函数:税率计算函数。最后在对话框上输出了相应的缴纳税额。三、项目设计1类的设计基于上述分析,本项目需要设计一个类PayTax。 图3-2 PayTax类图数据成员doubl
20、e income; 工资月收入。double output; 个人所得税。函数成员PayTax(double money); 带参构造函数。double calculate(); 计算个人所得税。在类视图Class View上选中Example2 classes点击右键选择New Class,弹出New Class对话框,在Class type中选择普通类Generic Class,在Class Information的Name单选框中输入类名PayTax,点击OK按钮,如图4-3所示。图3-3 创建PayTax类 完成后在类视图Class View中出现新类PayTax。在文件视图的Head
21、er Files下找到PayTax.h文件双击打开,其中已经出现该类的声明,添加成员函数calculate(),修改构造函数PayTax的声明,添加变量成员income,output的声明。在文件视图的Source Files下找到PayTax.cpp文件双击打开,可以看到构造函数和析构函数的定义已经存在,在其下添加成员函数calculate()的定义和修改构造函数PayTax()的定义。2对话框设计在资源视图Resource View上选择Dialog,点击右键,选择Insert Dialog,在对话框内添加静态文本Static Text和编辑框Edit Box控件并修改属性,上面的Edit
22、控件的ID为IDC_EDIT1,下面的Edit控件的ID为IDC_EDIT2,而且因为IDC_EDIT2控件用于个人所得税的输出,所以设计其属性中的Border为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 V
23、ariable标签页。修改成员变量的名称和类型。其中IDC_EDIT1的成员变量名为m_income,类型为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按钮,则在Membe
24、r function中添加了成员函数,该函数是Inputdlg类的成员函数,点击Edit Code按钮可以对函数进行编辑。图3-8 设计对话框成员函数3菜单设计在资源视图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-10 MFC类向导菜单调用流程图见图3-11。图3-11 菜单调用流程图项目四 复数的四则运算一、项目需求1项目描述复数a=x1+y1i和a=x2+y2i的四则运算公式如下:, ,试编写程序对输入的两个复数进行加减乘除四则运算,并在屏幕上输出计算结果。2效果图 图4-1 项目效果图3功能说明(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 complex operator - (complex &c1,
28、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和编辑框Edit Box控件并修改属性,对话框的设计结果如图4-
29、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所示。图4-4 对话框类成员变量的设计结果3菜单设计在资源视图Resource View上点击Menu,双击打开IDR_MAINFRAME,修改菜单项,设置菜单complex的
30、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 function中添加了成员函数,该函数是CExample4View类的成员函数,单击Edit Code按钮可以对函数进行编辑。图4-6 MFC类向导为了实现复数对象的输出,
31、在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-7 添加对话框Ok按钮函数菜单调用流程图见图4-8。图4-8 菜单调用流程图-