295 lines
9.6 KiB
C++
295 lines
9.6 KiB
C++
// 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;
|
||
}
|
||
|
||
|