C++ 中的并行数组

Parallel Arrays in C++

正在尝试创建一个程序,该程序采用咖啡风味加载项并使用数组检查它是否有效。
如果有效,它使用数组索引来收集价格信息。

我设法编写了下面的代码,但它只适用于 1 次迭代。
如何更改它以便用户可以输入:奶油和肉桂并输出每个加载项的总和以及一杯咖啡的总价?这杯咖啡的底价为 $2.00

#include <iostream>
#include <string>

using namespace std;

int main()
{
    // Declare variables.
    string addIn;               // Add-in ordered
    const int NUM_ITEMS = 5;    // Named constant

    // Initialized array of add-ins
    string addIns[] = { "Cream", "Cinnamon", "Chocolate", "Amaretto", "Whiskey" };
    // Initialized array of add-in prices
    double addInPrices[] = { .89, .25, .59, 1.50, 1.75 };

    bool foundIt = false;        // Flag variable
    int x;                       // Loop control variable
    double orderTotal = 2.00;    // All orders start with a 2.00 charge
    string QUIT = "XXX";

    // Get user input
    cout << "Enter coffee add-in or XXX to quit: ";
    cin >> addIn;

    // Write the rest of the program here.
    for (x = 0; x < NUM_ITEMS && foundIt == false && addIn != QUIT; x++) {
        if (addIn == addIns[x]) {
            foundIt = true;
            x--;
        }
    }
    if (foundIt == true) {
        cout << addIns[x] << " $" << addInPrices[x] <<endl;
        cout << "$" << orderTotal + addInPrices[x] <<endl;
    }
    else {
        cout << "Sorry, we do not carry that." <<endl;
        cout << "Order total is $ " << orderTotal <<endl;
    }

    return 0;
}

不要使用并行数组 - 你会搞砸维护它们。

更好的选择:

为您的加载项创建 struct

struct Addin {
  std::string name;
  double price;
}

并使用这些结构的数组(或者更好的是 std::vector)。

另一种选择是使用 map:

std::map<std::string, double> addIns = {
    {"Cream", .89},
    {"Cinnamon", .25},
    // etc.
};

那么你不需要循环,只需要查找

auto item = addIns.find(addIn);
if(item != addIns.end() {
  // do your math here
}

您要查找的结构是一个 while 或 do/while 循环。 为了能够输入“空”行,请使用 std::getline from.

您的程序结构将如下所示: 如您所见,我习惯于将布尔表达式更改为函数(谓词)。这使代码更具可读性,并且谓词可在其他代码位中重用。

#include <iostream>
#include <string>

bool is_quit(const std::string& input)
{
    return input.length() > 0;
}

bool is_valid_input(const std::string& input)
{
    return true; // your own check
}

int main()
{
    bool quit = false;
    std::string input;

    do
    {
        std::cout << "give input : ";
        std::getline(std::cin, input);

        quit = is_quit(input);
    
        if (is_valid_input(input) && !quit)
        {
            std::cout << "ok" << std::endl;
        }

    } while (!quit);

    return 0;
}

您的程序是为获得单个输出而编写的。对于多个输出,必须有循环并且 not found 条件也必须重写。

试试这个

#include <iostream>
#include <string>

using namespace std;

int main()
{
    // Declare variables.
             
    const int NUM_ITEMS = 5;        // Named constant
    string addIn[NUM_ITEMS];        // Add-in ordered

    // Initialized array of add-ins
    string addIns[] = { "Cream", "Cinnamon", "Chocolate", "Amaretto", "Whiskey" };
    // Initialized array of add-in prices
    double addInPrices[] = { .89, .25, .59, 1.50, 1.75 };

    //bool foundIt = false;        // Flag variable
    int x, i, j;                       // Loop control variable
    double orderTotal = 2.00;    // All orders start with a 2.00 charge
    string QUIT = "XXX";

    // Get user input
    cout << "Enter coffee add-ins followed by XXX to quit: ";
    for(i=0; i<NUM_ITEMS; i++) {
        cin >> addIn[i];
        if(addIn[i] == QUIT) {
            i++;
            break;
        }
    }

    int foundIt[i];

    // Write the rest of the program here.
    
    for(j=0; j<i; j++) {
        foundIt[j] = -1;
        for(x = 0; x<NUM_ITEMS && foundIt[j] == -1 && addIn[j] != QUIT; x++) {
            if (addIn[j] == addIns[x]) {
                foundIt[j] = x;
            }
        }
    }
    
    for(j=0; j<i-1; j++) {
        cout << addIn[j];
        if(foundIt[j] != -1) {
            cout << " $" << addInPrices[foundIt[j]] << endl;
            orderTotal = orderTotal + addInPrices[foundIt[j]];
        }
        else {
            cout << " - Sorry, we do not carry that." <<endl;
        }
    }

    cout << "$" << orderTotal <<endl;
    
    return 0;
}

示例输出

Enter coffee add-ins followed by XXX to quit: Cream Cinnamon XXX
Cream [=11=].89
Cinnamon [=11=].25
.14
Enter coffee add-ins followed by XXX to quit: Cream Onion XXX
Cream [=12=].89
Onion - Sorry, we do not carry that.
.89

我所做的是 addIn 大小为 NUM_ITEMS 的字符串数组,而不是变量。此外,foundIt 被制成一个整数数组,以跟踪在 addIns 数组中找到项目的索引,如果找不到则为 -1

为了仅访问用户在 addIn 中输入的项目,您的 QUIT 已成为该数组中的终止条件。