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
已成为该数组中的终止条件。
正在尝试创建一个程序,该程序采用咖啡风味加载项并使用数组检查它是否有效。
如果有效,它使用数组索引来收集价格信息。
我设法编写了下面的代码,但它只适用于 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
已成为该数组中的终止条件。