kutuzzzov

Исключения и пространство имен

Oct 29th, 2025
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.88 KB | None | 0 0
  1. ### **Задача 1: Обработка деления на ноль**
  2.  
  3. **Описание:** Напишите программу, которая запрашивает два числа и делит первое на второе. Обработайте ситуацию, если второе число равно нулю.
  4.  
  5. #include <iostream>
  6.  
  7. int main() {
  8.     double a, b;
  9.     std::cout << "Введите два числа: ";
  10.     std::cin >> a >> b;
  11.  
  12.     // код здесь
  13.     return 0;
  14. }
  15.  
  16.  
  17. ---
  18.  
  19. ### **Задача 2: Обработка неправильного индекса массива**
  20.  
  21. **Описание:** Напишите программу, которая обращается к элементу массива по индексу. Обработайте выход за границы массива.
  22.  
  23. #include <iostream>
  24.  
  25. int main() {
  26.     int arr[] = {10, 20, 30};
  27.     int size = 3;
  28.     int index;
  29.     std::cout << "Введите индекс (0-2): ";
  30.     std::cin >> index;
  31.  
  32.     // код здесь
  33.  
  34.     return 0;
  35. }
  36.  
  37.  
  38. ---
  39.  
  40. ### **Задача 3: Использование стандартного исключения `std::out_of_range`**
  41.  
  42. **Описание:** Используйте `std::vector` и вызовите `at()` с неправильным индексом. Обработайте исключение `std::out_of_range`.
  43.  
  44. #include <iostream>
  45. #include <vector>
  46. #include <stdexcept>
  47.  
  48. int main() {
  49.     std::vector<int> vec = {1, 2, 3};
  50.     int index;
  51.     std::cout << "Введите индекс: ";
  52.     std::cin >> index;
  53.  
  54.     // код здесь
  55.     return 0;
  56. }
  57.  
  58.  
  59. ---
  60.  
  61. ### **Задача 4: Генерация исключения в функции**
  62.  
  63. **Описание:** Напишите функцию, которая принимает строку и возвращает её длину. Если строка пустая, функция генерирует исключение.
  64.  
  65. #include <iostream>
  66. #include <stdexcept>
  67. #include <string>
  68.  
  69. int getStringLength(const std::string& str) {
  70.     if (str.empty()) {
  71.         throw std::invalid_argument("String is empty!");
  72.     }
  73.     return static_cast<int>(str.length());
  74. }
  75.  
  76. int main() {
  77.     std::string input;
  78.     std::cout << "Введите строку: ";
  79.     std::getline(std::cin, input);
  80.  
  81.     // код здесь
  82.     return 0;
  83. }
  84.  
  85.  
  86. ---
  87.  
  88. ### **Задача 5: Кастомный класс исключения**
  89.  
  90. **Описание:** Создайте свой класс исключения, унаследованный от `std::exception`, и используйте его в программе.
  91.  
  92. #include <iostream>
  93. #include <exception>
  94. #include <string>
  95.  
  96. class MyException : public std::exception {
  97.     std::string msg;
  98. public:
  99.     MyException(const std::string& message) : msg(message) {}
  100.     const char* what() const noexcept override {
  101.         return msg.c_str();
  102.     }
  103. };
  104.  
  105. int main() {
  106.     try {
  107.         throw MyException("Произошло пользовательское исключение!");
  108.     } catch (const MyException& e) {
  109.         std::cerr << "Ошибка: " << e.what() << std::endl;
  110.     }
  111.     return 0;
  112. }
  113.  
  114. ---
  115.  
  116. ### **Задача 6: Обработка нескольких типов исключений**
  117.  
  118. **Описание:** Напишите программу, которая может выбросить разные типы исключений. Обработайте их по-разному.
  119.  
  120. #include <iostream>
  121. #include <stdexcept>
  122.  
  123. int main() {
  124.     int choice;
  125.     std::cout << "Введите 1 для std::runtime_error, 2 для std::invalid_argument: ";
  126.     std::cin >> choice;
  127.  
  128.     try {
  129.         if (choice == 1) {
  130.             throw std::runtime_error("Runtime error occurred!");
  131.         } else if (choice == 2) {
  132.             throw std::invalid_argument("Invalid argument!");
  133.         } else {
  134.             throw 42; // произвольное исключение
  135.         }
  136.     } catch (const std::runtime_error& e) {
  137.         std::cerr << "Runtime Error: " << e.what() << std::endl;
  138.     } catch (const std::invalid_argument& e) {
  139.         std::cerr << "Invalid Argument: " << e.what() << std::endl;
  140.     } catch (...) {
  141.         std::cerr << "Неизвестная ошибка." << std::endl;
  142.     }
  143.     return 0;
  144. }
  145.  
  146. ---
  147.  
  148. ### **Задача 7: Использование `using namespace`**
  149.  
  150. **Описание:** Объявите пространство имён `Geometry` с константой `PI` и функцией `area_circle`. Используйте `using namespace` для упрощения доступа.
  151.  
  152. #include <iostream>
  153.  
  154.     const double PI = 3.14159;
  155.     double area_circle(double r) {
  156.         return PI * r * r;
  157.     }
  158.  
  159. int main() {
  160.     double radius = 5.0;
  161.     std::cout << "Площадь круга: " << area_circle(radius) << std::endl;
  162.     return 0;
  163. }
  164.  
  165. ---
  166.  
  167. ### **Задача 8: Использование `using` для конкретного имени**
  168.  
  169. **Описание:** Используйте `using` для импорта только функции `area_circle` из пространства имён `Geometry`.
  170.  
  171. #include <iostream>
  172.  
  173. namespace Geometry {
  174.     const double PI = 3.14159;
  175.     double area_circle(double r) {
  176.         return PI * r * r;
  177.     }
  178. }
  179.  
  180. int main() {
  181.     double radius = 5.0;
  182.     std::cout << "Площадь круга: " << area_circle(radius) << std::endl;
  183.     return 0;
  184. }
  185.  
  186. ---
  187.  
  188. ### **Задача 9: Вложенные пространства имён**
  189.  
  190. **Описание:** Создайте вложенное пространство имён `Graphics::Shapes` с функцией `draw_circle`. Обратитесь к ней из `main`.
  191.  
  192. #include <iostream>
  193.  
  194.         void draw_circle() {
  195.             std::cout << "Рисуем круг." << std::endl;
  196.         }
  197.  
  198.  
  199. int main() {
  200.     draw_circle();
  201.     return 0;
  202. }
  203.  
  204. ---
  205.  
  206. ### **Задача 10: Анонимное (безымянное) пространство имён**
  207.  
  208. **Описание:** Создайте переменную и функцию в анонимном пространстве имён. Покажите, что они доступны только в этом файле.
  209.  
  210. #include <iostream>
  211.  
  212.  
  213.     int secret_value = 100;
  214.     void print_secret() {
  215.         std::cout << "Секретное значение: " << secret_value << std::endl;
  216.     }
  217.  
  218. int main() {
  219.     print_secret();
  220.     return 0;
  221. }
  222. ```
  223.  
  224. ---
  225.  
  226. ### **Задача 11: Обработка исключения при открытии файла**
  227.  
  228. **Описание:** Попробуйте открыть файл с помощью `std::ifstream`. Обработайте ситуацию, если файл не найден.
  229.  
  230. #include <iostream>
  231. #include <fstream>
  232. #include <stdexcept>
  233.  
  234. int main() {
  235.     std::ifstream file("nonexistent.txt");
  236.  
  237.     try {
  238.         if (!file.is_open()) {
  239.             throw std::runtime_error("Не удалось открыть файл.");
  240.         }
  241.         // Читаем файл...
  242.         file.close();
  243.     } catch (const std::runtime_error& e) {
  244.         std::cerr << "Ошибка: " << e.what() << std::endl;
  245.     }
  246.     return 0;
  247. }
  248.  
  249. ---
  250.  
  251. ### **Задача 12: Перехват всех исключений с `catch(...)`**
  252.  
  253. **Описание:** Напишите программу, которая может выбросить любое исключение. Используйте `catch(...)` для его перехвата.
  254.  
  255. #include <iostream>
  256.  
  257. int main() {
  258.     try {
  259.         throw 3.14; // может быть любое исключение
  260.     } catch (...) {
  261.         std::cerr << "Перехвачено неизвестное исключение." << std::endl;
  262.     }
  263.     return 0;
  264. }
  265.  
  266. ---
  267.  
  268. ### **Задача 13: Повторное объявление пространства имён**
  269.  
  270. **Описание:** Объявите пространство имён `Utils` в двух разных блоках. Покажите, что все элементы объединяются.
  271.  
  272. #include <iostream>
  273.  
  274.  
  275.     void helper1() {
  276.         std::cout << "Helper 1" << std::endl;
  277.     }
  278.  
  279.  
  280.  
  281.     void helper2() {
  282.         std::cout << "Helper 2" << std::endl;
  283.     }
  284.  
  285. int main() {
  286.     Utils::helper1();
  287.     Utils::helper2();
  288.     return 0;
  289. }
  290.  
  291. ---
  292.  
  293. ### **Задача 14: Обработка исключения при конвертации строки в число**
  294.  
  295. **Описание:** Используйте `std::stoi` для преобразования строки в число. Обработайте исключение `std::invalid_argument`, если строка некорректна.
  296.  
  297. #include <iostream>
  298. #include <string>
  299. #include <stdexcept>
  300.  
  301. int main() {
  302.     std::string input = "abc"; // строка не является числом
  303.  
  304.    // код здесь
  305.     return 0;
  306. }
  307. ```
  308.  
  309. ---
  310.  
  311. ### **Задача 15: Использование `noexcept` и `throw`**
  312.  
  313. **Описание:** Напишите функцию с `noexcept`, которая не должна выбрасывать исключений. Попробуйте выбросить исключение и посмотрите результат.
  314.  
  315. #include <iostream>
  316.  
  317. void safe_function() noexcept {
  318.     // throw std::runtime_error("Это вызовет std::terminate!"); // Не рекомендуется
  319.     std::cout << "Функция выполнена безопасно." << std::endl;
  320. }
  321.  
  322. int main() {
  323.     safe_function();
  324.     return 0;
  325. }
  326.  
  327. ---
  328.  
  329. ### **Задача 16: Пространство имён с классом и методом, выбрасывающим исключение**
  330.  
  331. **Описание:** Создайте класс в пространстве имён, метод которого может выбросить исключение.
  332.  
  333. #include <iostream>
  334. #include <stdexcept>
  335.  
  336. namespace Game {
  337.     class Player {
  338.     public:
  339.         int health = 100;
  340.         void takeDamage(int damage) {
  341.             if (damage > health) {
  342.                 throw std::runtime_error("Игрок убит!");
  343.             }
  344.             health -= damage;
  345.         }
  346.     };
  347. }
  348.  
  349. int main() {
  350.     Game::Player p;
  351.     try {
  352.         p.takeDamage(120);
  353.     } catch (const std::runtime_error& e) {
  354.         std::cerr << "Ошибка: " << e.what() << std::endl;
  355.     }
  356.     return 0;
  357. }
  358.  
  359. ---
  360.  
  361. ### **Задача 17: Обработка исключения при делении в функции с возвратом результата**
  362.  
  363. **Описание:** Напишите функцию, возвращающую результат деления. Обработайте деление на ноль внутри функции.
  364.  
  365. #include <iostream>
  366. #include <stdexcept>
  367.  
  368. double divide(double a, double b) {
  369.     if (b == 0) {
  370.         throw std::invalid_argument("Деление на ноль в функции divide.");
  371.     }
  372.     return a / b;
  373. }
  374.  
  375. int main() {
  376.     try {
  377.         double result = divide(10.0, 0.0);
  378.         std::cout << "Результат: " << result << std::endl;
  379.     } catch (const std::invalid_argument& e) {
  380.         std::cerr << "Ошибка: " << e.what() << std::endl;
  381.     }
  382.     return 0;
  383. }
  384.  
  385. ---
  386.  
  387. ### **Задача 18: Пространство имён с `using` внутри функции**
  388.  
  389. **Описание:** Используйте `using` внутри функции, чтобы избежать конфликта имён в глобальной области.
  390.  
  391. #include <iostream>
  392.  
  393. namespace A {
  394.     int value = 10;
  395. }
  396.  
  397. namespace B {
  398.     int value = 20;
  399. }
  400.  
  401. void printValues() {
  402.     using A::value; // value теперь A::value
  403.     std::cout << "A::value: " << value << std::endl;
  404.     std::cout << "B::value: " << B::value << std::endl; // полный путь
  405. }
  406.  
  407. int main() {
  408.     printValues();
  409.     return 0;
  410. }
  411.  
  412. ---
  413.  
  414. ### **Задача 19: Обработка исключения при выделении памяти**
  415.  
  416. **Описание:** Попробуйте выделить слишком большой объём памяти. Обработайте исключение `std::bad_alloc`.
  417.  
  418. #include <iostream>
  419. #include <new>
  420.  
  421. int main() {
  422.     try {
  423.         // Попытка выделить огромный объём памяти
  424.         size_t size = static_cast<size_t>(-1); // максимально возможный размер
  425.         int* arr = new int[size];
  426.         delete[] arr;
  427.     } catch (const std::bad_alloc& e) {
  428.         std::cerr << "Ошибка выделения памяти: " << e.what() << std::endl;
  429.     }
  430.     return 0;
  431. }
  432.  
  433. ---
  434.  
  435. ### **Задача 20: Комбинирование пространства имён и исключений в классе**
  436.  
  437. **Описание:** Создайте класс в пространстве имён, который управляет балансом счёта. Метод `withdraw` должен выбрасывать исключение при попытке снять больше, чем есть на счёте.
  438.  
  439. #include <iostream>
  440. #include <stdexcept>
  441.  
  442. namespace Banking {
  443.     class Account {
  444.         double balance;
  445.     public:
  446.         Account(double initial) : balance(initial) {}
  447.  
  448.         void withdraw(double amount) {
  449.             if (amount > balance) {
  450.                 throw std::runtime_error("Недостаточно средств на счёте.");
  451.             }
  452.             balance -= amount;
  453.         }
  454.  
  455.         double getBalance() const {
  456.             return balance;
  457.         }
  458.     };
  459. }
  460.  
  461. int main() {
  462.     Banking::Account acc(100.0);
  463.  
  464.     try {
  465.         acc.withdraw(150.0);
  466.     } catch (const std::runtime_error& e) {
  467.         std::cerr << "Ошибка: " << e.what() << std::endl;
  468.     }
  469.  
  470.     std::cout << "Баланс: " << acc.getBalance() << std::endl;
  471.     return 0;
  472. }
Advertisement
Add Comment
Please, Sign In to add comment