Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615

Сжатие кода

07.04.2015, 15:32. Показов 2055. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть код:
C++ (Qt)
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
if((globalReplace = edit->replacement()).isEmpty())
            {
                for(j = 0; j < table->rowCount(); j++)
                {
                    if(table->isSkipped(j)) continue;
                    replace = table->replacement(j);
                    value = table->value(j);
                    if((regExp = table->regExp(j)).isEmpty())
                    {
                        if(replace.isEmpty()) continue; //Различие
                        this->_addReplacement(data, edit->parameter(), value, replace);
                    }
                    else this->_setLocalReplacement(data, edit->parameter(), value, replace, regExp);
                }
            }
            else
            {
                for(j = 0; j < table->rowCount(); j++)
                {
                    if(table->isSkipped(j)) continue;
                    replace = table->replacement(j);
                    value = table->value(j);
                    if((regExp = table->regExp(j)).isEmpty())
                    {
                        if(replace.isEmpty()) this->_addReplacement(data, edit->parameter(), value, globalReplace); //Различие
                        else this->_addReplacement(data, edit->parameter(), value, replace);
                    }
                    else this->_setLocalReplacement(data, edit->parameter(), value, replace, regExp);
                }
            }
Различие содержимого блоков if и else в строчках, помеченных комментариями. Все остальное совпадет до буквы.
Как можно ужать содержимое блоков в единую функцию в этом случае? И передавать аргумент, который и будет различать блоки.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.04.2015, 15:32
Ответы с готовыми решениями:

Сжатие Хаффмана
Как изменить данный алгоритм, чтобы ограничить длину кода символа заданным числом Nmax? Спасибо! #include &quot;stdafx.h&quot; ...

сжатие массива
задание: В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1) Максимальный и минимальный элемент массива 2)...

Сжатие Хаффмана
Есть прога, реализующая сжатие Хаффмана: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;map&gt; ...

7
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.04.2015, 15:42
[progeR], Заводишь метод
C++ (Qt)
1
2
3
4
5
6
7
8
void Metod (int rg)
{
    ...
    if (replace.isEmpty() {
       if (rg==0) continue;
       else this->_addReplacement(data, edit->parameter(), value, globalReplace);
    }
}
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
07.04.2015, 17:16  [ТС]
Да, так можно. Но это лишняя проверка получается...
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.04.2015, 17:42
Цитата Сообщение от [progeR] Посмотреть сообщение
Но это лишняя проверка получается..
А что же вы хотите? Где-то находим - должны же где-то и потерять. Правда, в вашем случае все значительно проще. Надо перенести проверку в соответствующую точку
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                for(j = 0; j < table->rowCount(); j++)
                {
                    if(table->isSkipped(j)) continue;
                    replace = table->replacement(j);
                    value = table->value(j);
                    if((regExp = table->regExp(j)).isEmpty())
                    {
                        if(replace.isEmpty()) {
                          if((globalReplace = edit->replacement()).isEmpty())  continue; //Различие
                          else  this->_addReplacement(data, edit->parameter(), value, globalReplace); 
                        }                                           
                        this->_addReplacement(data, edit->parameter(), value, replace);
                    }
                    else this->_setLocalReplacement(data, edit->parameter(), value, replace, regExp);
                }
0
30 / 8 / 2
Регистрация: 20.08.2011
Сообщений: 615
07.04.2015, 17:56  [ТС]
Это да, но я стараюсь писать, избегая лишних проверок. Пример хороший, только вот globalReplace проверяется на пустоту в каждой итерации. А она на то и global, что ее можно единожды проверить, и исходя из результата использовать нужный блок if или else.

Должно быть без потери качества не ужмешь...
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
07.04.2015, 18:08
C++ (Qt)
1
2
bool Flag = (globalReplace = edit->replacement()).isEmpty());
// В цикле проверяем Flag
но больше я уже ничего придумать не в состоянии. Выбор за вами. Накручивать простыни кода или делать одну проверку.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
07.04.2015, 18:20
Если так сильно хочется, сделай шаблон. if с проверкой константы выкинется при оптимизации.

Добавлено через 4 минуты
(Вряд ли только разницу по скорости заметишь по сравнению с проверкой флажка в цикле.)
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
07.04.2015, 18:29
Цитата Сообщение от [progeR] Посмотреть сообщение
Должно быть без потери качества не ужмешь...
Шаблончик можно применить:
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
33
34
35
36
37
template <bool IsGlobalReplace>
void YourClassType::regExpReplace(QString const & globalReplace)
{
    for(j = 0; j < table->rowCount(); j++)
    {
        if(table->isSkipped(j))
            continue;
        replace = table->replacement(j);
        value = table->value(j);
        if((regExp = table->regExp(j)).isEmpty())
        {
            if(!replace.isEmpty())
            {
                this->_addReplacement(data, edit->parameter(), value, replace);
            }
            else if(IsGlobalReplace)
            {
                this->_addReplacement(data, edit->parameter(), value, globalReplace);
            }
        }
        else
        {
            this->_setLocalReplacement(data, edit->parameter(), value, replace, regExp);
        }
    }
}
 
//..............
 
    if((globalReplace = edit->replacement()).isEmpty())
    {
        regExpReplace<false>(globalReplace);
    }
    else
    {
        regExpReplace<true>(globalReplace);
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2015, 18:29
Помогаю со студенческими работами здесь

сжатие изображения
хочу написать программку на C++ , желательно C++ Builder 6 которая сжимает изображение и востанавливает с помощью вейвлетов, но не знаю как.

Вероятностное сжатие
Здравствуйте, мне нужно реализовать вероятностное сжатие. Но я даже не знаю с какой стороны подойти, а гугл ни чего толкогово мне не...

LZW сжатие
Написал компрессию\декомпрессию.Сжатый файл представяет из себя текст(код символов разделенные пробелами). Проблема в том что сжатый файл...

Сжатие массива
В одномерном массиве, состоящем из n вещественных элементов, вычислить: максимальный элемент массива; сумму элементов массива,...

Сжатие изображения
У меня есть массив байт изображения. Изображение в ARGB формате. Размер известен и постоянен 256 на 256. Как мне эту картинке уменьшить...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru