Общие требования и замечания к выполнению заданий

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

1. Программа должна быть хорошо структурирована, т.е. содержательные действия должны быть разнесены по разным функциям. В частности, обработка данных (вычислительные действия) и общение с пользователем (ввод, вывод, сообщения об ошибках) не должны объединяться в рамках одной функции. Одни функции занимаются организацией ввода и вывода и другие функции выполняют обработку данных.

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

3. Как правило, в реализации алгоритма не должно быть явных констант, не имеющих абсолютного характера. Это означает, что можно определять константы типа ``корень из двух'' ``е'' ``пи'' и т.п., но нельзя задавать произвольными константами ``минимально возможное значение'', ``результат, который вряд ли будет получен'' и т.п. Следует переделать алгоритм так, чтобы его работа не опиралась на подобные значения. При необходимости можно использовать константы, определенные в рамках используемой системы программирования для обозначения разных диапазонов (например, RAND_MAX, и т.п.), но только их, не подменяя их значений какими-либо другими.

4. Работы программы должна следовать общему принципу - программа может отказаться выполнять работу для некорректного набора данных, но не должна ``падать'' и, тем более, выдавать на таких данных неверный ответ. В частности, программы, работающие с файлами данных, должны проверять успешность открытия файла и успешность чтения необходимых данных. Все случаи обнаружения некорректных данных (файл не открылся, он пустой, в файле недостаточно данных, данные неверные по смыслу и т.п.) должны обрабатываться с выдачей соответствующих диагностических сообщений. Правильный подход - формировать отдельный код успешности выполнения процедуры (с значениями, символизирующими успешные и ошибочные ситуации), который передавать в вызывающую функцию для анализа и принятия решений.

6. Программа должна освобождать захваченные ресурсы при завершении своей работы, т.е. закрывать открытые файлы, освобождать захваченную память и т.д.

7. Типы переменных и вычисленных значений должны соответствать смыслу задачи. В частности, количества должны представляться целыми типами данных. Для вещественных чисел сдедует использовать тип double так как в современных 64-разрядных системах работа с типом float порождает дополнительные накладные вычислительные расходы.

8. Следует избегать сравнения вещественных чисел на равенство или неравество. Подобные сравнения нужно всегда производить в указанием некоторой точности сравнения.

9. Программа сдается вместе с набором тестов, т.е. наборов исходных данных, для которых мы можем оценить правильность ответа. Тесты должны покрывать основные логические цепочки выполнения алгоритма. В идеальном случае функция main должна последовательно запускать тесты для вашего решения задачи и по каждому тесту выдавать диагностику его успешности. При отсутствии тестов или при явно недостаточном тестировании задача не принимается.