/
NUMLIKIO
/
5laba
Обзор
Документация
Войти
/
NUMLIKIO
/
5laba
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.cpp
230 строк
7 KB
NUMLIKIO
update: main.cpp
19 мар 2026, 13:10
Верифицирован
19 мар 2026, 13:10
e914af0
Код
Авторство
О чём код?
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <windows.h> #include "tree.h" #include "test.h" using namespace std; TreeNode* root = NULL; void addEmployee() { Employee emp; cout << "Фамилия И.О.: "; cin.ignore(); getline(cin, emp.name); cout << "Табельный номер: "; cin >> emp.emp_id; if (find(emp.emp_id, root) != NULL) { cout << "Сотрудник с таким номером уже существует!\n"; return; } cout << "Стаж (лет): "; cin >> emp.exp; cout << "Оклад: "; cin >> emp.salary; cout << "Специальность: "; cin >> emp.speciality; root = addNode(emp, root); cout << "Сотрудник добавлен\n"; } void deleteEmployeeInteractive() { int key; cout << "Введите табельный номер для удаления: "; cin >> key; if (find(key, root) == NULL) { cout << "Сотрудник не найден\n"; } else { root = deleteNode(key, root); cout << "Удален\n"; } } void findEmployeeInteractive() { int key; cout << "Введите табельный номер: "; cin >> key; TreeNode* found = find(key, root); if (found) { cout << "Найден:\n"; printEmployee(found->data); } else { cout << "Не найден\n"; } } void printTree() { if (root == NULL) { cout << "Дерево пусто\n"; } else { cout << "Содержимое дерева:\n"; printTree(root, ""); } } void printTreeTraversals() { if (root == NULL) { cout << "Дерево пусто\n"; return; } int choice2; cout << "\nВыберите тип обхода:\n"; cout << "1. Прямой обход (Pre-order)\n"; cout << "2. Симметричный по возрастанию (In-order asc)\n"; cout << "3. Симметричный по убыванию (In-order desc)\n"; cout << "4. Обратный обход (Post-order)\n"; cout << "5. Обход в ширину (Level-order)\n"; cout << "Ваш выбор: "; cin >> choice2; switch (choice2) { case 1: cout << "\nПрямой обход:\n"; preOrderPrint(root, ""); break; case 2: cout << "\nСимметричный по возрастанию:\n"; inOrderAscPrint(root, ""); break; case 3: cout << "\nСимметричный по убыванию:\n"; inOrderDescPrint(root, ""); break; case 4: cout << "\nОбратный обход:\n"; postOrderPrint(root, ""); break; case 5: levelOrderPrint(root); break; default: cout << "Неверный выбор\n"; } } void searchByCriteriaInteractive() { if (root == NULL) { cout << "Дерево пусто.\n"; return; } int minExp, maxExp; string speciality; cout << "Минимальный стаж: "; cin >> minExp; cout << "Максимальный стаж: "; cin >> maxExp; cout << "Специальность: "; cin >> speciality; search(root, minExp, maxExp, speciality); int count = countByExpAndSpec(root, minExp, maxExp, speciality); cout << "Найдено сотрудников: " << count << endl; } void salaryStatisticsInteractive() { if (root == NULL) { cout << "Дерево пусто.\n"; return; } double avgSalary = calculateAverageSalary(root); int aboveAvg = CountEmployeesWithSalariesAboveAverage(root, avgSalary); cout << "\nСтатистика по окладам:\n"; cout << "Средний оклад: " << avgSalary << " руб.\n"; cout << "С окладом выше среднего: " << aboveAvg << "\n"; cout << "С окладом ниже или равным среднему: " << (countAllEmployees(root) - aboveAvg) << "\n"; } void addFromFile() { char filename[100]; cout << "Введите имя файла: "; cin >> filename; FILE* f = fopen(filename, "r"); if (f == NULL) { cout << "Файл не найден!\n"; return; } Employee emp; int count = 0; cout << "Чтение из файла...\n"; char nameBuf[100], specBuf[50]; while (fscanf(f, "%d %99s %d %lf %49s", &emp.emp_id, nameBuf, &emp.exp, &emp.salary, specBuf) == 5) { emp.name = nameBuf; emp.speciality = specBuf; if (find(emp.emp_id, root) == NULL) { root = addNode(emp, root); count++; cout << "Добавлен: " << emp.emp_id << " " << emp.name << endl; } else { cout << "Пропущен (дубликат): " << emp.emp_id << " " << emp.name << endl; } } fclose(f); cout << "Всего добавлено: " << count << " сотрудников\n"; } void menu() { int choice; do { cout << "\n========== МЕНЮ ==========\n"; cout << "1. Добавить сотрудника (клавиатура)\n"; cout << "2. Добавить сотрудников из файла\n"; cout << "3. Удалить сотрудника по номеру\n"; cout << "4. Найти сотрудника по номеру\n"; cout << "5. Вывести дерево (рекурсивно)\n"; cout << "6. Вывести дерево (разные обходы)\n"; cout << "7. Поиск по стажу и специальности\n"; cout << "8. Статистика по окладам\n"; cout << "9. Запуск всех тестов\n"; cout << "0. Выход\n"; cout << "Ваш выбор: "; cin >> choice; switch (choice) { case 1: addEmployee(); break; case 2: addFromFile(); break; case 3: deleteEmployeeInteractive(); break; case 4: findEmployeeInteractive(); break; case 5: printTree(); break; case 6: printTreeTraversals(); break; case 7: searchByCriteriaInteractive(); break; case 8: salaryStatisticsInteractive(); break; case 9: runAllTests(); break; case 0: cout << "Выход\n"; break; default: cout << "Неверный ввод\n"; } } while (choice != 0); } int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); cout << "=== Бинарное дерево (ключ – табельный номер) ===\n"; menu(); deleteTree(root); return 0; }