### **Задача 1: Обработка деления на ноль** **Описание:** Напишите программу, которая запрашивает два числа и делит первое на второе. Обработайте ситуацию, если второе число равно нулю. #include int main() { double a, b; std::cout << "Введите два числа: "; std::cin >> a >> b; // код здесь return 0; } --- ### **Задача 2: Обработка неправильного индекса массива** **Описание:** Напишите программу, которая обращается к элементу массива по индексу. Обработайте выход за границы массива. #include int main() { int arr[] = {10, 20, 30}; int size = 3; int index; std::cout << "Введите индекс (0-2): "; std::cin >> index; // код здесь return 0; } --- ### **Задача 3: Использование стандартного исключения `std::out_of_range`** **Описание:** Используйте `std::vector` и вызовите `at()` с неправильным индексом. Обработайте исключение `std::out_of_range`. #include #include #include int main() { std::vector vec = {1, 2, 3}; int index; std::cout << "Введите индекс: "; std::cin >> index; // код здесь return 0; } --- ### **Задача 4: Генерация исключения в функции** **Описание:** Напишите функцию, которая принимает строку и возвращает её длину. Если строка пустая, функция генерирует исключение. #include #include #include int getStringLength(const std::string& str) { if (str.empty()) { throw std::invalid_argument("String is empty!"); } return static_cast(str.length()); } int main() { std::string input; std::cout << "Введите строку: "; std::getline(std::cin, input); // код здесь return 0; } --- ### **Задача 5: Кастомный класс исключения** **Описание:** Создайте свой класс исключения, унаследованный от `std::exception`, и используйте его в программе. #include #include #include class MyException : public std::exception { std::string msg; public: MyException(const std::string& message) : msg(message) {} const char* what() const noexcept override { return msg.c_str(); } }; int main() { try { throw MyException("Произошло пользовательское исключение!"); } catch (const MyException& e) { std::cerr << "Ошибка: " << e.what() << std::endl; } return 0; } --- ### **Задача 6: Обработка нескольких типов исключений** **Описание:** Напишите программу, которая может выбросить разные типы исключений. Обработайте их по-разному. #include #include int main() { int choice; std::cout << "Введите 1 для std::runtime_error, 2 для std::invalid_argument: "; std::cin >> choice; try { if (choice == 1) { throw std::runtime_error("Runtime error occurred!"); } else if (choice == 2) { throw std::invalid_argument("Invalid argument!"); } else { throw 42; // произвольное исключение } } catch (const std::runtime_error& e) { std::cerr << "Runtime Error: " << e.what() << std::endl; } catch (const std::invalid_argument& e) { std::cerr << "Invalid Argument: " << e.what() << std::endl; } catch (...) { std::cerr << "Неизвестная ошибка." << std::endl; } return 0; } --- ### **Задача 7: Использование `using namespace`** **Описание:** Объявите пространство имён `Geometry` с константой `PI` и функцией `area_circle`. Используйте `using namespace` для упрощения доступа. #include const double PI = 3.14159; double area_circle(double r) { return PI * r * r; } int main() { double radius = 5.0; std::cout << "Площадь круга: " << area_circle(radius) << std::endl; return 0; } --- ### **Задача 8: Использование `using` для конкретного имени** **Описание:** Используйте `using` для импорта только функции `area_circle` из пространства имён `Geometry`. #include namespace Geometry { const double PI = 3.14159; double area_circle(double r) { return PI * r * r; } } int main() { double radius = 5.0; std::cout << "Площадь круга: " << area_circle(radius) << std::endl; return 0; } --- ### **Задача 9: Вложенные пространства имён** **Описание:** Создайте вложенное пространство имён `Graphics::Shapes` с функцией `draw_circle`. Обратитесь к ней из `main`. #include void draw_circle() { std::cout << "Рисуем круг." << std::endl; } int main() { draw_circle(); return 0; } --- ### **Задача 10: Анонимное (безымянное) пространство имён** **Описание:** Создайте переменную и функцию в анонимном пространстве имён. Покажите, что они доступны только в этом файле. #include int secret_value = 100; void print_secret() { std::cout << "Секретное значение: " << secret_value << std::endl; } int main() { print_secret(); return 0; } ``` --- ### **Задача 11: Обработка исключения при открытии файла** **Описание:** Попробуйте открыть файл с помощью `std::ifstream`. Обработайте ситуацию, если файл не найден. #include #include #include int main() { std::ifstream file("nonexistent.txt"); try { if (!file.is_open()) { throw std::runtime_error("Не удалось открыть файл."); } // Читаем файл... file.close(); } catch (const std::runtime_error& e) { std::cerr << "Ошибка: " << e.what() << std::endl; } return 0; } --- ### **Задача 12: Перехват всех исключений с `catch(...)`** **Описание:** Напишите программу, которая может выбросить любое исключение. Используйте `catch(...)` для его перехвата. #include int main() { try { throw 3.14; // может быть любое исключение } catch (...) { std::cerr << "Перехвачено неизвестное исключение." << std::endl; } return 0; } --- ### **Задача 13: Повторное объявление пространства имён** **Описание:** Объявите пространство имён `Utils` в двух разных блоках. Покажите, что все элементы объединяются. #include void helper1() { std::cout << "Helper 1" << std::endl; } void helper2() { std::cout << "Helper 2" << std::endl; } int main() { Utils::helper1(); Utils::helper2(); return 0; } --- ### **Задача 14: Обработка исключения при конвертации строки в число** **Описание:** Используйте `std::stoi` для преобразования строки в число. Обработайте исключение `std::invalid_argument`, если строка некорректна. #include #include #include int main() { std::string input = "abc"; // строка не является числом // код здесь return 0; } ``` --- ### **Задача 15: Использование `noexcept` и `throw`** **Описание:** Напишите функцию с `noexcept`, которая не должна выбрасывать исключений. Попробуйте выбросить исключение и посмотрите результат. #include void safe_function() noexcept { // throw std::runtime_error("Это вызовет std::terminate!"); // Не рекомендуется std::cout << "Функция выполнена безопасно." << std::endl; } int main() { safe_function(); return 0; } --- ### **Задача 16: Пространство имён с классом и методом, выбрасывающим исключение** **Описание:** Создайте класс в пространстве имён, метод которого может выбросить исключение. #include #include namespace Game { class Player { public: int health = 100; void takeDamage(int damage) { if (damage > health) { throw std::runtime_error("Игрок убит!"); } health -= damage; } }; } int main() { Game::Player p; try { p.takeDamage(120); } catch (const std::runtime_error& e) { std::cerr << "Ошибка: " << e.what() << std::endl; } return 0; } --- ### **Задача 17: Обработка исключения при делении в функции с возвратом результата** **Описание:** Напишите функцию, возвращающую результат деления. Обработайте деление на ноль внутри функции. #include #include double divide(double a, double b) { if (b == 0) { throw std::invalid_argument("Деление на ноль в функции divide."); } return a / b; } int main() { try { double result = divide(10.0, 0.0); std::cout << "Результат: " << result << std::endl; } catch (const std::invalid_argument& e) { std::cerr << "Ошибка: " << e.what() << std::endl; } return 0; } --- ### **Задача 18: Пространство имён с `using` внутри функции** **Описание:** Используйте `using` внутри функции, чтобы избежать конфликта имён в глобальной области. #include namespace A { int value = 10; } namespace B { int value = 20; } void printValues() { using A::value; // value теперь A::value std::cout << "A::value: " << value << std::endl; std::cout << "B::value: " << B::value << std::endl; // полный путь } int main() { printValues(); return 0; } --- ### **Задача 19: Обработка исключения при выделении памяти** **Описание:** Попробуйте выделить слишком большой объём памяти. Обработайте исключение `std::bad_alloc`. #include #include int main() { try { // Попытка выделить огромный объём памяти size_t size = static_cast(-1); // максимально возможный размер int* arr = new int[size]; delete[] arr; } catch (const std::bad_alloc& e) { std::cerr << "Ошибка выделения памяти: " << e.what() << std::endl; } return 0; } --- ### **Задача 20: Комбинирование пространства имён и исключений в классе** **Описание:** Создайте класс в пространстве имён, который управляет балансом счёта. Метод `withdraw` должен выбрасывать исключение при попытке снять больше, чем есть на счёте. #include #include namespace Banking { class Account { double balance; public: Account(double initial) : balance(initial) {} void withdraw(double amount) { if (amount > balance) { throw std::runtime_error("Недостаточно средств на счёте."); } balance -= amount; } double getBalance() const { return balance; } }; } int main() { Banking::Account acc(100.0); try { acc.withdraw(150.0); } catch (const std::runtime_error& e) { std::cerr << "Ошибка: " << e.what() << std::endl; } std::cout << "Баланс: " << acc.getBalance() << std::endl; return 0; }