Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <ctime>
- #include <vector>
- #include <string>
- #include <fstream>
- using namespace std;
- class Virus {
- private:
- string name;
- int spreadingWay, mortality, infect, incubationPeriod, duration, panDur, sNum, survived = 0;
- int infected = 1;
- Virus* next = nullptr;
- vector<string> arr = { "воздушно-капельный", "пищевой", "трансмиссивный", "половой", "через кожу" };
- vector<string> surnames = { "fulica", "tristis", "coqui", "niloticus", "salmoides", "cuniculus", "cafer", "trutta", "scrofa", "auropunctata", "vulgaris", "benghalensis", "europaeus" };
- public:
- static int count;
- static unsigned long long int population;
- bool isMarked = false;
- void setName() {
- vector<string> arr;
- string temp;
- ifstream file;
- file.open("names.txt", ios::in);
- while (!file.eof()) {
- file >> temp;
- arr.push_back(temp);
- }
- file.close();
- name = arr[rand() % arr.size()] + " " + surnames[rand() % surnames.size()];
- }
- void setSpreadingWay(int s) {
- s ? spreadingWay = s : spreadingWay = rand() % arr.size();
- }
- void setInfect(int i) {
- i ? infect = i : infect = (50 + rand() % 51);
- }
- void setMortRate(int m) {
- int setMortality = rand() % 101;
- if (setMortality <= 65 && rand() % 6) {
- setMortality = (65 + rand() % 36);
- }
- m ? mortality = m : mortality = setMortality;
- }
- void setIncubPeriod(int in) {
- in ? incubationPeriod = in : incubationPeriod = (1 + rand() % 9);
- }
- void setDuration(int d) {
- d ? duration = d : duration = (8 + rand() % 38);
- }
- void setPanDur() {
- int* inf = new int[duration];
- while (infected > 0 || population > 0) {
- switch (spreadingWay) {
- case 0: infected += infected * 100 * infect; break;
- case 1: infected += infected * 10 * infect; break;
- case 2: infected += infected * 2 * infect; break;
- case 3: infected += infected * 5 * infect; break;
- case 4: infected += infected * 50 * infect; break;
- }
- for (int i = 0; i < duration; i++) {
- inf[i] += infected;
- }
- for (int i = 0; i < duration; i++) {
- if (rand() % 101 > mortality) {
- survived += inf[i];
- inf[i] = 0;
- } else {
- inf[i] -= inf[i] * mortality / 100;
- }
- }
- population -= infected + survived;
- panDur++;
- }
- delete[] inf;
- }
- void setCount() {
- count++;
- sNum = count;
- }
- void setNext(Virus* next_v) {
- next = next_v;
- }
- void removeCount() {
- count--;
- }
- Virus* getNext() {
- return next;
- }
- int getSerNum() {
- return sNum;
- }
- string getName() {
- return name;
- }
- string getSpreadingWay() {
- return arr[spreadingWay];
- }
- int getSpreadingInt() {
- return spreadingWay;
- }
- int getsurvived() {
- return survived;
- }
- int getInfect() {
- return infect;
- }
- int getMortRate() {
- return mortality;
- }
- int getIncubPeriod() {
- return incubationPeriod;
- }
- int getDuration() {
- return duration;
- }
- int getPanDur() {
- return panDur;
- }
- void Print() {
- cout << "Порядковый номер: " << sNum << endl;
- cout << "Имя: " << name << endl;
- cout << "Способ распостранения: " << getSpreadingWay() << endl;
- cout << "Процент заразности: " << infect << "%" << endl;
- cout << "Процент смертности: " << mortality << "%" << endl;
- cout << "Инкубационный период (дни): " << incubationPeriod << "d." << endl;
- cout << "Продолжительность болезни (дни): " << duration << "d." << endl;
- cout << "Продожительность пандемии (дни): " << panDur << "d." << endl;
- cout << "Население: " << population << endl;
- cout << "Выжившие: " << survived << endl;
- cout << endl;
- }
- Virus() {
- setName();
- setSpreadingWay(0);
- setInfect(0);
- setMortRate(0);
- setIncubPeriod(0);
- setDuration(0);
- setPanDur();
- setCount();
- }
- ~ Virus() {
- removeCount();
- }
- };
- int Virus::count = 0;
- unsigned long long int Virus::population = 0;
- class List {
- private:
- Virus* start;
- int size = 0;
- Virus* end;
- public:
- void push(Virus* virus) {
- if (size == 0) {
- start = virus;
- end = virus;
- virus->setNext(virus);
- size++;
- } else {
- end->setNext(virus);
- virus->setNext(start);
- end = virus;
- size++;
- }
- }
- void print() {
- Virus* now = start;
- for (int i = 0; i < size; i++) {
- now->Print();
- now = now->getNext();
- }
- }
- void printFeature(int num) {
- Virus* now = start;
- switch (num) {
- case 1:
- case 2:
- int percent;
- cout << "Введите процент. Отобразятся все экземпляры, которые имеют такой же процент, или ниже: ";
- do {
- cin >> percent;
- if (percent > 100 || percent < 0) {
- cout << "Введено неверное число!" << endl;
- cout << "Введите процент: ";
- }
- } while (percent > 100 || percent < 0);
- system("cls");
- for (int i = 0; i < size; i++) {
- if (percent >= now->getInfect() && num == 1) {
- now->Print();
- } else if (percent >= now->getMortRate() && num == 2) {
- now->Print();
- }
- now = now->getNext();
- }
- break;
- case 3:
- case 4:
- case 5:
- int days;
- cout << "Введите кол-во дней. Отобразятся все экземпляры, которые имеют такую продолжительность какого либо параметра или ниже: ";
- do {
- cin >> days;
- if (days > 45 || days < 1) { // PANDUR СДЕЛАЕШЬ -> ПЕРЕСМОТРИ TODO TODO TODO
- cout << "Введено неверное число" << endl;
- cout << "Введите кол-во дней: ";
- }
- } while (days > 45 || days < 1); // PANDUR СДЕЛАЕШЬ -> ПЕРЕСМОТРИ TODO TODO TODO
- system("cls");
- for (int i = 0; i < size; i++) {
- if (days >= now->getDuration() && num == 3) {
- now->Print();
- } else if (days >= now->getIncubPeriod() && num == 5) {
- now->Print();
- } else if (days >= now->getPanDur() && num == 4) {
- now->Print();
- }
- now = now->getNext();
- }
- break;
- case 6:
- int sWay;
- system("cls");
- cout << "Виды распостранения:" << endl;
- cout << "1. воздушно-капельный\n2. пищевой\n3. трансмиссивный\n4. половой\n5. через кожу" << endl;
- cout << "Введите способ распостранения. Отобразятся все экземпляры с таким способом: ";
- do {
- cin >> sWay;
- sWay--;
- if (sWay > 5 || sWay < 0) {
- cout << "Введен неверный номер" << endl;
- cout << "Введите номер: " << endl;
- }
- } while (sWay > 5 || sWay < 0);
- system("cls");
- for (int i = 0; i < size; i++) {
- if (sWay == now->getSpreadingInt()) {
- now->Print();
- }
- now = now->getNext();
- }
- break;
- }
- }
- void del(int num) {
- num--;
- Virus* del;
- if (num == 0) {
- del = start;
- start = start->getNext();
- end->setNext(start);
- del->removeCount();
- delete del;
- } else {
- Virus* now = start;
- for (int i = 0; i < num - 1; i++) {
- now = now->getNext();
- }
- del = now->getNext();
- now->setNext(del->getNext());
- del->removeCount();
- delete del;
- if (num == size - 1) {
- end = now;
- }
- }
- size--;
- }
- void sort() {
- Virus* now = start;
- int sortNum = 0;
- bool isSorted = false;
- int small = now->getsurvived();
- while (!isSorted) {
- now = start;
- for (int i = 0; i < size; i++) {
- if (!(now->isMarked) && small < now->getsurvived()) {
- small = now->getsurvived();
- }
- now = now->getNext();
- }
- now = start;
- for (int i = 0; i < size; i++) {
- if (!(now->isMarked) && small > now->getsurvived()) {
- small = now->getsurvived();
- }
- now = now->getNext();
- }
- now = start;
- for (int i = 0; i < size; i++) {
- if (!(now->isMarked) && small == now->getsurvived()) {
- now->Print();
- now->isMarked = true;
- }
- now = now->getNext();
- }
- now = start;
- sortNum = 0;
- for (int i = 0; i < size; i++) {
- if (now->isMarked) {
- sortNum++;
- }
- now = now->getNext();
- }
- if (sortNum == size) {
- isSorted = true;
- }
- }
- now = start;
- for (int i = 0; i < size; i++) {
- now->isMarked = false;
- now = now->getNext();
- }
- }
- void clist(int num) {
- num--;
- Virus* now = start;
- for (int i = 0; i <= num - 1; i++) {
- now = now->getNext();
- }
- for (int i = 0; i < size; i++) {
- now->Print();
- now = now->getNext();
- }
- }
- Virus* getEnd() {
- return end;
- }
- void getSerNum(int sNum) {
- Virus* now = start;
- for (int i = 0; i < size; i++) {
- if (sNum == now->getSerNum()) {
- now->Print();
- break;
- } else {
- now = now->getNext();
- }
- }
- }
- int getsize() {
- return size;
- }
- };
- int main() {
- setlocale(LC_ALL, "Russian");
- srand(time(0));
- int set, choose, amount = 0;
- int p = 0;
- List* viruses = new List();
- do {
- cout << "1. Создать экземпляры класса" << endl;
- cout << "2. Вывод всех экземпляров по порядку" << endl;
- cout << "3. Вывод экземпляра с заданным порядковым номером" << endl;
- cout << "4. Вывод всех экземпляров, отсортированных по пережившим" << endl;
- cout << "5. Вывод всех экземпляров по кругу, начиная с указанного" << endl;
- cout << "6. Вывод экземпляров по различным признакам" << endl;
- cout << "7. Добавление/yдаление экземпляров" << endl;
- cout << "8. О программе" << endl;
- cout << "0. Выйти\n" << endl;
- cout << "Введите номер действия: ";
- do {
- cin >> set;
- if (set > 9 || set < 0) {
- cout << "Введено неверное число" << endl;
- cout << "Введите номер действия: ";
- }
- } while (set > 9);
- switch (set) {
- case 1:
- do {
- cout << "Введите количество экземпляров (не больше 20): ";
- cin >> amount;
- if (amount > 20) {
- cout << "Число должно быть не больше 20" << endl;
- } else if (amount < 0) {
- cout << "Число не должно быть меньше нуля" << endl;
- }
- } while (amount > 20 || amount < 0);
- if (!p) {
- do {
- cout << "Введите кол-во людей: ";
- cin >> p;
- if (p <= 0) {
- cout << "Число не может быть отрицательным/быть равным нулю." << endl;
- }
- } while (p <= 0);
- Virus::population = p;
- }
- for (int i = 0; i < amount; i++) {
- viruses->push(new Virus);
- }
- cout << "Created!" << endl;
- getchar();
- cin.get();
- system("cls");
- break;
- case 2:
- if (viruses->getsize() > 0) {
- system("cls");
- viruses->print();
- } else {
- cout << "Тут пусто..." << endl;
- }
- getchar();
- cin.get();
- system("cls");
- break;
- case 3:
- int sNum;
- if (viruses->getsize() > 0) {
- system("cls");
- do {
- cout << "Введите номер экземпляра: ";
- cin >> sNum;
- if (sNum > viruses->getsize() || sNum <= 0) {
- cout << "Экземпляра с таким порядковым номером не существует" << endl;
- } else {
- viruses->getSerNum(sNum);
- }
- } while (sNum > viruses->getsize() || sNum <= 0);
- getchar();
- cin.get();
- system("cls");
- break;
- } else {
- cout << "Тут пусто..." << endl;
- getchar();
- cin.get();
- system("cls");
- break;
- }
- case 4:
- if (viruses->getsize() > 0) {
- system("cls");
- viruses->sort();
- } else {
- cout << "Тут пусто..." << endl;
- }
- getchar();
- cin.get();
- system("cls");
- break;
- case 5:
- if (viruses->getsize() > 0) {
- system("cls");
- do {
- cout << "Введите номер экземпляра, с которого хотите начать отображение массива: ";
- cin >> choose;
- if (choose > viruses->getsize()) {
- cout << "Экземпляр за пределами массива" << endl;
- } else if (choose <= 0) {
- cout << "Экземпляр не может быть отрицательным или равным нулю" << endl;
- } else {
- viruses->clist(choose);
- }
- } while (choose > viruses->getsize() || choose <= 0);
- } else {
- cout << "Тут пусто..." << endl;
- }
- getchar();
- cin.get();
- system("cls");
- break;
- case 6:
- if (viruses->getsize() > 0) {
- system("cls");
- cout << "1. Вывод процента заразности" << endl;
- cout << "2. Вывод процента смертности" << endl;
- cout << "3. Вывод продолжительности болезни" << endl;
- cout << "4. Вывод продолжительности панадемии" << endl;
- cout << "5. Вывод продолжительности инкубационного периода" << endl;
- cout << "6. Вывод способа распостранения" << endl;
- do {
- cout << "Введите номер действия: ";
- cin >> choose;
- if (choose > 6 || choose <= 0) {
- cout << "Введено неверное число" << endl;
- }
- } while (choose > 6 || choose <= 0);
- viruses->printFeature(choose);
- } else {
- cout << "Тут пусто..." << endl;
- }
- getchar();
- cin.get();
- system("cls");
- break;
- case 7:
- system("cls");
- do {
- cout << "1. Добавить экземпляр\n2. Удалить экземпляр\nВведите номер действия: ";
- cin >> choose;
- if (choose < 1 || choose > 2) {
- cout << "\nВыберите из предложенных вариантов!\n" << endl;
- } else if (choose == 2 && viruses->getsize() == 0) {
- cout << "Удалять нечего :(" << endl;
- getchar();
- cin.get();
- system("cls");
- } else {
- switch (choose) {
- case 1:
- int ch;
- viruses->push(new Virus);
- if (p) {
- viruses->getEnd()->Print();
- } else {
- do {
- cout << "Введите кол-во людей: ";
- cin >> p;
- if (p <= 0) {
- cout << "Число не может быть отрицательным/быть равным нулю." << endl;
- }
- } while (p <= 0);
- Virus::population = p;
- viruses->getEnd()->Print();
- }
- cout << "Хотите изменить какие-то поля программы?\n0. Нет\n1. Да\n";
- cout << "Введите номер действия: ";
- cin >> ch;
- if (ch == 1) {
- system("cls");
- int f;
- cout << "1. Изменить процент заразности" << endl;
- cout << "2. Изменить процент смертности" << endl;
- cout << "3. Изменить длительность инкубационного периода" << endl;
- cout << "4. Изменить длительность болезни" << endl;
- cout << "5. Изменить способо распостранения" << endl;
- cout << "0. Выйти в основное меню" << endl;
- do {
- cout << "Введите номер действия: ";
- cin >> f;
- if (f < 0 || f > 5) {
- cout << "Введено неверное число" << endl;
- } else {
- switch (f) {
- case 1:
- int i;
- cout << "Процент заразности: ";
- cin >> i;
- viruses->getEnd()->setInfect(i);
- break;
- case 2:
- int m;
- cout << "Процент смертности: ";
- cin >> m;
- viruses->getEnd()->setMortRate(m);
- break;
- case 3:
- int in;
- cout << "Инкубационный период (дни): ";
- cin >> in;
- viruses->getEnd()->setIncubPeriod(in);
- break;
- case 4:
- int d;
- cout << "Продолжительность болезни (дни): ";
- cin >> d;
- viruses->getEnd()->setDuration(d);
- break;
- case 5:
- int s;
- cout << "Виды распостранения:" << endl;
- cout << "1. воздушно-капельный\n2. пищевой\n3. трансмиссивный\n4. половой\n5. через кожу" << endl;
- do {
- cout << "Введите номер: ";
- cin >> s;
- if (s < 0 || s > 5)
- cout << "Вы ввели неверный номер" << endl;
- } while (s < 0 || s > 5);
- viruses->getEnd()->setSpreadingWay(s - 1);
- viruses->getEnd()->setPanDur();
- break;
- }
- }
- } while (f != 0);
- }
- system("cls");
- break;
- case 2:
- int number;
- do {
- cout << "Введите номер экземпляра: ";
- cin >> number;
- if (number > viruses->getsize() || number < 0) {
- cout << "Введен неверный номер экземпляра" << endl;
- }
- } while (number > viruses->getsize() || number < 0);
- viruses->del(number);
- cout << "Данные удалены!" << endl;
- getchar();
- cin.get();
- system("cls");
- break;
- }
- }
- } while (choose < 1 || choose > 2);
- break;
- case 8:
- system("cls");
- cout << "Создатель:\nТарас Букша\nГруппа:\nОПК-227" << endl;
- getchar();
- cin.get();
- system("cls");
- break;
- }
- } while (set != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement