Untitled

                Never    
C++
       
#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 d = 0;
		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 = d; i < d + 1; i++) {
				if (i == 0) {
					inf[i] = infected;
				} else {
					inf[i] = infected - inf[i - 1];
				}
			}
			if (d == duration) {
				d = 0;
				for (int i = 0; i < duration; i++) {
					if (rand() % 101 > mortality) {
						survived += inf[i];
						inf[i] = 0;
					} else {
						infected += inf[i] - (inf[i] * mortality / 100);
					}
				}
			}
			d++;
			panDur++;
			population -= infected;
		}
		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;
    }
};

void startGate(int choose, int p, List* viruses);


int main() {
    setlocale(LC_ALL, "Russian");
    srand(time(0));
	int set; 
	static unsigned long long int p = 0;
	List* viruses = new List();

    do {
		if (!p) {
			do {
				cout << "Введите кол-во людей: ";
				cin >> p;
				if (p <= 0) {
					cout << "Число не может быть отрицательным/быть равным нулю." << endl;
				}
			} while (p <= 0);
			Virus::population = p;
			system("cls");
		}
        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);
		startGate(set, p, viruses);
    } while (set != 0);

    return 0;
}

void startGate(int t, int p, List* viruses) {
	int choose, amount = 0;
	switch (t) {
	case 1:
		do {
			cout << "Введите количество экземпляров (не больше 20): ";
			cin >> amount;
			if (amount > 20) {
				cout << "Число должно быть не больше 20" << endl;
			}
			else if (amount < 0) {
				cout << "Число не должно быть меньше нуля" << endl;
			}
		} while (amount > 20 || amount < 0);
		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;
	}
}

Raw Text