Opened 5 years ago

Closed 5 years ago

#247 closed ожидаются исправления (задача сдана)

WW #4

Reported by: subbotina.olesya Owned by: subbotina.olesya
Component: WW_mergesort Version: 3.0
Keywords: Cc:

Description


Change History (13)

comment:1 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to subbotina.olesya
Type: ожидается проверкаожидаются исправления

И вам хорошего дня ^_^

По корректности (увы, надо поправить один символ):

  1. #pragma once, не #pragma_once

По стилю:

  1. Можно и нужно использовать strcmp из стандартной библиотеки вместо ручного while.
  2. В charcmp могут передавать произвольные символы, необязательно цифры.
  3. (на самом деле по корректности на будущее): компараторы должны находиться не в mergesort.c, а в main.c.
  4. -Iinclude как раз включать в CFLAGS принято.
Last edited 5 years ago by Egor Suvorov (previous) (diff)

comment:2 Changed 5 years ago by subbotina.olesya

Owner: changed from subbotina.olesya to Egor Suvorov
Type: ожидаются исправленияожидается проверка

comment:3 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to subbotina.olesya
Type: ожидается проверкаожидаются исправления

Получилось, 1/10 баллов за корректность и попытка по задаче.

По стилю:

  1. Лучше не ставить пробелы перед # в #include.

comment:4 Changed 5 years ago by subbotina.olesya

Owner: changed from subbotina.olesya to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 1.02.0

comment:5 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to subbotina.olesya
Type: ожидается проверкаожидаются исправления

В целом идеи верные, но сортировка пока что не работает совсем (там в Merge есть несколько опечаток).

  1. Выводятся лишние пробелы в конце строк.
  2. В задании просят реализовать копирование памяти руками. memcpy — это хорошо (а memmove — ещё лучше), но конкретно тут напишите, пожалуйста, свою функцию вроде my_memcpy (кажется, вам даже не требуется, чтобы она работала с пересекающимися диапазонами памяти).
  3. Арифметика указателей с void* — это расширение GCC (о чём он предупредит, если добавить опцию -pedantic), лучше добавьте явное преобразование в char* перед арифметикой.
  4. len_left/left_idx — выберите какую-то одну конвенцию. Мне больше нравится left_len.
  5. Вместо len_left < left_idx пишите left_idx > len_left (чтобы длина была справа).
  6. В Charcmpr совершенно непонятно откуда берётся - '0'
  7. char *val_3[255 * ...] — это что-то очень странное. Вы тут точно не выделили
  8. Придерживайтесь одного стиля и именовании функций и переменных. В Си обычно принят snake_case: MergeSort --> mergesort, Comparator --> comparator.
  9. Функция Comparator зачем-то объявлена в mergesort.h, но нигде не определена. Да и не может быть определена.
  10. Merge используется только в mergesort.c, объявлять его в mergesort.h не нужно.
  11. В Merge параметр Array лучше назвать out/result.
  12. Любой указатель автоматически преобразуется в void*, писать (void*) необязательно.
  13. не нужен return в конце функции, возвращающей void.
  14. mergesort не работает на пустых массивах.
  15. Компараторы лучше сильно упростить: вынесите значения в отдельные переменные
  16. val_1/val_2/val_3 — непонятно, зачем разные имена. Это всё массивы значений. Пусть и называются одинаково. Или хотя бы названия отличаются тем же, чем и массивы: одно говорит про int, другое про char, третье про char*.
  17. a * b / 2 — это не то же самое, что a * (b / 2). Заведите дополнительную переменную.


comment:6 Changed 5 years ago by subbotina.olesya

Owner: changed from subbotina.olesya to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

comment:7 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to subbotina.olesya
Type: ожидается проверкаожидаются исправления

Подсказки:

  1. Если полностью закомментировать вызов mergesort в main.c (это одно из первого, что я попробовал), у вас всё ещё падает под Valgrind. Лучше не использовать переменные вне стандартных конструкций for (int i = 0; i < n; i++) и не объявлять счётчики циклов вне циклов. Можно огрести, потому что случайно не поняли, что на самом деле лежит в переменной на очередной итерации или в конце.
  2. Не работает на пустых массивах. Лучше выводить элементы в цикле, а пробел поместить под if и не выводить на первой/последней итерации.
  3. В самой сортировке умею исправлять проблему трёмя нажатиями на клавиатуру. Разберите какой-нибудь простой конкретный случай отладочным выводом/пошаговой отладкой.

comment:8 Changed 5 years ago by subbotina.olesya

Owner: changed from subbotina.olesya to Egor Suvorov
Type: ожидаются исправленияожидается проверка

comment:9 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to subbotina.olesya
Type: ожидается проверкаожидаются исправления

Корректность 6.5/7:

  1. Выводятся лишние пробелы в конце строки.

Стиль 1.5/3:

  1. my_memcpy не очень по смыслу подходит в mergesort.h. Лучше выделить в отдельный файл my_memcpy.{h,c}.
  2. Параметр data у my_memcpy не намекает, что это какой-то размер/количество.
  3. Не очень имена в my_memcpy: я бы там скорее сделал cur_dest/cur_src и orig_dest/orig_src. Или просто цикл с i и dest[i] = src[i].
  4. В mergesort: лучше elements <= 1.
  5. elem_div --> elem_half или left_elements.
  6. Скобочки вокруг вызова strcmp не нужны.
  7. Скобочки вокруг value не нужны.
  8. printint --> print_int, аналогично с остальными.
  9. Не то чтобы value — хорошее имя для массива (это имя для произвольного значения, у которого мы не знаем смысл на этапе компиляции).
  10. print_int и друзья: лучше делать не два printf в ветках if (отличающиеся пробелом), а делать printf со значением всегда, а потом иногда дописывать пробел.
  11. Вместо if (X) { весь-код } лучше писать if (!X) return; весь-код (называется early return). Это в main
  12. А ещё лучше в main не молча заглушать ошибку при неверных параметрах, а громко кричать "НЕВЕРНЫЕ ПАРАМЕТРЫ!". Поставьте assert.

comment:10 Changed 5 years ago by Egor Suvorov

Забыл замечание по стилю:

  1. Пожалуйста, не используйте арифметику с void*. Это расширение GCC. Кастуйте к char* (можно проверить, добавив опцию -pedantic).

comment:11 Changed 5 years ago by subbotina.olesya

Owner: changed from subbotina.olesya to Egor Suvorov
Type: ожидаются исправленияожидается проверка

comment:12 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to subbotina.olesya
Type: ожидается проверкаожидаются исправления

subbotina mergesort:

Корректность 6/7:

  1. Всё ещё выводятся лишние пробелы на экран.
  2. Не работает с пустыми массивами (завершается с ненулевым кодом возврата).

Стиль 2.5/3:

  1. my_memcpy: quantity --> обычно в программировании принято count или size
  2. print_int --> process_int или sort_print_int. А ещё лучше просто вызвать mergesort в main.
  3. Не заглушайте ошибку в main(), когда передалось мало аргументов. Лучше поставьте assert.
  4. Лучше assert в main поставить не в начале, а в ветке else после цепочки else-if: тогда не надо будет дублировать все имена типов.

comment:13 Changed 5 years ago by Egor Suvorov

Resolution: задача сдана
Status: assignedclosed

Вроде так и осталось.

Захотите дорешать — переоткрывайте тикет.

Note: See TracTickets for help on using tickets.