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

Поясните код генератор слов из телефонного кода

20.02.2020, 10:41. Показов 1265. Ответов 7

Author24 — интернет-сервис помощи студентам
Взял решение задачи Дейтела с форума
Напишите программу на С++, которая для данного семизначного числа записывает
в файл все возможные слова из семи букв, соответствующие этому телефонному номеру.
Существует 2187 (три в седьмой степени) таких слов. Избегайте телефонных номеров
с цифрами 0 и 1.
Если возможно поясните что делает код в строках 6-11???
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
#include <iostream>
 
bool next_combination(int codes[7])
{
    int i = 0;
    while (i < 7 && codes[i] == 2)
        codes[i++] = 0;
 
    if (7 == i)
        return false;
    ++codes[i];
    return true;
}
 
int main()
{
    int codes[7] = { 0, 0, 0, 0, 0, 0, 0 };
    char abc[31] = "      ABCDEFGHIJKLMNOPRSTUVXYZ";
    int number[7] = { 6, 8, 6, 2, 3, 7, 7 };
    do {
        for (int i = 0; i < 7; ++i)
            std::cout << abc[3*number[i]+codes[i]];
        std::cout << std::endl;
    } while (next_combination(codes));
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2020, 10:41
Ответы с готовыми решениями:

Генератор слов для телефонного номера
Вот такая вот интересная задачка у Дейтела есть: 17.13. (Генератор слов для телефонного номера)...

Преобразование слов со знаком из дополн. кода в прямой код.
Сессия, а разобраться уже не успеваю, помогите... Написать программу для преобразования всех...

Как отделить от телефонного номера (допустим +375 33 1234567) код страны (375) и код оператора (33)?
Народ помогите отделить от телефонного номера (допустим +375 33 1234567) код страны(375) и код...

Поясните строку из кода
Поясните строку из кода. S = Q*Q &gt; T ? (a - 1) * exp(x) : ( Q*Q &lt; T ? log(abs(Q*T)) : tan(x*x) ) ;...

7
2561 / 1274 / 467
Регистрация: 08.11.2016
Сообщений: 3,522
20.02.2020, 12:59 2
Собственно осуществляют пересчет для семиразрядного счетчика по модулю 3
1
0 / 0 / 0
Регистрация: 31.05.2017
Сообщений: 74
20.02.2020, 13:47  [ТС] 3
Нет а построчно например строки 11 6 9. ???

Добавлено через 40 минут
Блин перепутал код
Вот он с указателями не пойму как работают ptr
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
#include <iostream>
 
bool next_combination(int *ptr, int *end, int max)
{
    while (ptr != end && *ptr == max)
        *ptr++ = 0;
 
    if (ptr == end)
        return false;
    
    ++*ptr;
    return true;
}
 
int main()
{
    int codes[7] = { 0, 0, 0, 0, 0, 0, 0 };
    int number[7] = { 6, 8, 6, 2, 3, 7, 7 };
    char abc[31] = "      ABCDEFGHIJKLMNOPRSTUVXYZ";
 
    do {
        for (int i = 0; i < 7; ++i)
            std::cout << abc[3*number[i]+codes[i]];
        std::cout << std::endl;
    } while ( next_combination(codes, codes+7, 2) );
 
    return 0;
}
0
2561 / 1274 / 467
Регистрация: 08.11.2016
Сообщений: 3,522
20.02.2020, 14:22 4
Лучший ответ Сообщение было отмечено mlippi80 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
/*массив codes в данном случае имеет смысл счетчика
цикл проходит все элементы массива codes (разряды счетчика) пока элементы равны 2 и обнуляет их
   таким образом осуществляется перенос единицы в старший разряд*/
while (i < 7 && codes[i] == 2)
        codes[i++] = 0;
 
    if (7 == i) // если итератор счетчика дошел до последнего 7-го разряда значит он перебрал все возможные значения
        return false;
    ++codes[i]; //здесь счетчик увеличивается на единицу в том месте до куда еще не дошел перенос
Тут смотрите про счетчики с произвольным модулем пересчета

в случае с указателями идея таже самая, просто подставьте в уме
C++
1
*(ptr+i) = codes[i];
1
0 / 0 / 0
Регистрация: 31.05.2017
Сообщений: 74
20.02.2020, 14:26  [ТС] 5
А почему элементы равны 2? Ведь при инициализации массив codes состоит из 7 нулей
0
2561 / 1274 / 467
Регистрация: 08.11.2016
Сообщений: 3,522
20.02.2020, 14:51 6
mlippi80, там два знака =, то есть как, есть два оператора:
1. Оператор присваивания обозначаемый как "=" - он говорит о том что в переменную надо записать значение за ним
2. Логический оператор сравнения обозначаемый как "==" который возвращает значение "истина" если аргументы справа и слева равны и "ложь" если не равны.
в строке №4 проверяется условие дальнейшего выполнения цикла "while" ("пока", то есть пока выполняется условие снова и снова выполняем действия в цикле и выходим из цикла как только условие выполняться перестало).
Цикл сформулирован так: "пока не конец массива codes И значение текущего элемента равно 2 присваиваем текущему элементу массива значение 0 и переходим к следующему элементу".
1
0 / 0 / 0
Регистрация: 31.05.2017
Сообщений: 74
25.02.2020, 14:10  [ТС] 7
А выражение codes+7 это что подразумевает?
Это 7 элемент массива?

Добавлено через 31 минуту
И почему codes [i++] = 0
Обнуляет текущую позицию i, ведь в условии i++ , те начиная со следующего элемента
0
2561 / 1274 / 467
Регистрация: 08.11.2016
Сообщений: 3,522
25.02.2020, 23:24 8
А выражение codes+7 это что подразумевает?
Это 7 элемент массива?
C++
1
next_combination(codes, codes+7, 2)
Тут в функцию передаются указатели на начало и конец массива, codes - это указатель на начало, а так как массив содержит 7 элементов, то указатель (codes+7) указывает на последний элемент массива, а применение операции разыменования "*" возвращает значение элемента массива по заданному указателю, то есть codes - указатель на первый элемент *codes - значение первого элемента, codes+7 - указатель на 7-ой элемент массива *(codes+7) - значение 7-го элемента массива, но это не во всех случаях, применение инкремента "++" к указателю, продвигает его к следующему элементу и после этого codes указывает уже не на начало массива, а на следующий элемент.
почему codes [i++] = 0
Обнуляет текущую позицию i, ведь в условии i++ , те начиная со следующего элемента
Есть понятие постфиксный и префиксный оператор, префиксный оператор имеет наивысший преоритет в выражении, постфиксный наинизший, то есть если мы скажем так:
C++
1
2
3
int i = 0; // i = 0
int a = i++; // i = 1, a = 0 - сначала переменной a будет присвоено текущее значение i, а затем выполниться инкремент над i
int b = ++i // i = 2, b = 2 - сначала выполнится инкремент над i, а затем b будет присвоено значение i
Соотвественно тут:
C++
1
codes [i++] = 0
Сначала элементу массива codes с текущим значением индекса i будет присвоен ноль, а затем индекс i увеличится на 1
1
25.02.2020, 23:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2020, 23:24
Помогаю со студенческими работами здесь

Поясните фрагмент кода
Что это за код? template &lt;class rdn&gt; void rands (rdn arr){ for (int i(0); i!=3; i++){ ...

Поясните по части кода
for (i = 0; i&lt;str; ++i) { for (j = 0; j&lt;stl - 1; ++j) if (arr == arr) kol_str++; }...

Поясните фрагмент кода
Всем привет! Мой вопрос достаточно странный, но ответ на него я нигде не нашел, итак как правильно...

Поясните фрагмент кода
#!/bin/bash function help { echo &quot; Тут та информация которая выводится если...


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

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