Форум программистов, компьютерный форум CyberForum.ru

Упрощение кода - C++

Восстановить пароль Регистрация
 
 
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.06.2014, 14:09     Упрощение кода #1
Всем привет.

Есть такой код:

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
enum FTYPE { FALSE, TRUE, DEFAULT };
FTYPE f();
 
bool n()
{
    while( g() )
    {
        switch( f() )
        {
            case TRUE: return true; 
            case FALSE: return false; 
            case DEFAULT: break; 
        }
    }
    return false; 
}
 
bool c()
{
    switch( f() )
    {
       case TRUE: return true; 
       case FALSE: return false; 
       case DEFAULT: break; 
    }
    return n();
}
Как можно заметить, строки 8-13 и 20-25 эквивалентны, но можно ли их заменить новой функцией для исключения дублирования? Мне почему-то кажется, что нет. И единственное упрощение, которое тут можно сделать, это убрать строки с
C++
1
case DEFAULT: break;
т.к. они всё равно ни на что не влияют.

P.S. Обращу ваше внимание ещё на то, что c() в итоге может вызвать n(). (это не опечатка)

Какие будут идеи, уважаемые?

P.S. макроподстановку не предлагать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2014, 14:09     Упрощение кода
Посмотрите здесь:

Упрощение кода C++
C++ Упрощение и алгоритм
Упрощение кода C++
C++ Упрощение кода
Упрощение программного кода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
20.06.2014, 21:10  [ТС]     Упрощение кода #21
Цитата Сообщение от UnsKneD Посмотреть сообщение
Может нам хотя бы задачу озвучат? а не голый код.
Задача не суть важна. Тут просто невозможность прямой замены идентичного (посимвольно) кода была интересна.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
20.06.2014, 21:11     Упрощение кода #22
Цитата Сообщение от Tulosba Посмотреть сообщение
И, кстати, у тебя не выполнится g() нужное кол-во раз, если g() вернет true, а f() вернет DEFAULT
писал на коленке кусками, ради идеи
Trwsdf
Заблокирован
20.06.2014, 22:03     Упрощение кода #23
Цитата Сообщение от Tulosba Посмотреть сообщение
Какие будут идеи, уважаемые?
Да какие тут идеи, неправильный код.
Если ты в С() вызываешь значение функции f() и она равна DEFAULT, то она даст то же значение и при вызове ее в n(), т.е. n() всегда даст false. Цикл вообще ненужен. В итоге
C++
1
2
3
4
5
6
7
enum FTYPE { FALSE, TRUE, DEFAULT };
FTYPE f();
 
bool c()
{
    if(f()==TRUE)return true;return false;
}
Да, еще , если у тебя одна и та же функция с одними и теми же аргументами каждый раз возвращает разное значение, то это сверх "умно", и надо заранее предупреждать.
HighPredator
 Аватар для HighPredator
5351 / 1734 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
20.06.2014, 22:12     Упрощение кода #24
Цитата Сообщение от Trwsdf Посмотреть сообщение
Если ты в С() вызываешь значение функции f() и она равна DEFAULT, то она даст то же значение и при вызове ее в n()
Это справедливо, если f() не меняет состояние между вызовами, что не оговорено.
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
21.06.2014, 07:54     Упрощение кода #25
именно. Вполне возможно, что как раз таки в функции f происходит какая то пошаговая обработка, например, проверка проверка последовательности команд или данных
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.06.2014, 08:18  [ТС]     Упрощение кода #26
Цитата Сообщение от Trwsdf Посмотреть сообщение
Да какие тут идеи, неправильный код.
Код правильный до тех пор пока он удовлетворяет Стандарту или конкретной реализации компилятора.
В данном случае, код не является ill-formed.

Цитата Сообщение от Trwsdf Посмотреть сообщение
Да, еще , если у тебя одна и та же функция с одними и теми же аргументами каждый раз возвращает разное значение, то это сверх "умно", и надо заранее предупреждать.
Как уже заметил HighPredator нигде не оговорено, что упомянутые функции не содержат побочных эффектов или являются реентерабельными. Поэтому равнозначное изменение кода подразумевает, что и кол-во и порядок вызова функций будет такой же как в оригинале. Например представьте, что внутри g() и f() используется статическая или глобальная переменная, или вообще всё это функции-члены, которые могут менять состояние объекта, а имена без упоминания класса даны просто для упрощения восприятия.
Trwsdf
Заблокирован
21.06.2014, 13:45     Упрощение кода #27
Цитата Сообщение от Tulosba Посмотреть сообщение
Код правильный до тех пор пока он удовлетворяет Стандарту или конкретной реализации компилятора.
Да, код правильный с точки зрения компилятора, но неправильный с логической точки зрения. Логические ошибки куда опасней ошибок компилятора, ибо если одни видны сразу, другие могут пройти годы, пока будут найдены. Так же ты можешь написать бесконечный цикл и сказать, что код правильный, ведь компилятор его считает правильным, разве не так?
Ты спросил мнение окружающих,
Цитата Сообщение от Trwsdf Посмотреть сообщение
Какие будут идеи, уважаемые?
я ответил и указал на твои ошибки. Я не понимаю зачем ты мнение людей спрашиваешь, если оно тебе не нужно и ты не сможешь признать, что неправ?

