### **Задача 1: Обработка деления на ноль**
**Описание:** Напишите программу, которая запрашивает два числа и делит первое на второе. Обработайте ситуацию, если второе число равно нулю.
#include <iostream>
int main() {
double a, b;
std::cout << "Введите два числа: ";
std::cin >> a >> b;
// код здесь
return 0;
}
---
### **Задача 2: Обработка неправильного индекса массива**
**Описание:** Напишите программу, которая обращается к элементу массива по индексу. Обработайте выход за границы массива.
#include <iostream>
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 <iostream>
#include <vector>
#include <stdexcept>
int main() {
std::vector<int> vec = {1, 2, 3};
int index;
std::cout << "Введите индекс: ";
std::cin >> index;
// код здесь
return 0;
}
---
### **Задача 4: Генерация исключения в функции**
**Описание:** Напишите функцию, которая принимает строку и возвращает её длину. Если строка пустая, функция генерирует исключение.
#include <iostream>
#include <stdexcept>
#include <string>
int getStringLength(const std::string& str) {
if (str.empty()) {
throw std::invalid_argument("String is empty!");
}
return static_cast<int>(str.length());
}
int main() {
std::string input;
std::cout << "Введите строку: ";
std::getline(std::cin, input);
// код здесь
return 0;
}
---
### **Задача 5: Кастомный класс исключения**
**Описание:** Создайте свой класс исключения, унаследованный от `std::exception`, и используйте его в программе.
#include <iostream>
#include <exception>
#include <string>
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 <iostream>
#include <stdexcept>
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 <iostream>
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 <iostream>
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 <iostream>
void draw_circle() {
std::cout << "Рисуем круг." << std::endl;
}
int main() {
draw_circle();
return 0;
}
---
### **Задача 10: Анонимное (безымянное) пространство имён**
**Описание:** Создайте переменную и функцию в анонимном пространстве имён. Покажите, что они доступны только в этом файле.
#include <iostream>
int secret_value = 100;
void print_secret() {
std::cout << "Секретное значение: " << secret_value << std::endl;
}
int main() {
print_secret();
return 0;
}
```
---
### **Задача 11: Обработка исключения при открытии файла**
**Описание:** Попробуйте открыть файл с помощью `std::ifstream`. Обработайте ситуацию, если файл не найден.
#include <iostream>
#include <fstream>
#include <stdexcept>
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 <iostream>
int main() {
try {
throw 3.14; // может быть любое исключение
} catch (...) {
std::cerr << "Перехвачено неизвестное исключение." << std::endl;
}
return 0;
}
---
### **Задача 13: Повторное объявление пространства имён**
**Описание:** Объявите пространство имён `Utils` в двух разных блоках. Покажите, что все элементы объединяются.
#include <iostream>
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 <iostream>
#include <string>
#include <stdexcept>
int main() {
std::string input = "abc"; // строка не является числом
// код здесь
return 0;
}
```
---
### **Задача 15: Использование `noexcept` и `throw`**
**Описание:** Напишите функцию с `noexcept`, которая не должна выбрасывать исключений. Попробуйте выбросить исключение и посмотрите результат.
#include <iostream>
void safe_function() noexcept {
// throw std::runtime_error("Это вызовет std::terminate!"); // Не рекомендуется
std::cout << "Функция выполнена безопасно." << std::endl;
}
int main() {
safe_function();
return 0;
}
---
### **Задача 16: Пространство имён с классом и методом, выбрасывающим исключение**
**Описание:** Создайте класс в пространстве имён, метод которого может выбросить исключение.
#include <iostream>
#include <stdexcept>
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 <iostream>
#include <stdexcept>
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 <iostream>
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 <iostream>
#include <new>
int main() {
try {
// Попытка выделить огромный объём памяти
size_t size = static_cast<size_t>(-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 <iostream>
#include <stdexcept>
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;
}