首页 > 编程语言 >【C++练习】基于函数嵌套调用的点餐流程

【C++练习】基于函数嵌套调用的点餐流程

时间:2024-10-28 18:50:11浏览次数:8  
标签:菜单 函数 menu C++ 嵌套 点餐 order cout

题目:基于函数嵌套调用的点餐系统实现

描述:

        需要实现一个简化的点餐系统,该系统能够处理多位顾客的点餐、支付以及提供食物的过程。系统的主要流程通过函数嵌套调用来实现,包括展示菜单、点餐、生成账单、支付以及提供食物等功能。

具体要求:
  1. 菜单展示:使用 showMenu 函数展示菜单,菜单包含若干项,每项有名称和价格。
  2. 点餐逻辑:使用 takeOrder 函数进行点餐,该函数嵌套调用 showMenu 来显示菜单,并允许顾客选择多个菜品,输入 0 结束点餐。
  3. 生成账单:使用 generateBill 函数根据顾客选择的菜品生成账单,并计算总价。
  4. 支付处理:使用 makePayment 函数处理支付过程,该函数嵌套调用 generateBill 获取账单金额,并接受用户输入的支付金额,检查是否足够支付账单。
  5. 提供食物:使用 serveFood 函数模拟准备并提供食物的过程。
  6. 主要流程:使用  函数作为主要的点餐流程函数,依次调用点餐、支付和提供食物的函数。
  7. 多顾客支持:在 main 函数中,程序应支持处理多位顾客的点餐,通过循环调用 customerOrder 实现。

核心代码流程图:

源代码:

#include <iostream>  
#include <vector>  
#include <string>  
using namespace std;

// 菜单项结构体,包含菜名和价格  
struct MenuItem {
    string name;
    double price;
};

// 展示菜单函数  
void showMenu(const vector<MenuItem>& menu) {
    cout << "菜单:" << endl;
    for (size_t i = 0; i < menu.size(); ++i) {
        cout << i + 1 << ". " << menu[i].name << " - $" << menu[i].price << endl;
    }
}

// 点餐函数,根据顾客选择生成订单  
void takeOrder(vector<MenuItem>& menu, vector<int>& order) {
    showMenu(menu);
    int choice;
    cout << "请输入要点餐的编号(输入0结束点餐):";
    while (cin >> choice && choice != 0) {
        if (choice > 0 && choice <= menu.size()) {
            order.push_back(choice - 1); // 将选择的菜单项索引加入订单  
        }
        else {
            cout << "无效选择,请重新输入:" << endl;
        }
    }
    cout << "顾客已点餐,处理订单..." << endl;
}

// 生成账单函数,根据订单计算总价  
double generateBill(const vector<MenuItem>& menu, const vector<int>& order) {
    double total = 0.0;
    for (int index : order) {
        total += menu[index].price;
    }
    cout << "根据订单生成账单,总价为:$" << total << endl;
    return total;
}

// 支付函数,接受用户输入的支付金额,并检查是否足够支付账单  
bool makePayment(double bill) {
    double paymentAmount;
    cout << "顾客正在支付账单,金额为:$" << bill << endl;
    cout << "请输入支付金额:$";
    cin >> paymentAmount;

    // 检查支付金额是否足够  
    if (paymentAmount >= bill) {
        cout << "支付成功,找零:$" << (paymentAmount - bill) << endl;
        return true; // 支付成功  
    }
    else {
        cout << "支付失败,金额不足,请重新支付。" << endl;
        return false; // 支付失败  
    }
}

// 提供食物函数  
void serveFood() {
    cout << "准备食物并提供给顾客..." << endl;
}

// 顾客订单处理函数  
void customerOrder(vector<MenuItem>& menu) {
    vector<int> order;
    takeOrder(menu, order);
    double bill = generateBill(menu, order);

    // 循环直到支付成功  
    while (!makePayment(bill)) {
        cout << "请重新支付。" << endl;
    }

    serveFood();
}

