/
Tikhon
/
PZ2
Обзор
Документация
Войти
/
Tikhon
/
PZ2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
pz2.cpp
508 строк
16 KB
Tikhon
create pz2.cpp
09 янв 2026, 16:27
09 янв 2026, 16:27
37c300a
Код
Авторство
О чём код?
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ // Функция для проверки корректности ввода чисел int getValidNumber(const char* prompt) { char input[100]; int number; while (1) { printf("%s", prompt); if (fgets(input, sizeof(input), stdin) == NULL) { printf("Ошибка ввода. Попробуйте снова.\n"); continue; } if (sscanf(input, "%d", &number) == 1) { return number; } else { printf("Некорректный ввод. Пожалуйста, введите целое число.\n"); }z } } // Функция для проверки корректности ввода дробных чисел double getValidDouble(const char* prompt) { char input[100]; double number; while (1) { printf("%s", prompt); if (fgets(input, sizeof(input), stdin) == NULL) { printf("Ошибка ввода. Попробуйте снова.\n"); continue; } if (sscanf(input, "%lf", &number) == 1) { return number; } else { printf("Некорректный ввод. Пожалуйста, введите число.\n"); } } } // Собственная функция для вычисления абсолютного значения double my_abs(double x) { return (x < 0) ? -x : x; } // Собственная функция для вычисления квадратного корня (метод Ньютона) double my_sqrt(double x) { if (x < 0) return 0; if (x == 0) return 0; double guess = x / 2.0; double epsilon = 0.00001; // Итеративное уточнение корня for (int i = 0; i < 50; i++) { double new_guess = (guess + x / guess) / 2.0; if (my_abs(new_guess - guess) < epsilon) { return new_guess; } guess = new_guess; } return guess; } // Функция для проверки простоты числа int isPrime(int n) { if (n < 2) return 0; if (n == 2) return 1; if (n % 2 == 0) return 0; // Проверка нечетных делителей for (int i = 3; i * i <= n; i += 2) { if (n % i == 0) return 0; } return 1; } // Функция для определения високосного года int isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // Функция для определения количества дней в месяце int daysInMonth(int month, int year) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: return isLeapYear(year) ? 29 : 28; default: return 0; } } // ЗАДАЧА 1: ПРОСТЕЙШИЙ КАЛЬКУЛЯТОР void calculator() { printf("\n=== Задача 1: Простейший калькулятор ===\n"); while (1) { double num1, num2, result; char operation; char input[100]; num1 = getValidDouble("Введите первое число: "); num2 = getValidDouble("Введите второе число: "); while (1) { printf("Введите знак действия (+, -, *, /) или 0 для выхода: "); if (fgets(input, sizeof(input), stdin) == NULL) { printf("Ошибка ввода. Попробуйте снова.\n"); continue; } if (sscanf(input, " %c", &operation) == 1) { if (operation == '0') { return; } if (operation == '+' || operation == '-' || operation == '*' || operation == '/') { break; } else { printf("Некорректный знак операции. Допустимы: +, -, *, /\n"); } } else { printf("Некорректный ввод. Попробуйте снова.\n"); } } switch (operation) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': if (num2 == 0) { printf("Ошибка: деление на ноль!\n"); continue; } result = num1 / num2; break; default: result = 0; break; } printf("%.2lf %c %.2lf = %.2lf\n", num1, operation, num2, result); } } // ЗАДАЧА 2: ТРЕУГОЛЬНИК void triangle() { printf("\n=== Задача 2: Треугольник ===\n"); while (1) { double a, b, c; a = getValidDouble("Введите длину первой стороны (0 для выхода): "); if (a == 0) return; b = getValidDouble("Введите длину второй стороны: "); if (b == 0) return; c = getValidDouble("Введите длину третьей стороны: "); if (c == 0) return; // Проверка существования треугольника if (a + b > c && a + c > b && b + c > a && a > 0 && b > 0 && c > 0) { double perimeter = a + b + c; double p = perimeter / 2; double area = my_sqrt(p * (p - a) * (p - b) * (p - c)); printf("Треугольник существует.\n"); printf("Периметр: %.2lf\n", perimeter); printf("Площадь: %.2lf\n", area); } else { printf("Треугольник с такими сторонами не существует.\n"); } } } // ЗАДАЧА 3: УРАВНЕНИЕ ПРЯМОЙ void lineEquation() { printf("\n=== Задача 3: Уравнение прямой ===\n"); while (1) { double x1, y1, x2, y2; printf("Введите координаты первой точки(Для выхода укажите 0 для каждой координаты):\n"); x1 = getValidDouble("x1: "); y1 = getValidDouble("y1: "); printf("Введите координаты второй точки:\n"); x2 = getValidDouble("x2: "); y2 = getValidDouble("y2: "); if (x1 == 0 && y1 == 0 && x2 == 0 && y2 == 0) { return; } if (x1 == x2 && y1 == y2) { printf("Точки совпадают. Невозможно построить прямую.\n"); continue; } if (x1 == x2) { printf("Уравнение прямой: x = %.2lf\n", x1); } else if (y1 == y2) { printf("Уравнение прямой: y = %.2lf\n", y1); } else { double k = (y2 - y1) / (x2 - x1); double b = y1 - k * x1; printf("Уравнение прямой: y = "); if (k == 1) { printf("x"); } else if (k == -1) { printf("-x"); } else { printf("%.2lf*x", k); } if (b > 0) { printf(" + %.2lf", b); } else if (b < 0) { printf(" - %.2lf", -b); } printf("\n"); } } } // ЗАДАЧА 4: ЦИФРЫ void digits() { printf("\n=== Задача 4: Цифры ===\n"); while (1) { int number; while (1) { number = getValidNumber("Введите число от 100 до 100000000 (0 для выхода): "); if (number == 0) return; if (number >= 100 && number <= 100000000) { break; } else { printf("Число должно быть в диапазоне [100..100000000].\n"); } } int sum = 0; long long product = 1; int temp = number; int digit; while (temp > 0) { digit = temp % 10; sum += digit; product *= digit; temp /= 10; } printf("Число: %d\n", number); printf("Сумма цифр: %d\n", sum); printf("Произведение цифр: %lld\n", product); } } // ЗАДАЧА 5: ПРОСТЫЕ МНОЖИТЕЛИ void primeFactors() { printf("\n=== Задача 5: Простые множители ===\n"); while (1) { int number; while (1) { number = getValidNumber("Введите положительное число (0 для выхода): "); if (number == 0) return; if (number > 0) { break; } else { printf("Число должно быть положительным.\n"); } } printf("Простые множители числа %d в порядке убывания: ", number); if (number == 1) { printf("1\n"); continue; } int temp = number; int factors[100]; int count = 0; for (int i = 2; i <= temp; i++) { while (temp % i == 0 && isPrime(i)) { factors[count++] = i; temp /= i; } } if (count > 0) { for (int i = count - 1; i >= 0; i--) { printf("%d", factors[i]); if (i > 0) printf(" * "); } printf("\n"); } else { printf("%d (простое число)\n", number); } } } // ЗАДАЧА 6: ФИБОНАЧЧИ void fibonacci() { printf("\n=== Задача 6: Фибоначчи ===\n"); while (1) { int number; while (1) { number = getValidNumber("Введите положительное число (0 для выхода): "); if (number == 0) return; if (number > 0) { break; } else { printf("Число должно быть положительным.\n"); } } if (number == 1) { printf("Ближайшее число Фибоначчи к %d: 1\n", number); continue; } int prev = 1, curr = 1, next; while (curr < number) { next = prev + curr; prev = curr; curr = next; } int closest; if (curr - number <= number - prev) { closest = curr; } else { closest = prev; } printf("Ближайшее число Фибоначчи к %d: %d\n", number, closest); } } // ЗАДАЧА 7: КАЛЕНДАРЬ // Задача 7: Календарь int is_leap_year(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } int days_in_month(int month, int year) { switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: return is_leap_year(year) ? 29 : 28; default: return 0; } } int get_day_of_week(int day, int month, int year) { long days = 0; // Добавляем дни за полные годы с 1970 for (int y = 1970; y < year; y++) { days += is_leap_year(y) ? 366 : 365; } // Добавляем дни за полные месяцы в текущем году for (int m = 1; m < month; m++) { days += days_in_month(m, year); } // Добавляем дни в текущем месяце days += (day - 1); // 1 января 1970 - четверг (это 3-й день недели если считать с понедельника=0) // Поэтому базовый день недели для 0 дней = 3 (четверг) int day_of_week = (3 + days) % 7; return day_of_week; } void print_calendar(int month, int year) { // Названия месяцев char *month_names[] = { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" }; // Названия дней недели (с понедельника) char *day_names[] = {"Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"}; printf("\n %s %d\n", month_names[month - 1], year); printf("-------------------------\n"); // Выводим заголовок с днями недели for (int i = 0; i < 7; i++) { printf("%s ", day_names[i]); } printf("\n"); // Определяем день недели для 1-го числа месяца // 0 - понедельник, 1 - вторник, ..., 6 - воскресенье int first_day = get_day_of_week(1, month, year); // Выводим пробелы перед первым числом for (int i = 0; i < first_day; i++) { printf(" "); } // Выводим числа месяца int days_in_current_month = days_in_month(month, year); for (int day = 1; day <= days_in_current_month; day++) { printf("%2d ", day); // Переход на новую строку после воскресенья if ((first_day + day) % 7 == 0) { printf("\n"); } } // Если последняя строка не завершилась переводом, добавим его if ((first_day + days_in_current_month) % 7 != 0) { printf("\n"); } } void calendar() { int year, month; while (1) { printf("\nВведите год (0 для выхода): "); while (scanf("%d", &year) != 1) { printf("Ошибка! Введите целое число: "); while (getchar() != '\n'); } if (year == 0) { printf("Завершение вывода календарей.\n"); break; } if (year < 1) { printf("Ошибка! Год должен быть положительным числом.\n"); continue; } printf("Введите месяц (1-12): "); while (scanf("%d", &month) != 1) { printf("Ошибка! Введите целое число: "); while (getchar() != '\n'); } if (month < 1 || month > 12) { printf("Ошибка! Месяц должен быть в диапазоне от 1 до 12.\n"); continue; } print_calendar(month, year); } } // ОСНОВНАЯ ФУНКЦИЯ int main() { printf("ИБ06у Тихонов Д.В.\n"); calculator(); triangle(); lineEquation(); digits(); primeFactors(); fibonacci(); calendar(); printf("Программа завершена.\n"); return 0; }