• 购买到最多的巧克力


    一 目的

    利用所学知识,编写出可以解决从自动售货机出购买巧克力时,已知1美元可以购得一块巧克力。如果我们有n美元,且设置m张优惠券可以兑换一块巧克力,那么最多能够得到多少块巧克力,其中包括优惠券换到的巧克力,以及还有多少张富余的优惠券这一问题,针对这个问题写一个递归解决方案,从用户那里接受购买巧克力所花的美元数,然后输出花完这些钱后所得的巧克力块数,并尽量多换优惠券。编写的递归函数将基于所得到的优惠券的数量。最后将从键盘上键入的内容和输出数据保存到outfile.txt文件夹中。

    二 需求分析

    1、输入数据

    1)输入你所拥有的美元金额n

    2)输入兑换一块巧克力需要的优惠券数量;

    3)输入巧克力的单价。

    2、输出数据

    1)输出总共得到的巧克力数量;

    2)输出剩余的优惠券数量。

    3、程序所能达到的功能

    (1)使用菜单选择操作,提示用户进行相应操作;

    (2)对从键盘上接受到的数据,以及运行得到的结果,要输出保存到outfile.txt文件中。

    三 概要设计

    1、思路

    1)得到的总巧克力的数量=用钱购买的巧克力数+优惠券兑换的巧克力数;

    2)剩余的优惠券数量=兑换巧克力所得到的优惠券+兑换巧克力剩余的优惠券;

    3)通过switch语句实现用户选择。

    2、各函数的功能及数据的含义

    (1)类Shop:
    

        私有数据成员:
    

        int money;//拥有的钱。
    

            int number;//兑换一块巧克力需要的优惠券。
    

            int k;//购买到的巧克力。
    

            int t;//剩余的优惠券。
    

            int m;//巧克力的单价。
    

            int n;//现在拥有的优惠券数。
    

        公有成员函数:
    

        Shop();/*构造函数,初始化各变量的值。*/
    

            int buy(int m,int n);/*求只用钱买到的巧克力数,其中m为拥有的钱,n为巧克力的单价,m/n即为只用钱买到的巧克力数。*/
    

            int chang(int m, int n);/*求优惠券兑换的巧克力,m为用户现在拥有的优惠券数量,n为兑换一块巧克力需要的优惠券数量,判断用户兑换巧克力后的优惠券(m/n+m%n)是否小于n,若小于,则返回兑换的巧克力数为m/n;若大于n,则返回(chang((m/n+m%n),n)+m/n)。*/
    

            int remain_coupons(int m,int n);/*求剩余的券,m为用户现在拥有的优惠券数量,n为兑换一块巧克力需要的优惠券数量,判断用户兑换巧克力后的优惠券(m/n+m%n)是否小于n,若小于,则返回此时剩余的优惠券数量(m/n+m%n);若大于n,则返回(remain_coupons((m/n+m%n),n))。*/
    

            void input();/*输入,提示用户输入数据。*/
    

            void output();/*输出,调用chang()和remain_coupons()函数分别计算总共得到的巧克力和剩余的优惠券数量。*/
    

            void choose();/*设置界面和购买选项。*/
    

        /*因成员变量为私有,外部访问需要通过函数来访问。*/
    

            int getk();/*获取总共得到的巧克力k的值。*/
    

            int gett();/*获取剩余优惠券t的值。*/
    

            int getmoney();/*获取用户拥有的钱money的值。*/
    

            int getnumber();/*获取兑换一块巧克力需要的优惠券数量number的值。*/
    

            int getm();/*获取巧克力的单价m的值。*/
    

    (2)main函数
    

        ①定义类Shop的对象chocolate,并调用其成员函数。
    

        ②使用switch语句,实现用户的选择。
    

        ③使用文件流类,把把从键盘上接受到的数据,以及运行得到的结果等写入到文件outfile.txt中。        
    

    四 详细设计

    1、流程图

    2、伪代码

    Begin

    创建类Shop对象a

    定义整形变量money

    定义整形变量number

    调用a.choose(),输出选项界面;

    定义文件流对象fout

    定义字符型变量ch

    while(输入ch的值)

    switch(ch)

    case'a'//用户输入a,进入购买选项

    调用a.input(),输入moneynumber

    调用a.output()

    调用change(),传入参数mn

    if((m/n+m%n)<n)//判断优惠券是否足够

    返回 m/n

    else

    return change(m/n+m%n,n)+m/n

    调用remain_coupons()

    if((m/n+m%n)<n)//判断优惠券是否足够

    返回 m/n+m%n

    else

    return remain_coupons(m/n+m%n,n)

    打开输出文件,将文本信息输入文本文档;

    关闭输出文件;

    break

    case'b'//用户输入b,退出购买选项

    输出退出提示;

    打开输出文件,将文本信息输入文本文档;

    关闭输出文件;

    break

    default

    输出提示,要求重新输入;

    打开输出文件,将文本信息输入文本文档;

    关闭输出文件;

    break

    end

    五 调试分析

    1、调试环境:系统:Window10 编译器:QT Creator4.4.1

    2、问题

    1)界面不友好。

    1)错误分析:注重程序的可视化以及可操作性,使用户能方便操作,读懂屏幕输出的内容。

    2)问题解决:添加空格和分割线等来设计界面。

    (2)输入除a和b以外的字符出现错误。

    1)错误分析:switch语句中未考虑除a和b以外的情形。

    2)问题解决:在switch语句中加default,提示用户输入其他的字符时重新输入a或者b。

    六 测试结果

    1、操作界面

    运行程序,输入c,提示重新输入;输入a,进入购买选项,输入美元数12,兑换一块巧克力需要的优惠券2,巧克力单价1,按回车显示结果;输入b,购买结束。

     

    2、文本保存结果

    打开outfile.txt文件,查看文本结果。

     

    3、多组数据测试结果

    进行7组测试,绘制表格。

     

    拥有的美元金额

    兑换一块巧克力需要的优惠券

    巧克力的单价

    总共得到的巧克力数

    剩余的优惠券数

    1 

    10

    2 

    1 

    19

    1 

    2 

    12

    3 

    1 

    17

    2 

    3 

    14

    3 

    1 

    20

    2 

    4 

    16

    2 

    1 

    31

    1 

    5 

    18

    4 

    1 

    23

    3 

    6 

    20

    6 

    1 

    23

    5 

    7 

    22

    2 

    1 

    43

    1 

     

    七 用户使用说明

    1

    、操作步骤

    1)打开程序并点击运行程序的按钮,进入购买巧克力的程序。

    2)界面出现购买规则和购买选项。

     

    (3)输入相应的按钮进行选择。

    (4)输入a,按回车键,进行购买选项,出现提示语句"请问你有多少钱:"。

    (5)在后面输入数据,如12,按回车键,出现提示语句"多少优惠券兑换一块巧克力"

     

    6)在后面输入数据,如2,按回车键,出现提示语句"巧克力的单价"。

     

    7)在后面输入数据,如1,按回车键,显示购买结果。

     

    8)再次输入a,继续进行购买。

     

    9)输入b,提示结束购买,按回车键退出。

     

    10)输入b,按回车键,显示购买结束,按回车退出。

     

    1. 输入ab以为的字符时,如1,按回车,提示"请输入a或者b"。

     

    2.查看文本文件,打开对应文件夹里的outfile.txt进行查看。

    八 源程序

    shop.h文件

    #ifndef SHOP_H

    #define SHOP_H

    class Shop

    {

    public:

    Shop();

    int buy(int m,int n);//只用钱买到的巧克力数

    int chang(int m, int n);//兑换的巧克力

    int remain_coupons(int m,int n);//剩余的券

    void input();//输入

    void output();//输出

    void choose();//购买选项

    int getk();//获取k的值

    int gett();//获取t的值

    int getmoney();//获取money的值

    int getnumber();//获取number的值

    int getm();//获取m的值

     

    private:

    int money;//拥有的钱

    int number;//兑换一块巧克力需要的优惠券

    int k;//购买到的巧克力

    int t;//剩余的优惠券

    int m;//巧克力的单价

    int q;//只用钱买到的巧克力数

    int p;//优惠券兑换的巧克力数

    int n;//现在拥有的优惠券数

    };

     

    #endif // SHOP_H

     

    shop.cpp文件

    #include "shop.h"

    #include<iostream>

    #include<fstream>

    using namespace std;

    Shop::Shop()

    {

    money=0;

    number=0;

    k=0;

    t=0;

    m=1;

    q=0;

    p=0;

    n=0;

    }

    //求只用钱买到的巧克力数量,m代表你有的美元,n代表巧克力单价

    int Shop::buy(int m, int n)

    {

    int k;

    k=m/n;

    return k;

    }

    //运用递归函数求优惠券兑换的巧克力

    int Shop::chang(int m, int n)

    {

    if((m/n + m%n) < n){

    return m/n;

    }

    else{

    return (chang((m/n + m%n),n) + m/n);

    }

     

    }

    //运用递归函数求剩余的优惠券

    int Shop::remain_coupons(int m, int n)

    {

    if((m/n+m%n)<n){

    return (m/n+m%n);

    }

    else {

    return (remain_coupons((m/n+m%n),n));

    }

    }

     

    void Shop::input()

    {

    cout<<" 请问你有多少钱:";

    cin>>money;

    cout<<" ---------------------"<<endl;

    cout<<" 多少优惠券兑换一块巧克力:";

    cin>>number;

    cout<<" ---------------------"<<endl;

    cout<<" 巧克力的单价:";

    cin>>m;

    cout<<" ---------------------"<<endl;

    }

     

    void Shop::output()

    {

    q=buy(money,m);//只用钱买到的巧克力数

    n=q;//最开始拥有的优惠券

    p=chang(n,number);

    k=q+p;

    t=remain_coupons(n,number);

    cout<<" 你总共能买到的巧克力数量是"<<k<<endl;

    cout<<" 你还剩下的优惠券的数量是"<<t<<endl;

    cout<<" -----------------------"<<endl;

    cout<<" 继续进行购买请按a"<<endl;

    cout<<" 退出请按b"<<endl;

    cout<<" -----------------------"<<endl;

    cout<<" ";//设置后面输入选项的位置

    }

     

    void Shop::choose()

    {

    cout<<endl;

    cout<<endl;

    cout<<" ____________________________________________"<<endl;

    cout<<" |------------------商店--------------------|"<<endl;

    cout<<" |------------------------------------------|"<<endl;

    cout<<" |---------本店购买巧克力,一美元一块-------|"<<endl;

    cout<<" |---------且可以用优惠券兑换巧克力---------|"<<endl;

    cout<<" | |"<<endl;

    cout<<" |请选择:----------------------------------|"<<endl;

    cout<<" |----a.购买巧克力--------------------------|"<<endl;

    cout<<" |----b.退出购买----------------------------|"<<endl;

    cout<<" | |"<<endl;

    cout<<" | 请输入相应的按键进行选择 |"<<endl;

    cout<<" |__________________________________________|"<<endl;

    }

     

    int Shop::getk()

    {

    int m;

    m=k;

    return m;

    }

     

    int Shop::gett()

    {

    int n;

    n=t;

    return n;

    }

     

    int Shop::getmoney()

    {

    int a;

    a=money;

    return a;

    }

     

    int Shop::getnumber()

    {

    int b;

    b=number;

    return b;

    }

     

    int Shop::getm()

    {

    int c;

    c=m;

    return c;

    }

     

    main.cpp文件

    #include <iostream>

    #include<fstream>

    #include "shop.h"

    using namespace std;

     

    int main()

    {

    Shop chocolate;

    chocolate.choose();

    ofstream fout;

    char ch;

    //设计输入选项按键位置

    cout<<endl;

    cout<<" ";

    while(cin>>ch){

    switch (ch) {

    case 'a':

    chocolate.input();//调用输入函数

    chocolate.output();//将结果打印在屏幕

    //将内容写进文档

    fout.open("E:\outfile.txt",ios::app);

    if(!fout){

    cout << "无法打开文件!!!"<<endl;

    return 1;

    }

    fout <<ch<<endl;

    fout<<" 请问你有多少钱:"<<chocolate.getmoney()<<endl;

    fout<<" ---------------------"<<endl;

    fout<<" 多少优惠券兑换一块巧克力:"<<chocolate.getnumber()<<endl;

    fout<<" ---------------------"<<endl;

    fout<<" 巧克力单价:"<<chocolate.getm()<<endl;

    fout<<" ---------------------"<<endl;

    fout<<" 你总共能买到的巧克力数量是"<<chocolate.getk()<<endl;

    fout<<" 你还剩下的优惠券的数量是"<<chocolate.gett()<<endl;

    fout<<" -----------------------"<<endl;

    fout<<" 继续进行购买请按a"<<endl;

    fout<<" 退出请按b"<<endl;

    fout<<" -----------------------"<<endl;

    fout.close();

    break;

    case 'b':

    cout<<" 购买结束,按回车退出"<<endl;

    cout<<" -----------------------"<<endl;

    cout<<" ";//设置后面输入选项的位置

    fout.open("E:\outfile.txt",ios::app);

    if(!fout){

    cout << "无法打开文件!!!"<<endl;

    return 1;

    }

    fout<<ch<<endl;

    fout<<" 购买结束,按回车退出"<<endl;

    fout<<" -----------------------"<<endl;

    fout.close();

    exit(0);

    default:

    cout<<" 请输入a或者b"<<endl;

    cout<<" -----------------------"<<endl;

    cout<<" ";//设置后面输入选项的位置

    fout.open("E:\outfile.txt",ios::app);

    if(!fout){

    cout << "无法打开文件!!!"<<endl;

    return 1;

    }

    fout<<ch<<endl;

    fout<<" 请输入a或者b"<<endl;

    fout<<" -----------------------"<<endl;

    fout.close();

    break;

    }

    }

    return 0;

    }

     

     

  • 相关阅读:
    c++单例模式为什么不在析构函数中释放静态的单例对象(转)
    Ubuntu 树莓派2b交叉编译环境
    多线程std::cout 深入研究
    c++11的 move并没有实际move
    RTC时间设置
    QT 第三方串口库COM10以上无法读取问题
    ubuntu gcc-5 安装
    STM32正交编码器驱动电机
    (转)layoutSubviews总结
    自定义视图控制器切换(iOS)
  • 原文地址:https://www.cnblogs.com/ZhangStudy/p/12499397.html
Copyright © 2020-2023  润新知