Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
1

Упрощение кода

20.06.2014, 14:09. Просмотров 1271. Ответов 30
Метки нет (Все метки)

Всем привет.

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

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. макроподстановку не предлагать
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2014, 14:09
Ответы с готовыми решениями:

Упрощение кода
void Polynomials::print(){ // Вывод полинома int i; int k; //...

Упрощение кода
Можно ли как нибудь сократить или упростить код? cin>>answer; if...

Упрощение кода
Хочу написать многофункциональную консольную программу. Код получится...

Упрощение кода программы
Здравствуйте уважаемые форумчане! Решил начать изучать язык Си++, начал с...

Упрощение кода очереди
Доброго времен суток! Дан код, нужно его упростить или же немного переделать....

30
Хедин
74 / 69 / 55
Регистрация: 17.05.2014
Сообщений: 301
20.06.2014, 17:33 2
Tulosba, у меня только такой слегка извращенный вариант приходит в голову
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool n(bool c)
{
    while(с || g()))
    {
        switch( f() )
        {
            case TRUE: return true; 
            case FALSE: return false; 
            case DEFAULT: break; 
        }
        if (c) break;
    }
    return c ? n(false) : false;
}
функция С вызывается как n(true), функция N вызывается как n(false)
1
UnsKneD
алкокодер
155 / 151 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.06.2014, 19:23 3
просто делегируй функцию
C#
1
2
3
4
5
6
        switch( f() )
        {
            case TRUE: return true; 
            case FALSE: return false; 
            case DEFAULT: break; 
        }
0
Issues
431 / 366 / 149
Регистрация: 06.08.2012
Сообщений: 961
20.06.2014, 19:34 4

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
enum FTYPE { FALSE, TRUE, DEFAULT };
FTYPE f();
 
bool SWITCH(FTYPE f)
{
    switch(f)
    {
    case TRUE: return true; 
    case FALSE: return false; 
    case DEFAULT: break; 
    }
    return false;
}
 
bool n()
{
    while( g() )
    {
        SWITCH(f());
    }
    return false; 
}
 
bool c()
{
    SWITCH(f());
    return n();
}
0
HighPredator
5689 / 2008 / 723
Регистрация: 10.12.2010
Сообщений: 5,774
Записей в блоге: 3
20.06.2014, 19:52 5
Лучший ответ Сообщение было отмечено Tulosba как решение

Решение

Не по теме:

-- выпилено --

Добавлено через 6 минут
А стоп, не доглядел.



Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool n()
{
  while (g())
  {
    ftype k = f();
    if ( k != DEFAULT ) return k;
  }
  return false;
}
 
bool c()
{
  ftype k = f();
  if (k == DEFAULT) return n();
  else return k;
}
Добавлено через 1 минуту
Так вот можно.
1
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.06.2014, 19:58  [ТС] 6
Issues, в вашем случае n() сможет вернуть только false, что не соответствует истине.
Цитата Сообщение от UnsKneD Посмотреть сообщение
просто делегируй функцию
Так же как Issues? Или как-то иначе?
0
UnsKneD
алкокодер
155 / 151 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.06.2014, 20:06 7
Tulosba, вообще я с шарпом ветки перепутал. но было бы что то такое. но в таком случае return n(); никогда не выполнится.
0
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
20.06.2014, 20:06 8
Думаю, если обернуть в функцию, то всё равно будет дублирующий код, для проверки возвращенного значения.
Если нет никаких критериев безопасности, может с си'шными прыжками попробовать поизвращаться?
0
Хедин
74 / 69 / 55
Регистрация: 17.05.2014
Сообщений: 301
20.06.2014, 20:09 9
Tulosba, моя функция вам видимо совсем не понравилась
0
HighPredator
20.06.2014, 20:11
  #10

Не по теме:

Хедин, не переживайте, мои по ходу тоже :D

0
Хедин
20.06.2014, 20:12
  #11

Не по теме:

HighPredator, что поделать, мир жесток)

0
Croessmah
20.06.2014, 20:12
  #12

Не по теме:

Цитата Сообщение от Хедин Посмотреть сообщение
моя функция вам видимо совсем не понравилась
думаю, это лишь минимальный пример кода, а не конкретный случай и нужно что-то более подходящее под разные ситуации

0
Хедин
74 / 69 / 55
Регистрация: 17.05.2014
Сообщений: 301
20.06.2014, 20:14 13
Croessmah, мне кажется, если бы код был более глобальным, было бы легче изменить функции по феншую
0
UnsKneD
алкокодер
155 / 151 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.06.2014, 20:19 14
Может нам хотя бы задачу озвучат? а не голый код.
0
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
20.06.2014, 20:20 15
Извращения?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool foo ( FTYPE x ) {
    switch( x )
    {
       case TRUE: return true ; 
       case FALSE: return false ; 
       case DEFAULT: throw DEFEXCEPTION(); 
    }
}
//...
bool n()
{
    while( g() )
    {
         try {
            return foo(f()) ;
         } catch ( const DEFEXCEPTION & ) {
            break ;
         }
    }
    return false; 
}
1
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.06.2014, 20:23  [ТС] 16
Цитата Сообщение от Croessmah Посмотреть сообщение
может с си'шными прыжками попробовать поизвращаться?
Ну уж нет. Битоопства нам не надо
HighPredator, Хедин, надо ж было проверить код, прежде чем плюсы раздавать.
0
Хедин
20.06.2014, 20:25
  #17

Не по теме:

Tulosba, в таком случае поспешно отзываю претензии и негодования)))

0
HighPredator
5689 / 2008 / 723
Регистрация: 10.12.2010
Сообщений: 5,774
Записей в блоге: 3
20.06.2014, 21:02 18
Цитата Сообщение от Tulosba Посмотреть сообщение
HighPredator, Хедин, надо ж было проверить код, прежде чем плюсы раздавать.
? в смысле?
0
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.06.2014, 21:07  [ТС] 19
Цитата Сообщение от Croessmah Посмотреть сообщение
Извращения?
А где цэ() тогда? И, кстати, у тебя не выполнится g() нужное кол-во раз, если g() вернет true, а f() вернет DEFAULT. Но сама идея интересная

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от HighPredator Посмотреть сообщение
? в смысле?
Ну вы возмущались с Хедин на пару, что никакого ответа вам не дал. Вот я и объясняю, что проверял код на соответствие, а потом уже плюсанул по результатам.

0
HighPredator
20.06.2014, 21:09     Упрощение кода
  #20

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Ну вы возмущались с Хедин на пару, что никакого ответа вам не дал. Вот я и объясняю, что проверял код на соответствие, а потом уже плюсанул по результатам.
Аааа, а я то понял так, что мол код непроверенный выложил и за зря плюсы получил :D

0
20.06.2014, 21:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2014, 21:09
Привет! Вот еще темы с ответами:

Упрощение программного кода
Всем здравствуйте а можно ли упростить вот этот код: #include "stdafx.h"...

Упрощение и оптимизация кода (MS VCPP)
Доброго времени суток! Имеется простенький код (все работает) но выглядит...

Упрощение и алгоритм
Здрасте есть рекурентное выражение не удаётся упростить для нахождения...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru