Ввод клавиатуры С++ в 2 массива

78
9

Я пытаюсь выяснить следующее: скажем, мы просим пользователя ввести несколько строк (каждая строка имеет 2 значения, одна - строка, а другая - число, например: "молоко 2,55" сок 3,15 '). Теперь, как я могу запустить цикл для чтения всех строк и назначить два разных массива (ввод строки в строковый массив и число для двойного массива). Оба массива установлены в значение 50 (массив [50]), и я не знаю, сколько строк пользователь будет вводить. Если я запустил цикл for и установил... я <50... он заполнит оба массива до 50 значений (если мы рассмотрим только две строки, в каждом массиве будет добавлено 2 правильных значения и 48 "мусорных"), Я хочу иметь возможность читать строку, присваивать каждому значению правильный массив и подсчитывать, сколько значений было добавлено.

Он отлично работает, если я знаю, сколько строк будет (например, пусть говорят 3)

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

int main()
{
string itemnames[50];
double itemprices[50];
double subtotal = 0, tax, total;
const double TAX_RATE = 0.095;
int count = 0;

cout << "\nPlease enter the names and prices of the items you wish "
<< "to purchase:\n";

for (int i = 1; i <= 50; i++){
cin >> itemnames[i] >> itemprices[i];
}

for (int i = 1; i <= 3; i++){

subtotal += itemprices[i];

}

tax = subtotal * TAX_RATE;
total = subtotal + tax;

cout << endl;

cout << left << setw(10) << "item"
<< right << setw(10) << "price" << endl
<< "--------------------" << endl;

for (int j = 1; j <=3; j++){
cout << setprecision(2) << fixed
<< left << setw(10) << itemnames[j]
<< right << setw(10) << itemprices[j] << endl;
}

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

<< left << setw(10) << "subtotal"
<< right << setw(10) << subtotal << endl << endl

<< left << setw(10) << "tax"
<< right << setw(10) << tax << endl

<< left << setw(10) << "total"
<< right << setw(10) << total << endl << endl;

return 0;
}

спросил(а) 2015-08-08T05:38:00+03:00 4 года, 6 месяцев назад
1
Решение
51

Самый простой способ сделать это - вставить элементы в один вектор std::pair или std::tuple или простой объект, например struct. таким образом вам не нужно поддерживать два разных набора данных, и с помощью вектора вы можете добавить столько элементов, сколько вам нужно. Используя struct она будет выглядеть так:

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

std::istream & operator >>(std::istream & is, Item & item)
{
is >> item.name >> item.price;
return is;
}

int main ()
{
std::vector<Item> items;
Item reader;
// get items
while (cin >> reader)
items.push_back(reader);

// display items
for (const auto & e : items)
std::cout << e.name << "\t" << e.price << std::endl;

return 0;
}

Вы можете увидеть пример этого с этим Live Example

ответил(а) 2015-08-08T06:02:00+03:00 4 года, 6 месяцев назад
36

Не используйте массив, его старомодный. Используйте vector его простой.

#include<iostream>
#include<vector>

using namespace std;

int main(){

vector<float> costs;
vector<string> names;

char choice = 'y';

while(choice != y){
float price;
cout<<"Enter price: ";
cin>>price;

costs.push_back(price);

string name;
cout<<"Enter grocery name: ";
cin>>name;

names.push_back(name);

cout<<"Enter y to continue";
cin>>choice;
}

return 0;
}


Затем вы можете просто names[49] чтобы получить 50-е имя бакалейного магазина.

ответил(а) 2015-08-08T05:48:00+03:00 4 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема