/
AirLexa
/
03
Обзор
Документация
Войти
/
AirLexa
/
03
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lesson_05/Task_2/Task_2.cpp
133 строки
5 KB
AirLexa
создал Lesson_05/Task_2/Task_2.cpp
19 янв 2026, 21:58
Верифицирован
19 янв 2026, 21:58
efcdbad
Код
Авторство
О чём код?
#include <iostream> #include <string> #include <windows.h> int get_uroven(int i); bool is_left(int pos); std::string element_to_str(int nums[], int size, int pos); void go_parrent(int nums[], int size, int& pos); void go_child(int nums[], int size, int& pos, int delta); void print_pyramid(int nums[], int size); int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); int** nums = new int* [3]; // будет 3 массива для проверки nums[0] = new int[] { 1, 3, 6, 5, 9, 8 }; nums[1] = new int[] { 94, 67, 18, 44, 55, 12, 6, 42 }; nums[2] = new int[] { 16, 11, 9, 10, 5, 6, 8, 1, 2, 4 }; int size[3] = {6, 8, 10}; int row = 0; for (int i = 0; i < 3; i++) { std::cout << (i + 1) << ". Исходный массив:"; for (int n = 0; n < size[i]; n++) // выводим исходный массив std::cout << ' ' << nums[i][n]; std::cout << std::endl; } std::cout << "0. Завершить работу программы.\n"; std::cout << "Введите номер массива для путешествия: "; std::cin >> row; if (row == 0) { std::cout << "До свидания! До новых встреч!" << std::endl; return 0; } if (--row < 0 || row > 2) { std::cout << "Нет такого массива в списке! Ошибка!" << std::endl; return -1; } print_pyramid(nums[row], size[row]); int pos = 0; char com = ' '; while (com != 'e') { std::cout << "Вы находитесь здесь: " << element_to_str(nums[row], size[row], pos); std::cout << "\nВведите команду (l/r/u/e - влево/вправо/вверх/выход): "; std::cin >> com; switch (com) { case 'l': go_child(nums[row], size[row], pos, 1); break; case 'r': go_child(nums[row], size[row], pos, 2); break; case 'u': go_parrent(nums[row], size[row], pos); break; } } std::cout << "До свидания! До новых встреч!" << std::endl; for (int i = 0; i < 3; i++) delete[] nums[i]; delete[] nums; return 0; } int get_uroven(int i) { i++; int res = 0; for (res; i >>= 1; res++); return res; } bool is_left(int pos) { return pos & 1; // если нечетное, то крайний бит = 1 } std::string element_to_str(int nums[], int size, int pos) { if (pos == 0) return "0 корень " + std::to_string(nums[0]); bool left = is_left(pos); return std::to_string(get_uroven(pos)) // уровень .append(left ? " левый(" : " правый(") // сторона ребенка .append(std::to_string( nums[ left ? (pos - 1) / 2 : (pos - 2) / 2 ] )) // родитель .append(") ").append(std::to_string(nums[pos])); // значение ребенка } void go_parrent(int nums[], int size, int& pos) { if (pos == 0) // выше уже нет родителя std::cout << "Ошибка! Отсутствует родитель!\n"; else { pos -= is_left(pos) ? 1 : 2; // отнимаем 1 если левый и 2 если правый ребенок pos >>= 1; // и делим на 2, это будет родитель } } void go_child(int nums[], int size, int& pos, int delta) { int n = 2 * pos + delta; // индекс ребенка if (n < size) { // если он внутри массива, то все хорошо std::cout << "Успешно!\n"; pos = n; } else std::cout << "Ошибка! Отсутствует " << (delta < 2 ? "левый" : "правый") << " потомок!\n"; } void print_pyramid(int nums[], int size) { if (size == 0) { std::cout << "Массив пустой!\n"; return; } std::cout << "Исходный массив:"; for (int i = 0; i < size; i++) // выводим исходный массив std::cout << ' ' << nums[i]; std::cout << "\nПирамида:\n"; std::cout << "0 корень " << nums[0] << std::endl; // корневой элемент for (int i = 0; i < size; i++) { int n = 2 * i + 1; // номер левого ребенка if (n >= size) break; // если он за пределами массива, то закончили std::cout << get_uroven(n) << " левый(" << nums[i] << ") " << nums[n] << std::endl; if (++n >= size) break; // номер правого ребенка на 1 больше левого std::cout << get_uroven(n) << " правый(" << nums[i] << ") " << nums[n] << std::endl; } std::cout << std::endl; }