Files
dz4/main.cpp

326 lines
9.2 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>
#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;
}