Stack Overflow на русском Asked on December 23, 2021
В коде нужно, чтобы цена на один и тот же товар, для одного и того же покупателя складывалась.
Например, при вводимых данных такого вида:
Ivanov paper 10
Petrov pens 5
Ivanov marker 3
Ivanov paper 7
Petrov envelope 20
Ivanov envelope 5
Вывод должен быть таким:
Ivanov:
envelope 5
marker 3
paper 17
Petrov:
envelope 20
pens 5
#include <map>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
struct item {
string name;
int price;
};
int main (void) {
map <string, vector <item>> s;
string key, name; int price;
cout << "input:" << endl;
while (cin >> key >> name >> price)
s[key].push_back({name, price});
cout << endl;
for (auto n : s)
for (auto i : n.second)
cout << n.first << " " << i.name << ": " << i.price << endl;
return 0;
}
Предложу свою версию кода с использованием map<string, map<string, int>>
. Условимся, что конец ввода на три нуля, а то эти споры про ввод никогда не утихнут.
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
int main ()
{
map <string, map<string, int>> s;
string key, name;
int price;
cout << "input:" << endl;
while (cin >> key >> name >> price)
{
if (key == "0" && name == "0" && price == 0)
break;
s[key][name] += price;
}
cout << endl;
for (pair<string, map<string, int>> pers : s)
{
cout << pers.first << ":n";
for (pair<string, int> item : pers.second)
cout << item.first << " " << item.second << endl;
}
return 0;
}
Answered by EzikBro on December 23, 2021
Для того, чтобы сложить цены введенных товаров, их надо искать в векторе, сравнивая наименования (name) в структурах, а если ничего не найдено, то добавлять новую позицию (структуру item
) в вектор:
#include <map>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
struct item {
string name;
int price;
};
int main (void) {
map <string, vector <item>> s;
string key, name; int price;
cout << "input:" << endl;
while (cin >> key ) {
// Разбил ваш cin, иначе не ясно как вы выскакиваете из цикла ввода позиций
// Если введен q, то выходим из ввода позиций
if ( key == "q" )
break;
cin >> name >> price;
// флаг найденной позиции в векторе
bool flag = false;
for( int i = 0; i < s[key].size(); i++)
if ( s[key][i].name == name ) {
// Нашли позицию - складываем цену
s[key][i].price += price;
flag = true;
break;
}
// Если позиция не была найдена, то добавляем ее в вектор
if ( !flag )
s[key].push_back({name, price});
}
cout << endl;
for (auto n : s)
for (auto i : n.second)
cout << n.first << " " << i.name << ": " << i.price << endl;
return 0;
}
Answered by Alexander Chernin on December 23, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP