Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.10.2021
Сообщений: 20
1

Телефонные номера

12.11.2022, 11:51. Показов 614. Ответов 2

Author24 — интернет-сервис помощи студентам
Телефонные номера в адресной книге мобильного телефона имеют один из следующих форматов:

+7<код><номер>
8<код><номер>
<номер>
При этом, <номер> — это семь цифр, а <код> — это три цифры или три цифры в круглых скобках. Если код не указан, то считается, что он равен 495. Кроме того, в записи телефонного номера может стоять знак «-» между любыми двумя цифрами (см. пример).

На данный момент в адресной книге телефона Васи записано всего три телефонных номера, и он хочет записать туда еще один. Но он не может понять, не записан ли уже такой номер в телефонной книге. Помогите ему!

Два телефонных номера совпадают, если у них равны коды и равны номера. Например, +7(916)0123456 и 89160123456 — это один и тот же номер.

Формат входных данных
В первой строке входных данных записан номер телефона, который Вася хочет добавить в адресную книгу своего телефона. В следующих трех строках записаны три номера телефонов, которые уже находятся в адресной книге телефона Васи.
Гарантируется, что каждая из записей соответствует одному из трех приведенных в условии форматов.

Формат выходных данных
Для каждого телефонного номера в адресной книге выведите YES (заглавными буквами), если он совпадает с тем телефонным номером, который Вася хочет добавить в адресную книгу или NO (заглавными буквами) в противном случае.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2022, 11:51
Ответы с готовыми решениями:

Телефонные номера
Телефонные номера Ограничение времени 1 секунда Ограничение памяти 64Mb Ввод стандартный ввод...

Телефонные номера, которые набираются на кнопочном телефоне ходом коня
Динамическое программирование Ход конем (Время: 1 сек. Память: 16 Мб) Шахматная ассоциация...

Вывести на печать телефонные номера, что начинаются на 22, которые имеют наибольший долг
задание: список абонентов телефонной сети:почтовый номер , ФИО , адрес , номер телефона (ввести по...

Программа, которая определяет номер минимального номера номера в двойном списке
Сабж,кто может помочь,хотябы догадками в то совсем нечего не понятно ):

2
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
12.11.2022, 12:22 2
Azarafel, Были ли собственные попытке решения задачи?
0
случайный прохожий
2934 / 1951 / 606
Регистрация: 20.07.2013
Сообщений: 5,160
13.11.2022, 06:12 3
Цитата Сообщение от Azarafel Посмотреть сообщение
в записи телефонного номера может стоять знак «-» между любыми двумя цифрами (см. пример)
Пример отсутствует.

Добавлено через 40 минут
Цитата Сообщение от Azarafel Посмотреть сообщение
Если код не указан, то считается, что он равен 495.
Ну и +7 или 8 должно быть в начале.
Цитата Сообщение от Azarafel Посмотреть сообщение
записано всего три телефонных номера, и он хочет записать туда еще один. Но он не может понять, не записан ли уже такой номер
Вася, видимо, очень "тугой" товарищ.

Добавлено через 3 часа 39 минут
Сделал через функцию в билдере (если нужно, можно самостоятельно переделать под свою среду).

