Advertisement
kokokozhina

Untitled

Dec 15th, 2016
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 34.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <map>
  4. #include <set>
  5. #include <vector>
  6. #include <string>
  7. #include <stdio.h>
  8. #include <fstream>
  9. //#include <interface.h>
  10.  
  11. using namespace std;
  12.  
  13. ofstream out;
  14. ifstream in;
  15.  
  16. class Electrical_facility
  17. {
  18. protected:
  19.     string type;
  20.     double r;
  21. public:
  22.     Electrical_facility(string newtype, double newr)
  23.     {
  24.         type = newtype;
  25.         r = newr;
  26.     }
  27.  
  28.     string get_type()
  29.     {
  30.         return type;
  31.     }
  32.  
  33.     double get_r()
  34.     {
  35.         return r;
  36.     }
  37.  
  38.     void set_r(double newr)
  39.     {
  40.         this->r = newr;
  41.     }
  42.  
  43.     virtual void print()
  44.     {
  45.         cout << this->get_type() << " " << this->get_r() << " Ом " << endl;
  46.     }
  47.  
  48.     virtual void save_in_file()
  49.     {
  50.         out << this->get_type() << " " << this->get_r() << endl;
  51.     }
  52. };
  53.  
  54. class Lamp : public Electrical_facility
  55. {
  56. protected:
  57.     bool light;
  58. public:
  59.     Lamp(double newr) : Electrical_facility("LMP", newr)
  60.     {
  61.         light = false;
  62.     }
  63.  
  64.     bool get_light()
  65.     {
  66.         return light;
  67.     }
  68.  
  69.     void set_light(bool newlight)
  70.     {
  71.         this->light = newlight;
  72.     }
  73.  
  74.     void print()
  75.     {
  76.         cout << this->get_type() << " " << this->get_r() << " Ом; ";
  77.         if(this->get_light())
  78.             cout << "светится \n";
  79.         else
  80.             cout << "не светится \n";
  81.     }
  82.  
  83.     void save_in_file()
  84.     {
  85.         out << this->get_type() << " " << this->get_r() << this->get_light() << endl;
  86.     }
  87. };
  88.  
  89. class Resistor : public Electrical_facility
  90. {
  91. public:
  92.     Resistor(double newr) : Electrical_facility("RES", newr) {}
  93.  
  94.     void print()
  95.     {
  96.         cout << this->get_type() << " " << this->get_r() << " Oм " << endl;
  97.     }
  98.  
  99.     void save_in_file()
  100.     {
  101.         out << this->get_type() << " " << this->get_r() << endl;
  102.     }
  103. };
  104.  
  105. class Appliance : public Electrical_facility
  106. {
  107. protected:
  108.     double req_u, req_i, du, di;
  109.     bool is_working;
  110.  
  111. public:
  112.     Appliance(double newr, double newrequ, double newreqi,
  113.          double newdu, double newdi) : Electrical_facility("APP", newr)
  114.     {
  115.         req_u = newrequ;
  116.         du = newdu;
  117.         req_i = newreqi;
  118.         di = newdi;
  119.         is_working = false;
  120.     }
  121.  
  122.     double get_req_u()
  123.     {
  124.         return req_u;
  125.     }
  126.  
  127.     void set_req_u(double newreq_u)
  128.     {
  129.         this->req_u = newreq_u;
  130.     }
  131.  
  132.     double get_req_i()
  133.     {
  134.         return req_i;
  135.     }
  136.  
  137.     void set_req_i(double newreq_i)
  138.     {
  139.         this->req_i = newreq_i;
  140.     }
  141.  
  142.     double get_du()
  143.     {
  144.         return du;
  145.     }
  146.  
  147.     void set_du(double newdu)
  148.     {
  149.         this->du = newdu;
  150.     }
  151.  
  152.     double get_di()
  153.     {
  154.         return di;
  155.     }
  156.  
  157.     void set_di(double newdi)
  158.     {
  159.         this->di = newdi;
  160.     }
  161.  
  162.     void set_is_working(bool state)
  163.     {
  164.         this->is_working = state;
  165.     }
  166.  
  167.     bool get_is_working()
  168.     {
  169.         return is_working;
  170.     }
  171.  
  172.     void print()
  173.     {
  174.         cout << this->get_type() << " " << this->get_r() << " Ом; ";
  175.         if(this->get_is_working())
  176.             cout << "работает \n";
  177.         else
  178.             cout << "не работает \n";
  179.         cout << "    требуется  " << this->get_req_u() << " В; " << this->get_req_i() << " A \n";
  180.         cout << "    возможная разница " << this->get_du() << " В; " << this->get_di() << " A \n";
  181.     }
  182.  
  183.     void save_in_file()
  184.     {
  185.         out << this->get_type() << " " << this->get_r() << " " << this->get_req_u() << " " << this->get_req_i() << " " << this->get_du() << " " << this->get_di() << endl;
  186.     }
  187. };
  188.  
  189. class CCS : public Electrical_facility
  190. {
  191. protected:
  192.     double e;
  193.  
  194. public:
  195.     CCS(double newr, double newe) : Electrical_facility("CCS", newr)
  196.     {
  197.         e = newe;
  198.     }
  199.  
  200.     double get_e()
  201.     {
  202.         return e;
  203.     }
  204.  
  205.     void set_e(double newe)
  206.     {
  207.         this->e = newe;
  208.     }
  209.  
  210.     void print()
  211.     {
  212.         cout << this->get_type() << " " << this->get_r() << " Oм; " << this->get_e() << " В " << endl;
  213.     }
  214.  
  215.     void save_in_file()
  216.     {
  217.         out << this->get_type() << " " << this->get_r() << " " << this->get_e() << endl;
  218.     }
  219.  
  220. };
  221.  
  222. class Key : public Electrical_facility
  223. {
  224. protected:
  225.     bool state;
  226.  
  227. public:
  228.     Key(bool newstate) : Electrical_facility("KEY", 0)
  229.     {
  230.         state = newstate;
  231.     }
  232.  
  233.     bool get_state()
  234.     {
  235.         return state;
  236.     }
  237.  
  238.     void set_state(bool newstate)
  239.     {
  240.         this->state = newstate;
  241.     }
  242.  
  243.     void print()
  244.     {
  245.         cout << this->get_type() << " ";
  246.         if(this->get_state())
  247.             cout << "закрыт \n";
  248.         else
  249.             cout << "открыт \n";
  250.     }
  251.  
  252.     void save_in_file()
  253.     {
  254.         out << this->get_type() << " " << this->get_state() << endl;
  255.     }
  256. };
  257.  
  258. class Branch
  259. {
  260. protected:
  261.     vector<Electrical_facility*> branch;
  262. public:
  263.     Branch() {}
  264.     void set_el_f(int chain_number, bool flag, int type, int place, vector<double> param)
  265.     {
  266.         if(flag)
  267.         {
  268.             cout << "Для установки новой лампы,                              нажмите 1" << endl;
  269.             cout << "Для установки нового резистора,                         нажмите 2" << endl;
  270.             cout << "Для установки нового электронагревательного устройства, нажмите 3" << endl;
  271.             cout << "Для установки нового источника тока,                    нажмите 4" << endl;
  272.             cout << "Для установки нового ключа,                             нажмите 5" << endl;
  273.             cout << "Будьте внимательный: цепь замыкается на источники тока, поэтому \n";
  274.             cout << "они могут располагаться только в 1 подцепи в 1 ветке" << endl;
  275.         }
  276.         if(type == -1 && place == -1)
  277.         {
  278.             cin >> type;
  279.             if(flag)
  280.                 cout << "Введите позицию, на которой будет расположен этот элемент: ";
  281.             cin >> place;
  282.         }
  283.  
  284.         Electrical_facility* new_obj = new Electrical_facility("Ошибка", -100500);
  285.         double r, ru, ri, du, di, e;
  286.         bool f = true;
  287.         switch (type)
  288.         {
  289.         case 1:
  290.             if(flag)
  291.                 cout << "Введите величину сопротивления лампы: ";
  292.             if(param.empty())
  293.                 cin >> r;
  294.             else
  295.                 r = param[0];
  296.             if(chain_number)
  297.                 new_obj = new Lamp(r);
  298.             else
  299.             {
  300.                 f = false;
  301.                 cout << "Нельзя поставить этот элемент сюда!\n";
  302.             }
  303.             break;
  304.         case 2:
  305.             if(flag)
  306.                 cout << "Введите величину сопротивления резистора: ";
  307.             if(param.empty())
  308.                 cin >> r;
  309.             else
  310.                 r = param[0];
  311.             if(chain_number)
  312.                 new_obj = new Resistor(r);
  313.             else
  314.             {
  315.                 f = false;
  316.                 cout << "Нельзя поставить этот элемент сюда!\n";
  317.             }
  318.             break;
  319.         case 3:
  320.             if(flag)
  321.             {
  322.                 cout << "Введите величину сопротивления электронагревательного устройства и необходимые напряжение и силу тока, ";
  323.                 cout << "затем возможную разницу в напряжении и силе тока: ";
  324.             }
  325.             if(param.size() < 5)
  326.                 cin >> r >> ru >> ri >> du >> di;
  327.             else
  328.             {
  329.                 r = param[0];
  330.                 ru = param[1];
  331.                 ri = param[2];
  332.                 du = param[3];
  333.                 di = param[4];
  334.             }
  335.             if(chain_number)
  336.                 new_obj = new Appliance(r, ru, ri, du, di);
  337.             else
  338.             {
  339.                 f = false;
  340.                 cout << "Нельзя поставить этот элемент сюда!\n";
  341.             }
  342.             break;
  343.         case 4:
  344.             if(flag)
  345.                 cout << "Ведите величину внутреннего сопротивления источника тока и ЭДС: ";
  346.             if(param.size() < 2)
  347.                 cin >> r >> e;
  348.             else
  349.             {
  350.                 r = param[0];
  351.                 e = param[1];
  352.             }
  353.             if(chain_number != 0)
  354.             {
  355.                 if(flag)
  356.                     cout << "К сожалению, вы не можете разместить источник тока здесь\n";
  357.                 f = false;
  358.             }
  359.             else
  360.                 new_obj = new CCS(r, e);
  361.             break;
  362.         case 5:
  363.             if(flag)
  364.                 cout << "В каком положении ключ? (1 - закрыт, 0 - открыт): ";
  365.             bool st;
  366.             if(param.empty())
  367.                 cin >> st;
  368.             else
  369.             {
  370.                 if(abs(param[0]) < 1e-9)
  371.                     st = false;
  372.                 else
  373.                     st = true;
  374.             }
  375.             if(chain_number)
  376.                 new_obj = new Key(st);
  377.             else
  378.             {
  379.                 f = false;
  380.                 cout << "Нельзя поставить этот элемент сюда!\n";
  381.             }
  382.             break;
  383.         default:
  384.             f = false;
  385.             if(flag)
  386.                 cout << "Что-то пошло не так, попробуйте снова\n";
  387.             break;
  388.         }
  389.  
  390.         place--;
  391.         if(f)
  392.             if(place < 0 || place > branch.size())
  393.             {
  394.                 if(flag)
  395.                     cout << "Что-то пошло не так, попробуйте снова\n";
  396.             }
  397.             else
  398.             {
  399.                 branch.insert(branch.begin() + place, new_obj);
  400.             }
  401.     }
  402.  
  403.     void remove_el_f()
  404.     {
  405.         cout << "Введите номер по счету на ветке электрической установки, которую вы хотите удалить: ";
  406.         int n; cin >> n; n--;
  407.         if(n >= branch.size() || n < 0)
  408.             cout << "Что-то пошло не так, попробуйте снова\n";
  409.         else
  410.             branch.erase(branch.begin() + n);
  411.     }
  412.  
  413.     bool is_locked()
  414.     {
  415.         bool res = true;
  416.         for(int i = 0; i < branch.size(); i++)
  417.         {
  418.             if(branch[i]->get_type() == "KEY")
  419.             {
  420.                 Key key = *(dynamic_cast<Key*>(branch[i]));
  421.                 if(!key.get_state())
  422.                 {
  423.                     res = false;
  424.                     break;
  425.                 }
  426.             }
  427.         }
  428.         return res;
  429.     }
  430.  
  431.     double get_r_from_to(int from, int to)
  432.     {
  433.         double res = 0;
  434.         from--, to--;
  435.         if(to >= 0 && to < branch.size() && from >=0 && from < branch.size()
  436.             && to >= from && this->is_locked())
  437.             for(int i = from; i <= to; i++)
  438.                 res += branch[i]->get_r();
  439.         return res;
  440.     }
  441.  
  442.     void change_parameters(bool flag)
  443.     {
  444.         if(flag)
  445.         {
  446.             cout << "На этой ветке " << branch.size() << " элементов\n";
  447.             cout << "Введите номер на ветке устройства, чьи параметры будете изменять: ";
  448.         }
  449.         int i; cin >> i; i--;
  450.         if(i >= branch.size() || i < 0)
  451.         {
  452.             if(flag)
  453.                 cout << "Некорректный номер, попробуйте ещё раз\n";
  454.         }
  455.         else
  456.         {
  457.             string type = branch[i]->get_type();
  458.             if(flag)
  459.                 cout << "Доступные изменения: \n";
  460.             if(type == "LMP")
  461.             {
  462.                 Lamp* lmp = (dynamic_cast<Lamp*>(branch[i]));
  463.                 if(flag)
  464.                 {
  465.                     cout << "Внутреннее сопротивление: сейчас" << lmp->get_r() << " Oм\n";
  466.                     cout << "Нажмите 1 для изменения внутреннего сопротивления, \n";
  467.                     cout << "        0 для выхода: ";
  468.                 }
  469.                 int answer; cin >> answer;
  470.                 switch (answer)
  471.                 {
  472.                 case 1:
  473.                     if(flag)
  474.                         cout << "Введите новое значение внутреннего сопротивления: ";
  475.                     double r; cin >> r;
  476.                     lmp->set_r(r);
  477.                     break;
  478.                 case 0:
  479.                     break;
  480.                 default:
  481.                     if(flag)
  482.                         cout << "Некорректная команда\n";
  483.                     break;
  484.                 }
  485.             }
  486.             else if(type == "RES")
  487.             {
  488.                 Resistor* res = (dynamic_cast<Resistor*>(branch[i]));
  489.                 if(flag)
  490.                 {
  491.                     cout << "Сопротивление: сейчас" << res->get_r() << " Oм\n";
  492.                     cout << "Нажмите 1 для изменения сопротивления, \n";
  493.                     cout << "        0 для выхода: ";
  494.                 }
  495.                 int answer; cin >> answer;
  496.                 switch (answer)
  497.                 {
  498.                 case 1:
  499.                     if(flag)
  500.                         cout << "Введите новое значение сопротивления: ";
  501.                     double r; cin >> r;
  502.                     res->set_r(r);
  503.                     break;
  504.                 case 0:
  505.                     break;
  506.                 default:
  507.                     if(flag)
  508.                         cout << "Некорректная команда\n";
  509.                     break;
  510.                 }
  511.             }
  512.             else if(type == "APP")
  513.             {
  514.                 Appliance* app = (dynamic_cast<Appliance*>(branch[i]));
  515.                 if(flag)
  516.                 {
  517.                     cout << "Внутреннее сопротивление: сейчас" << app->get_r() << " Oм\n";
  518.                     cout << "Необходимое напряжение: сейчас " << app->get_req_u() << " В\n";
  519.                     cout << "Необходимая сила тока: сейчас " << app->get_req_i() << " A\n";
  520.                     cout << "Возможная разница в напряжении: сейчас " << app->get_du() << " В\n";
  521.                     cout << "Возможная разница в силе тока: сейчас " << app->get_di() << " A\n";
  522.                     cout << "Нажмите 1 для изменения внутреннего сопротивления, \n";
  523.                     cout << "        2 для изменения необходимого напряжения, \n";
  524.                     cout << "        3 для изменения необходимой силы тока, \n";
  525.                     cout << "        4 для изменения возможной разницы напряжения, \n";
  526.                     cout << "        5 для изменения возможной разницы силы тока, \n";
  527.                     cout << "        0 для выхода: ";
  528.                 }
  529.                 int answer; cin >> answer;
  530.                 double u, i, r;
  531.                 switch (answer)
  532.                 {
  533.                 case 1:
  534.                     if(flag)
  535.                         cout << "Введите новое значение внутреннего сопротивления: ";
  536.                     cin >> r;
  537.                     app->set_r(r);
  538.                     break;
  539.                 case 2:
  540.                     if(flag)
  541.                         cout << "Введите новое значение необходимого напряжения: ";
  542.                     cin >> u;
  543.                     app->set_req_u(u);
  544.                     break;
  545.                 case 3:
  546.                     if(flag)
  547.                         cout << "Введите новое значение необходимой силы тока: ";
  548.                     cin >> i;
  549.                     app->set_req_i(i);
  550.                     break;
  551.                 case 4:
  552.                     if(flag)
  553.                         cout << "Введите новое значение возможной разницы напряжения: ";
  554.                     cin >> u;
  555.                     app->set_du(u);
  556.                     break;
  557.                 case 5:
  558.                     if(flag)
  559.                         cout << "Введите новое значение возможной разницы силы тока: ";
  560.                     cin >> i;
  561.                     app->set_di(i);
  562.                     break;
  563.                 case 0:
  564.                     break;
  565.                 default:
  566.                     if(flag)
  567.                         cout << "Некорректная команда\n";
  568.                     break;
  569.                 }
  570.  
  571.             }
  572.             else if(type == "CCS")
  573.             {
  574.                 CCS* ccs = (dynamic_cast<CCS*>(branch[i]));
  575.                 if(flag)
  576.                 {
  577.                     cout << "Внутреннее сопротивление: сейчас" << ccs->get_r() << " Oм\n";
  578.                     cout << "ЭДС: сейчас " << ccs->get_e() << " В\n";
  579.                     cout << "Нажмите 1 для изменения внутреннего сопротивления, \n";
  580.                     cout << "        2 для изменения ЭДС, \n";
  581.                     cout << "        0 для выхода: ";
  582.                 }
  583.                 int answer; cin >> answer;
  584.                 switch (answer)
  585.                 {
  586.                 case 1:
  587.                     if(flag)
  588.                         cout << "Введите новое значение внутреннего сопротивления: ";
  589.                     double r; cin >> r;
  590.                     ccs->set_r(r);
  591.                     break;
  592.                 case 2:
  593.                     if(flag)
  594.                         cout << "Ввeдите новое значение ЭДС: ";
  595.                     double e; cin >> e;
  596.                     ccs->set_e(e);
  597.                     break;
  598.                 case 0:
  599.                     break;
  600.                 default:
  601.                     if(flag)
  602.                         cout << "Некорректная команда\n";
  603.                     break;
  604.                 }
  605.             }
  606.             else if(type == "KEY")
  607.             {
  608.                 Key* key = (dynamic_cast<Key*>(branch[i]));
  609.                 if(flag)
  610.                     cout << "Положение ключа: сейчас ";
  611.                 if(key->get_state())
  612.                 {
  613.                     if(flag)
  614.                         cout << "закрыт\n";
  615.                 }
  616.                 else
  617.                 {
  618.                     if(flag)
  619.                         cout << "открыт\n";
  620.                 }
  621.                 if(flag)
  622.                 {
  623.                     cout << "Нажмите 1 для изменения положения ключа,\n";
  624.                     cout << "        0 для выхода: ";
  625.                 }
  626.                 int answer; cin >> answer;
  627.  
  628.                 switch (answer)
  629.                 {
  630.                 case 1:
  631.                     if(flag)
  632.                         cout << "Введите новое положение ключа (1 - закрыт, 0 - открыт): ";
  633.                     bool newstate; cin >> newstate;
  634.                     key->set_state(newstate);
  635.                 case 0:
  636.                     break;
  637.                 default:
  638.                     if(flag)
  639.                         cout << "Некоррректная команда\n";
  640.                     break;
  641.                 }
  642.             }
  643.             else
  644.             {
  645.                 if(flag)
  646.                     cout << "Программист, если ты видишь это, то все очень плохо!" << endl;
  647.             }
  648.         }
  649.     }
  650.  
  651.     int size()
  652.     {
  653.         return branch.size();
  654.     }
  655.  
  656.     bool is_shorted_path()
  657.     {
  658.         if(branch.size() == 0)
  659.             return true;
  660.         if(!this->is_locked())
  661.             return false;
  662.         for(int i = 0; i < branch.size(); i++)
  663.         {
  664.             if(branch[i]->get_type() != "KEY")
  665.                 return false;
  666.  
  667.         }
  668.         return true;
  669.     }
  670.  
  671.     void print(){
  672.         for(int i = 0; i < branch.size(); i++)
  673.             branch[i]->print();
  674.     }
  675.  
  676.     void save_in_file()
  677.     {
  678.         for(int i = 0; i < branch.size(); i++)
  679.             branch[i]->save_in_file();
  680.     }
  681.  
  682.     double get_emf()
  683.     {
  684.         double res = 0;
  685.         for(int i = 0; i < branch.size(); i++)
  686.         {
  687.             if(branch[i]->get_type() == "CCS")
  688.             {
  689.                 CCS* ccs = (dynamic_cast<CCS*>(branch[i]));
  690.                 res += ccs->get_e();
  691.             }
  692.         }
  693.         return res;
  694.     }
  695.    
  696.     void check_state(double i_power)
  697.     {
  698.         for(int i = 0; i < branch.size(); i++)
  699.         {
  700.             if(branch[i]->get_type() == "LMP")
  701.             {
  702.                 Lamp* lamp = (dynamic_cast<Lamp*>(branch[i]));
  703.                 if(i_power > 0)
  704.                     lamp->set_light(true);
  705.                 else
  706.                     lamp->set_light(false);
  707.             }
  708.             else if(branch[i]->get_type() == "APP")
  709.             {
  710.                 Appliance* app = (dynamic_cast<Appliance*>(branch[i]));
  711.                 double u = i_power * app->get_r();
  712.                 if(i <= app->get_di() + app->get_req_i() &&
  713.                    u <= app->get_du() + app->get_req_u())
  714.                     app->set_is_working(true);
  715.                 else
  716.                     app->set_is_working(false);
  717.             }
  718.         }
  719.     }
  720. };
  721.  
  722. class Subchain
  723. {
  724. protected:
  725.     vector<Branch*> subchain;
  726. public:
  727.  
  728.     void set_branch(int subchain_number, bool flag)
  729.     {
  730.         if(subchain_number == 0 && subchain.size() > 0)
  731.         {
  732.             if(flag)
  733.                 cout << "В главной цепи нельзя создавать дополнительные ветки!\n";
  734.         }
  735.         else
  736.             subchain.push_back(new Branch());
  737.     }
  738.  
  739.     void set_el(int subchain_number, bool flag, int j, int type, int place, vector<double> param)
  740.     {
  741.         if(flag)
  742.         {
  743.             cout << "В этой подцепи " << subchain.size() << " веток\n";
  744.             cout << "Введите номер ветки, куда вы хотите поместить элемент: ";
  745.         }
  746.         if(j == -1)
  747.             cin >> j;
  748.         j--;
  749.         if(j >= 0 && j < subchain.size())
  750.             subchain[j]->set_el_f(subchain_number, flag, type, place, param);
  751.         else
  752.         {
  753.             if(flag)
  754.                 cout << "Некорректный номер ветки\n";
  755.         }
  756.     }
  757.  
  758.     void change_parameters(bool flag)
  759.     {
  760.         if(flag)
  761.         {
  762.             cout << "В этой подцепи " << subchain.size() << " веток\n";
  763.             cout << "Введите номер ветке, в которой вы хотите\n";
  764.             cout << "изменить параметры элемента: ";
  765.         }
  766.         int j; cin >> j; j--;
  767.         if(j >= 0 && j < subchain.size())
  768.             subchain[j]->change_parameters(flag);
  769.         else
  770.             if(flag)
  771.                 cout << "Некорректный номер ветки\n";
  772.     }
  773.  
  774.     void remove_el()
  775.     {
  776.         cout << "В этой подцепи " << subchain.size() << " веток\n";
  777.         cout << "Введите номер ветки, в которой вы хотите удалить элемент: ";
  778.         int j; cin >> j; j--;
  779.         if(j >= 0 && j < subchain.size())
  780.             subchain[j]->remove_el_f();
  781.         else
  782.             cout << "Некорректный номер ветки\n";
  783.     }
  784.  
  785.     bool has_shorted_paths()
  786.     {
  787.         for(int i = 0; i < subchain.size(); i++)
  788.         {
  789.             if(subchain[i]->is_shorted_path())
  790.                 return true;
  791.         }
  792.         return false;
  793.     }
  794.  
  795.     double get_r_from_to(int j, int from, int to)
  796.     {
  797.         if(j == -1)
  798.         {
  799.             cout << "Введите номер ветки, где располагаются нужные для расчета элементы: ";
  800.             cin >> j; j--;
  801.         }
  802.         double res = 0;
  803.         if(j >= 0 && j < subchain.size())
  804.         {
  805.             if(from == -1 || to == -1)
  806.             {
  807.                 cout << "Введите номера элементов: от которого надо начинать расчет и\n";
  808.                 cout << "на котором расчет должен заканчиваться(включительно):";
  809.                 cin >> from >> to;
  810.             }
  811.             res = subchain[j]->get_r_from_to(from, to);
  812.         }
  813.         else
  814.             cout << "Некорректный номер ветки\n";
  815.         return res;
  816.     }
  817.  
  818.     double get_r_branch(int j)
  819.     {
  820.         if(j == -1)
  821.         {
  822.             cout << "Введите номер ветки, чье напряжение вы хотите найти: ";
  823.             cin >> j; j--;
  824.         }
  825.         double res = 0;
  826.         if(j >= 0 && j < subchain.size())
  827.             res = subchain[j]->get_r_from_to(1, subchain[j]->size());
  828.         else
  829.             cout << "Некорректный номер ветки\n";
  830.         return res;
  831.     }
  832.  
  833.     double get_r_subchain()
  834.     {
  835.         double sum = 0.0;
  836.         double sum_of_branch = 0.0;
  837.         int cnt = 0;
  838.         if(this->has_shorted_paths())
  839.             return 0;
  840.         for(int i = 0; i < subchain.size(); i++)
  841.         {
  842.             if(subchain[i]->is_locked())
  843.             {
  844.                 double r = subchain[i]->get_r_from_to(1, subchain[i]->size());
  845.                 sum_of_branch = r;
  846.                 sum += 1 / r;
  847.                 cnt++;
  848.             }
  849.         }
  850.         if(cnt == 0)
  851.             return 0;
  852.         else if(cnt == 1)
  853.             return sum_of_branch;
  854.         else
  855.             return 1 / sum;
  856.     }
  857.  
  858.     bool is_locked()
  859.     {
  860.         bool res = true;
  861.         if(!subchain.empty())
  862.         {
  863.             res = subchain[0]->is_locked();
  864.             for(int i = 1; i < subchain.size(); i++)
  865.             {
  866.                 res = res || subchain[i]->is_locked();
  867.             }
  868.         }
  869.         return res;
  870.     }
  871.  
  872.     void remove_branch()
  873.     {
  874.         cout << "В этой подцепи " << subchain.size() << " веток\n";
  875.         cout << "Введите номер удаляемой ветки: ";
  876.         int j; cin >> j; j--;
  877.         if(j >= 0 && j < subchain.size())
  878.             subchain.erase(subchain.begin() + j);
  879.         else
  880.             cout << "Некорректный номер ветки\n";
  881.     }
  882.  
  883.     int size()
  884.     {
  885.         return subchain.size();
  886.     }
  887.  
  888.     void print()
  889.     {
  890.         for(int i = 0; i < subchain.size(); i++)
  891.         {
  892.             cout << "Ветка " << i + 1 << endl;
  893.             subchain[i]->print();
  894.             cout << endl;
  895.         }
  896.     }
  897.  
  898.     void save_in_file()
  899.     {
  900.         for(int i = 0; i < subchain.size(); i++)
  901.         {
  902.             out << "Ветка " << i + 1 << endl;
  903.             subchain[i]->save_in_file();
  904.             out << endl;
  905.         }
  906.     }
  907.  
  908.     double get_emf()
  909.     {
  910.         return subchain[0]->get_emf();
  911.     }
  912.  
  913.     vector<Branch*> get_subchain()
  914.     {
  915.         return subchain;
  916.     }
  917.  
  918. };
  919.  
  920. class Chain
  921. {
  922. protected:
  923.     vector<Subchain*> chain;
  924.  
  925. public:
  926.  
  927.     void set(bool flag, int n, int i, int j, int type, int place, vector<double> param)
  928.     {
  929.         if(flag)
  930.         {
  931.             cout << "Нажмите 1, чтобы создать новую подцепь\n";
  932.             cout << "        2, чтобы создать новую ветку\n";
  933.             cout << "        3, чтобы создать новый элемент\n";
  934.             cout << "        0, чтобы выйти\n";
  935.         }
  936.         if(n == -1)
  937.             cin >> n;
  938.         if(n == 1) chain.push_back(new Subchain());
  939.         else
  940.             if(n == 2 || n == 3)
  941.             {
  942.                 if(flag)
  943.                 {
  944.                     cout << "Введите номер подцепи, где вы хотите создать ";
  945.                     if(n == 2) cout << "новую ветку: ";
  946.                     if(n == 3) cout << "новый элемент: ";
  947.                 }
  948.                 if(i == -1)
  949.                     cin >> i;
  950.                 i--;
  951.                 if(i >= 0 && i < chain.size())
  952.                 {
  953.                     if(n == 2) chain[i]->set_branch(i, flag); //
  954.                     if(n == 3) chain[i]->set_el(i, flag, j, type, place, param);
  955.                 }
  956.                 else
  957.                 {
  958.                     if(flag)
  959.                         cout << "Некорректный номер подцепи\n";
  960.                 }
  961.             }
  962.     }
  963.  
  964.     void remove()
  965.     {
  966.         map<int, pair<string, string>> m;
  967.         m[0] = make_pair("exit", "error");
  968.         m[3] = make_pair("element",
  969.             "Введите номер подцепи, где вы хотите удалить элемент: ");
  970.         m[2] = make_pair("branch",
  971.             "Введите номер подцепи, где вы хотите удалить ветку: ");
  972.         m[1] = make_pair("subchain",
  973.             "Введите номер удаляемой подцепи: ");
  974.  
  975.         cout << "Нажмите 1, чтобы удалить подцепь\n";
  976.         cout << "        2, чтобы удалить ветку\n";
  977.         cout << "        3, чтобы удалить элемент\n";
  978.         cout << "        0, чтобы выйти\n";
  979.         int n; cin >> n;
  980.         if(n > 0 && n < 4)
  981.         {
  982.             cout << m[n].second;
  983.             int i; cin >> i; i--;
  984.             if(i >= 0 && i < chain.size())
  985.             {
  986.                 if(n == 3) chain[i]->remove_el();
  987.                 else if(n == 2) chain[i]->remove_branch();
  988.                 else if(n == 1) chain.erase(chain.begin() + i);
  989.             }
  990.             else
  991.                 cout << "Incorrect number of subchain\n";
  992.         }
  993.     }
  994.  
  995.     void change_parameters(bool flag)
  996.     {
  997.         if(flag)
  998.         {
  999.             cout << "Введите номер подцепи, где вы хотите \n";
  1000.             cout << "изменить параметры элемента: ";
  1001.         }
  1002.         int i; cin >> i; i--;
  1003.         if(i >= 0 && i < chain.size())
  1004.             chain[i]->change_parameters(flag);
  1005.         else
  1006.         {
  1007.             if(flag)
  1008.                 cout << "Некорректный номер подцепи\n";
  1009.         }
  1010.     }
  1011.  
  1012.     bool is_locked()
  1013.     {
  1014.         bool res = true;
  1015.         for(int i = 0; i < chain.size(); i++)
  1016.         {
  1017.             res = res && chain[i]->is_locked();
  1018.         }
  1019.         return res;
  1020.     }
  1021.  
  1022.     double get_r_chain()
  1023.     {
  1024.         double r = 0.0;
  1025.         for(int i = 0; i < chain.size(); i++)
  1026.             r += chain[i]->get_r_subchain();
  1027.  
  1028.         return r;
  1029.     }
  1030.  
  1031.     double get_r_subchain(int i)
  1032.     {
  1033.         if(i == -1)
  1034.         {
  1035.             cout << "Введите номер подцепи, чье сопротивление вы хотите узнать: ";
  1036.             cin >> i; i--;
  1037.         }
  1038.         double r = 0;
  1039.         if(i >= 0 && i < chain.size())
  1040.             r = chain[i]->get_r_subchain();
  1041.         else
  1042.             cout << "Некорректный номер подцепи\n";
  1043.         return r;
  1044.     }
  1045.  
  1046.     double get_r_branch(int i, int j)
  1047.     {
  1048.         if(i == -1)
  1049.         {
  1050.             cout << "Введите номер подцепи, где располагается нужная ветка: ";
  1051.             cin >> i; i--;
  1052.         }
  1053.         double r = 0;
  1054.         if(i >= 0 && i < chain.size())
  1055.             r = chain[i]->get_r_branch(j);
  1056.         else
  1057.             cout << "Некорректный номер подцепи\n";
  1058.         return r;
  1059.     }
  1060.  
  1061.     double get_r_from_to(int i, int j, int from, int to)
  1062.     {
  1063.         if(i == -1)
  1064.         {
  1065.             cout << "Введите номер подцепи, где располагаются нужные элементы: ";
  1066.             cin >> i; i--;
  1067.         }
  1068.         double r = 0;
  1069.         if(i >= 0 && i < chain.size())
  1070.             r = chain[i]->get_r_from_to(j, from, to);
  1071.         else
  1072.             cout << "Некорректный номер подцепиn";
  1073.         return r;
  1074.     }
  1075.  
  1076.     void print()
  1077.     {
  1078.         check_state();
  1079.         for(int i = 0; i < chain.size(); i++)
  1080.         {
  1081.             cout << "\nПодцепь " << i + 1 << endl;
  1082.             chain[i]->print();
  1083.         }
  1084.     }
  1085.  
  1086.     double get_i(int subch, int br, bool flag)
  1087.     {
  1088.         if(subch == -1 && br == -1)
  1089.         {
  1090.             cout << "Введите координаты - номер подцепи и ветки, в которой вы хотите найти силу тока: ";
  1091.             cin >> subch >> br;
  1092.             subch--; br--;
  1093.         }
  1094.         double res = 0;
  1095.         string s = "";
  1096.         if(subch >= 0 && subch < chain.size())
  1097.         {
  1098.             if(br >= 0 && br < chain[subch]->size())
  1099.             {
  1100.                 if(this->is_locked())
  1101.                 {
  1102.                     double i_all = this->get_i_all(flag);
  1103.                     double r_subch = this->get_r_subchain(subch);
  1104.                     double r_branch = this->get_r_branch(subch, br);
  1105.                     if(r_subch == 0)
  1106.                         s = "Подцепь закорочена\n";
  1107.                     else if(r_branch == 0)
  1108.                         s = "Ветка закорочена\n";
  1109.                     else
  1110.                         res = i_all * r_subch / r_branch;
  1111.                 }
  1112.                 else
  1113.                     s = "Цепь не замкнута\n";
  1114.             }
  1115.             else
  1116.                 s = "Некорректный номер ветки\n";
  1117.         }
  1118.         else
  1119.             s = "Некорректный номер подцепи\n";
  1120.         if(flag)
  1121.             cout << s;
  1122.  
  1123.         return res;
  1124.     }
  1125.  
  1126.     double get_i_all(bool flag)
  1127.     {
  1128.         double i_all = 0;
  1129.         string s;
  1130.         if(this->is_locked())
  1131.         {
  1132.             if(chain.size())
  1133.             {
  1134.                 double r_all = this->get_r_chain();
  1135.                 double u_all = chain[0]->get_emf();
  1136.  
  1137.                 if(r_all == 0)
  1138.                 {
  1139.                     s = "Цепь закорочена\n";
  1140.                 }
  1141.                 else
  1142.                 {
  1143.                     i_all = u_all / r_all;
  1144.                 }
  1145.             }
  1146.             else
  1147.                 s = "В цепи отсутствуют источники тока\n";
  1148.         }
  1149.         else
  1150.             s = "Цепь не замкнута\n";
  1151.         if(flag)
  1152.             cout << s;
  1153.         return i_all;
  1154.     }
  1155.  
  1156.     double get_u_chain(bool flag)
  1157.     {
  1158.         double res = 0;
  1159.         if(this->is_locked())
  1160.         {
  1161.             if(chain.size())
  1162.                 res = chain[0]->get_emf();
  1163.             else
  1164.             {
  1165.                 if(flag)
  1166.                     cout << "В цепи отсутствуют источники ток\n";
  1167.             }
  1168.         }
  1169.         else
  1170.         {
  1171.             if(flag)
  1172.                 cout << "Цепь не замкнута\n";
  1173.         }
  1174.         return res;
  1175.     }
  1176.  
  1177.     double get_u_subchain(bool flag)
  1178.     {
  1179.         double res = 0;
  1180.         if(flag)
  1181.             cout << "Введите номер подцепи, напряжение на которой вы хотите найти: ";
  1182.         int subch; cin >> subch; subch--;
  1183.         if(subch >=0 && subch < chain.size())
  1184.         {
  1185.             if(this->is_locked())
  1186.             {
  1187.                 double r = this->get_r_subchain(subch);
  1188.                 if(r == 0)
  1189.                 {
  1190.                     if(flag)
  1191.                         cout << "Цепь закорочена\n";
  1192.                 }
  1193.                 else
  1194.                 {
  1195.                     double i_all = this->get_i_all(flag);
  1196.                     res = r * i_all;
  1197.                 }
  1198.             }
  1199.             else
  1200.             {
  1201.                 if(flag)
  1202.                     cout << "Цепь не замкнута\n";
  1203.             }
  1204.         }
  1205.         else
  1206.         {
  1207.             if(flag)
  1208.                 cout << "Некорректный номер подцепи\n";
  1209.         }
  1210.         return res;
  1211.     }
  1212.  
  1213.     double get_u_branch(bool flag)
  1214.     {
  1215.         if(flag)
  1216.             cout << "Введите координаты - номер подцепи и номер ветки, напряжение на которой вы хотите найти: ";
  1217.         int subch, br;
  1218.         cin >> subch >> br;
  1219.         subch--; br--;
  1220.         double i = this->get_i(subch, br, flag);
  1221.         double r = this->get_r_branch(subch, br);
  1222.         return i * r;
  1223.     }
  1224.  
  1225.     double get_u_from_to(bool flag, int subch, int br, int from, int to)
  1226.     {
  1227.         if(flag)
  1228.         {
  1229.             cout << "Введите координаты - номер подцепи, номер ветки,\т ";
  1230.             cout << "номера стартого и конечного элементов для расчетов: ";
  1231.         }
  1232.         if(subch == -1 && br == -1 && from == -1 && to == -1)
  1233.         {
  1234.             cin >> subch >> br >> from >> to;
  1235.             subch--; br--;
  1236.         }
  1237.         double i = this->get_i(subch, br, flag);
  1238.         double r = this->get_r_from_to(subch, br, from, to);
  1239.         return i * r;
  1240.     }
  1241.  
  1242.     void check_state()
  1243.     {
  1244.         for(int i = 0; i < chain.size(); i++)
  1245.         {
  1246.             vector<Branch*> v = chain[i]->get_subchain(); //i - номер подцепи
  1247.             for(int j = 0; j < v.size(); j++)
  1248.             {
  1249.                 double i_power = get_i(i, j, false);
  1250.                 v[j]->check_state(i_power);
  1251.             }
  1252.         }
  1253.     }
  1254.  
  1255.     void load_from_file()
  1256.     {
  1257.         ifstream in;
  1258.         in.open("in.txt");
  1259.         string s;
  1260.         int cur_subchain = -1, cur_branch = -1;
  1261.         while(in >> s)
  1262.         {
  1263.             if(s == "Подцепь")
  1264.             {
  1265.                 in >> cur_subchain;
  1266.                 set(false, 1, -1, -1, -1, -1, vector<double>());
  1267.             }
  1268.             else if(s == "Ветка")
  1269.             {
  1270.                 in >> cur_branch;
  1271.                 set(false, 2, cur_subchain, -1, -1, -1, vector<double>());
  1272.             }
  1273.             else if(s == "LMP")
  1274.             {
  1275.                 vector<double> param(1);
  1276.                 in >> param[0];
  1277.                 set(false, 3, cur_subchain, cur_branch, 1, 1, param);
  1278.             }
  1279.             else if(s == "RES")
  1280.             {
  1281.                 vector<double> param(1);
  1282.                 in >> param[0];
  1283.                 set(false, 3, cur_subchain, cur_branch, 2, 1, param);
  1284.             }
  1285.             else if(s == "APP")
  1286.             {
  1287.                 vector<double> param(5);
  1288.                 in >> param[0] >> param[1] >> param[2] >> param[3] >> param[4];
  1289.                 set(false, 3, cur_subchain, cur_branch, 3, 1, param);
  1290.             }
  1291.             else if(s == "CCS")
  1292.             {
  1293.                 vector<double> param(2);
  1294.                 in >> param[0] >> param[1];
  1295.                 set(false, 3, cur_subchain, cur_branch, 4, 1, param);
  1296.             }
  1297.             else if(s == "KEY")
  1298.             {
  1299.                 vector<double> param(1);
  1300.                 in >> param[0];
  1301.                 set(false, 3, cur_subchain, cur_branch, 5, 1, param);
  1302.             }
  1303.             else if(s.find("Цепь_номер") == string::npos)
  1304.                 break;
  1305.  
  1306.         }
  1307.     }
  1308.  
  1309.     void save_in_file()
  1310.     {
  1311.         check_state();
  1312.         for(int i = 0; i < chain.size(); i++)
  1313.         {
  1314.             out << "Подцепь " << i + 1 << endl;
  1315.             chain[i]->save_in_file();
  1316.         }
  1317.     }
  1318. };
  1319.  
  1320. int main()
  1321. {
  1322.    
  1323.     out.open("out.txt");
  1324.     in.open("in.txt");
  1325.     setlocale(LC_ALL, "Russian");
  1326.     Chain* chain = new Chain();
  1327.  
  1328.     int n = 1, cnt = 0;
  1329.     while(n != 0)
  1330.     {
  1331.         cout << "\nНажмите \n";
  1332.         cout << "1  - создание (подцепи, ветки, элемента)\n";
  1333.         cout << "2  - проверка цепи на замкнутость\n";
  1334.         cout << "3  - удаление (подцепи, ветки, элемента)\n";
  1335.         cout << "4  - изменение параметров\n";
  1336.         cout << "5  - вывод на экран\n";
  1337.         cout << "6  - получить сопротивление всей цепи\n";
  1338.         cout << "7  - получить сопротивление подцепи\n";
  1339.         cout << "8  - получить сопротивление ветки\n";
  1340.         cout << "9  - получить сопротивление на отрезке ветки\n";
  1341.         cout << "10 - получить общую силу тока в цепи\n";
  1342.         cout << "11 - получить силу тока на произвольной ветке\n";
  1343.         cout << "12 - получить напряжение на цепи\n";
  1344.         cout << "13 - получить напряжение на подцепи\n";
  1345.         cout << "14 - получить напряжение на ветке\n";
  1346.         cout << "15 - получить напряжение на отрезке ветки\n";
  1347.         cout << "16 - загрузить из файла\n";
  1348.         cout << "17 - сохранить в файл\n";
  1349.         cout << "0  - выход\n";
  1350.         cin >> n;
  1351.  
  1352.         switch (n)
  1353.         {
  1354.         case 0:
  1355.             break;
  1356.         case 1:
  1357.             chain->set(true, -1, -1, -1, -1, -1, vector<double>());
  1358.             break;
  1359.         case 2:
  1360.             if(chain->is_locked())
  1361.                 cout << "Цепь замкнута" << endl;
  1362.             else
  1363.                 cout << "Цепь разомкнута" << endl;
  1364.             break;
  1365.         case 3:
  1366.             chain->remove();
  1367.             break;
  1368.         case 4:
  1369.             chain->change_parameters(true);
  1370.             break;
  1371.         case 5:
  1372.             chain->print();
  1373.             break;
  1374.         case 6:
  1375.             cout << chain->get_r_chain() << " Ом" << endl;
  1376.             break;
  1377.         case 7:
  1378.             cout << chain->get_r_subchain(-1) << " Ом" << endl;
  1379.             break;
  1380.         case 8:
  1381.             cout << chain->get_r_branch(-1, -1) << " Ом" << endl;
  1382.             break;
  1383.         case 9:
  1384.             cout << chain->get_r_from_to(-1, -1, -1, -1) << " Ом" << endl;
  1385.             break;
  1386.         case 10:
  1387.             cout << chain->get_i_all(true) << " А" << endl;
  1388.             break;
  1389.         case 11:
  1390.             cout << chain->get_i(-1, -1, true) << " А" << endl;
  1391.             break;
  1392.         case 12:
  1393.             cout << chain->get_u_chain(true) << " В" << endl;
  1394.             break;
  1395.         case 13:
  1396.             cout << chain->get_u_subchain(true) << " В" << endl;
  1397.             break;
  1398.         case 14:
  1399.             cout << chain->get_u_branch(true) << " В" << endl;
  1400.             break;
  1401.         case 15:
  1402.             cout << chain->get_u_from_to(true, -1, -1, -1, -1) << " В" << endl;
  1403.             break;
  1404.         case 16:
  1405.             chain->load_from_file();
  1406.             cout << "Цепь загружена из файла" << endl;
  1407.             break;
  1408.         case 17:
  1409.             cnt++;
  1410.             out << "Цепь_номер_" << cnt << "\n";
  1411.             chain->save_in_file();
  1412.             cout << "Цепь сохранена в файле" << endl;
  1413.             break;
  1414.  
  1415.         default:
  1416.             cout << "Некорректный номер команды, попробуй ещё раз\n";
  1417.             break;
  1418.         }
  1419.     }
  1420.     cout << "Программа завершена успешно\n";
  1421.     system("pause");
  1422.     return 0;
  1423. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement