// ============================================================
// Лабораторная работа 5. Введение в C++
// Все 20 заданий для самостоятельной работы
// ============================================================
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <cctype>
using namespace std;
// ============================================================
// Задание 1. Перевод температур (C->F, C->K и обратно)
// ============================================================
void task1() {
cout << "\n=== Задание 1: Перевод температур ===" << endl;
cout << "Выберите операцию:" << endl;
cout << "1 - Цельсий -> Фаренгейт" << endl;
cout << "2 - Фаренгейт -> Цельсий" << endl;
cout << "3 - Цельсий -> Кельвин" << endl;
cout << "4 - Кельвин -> Цельсий" << endl;
int choice;
double temp;
cin >> choice >> temp;
switch (choice) {
case 1: cout << temp << " C = " << temp * 9.0 / 5.0 + 32 << " F" << endl; break;
case 2: cout << temp << " F = " << (temp - 32) * 5.0 / 9.0 << " C" << endl; break;
case 3: cout << temp << " C = " << temp + 273.15 << " K" << endl; break;
case 4: cout << temp << " K = " << temp - 273.15 << " C" << endl; break;
default: cout << "Неверный выбор" << endl;
}
}
// ============================================================
// Задание 2. Максимальное из трёх чисел
// ============================================================
void task2() {
cout << "\n=== Задание 2: Максимум из трёх чисел ===" << endl;
double a, b, c;
cout << "Введите три числа: ";
cin >> a >> b >> c;
double maxVal = a;
if (b > maxVal) maxVal = b;
if (c > maxVal) maxVal = c;
cout << "Максимальное: " << maxVal << endl;
}
// ============================================================
// Задание 3. «копеек» / «копейка» / «копейки» для k от 1 до 99
// ============================================================
void task3() {
cout << "\n=== Задание 3: Склонение «копеек» ===" << endl;
int k;
cout << "Введите число от 1 до 99: ";
cin >> k;
int last2 = k % 100;
int last1 = k % 10;
string word;
if (last2 >= 11 && last2 <= 19) {
word = "копеек";
} else if (last1 == 1) {
word = "копейка";
} else if (last1 >= 2 && last1 <= 4) {
word = "копейки";
} else {
word = "копеек";
}
cout << k << " " << word << endl;
}
// ============================================================
// Задание 4. День недели по дате (формула Зеллера + два варианта)
// ============================================================
// Формула Зеллера (стандартная)
string weekdayZeller(int day, int month, int year) {
// Корректируем месяц: январь и февраль — 13, 14 предыдущего года
if (month < 3) { month += 12; year--; }
int k = year % 100;
int j = year / 100;
int h = (day + (13 * (month + 1)) / 5 + k + k / 4 + j / 4 + 5 * j) % 7;
// h: 0=Суб, 1=Вс, 2=Пн, ..., 6=Пт
string days[] = {"Суббота","Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница"};
return days[h];
}
// Формула Гаусса (альтернатива)
string weekdayGauss(int day, int month, int year) {
static const int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
if (month < 3) year--;
int w = (year + year/4 - year/100 + year/400 + t[month-1] + day) % 7;
string days[] = {"Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"};
return days[w];
}
void task4() {
cout << "\n=== Задание 4: День недели по дате ===" << endl;
int d, m, y;
cout << "Введите дату (день месяц год): ";
cin >> d >> m >> y;
cout << "Формула Зеллера: " << weekdayZeller(d, m, y) << endl;
cout << "Формула Гаусса: " << weekdayGauss(d, m, y) << endl;
}
// ============================================================
// Задание 5. n-я степень числа 2 без цикла и математических функций
// (с помощью побитового сдвига)
// ============================================================
void task5() {
cout << "\n=== Задание 5: 2^n без цикла и math-функций ===" << endl;
int n;
cout << "Введите n (0..62): ";
cin >> n;
long long result = 1LL << n; // побитовый сдвиг = 2^n
cout << "2^" << n << " = " << result << endl;
}
// ============================================================
// Задание 6. Факториал N
// ============================================================
void task6() {
cout << "\n=== Задание 6: Факториал N ===" << endl;
int n;
cout << "Введите N: ";
cin >> n;
long long fact = 1;
for (int i = 2; i <= n; i++) fact *= i;
cout << n << "! = " << fact << endl;
}
// ============================================================
// Задание 7. Максимальный и минимальный элементы массива
// ============================================================
void findMinMax(const int* arr, int len, int& mn, int& mx) {
mn = mx = arr[0];
for (int i = 1; i < len; i++) {
if (arr[i] < mn) mn = arr[i];
if (arr[i] > mx) mx = arr[i];
}
}
void task7() {
cout << "\n=== Задание 7: Мин/макс массива ===" << endl;
int n;
cout << "Введите количество элементов: ";
cin >> n;
int* arr = new int[n];
cout << "Введите элементы: ";
for (int i = 0; i < n; i++) cin >> arr[i];
int mn, mx;
findMinMax(arr, n, mn, mx);
cout << "Минимум: " << mn << ", Максимум: " << mx << endl;
delete[] arr;
}
// ============================================================
// Задание 8. Умножение чётных индексов на 2, нечётных на 3
// ============================================================
void task8() {
cout << "\n=== Задание 8: Умножение по чётности индекса ===" << endl;
int n;
cout << "Введите N: ";
cin >> n;
int* a = new int[n];
int* b = new int[n];
cout << "Введите элементы: ";
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++)
b[i] = (i % 2 == 0) ? a[i] * 2 : a[i] * 3;
cout << "Результат: ";
for (int i = 0; i < n; i++) cout << b[i] << " ";
cout << endl;
delete[] a;
delete[] b;
}
// ============================================================
// Задание 9. Замена 5->1 и 2->0 в массиве из 15 элементов
// ============================================================
void replaceValues(int* arr, int len) {
for (int i = 0; i < len; i++) {
if (arr[i] == 5) arr[i] = 1;
else if (arr[i] == 2) arr[i] = 0;
}
}
void task9() {
cout << "\n=== Задание 9: Замена 5->1, 2->0 ===" << endl;
const int LEN = 15;
int arr[LEN];
cout << "Введите 15 целых чисел: ";
for (int i = 0; i < LEN; i++) cin >> arr[i];
replaceValues(arr, LEN);
cout << "После замены: ";
for (int i = 0; i < LEN; i++) cout << arr[i] << " ";
cout << endl;
}
// ============================================================
// Задание 10. Столбиковая диаграмма из '*'
// ============================================================
void task10() {
cout << "\n=== Задание 10: Столбиковая диаграмма ===" << endl;
const int N = 50;
int arr[N];
cout << "Введите 50 чисел от 0 до 20:" << endl;
for (int i = 0; i < N; i++) cin >> arr[i];
cout << endl;
// Находим максимум для высоты
int maxVal = 0;
for (int i = 0; i < N; i++) if (arr[i] > maxVal) maxVal = arr[i];
// Печатаем построчно сверху вниз
for (int row = maxVal; row >= 1; row--) {
for (int col = 0; col < N; col++) {
cout << (arr[col] >= row ? '*' : ' ');
}
cout << endl;
}
// Нумерация столбцов
for (int i = 0; i < N; i++) cout << (i % 10);
cout << endl;
}
// ============================================================
// Задание 11. След матрицы 20×20 (сумма диагональных элементов)
// ============================================================
int matrixTrace(int a[][20], int n) {
int trace = 0;
for (int i = 0; i < n; i++) trace += a[i][i];
return trace;
}
void task11() {
cout << "\n=== Задание 11: След матрицы 20×20 ===" << endl;
const int N = 20;
static int a[N][N];
cout << "Введите матрицу " << N << "x" << N << " (" << N*N << " чисел):" << endl;
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
cin >> a[i][j];
cout << "След матрицы: " << matrixTrace(a, N) << endl;
}
// ============================================================
// Задание 12. Транспонирование матрицы
// ============================================================
void transpose(int a[][20], int n) {
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
swap(a[i][j], a[j][i]);
}
void task12() {
cout << "\n=== Задание 12: Транспонирование матрицы ===" << endl;
const int N = 4; // демонстрация на 4×4
int a[20][20] = {
{1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16}
};
cout << "Исходная 4×4:" << endl;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) cout << a[i][j] << "\t";
cout << endl;
}
transpose(a, N);
cout << "Транспонированная:" << endl;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) cout << a[i][j] << "\t";
cout << endl;
}
}
// ============================================================
// Задание 13. Сумма матриц A + B = C
// ============================================================
const int MAT_ROWS = 3;
const int MAT_COLS = 3;
void matrixAdd(int A[][MAT_COLS], int B[][MAT_COLS], int C[][MAT_COLS]) {
for (int i = 0; i < MAT_ROWS; i++)
for (int j = 0; j < MAT_COLS; j++)
C[i][j] = A[i][j] + B[i][j];
}
void task13() {
cout << "\n=== Задание 13: Сумма матриц ===" << endl;
int A[MAT_ROWS][MAT_COLS] = {{1,2,3},{4,5,6},{7,8,9}};
int B[MAT_ROWS][MAT_COLS] = {{9,8,7},{6,5,4},{3,2,1}};
int C[MAT_ROWS][MAT_COLS];
matrixAdd(A, B, C);
cout << "C = A + B:" << endl;
for (int i = 0; i < MAT_ROWS; i++) {
for (int j = 0; j < MAT_COLS; j++) cout << C[i][j] << "\t";
cout << endl;
}
}
// ============================================================
// Задание 14. Среднее по строкам двумерного массива
// ============================================================
void task14() {
cout << "\n=== Задание 14: Среднее по строкам ===" << endl;
const int ROWS = 3, COLS = 4;
int a[ROWS][COLS] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
double avg[ROWS];
for (int i = 0; i < ROWS; i++) {
double sum = 0;
for (int j = 0; j < COLS; j++) sum += a[i][j];
avg[i] = sum / COLS;
}
cout << "Среднее по строкам: ";
for (int i = 0; i < ROWS; i++) cout << avg[i] << " ";
cout << endl;
}
// ============================================================
// Задание 15. Подсчёт отличников и неуспевающих
// ============================================================
void task15() {
cout << "\n=== Задание 15: Отличники и неуспевающие ===" << endl;
const int STUDENTS = 4, SUBJECTS = 3;
int grades[STUDENTS][SUBJECTS] = {
{5, 5, 5}, // отличник
{5, 4, 3}, // обычный
{2, 4, 5}, // неуспевающий
{5, 5, 4} // обычный
};
int excellent = 0, failing = 0;
for (int i = 0; i < STUDENTS; i++) {
bool allFive = true, hasTwo = false;
for (int j = 0; j < SUBJECTS; j++) {
if (grades[i][j] != 5) allFive = false;
if (grades[i][j] == 2) hasTwo = true;
}
if (allFive) excellent++;
if (hasTwo) failing++;
}
cout << "Отличников: " << excellent << ", Неуспевающих: " << failing << endl;
}
// ============================================================
// Задание 16. Длина отрезка по координатам двух точек
// ============================================================
double segmentLength(double x1, double y1, double x2 = 0.0, double y2 = 0.0) {
return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}
void task16() {
cout << "\n=== Задание 16: Длина отрезка ===" << endl;
double x1, y1, x2, y2;
cout << "Введите координаты первой точки (x y): ";
cin >> x1 >> y1;
cout << "Введите координаты второй точки (x y), или 0 0 для расстояния от начала координат: ";
cin >> x2 >> y2;
cout << "Длина отрезка: " << segmentLength(x1, y1, x2, y2) << endl;
cout << "Расстояние от начала координат до точки 1: " << segmentLength(x1, y1) << endl;
}
// ============================================================
// Задание 17. Перевод десятичного числа в двоичную систему
// ============================================================
void task17() {
cout << "\n=== Задание 17: Десятичное -> двоичное ===" << endl;
long long n;
cout << "Введите целое число: ";
cin >> n;
if (n == 0) { cout << "0" << endl; return; }
bool negative = (n < 0);
if (negative) n = -n;
string bits = "";
while (n > 0) {
bits = char('0' + n % 2) + bits;
n /= 2;
}
if (negative) bits = "-" + bits;
cout << "Двоичное: " << bits << endl;
}
// ============================================================
// Задание 18. Проверка на палиндром
// ============================================================
bool isPalindrome(const string& s) {
// Оставляем только буквы (без пробелов и знаков), приводим к нижнему регистру
string clean = "";
for (char c : s) {
if (isalpha((unsigned char)c)) {
// Простая обработка кириллицы — сравниваем как есть (UTF-8 байты симметричны)
clean += tolower((unsigned char)c);
}
}
string rev = clean;
reverse(rev.begin(), rev.end());
return clean == rev;
}
void task18() {
cout << "\n=== Задание 18: Проверка палиндрома ===" << endl;
cin.ignore();
string s;
cout << "Введите строку: ";
getline(cin, s);
cout << (isPalindrome(s) ? "Палиндром" : "Не палиндром") << endl;
// Тестовые примеры из задания (латинские)
string tests[] = {"SHALAS", "RACECAR", "HELLO", "AROZAUPALANAPAZORA"};
for (const string& t : tests)
cout << t << " -> " << (isPalindrome(t) ? "палиндром" : "не палиндром") << endl;
}
// ============================================================
// Задание 19. Перевод числа в римскую запись
// ============================================================
string toRoman(int n) {
if (n <= 0 || n > 3999) return "Недопустимое значение";
const int vals[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
const string syms[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
string result = "";
for (int i = 0; i < 13; i++) {
while (n >= vals[i]) {
result += syms[i];
n -= vals[i];
}
}
return result;
}
void task19() {
cout << "\n=== Задание 19: Число -> римская запись ===" << endl;
int n;
cout << "Введите натуральное число (1-3999): ";
cin >> n;
cout << n << " = " << toRoman(n) << endl;
}
// ============================================================
// Задание 20. Разбор пути файла
// ============================================================
void task20() {
cout << "\n=== Задание 20: Разбор пути файла ===" << endl;
cin.ignore();
string path;
cout << "Введите путь к файлу: ";
getline(cin, path);
// Разделитель пути
size_t lastSlash = path.find_last_of("/\\");
size_t lastDot = path.find_last_of('.');
string dir = (lastSlash != string::npos) ? path.substr(0, lastSlash) : "";
string filename = (lastSlash != string::npos) ? path.substr(lastSlash + 1) : path;
string ext = "";
string nameOnly = filename;
// Расширение ищем только в части filename (после последнего слеша)
size_t dotInFile = filename.find_last_of('.');
if (dotInFile != string::npos) {
ext = filename.substr(dotInFile + 1);
nameOnly = filename.substr(0, dotInFile);
}
// Имя последней папки
string lastFolder = "";
if (!dir.empty()) {
size_t prevSlash = dir.find_last_of("/\\");
lastFolder = (prevSlash != string::npos) ? dir.substr(prevSlash + 1) : dir;
}
// Путь с расширением .html
string pathHtml = dir + (dir.empty() ? "" : "/") + nameOnly + ".html";
cout << "а) Путь без имени файла: \"" << dir << "\"" << endl;
cout << "б) Имя файла с расширением: \"" << filename << "\"" << endl;
cout << "в) Расширение: \"" << ext << "\"" << endl;
cout << "г) Имя файла без расширения и пути: \"" << nameOnly << "\"" << endl;
cout << "д) Имя последней папки: \"" << lastFolder << "\"" << endl;
cout << "е) Путь с расширением .html: \"" << pathHtml << "\"" << endl;
}
// ============================================================
// main — меню выбора задания
// ============================================================
int main() {
cout << "Лабораторная работа 5. C++" << endl;
cout << "Выберите задание (1-20): ";
int choice;
cin >> choice;
switch (choice) {
case 1: task1(); break;
case 2: task2(); break;
case 3: task3(); break;
case 4: task4(); break;
case 5: task5(); break;
case 6: task6(); break;
case 7: task7(); break;
case 8: task8(); break;
case 9: task9(); break;
case 10: task10(); break;
case 11: task11(); break;
case 12: task12(); break;
case 13: task13(); break;
case 14: task14(); break;
case 15: task15(); break;
case 16: task16(); break;
case 17: task17(); break;
case 18: task18(); break;
case 19: task19(); break;
case 20: task20(); break;
default: cout << "Неверный выбор" << endl;
}
return 0;
}