6 Задание теперь работает
This commit is contained in:
201
main.cpp
201
main.cpp
@@ -7,6 +7,8 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#define _USE_MATH_DEFINES
|
#define _USE_MATH_DEFINES
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
const double PI = 3.141592653589793238463;
|
const double PI = 3.141592653589793238463;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@@ -57,7 +59,12 @@ void z3() {
|
|||||||
double length, width;
|
double length, width;
|
||||||
cout << "Введите длину и ширину прямоугольника: ";
|
cout << "Введите длину и ширину прямоугольника: ";
|
||||||
cin >> length >> width;
|
cin >> length >> width;
|
||||||
cout << "Площадь прямоугольника: " << rectangleArea(length, width) << endl;
|
if (length > 0 and width > 0) {
|
||||||
|
cout << "Площадь прямоугольника: " << rectangleArea(length, width) << endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cout << "отрицательное число";
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2: {
|
case 2: {
|
||||||
@@ -74,7 +81,12 @@ void z3() {
|
|||||||
double radius;
|
double radius;
|
||||||
cout << "Введите радиус круга: ";
|
cout << "Введите радиус круга: ";
|
||||||
cin >> radius;
|
cin >> radius;
|
||||||
cout << "Площадь круга: " << circleArea(radius) << endl;
|
if (radius > 0) {
|
||||||
|
cout << "Площдь круга: " << circleArea(radius) << endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cout << "отрицательное число";
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -96,10 +108,10 @@ void z4() {
|
|||||||
int dx = x - centerX;
|
int dx = x - centerX;
|
||||||
int dy = y - centerY;
|
int dy = y - centerY;
|
||||||
if (dx * dx + dy * dy <= circleRadius * circleRadius) {
|
if (dx * dx + dy * dy <= circleRadius * circleRadius) {
|
||||||
SetConsoleTextAttribute(hConsole, 4); // Красный цвет
|
SetConsoleTextAttribute(hConsole, 0x40); // Красный цвет
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SetConsoleTextAttribute(hConsole, 15); // Белый цвет
|
SetConsoleTextAttribute(hConsole, 0xf0); // Белый цвет
|
||||||
}
|
}
|
||||||
cout << " "; // Два пробела для более широкого изображения
|
cout << " "; // Два пробела для более широкого изображения
|
||||||
}
|
}
|
||||||
@@ -107,73 +119,84 @@ void z4() {
|
|||||||
}
|
}
|
||||||
SetConsoleTextAttribute(hConsole, 15); // Сбрасываем цвет на белый
|
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) {
|
bool isValidRoman(const string& roman) {
|
||||||
// Проверяем, соответствует ли строка правилам римских цифр
|
unordered_map<string, bool> validSubtractive = {
|
||||||
for (size_t i = 0; i < roman.size(); ++i) {
|
{"IV", true}, {"IX", true},
|
||||||
// Ограничиваем последовательности, которые могут предшествовать большим символам
|
{"XL", true}, {"XC", true},
|
||||||
if (roman[i] == 'I' && i + 1 < roman.size() && roman[i + 1] != 'V' && roman[i + 1] != 'X' && roman[i + 1] != 'I') {
|
{"CD", true}, {"CM", true}
|
||||||
return false;
|
};
|
||||||
}
|
|
||||||
if (roman[i] == 'X' && i + 1 < roman.size() && roman[i + 1] != 'L' && roman[i + 1] != 'C' && roman[i + 1] != 'X') {
|
|
||||||
return false;
|
for (int i = 0; i < roman.length() - 1; ++i) {
|
||||||
}
|
int currValue = romanToArabic(roman[i]);
|
||||||
if (roman[i] == 'C' && i + 1 < roman.size() && roman[i + 1] != 'D' && roman[i + 1] != 'M' && roman[i + 1] != 'C') {
|
int nextValue = romanToArabic(roman[i + 1]);
|
||||||
return false;
|
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) {
|
||||||
}
|
|
||||||
// Проверка на недопустимые повторения (например, IIII, VV, LL и т.д.)
|
string combo = string(1, roman[i]) + string(1, roman[i + 1]);
|
||||||
string invalidPatterns[] = { "IIII", "VV", "XXXX", "LL", "CCCC", "DD", "MMMM" };
|
if (validSubtractive.find(combo) == validSubtractive.end()) {
|
||||||
for (const string& pattern : invalidPatterns) {
|
return false;
|
||||||
if (roman.find(pattern) != string::npos) {
|
}
|
||||||
return false;
|
|
||||||
|
|
||||||
|
if (i + 2 < roman.length() && roman[i + 2] == roman[i]) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
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() {
|
void z6() {
|
||||||
string roman;
|
string roman;
|
||||||
cout << "Введите римское число: ";
|
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 result = decodeRoman(roman);
|
||||||
int prevValue = 0; // Предыдущее значение для сравнения
|
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() {
|
void z2() {
|
||||||
double number;
|
double number;
|
||||||
@@ -184,42 +207,50 @@ void z2() {
|
|||||||
|
|
||||||
cout << "Знак числа: " << result << endl;
|
cout << "Знак числа: " << result << endl;
|
||||||
}
|
}
|
||||||
void z1(){
|
|
||||||
ofstream myfile("numbers.txt");
|
int z1() {
|
||||||
if (!myfile.is_open()) {
|
// проверка букав не пашет
|
||||||
cout << "Ошибка при открытии файла для записи!" << endl;
|
|
||||||
|
ofstream outFile("numbers.txt"); // Открываем файл для записи
|
||||||
|
if (!outFile) {
|
||||||
|
cerr << "Не удалось открыть файл для записи." << endl;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
float number;
|
|
||||||
cout << "Введите 10 чисел:" << endl;
|
double a;
|
||||||
|
// Вводим 10 чисел и записываем их в файл через пробел
|
||||||
|
cout << "Введите 10 чисел: ";
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
cout << i + 1 << ": ";
|
|
||||||
while (!(cin >> number)) {
|
if (cin >> a) {
|
||||||
cin.clear();
|
outFile << a;
|
||||||
cin.ignore(10000, '\n');
|
outFile << " ";
|
||||||
cout << "Неправильный ввод, введите число: ";
|
|
||||||
}
|
}
|
||||||
myfile << number << " ";
|
else {
|
||||||
|
cout << "Давай тут без этого вот всего, нраписано 'числа'"<<endl;
|
||||||
|
cin.clear();
|
||||||
|
cin.ignore();
|
||||||
|
z1();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
outFile.close(); // Закрываем файл после записи
|
||||||
|
|
||||||
myfile.close();
|
// Открываем файл для чтения
|
||||||
|
ifstream inFile("numbers.txt");
|
||||||
ifstream alienfile("numbers.txt");
|
if (!inFile) {
|
||||||
if (!alienfile.is_open()) {
|
cerr << "Не удалось открыть файл для чтения." << endl;
|
||||||
cout << "Ошибка при открытии файла для чтения!" << endl;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
float sum = 0;
|
// Считываем числа и суммируем их
|
||||||
|
double sum = 0;
|
||||||
while (alienfile >> number) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
sum += number;
|
inFile >> a;
|
||||||
|
sum += a;
|
||||||
}
|
}
|
||||||
|
inFile.close(); // Закрываем файл после чтения
|
||||||
alienfile.close();
|
|
||||||
|
|
||||||
cout << "Сумма чисел: " << sum << endl;
|
cout << "Сумма чисел: " << sum << endl;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user