fork download
  1. // ============================================================
  2. // Лабораторная работа 5. Введение в C++
  3. // Все 20 заданий для самостоятельной работы
  4. // ============================================================
  5.  
  6. #include <iostream>
  7. #include <cmath>
  8. #include <cstring>
  9. #include <string>
  10. #include <algorithm>
  11. #include <cctype>
  12. using namespace std;
  13.  
  14. // ============================================================
  15. // Задание 1. Перевод температур (C->F, C->K и обратно)
  16. // ============================================================
  17. void task1() {
  18. cout << "\n=== Задание 1: Перевод температур ===" << endl;
  19. cout << "Выберите операцию:" << endl;
  20. cout << "1 - Цельсий -> Фаренгейт" << endl;
  21. cout << "2 - Фаренгейт -> Цельсий" << endl;
  22. cout << "3 - Цельсий -> Кельвин" << endl;
  23. cout << "4 - Кельвин -> Цельсий" << endl;
  24. int choice;
  25. double temp;
  26. cin >> choice >> temp;
  27. switch (choice) {
  28. case 1: cout << temp << " C = " << temp * 9.0 / 5.0 + 32 << " F" << endl; break;
  29. case 2: cout << temp << " F = " << (temp - 32) * 5.0 / 9.0 << " C" << endl; break;
  30. case 3: cout << temp << " C = " << temp + 273.15 << " K" << endl; break;
  31. case 4: cout << temp << " K = " << temp - 273.15 << " C" << endl; break;
  32. default: cout << "Неверный выбор" << endl;
  33. }
  34. }
  35.  
  36. // ============================================================
  37. // Задание 2. Максимальное из трёх чисел
  38. // ============================================================
  39. void task2() {
  40. cout << "\n=== Задание 2: Максимум из трёх чисел ===" << endl;
  41. double a, b, c;
  42. cout << "Введите три числа: ";
  43. cin >> a >> b >> c;
  44. double maxVal = a;
  45. if (b > maxVal) maxVal = b;
  46. if (c > maxVal) maxVal = c;
  47. cout << "Максимальное: " << maxVal << endl;
  48. }
  49.  
  50. // ============================================================
  51. // Задание 3. «копеек» / «копейка» / «копейки» для k от 1 до 99
  52. // ============================================================
  53. void task3() {
  54. cout << "\n=== Задание 3: Склонение «копеек» ===" << endl;
  55. int k;
  56. cout << "Введите число от 1 до 99: ";
  57. cin >> k;
  58. int last2 = k % 100;
  59. int last1 = k % 10;
  60. string word;
  61. if (last2 >= 11 && last2 <= 19) {
  62. word = "копеек";
  63. } else if (last1 == 1) {
  64. word = "копейка";
  65. } else if (last1 >= 2 && last1 <= 4) {
  66. word = "копейки";
  67. } else {
  68. word = "копеек";
  69. }
  70. cout << k << " " << word << endl;
  71. }
  72.  
  73. // ============================================================
  74. // Задание 4. День недели по дате (формула Зеллера + два варианта)
  75. // ============================================================
  76. // Формула Зеллера (стандартная)
  77. string weekdayZeller(int day, int month, int year) {
  78. // Корректируем месяц: январь и февраль — 13, 14 предыдущего года
  79. if (month < 3) { month += 12; year--; }
  80. int k = year % 100;
  81. int j = year / 100;
  82. int h = (day + (13 * (month + 1)) / 5 + k + k / 4 + j / 4 + 5 * j) % 7;
  83. // h: 0=Суб, 1=Вс, 2=Пн, ..., 6=Пт
  84. string days[] = {"Суббота","Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница"};
  85. return days[h];
  86. }
  87.  
  88. // Формула Гаусса (альтернатива)
  89. string weekdayGauss(int day, int month, int year) {
  90. static const int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  91. if (month < 3) year--;
  92. int w = (year + year/4 - year/100 + year/400 + t[month-1] + day) % 7;
  93. string days[] = {"Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"};
  94. return days[w];
  95. }
  96.  
  97. void task4() {
  98. cout << "\n=== Задание 4: День недели по дате ===" << endl;
  99. int d, m, y;
  100. cout << "Введите дату (день месяц год): ";
  101. cin >> d >> m >> y;
  102. cout << "Формула Зеллера: " << weekdayZeller(d, m, y) << endl;
  103. cout << "Формула Гаусса: " << weekdayGauss(d, m, y) << endl;
  104. }
  105.  
  106. // ============================================================
  107. // Задание 5. n-я степень числа 2 без цикла и математических функций
  108. // (с помощью побитового сдвига)
  109. // ============================================================
  110. void task5() {
  111. cout << "\n=== Задание 5: 2^n без цикла и math-функций ===" << endl;
  112. int n;
  113. cout << "Введите n (0..62): ";
  114. cin >> n;
  115. long long result = 1LL << n; // побитовый сдвиг = 2^n
  116. cout << "2^" << n << " = " << result << endl;
  117. }
  118.  
  119. // ============================================================
  120. // Задание 6. Факториал N
  121. // ============================================================
  122. void task6() {
  123. cout << "\n=== Задание 6: Факториал N ===" << endl;
  124. int n;
  125. cout << "Введите N: ";
  126. cin >> n;
  127. long long fact = 1;
  128. for (int i = 2; i <= n; i++) fact *= i;
  129. cout << n << "! = " << fact << endl;
  130. }
  131.  
  132. // ============================================================
  133. // Задание 7. Максимальный и минимальный элементы массива
  134. // ============================================================
  135. void findMinMax(const int* arr, int len, int& mn, int& mx) {
  136. mn = mx = arr[0];
  137. for (int i = 1; i < len; i++) {
  138. if (arr[i] < mn) mn = arr[i];
  139. if (arr[i] > mx) mx = arr[i];
  140. }
  141. }
  142.  
  143. void task7() {
  144. cout << "\n=== Задание 7: Мин/макс массива ===" << endl;
  145. int n;
  146. cout << "Введите количество элементов: ";
  147. cin >> n;
  148. int* arr = new int[n];
  149. cout << "Введите элементы: ";
  150. for (int i = 0; i < n; i++) cin >> arr[i];
  151. int mn, mx;
  152. findMinMax(arr, n, mn, mx);
  153. cout << "Минимум: " << mn << ", Максимум: " << mx << endl;
  154. delete[] arr;
  155. }
  156.  
  157. // ============================================================
  158. // Задание 8. Умножение чётных индексов на 2, нечётных на 3
  159. // ============================================================
  160. void task8() {
  161. cout << "\n=== Задание 8: Умножение по чётности индекса ===" << endl;
  162. int n;
  163. cout << "Введите N: ";
  164. cin >> n;
  165. int* a = new int[n];
  166. int* b = new int[n];
  167. cout << "Введите элементы: ";
  168. for (int i = 0; i < n; i++) cin >> a[i];
  169. for (int i = 0; i < n; i++)
  170. b[i] = (i % 2 == 0) ? a[i] * 2 : a[i] * 3;
  171. cout << "Результат: ";
  172. for (int i = 0; i < n; i++) cout << b[i] << " ";
  173. cout << endl;
  174. delete[] a;
  175. delete[] b;
  176. }
  177.  
  178. // ============================================================
  179. // Задание 9. Замена 5->1 и 2->0 в массиве из 15 элементов
  180. // ============================================================
  181. void replaceValues(int* arr, int len) {
  182. for (int i = 0; i < len; i++) {
  183. if (arr[i] == 5) arr[i] = 1;
  184. else if (arr[i] == 2) arr[i] = 0;
  185. }
  186. }
  187.  
  188. void task9() {
  189. cout << "\n=== Задание 9: Замена 5->1, 2->0 ===" << endl;
  190. const int LEN = 15;
  191. int arr[LEN];
  192. cout << "Введите 15 целых чисел: ";
  193. for (int i = 0; i < LEN; i++) cin >> arr[i];
  194. replaceValues(arr, LEN);
  195. cout << "После замены: ";
  196. for (int i = 0; i < LEN; i++) cout << arr[i] << " ";
  197. cout << endl;
  198. }
  199.  
  200. // ============================================================
  201. // Задание 10. Столбиковая диаграмма из '*'
  202. // ============================================================
  203. void task10() {
  204. cout << "\n=== Задание 10: Столбиковая диаграмма ===" << endl;
  205. const int N = 50;
  206. int arr[N];
  207. cout << "Введите 50 чисел от 0 до 20:" << endl;
  208. for (int i = 0; i < N; i++) cin >> arr[i];
  209. cout << endl;
  210. // Находим максимум для высоты
  211. int maxVal = 0;
  212. for (int i = 0; i < N; i++) if (arr[i] > maxVal) maxVal = arr[i];
  213. // Печатаем построчно сверху вниз
  214. for (int row = maxVal; row >= 1; row--) {
  215. for (int col = 0; col < N; col++) {
  216. cout << (arr[col] >= row ? '*' : ' ');
  217. }
  218. cout << endl;
  219. }
  220. // Нумерация столбцов
  221. for (int i = 0; i < N; i++) cout << (i % 10);
  222. cout << endl;
  223. }
  224.  
  225. // ============================================================
  226. // Задание 11. След матрицы 20×20 (сумма диагональных элементов)
  227. // ============================================================
  228. int matrixTrace(int a[][20], int n) {
  229. int trace = 0;
  230. for (int i = 0; i < n; i++) trace += a[i][i];
  231. return trace;
  232. }
  233.  
  234. void task11() {
  235. cout << "\n=== Задание 11: След матрицы 20×20 ===" << endl;
  236. const int N = 20;
  237. static int a[N][N];
  238. cout << "Введите матрицу " << N << "x" << N << " (" << N*N << " чисел):" << endl;
  239. for (int i = 0; i < N; i++)
  240. for (int j = 0; j < N; j++)
  241. cin >> a[i][j];
  242. cout << "След матрицы: " << matrixTrace(a, N) << endl;
  243. }
  244.  
  245. // ============================================================
  246. // Задание 12. Транспонирование матрицы
  247. // ============================================================
  248. void transpose(int a[][20], int n) {
  249. for (int i = 0; i < n; i++)
  250. for (int j = i + 1; j < n; j++)
  251. swap(a[i][j], a[j][i]);
  252. }
  253.  
  254. void task12() {
  255. cout << "\n=== Задание 12: Транспонирование матрицы ===" << endl;
  256. const int N = 4; // демонстрация на 4×4
  257. int a[20][20] = {
  258. {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16}
  259. };
  260. cout << "Исходная 4×4:" << endl;
  261. for (int i = 0; i < N; i++) {
  262. for (int j = 0; j < N; j++) cout << a[i][j] << "\t";
  263. cout << endl;
  264. }
  265. transpose(a, N);
  266. cout << "Транспонированная:" << endl;
  267. for (int i = 0; i < N; i++) {
  268. for (int j = 0; j < N; j++) cout << a[i][j] << "\t";
  269. cout << endl;
  270. }
  271. }
  272.  
  273. // ============================================================
  274. // Задание 13. Сумма матриц A + B = C
  275. // ============================================================
  276. const int MAT_ROWS = 3;
  277. const int MAT_COLS = 3;
  278.  
  279. void matrixAdd(int A[][MAT_COLS], int B[][MAT_COLS], int C[][MAT_COLS]) {
  280. for (int i = 0; i < MAT_ROWS; i++)
  281. for (int j = 0; j < MAT_COLS; j++)
  282. C[i][j] = A[i][j] + B[i][j];
  283. }
  284.  
  285. void task13() {
  286. cout << "\n=== Задание 13: Сумма матриц ===" << endl;
  287. int A[MAT_ROWS][MAT_COLS] = {{1,2,3},{4,5,6},{7,8,9}};
  288. int B[MAT_ROWS][MAT_COLS] = {{9,8,7},{6,5,4},{3,2,1}};
  289. int C[MAT_ROWS][MAT_COLS];
  290. matrixAdd(A, B, C);
  291. cout << "C = A + B:" << endl;
  292. for (int i = 0; i < MAT_ROWS; i++) {
  293. for (int j = 0; j < MAT_COLS; j++) cout << C[i][j] << "\t";
  294. cout << endl;
  295. }
  296. }
  297.  
  298. // ============================================================
  299. // Задание 14. Среднее по строкам двумерного массива
  300. // ============================================================
  301. void task14() {
  302. cout << "\n=== Задание 14: Среднее по строкам ===" << endl;
  303. const int ROWS = 3, COLS = 4;
  304. int a[ROWS][COLS] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  305. double avg[ROWS];
  306. for (int i = 0; i < ROWS; i++) {
  307. double sum = 0;
  308. for (int j = 0; j < COLS; j++) sum += a[i][j];
  309. avg[i] = sum / COLS;
  310. }
  311. cout << "Среднее по строкам: ";
  312. for (int i = 0; i < ROWS; i++) cout << avg[i] << " ";
  313. cout << endl;
  314. }
  315.  
  316. // ============================================================
  317. // Задание 15. Подсчёт отличников и неуспевающих
  318. // ============================================================
  319. void task15() {
  320. cout << "\n=== Задание 15: Отличники и неуспевающие ===" << endl;
  321. const int STUDENTS = 4, SUBJECTS = 3;
  322. int grades[STUDENTS][SUBJECTS] = {
  323. {5, 5, 5}, // отличник
  324. {5, 4, 3}, // обычный
  325. {2, 4, 5}, // неуспевающий
  326. {5, 5, 4} // обычный
  327. };
  328. int excellent = 0, failing = 0;
  329. for (int i = 0; i < STUDENTS; i++) {
  330. bool allFive = true, hasTwo = false;
  331. for (int j = 0; j < SUBJECTS; j++) {
  332. if (grades[i][j] != 5) allFive = false;
  333. if (grades[i][j] == 2) hasTwo = true;
  334. }
  335. if (allFive) excellent++;
  336. if (hasTwo) failing++;
  337. }
  338. cout << "Отличников: " << excellent << ", Неуспевающих: " << failing << endl;
  339. }
  340.  
  341. // ============================================================
  342. // Задание 16. Длина отрезка по координатам двух точек
  343. // ============================================================
  344. double segmentLength(double x1, double y1, double x2 = 0.0, double y2 = 0.0) {
  345. return sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
  346. }
  347.  
  348. void task16() {
  349. cout << "\n=== Задание 16: Длина отрезка ===" << endl;
  350. double x1, y1, x2, y2;
  351. cout << "Введите координаты первой точки (x y): ";
  352. cin >> x1 >> y1;
  353. cout << "Введите координаты второй точки (x y), или 0 0 для расстояния от начала координат: ";
  354. cin >> x2 >> y2;
  355. cout << "Длина отрезка: " << segmentLength(x1, y1, x2, y2) << endl;
  356. cout << "Расстояние от начала координат до точки 1: " << segmentLength(x1, y1) << endl;
  357. }
  358.  
  359. // ============================================================
  360. // Задание 17. Перевод десятичного числа в двоичную систему
  361. // ============================================================
  362. void task17() {
  363. cout << "\n=== Задание 17: Десятичное -> двоичное ===" << endl;
  364. long long n;
  365. cout << "Введите целое число: ";
  366. cin >> n;
  367.  
  368. if (n == 0) { cout << "0" << endl; return; }
  369.  
  370. bool negative = (n < 0);
  371. if (negative) n = -n;
  372.  
  373. string bits = "";
  374. while (n > 0) {
  375. bits = char('0' + n % 2) + bits;
  376. n /= 2;
  377. }
  378. if (negative) bits = "-" + bits;
  379. cout << "Двоичное: " << bits << endl;
  380. }
  381.  
  382. // ============================================================
  383. // Задание 18. Проверка на палиндром
  384. // ============================================================
  385. bool isPalindrome(const string& s) {
  386. // Оставляем только буквы (без пробелов и знаков), приводим к нижнему регистру
  387. string clean = "";
  388. for (char c : s) {
  389. if (isalpha((unsigned char)c)) {
  390. // Простая обработка кириллицы — сравниваем как есть (UTF-8 байты симметричны)
  391. clean += tolower((unsigned char)c);
  392. }
  393. }
  394. string rev = clean;
  395. reverse(rev.begin(), rev.end());
  396. return clean == rev;
  397. }
  398.  
  399. void task18() {
  400. cout << "\n=== Задание 18: Проверка палиндрома ===" << endl;
  401. cin.ignore();
  402. string s;
  403. cout << "Введите строку: ";
  404. getline(cin, s);
  405. cout << (isPalindrome(s) ? "Палиндром" : "Не палиндром") << endl;
  406.  
  407. // Тестовые примеры из задания (латинские)
  408. string tests[] = {"SHALAS", "RACECAR", "HELLO", "AROZAUPALANAPAZORA"};
  409. for (const string& t : tests)
  410. cout << t << " -> " << (isPalindrome(t) ? "палиндром" : "не палиндром") << endl;
  411. }
  412.  
  413. // ============================================================
  414. // Задание 19. Перевод числа в римскую запись
  415. // ============================================================
  416. string toRoman(int n) {
  417. if (n <= 0 || n > 3999) return "Недопустимое значение";
  418. const int vals[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
  419. const string syms[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
  420. string result = "";
  421. for (int i = 0; i < 13; i++) {
  422. while (n >= vals[i]) {
  423. result += syms[i];
  424. n -= vals[i];
  425. }
  426. }
  427. return result;
  428. }
  429.  
  430. void task19() {
  431. cout << "\n=== Задание 19: Число -> римская запись ===" << endl;
  432. int n;
  433. cout << "Введите натуральное число (1-3999): ";
  434. cin >> n;
  435. cout << n << " = " << toRoman(n) << endl;
  436. }
  437.  
  438. // ============================================================
  439. // Задание 20. Разбор пути файла
  440. // ============================================================
  441. void task20() {
  442. cout << "\n=== Задание 20: Разбор пути файла ===" << endl;
  443. cin.ignore();
  444. string path;
  445. cout << "Введите путь к файлу: ";
  446. getline(cin, path);
  447.  
  448. // Разделитель пути
  449. size_t lastSlash = path.find_last_of("/\\");
  450. size_t lastDot = path.find_last_of('.');
  451.  
  452. string dir = (lastSlash != string::npos) ? path.substr(0, lastSlash) : "";
  453. string filename = (lastSlash != string::npos) ? path.substr(lastSlash + 1) : path;
  454. string ext = "";
  455. string nameOnly = filename;
  456.  
  457. // Расширение ищем только в части filename (после последнего слеша)
  458. size_t dotInFile = filename.find_last_of('.');
  459. if (dotInFile != string::npos) {
  460. ext = filename.substr(dotInFile + 1);
  461. nameOnly = filename.substr(0, dotInFile);
  462. }
  463.  
  464. // Имя последней папки
  465. string lastFolder = "";
  466. if (!dir.empty()) {
  467. size_t prevSlash = dir.find_last_of("/\\");
  468. lastFolder = (prevSlash != string::npos) ? dir.substr(prevSlash + 1) : dir;
  469. }
  470.  
  471. // Путь с расширением .html
  472. string pathHtml = dir + (dir.empty() ? "" : "/") + nameOnly + ".html";
  473.  
  474. cout << "а) Путь без имени файла: \"" << dir << "\"" << endl;
  475. cout << "б) Имя файла с расширением: \"" << filename << "\"" << endl;
  476. cout << "в) Расширение: \"" << ext << "\"" << endl;
  477. cout << "г) Имя файла без расширения и пути: \"" << nameOnly << "\"" << endl;
  478. cout << "д) Имя последней папки: \"" << lastFolder << "\"" << endl;
  479. cout << "е) Путь с расширением .html: \"" << pathHtml << "\"" << endl;
  480. }
  481.  
  482. // ============================================================
  483. // main — меню выбора задания
  484. // ============================================================
  485. int main() {
  486. cout << "Лабораторная работа 5. C++" << endl;
  487. cout << "Выберите задание (1-20): ";
  488. int choice;
  489. cin >> choice;
  490.  
  491. switch (choice) {
  492. case 1: task1(); break;
  493. case 2: task2(); break;
  494. case 3: task3(); break;
  495. case 4: task4(); break;
  496. case 5: task5(); break;
  497. case 6: task6(); break;
  498. case 7: task7(); break;
  499. case 8: task8(); break;
  500. case 9: task9(); break;
  501. case 10: task10(); break;
  502. case 11: task11(); break;
  503. case 12: task12(); break;
  504. case 13: task13(); break;
  505. case 14: task14(); break;
  506. case 15: task15(); break;
  507. case 16: task16(); break;
  508. case 17: task17(); break;
  509. case 18: task18(); break;
  510. case 19: task19(); break;
  511. case 20: task20(); break;
  512. default: cout << "Неверный выбор" << endl;
  513. }
  514.  
  515. return 0;
  516. }
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Лабораторная работа 5. C++
Выберите задание (1-20): Неверный выбор