#include <cassert>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct MessWert
{
double wert;
string einheit;
};
void ausgeben(MessWert const *messwert, int format)
{
assert(messwert);
cout << messwert->wert << ' ' << messwert->einheit;
switch (format) {
case 1:
cout << std::endl;
break;
case 2:
cout.put(' ');
break;
case 3:
cout << ' ' << endl;
break;
}
}
int normieren(MessWert &messwert)
{
if (messwert.einheit == "A" || messwert.einheit == "V" ||
messwert.einheit == "W")
{
return 0;
}
if (messwert.einheit.length() != 2 || messwert.einheit[1] != 'A' &&
messwert.einheit[1] != 'V' && messwert.einheit[1] != 'W')
{
return 42;
}
switch (messwert.einheit[0]) {
case 'n':
messwert.wert *= 0.000000001;
break;
case 'u':
messwert.wert *= 0.000001;
break;
case 'm':
messwert.wert *= 0.001;
break;
case 'k':
messwert.wert *= 1000.;
break;
case 'M':
messwert.wert *= 1000000;
break;
default:
return 42;
}
messwert.einheit = messwert.einheit.substr(1);
return 0;
}
int leistung(MessWert const &operand1, MessWert const &operand2,
MessWert &ergebnis)
{
MessWert foo{ operand1 };
MessWert bar{ operand2 };
if (normieren(foo) || normieren(bar))
return 42;
if (!(foo.einheit == "V" && bar.einheit == "A") &&
!(foo.einheit == "A" && bar.einheit == "V"))
{
return 42;
}
ergebnis.wert = foo.wert * bar.wert;
ergebnis.einheit = "W";
return 0;
}
int main()
{
MessWert a{ 20, "uA" };
MessWert b{ 10, "kV" };
ausgeben(&a, 2);
ausgeben(&b, 1);
MessWert c{ a };
normieren(c);
ausgeben(&c, 2);
MessWert d{ b };
normieren(d);
ausgeben(&d, 1);
MessWert e;
if (leistung(a, b, e)) {
cerr << "Leistung konnte nicht berechnet werden :(\n\n";
return 42;
}
vector<MessWert> werte{ a, b, c, d, e };
for (auto const &w : werte)
ausgeben(&w, 1);
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBNZXNzV2VydAp7Cglkb3VibGUgd2VydDsKCXN0cmluZyBlaW5oZWl0Owp9OwoKdm9pZCBhdXNnZWJlbihNZXNzV2VydCBjb25zdCAqbWVzc3dlcnQsIGludCBmb3JtYXQpCnsKCWFzc2VydChtZXNzd2VydCk7CgoJY291dCA8PCBtZXNzd2VydC0+d2VydCA8PCAnICcgPDwgbWVzc3dlcnQtPmVpbmhlaXQ7CgoJc3dpdGNoIChmb3JtYXQpIHsKCWNhc2UgMToKCQljb3V0IDw8IHN0ZDo6ZW5kbDsKCQlicmVhazsKCWNhc2UgMjoKCQljb3V0LnB1dCgnICcpOwoJCWJyZWFrOwoJY2FzZSAzOgoJCWNvdXQgPDwgJyAnIDw8IGVuZGw7CgkJYnJlYWs7Cgl9Cn0KCmludCBub3JtaWVyZW4oTWVzc1dlcnQgJm1lc3N3ZXJ0KQp7CglpZiAobWVzc3dlcnQuZWluaGVpdCA9PSAiQSIgfHwgbWVzc3dlcnQuZWluaGVpdCA9PSAiViIgfHwKCQltZXNzd2VydC5laW5oZWl0ID09ICJXIikKCXsKCQlyZXR1cm4gMDsKCX0KCglpZiAobWVzc3dlcnQuZWluaGVpdC5sZW5ndGgoKSAhPSAyIHx8IG1lc3N3ZXJ0LmVpbmhlaXRbMV0gIT0gJ0EnICYmCgkgICAgbWVzc3dlcnQuZWluaGVpdFsxXSAhPSAnVicgJiYgbWVzc3dlcnQuZWluaGVpdFsxXSAhPSAnVycpCgl7CgkJcmV0dXJuIDQyOwoJfQoKCXN3aXRjaCAobWVzc3dlcnQuZWluaGVpdFswXSkgewoJY2FzZSAnbic6CgkJbWVzc3dlcnQud2VydCAqPSAwLjAwMDAwMDAwMTsKCQlicmVhazsKCWNhc2UgJ3UnOgoJCW1lc3N3ZXJ0LndlcnQgKj0gMC4wMDAwMDE7CgkJYnJlYWs7CgljYXNlICdtJzoKCQltZXNzd2VydC53ZXJ0ICo9IDAuMDAxOwoJCWJyZWFrOwoJY2FzZSAnayc6CgkJbWVzc3dlcnQud2VydCAqPSAxMDAwLjsKCQlicmVhazsKCWNhc2UgJ00nOgoJCW1lc3N3ZXJ0LndlcnQgKj0gMTAwMDAwMDsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIDQyOwoJfQoKCW1lc3N3ZXJ0LmVpbmhlaXQgPSBtZXNzd2VydC5laW5oZWl0LnN1YnN0cigxKTsKCXJldHVybiAwOwp9CgppbnQgbGVpc3R1bmcoTWVzc1dlcnQgY29uc3QgJm9wZXJhbmQxLCBNZXNzV2VydCBjb25zdCAmb3BlcmFuZDIsCglNZXNzV2VydCAmZXJnZWJuaXMpCnsKCU1lc3NXZXJ0IGZvb3sgb3BlcmFuZDEgfTsKCU1lc3NXZXJ0IGJhcnsgb3BlcmFuZDIgfTsKCglpZiAobm9ybWllcmVuKGZvbykgfHwgbm9ybWllcmVuKGJhcikpCgkJcmV0dXJuIDQyOwoKCWlmICghKGZvby5laW5oZWl0ID09ICJWIiAmJiBiYXIuZWluaGVpdCA9PSAiQSIpICYmCgkgICAgIShmb28uZWluaGVpdCA9PSAiQSIgJiYgYmFyLmVpbmhlaXQgPT0gIlYiKSkKCXsKCQlyZXR1cm4gNDI7Cgl9CgoJZXJnZWJuaXMud2VydCA9IGZvby53ZXJ0ICogYmFyLndlcnQ7CgllcmdlYm5pcy5laW5oZWl0ID0gIlciOwoJcmV0dXJuIDA7Cn0KCmludCBtYWluKCkKewoKCU1lc3NXZXJ0IGF7IDIwLCAidUEiIH07CglNZXNzV2VydCBieyAxMCwgImtWIiB9OwoKCWF1c2dlYmVuKCZhLCAyKTsKCWF1c2dlYmVuKCZiLCAxKTsKCglNZXNzV2VydCBjeyBhIH07Cglub3JtaWVyZW4oYyk7CglhdXNnZWJlbigmYywgMik7CgoJTWVzc1dlcnQgZHsgYiB9OwoJbm9ybWllcmVuKGQpOwoJYXVzZ2ViZW4oJmQsIDEpOwoKCU1lc3NXZXJ0IGU7CglpZiAobGVpc3R1bmcoYSwgYiwgZSkpIHsKCQljZXJyIDw8ICJMZWlzdHVuZyBrb25udGUgbmljaHQgYmVyZWNobmV0IHdlcmRlbiA6KFxuXG4iOwoJCXJldHVybiA0MjsKCX0KCgl2ZWN0b3I8TWVzc1dlcnQ+ICB3ZXJ0ZXsgYSwgYiwgYywgZCwgZSB9OwoJZm9yIChhdXRvIGNvbnN0ICZ3IDogd2VydGUpCgkJYXVzZ2ViZW4oJncsIDEpOwp9