Advertisement
Guest User

FLab1-2

a guest
Sep 23rd, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.73 KB | None | 0 0
  1. #include<iostream>
  2. #include<sstream>
  3. #include<vector>
  4. #include<tuple>
  5. #include<algorithm>
  6. #define USE_MATH_DEFINITIONS
  7. #include<math.h>
  8.  
  9. using entry_tuple = std::tuple<double, double, double, double>;
  10.  
  11. typedef union {
  12.     struct
  13.     {
  14.         double x, y;
  15.     };
  16.     double value[2];
  17. } vec2;
  18.  
  19. vec2 vec2Add(vec2 a, vec2 b)
  20. {
  21.     return {{a.x + b.x, a.y + b.y}};
  22. }
  23.  
  24. vec2 vec2Div(vec2 a, double s)
  25. {
  26.     return {{ a.x / s, a.y / s }};
  27. }
  28.  
  29. //compute the median-median line of set of points
  30. //in: sorted by x set of points
  31. //out: slope and point of line equation
  32. std::pair<double, double> computeMMLine(std::vector<entry_tuple> table)
  33. {
  34.     vec2 medians[3];
  35.     double slope, shift;
  36.     for (int i = 0; i < 3; i++)
  37.     {
  38.         vec2 median = {0.0, 0.0};
  39.         for (int j = 0; j < (int) (table.size() / 3); j++) {
  40.             auto entry = table[i * (table.size() / 3) + j];
  41.             median = vec2Add(median, {std::get<2>(entry), std::get<3>(entry)});
  42.         }
  43.         medians[i] = vec2Div(median, (int) (table.size() / 3));
  44.     }
  45.     slope = (medians[2].y - medians[0].y) / (medians[2].x - medians[0].x);
  46.     shift = medians[0].y - slope * medians[0].x;
  47.     shift = (slope*medians[1].x + shift - medians[1].y) * (2 / 3) + medians[1].y;
  48.     return std::make_pair(slope, shift);
  49. }
  50.  
  51. void fill_table(std::vector<entry_tuple> & table, std::istream & stream)
  52. {
  53.     std::string line;
  54.     std::getline(std::cin, line);
  55.     while (std::getline(std::cin, line)) {
  56.         double a, t1, t2, t3;
  57.         std::stringstream in(line);
  58.         in >> a;
  59.         in >> t1;
  60.         in >> t2;
  61.         in >> t3;
  62.         double T = (t1 + t2 + t3) / 3;
  63.         table.push_back(std::make_tuple(a, T, a*a, T*T*a));
  64.     }  
  65. }
  66.  
  67. int main()
  68. {
  69.     std::vector<entry_tuple> entries;
  70.     double L, Tmin, amin, a0, g_c, L_ev, e;
  71.     //first line supposed to be a measured length of rod
  72.     std::cin >> L;
  73.  
  74.     fill_table(entries, std::cin);
  75.  
  76.     //write the entries to out
  77.     for (auto e : entries)
  78.         {
  79.             std::cout << std::get<0>(e) << " " << std::get<1>(e) << " " <<
  80.                 std::get<2>(e) << " " << std::get<3>(e) << std::endl;
  81.         }
  82.  
  83.     std::sort(entries.begin(), entries.end(),
  84.               [](entry_tuple & r, entry_tuple & l)
  85.               {
  86.                   return std::get<2>(r) < std::get<2>(l);
  87.               });
  88.     auto ss = computeMMLine(entries);
  89.  
  90.     auto minE = std::min_element(entries.begin(), entries.end(),
  91.                           [](entry_tuple& r, entry_tuple& l)
  92.                           {
  93.                               return std::get<1>(r) < std::get<1>(l);
  94.                           });
  95.  
  96.     Tmin = std::get<1>(*minE);
  97.     amin = std::get<0>(*minE);
  98.     g_c = (4 * M_PI * M_PI) / ss.first;
  99.     a0 = 0.29 * L;
  100.     L_ev = sqrt((ss.second*3*9.8)/(M_PI * M_PI));
  101.     e = (abs(g_c - 9.8)*100)/9.8;
  102.  
  103.     std::cout << "T_min:" << Tmin << " a_0:" << a0 << " g_eks:" << g_c <<
  104.         " k:" << ss.first << " b:" << ss.second << " L_eks:" << L_ev <<
  105.         " e:" << e << std::endl;
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement