Advertisement
Guest User

Untitled

a guest
Jun 12th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 24.19 KB | None | 0 0
  1. #include <iostream>
  2. #include <ctime>
  3. #include <vector>
  4. #include <string>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. class Virus {
  10. private:
  11.     string name;
  12.     int spreadingWay, mortality, infect, incubationPeriod, duration, panDur, sNum, survived = 0;
  13.     int infected = 1;
  14.     Virus* next = nullptr;
  15.     vector<string> arr = { "воздушно-капельный", "пищевой", "трансмиссивный", "половой", "через кожу" };
  16.     vector<string> surnames = { "fulica", "tristis", "coqui", "niloticus", "salmoides", "cuniculus", "cafer", "trutta", "scrofa", "auropunctata", "vulgaris", "benghalensis", "europaeus" };
  17.  
  18. public:
  19.     static int count;
  20.     static unsigned long long int population;
  21.     bool isMarked = false;
  22.  
  23.     void setName() {
  24.         vector<string> arr;
  25.         string temp;
  26.         ifstream file;
  27.  
  28.         file.open("names.txt", ios::in);
  29.         while (!file.eof()) {
  30.             file >> temp;
  31.             arr.push_back(temp);
  32.         }
  33.         file.close();
  34.         name = arr[rand() % arr.size()] + " " + surnames[rand() % surnames.size()];
  35.     }
  36.  
  37.     void setSpreadingWay(int s) {
  38.         s ? spreadingWay = s : spreadingWay = rand() % arr.size();
  39.     }
  40.  
  41.     void setInfect(int i) {
  42.         i ? infect = i : infect = (50 + rand() % 51);
  43.     }
  44.  
  45.     void setMortRate(int m) {
  46.         int setMortality = rand() % 101;
  47.         if (setMortality <= 65 && rand() % 6) {
  48.             setMortality = (65 + rand() % 36);
  49.         }
  50.         m ? mortality = m : mortality = setMortality;
  51.     }
  52.  
  53.     void setIncubPeriod(int in) {
  54.         in ? incubationPeriod = in : incubationPeriod = (1 + rand() % 9);
  55.     }
  56.  
  57.     void setDuration(int d) {
  58.         d ? duration = d : duration = (8 + rand() % 38);
  59.     }
  60.  
  61.     void setPanDur() {
  62.         int* inf = new int[duration];
  63.         while (infected > 0 || population > 0) {
  64.             switch (spreadingWay) {
  65.             case 0: infected += infected * 100 * infect; break;
  66.             case 1: infected += infected * 10 * infect; break;
  67.             case 2: infected += infected * 2 * infect; break;
  68.             case 3: infected += infected * 5 * infect; break;
  69.             case 4: infected += infected * 50 * infect; break;
  70.             }
  71.             for (int i = 0; i < duration; i++) {
  72.                 inf[i] += infected;
  73.             }
  74.             for (int i = 0; i < duration; i++) {
  75.                 if (rand() % 101 > mortality) {
  76.                     survived += inf[i];
  77.                     inf[i] = 0;
  78.                 } else {
  79.                     inf[i] -= inf[i] * mortality / 100;
  80.                 }
  81.             }
  82.             population -= infected + survived;
  83.             panDur++;
  84.         }
  85.         delete[] inf;
  86.     }
  87.  
  88.     void setCount() {
  89.         count++;
  90.         sNum = count;
  91.     }
  92.  
  93.     void setNext(Virus* next_v) {
  94.         next = next_v;
  95.     }
  96.  
  97.     void removeCount() {
  98.         count--;
  99.     }
  100.  
  101.     Virus* getNext() {
  102.         return next;
  103.     }
  104.  
  105.     int getSerNum() {
  106.         return sNum;
  107.     }
  108.  
  109.     string getName() {
  110.         return name;
  111.     }
  112.  
  113.     string getSpreadingWay() {
  114.         return arr[spreadingWay];
  115.     }
  116.  
  117.     int getSpreadingInt() {
  118.         return spreadingWay;
  119.     }
  120.  
  121.     int getsurvived() {
  122.         return survived;
  123.     }
  124.  
  125.     int getInfect() {
  126.         return infect;
  127.     }
  128.  
  129.     int getMortRate() {
  130.         return mortality;
  131.     }
  132.  
  133.     int getIncubPeriod() {
  134.         return incubationPeriod;
  135.     }
  136.  
  137.     int getDuration() {
  138.         return duration;
  139.     }
  140.  
  141.     int getPanDur() {
  142.         return panDur;
  143.     }
  144.  
  145.     void Print() {
  146.         cout << "Порядковый номер: " << sNum << endl;
  147.         cout << "Имя: " << name << endl;
  148.         cout << "Способ распостранения: " << getSpreadingWay() << endl;
  149.         cout << "Процент заразности: " << infect << "%" << endl;
  150.         cout << "Процент смертности: " << mortality << "%" << endl;
  151.         cout << "Инкубационный период (дни): " << incubationPeriod << "d." << endl;
  152.         cout << "Продолжительность болезни (дни): " << duration << "d." << endl;
  153.         cout << "Продожительность пандемии (дни): " << panDur << "d." << endl;
  154.         cout << "Население: " << population << endl;
  155.         cout << "Выжившие: " << survived << endl;
  156.         cout << endl;
  157.     }
  158.  
  159.     Virus() {
  160.         setName();
  161.         setSpreadingWay(0);
  162.         setInfect(0);
  163.         setMortRate(0);
  164.         setIncubPeriod(0);
  165.         setDuration(0);
  166.         setPanDur();
  167.  
  168.         setCount();
  169.     }
  170.  
  171.     ~ Virus() {
  172.         removeCount();
  173.     }
  174. };
  175.  
  176. int Virus::count = 0;
  177. unsigned long long int Virus::population = 0;
  178.  
  179. class List {
  180. private:
  181.     Virus* start;
  182.     int size = 0;
  183.     Virus* end;
  184. public:
  185.     void push(Virus* virus) {
  186.         if (size == 0) {
  187.             start = virus;
  188.             end = virus;
  189.             virus->setNext(virus);
  190.             size++;
  191.         } else {
  192.             end->setNext(virus);
  193.             virus->setNext(start);
  194.             end = virus;
  195.             size++;
  196.         }
  197.     }
  198.  
  199.     void print() {
  200.         Virus* now = start;
  201.         for (int i = 0; i < size; i++) {
  202.             now->Print();
  203.             now = now->getNext();
  204.         }
  205.     }
  206.  
  207.     void printFeature(int num) {
  208.         Virus* now = start;
  209.         switch (num) {
  210.         case 1:
  211.         case 2:
  212.             int percent;
  213.             cout << "Введите процент. Отобразятся все экземпляры, которые имеют такой же процент, или ниже: ";
  214.             do {
  215.                 cin >> percent;
  216.                 if (percent > 100 || percent < 0) {
  217.                     cout << "Введено неверное число!" << endl;
  218.                     cout << "Введите процент: ";
  219.                 }
  220.             } while (percent > 100 || percent < 0);
  221.             system("cls");
  222.             for (int i = 0; i < size; i++) {
  223.                 if (percent >= now->getInfect() && num == 1) {
  224.                     now->Print();
  225.                 } else if (percent >= now->getMortRate() && num == 2) {
  226.                     now->Print();
  227.                 }
  228.                 now = now->getNext();
  229.             }
  230.             break;
  231.         case 3:
  232.         case 4:
  233.         case 5:
  234.             int days;
  235.             cout << "Введите кол-во дней. Отобразятся все экземпляры, которые имеют такую продолжительность какого либо параметра или ниже: ";
  236.             do {
  237.                 cin >> days;
  238.                 if (days > 45 || days < 1) { // PANDUR СДЕЛАЕШЬ -> ПЕРЕСМОТРИ TODO TODO TODO
  239.                     cout << "Введено неверное число" << endl;
  240.                     cout << "Введите кол-во дней: ";
  241.                 }
  242.             } while (days > 45 || days < 1); // PANDUR СДЕЛАЕШЬ -> ПЕРЕСМОТРИ TODO TODO TODO
  243.             system("cls");
  244.             for (int i = 0; i < size; i++) {
  245.                 if (days >= now->getDuration() && num == 3) {
  246.                     now->Print();
  247.                 } else if (days >= now->getIncubPeriod() && num == 5) {
  248.                     now->Print();
  249.                 } else if (days >= now->getPanDur() && num == 4) {
  250.                     now->Print();
  251.                 }
  252.                 now = now->getNext();
  253.             }
  254.             break;
  255.         case 6:
  256.             int sWay;
  257.             system("cls");
  258.             cout << "Виды распостранения:" << endl;
  259.             cout << "1. воздушно-капельный\n2. пищевой\n3. трансмиссивный\n4. половой\n5. через кожу" << endl;
  260.             cout << "Введите способ распостранения. Отобразятся все экземпляры с таким способом: ";
  261.             do {
  262.                 cin >> sWay;
  263.                 sWay--;
  264.                 if (sWay > 5 || sWay < 0) {
  265.                     cout << "Введен неверный номер" << endl;
  266.                     cout << "Введите номер: " << endl;
  267.                 }
  268.             } while (sWay > 5 || sWay < 0);
  269.             system("cls");
  270.             for (int i = 0; i < size; i++) {
  271.                 if (sWay == now->getSpreadingInt()) {
  272.                     now->Print();
  273.                 }
  274.                 now = now->getNext();
  275.             }
  276.             break;
  277.         }
  278.     }
  279.  
  280.     void del(int num) {
  281.         num--;
  282.         Virus* del;
  283.         if (num == 0) {
  284.             del = start;
  285.             start = start->getNext();
  286.             end->setNext(start);
  287.             del->removeCount();
  288.             delete del;
  289.         } else {
  290.             Virus* now = start;
  291.             for (int i = 0; i < num - 1; i++) {
  292.                 now = now->getNext();
  293.             }
  294.             del = now->getNext();
  295.             now->setNext(del->getNext());
  296.             del->removeCount();
  297.             delete del;
  298.             if (num == size - 1) {
  299.                 end = now;
  300.             }
  301.         }
  302.         size--;
  303.     }
  304.  
  305.     void sort() {
  306.         Virus* now = start;
  307.         int sortNum = 0;
  308.         bool isSorted = false;
  309.         int small = now->getsurvived();
  310.         while (!isSorted) {
  311.             now = start;
  312.             for (int i = 0; i < size; i++) {
  313.                 if (!(now->isMarked) && small < now->getsurvived()) {
  314.                     small = now->getsurvived();
  315.                 }
  316.                 now = now->getNext();
  317.             }
  318.  
  319.             now = start;
  320.             for (int i = 0; i < size; i++) {
  321.                 if (!(now->isMarked) && small > now->getsurvived()) {
  322.                     small = now->getsurvived();
  323.                 }
  324.                 now = now->getNext();
  325.             }
  326.  
  327.             now = start;
  328.             for (int i = 0; i < size; i++) {
  329.                 if (!(now->isMarked) && small == now->getsurvived()) {
  330.                     now->Print();
  331.                     now->isMarked = true;
  332.                 }
  333.                 now = now->getNext();
  334.             }
  335.  
  336.             now = start;
  337.             sortNum = 0;
  338.             for (int i = 0; i < size; i++) {
  339.                 if (now->isMarked) {
  340.                     sortNum++;
  341.                 }
  342.                 now = now->getNext();
  343.             }
  344.  
  345.             if (sortNum == size) {
  346.                 isSorted = true;
  347.             }
  348.         }
  349.  
  350.         now = start;
  351.         for (int i = 0; i < size; i++) {
  352.             now->isMarked = false;
  353.             now = now->getNext();
  354.         }
  355.     }
  356.  
  357.  
  358.     void clist(int num) {
  359.         num--;
  360.         Virus* now = start;
  361.         for (int i = 0; i <= num - 1; i++) {
  362.             now = now->getNext();
  363.         }
  364.         for (int i = 0; i < size; i++) {
  365.             now->Print();
  366.             now = now->getNext();
  367.         }
  368.     }
  369.  
  370.     Virus* getEnd() {
  371.         return end;
  372.     }
  373.  
  374.     void getSerNum(int sNum) {
  375.         Virus* now = start;
  376.         for (int i = 0; i < size; i++) {
  377.             if (sNum == now->getSerNum()) {
  378.                 now->Print();
  379.                 break;
  380.             } else {
  381.                 now = now->getNext();
  382.             }
  383.         }
  384.     }
  385.  
  386.     int getsize() {
  387.         return size;
  388.     }
  389. };
  390.  
  391.  
  392. int main() {
  393.     setlocale(LC_ALL, "Russian");
  394.     srand(time(0));
  395.     int set, choose, amount = 0;
  396.     int p = 0;
  397.     List* viruses = new List();
  398.  
  399.     do {
  400.         cout << "1. Создать экземпляры класса" << endl;
  401.         cout << "2. Вывод всех экземпляров по порядку" << endl;
  402.         cout << "3. Вывод экземпляра с заданным порядковым номером" << endl;
  403.         cout << "4. Вывод всех экземпляров, отсортированных по пережившим" << endl;
  404.         cout << "5. Вывод всех экземпляров по кругу, начиная с указанного" << endl;
  405.         cout << "6. Вывод экземпляров по различным признакам" << endl;
  406.         cout << "7. Добавление/yдаление экземпляров" << endl;
  407.         cout << "8. О программе" << endl;
  408.         cout << "0. Выйти\n" << endl;
  409.         cout << "Введите номер действия: ";
  410.         do {
  411.             cin >> set;
  412.             if (set > 9 || set < 0) {
  413.                 cout << "Введено неверное число" << endl;
  414.                 cout << "Введите номер действия: ";
  415.             }
  416.         } while (set > 9);
  417.         switch (set) {
  418.         case 1:
  419.             do {
  420.                 cout << "Введите количество экземпляров (не больше 20): ";
  421.                 cin >> amount;
  422.                 if (amount > 20) {
  423.                     cout << "Число должно быть не больше 20" << endl;
  424.                 } else if (amount < 0) {
  425.                     cout << "Число не должно быть меньше нуля" << endl;
  426.                 }
  427.             } while (amount > 20 || amount < 0);
  428.             if (!p) {
  429.                 do {
  430.                     cout << "Введите кол-во людей: ";
  431.                     cin >> p;
  432.                     if (p <= 0) {
  433.                         cout << "Число не может быть отрицательным/быть равным нулю." << endl;
  434.                     }
  435.                 } while (p <= 0);
  436.                 Virus::population = p;
  437.             }
  438.             for (int i = 0; i < amount; i++) {
  439.                 viruses->push(new Virus);
  440.             }
  441.             cout << "Created!" << endl;
  442.             getchar();
  443.             cin.get();
  444.             system("cls");
  445.             break;
  446.         case 2:
  447.             if (viruses->getsize() > 0) {
  448.                 system("cls");
  449.                 viruses->print();
  450.             } else {
  451.                 cout << "Тут пусто..." << endl;
  452.             }
  453.             getchar();
  454.             cin.get();
  455.             system("cls");
  456.             break;
  457.         case 3:
  458.             int sNum;
  459.             if (viruses->getsize() > 0) {
  460.                 system("cls");
  461.                 do {
  462.                     cout << "Введите номер экземпляра: ";
  463.                     cin >> sNum;
  464.                     if (sNum > viruses->getsize() || sNum <= 0) {
  465.                         cout << "Экземпляра с таким порядковым номером не существует" << endl;
  466.                     } else {
  467.                         viruses->getSerNum(sNum);
  468.                     }
  469.                 } while (sNum > viruses->getsize() || sNum <= 0);
  470.                 getchar();
  471.                 cin.get();
  472.                 system("cls");
  473.                 break;
  474.             } else {
  475.                 cout << "Тут пусто..." << endl;
  476.                 getchar();
  477.                 cin.get();
  478.                 system("cls");
  479.                 break;
  480.             }
  481.         case 4:
  482.             if (viruses->getsize() > 0) {
  483.                 system("cls");
  484.                 viruses->sort();
  485.             } else {
  486.                 cout << "Тут пусто..." << endl;
  487.             }
  488.             getchar();
  489.             cin.get();
  490.             system("cls");
  491.             break;
  492.         case 5:
  493.             if (viruses->getsize() > 0) {
  494.                 system("cls");
  495.                 do {
  496.                     cout << "Введите номер экземпляра, с которого хотите начать отображение массива: ";
  497.                     cin >> choose;
  498.                     if (choose > viruses->getsize()) {
  499.                         cout << "Экземпляр за пределами массива" << endl;
  500.                     } else if (choose <= 0) {
  501.                         cout << "Экземпляр не может быть отрицательным или равным нулю" << endl;
  502.                     } else {
  503.                         viruses->clist(choose);
  504.                     }
  505.                 } while (choose > viruses->getsize() || choose <= 0);
  506.             } else {
  507.                 cout << "Тут пусто..." << endl;
  508.             }
  509.             getchar();
  510.             cin.get();
  511.             system("cls");
  512.             break;
  513.         case 6:
  514.             if (viruses->getsize() > 0) {
  515.                 system("cls");
  516.                 cout << "1. Вывод процента заразности" << endl;
  517.                 cout << "2. Вывод процента смертности" << endl;
  518.                 cout << "3. Вывод продолжительности болезни" << endl;
  519.                 cout << "4. Вывод продолжительности панадемии" << endl;
  520.                 cout << "5. Вывод продолжительности инкубационного периода" << endl;
  521.                 cout << "6. Вывод способа распостранения" << endl;
  522.                 do {
  523.                     cout << "Введите номер действия: ";
  524.                     cin >> choose;
  525.                     if (choose > 6 || choose <= 0) {
  526.                         cout << "Введено неверное число" << endl;
  527.                     }
  528.                 } while (choose > 6 || choose <= 0);
  529.                 viruses->printFeature(choose);
  530.             } else {
  531.                 cout << "Тут пусто..." << endl;
  532.             }
  533.             getchar();
  534.             cin.get();
  535.             system("cls");
  536.             break;
  537.         case 7:
  538.             system("cls");
  539.             do {
  540.                 cout << "1. Добавить экземпляр\n2. Удалить экземпляр\nВведите номер действия: ";
  541.                 cin >> choose;
  542.                 if (choose < 1 || choose > 2) {
  543.                     cout << "\nВыберите из предложенных вариантов!\n" << endl;
  544.                 } else if (choose == 2 && viruses->getsize() == 0) {
  545.                     cout << "Удалять нечего :(" << endl;
  546.                     getchar();
  547.                     cin.get();
  548.                     system("cls");
  549.                 } else {
  550.                     switch (choose) {
  551.                     case 1:
  552.                         int ch;
  553.                         viruses->push(new Virus);
  554.                         if (p) {
  555.                             viruses->getEnd()->Print();
  556.                         } else {
  557.                             do {
  558.                                 cout << "Введите кол-во людей: ";
  559.                                 cin >> p;
  560.                                 if (p <= 0) {
  561.                                     cout << "Число не может быть отрицательным/быть равным нулю." << endl;
  562.                                 }
  563.                             } while (p <= 0);
  564.                             Virus::population = p;
  565.                             viruses->getEnd()->Print();
  566.                         }
  567.                         cout << "Хотите изменить какие-то поля программы?\n0. Нет\n1. Да\n";
  568.                         cout << "Введите номер действия: ";
  569.                         cin >> ch;
  570.                         if (ch == 1) {
  571.                             system("cls");
  572.                             int f;
  573.                             cout << "1. Изменить процент заразности" << endl;
  574.                             cout << "2. Изменить процент смертности" << endl;
  575.                             cout << "3. Изменить длительность инкубационного периода" << endl;
  576.                             cout << "4. Изменить длительность болезни" << endl;
  577.                             cout << "5. Изменить способо распостранения" << endl;
  578.                             cout << "0. Выйти в основное меню" << endl;
  579.                             do {
  580.                                 cout << "Введите номер действия: ";
  581.                                 cin >> f;
  582.                                 if (f < 0 || f > 5) {
  583.                                     cout << "Введено неверное число" << endl;
  584.                                 } else {
  585.                                     switch (f) {
  586.                                     case 1:
  587.                                         int i;
  588.                                         cout << "Процент заразности: ";
  589.                                         cin >> i;
  590.                                         viruses->getEnd()->setInfect(i);
  591.                                         break;
  592.                                     case 2:
  593.                                         int m;
  594.                                         cout << "Процент смертности: ";
  595.                                         cin >> m;
  596.                                         viruses->getEnd()->setMortRate(m);
  597.                                         break;
  598.                                     case 3:
  599.                                         int in;
  600.                                         cout << "Инкубационный период (дни): ";
  601.                                         cin >> in;
  602.                                         viruses->getEnd()->setIncubPeriod(in);
  603.                                         break;
  604.                                     case 4:
  605.                                         int d;
  606.                                         cout << "Продолжительность болезни (дни): ";
  607.                                         cin >> d;
  608.                                         viruses->getEnd()->setDuration(d);
  609.                                         break;
  610.                                     case 5:
  611.                                         int s;
  612.                                         cout << "Виды распостранения:" << endl;
  613.                                         cout << "1. воздушно-капельный\n2. пищевой\n3. трансмиссивный\n4. половой\n5. через кожу" << endl;
  614.                                         do {
  615.                                             cout << "Введите номер: ";
  616.                                             cin >> s;
  617.                                             if (s < 0 || s > 5)
  618.                                                 cout << "Вы ввели неверный номер" << endl;
  619.                                         } while (s < 0 || s > 5);
  620.                                         viruses->getEnd()->setSpreadingWay(s - 1);
  621.                                         viruses->getEnd()->setPanDur();
  622.                                         break;
  623.                                     }
  624.                                 }
  625.                             } while (f != 0);
  626.                         }
  627.                         system("cls");
  628.                         break;
  629.                     case 2:
  630.                         int number;
  631.                         do {
  632.                             cout << "Введите номер экземпляра: ";
  633.                             cin >> number;
  634.                             if (number > viruses->getsize() || number < 0) {
  635.                                 cout << "Введен неверный номер экземпляра" << endl;
  636.                             }
  637.                         } while (number > viruses->getsize() || number < 0);
  638.                         viruses->del(number);
  639.                         cout << "Данные удалены!" << endl;
  640.                         getchar();
  641.                         cin.get();
  642.                         system("cls");
  643.                         break;
  644.                     }
  645.                 }
  646.             } while (choose < 1 || choose > 2);
  647.             break;
  648.         case 8:
  649.             system("cls");
  650.             cout << "Создатель:\nТарас Букша\nГруппа:\nОПК-227" << endl;
  651.             getchar();
  652.             cin.get();
  653.             system("cls");
  654.             break;
  655.         }
  656.     } while (set != 0);
  657.  
  658.     return 0;
  659. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement