diff --git a/main.cpp b/main.cpp index 127e30f..0078290 100644 --- a/main.cpp +++ b/main.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include // Для форматирования вывода using namespace std; @@ -177,6 +178,14 @@ void z3_16() { findWordCombination(fileName, combination); +} +bool isBinary(const string& str) { + for (char c : str) { + if (c != '0' && c != '1') { + return false; + } + } + return true; } void z4_22() { int n; @@ -188,7 +197,13 @@ void z4_22() { for (int i = 0; i < n; ++i) { string binary; cin >> binary; - binaryArray.push_back(binary); + if (isBinary(binary)) { + binaryArray.push_back(binary); + } + else { + cout << "Ошибка: '" << binary << "' не является двоичным числом. Попробуйте снова.\n"; + --i; // Повторить ввод для текущей итерации + } } vector base5Array; @@ -236,22 +251,26 @@ string convertToBase(int number, int base) { return result.empty() ? "0" : result; // Если число 0, вернуть "0" } void sieveOfEratosthenes(int n) { - // Создаем вектор для хранения простоты чисел. Изначально считаем, что все числа простые. - vector isPrime(n + 1, true); + + // Создаем динаический массив для хранения информации о простых числах + bool* isPrime = new bool[n + 1]; - // 0 и 1 не являются простыми числами. + // Изначально предполагаем, что все числа простые + memset(isPrime, true, (n + 1) * sizeof(bool)); + + // 0 и 1 не являются простыми числами isPrime[0] = isPrime[1] = false; + // Решето Эратосфена for (int i = 2; i * i <= n; ++i) { if (isPrime[i]) { - // Отмечаем все кратные i как составные. for (int j = i * i; j <= n; j += i) { isPrime[j] = false; } } } - // Выводим все простые числа. + // Вывод всех простых чисел cout << "Простые числа до " << n << ": "; for (int i = 2; i <= n; ++i) { if (isPrime[i]) { @@ -259,7 +278,11 @@ void sieveOfEratosthenes(int n) { } } cout << endl; + + // Освобождаем память + delete[] isPrime; } + void z2() { int n; cout << "Введите предел для поиска простых чисел: "; @@ -325,38 +348,42 @@ struct Country { points = gold * 7 + silver * 6 + bronze * 5; } }; + +// Функция для сравнения стран по золотым медалям bool compareByGold(const Country& a, const Country& b) { if (a.gold != b.gold) { return a.gold > b.gold; // Сортировка по золотым медалям } return a.totalMedals > b.totalMedals; // Вторичная сортировка по общему количеству медалей } + void z5_22() { - vector countries; int n; cout << "Введите количество стран: "; cin >> n; + // Динамическое выделение памяти для массива стран + Country* countries = new Country[n]; + // Ввод данных for (int i = 0; i < n; ++i) { - Country country; cout << "Введите название страны (пожалуйста на Английском): "; - cin >> country.name; + cin >> countries[i].name; cout << "Введите количество золотых, серебряных и бронзовых медалей: "; - cin >> country.gold >> country.silver >> country.bronze; - country.calculate(); - countries.push_back(country); + cin >> countries[i].gold >> countries[i].silver >> countries[i].bronze; + countries[i].calculate(); } // Сортировка стран - sort(countries.begin(), countries.end(), compareByGold); + sort(countries, countries + n, compareByGold); // Сохранение данных в файл ofstream outFile("olympic_results.txt"); if (!outFile) { cerr << "Ошибка открытия файла для записи!" << endl; - + delete[] countries; // Освобождение памяти перед выходом + return; } outFile << left << setw(15) << "Страна" @@ -366,13 +393,13 @@ void z5_22() { << setw(15) << "Всего Медалей" << setw(10) << "Очки" << endl; - for (const auto& country : countries) { - outFile << left << setw(15) << country.name - << setw(10) << country.gold - << setw(10) << country.silver - << setw(10) << country.bronze - << setw(15) << country.totalMedals - << setw(10) << country.points << endl; + for (int i = 0; i < n; ++i) { + outFile << left << setw(15) << countries[i].name + << setw(10) << countries[i].gold + << setw(10) << countries[i].silver + << setw(10) << countries[i].bronze + << setw(15) << countries[i].totalMedals + << setw(10) << countries[i].points << endl; } outFile.close(); @@ -384,28 +411,30 @@ void z5_22() { << setw(15) << "ВсегоМедалей" << setw(10) << "Очки" << endl; - for (const auto& country : countries) { - cout << left << setw(15) << country.name - << setw(10) << country.gold - << setw(10) << country.silver - << setw(10) << country.bronze - << setw(15) << country.totalMedals - << setw(10) << country.points << endl; + for (int i = 0; i < n; ++i) { + cout << left << setw(15) << countries[i].name + << setw(10) << countries[i].gold + << setw(10) << countries[i].silver + << setw(10) << countries[i].bronze + << setw(15) << countries[i].totalMedals + << setw(10) << countries[i].points << endl; } cout << "Результаты сохранены в файл 'olympic_results.txt'." << endl; + // Освобождаем память + delete[] countries; } void showMenu() { cout << "Меню задач:\n"; cout << "1. «Алгоритм Евклида»\n"; - cout << "2. «Решето какого-то чела»\n"; + cout << "2. «Решето какого-то чела»\n"; // готов cout << "3. 3.16\n"; cout << "4. 3.22\n"; cout << "6. 4.16\n"; - cout << "7. 4.22\n"; + cout << "7. 4.22\n";// готов cout << "8. 5.16\n"; - cout << "9. 5.22\n";// Динамическй массив country ???? + cout << "9. 5.22\n";// готово cout << "0. Выход\n"; } void launchTasks() {