Некоторые пояснения:
а) сравниваем два номера (для сравнения одного номера с тремя нужно либо использовать цикл, либо вызывать функцию три раза по очереди);
б) считаем, что номера введены правильно (как было сказано в условии задачи).

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
String CompareTwoPhoneNumbers (String new_phone_number, String old_phone_number)
{
  // new_phone_number - номер, который хотим добавить (записать)
  // old_phone_number - номер, который уже есть (записан)
  const count = 2;
  String phone_number[count] = {new_phone_number, old_phone_number}, tmp[count] = {"", ""},
         symbols = "8()-";
  int i, j, k;
  for (i = 0; i < count; i++)
  {
    j = (phone_number[i][1] == symbols[1] && phone_number[i].Length() > 10) ? 2 : 3;
    if (phone_number[i].Length() < 11)
      j = 1;
    for (j; j <= phone_number[i].Length(); j++)
    {
      bool is_add_symbol = 1;
      for (k = 2; k <= 4; k++)
        if (phone_number[i][j] == symbols[k])
        {
          is_add_symbol = 0;
          break;
        }
      if (is_add_symbol)
        tmp[i] += phone_number[i][j];
    }
    tmp[i] = "+7" + String((tmp[i].Length() == 7) ? "495" : "") + tmp[i];
  }
  for (j = 1; j <= tmp[0].Length(); j++)
    if (tmp[0][j] != tmp[1][j])
      return "NO " + old_phone_number;
  return "YES " + old_phone_number;
}
Некоторые результаты:
C++
1
CompareTwoPhoneNumbers("+7(916)0123456", "89160123456");
Код
YES 89160123456
C++
1
CompareTwoPhoneNumbers("0-12-34-56", "849501-23-45-6");
Код
YES 849501-23-45-6
C++
1
CompareTwoPhoneNumbers("+79160-12-34-56", "8(915)01-23-45-6");
Код
NO 8(915)01-23-45-6
Добавлено через 1 час 23 минуты
Подправил код, чтобы минимизировать количество "магических" чисел или сделать их более "прозрачными":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
String CompareTwoPhoneNumbers (String new_phone_number, String old_phone_number)
{
  String symbols = "8()-", pref_plus7 = "+7", pref_8 = "8", code_495 = "495";
  const count = 2, pref_8_len = pref_8.Length(), pref_plus7_len = pref_plus7.Length(),
        max_phone_len_wo_code = 10, min_phone_len_wo_code = 7, symbols_len = symbols.Length();
  String phone_number[count] = {new_phone_number, old_phone_number}, tmp[count] = {"", ""};
  int i, j, k;
  for (i = 0; i < count; i++)
  {
    j = 1 + ((phone_number[i][1] == symbols[1] && phone_number[i].Length() >
              max_phone_len_wo_code) ? pref_8_len : pref_plus7_len);
    if (phone_number[i].Length() <= max_phone_len_wo_code)
      j = 1;
    for (j; j <= phone_number[i].Length(); j++)
    {
      bool is_add_symbol = 1;
      for (k = 2; k <= symbols_len; k++)
        if (phone_number[i][j] == symbols[k])
        {
          is_add_symbol = 0;
          break;
        }
      if (is_add_symbol)
        tmp[i] += phone_number[i][j];
    }
    tmp[i] = String((tmp[i].Length() == min_phone_len_wo_code) ? code_495 : String("")) + tmp[i];
  }
  for (j = 1; j <= max_phone_len_wo_code; j++)  // max_phone_len_wo_code = max_phone_len_wo_pref
    if (tmp[0][j] != tmp[1][j])
      return "NO " + old_phone_number;
  return "YES " + old_phone_number;
}
Добавлено через 5 часов 4 минуты
Код обновлен (была "логическая" ошибка из-за того, что перемудрил при корректировке).
Комментарий
C++
1
  // max_phone_len_wo_code = max_phone_len_wo_pref
означает, что в соответствующей строке лучше (по смыслу) использовать max_phone_len_wo_pref, а не max_phone_len_wo_code (с тем же значением). Можно завести новую константу, но я не стал (доводить перфекционизм до предела). Хотя можно было. Но это уже совсем "клиническая" дотошность. Однако, кто желает, пусть сделает.
1
13.11.2022, 06:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2022, 06:12
Помогаю со студенческими работами здесь

Заменить отрицательные элементы суммой номера столбца и номера строки, в которых они находятся
Входные данные: целочисленный массив А размером m х n, где m = 2, n = 4. Заменить отрицательные...

Телефонные номера и префиксы
Здравствуйте! Нужно разбить диапозон телефонных номеров на префиксы 74953456000 - 74953789999...

Телефонные номера
В окружающем мире вы часто встречаете много телефонных номеров, и они становятся всё длиннее. Вам...

Телефонные номера
Задача: У телефонной компании есть большое количество 6-значных телефонных номеров. Заранее...

Телефонные номера
Из шестизначных телефонных номеров, не содержащих одинаковых цифр, наудачу выбирается один. События...

Телефонные номера
Телефонные номера Ограничение времени 1 секунда Ограничение памяти 64Mb Ввод стандартный ввод...

телефонные номера
Сколько можно составить различных телефонных номеров, у которых на первых двух местах стоит цифра...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru