6 Задание теперь работает

This commit is contained in:
oltnd
2024-11-02 17:25:23 +03:00
parent ddea3fb027
commit aedbefafeb

185
main.cpp
View File

@@ -7,6 +7,8 @@
#include <windows.h>
#define _USE_MATH_DEFINES
#include <cmath>
#include <string>
#include <unordered_map>
const double PI = 3.141592653589793238463;
using namespace std;
@@ -57,7 +59,12 @@ void z3() {
double length, width;
cout << "Введите длину и ширину прямоугольника: ";
cin >> length >> width;
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') {
unordered_map<string, bool> 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 (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') {
if (i + 2 < roman.length() && roman[i + 2] == roman[i]) {
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;
}
}
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 << "Введите римское число: ";
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)) {
if (cin >> a) {
outFile << a;
outFile << " ";
}
else {
cout << "Давай тут без этого вот всего, нраписано 'числа'"<<endl;
cin.clear();
cin.ignore(10000, '\n');
cout << "Неправильный ввод, введите число: ";
}
myfile << number << " ";
cin.ignore();
z1();
}
myfile.close();
}
outFile.close(); // Закрываем файл после записи
ifstream alienfile("numbers.txt");
if (!alienfile.is_open()) {
cout << "Ошибка при открытии файла для чтения!" << endl;
// Открываем файл для чтения
ifstream inFile("numbers.txt");
if (!inFile) {
cerr << "Не удалось открыть файл для чтения." << endl;
return 1;
}
float sum = 0;
while (alienfile >> number) {
sum += number;
// Считываем числа и суммируем их
double sum = 0;
for (int i = 0; i < 10; ++i) {
inFile >> a;
sum += a;
}
alienfile.close();
inFile.close(); // Закрываем файл после чтения
cout << "Сумма чисел: " << sum << endl;
}