Задачи охватывают различные аспекты преобразования: неявное, явное, использование операторов `static_cast`, `dynamic_cast`, `reinterpret_cast`, `const_cast`, а также преобразование строк и чисел.
---
### **Задача 1: Неявное преобразование целого числа в число с плавающей точкой**
**Условие:** Напишите программу, которая складывает целое число и число с плавающей точкой.
#include <iostream>
using namespace std;
int main() {
int a = 5;
double b = 2.5;
// Неявное преобразование int в double
cout << "Результат: " << result << endl; // Вывод: Результат: 7.5
return 0;
}
---
### **Задача 2: Явное преобразование числа с плавающей точкой в целое**
**Условие:** Преобразуйте число с плавающей точкой `3.14` в целое число.
#include <iostream>
using namespace std;
int main() {
double d = 3.14;
// Явное преобразование double в int
cout << "Результат: " << i << endl; // Вывод: Результат: 3
return 0;
}
---
### **Задача 3: Усечение данных при преобразовании большего типа в меньший**
**Условие:** Преобразуйте значение `300` из `int` в `char`. Объясните результат.
#include <iostream>
using namespace std;
int main() {
int a = 300;
char c = static_cast<char>(a); // Усечение данных
cout << "Результат: " << (int)c << endl; // Вывод: Результат: 44
return 0;
}
*Объяснение:* Значение `300` выходит за пределы диапазона `char` (-128 до 127), поэтому происходит усечение.
---
### **Задача 4: Преобразование строки в число**
**Условие:** Преобразуйте строку `"123"` в целое число.
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str = "123";
int num;
std::istringstream iss(str);
iss >> num; // Преобразование строки в число
cout << "Число: " << num << endl; // Вывод: Число: 123
return 0;
}
---
### **Задача 5: Преобразование числа в строку**
**Условие:** Преобразуйте число `456` в строку.
#include <iostream>
#include <string>
#include <sstream>
int main() {
int num = 456;
std::ostringstream oss;
oss << num; // Преобразование числа в строку
std::string str = oss.str();
cout << "Строка: " << str << endl; // Вывод: Строка: 456
return 0;
}
---
### **Задача 6: Использование `dynamic_cast` для проверки преобразования**
**Условие:** Проверьте, можно ли преобразовать указатель базового класса к производному.
#include <iostream>
using namespace std;
class Base { virtual void dummy() {} };
class Derived : public Base {};
int main() {
Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b); // Проверка преобразования
if (d) {
cout << "Преобразование успешно!" << endl;
} else {
cout << "Преобразование не удалось." << endl;
}
delete b;
return 0;
}
---
### **Задача 7: Использование `reinterpret_cast` для низкоуровневого преобразования**
**Условие:** Преобразуйте указатель на `int` в указатель на `char`.
#include <iostream>
using namespace std;
int main() {
int a = 65;
char* c = reinterpret_cast<char*>(&a); // Преобразование int* в char*
cout << "Значение *c: " << *c << endl; // Вывод: Значение *c: A
return 0;
}
---
### **Задача 8: Использование `const_cast` для удаления `const`**
**Условие:** Удалите `const` из переменной `a` и измените её значение.
#include <iostream>
using namespace std;
int main() {
const int a = 5;
int* ptr = const_cast<int*>(&a);
*ptr = 10; // Изменение значения через указатель
cout << "Значение a: " << a << endl; // Поведение не определено
return 0;
}
---
### **Задача 9: Неявное преобразование при делении**
**Условие:** Выполните деление двух целых чисел и объясните результат.
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 2;
double result = a / b; // Неявное преобразование
cout << "Результат: " << result << endl; // Вывод: Результат: 2
return 0;
}
*Объяснение:* Целочисленное деление выполняется сначала, затем результат преобразуется в `double`.
---
### **Задача 10: Преобразование массива символов в число**
**Условие:** Преобразуйте массив символов `{'1', '2', '3'}` в целое число.
#include <iostream>
#include <cstring>
#include <cstdlib>
int main() {
char arr[] = "123";
int num = atoi(arr); // Преобразование массива символов в число
cout << "Число: " << num << endl; // Вывод: Число: 123
return 0;
}
---
### **Задача 11: Преобразование числа в массив символов**
**Условие:** Преобразуйте число `456` в массив символов.
#include <iostream>
#include <sstream>
int main() {
int num = 456;
std::ostringstream oss;
oss << num;
std::string str = oss.str();
const char* arr = str.c_str(); // Преобразование в массив символов
cout << "Массив символов: " << arr << endl; // Вывод: Массив символов: 456
return 0;
}
---
### **Задача 12: Преобразование `float` в `int` с потерей точности**
**Условие:** Преобразуйте `float` значение `3.99` в `int`.
#include <iostream>
using namespace std;
int main() {
float f = 3.99;
int i = static_cast<int>(f); // Преобразование float в int
cout << "Результат: " << i << endl; // Вывод: Результат: 3
return 0;
}
---
### **Задача 13: Преобразование строки в число с обработкой ошибок**
**Условие:** Преобразуйте строку `"123abc"` в число и обработайте ошибку, если преобразование невозможно.
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str = "123abc";
int num;
std::istringstream iss(str);
if (!(iss >> num)) { // Проверка успешности преобразования
std::cerr << "Ошибка: строка не является числом." << std::endl;
} else {
std::cout << "Число: " << num << std::endl;
}
return 0;
}
```
*Вывод:* `Ошибка: строка не является числом.`
---
### **Задача 14: Преобразование указателя базового класса к производному**
**Условие:** Преобразуйте указатель базового класса к производному с использованием `dynamic_cast`. Обработайте случай, если преобразование невозможно.
#include <iostream>
using namespace std;
class Base { virtual void dummy() {} };
class Derived : public Base {};
int main() {
Base* b = new Base(); // Указатель на базовый класс
Derived* d = dynamic_cast<Derived*>(b); // Попытка преобразования
if (d) {
cout << "Преобразование успешно!" << endl;
} else {
cout << "Преобразование не удалось." << endl; // Вывод: Преобразование не удалось.
}
delete b;
return 0;
}
---
### **Задача 15: Преобразование указателя на `void` обратно в исходный тип**
**Условие:** Преобразуйте указатель на `int` в указатель на `void`, а затем обратно в указатель на `int`.
#include <iostream>
using namespace std;
int main() {
int a = 42;
void* ptr = &a; // Преобразование int* в void*
int* iptr = static_cast<int*>(ptr); // Преобразование void* обратно в int*
cout << "Значение: " << *iptr << endl; // Вывод: Значение: 42
return 0;
}
---
### **Задача 16: Преобразование строки в число с использованием `std::stoi`**
**Условие:** Преобразуйте строку `"456"` в число с помощью функции `std::stoi`.
#include <iostream>
#include <string>
int main() {
std::string str = "456";
int num = std::stoi(str); // Преобразование строки в число
cout << "Число: " << num << endl; // Вывод: Число: 456
return 0;
}
---
### **Задача 17: Преобразование числа в строку с использованием `std::to_string`**
**Условие:** Преобразуйте число `789` в строку с помощью функции `std::to_string`.
#include <iostream>
#include <string>
int main() {
int num = 789;
std::string str = std::to_string(num); // Преобразование числа в строку
cout << "Строка: " << str << endl; // Вывод: Строка: 789
return 0;
}
---
### **Задача 18: Преобразование массива байтов в число**
**Условие:** Преобразуйте массив байтов `{0x01, 0x02, 0x03}` в целое число.
#include <iostream>
#include <cstdint>
int main() {
uint8_t bytes[] = {0x01, 0x02, 0x03};
uint32_t num = (bytes[0] << 16) | (bytes[1] << 8) | bytes[2]; // Преобразование массива в число
cout << "Число: " << num << endl; // Вывод: Число: 66051
return 0;
}
---
### **Задача 19: Преобразование числа в массив байтов**
**Условие:** Преобразуйте число `66051` в массив байтов.
#include <iostream>
#include <cstdint>
int main() {
uint32_t num = 66051;
uint8_t bytes[3];
bytes[0] = (num >> 16) & 0xFF; // Извлечение старшего байта
bytes[1] = (num >> 8) & 0xFF; // Извлечение среднего байта
bytes[2] = num & 0xFF; // Извлечение младшего байта
cout << "Массив байтов: ";
for (uint8_t byte : bytes) {
cout << "0x" << std::hex << (int)byte << " "; // Вывод: Массив байтов: 0x1 0x2 0x3
}
return 0;
}
---
### **Задача 20: Преобразование строки в число с проверкой диапазона**
**Условие:** Преобразуйте строку `"1000"` в число и проверьте, находится ли оно в диапазоне от 1 до 500.
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str = "1000";
int num;
std::istringstream iss(str);
if (!(iss >> num)) {
std::cerr << "Ошибка: строка не является числом." << std::endl;
} else if (num < 1 || num > 500) {
std::cerr << "Ошибка: число вне диапазона." << std::endl; // Вывод: Ошибка: число вне диапазона.
} else {
std::cout << "Число: " << num << std::endl;
}
return 0;
}