fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <string>
  5.  
  6. using namespace std;
  7. const unsigned F = 0, I = 1, L = 2, N = 3, T = 4;
  8.  
  9. bool die(const string & msg) {
  10. cout << "Fatal Error:" << msg << endl;
  11. exit(EXIT_FAILURE);
  12. }
  13.  
  14. void filnt(vector<double> & v) {
  15. v[T] = v[F];
  16. for (double i = (v[F] + v[I]); i <= (v[L] + v[I]); i += v[I]) {
  17. v[T] += i;
  18. }
  19. cout << "T:" << v[T] << " ";
  20. v[N] = (2 * v[T]) / (v[F] + v[L]);
  21. cout << "N:" << v[N] << endl;
  22. }
  23. void finlt(vector<double> & v) {
  24. v[L] = v[F];
  25. for (double i = 1; i < v[N]; i++) {
  26. v[L] += v[I];
  27. }
  28. cout << "L:" << v[L] << " ";
  29.  
  30. v[T] = v[F];
  31. for (double i = (v[F] + v[I]); i <= (v[L]); i += v[I]) {
  32. v[T] += i;
  33. }
  34. cout << "T:" << v[T] << endl;
  35. }
  36.  
  37. void fitln(vector<double> &) {
  38. die("not checking this condition");
  39. }
  40.  
  41. void flnit(vector<double> & v) {
  42. v[I] = (v[L] - v[F]) / (v[N] - 1);
  43. cout << "I:" << v[I] << " ";
  44. v[T] = v[F];
  45. for (double i = (v[F] + v[I]); i <= (v[L] + v[I]); i += v[I]) {
  46. v[T] += i;
  47. }
  48. cout << "T:" << v[T] << endl;
  49. }
  50.  
  51. void fltin(vector<double> & v) {
  52. v[N] = (2 * v[T]) / (v[F] + v[L]);
  53. cout << "N:" << v[N] << " ";
  54. v[I] = (v[L] - v[F]) / (v[N] - 1);
  55. cout << "I:" << v[I] << endl;
  56. }
  57.  
  58. void ftnil(vector<double> & v) {
  59. v[L] = ((2 * v[T]) / v[N]) - v[F];
  60. cout << "L:" << v[L] << " ";
  61. v[I] = (v[L] - v[F]) / (v[N] - 1);
  62. cout << "I:" << v[I] << endl;
  63. }
  64.  
  65. void iltfn(vector<double> &) {
  66. die("not checking this condition");
  67. }
  68. void ilnft(vector<double> & v) {
  69. v[F] = v[L];
  70. for (double i = 1; i < v[N]; i++) {
  71. v[F] -= v[I];
  72. }
  73. cout << "F:" << v[F] << " ";
  74. v[T] = v[F];
  75. for (double i = (v[F] + v[I]); i <= (v[L]); i += v[I]) {
  76. v[T] += i;
  77. }
  78. cout << "T:" << v[T] << endl;
  79. }
  80.  
  81. void itnfl(vector<double> & v) {
  82. v[F] = ((v[T] * (2 / v[N])) - ((v[N] - 1)*v[I])) / 2;
  83. cout << "F:" << v[F] << " ";
  84. v[L] = ((2 * v[T]) / v[N]) - v[F];
  85. cout << "L:" << v[L] << endl;
  86. }
  87.  
  88. void lntfi(vector<double> & v) {
  89. v[F] = ((2 * v[T]) / v[N]) - v[L];
  90. cout << "F:" << v[F] << " ";
  91. v[I] = (v[L] - v[F]) / (v[N] - 1);
  92. cout << "I:" << v[I] << endl;
  93. }
  94.  
  95. void assign(std::vector<double>& v, std::vector<bool>& flags, char c, double value)
  96. {
  97. switch (c)
  98. {
  99. case 'F': case 'f': v[F] = value; flags[F] = true; break;
  100. case 'I': case 'i': v[I] = value; flags[I] = true; break;
  101. case 'L': case 'l': v[L] = value; flags[L] = true; break;
  102. case 'N': case 'n': v[N] = value; flags[N] = true; break;
  103. case 'T': case 't': v[T] = value; flags[T] = true; break;
  104. }
  105. }
  106.  
  107. int main()
  108. {
  109. vector<double> v(5);
  110. vector<bool> flags = { false, false, false, false, false };
  111. for (int i = 0; i != 3; ++i) {
  112. char c;
  113. double value;
  114. std::cin >> c >> value;
  115. assign(v, flags, c, value);
  116. }
  117. const std::map<std::vector<bool>, void(*)(std::vector<double> &)> m = {
  118. {{true, true, true, false, false}, filnt},
  119. {{true, true, false, true, false}, finlt},
  120. {{true, false, true, true, false}, flnit},
  121. {{true, false, true, false, true}, fltin},
  122. {{true, false, false, true, true}, ftnil},
  123. {{false, true, true, true, false}, ilnft},
  124. {{false, true, false, true, true}, itnfl},
  125. {{false, false, true, true, true}, lntfi}
  126. };
  127.  
  128. auto it = m.find(flags);
  129. if (it == m.end()) {
  130. std::cout << "Fatal Error: not checking this condition\n";
  131. return EXIT_FAILURE;
  132. }
  133. it->second(v);
  134. }
  135.  
Success #stdin #stdout 0s 15248KB
stdin
t 3.6 f 1.1 l 1.3
stdout
N:3 I:0.1