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
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 5 years ago by
Owner: | changed from subbotina.olesya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:3 Changed 5 years ago by
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Получилось, 1/10 баллов за корректность и попытка по задаче.
По стилю:
- Лучше не ставить пробелы перед
#
в#include
.
comment:4 Changed 5 years ago by
Owner: | changed from subbotina.olesya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 1.0 → 2.0 |
comment:5 Changed 5 years ago by
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
В целом идеи верные, но сортировка пока что не работает совсем (там в Merge
есть несколько опечаток).
- Выводятся лишние пробелы в конце строк.
- В задании просят реализовать копирование памяти руками.
memcpy
— это хорошо (аmemmove
— ещё лучше), но конкретно тут напишите, пожалуйста, свою функцию вродеmy_memcpy
(кажется, вам даже не требуется, чтобы она работала с пересекающимися диапазонами памяти). - Арифметика указателей с
void*
— это расширение GCC (о чём он предупредит, если добавить опцию-pedantic
), лучше добавьте явное преобразование вchar*
перед арифметикой. len_left
/left_idx
— выберите какую-то одну конвенцию. Мне больше нравитсяleft_len
.- Вместо
len_left < left_idx
пишитеleft_idx > len_left
(чтобы длина была справа). - В
Charcmpr
совершенно непонятно откуда берётся- '0'
char *val_3[255 * ...]
— это что-то очень странное. Вы тут точно не выделили- Придерживайтесь одного стиля и именовании функций и переменных. В Си обычно принят snake_case:
MergeSort
-->mergesort
,Comparator
-->comparator
. - Функция
Comparator
зачем-то объявлена вmergesort.h
, но нигде не определена. Да и не может быть определена. Merge
используется только вmergesort.c
, объявлять его вmergesort.h
не нужно.- В
Merge
параметрArray
лучше назватьout
/result
. - Любой указатель автоматически преобразуется в
void*
, писать(void*)
необязательно. - не нужен
return
в конце функции, возвращающейvoid
. mergesort
не работает на пустых массивах.- Компараторы лучше сильно упростить: вынесите значения в отдельные переменные
val_1
/val_2/val_3
— непонятно, зачем разные имена. Это всё массивы значений. Пусть и называются одинаково. Или хотя бы названия отличаются тем же, чем и массивы: одно говорит проint
, другое проchar
, третье проchar*
.a * b / 2
— это не то же самое, чтоa * (b / 2)
. Заведите дополнительную переменную.
comment:6 Changed 5 years ago by
Owner: | changed from subbotina.olesya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
comment:7 Changed 5 years ago by
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Подсказки:
- Если полностью закомментировать вызов
mergesort
вmain.c
(это одно из первого, что я попробовал), у вас всё ещё падает под Valgrind. Лучше не использовать переменные вне стандартных конструкцийfor (int i = 0; i < n; i++)
и не объявлять счётчики циклов вне циклов. Можно огрести, потому что случайно не поняли, что на самом деле лежит в переменной на очередной итерации или в конце. - Не работает на пустых массивах. Лучше выводить элементы в цикле, а пробел поместить под
if
и не выводить на первой/последней итерации. - В самой сортировке умею исправлять проблему трёмя нажатиями на клавиатуру. Разберите какой-нибудь простой конкретный случай отладочным выводом/пошаговой отладкой.
comment:8 Changed 5 years ago by
Owner: | changed from subbotina.olesya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:9 Changed 5 years ago by
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Корректность 6.5/7:
- Выводятся лишние пробелы в конце строки.
Стиль 1.5/3:
my_memcpy
не очень по смыслу подходит вmergesort.h
. Лучше выделить в отдельный файлmy_memcpy.{h,c}
.- Параметр
data
уmy_memcpy
не намекает, что это какой-то размер/количество. - Не очень имена в
my_memcpy
: я бы там скорее сделалcur_dest
/cur_src
иorig_dest
/orig_src
. Или просто цикл сi
иdest[i] = src[i]
. - В
mergesort
: лучшеelements <= 1
. elem_div
-->elem_half
илиleft_elements
.- Скобочки вокруг вызова
strcmp
не нужны. - Скобочки вокруг
value
не нужны. printint
-->print_int
, аналогично с остальными.- Не то чтобы
value
— хорошее имя для массива (это имя для произвольного значения, у которого мы не знаем смысл на этапе компиляции). print_int
и друзья: лучше делать не дваprintf
в веткахif
(отличающиеся пробелом), а делатьprintf
со значением всегда, а потом иногда дописывать пробел.- Вместо
if (X) { весь-код }
лучше писатьif (!X) return; весь-код
(называется early return). Это вmain
- А ещё лучше в
main
не молча заглушать ошибку при неверных параметрах, а громко кричать "НЕВЕРНЫЕ ПАРАМЕТРЫ!". Поставьтеassert
.
comment:10 Changed 5 years ago by
Забыл замечание по стилю:
- Пожалуйста, не используйте арифметику с
void*
. Это расширение GCC. Кастуйте кchar*
(можно проверить, добавив опцию-pedantic
).
comment:11 Changed 5 years ago by
Owner: | changed from subbotina.olesya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:12 Changed 5 years ago by
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
subbotina mergesort:
Корректность 6/7:
- Всё ещё выводятся лишние пробелы на экран.
- Не работает с пустыми массивами (завершается с ненулевым кодом возврата).
Стиль 2.5/3:
my_memcpy
:quantity
--> обычно в программировании принятоcount
илиsize
print_int
-->process_int
илиsort_print_int
. А ещё лучше просто вызватьmergesort
вmain
.- Не заглушайте ошибку в
main()
, когда передалось мало аргументов. Лучше поставьтеassert
. - Лучше
assert
вmain
поставить не в начале, а в веткеelse
после цепочкиelse-if
: тогда не надо будет дублировать все имена типов.
comment:13 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Вроде так и осталось.
Захотите дорешать — переоткрывайте тикет.
Note: See
TracTickets for help on using
tickets.
И вам хорошего дня ^_^
По корректности (увы, надо поправить один символ):
#pragma once
, не#pragma_once
По стилю:
strcmp
из стандартной библиотеки вместо ручногоwhile
.charcmp
могут передавать произвольные символы, необязательно цифры.mergesort.c
, а вmain.c
.-Iinclude
как раз включать вCFLAGS
принято.