Sumowanie wartości towarów w koszyku (vector)

0

Hej, pisze program gdzie 'robi się zakupy' wcześniej dodanych przez siebie do 'koszyka' przedmiotów (podaje sie cene, ilość, nazwe).

struct produkt
{
	string name;
	double price;
	int ile;
};

Mam problem ze stworzeniem funkcji, która sumuje później cene*ilość wszystkich przedmiotów w koszyku. Jak to zrobić? Czy potrzebna jest dodatkoa funkcja void od tego czy może element w struct produkt? WELP.

0

Czy potrzebujesz dodatkowej funkcji? Najprawdopodobniej tak. Czy ma ona być void - nie.

Dlaczego potrzebujesz dodatkowej funkcji? Dlatego że na tym polega czysty kod - potrzebujesz funkcję która obliczy Ci sumę produktów, być może będziesz potrzebował to zsumować kilka razy a wtedy zamiast lecieć CTRL+C i CTRL+V po prostu wywołujesz Twoją funkcję liczącą sumę.

Funkcja ta nie może być void bo by nic nie zwracała, Ty potrzebujesz zwrócić sumę abyś mógł ją później jakoś użyć - na przykład wyświetlając.

Co do sumowania - robisz pętlę for która leci po całym wektorze i sumuje dodając wynik mnożenia ceny przez ilość.

Poza tym trzymaj się jednego języka, nie rozumiem dlaczego nazwa struktury jest w języku polskim, następnie dwa pola są w języku angielskim a ilość znów po polsku. Najlepiej byłoby gdybyś używał tylko j. angielskiego.

0

zrobiłem coś takiego ale nie działa to do końca.

double sumall;
                 	for(int i=0; i<produkty.size();i++)
	                {
	                	sumall = produkty[i].price * produkty[i].ile;
	                }
	
	                cout << " całość : " << sumall << endl;
0

Nie działa bo nadpisujesz sumall przy każdej iteracji pętli a Ty musisz dodawać do istniejącej już wartości.

1
#include <iostream>
#include <numeric>
using namespace std;

struct product {
    double price;
    int count;
};

int main() {
	product products[] = {
		{10.f, 3},
		{5.f, 4},
		{1.f, 10}
	};
	
	cout << accumulate(begin(products), end(products), 0.f, [](auto acc, auto &&product) {
		return acc + product.price * product.count;
	});
	
	return 0;
}

https://ideone.com/tOsold

wynik: 60

0

Hej zrobiłem coś takiego ale program się wysypuje przy wpisaniu nazwy produktu :/

void buy(vector <product> products)
{
	system("cls");
	int i;
	cout << " Co chcesz kupić?" << endl;
	for(int i=0; i < products.size(); i++)
	{
		cout << products[i].name << endl;
	}
	cout << endl; 
	cin >> products[i].name;
	cout << "Ile? :"; 
	cin >> products[i].ile;
	
	double suma = 0;
	double sumailosc = products[i].price*products[i].amount;
	for(int i = 0; i < products.size(); i++)
    {
    	suma = suma + sumailosc;
	}
    cout << suma << endl;
	cout << endl;
	
	system("pause");
}
0

Polecam kompilować z flagami -Wall oraz -pedantic, wtedy kompilator jest bardziej czuły i wyłapuje więcej błędów.

Problem jest taki:

int i; // Nazwijmy tą zmienną i A
cout << " Co chcesz kupić?" << endl;
for(int i=0; i < products.size(); i++) // Tutaj tworzona jest nowa zmienna (mimo tej samej nazwy), tą nazwiemy B. Przykrywa ona zmienną A
{
    cout << products[i].name << endl; 
} // Po tej klamrze zmienna B nie istnieje
cout << endl;
cin >> products[i].name; // A więc tutaj używana jest niezainicjalizowana zmienna A
cout << "Ile? :"; 
cin >> products[i].quantity; // Tak samo tutaj

Nie rozumiem dlaczego chcesz przypisać nazwę i ilość do i produktu z wektora nie wiedząc nawet czy taki produkt istnieje.

1

Od @spartanPAGE dostałeś odpowiedź. Tu masz jeszcze prostszą jeśli z jakiegoś powodu nie chcesz stosować <numeric> (chociaż takiego powodu nie znam):

#include <iostream>

using namespace std;
 
struct product {
    double price;
    int count;
};
 
int main() {
    product products[] = {
        {10.f, 3},
        {5.f, 4},
        {1.f, 10}
    };

    float sum{};
    for(const auto& prod: products) {
        sum += prod.price * prod.count;
    }

    std::cout << sum << std::endl;
 
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1