// OHJ-1151 Palautustehtävä 3: Polynomi // 205441 Petteri Aimonen #include #include #include #include #include #include #include "polynomi.hh" // Lukee polynomin virrasta tietorakenteeseen // Jos ei voitu lukea palauttaa falsen bool luepolynomi(std::istream &virta, Polynomi &polynomi) { polynomi = Polynomi(); // Tyhjennetään polynomi int maara = 0; if (!(virta >> maara)) { // Lukeminen epäonnistui (tiedosto loppu) return false; } // Luetaan termit ja lisätään polynomiin while (maara --) { double kerroin = 0; int eksponentti = 0; virta >> kerroin >> eksponentti; polynomi.lisaaTermi(kerroin, eksponentti); } return true; } // Lukee ja suorittaa komennon // Palauttaa false syötteen loputtua bool suoritakomento(std::vector &muisti) { // 1) Syötteen lukeminen std::string rivi(""); std::cout << "> "; if (!std::getline(std::cin, rivi)) { return false; } if (rivi == "") { return true; } // Rivi luetaan kokonaisena, ja sen jälkeen pilkotaan stringistä paloihin std::istringstream virta(rivi); unsigned int paikka1 = 0; char operaattori = 0; unsigned int paikka2 = 0; virta >> paikka1 >> operaattori >> paikka2; if (paikka1 >= muisti.size() || paikka2 >= muisti.size()) { std::cout << "Virheellinen muistipaikka" << std::endl; return false; } // 2) Muistipaikkojen sisällön tulostus std::cout << "Muistipaikka " << paikka1 << ": "; muisti.at(paikka1).tulosta(std::cout); std::cout << std::endl; std::cout << "Muistipaikka " << paikka2 << ": "; muisti.at(paikka2).tulosta(std::cout); std::cout << std::endl; std::cout << "( "; muisti.at(paikka1).tulosta(std::cout); std::cout << " ) " << operaattori << " ( "; muisti.at(paikka2).tulosta(std::cout); std::cout << " )" << std::endl; // 3) Laskuoperaation suoritus Polynomi tulos; switch (operaattori) { case '+': tulos = muisti.at(paikka1).lisaa(muisti.at(paikka2)); break; case '-': tulos = muisti.at(paikka1).vahenna(muisti.at(paikka2)); break; default: std::cout << "Virheellinen operaattori" << std::endl; return false; } // 4) Tuloksen näyttäminen std::cout << " = "; tulos.tulosta(std::cout); std::cout << std::endl; std::cout << " eli sievennettyna "; tulos.sievenna(); tulos.tulosta(std::cout); std::cout << std::endl; return true; } int main(int argc, char *argv[]) { std::cout << "### OHJ-1151 Ohjelmointi IIe" << std::endl; std::cout << "### Petteri Aimonen, 205441, aimonen" << std::endl; if (argc != 2) { std::cout << "Virheelliset komentoriviparametrit." << std::endl; return EXIT_FAILURE; } // 1) Tiedoston avaus ja lukeminen std::ifstream tiedosto(argv[1]); if (!tiedosto.good()) { std::cout << "Tiedostoa " << argv[1]; std::cout << " ei voida lukea." << std::endl; return EXIT_FAILURE; } std::vector muisti; Polynomi polynomi; // Luetaan polynomeja muistiin kunnes tiedosto loppuu while (luepolynomi(tiedosto, polynomi)) { muisti.push_back(polynomi); } // 2) Komentojen lukeminen ja suoritus // Suoritetaan komentoja syötteen loppumiseen asti while (suoritakomento(muisti)) { } return EXIT_SUCCESS; }