Это старая версия Информатика/ПравилаНаписанияПрограмм за 10.02.2017 22:25 под редакцией DenisKirienko.

Просмотр кода страницы Требования к программам страница

Тестирующая система ejudge использует автоматические скрипты проверки стиля кода.
Для C++ используется утилита ((https://code.google.com/p/google-styleguide/ cpplint)) с ключами
%%
cpplint.py --filter=-legal,-readability/streams,-build/namespaces,-whitespace/braces,-whitespace/newline,-whitespace/line_length,-runtime/int,-runtime/threadsafe_fn,-readability/casting,-build/include_what_you_use,-runtime/arrays,-runtime/explicit,-build/include,-readability/fn_size,-runtime/printf,-whitespace/comments,-runtime/references,-readability/braces
%%

Для Python используется утилита ((https://github.com/jcrocholl/pep8 pep8.py)) с ключами
%%
pep8.py -r --show-source  --ignore=W391,E251,E501,W292,W291,W293
%%

Очень полное и подробное описание требований к коду на C++ содержится в ((https://tproger.ru/translations/stanford-cpp-style-guide/ руководстве по оформлению кода на С++ от Стэнфордского университета))

===Python===
Помимо сформулированных ниже правил, программы должны соответствовать документу ((http://www.python.org/dev/peps/pep-0008/ PEP8: Style Guide for Python Code)) из официальной документации языка Python. При сдаче задачи в ejudge проводится автоматическая проверка на соответствие программы PEP8.

====Символы и отступы===
Величина отступа - четыре пробела. Использование символа табуляции (символа, с кодом 9) запрещается.

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

Функции должны отделяться двумя пустыми строками. Отдельные смысловые блоки в программе должны отделяться пустыми строками.

====Структура программы====
Программа начинается с подключения библиотек (import). Потом идут определения классов. Потом идут определения функций. Потом идет основная программа.

Запрещается подключать библиотеки и объявлять функции посередине кода.

====Имена переменных===
Имена переменных,  функций, типов должны быть осмысленными и отражать назначение. Слишком длинные имена, однако, не рекомендуются. В именах допускаются сокращения, которые не затрудняют понимание имени и назначения функций и переменных.

Допускается использование односложных имен переменных для счетчиков (i, j, k), а также если это имя фигурирует в условии задачи (N, M, K, L), но не имеет какого либо смыслового значения (например, если в задаче написано "Проверьте число N на простоту", то обозначать переменной буквой n допускается. Если в задаче сказано "Дано число N - количество учащихся в классе", то не допускается).

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

Если имя переменной или функции состоит из нескольких слов, то они должны разделяться символом подчеркивания. Например:
count_max - допустимо
count_of_elements_equal_to_maximal - недопустимо (слишком длинное)
kolichestvo_maksimalnih  - недопустимо (используется транслитерация)
cm - недопустимо (непонятная аббревиатура)

Имена констант записываются полностью заглавными буквами, например, EPS, MAX_SIZE.

Названия классов должны записываться с заглавной буквы.

====Арифметические операции====
В одной строчке записывается одна арифметическая операция. Например:

%%(java)
a = b
b = c
%%

Бинарные операции разделяются пробелом. После запятой ставится пробел. Между именем функции и скобками пробел не ставится, с внутренней стороны скобок пробелы не ставятся

%%(java)
a = b + 2 * c
a = (b + 2) * c
print(a, b, sep = "")
%%

====Использование констант===

Не допускается использование чисел в программе, значение которых неочевидно. Например, запись while i < 179 или c = c + 32 недопустима.

===C++===

====Символы и отступы===
Величина отступа - четыре пробела. Использование символа табуляции (символа, с кодом 9) запрещается.

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

Функции должны отделяться пустыми строками. Отдельные смысловые блоки в программе должны отделяться пустыми строками.

====Имена переменных===
Имена переменных,  функций, типов должны быть осмысленными и отражать назначение. Слишком длинные имена, однако, не рекомендуются. В именах допускаются сокращения, которые не затрудняют понимание имени и назначения функций и переменных.

Допускается использование односложных имен переменных для счетчиков (i, j, k), а также если это имя фигурирует в условии задачи (N, M, K, L).

В именах должны использоваться только английские слова. Транслитерации русских слов не допускаются.

Если имя переменной или функции состоит из нескольких слов, то они должны разделяться символом подчеркивания или заглавными буквами. Например:
~CalcSqrt - допустимо
calc_sqrt - допустимо
calculate_square_root - допустимо, но нежелательно (слишком длинное имя)
vychislenie_kornya  - недопустимо (используются русские имена)
f - недопустимо (непонятно назначение функции)

Имена констант записываются полностью заглавными буквами. Если имя константы состоит из нескольких слов, для их разделения используются подчеркивания. Например, EPSILON, MAX_SIZE.

Имена массивов и названия типов структур должны записываться с заглавной буквы.

====Арифметические операции====
В одной строчке записывается одна арифметическая операция. Например:

%%(java)
a = b;
b = c;
%% 

Бинарные операции разделяются пробелом. После запятой и после точки с запятой в цикле for ставится пробел. Между именем функции и скобками пробел не ставится, с внутренней стороны скобок пробелы не ставятся

%%(java)
a = b + 2 * c;
a = (b + 2) * c;
x = power(a, n);
%%

====Стиль отступов===

=====if====

Оператор if без else записывается так:
%%(java)
if (test)
{
    statements...
}
%%

Оператор if c else записывается так:
%%(java)
if (test)
{
    statements...
}
else
{
    statements...
}
%%

Последовательность if ... else if ... else if ... else записывается так:
%%(java)
if (test1)
{
    statements...
}
else if (test2)
{
    statements...
}
else
{
    statements...
}
%%

=====while====
%%(java)
while (test)
{
    statements...
}
%%

=====do while====
%%(java)
do
{
    statements...
}
while (test);
%%

=====for====
%%(java)
for (int i = 0; i < n; ++i)
{
    statements...
}
%%

=====Описание структуры====
%%(java)
struct Person
{
    string Name;
    int Age;
};
%%

=====Реализация функции====
%%(java)
double power(double a, int n)
{
    statements...
}
%%

Блоки инструкций ветвления и цикла всегда заключаются в фигурные скобочки, даже если они состоят из одной инструкции.

====Использование констант===

Не допускается использование чисел в программе, значение которых неочевидно. Например, запись while (i < 179) недопустима.

====Ввод-вывод===
Все сообщения об ошибках, предупреждения, отладочные сообщения и прочая диагностическая информация, не являющаяся результатом работы программы в предположении корректных входных данных, должна выводиться на стандартный поток ошибок stderr, то есть примерно так:

%%(java)cerr << "Неверные входные данные" << endl;%%

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