Opened 6 years ago

Closed 6 years ago

#236 closed ожидается проверка (задача сдана)

ha2

Reported by: Alina Filimokhina Owned by: rutsky,grabovoy.philipp
Priority: проверка Milestone: ha2-deadline
Component: HA#2 huffman Version:
Keywords: Cc:

Description

Посмотрите, пожалуйста.

Change History (7)

comment:1 Changed 6 years ago by Vladimir Rutsky

Milestone: ha2-milestone2ha2-deadline
Type: ожидается проверкаожидаются исправления

Замечания:

  1. Передавайте имена файлов в incoder() (лучше назвать encoder()) и decoder() константными. Для булевых флагов стоит использовать тип bool. Переименуйте аргументы, чтобы они отражали их значение, например source, dest и verbose.
  1. В заголовочном файле стоит включать минимально необходимый для пользователя этого заголовочного файла набор файлов. Например, в huffman.hpp не стоит включать <fstream>.
  1. При обработке аргументов командной строки вы не проверяете количество аргументов, переданных в программу.
  1. В huffman.cpp вы включаете некоторые заголовочные файлы по нескольку раз.
  1. В class Huffman у вас только статические функции и определение дополнительного класса --- сделайте статические функции свободными функциями.
  1. В decoder() не используется flag --- удалите его.
  1. При выводе информации с флагом -v вы выводите сначала двоичный код Хаффмана для символа, а затем код символа, а требуется наоборот. Также выводимые символы должны быть упорядочены в лексикографическом порядке по двоичным кодам символов.
  1. Сериализуйте и десериализуйте все данные в файле в двоичном виде.

Например, вместо

int ww = 0;
...
ff << " \n" << ww;

Используйте:

uint32_t ww = 0;
...
ff.write(reinterpret_cast<char *>(&ww), sizeof(ww));

И для чтения:

uint32_t ww;
...
ff.read(reinterpret_cast<char *>(&ww), sizeof(ww));

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

Открывайте файл для записи и чтения в двоичном режиме (как вы делаете это в filesize()).

  1. Выводимая статистика некорректна. Например, при сжатии файла из одного байта вы выводите:
1
1
8

При этом реальный размер файла 8 байт, а не 1 + 8.

  1. Рекомендую попробовать использовать битовые операции (&, |, <<, >> и т.п.), для работы с битами (вместо, например, умножения и взятие остатка от деления).

Исправьте, пожалуйста, в ближайшие 60 часов.

comment:2 Changed 6 years ago by Vladimir Rutsky

  1. В decoder() не используется flag --- удалите его.

Я не прав, в decoder() нужно реализовать вывод полученных кодов Хаффмана.

comment:3 Changed 6 years ago by Vladimir Rutsky

Алина, вы будете исправлять ваше решение?

comment:4 Changed 6 years ago by Alina Filimokhina

Проверьте, пожалуйста

comment:5 Changed 6 years ago by Alina Filimokhina

Type: ожидаются исправленияожидается проверка

comment:6 Changed 6 years ago by Vladimir Rutsky

Замечания:

  1. Неизменяемые аргументы-строки стоит сделать константными. Например в void encoder (char *source, char *dest, bool verbose);: void encoder (char const *source, char const *dest, bool verbose);
  1. Используйте тип size_t для индексов. Здесь: for (auto i = 0; i < col; i++) {, тип i оказывается int.
  1. Здесь:
uint32_t ww = 0;

for (auto &encoded: huffman_encoding) {
        ww++;
    }

Вы можете вычислить ww без итерирования: uint32_t ww = huffman_encoding.size().

  1. Выводимая статистика всё ещё некорректна. Вы включаете размер доп. данных в размер сжатых данных.

Решение зачтено с минусом.

comment:7 Changed 6 years ago by Vladimir Rutsky

Resolution: задача сдана
Status: newclosed
Note: See TracTickets for help on using tickets.