fork download
  1. #include <cassert>
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>
  5. using namespace std;
  6.  
  7. struct MessWert
  8. {
  9. double wert;
  10. string einheit;
  11. };
  12.  
  13. void ausgeben(MessWert const *messwert, int format)
  14. {
  15. assert(messwert);
  16.  
  17. cout << messwert->wert << ' ' << messwert->einheit;
  18.  
  19. switch (format) {
  20. case 1:
  21. cout << std::endl;
  22. break;
  23. case 2:
  24. cout.put(' ');
  25. break;
  26. case 3:
  27. cout << ' ' << endl;
  28. break;
  29. }
  30. }
  31.  
  32. int normieren(MessWert &messwert)
  33. {
  34. if (messwert.einheit == "A" || messwert.einheit == "V" ||
  35. messwert.einheit == "W")
  36. {
  37. return 0;
  38. }
  39.  
  40. if (messwert.einheit.length() != 2 || messwert.einheit[1] != 'A' &&
  41. messwert.einheit[1] != 'V' && messwert.einheit[1] != 'W')
  42. {
  43. return 42;
  44. }
  45.  
  46. switch (messwert.einheit[0]) {
  47. case 'n':
  48. messwert.wert *= 0.000000001;
  49. break;
  50. case 'u':
  51. messwert.wert *= 0.000001;
  52. break;
  53. case 'm':
  54. messwert.wert *= 0.001;
  55. break;
  56. case 'k':
  57. messwert.wert *= 1000.;
  58. break;
  59. case 'M':
  60. messwert.wert *= 1000000;
  61. break;
  62. default:
  63. return 42;
  64. }
  65.  
  66. messwert.einheit = messwert.einheit.substr(1);
  67. return 0;
  68. }
  69.  
  70. int leistung(MessWert const &operand1, MessWert const &operand2,
  71. MessWert &ergebnis)
  72. {
  73. MessWert foo{ operand1 };
  74. MessWert bar{ operand2 };
  75.  
  76. if (normieren(foo) || normieren(bar))
  77. return 42;
  78.  
  79. if (!(foo.einheit == "V" && bar.einheit == "A") &&
  80. !(foo.einheit == "A" && bar.einheit == "V"))
  81. {
  82. return 42;
  83. }
  84.  
  85. ergebnis.wert = foo.wert * bar.wert;
  86. ergebnis.einheit = "W";
  87. return 0;
  88. }
  89.  
  90. int main()
  91. {
  92.  
  93. MessWert a{ 20, "uA" };
  94. MessWert b{ 10, "kV" };
  95.  
  96. ausgeben(&a, 2);
  97. ausgeben(&b, 1);
  98.  
  99. MessWert c{ a };
  100. normieren(c);
  101. ausgeben(&c, 2);
  102.  
  103. MessWert d{ b };
  104. normieren(d);
  105. ausgeben(&d, 1);
  106.  
  107. MessWert e;
  108. if (leistung(a, b, e)) {
  109. cerr << "Leistung konnte nicht berechnet werden :(\n\n";
  110. return 42;
  111. }
  112.  
  113. vector<MessWert> werte{ a, b, c, d, e };
  114. for (auto const &w : werte)
  115. ausgeben(&w, 1);
  116. }
Success #stdin #stdout 0s 4352KB
stdin
Standard input is empty
stdout
20 uA 10 kV
2e-05 A 10000 V
20 uA
10 kV
2e-05 A
10000 V
0.2 W