#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);
}