Цитата Сообщение от Tulosba Посмотреть сообщение
Как уже заметил HighPredator нигде не оговорено, что упомянутые функции не содержат побочных эффектов или являются реентерабельными. Поэтому равнозначное изменение кода подразумевает, что и кол-во и порядок вызова функций будет такой же как в оригинале. Например представьте, что внутри g() и f() используется статическая или глобальная переменная, или вообще всё это функции-члены, которые могут менять состояние объекта, а имена без упоминания класса даны просто для упрощения восприятия.
Зачем ты пытаешься оправдаться, если ты спросил мое мнение? Тебе оно не нравится? мне плевать.
Ты должен был учесть замечания (их 2), что я тебе сказал. Ты делаешь ту же ошибку, что и остальные -дописываешь задачу, после первого поста, - "представьте", "а если", "а вдруг". Нетривиальные функции всегда обсуждаются в первом посте темы, если это не указано, - значит считается, что они тривиальные.
Найди в STL такие функции, которая при одних и тех же параметрах возвращает всегда случайное значение, кроме даты и генератора чисел.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.06.2014, 14:35  [ТС]     Упрощение кода #28
Цитата Сообщение от Trwsdf Посмотреть сообщение
написать бесконечный цикл и сказать, что код правильный, ведь компилятор его считает правильным, разве не так?
Именно так. Вероятно Вам никогда не приходилось писать ПО под какие-нибудь контроллеры, где вообще нет ОС, и программа должна работать в бесконечном цикле, пока на железяку подано питание.
Цитата Сообщение от Trwsdf Посмотреть сообщение
я ответил и указал на твои ошибки.
От того, что какой-то человек с завышенным ЧСВ считает что-то ошибкой, это ещё не делает это ошибкой в объективном плане.
Цитата Сообщение от Trwsdf Посмотреть сообщение
Я не понимаю зачем ты мнение людей спрашиваешь, если оно тебе не нужно и ты не сможешь признать, что неправ?
Интересно получается, Вы совершенно не в курсе что может лежать в основе задачи, однако твёрдо уверены, что я не прав. Может стоит рассмотреть вариант, что не правы Вы сами?
Цитата Сообщение от Trwsdf Посмотреть сообщение
Зачем ты пытаешься оправдаться, если ты спросил мое мнение?
Я Ваше мнение не спрашивал. Это Вы влезли в мою тему со своим частным решением и начали доказывать свою правоту в довольно агрессивной форме, не принимая вообще никаких фактов.
Цитата Сообщение от Trwsdf Посмотреть сообщение
Ты делаешь ту же ошибку, что и остальные -дописываешь задачу, после первого поста, - "представьте", "а если", "а вдруг".
Если Вам не хватает исходных данных о задаче - задавайте уточняющие вопросы. Если не различаете общий и частный случаи - это уже Ваши проблемы.
Цитата Сообщение от Trwsdf Посмотреть сообщение
Нетривиальные функции всегда обсуждаются в первом посте темы, если это не указано, - значит считается, что они тривиальные.
Это откуда такое правило?
Цитата Сообщение от Trwsdf Посмотреть сообщение
Найди в STL такие функции, которая при одних и тех же параметрах возвращает всегда случайное значение, кроме даты и генератора чисел.
При чем тут STL вообще? Про функции-члены слышали? Про состояние объекта? Про побочные эффекты?
Да даже если функция вообще ничего не возвращает, а просто выводит нужный текст на консоль, может ее и вызывать тогда не обязательно? Возвращаемого значения нет - уберем её нафиг и назовем это эквивалентной заменой. Так что ли?
Trwsdf
Заблокирован
22.06.2014, 16:22     Упрощение кода #29
Tulosba,я не буду уподобляться вам и писать комментарий на каждое предложение.
Скажу главное, ты спросил мнение у людей, как упростить код ,читай название темы,- я тебе ответил. Ты, вместо того, чтобы поблагодарить меня за правильный ответ и дельные замечания по твоей теме, начинаешь агриться на меня. В то время, как я тратил свое время на решение твоей проблемы. Что тут скажешь, очередное хамство и неблагодарность.
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
22.06.2014, 16:49     Упрощение кода #30
Trwsdf, вы все еще мусолите эту тему? Успокойтесь, прошу вас. Автором была просто предложена интересная задачка, к которой нужно подобрать решение. Совсем не обязательно, что потом она будет использоваться в каком то реальном коде. Да и если считать фразу "Все совсем неправильно, условия хрень и надо задачу по другому ставить" ответом, то так вообще все проблемы сведутся к тому, что не надо было даже появляться на свет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2014, 17:10     Упрощение кода
Еще ссылки по теме:

Упрощение кода программы C++
Упрощение и оптимизация кода (MS VCPP) C++
Упрощение дробей C++

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

Или воспользуйтесь поиском по форуму:
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
22.06.2014, 17:10     Упрощение кода #31
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Если я ничего не напутал, то тут получается то же самое с тем же порядком вызовов, только тут tail call optimization нужнее стал.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool n()
{
    return g() ? c() : false; 
}
 
bool c()
{
    switch( f() )
    {
       case TRUE: return true; 
       case FALSE: return false; 
       default: return n();
    }
}
Yandex
Объявления
22.06.2014, 17:10     Упрощение кода
Ответ Создать тему
Опции темы

Текущее время: 02:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru