Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №2018253
А
Аноним
26 октября 2024 12:28 · публичный вопрос
А
Аноним

Напишите простую программу на c++ без классов «Телефонный справочник». На вход программе поступают запросы трёх типов: 69-70-30 Ivanov — добавить телефон и фамилию абонента в справочник 69-70-30 — узнать фамилию абонента по номеру телефона Ivanov — узнать телефон абонента по фамилии Необходимо выводить в консоль ответ на запросы 2 и 3. Обратите внимание, что абоненты по разным номерам могут иметь одинаковые фамилии. В таком случае на запрос 3 необходимо выдать все номера через пробелы. Операции запросов должны работать за O(logn) или O(logn × количество номеров с этой фамилией). Чек-лист для проверки задачи Программа корректно выводит фамилии и списки номеров. Программа использует только заголовочные файлы , , и, возможно, вектор.

Нейросеть26 октября 2024 12:28

Давайте создадим простую программу на C++, которая реализует телефонный справочник с использованием стандартных контейнеров. Мы будем использовать std::map для хранения соответствий между номерами телефонов и фамилиями, а также между фамилиями и номерами телефонов.

Вот пример реализации программы:

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <sstream>

using namespace std;

int main() {
    map<string, string> phoneBook; // для хранения соответствия номер - фамилия
    map<string, vector<string>> surnameToPhones; // для хранения соответствия фамилия - номера

    string command;
    while (getline(cin, command)) {
        istringstream iss(command);
        string firstPart;
        
        if (isdigit(command[0])) { // Если команда начинается с цифры, это уже номер телефона
            string number;
            iss >> number;

            if (iss.eof()) { // Запрос по номеру
                if (phoneBook.find(number) != phoneBook.end()) {
                    cout << phoneBook[number] << endl;
                } else {
                    cout << "Абонент не найден" << endl;
                }
            } else { // Этот случай — добавление номера и фамилии
                string surname;
                iss >> surname;

                // Добавляем запись в телефонный справочник
                phoneBook[number] = surname;
                surnameToPhones[surname].push_back(number);
            }
        } else { // Если команда не начинается с цифры, это фамилия
            string surname = command;

            // Запрос по фамилии
            if (surnameToPhones.find(surname) != surnameToPhones.end()) {
                for (const string& number : surnameToPhones[surname]) {
                    cout << number << " ";
                }
                cout << endl;
            } else {
                cout << "Абонент не найден" << endl;
            }
        }
    }

    return 0;
}

Как работает программа:

  1. Структуры данных:

    • Используется map для хранения пары "номер телефона - фамилия".
    • Вторая map хранит фамилии, каждая из которых указывает на вектор номеров телефонов. Это позволяет хранить несколько номеров для одной фамилии.
  2. Основной цикл программы:

    • Программа считывает строки с командами.
    • Если строка начинается с цифры, это номер телефона. В зависимости от наличия еще данных в строке, программа либо возвращает фамилию по номеру, либо добавляет новую запись.
    • Если строка содержит фамилию, программа ищет все номера телефонов, связанные с этой фамилией.
  3. Вывод:

    • При выполнении запросов на поиск фамилий и номеров, программа выводит результаты в консоль.

Замечания:

  • Эта программа обрабатывает команды в режиме O(log n) для вставки и поиска благодаря использованию map.
  • Если фамилия имеет несколько номеров, они выводятся через пробел.

Запустите программу и протестируйте ее с различными входными данными, чтобы убедиться в корректности работы!

Напишите простую программу на c++ без классов «Телефонный справочник». На вход программе поступают запросы трёх типов: 69-70-30 Ivanov — добавить телефон и фамилию абонента в справочник 69-70-30 — узнать фамилию абонента по номеру телефона Ivanov — узнать телефон абонента по фамилии Необходимо выводить в консоль ответ на запросы 2 и 3. Обратите внимание, что абоненты по разным номерам могут иметь одинаковые фамилии. В таком случае на запрос 3 необходимо выдать все номера через пробелы. Операции запросов должны работать за O(logn) или O(logn × количество номеров с этой фамилией). Чек-лист для проверки задачи Программа корректно выводит фамилии и списки номеров. Программа использует только заголовочные файлы , , и, возможно, вектор.
Давайте создадим простую программу на C++, которая реализует телефонный справочник с использованием стандартных контейнеров. Мы будем использовать `std::map` для хранения соответствий между номерами телефонов и фамилиями, а также между фамилиями и номерами телефонов. Вот пример реализации программы: ```cpp #include #include #include #include #include using namespace std; int main() { map phoneBook; // для хранения соответствия номер - фамилия map> surnameToPhones; // для хранения соответствия фамилия - номера string command; while (getline(cin, command)) { istringstream iss(command); string firstPart; if (isdigit(command[0])) { // Если команда начинается с цифры, это уже номер телефона string number; iss >> number; if (iss.eof()) { // Запрос по номеру if (phoneBook.find(number) != phoneBook.end()) { cout << phoneBook[number] << endl; } else { cout << "Абонент не найден" << endl; } } else { // Этот случай — добавление номера и фамилии string surname; iss >> surname; // Добавляем запись в телефонный справочник phoneBook[number] = surname; surnameToPhones[surname].push_back(number); } } else { // Если команда не начинается с цифры, это фамилия string surname = command; // Запрос по фамилии if (surnameToPhones.find(surname) != surnameToPhones.end()) { for (const string& number : surnameToPhones[surname]) { cout << number << " "; } cout << endl; } else { cout << "Абонент не найден" << endl; } } } return 0; } ``` ### Как работает программа: 1. **Структуры данных**: - Используется `map` для хранения пары "номер телефона - фамилия". - Вторая `map` хранит фамилии, каждая из которых указывает на вектор номеров телефонов. Это позволяет хранить несколько номеров для одной фамилии. 2. **Основной цикл программы**: - Программа считывает строки с командами. - Если строка начинается с цифры, это номер телефона. В зависимости от наличия еще данных в строке, программа либо возвращает фамилию по номеру, либо добавляет новую запись. - Если строка содержит фамилию, программа ищет все номера телефонов, связанные с этой фамилией. 3. **Вывод**: - При выполнении запросов на поиск фамилий и номеров, программа выводит результаты в консоль. ### Замечания: - Эта программа обрабатывает команды в режиме `O(log n)` для вставки и поиска благодаря использованию `map`. - Если фамилия имеет несколько номеров, они выводятся через пробел. Запустите программу и протестируйте ее с различными входными данными, чтобы убедиться в корректности работы!