From aedbefafeb3bd9ad892e657606df13b563b6ca05 Mon Sep 17 00:00:00 2001 From: oltnd Date: Sat, 2 Nov 2024 17:25:23 +0300 Subject: [PATCH] =?UTF-8?q?6=20=D0=97=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 201 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 116 insertions(+), 85 deletions(-) diff --git a/main.cpp b/main.cpp index 9770311..5b1122d 100644 --- a/main.cpp +++ b/main.cpp @@ -7,6 +7,8 @@ #include #define _USE_MATH_DEFINES #include +#include +#include const double PI = 3.141592653589793238463; using namespace std; @@ -57,7 +59,12 @@ void z3() { double length, width; cout << "Введите длину и ширину прямоугольника: "; cin >> length >> width; - cout << "Площадь прямоугольника: " << rectangleArea(length, width) << endl; + if (length > 0 and width > 0) { + cout << "Площадь прямоугольника: " << rectangleArea(length, width) << endl; + } + else { + cout << "отрицательное число"; + } break; } case 2: { @@ -74,7 +81,12 @@ void z3() { double radius; cout << "Введите радиус круга: "; cin >> radius; - cout << "Площадь круга: " << circleArea(radius) << endl; + if (radius > 0) { + cout << "Площдь круга: " << circleArea(radius) << endl; + } + else { + cout << "отрицательное число"; + } break; } default: @@ -96,10 +108,10 @@ void z4() { int dx = x - centerX; int dy = y - centerY; if (dx * dx + dy * dy <= circleRadius * circleRadius) { - SetConsoleTextAttribute(hConsole, 4); // Красный цвет + SetConsoleTextAttribute(hConsole, 0x40); // Красный цвет } else { - SetConsoleTextAttribute(hConsole, 15); // Белый цвет + SetConsoleTextAttribute(hConsole, 0xf0); // Белый цвет } cout << " "; // Два пробела для более широкого изображения } @@ -107,73 +119,84 @@ void z4() { } SetConsoleTextAttribute(hConsole, 15); // Сбрасываем цвет на белый } +int romanToArabic(char ch) { + switch (ch) { + case 'I': return 1; + case 'V': return 5; + case 'X': return 10; + case 'L': return 50; + case 'C': return 100; + case 'D': return 500; + case 'M': return 1000; + default: return -1; + } +} + + bool isValidRoman(const string& roman) { - // Проверяем, соответствует ли строка правилам римских цифр - for (size_t i = 0; i < roman.size(); ++i) { - // Ограничиваем последовательности, которые могут предшествовать большим символам - if (roman[i] == 'I' && i + 1 < roman.size() && roman[i + 1] != 'V' && roman[i + 1] != 'X' && roman[i + 1] != 'I') { - return false; - } - if (roman[i] == 'X' && i + 1 < roman.size() && roman[i + 1] != 'L' && roman[i + 1] != 'C' && roman[i + 1] != 'X') { - return false; - } - if (roman[i] == 'C' && i + 1 < roman.size() && roman[i + 1] != 'D' && roman[i + 1] != 'M' && roman[i + 1] != 'C') { - return false; - } - } - // Проверка на недопустимые повторения (например, IIII, VV, LL и т.д.) - string invalidPatterns[] = { "IIII", "VV", "XXXX", "LL", "CCCC", "DD", "MMMM" }; - for (const string& pattern : invalidPatterns) { - if (roman.find(pattern) != string::npos) { - return false; + unordered_map validSubtractive = { + {"IV", true}, {"IX", true}, + {"XL", true}, {"XC", true}, + {"CD", true}, {"CM", true} + }; + + + for (int i = 0; i < roman.length() - 1; ++i) { + int currValue = romanToArabic(roman[i]); + int nextValue = romanToArabic(roman[i + 1]); + if (!(roman[i] == 'I' || roman[i] == 'V' || roman[i] == 'X' || roman[i] == 'L' || roman[i] == 'C' || roman[i] == 'D' || roman[i] == 'M')) return false; + if (currValue < nextValue) { + + string combo = string(1, roman[i]) + string(1, roman[i + 1]); + if (validSubtractive.find(combo) == validSubtractive.end()) { + return false; + } + + + if (i + 2 < roman.length() && roman[i + 2] == roman[i]) { + return false; + } } } + return true; } + + +int decodeRoman(const string& roman) { + int total = 0; + int prevValue = 0; + + for (int i = roman.length() - 1; i >= 0; --i) { + int currValue = romanToArabic(roman[i]); + + if (currValue < prevValue) { + total -= currValue; + } + else { + total += currValue; + } + + prevValue = currValue; + } + return total; +} + + void z6() { string roman; cout << "Введите римское число: "; - cin >> roman; + bool check; + do { + cin >> roman; + check = isValidRoman(roman); + if (!check) cout << "Число невалидное" << endl; + } while (!isValidRoman(roman)); - // Проверка на корректность римского числа - if (!isValidRoman(roman)) { - cerr << "Некорректное римское число." << endl; - return; - } - int result = 0; // Итоговое значение - int prevValue = 0; // Предыдущее значение для сравнения + int result = decodeRoman(roman); + cout << "Арабское значение: " << result << endl; - // Проходим по римскому числу с конца - for (int i = roman.size() - 1; i >= 0; --i) { - int currentValue = 0; - - // Определяем значение текущего символа - switch (roman[i]) { - case 'I': currentValue = 1; break; - case 'V': currentValue = 5; break; - case 'X': currentValue = 10; break; - case 'L': currentValue = 50; break; - case 'C': currentValue = 100; break; - case 'D': currentValue = 500; break; - case 'M': currentValue = 1000; break; - default: - cerr << "Недопустимый символ: " << roman[i] << endl; - return; // Прерываем выполнение при некорректном символе - } - - // Добавляем или вычитаем значение в зависимости от предыдущего символа - if (currentValue < prevValue) { - result -= currentValue; // Вычитаем, если меньшая цифра перед большей (например, IV = 4) - } - else { - result += currentValue; // Добавляем в остальных случаях - } - - prevValue = currentValue; // Обновляем предыдущее значение - } - - cout << "Арабское число: " << result << endl; } void z2() { double number; @@ -184,42 +207,50 @@ void z2() { cout << "Знак числа: " << result << endl; } -void z1(){ -ofstream myfile("numbers.txt"); - if (!myfile.is_open()) { - cout << "Ошибка при открытии файла для записи!" << endl; + +int z1() { + // проверка букав не пашет + + ofstream outFile("numbers.txt"); // Открываем файл для записи + if (!outFile) { + cerr << "Не удалось открыть файл для записи." << endl; return 1; } - float number; - cout << "Введите 10 чисел:" << endl; - - + + double a; + // Вводим 10 чисел и записываем их в файл через пробел + cout << "Введите 10 чисел: "; for (int i = 0; i < 10; ++i) { - cout << i + 1 << ": "; - while (!(cin >> number)) { - cin.clear(); - cin.ignore(10000, '\n'); - cout << "Неправильный ввод, введите число: "; + + if (cin >> a) { + outFile << a; + outFile << " "; } - myfile << number << " "; + else { + cout << "Давай тут без этого вот всего, нраписано 'числа'"<> number) { - sum += number; + // Считываем числа и суммируем их + double sum = 0; + for (int i = 0; i < 10; ++i) { + inFile >> a; + sum += a; } - - alienfile.close(); + inFile.close(); // Закрываем файл после чтения cout << "Сумма чисел: " << sum << endl; }