Files
dz4/main.cpp
oltnd 8a578e5461 Обновить main.cpp
Не работает флаг, не сделана проверка буква в 1
2024-11-01 22:44:06 +03:00

303 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// dz41.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
#include <iostream>
#include <fstream>
#include <numeric>
#include <windows.h>
#define _USE_MATH_DEFINES
#include <cmath>
const double PI = 3.141592653589793238463;
using namespace std;
int sign(double x) {
if (x > 0) {
return 1;
}
else if (x == 0) {
return 0;
}
else {
return -1;
}
}
double rectangleArea(double length, double width) {
return length * width;
}
double triangleArea(double a, double b, double c) {
// Проверка на существование треугольника
if ((a + b > c) && (a + c > b) && (b + c > a)) {
// Формула Герона
double s = (a + b + c) / 2;
return sqrt(s * (s - a) * (s - b) * (s - c));
}
else {
cout << "Треугольник с такими сторонами не существует." << endl;
return 0;
}
}
double circleArea(double radius) {
const double PI = 3.14159;
return PI * radius * radius;
}
void z3() {
int choice;
cout << "Выберите фигуру для расчета площади:\n";
cout << "1. Прямоугольник\n";
cout << "2. Треугольник\n";
cout << "3. Круг\n";
cout << "Ваш выбор: ";
cin >> choice;
switch (choice) {
case 1: {
double length, width;
cout << "Введите длину и ширину прямоугольника: ";
cin >> length >> width;
cout << "Площадь прямоугольника: " << rectangleArea(length, width) << endl;
break;
}
case 2: {
double a, b, c;
cout << "Введите три стороны треугольника: ";
cin >> a >> b >> c;
double area = triangleArea(a, b, c);
if (area > 0) {
cout << "Площадь треугольника: " << area << endl;
}
break;
}
case 3: {
double radius;
cout << "Введите радиус круга: ";
cin >> radius;
cout << "Площадь круга: " << circleArea(radius) << endl;
break;
}
default:
cout << "Неверный выбор!" << endl;
}
}
void z4() {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
const int width = 20; // Ширина флага
const int height = 10; // Высота флага
const int circleRadius = 3; // Радиус круга
const int centerX = width / 2;
const int centerY = height / 2;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// Определяем, находится ли точка (x, y) внутри круга
int dx = x - centerX;
int dy = y - centerY;
if (dx * dx + dy * dy <= circleRadius * circleRadius) {
SetConsoleTextAttribute(hConsole, 4); // Красный цвет
}
else {
SetConsoleTextAttribute(hConsole, 15); // Белый цвет
}
cout << " "; // Два пробела для более широкого изображения
}
cout << endl;
}
SetConsoleTextAttribute(hConsole, 15); // Сбрасываем цвет на белый
}
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;
}
}
return true;
}
void z6() {
string roman;
cout << "Введите римское число: ";
cin >> roman;
// Проверка на корректность римского числа
if (!isValidRoman(roman)) {
cerr << "Некорректное римское число." << endl;
return;
}
int result = 0; // Итоговое значение
int prevValue = 0; // Предыдущее значение для сравнения
// Проходим по римскому числу с конца
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;
cout << "Введите число: ";
cin >> number;
int result = sign(number); // Вызов подпрограммы для определения знака числа
cout << "Знак числа: " << result << endl;
}
int z1() {
// проверка букав не пашет
ofstream outFile("numbers.txt"); // Открываем файл для записи
if (!outFile) {
cerr << "Не удалось открыть файл для записи." << endl;
return 1;
}
int numbers[10]; // Массив для хранения 10 чисел
int a;
// Вводим 10 чисел и записываем их в файл через пробел
cout << "Введите 10 чисел: ";
for (int i = 0; i < 10; ++i) {
cin >> a;
if (int(a)) {
a >> numbers[i];
outFile << numbers[i] << " ";
}
else {
cout << "Давай тут без этого вот всего, нраписано 'числа'"<<endl;
cin.clear();
cin.ignore();
z1();
}
}
outFile.close(); // Закрываем файл после записи
// Открываем файл для чтения
ifstream inFile("numbers.txt");
if (!inFile) {
cerr << "Не удалось открыть файл для чтения." << endl;
return 1;
}
// Считываем числа и суммируем их
int sum = 0;
for (int i = 0; i < 10; ++i) {
inFile >> numbers[i];
sum += numbers[i];
}
inFile.close(); // Закрываем файл после чтения
cout << "Сумма чисел: " << sum << endl;
}
void z7() {
int S1 = 0;
int S2 = 0;
// Параметры для первого варианта
int m1 = 37, i1 = 3, c1 = 64;
// Параметры для второго варианта
int m2 = 25173, i2 = 13849, c2 = 65537;
// Количество итераций
int iterations = 100;
// Первый вариант
cout << "Первый вариант (m = " << m1 << ", i = " << i1 << ", c = " << c1 << "):" << endl;
for (int j = 0; j < iterations; ++j) {
S1 = (m1 * S1 + i1) % c1;
cout << S1 << " ";
}
cout << endl;
// Второй вариант
cout << "Второй вариант (m = " << m2 << ", i = " << i2 << ", c = " << c2 << "):" << endl;
for (int j = 0; j < iterations; ++j) {
S2 = (m2 * S2 + i2) % c2;
cout << S2 << " ";
}
cout << endl;
}
void showMenu() {
cout << "Меню задач:\n";
cout << "1. Файл\n";
cout << "2. Знак числа\n";
cout << "3. Геометрические фигуры\n";
cout << "4. СЛАВА РОССИИ\n";
cout << "6. Автоматный распознаватель\n";
cout << "7. Генератор случайных чисел\n";
cout << "0. Выход\n";
}
void launchTasks() {
int choice;
do {
showMenu();
cout << "Выберите номер задачи для запуска (или 0 для выхода): ";
cin >> choice;
switch (choice) {
case 1: z1(); break;
case 2: z2(); break;
case 3: z3(); break;
case 4: z4(); break;
case 6: z6(); break;
case 7: z7(); break;
case 0: cout << "Выход из программы.\n"; break;
default: cout << "Ошибка: неверный выбор. Пожалуйста, попробуйте снова.\n";
}
cout << endl;
} while (choice != 0);
}
int main() {
setlocale(LC_ALL, "");
launchTasks();
return 0;
}