int main() {
    // 创建菜单  
    vector<MenuItem> menu = {
        {"汉堡", 5.0},
        {"薯条", 3.0},
        {"可乐", 2.0},
        {"沙拉", 4.5}
    };

    int numberOfOrders;
    cout << "请输入点餐数量(即几位顾客要点餐):";
    cin >> numberOfOrders;

    for (int i = 0; i < numberOfOrders; ++i) {
        cout << "处理第" << i + 1 << "位顾客的订单:" << endl;
        customerOrder(menu);
    }

    cout << "所有订单处理完毕,谢谢光临!" << endl;
    return 0;
}

运行截图:

标签:菜单,函数,menu,C++,嵌套,点餐,order,cout
From: https://blog.csdn.net/Raye_Young/article/details/143263366

相关文章

  • c++智能指针
    普通指针的不足new和new[]的内存需要用delete和deletel]释放。程序员的主观失误,忘了或漏了释放。程序员也不确定何时释放。普通指针的释放类内的指针,在析构函数中释放。C++内置数据类型,如何释放?new出来的类,本身如何释放?C++11新增三个智能指针类型unique_pt......
  • 【C++笔记】list结构剖析及其模拟实现
    【C++笔记】list结构剖析及其模拟实现......
  • 【33】C++文件流相关内容
    目录文件流的状态检查文件流的定位seekgtellgseekp常见错误总结文件流的状态检查s.is_open()文件流是否打开成功, s.eof() 流s是否结束s.fail()流s的failbit或者badbit被置位时, 返回truefailbit: 出现非致命错误,可挽回, 一般是软件错误badbit置位......
  • 【30】C++子类相关
    子类型关系什么是子类型公有继承时,派生类的对象可以作为基类的对象处理,派生类是基类的子类型。 #include<iostream>usingnamespacestd;classA{public: A(){} ~A(){} voidkill(){cout<<"Akill."<<endl;}};classB:publicA{public: B(){}......
  • C++之OpenCV入门到提高001:使用 Visual Studio2022 配置 OpenCV 环境
    一、介绍从今天开始,我们又要开始一个新的系列了,这个系列就是《C++之Opencv入门到提高》。这个系列是有关如何使用C++语言,通过Opencv来实现图像处理、缺陷检测、视频处理、机器学习等功能。OpenCV我也是新接触的,一步一步的学习,一步一步提高。这个系列是以C++为基......
  • C++在实际项目中的应用第二节:C++与区块链
    第五章:C++在实际项目中的应用第二课:C++与区块链区块链技术因其去中心化、不可篡改和透明性而受到广泛关注。在这门课程中,我们将深入探讨区块链的基本原理、智能合约的开发以及实际应用的案例分析,重点使用C++作为实现语言,以便充分发挥其高效性和强大的功能。1.区块链的......
  • Qt/C++地图雷达扫描/动态扇形区域/标记线实时移动/轮船货轮动态轨迹/雷达模拟/跟随地
    一、前言说明地图雷达扫描的需求场景也不少,很多人的做法是直接搞个覆盖层widget,在widget上绘制雷达,优缺点很明显,优点是性能高,毕竟直接在widget上绘制性能明显比js中绘制要高,缺点是要么动态计算经纬度坐标转屏幕坐标来实现跟随,要么固定的通过改变绘制的范围内容来跟随,但是总归使用......
  • C++学习,标准库 <cstdlib>
    <cstdlib> 是C++标准库中的一个头文件,提供了各种通用工具函数,包括内存分配、进程控制、环境查询、排序和搜索、数学转换、伪随机数生成等。这些函数最初来自C标准库 <stdlib.h>,在C++中进行了标准化和扩展。字符串转换函数calloc():分配指定数量和大小的内存空间,并将其......
  • 【C/C++】2.函数传入复杂类型实例时,传入值参数和引用参数的区别
    1.值参数传递(PassbyValue)原理:传入参数时会拷贝一份对象副本。优点:副本在函数内部可随意修改,不会影响原始数据。缺点:对于复杂类型,拷贝对象会消耗更多内存和性能。适用场景:函数只需读取少量数据,且无需修改原对象时,可以考虑值传递。voidprocessData(MyClassobj){......
  • C++数据类型
    数据类型C++规定在创建一个变量或常量时,必须要指定出相应的数据类型,否则无法给变量分配内存。一、整型作用:整型变量表示的是整数类型的数据。语法:数据类型  变量名=变量初始值;        int  a=10;数据类型存在的意义:给变量分配合适的内存空间......