// Ohjelmointi 1e: palautustehtävä 3 // Varastonhallinta. #include #include #include #include #include using std::cin; using std::cout; using std::endl; using std::string; using std::vector; struct Tavaratyyppi { string nimike; int toivottu; int varastossa; }; typedef vector Listatyyppi; Tavaratyyppi* etsitavara(Listatyyppi &varasto, string nimike); int atoi(string merkkijono) { std::istringstream virta(merkkijono); int arvo = 0; virta >> arvo; return arvo; } void lisaa(Listatyyppi &varasto, string nimike, int toivottu, int varastossa) { // Lisää tavaran varastolistaan tai jos nimike on jo listassa, // kasvatetaan arvoja. Tavaratyyppi *etsitty = etsitavara(varasto, nimike); if (etsitty != NULL) { etsitty->toivottu += toivottu; etsitty->varastossa += varastossa; } else { Tavaratyyppi tavara = {nimike, toivottu, varastossa}; varasto.push_back(tavara); } } void tulostatavara(Tavaratyyppi tavara, bool valmistus) { // Tulostaa yhden tavaran tiedot structista cout << tavara.nimike; cout << ", varastossa: " << tavara.varastossa; cout << ", toivottu: " << tavara.toivottu; if (valmistus) { if (tavara.varastossa < tavara.toivottu) { cout << ", valmistettava "; cout << tavara.toivottu - tavara.varastossa << " kpl"; } else { cout << ", varasto riittää"; } } cout << endl; } void tulostavarasto(Listatyyppi &varasto) { // Tulostaa koko varaston tiedot Listatyyppi::const_iterator iter; for (iter = varasto.begin(); iter != varasto.end(); iter++) { tulostatavara(*iter, false); } } Tavaratyyppi* etsitavara(Listatyyppi &varasto, string nimike) { // Etsii nimikkeen varastosta. Palauttaa pointterin taikka NULL. Listatyyppi::iterator iter; for (iter = varasto.begin(); iter != varasto.end(); iter++) { if (iter->nimike == nimike) { return &(*iter); } } return NULL; } string jaaosiin(string rivi, int indeksi) { // Palauttaa välilyönneillä osiin erotellun rivin osan indeksi. // Esimerkiksi "a b c", 1 -> "b" int jakokohta = 0; // Poistetaan indeksin verran osia alusta while (indeksi != 0) { jakokohta = rivi.find(' '); rivi = rivi.substr(jakokohta + 1); indeksi -= 1; } // Palautetaan loppuosan ensimmäinen osa jakokohta = rivi.find(' '); return rivi.substr(0, jakokohta); } void ajakomento(Listatyyppi &varasto, string komentorivi) { // Ajaa komennon. Komentorivissä ovat parametrit välilyönnin jälkeen. string komento = jaaosiin(komentorivi, 0); if (komento == "lisaa") { string nimike = jaaosiin(komentorivi, 1); int maara = atoi(jaaosiin(komentorivi, 2)); lisaa(varasto, nimike, 0, maara); // Lisätään varastoon } else if (komento == "toive") { string nimike = jaaosiin(komentorivi, 1); int maara = atoi(jaaosiin(komentorivi, 2)); lisaa(varasto, nimike, maara, 0); // Lisätään toiveisiin } else if (komento == "tiedot") { string nimike = jaaosiin(komentorivi, 1); Tavaratyyppi *etsitty = etsitavara(varasto, nimike); if (etsitty == NULL) { cout << "VIRHE: " << nimike << "-nimistä lahjaa ei löytynyt."; cout << endl; } else { tulostatavara(*etsitty, true); } } else if (komento == "tulosta") { tulostavarasto(varasto); } else { cout << "Tuntematon komento." << endl; } } int main() { cout << "### OHJ-1151 Ohjelmointi Ie" << endl; cout << "### Petteri Aimonen, 205441, aimonen" << endl; Listatyyppi varasto; string komentorivi(""); while (cin.good()) { cout << "> "; getline(cin, komentorivi); if (cin.eof()) { cout << endl; break; } if (komentorivi == "lopeta") { break; } ajakomento(varasto, komentorivi); } return EXIT_SUCCESS; }