Opened 5 years ago
Closed 5 years ago
#262 closed ожидаются исправления (задача сдана)
WW #4
Reported by: | chaykova.anastasiya | Owned by: | chaykova.anastasiya |
---|---|---|---|
Component: | WW_mergesort | Version: | 1.0 |
Keywords: | Cc: |
Description
Change History (15)
comment:1 Changed 5 years ago by
Summary: | #WW 4 → WW #4 |
---|
comment:2 Changed 5 years ago by
Owner: | changed from Egor Suvorov to chaykova.anastasiya |
---|
comment:3 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:4 Changed 5 years ago by
Owner: | changed from chaykova.anastasiya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:5 Changed 5 years ago by
Owner: | changed from Egor Suvorov to chaykova.anastasiya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Очень хорошо! foreach
с пары — это модно :)
Корректность 6.5/7:
- В
mergesort.h
оставьте только те заголовки, которые нужны конкретно заголовку. Там требуется толькоsize_t
, который лежит в<stddef.h>
. - В задании просят реализовать копирование памяти руками.
memcpy
— это хорошо (аmemmove
— ещё лучше), но конкретно тут напишите, пожалуйста, свою функцию вродеmy_memcpy
(кажется, вам даже не требуется, чтобы она работала с пересекающимися диапазонами памяти).
По стилю 2/3:
- Ключ
-c
традиционно вCFLAGS
не включают, а пишут в каждой строчке компиляции отдельно. Это нужно, чтобы можно было просто переиспользовать флаги, если мы хотим и скомпилировать, и слинковать. - В
mergesort.h
следует объявить толькоmy_mergesort
,merge
используется лишь внутриmergesort.c
и ему незачем торчать наружу. - Ставьте пробелы перед открывающей фигурной скобкой:
while (1) {
, а неwhile (1)
. - В
merge
можно сделать там один цикл (мне кажется, так будет нагляднее): сделайте внешний цикл поk
, а внутри напишите внутриif
дизъюнкцию двух условий: либо правая половина кончилась, либо левый элемент меньше. - В
mergesort
незачем писать циклы для копирования массива элементов. У вас уже есть/должна появиться функция для копирования подряд идущих байтов. - Объявляйте переменные в самом вложенном месте, где они в первый раз нужны.
Например,
i
вmergesort
нужна только в циклах, а вторую - Предпочитайте
int x = 10
конструкцииint x; x = 10
. Например,middle
вmergesort
.
comment:6 Changed 5 years ago by
Owner: | changed from chaykova.anastasiya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:7 Changed 5 years ago by
Owner: | changed from Egor Suvorov to chaykova.anastasiya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Корректность 6.5/7:
- В
mergesort.h
оставьте только те функции, которые экспортируются изmergesort.c
наружу, т.е. толькоmy_mergesort
. Остальные две (my_memcpy
,merge
) за пределамиmergersort.c
не используются ("детали реализации") => вmergesort.h
не должны возникать. - В
mergesort.h
достаточно только<stddef.h>
, в котором лежитsize_t
.<stdlib.h>
нужен дляmalloc
только в реализации, т.е. только вmergesort.c
, но не во всех файлах, которые хотят вызыватьmy_mergesort()
. - Выводятся лишние пробелы на экран (тут
foreach
, видимо, не особо поможет, лучше честный цикл каждый раз написать, кода больше не станет; ну или заменитьforeach
наprint_elements
и пусть сам пробелы расставляет).
Стиль 1.5/3:
my_mergesort
: пробел междуif
иreturn
(запуститеclang-format
, он вам всё это пофиксит).- Мне кажется, было лучше, когда была отдельная функция
merge
: тогда в ней было меньше переменных и нельзя было случайно заиспользоватьarray
вместоleft
/right
. - Инициализируйте переменные сразу:
size_t middle = elements / 2
- Объявляйте переменные в самом вложенном месте: например,
i
. - Лучше не цикл
while
, а циклfor
поk
, вы заранее знаете количество итераций. - Лучше не
j
/k
, а какие-то имена, связанные с именами массивов. - Лучше не
if (x != NULL)
, а простоif (x)
. - Можно упростить алгооритм
merge
: у вас там первое и третье условие совпадают, можно их объединить. - Много пустых строк в конце
mergesort.c
, файл должен завершаться ровно одним переводом строки. printf("%s", "foo");
лучше заменить наprintf("foo");
Стало меньше баллов в основном из-за огромной тучи переменных, условий и строк в my_mergesort
. Просто выделить merge
— уже станет сильно лучше (например, формулы вроде elements - middle
заменятся на right_len
, что лучше выражает намерение программиста).
comment:8 Changed 5 years ago by
Owner: | changed from chaykova.anastasiya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:9 Changed 5 years ago by
Owner: | changed from Egor Suvorov to chaykova.anastasiya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Корректность 6.5/7:
- Выводите перевод строки в конце строк (всех).
my_mergesort
иногда не возвращает-1
, когда должен.
Стиль 2/3:
#include<stdio.h>
— не хватает пробела. Странные переносы строк в сигнатуреmerge
. Натравите автоформаттер и забудьте про эти проблемы.- Объявлять
my_memcpy
в началеmergesort.c
не надо, он потом сразу определяется. foreach
уже неforeach
, а печатает все элементы через пробел. На это даже имя параметра намекает. Надо переименовать.- Арифметика с
void*
— нестандартное расширение компилятора GCC (предупреждает об этом, если включить флаг-pedantic
), лучше сначала кастовать вchar*
, а потом делать арифметику. my_mergesort
можно сильно упростить:- Выделяйте не два дополнительных массива, а один.
- Копируейте элементы не в цикле, а одним вызовом
my_memcpy
. - Уберите неиспользуемую переменную
i
.
merge
можно сильно упростить:- Объявляйте переменную
array_index
в самом цикле, а не заранее. - Объедините условия для 1/4 или 2/3 веток
if
, останется одинif
вместо трёх с двумя принициально разными ветками. - Объявите внутри цикла вспомогательные переменные и запишите в них адрес левого/правого элемента, чтобы не было тонны арифметики.
- Объявляйте переменную
comment:10 Changed 5 years ago by
Owner: | changed from chaykova.anastasiya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:11 Changed 5 years ago by
Owner: | changed from Egor Suvorov to chaykova.anastasiya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
По корректности 7/7 (без бонуса):
- Из-за бонуса иногда возникают утечки памяти.
По стилю 2.5/3:
- Не хватает пробелов в
mergesort.c
в одном месте между скобочкой и командой. Натравите автоформатирование. - Добавьте в конце
main
веткуelse
иassert(!"Unknown type to sort");
в ней, чтобы при передаче неверного аргумента ошибка не заглушалась, а возникала громко. printf("%s", "foo");
лучше заменить наprintf("foo");
- В
memcpy
промежуточные переменные не нужны. - Можно склеить случи в
merge
попарно. Тогда сокртится количество кода.
comment:12 Changed 5 years ago by
Забыл замечание по стилю:
- Пожалуйста, не используйте арифметику с
void*
. Это расширение GCC. Кастуйте кchar*
(можно проверить, добавив опцию-pedantic
).
comment:13 Changed 5 years ago by
Owner: | changed from chaykova.anastasiya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:14 Changed 5 years ago by
Owner: | changed from Egor Suvorov to chaykova.anastasiya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Корректность и бонус почти полностью, по ним пока 7.5:
- Не следует делать
printf("%s\n", "foo\n");
По стилю осталось (сейчас 2.5/3):
- Склеить случаи в
merge
.
comment:15 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Кажется, так и осталось.
Захотите дорешать — переоткрывайте тикет.
Корректность 1/10 есть.
По стилю:
printf("%s\n", "Hello World");
%s
:printf("Hello World\n");
mergesort.c
незачем включать<stddef.h>
дляsize_t
у параметровmergesort
: объявление уже гарантированно есть вmergesort.h
=> там должен быть включён<stddef.h>