kokeilin try-catch juttuja ja koodasin laskimen joka ei toimi osaako joku kertoa miksi?
onko koodissa jotain vikaa?
#include <cmath>
#include <iostream>
#include <stdexcept>
double laske(const double a = 0, const char m = '+', const double b = 0)
throw(std::domain_error, std::invalid_argument) {
switch (m) {
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': if (!a*!b) throw std::domain_error("0/0 ei onnistu");
return a/b;
case '^': if (!a*!b) throw std::domain_error("0^0 ei onnistu");
return std::pow(a,b);
default: throw std::invalid_argument(std::string() + m);
}
}
int main()
try {
double a, b; char m;
if (!(std::cin >> a >> m >> b)) {
throw std::runtime_error("virhe: anna lasku esim 12.3 + 45.6");
}
std::cout << laske((a, m, b)) << std::endl;
} catch (std::invalid_argument &e) {
std::cout << "virhe parametreissa: tuntematon lasku: " << e.what() << std::endl;
return 1;
} catch (std::domain_error &e) {
std::cout << "virhe luvuissa: " << e.what() << std::endl;
return 1;
} catch (std::runtime_error &e) {
std::cout << e.what() << std::endl;
return 1;
}laske((a, m, b)) on väärin, ota siitä ylimääräiset sulut pois niin toimii. Tuossa muodossa laske-funktio saa arvon vain a-argumenttiin kun muut argumentit ovat oletusarvossaan.
oli pienestä kiinni taas mutta suurkiitos! :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.