Opened 5 years ago

Closed 5 years ago

Last modified 5 years ago

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

WW #3

Reported by: subbotina.olesya Owned by: Egor Suvorov
Component: WW_intrusive_list Version: 3.0
Keywords: Cc:

Description


Change History (10)

comment:1 Changed 5 years ago by Egor Suvorov

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

Идея и структурки норм, осталось додебажить на примере:

  1. Завершайте каждую строчку в выводе переводом строки.
  2. Не выводите пробел в конце списка точек.
  3. Падает после rm, потому что что-то не то происходит (sanitizer/valgrind должны помочь).

Подсказки:

  1. Упростите add_node. Случаи "список пустой" и "список непустой" отличаются только одной строчкой.
  2. В remove_node разбирайте не 2*2=4 случая с 2*2*=8 тонкостями, а сначала два случая про node->prev отдельно с одной тонкостью в каждом, а потом независимо от этого — два про node->head с одной тонкостью в каждом. Итого 2*1+2*1=4 тонкости, в два раза меньше думать. У вас сейчас в remove_node очень много случаев не разобрано, но и не надо — лучше по-другому организовать ифы.
  3. Повыводите промежуточные состояния списка. Можете сделать функцию check_list, которая пробегается по списку и проверяет, что все ссылки стоят правильно.
  4. remove_point может легко зациклиться.

Пока баллы не ставлю в надежде, что поправите реализацию.

comment:2 Changed 5 years ago by subbotina.olesya

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

comment:3 Changed 5 years ago by Egor Suvorov

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

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

  1. print выводит лишний пробел в конце строки.
  2. Если скормить на вход очень длинную команду, то переполнится буфер str, будет UB.

В остальном по корректности отлично.

Стиль — 2.5/4:

  1. Разные отступы в main.
  2. Объявляйте переменные в самом вложенном месте, где они в первый раз нужны. Например, x1 и y1 лучше объявить в каждой из двух веток if. А ещё лучше назвать их просто x и y.
  3. Аналогично, struct point *del лучше объявлять внутри каждого из циклов. А ещё лучше назвать его point или pt.
  4. out для итерации по списку — item/entry/point_node.
  5. str --> command.
  6. printf("%s", "foo"); лучше заменить на printf("foo");
  7. size_of_l --> size, потому что это и так поле списка, и так понятно, что это размер именно списка. А называться он может не l, а по-другому. l->size лучше, чем l->size_of_l. a->size точно лучше, чем a->size_of_l.
  8. Глобальная переменная len не используется.
  9. В add_node лучше сначала выставлять свойства node, а потом все остальные. Тогда код будет чуть красивее и симметричнее, имхо.
  10. remove_node весьма хорош, но можно ещё упростить. Подсказка: вам нужно несколько строк вне if и два if с ветками else: один с условием node->prev != NULL, один с условием node->next != NULL.

Последние два пункта (исправления в списке) стоят +1 балл по стилю.

comment:4 Changed 5 years ago by subbotina.olesya

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

comment:5 Changed 5 years ago by Egor Suvorov

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

Корректность почти:

  1. remove_all_points зачем-то лезет внутрь списка и руками его меняет. Запрещено заданием так делать из main.c. И тут не требуется.
  2. Не выводите пробел после Unknown command.

По стилю:

  1. <stddef.h> стоит включать в том же месте, где объявляется container_of. Чтобы можно было включить заголовок и сразу заработало.
  2. Лучше не if (x != NULL), а просто if (x).
  3. В show_all_points прекрасно подойдёт цикл for вместо while.
  4. Что-то не так с отступами в main
  5. Можно упростить код show_all_points, если под иф убрать вывод пробела, а не всё сразу.
  6. Цикл в while (wrong_comm) можно заменить на scanf("%*[^\n]"); — прочитай символы, не равные \n, и никуда их не записывай.
  7. Из add_node без потери корректности можно (и нужно!) выкинуть один из двух if'ов. Он там вообще ничего не делает.

comment:6 Changed 5 years ago by subbotina.olesya

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

comment:7 Changed 5 years ago by Egor Suvorov

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

По корректности:

  1. Не выводите пробел после длины.

По стилю:

  1. Включайте <stddef.h> внутри include guards. Они всегда обрамляют собой весь заголовок.
  2. Сейчас у вас буфер command размера 8, а scanf просите считать строчку длины не больше 6. Плюс один заключающий ноль — получается семь. Поставьте размер буфера впритык.

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

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

Успех, 12/12!

По стилю одно замечание стоит ещё поправить:

  1. #include <stddef.h> лучше делать до #define container_of, а его лучше отделять от остальных блоков в заголовке пустой строкой (сейчас он склеился с include guard и его трудно заметить).
Last edited 5 years ago by Egor Suvorov (previous) (diff)

comment:10 Changed 5 years ago by Egor Suvorov

Прошу прощения, забыл про то, что дедлайн уже был, было бы 12/12, но исправления были сделаны только утром в 10:38 :(

Так что остаётся версия 1042, а в ней баллы такие:

  • Корректность: 7.5/8 (+0.5 даётся за точное следование формату)
  • Стиль: 3.5/4.
Note: See TracTickets for help on using tickets.