Требования по оформлению кода
-
Размер отступа - 4 пробела или 1 Tab.
Не допускается смешивание пробелов и табуляции. Если вы используете для отступов табуляцию, используйте только её. То же касается пробелов.Количество символов в одной строке кода не должно превышать 80 символов.
-
Не чередуйте директивы
#includeи#define.Директивы
#includeи#defineдолжны идти отдельными блоками.Разделяйте эти блоки одной пустой строкой.
Также хорошим тоном считается указывать подключаемые библиотеки в лексикографическом порядке (но это по желанию).
Правильно:
#include <stdio.h>
#include <stdlib.h>
#define N 100
#define EPS 1e-3Неправильно:
#define N 100
#include <stdio.h>
#define EPS 1e-3
#include <stdlib.h>Неправильно:
#define N 100
#define EPS 1e-3
#include <stdio.h>
#include <stdlib.h>- Перед
int main() {необходимо делать отступ: от 1 до 3 пустых строк.
Правильно:
#include <stdio.h>
#include <stdlib.h>
#define N 100
#define EPS 1e-3
int main() {
...Неправильно:
#include <stdio.h>
#include <stdlib.h>
#define N 100
#define EPS 1e-3
int main() {
...- Константы
define-константы всегда записываются в верхнем регистре.
Также рекомендуется не смешивать define- и const- объявления констант: объявите все либо через define, либо через const.
Правильно:
#define N 10
#define EPS 1e-3
#define BUF_SIZE 80Неправильно:
#define n 10
#define eps 1e-3
#define buf_size 80Неправильно:
#define N 10
const double eps = 1e-3Очень большие или очень маленькие числа объявляйте через e или E (здесь также придерживайтесь одного регистра).
Правильно:
#define EPS 1E-5 # это 0.00001
#define N 1E9 # это 1 000 000 000Неправильно:
#define EPS 0.00001
#define N 1000000000- Делайте отступ в 1 пустую строку перед
return 0;во всех функциях.
Это улучшает читабельность кода.
Правильно:
int main() {
...
int max = (a > b) ? a : b;
return max;
}Неправильно:
int main() {
...
int max = (a > b) ? a : b;
return max;
}- Делайте отступ до и после цикла (
for,while,do-while), а также до и после блокаif.
Когда сложные конструкции не разделены и идут друг за другом без каких-либо промежутков, это затрудняет читабельность кода.
Правильно:
int main() {
int x_max = x[0];
for (int i = 1; i < n; i++) {
if (x > x_max) {
x_max = x;
}
}
return max;
}Неправильно:
int main() {
int x_max = x[0];
for (int i = 1; i < n; i++) {
if (x > x_max) {
x_max = x;
}
}
return max;
}- При возможности объединяйте объявление переменных в отдельные логические блоки.
Желательно:
int n;
int x_a, x_b, x_c;
int y_a, y_b, y_c;
int square;Менее желательно:
int n;
int x_a, x_b, x_c;
int y_a, y_b, y_c;
int square;Совсем не желательно:
# всё смешалось - кони, люди
int n, int x, int price, max_len, i, j, count;
double weight, result, dt, mass, time;- Разделяйте логически связанные блоки кода отступами.
Правильно:
for (i = 1; i < N; i++) {
scanf("%d", &x[i]); // первый блок
if (x[i] > x_max) { // второй блок
x_max = x[i];
} else if (x[i] < x_min) {
x_min = x[i];
}
x_sum += x[i]; // третий блок
}Правильно (и приветствуется):
for (i = 1; i < N; i++) {
# объявили 'x' и сразу считали
int x;
scanf("%d", &x);
sum += x;
...Неправильно:
# тело цикла записано одним большим куском
for (i = 1; i < N; i++) {
scanf("%d", &x[i]);
if (x[i] > x_max) {
x_max = x[i];
} else if (x[i] < x_min) {
x_min = x[i];
}
x_sum += x[i];
}Еще хуже:
for (i = 1; i < N; i++) {
scanf("%d", &x[i]);
if (x[i] > x_max) x_max = x[i];
else if (x[i] < x_min) x_min = x[i];
x_sum += x[i];
}- Не используйте лишние скобки.
Скобки допустимы в следующих случаях:
a) они действительно необходимы (читай: обязательны)
б) выражение является настолько сложным, что вероятность пренебречь скобками и ошибиться весьма высока
в) скобки способствуют читабельности кода
# неправильно
printf("%d", (x_max-x_min));
# правильно
printf("%d", x_max-x_min);# неправильно
if ((a > 0) && (!(b))) {
...
}
# правильно (ненужность скобок очевидна)
if (a > 0 && !b) {
...
}# для уверенности можно поставить скобки
if ((((a11 >> i) & 1) & x1) ^ (((a12 >> j) & 1) & x2)) {
...
}# скобки не нужны
int max = a ? b : c;# можно без скобок, но скобки повышают читабельность
int d = (a > b) ? (a << 1) : (b << c);- Арифметические, логические и пр. операторы слева и справа сопровождаются одним пробелом.
Правильно:
n_ones += x & 1;
square = M_PI * r * r / 2;
int max = (a > b) ? a : b;Неправильно:
n_ones+=x&1;
square=M_PI*r*r/2;
int max=(a>b)?a:b;- Операторы
if-else,for,while,do-whileзаписываются следующим образом:
if (...) { # рекомендуемый стиль
...
}if (...) # также допустимо
{
...
}if (...) { # рекомендуемый стиль
...
} else if (...) {
...
} else {
...
}for (...) { # рекомендуемый стиль
...
}for (...) # также допустимо
{
...
}while (...) { # рекомендуемый стиль
...
}while (...) # также допустимо
{
...
}do { # рекомендуемый стиль
...
} while (...);do # также допустимо
{
...
} while (...);Не допускается опускать фигурные скобки, если тело операторов if, for, while, do-while содержит единственный оператор.
# недопустимо
if (x > x_max) x_max = x;# недопустимо
for (int i = 0; i < n - 1; i++)
for (int j = i + 1; j < n; j++)
do_smth(&x[i], &x[j]);# недопустимо
while ((c = getchar()) != EOF)
cnt++;- Оператор
switchзаписывается следующим образом:
switch (expression) {
case label_1:
...
break;
case label_2:
...
default:
...
break;
}Наличие блока default обязательно, т.к. у погромиста всегда есть алгоритм действий на случай, если что-то пойдет не так.
- Повторные вычисления запрещены. В особенности, ресурсозатратные (умножения, степени и т.д.).
Исключение составляют простейшие случаи.
К примеру, вычисление площади поверхности и объема шара.
Правильно именно так:
double square = 4 * M_PI * r * r;
double v = 4 * M_PI * r * r * r / 3;- В коде не должен присутствовать “хардкод” – числовые константы и прочие “магические числа”, которые
- взялись ниоткуда (подчас даже автор уже не помнит)
- значения которых никому ни о чем не говорят
- придется перезабивать по всему тексту программы при их изменении
Такие числа уносятся в константы.
Исключение – числа в 16-ричной системе счисления: x = y & FF0000;
Неправильно:
unsigned long x_min = 4294967295; # это max типа unsigned long
if (x < x_min) {
x_min = x;
}short d = 1440; # поди догадайся, что это за число double square = 4 * 3.14 * r * r;
double v = 4 * 3.14 * r * r * r / 3;
# и еще в 23-х местах используется Пи
# в итоге, при замене 3.14 на M_PI эту замену придется выполнить в коде 25 раз
# (да, я знаю, что есть Find-And-Replace, но аргумент так себе)Правильно:
#define MINUTES_PER_DAY 60 * 24
int main() {
...
double square = 4 * M_PI * r * r;
double v = 4 * M_PI * r * r * r / 3;
...
}Оказывается, 1440 это кол-во минут в сутках(!)
- Имена переменных.
Имена глобальных переменных и функций должны быть осмысленными и отражать назначение.
Слишком длинные имена не рекомендуются.
В именах допускаются сокращения, которые не затрудняют понимание имени и назначения функций и переменных.
В именах должны использоваться только английские слова. Транслитерации русских слов нежелательны (kol, kolichestvo, stroka, massiv).
Имена переменных и функций записываются полностью строчными буквами.
Если имя состоит из нескольких слов, для их разделения используются символы подчеркивания – snake case: x_1, y_10, bad_digit, is_positive и пр. (google it).
Примеры:
double square(...) {
...
}
void print_array(...) {
...
}
int gcd(...) { # НОД(а, b)
...
}# количество чего-нибудь
int amount; # не надо брать такие названия из google.translate.com
int count; # вот так
int cnt; # а лучше так (короче)# максимальный элемент массива
int x_max; # так
int max_x; # или так# ответ/результат
int result; # так
int res; # или такint n_ones; # количество единиц
int n_digits; # количество цифр
int n_pages; # количество страницБудет беспощадно банниться сразу:
int num_of_nums;
int number_of_numbers;-
В программе не должны присутствовать закомментированные строки кода, которые использовались для отладки.
-
В программе допускается оставлять комментарии, если какой-то фрагмент кода может оказаться трудным для восприятия ревьюера: объяснение, откуда берется итоговая формула, сложные поразрядные преобразования и т.д.
/*
многострочный комментарий
позволяет в деталях объяснить
сложный фрагмент кода
*/
if (very complicated formula) {либо так
# комментарий
if (very complicated formula) {либо так
if (very complicated formula) { # комментарий
но есть ограничение в 80 символов для строки.-
Переменные объявляются по мере необходимости.
-
Файлы должны закрываться (!)
-
Файлы открываются как можно позже. Закрываются как можно раньше (к примеру, считали данные из файла – закрыли).