Files
dz4/main.cpp
2024-11-01 23:06:17 +03:00

295 lines
9.6 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;
}
void z1(){
ofstream myfile("numbers.txt");
if (!myfile.is_open()) {
cout << "Ошибка при открытии файла для записи!" << endl;
return 1;
}
float number;
cout << "Введите 10 чисел:" << endl;
for (int i = 0; i < 10; ++i) {
cout << i + 1 << ": ";
while (!(cin >> number)) {
cin.clear();
cin.ignore(10000, '\n');
cout << "Неправильный ввод, введите число: ";
}
myfile << number << " ";
}
myfile.close();
ifstream alienfile("numbers.txt");
if (!alienfile.is_open()) {
cout << "Ошибка при открытии файла для чтения!" << endl;
return 1;
}
float sum = 0;
while (alienfile >> number) {
sum += number;
}
alienfile.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;
}