326 lines
9.2 KiB
C++
326 lines
9.2 KiB
C++
// dz41.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
|
||
//
|
||
|
||
#include <iostream>
|
||
#include <fstream>
|
||
#include <numeric>
|
||
#include <windows.h>
|
||
#define _USE_MATH_DEFINES
|
||
#include <cmath>
|
||
#include <string>
|
||
#include <unordered_map>
|
||
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;
|
||
if (length > 0 and width > 0) {
|
||
cout << "Площадь прямоугольника: " << rectangleArea(length, width) << endl;
|
||
}
|
||
else {
|
||
cout << "отрицательное число";
|
||
}
|
||
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;
|
||
if (radius > 0) {
|
||
cout << "Площдь круга: " << circleArea(radius) << endl;
|
||
}
|
||
else {
|
||
cout << "отрицательное число";
|
||
}
|
||
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, 0x40); // Красный цвет
|
||
}
|
||
else {
|
||
SetConsoleTextAttribute(hConsole, 0xf0); // Белый цвет
|
||
}
|
||
cout << " "; // Два пробела для более широкого изображения
|
||
}
|
||
cout << endl;
|
||
}
|
||
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) {
|
||
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 (i + 2 < roman.length() && roman[i + 2] == roman[i]) {
|
||
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));
|
||
|
||
|
||
int result = decodeRoman(roman);
|
||
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;
|
||
}
|
||
|
||
|
||
double a;
|
||
// Вводим 10 чисел и записываем их в файл через пробел
|
||
cout << "Введите 10 чисел: ";
|
||
for (int i = 0; i < 10; ++i) {
|
||
|
||
if (cin >> a) {
|
||
outFile << a;
|
||
outFile << " ";
|
||
}
|
||
else {
|
||
cout << "Давай тут без этого вот всего, нраписано 'числа'"<<endl;
|
||
cin.clear();
|
||
cin.ignore();
|
||
z1();
|
||
}
|
||
|
||
}
|
||
outFile.close(); // Закрываем файл после записи
|
||
|
||
// Открываем файл для чтения
|
||
ifstream inFile("numbers.txt");
|
||
if (!inFile) {
|
||
cerr << "Не удалось открыть файл для чтения." << endl;
|
||
return 1;
|
||
}
|
||
|
||
// Считываем числа и суммируем их
|
||
double sum = 0;
|
||
for (int i = 0; i < 10; ++i) {
|
||
inFile >> a;
|
||
sum += a;
|
||
}
|
||
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;
|
||
}
|
||
|
||
|