Требования по оформлению кода

  1. Размер отступа - 4 пробела или 1 Tab.
    Не допускается смешивание пробелов и табуляции. Если вы используете для отступов табуляцию, используйте только её. То же касается пробелов.

    Количество символов в одной строке кода не должно превышать 80 символов.

  2. Не чередуйте директивы #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>
  1. Перед 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() {
	...
  1. Константы

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. Делайте отступ в 1 пустую строку перед return 0; во всех функциях.
    Это улучшает читабельность кода.

Правильно:

int main() {
	...
	int max = (a > b) ? a : b;
 
	return max;
}

Неправильно:

int main() {
	...
	int max = (a > b) ? a : b;
	return max;
}
  1. Делайте отступ до и после цикла (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;
}
  1. При возможности объединяйте объявление переменных в отдельные логические блоки.

Желательно:

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;
  1. Разделяйте логически связанные блоки кода отступами.

Правильно:

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]; 
}
  1. Не используйте лишние скобки.

Скобки допустимы в следующих случаях:
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);
  1. Арифметические, логические и пр. операторы слева и справа сопровождаются одним пробелом.

Правильно:

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;
  1. Операторы 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++;
  1. Оператор switch записывается следующим образом:
switch (expression) { 
case label_1: 
	...
	break; 
case label_2:
	...
default: 
	... 
	break;
}

Наличие блока default обязательно, т.к. у погромиста всегда есть алгоритм действий на случай, если что-то пойдет не так.

  1. Повторные вычисления запрещены. В особенности, ресурсозатратные (умножения, степени и т.д.).

Исключение составляют простейшие случаи.
К примеру, вычисление площади поверхности и объема шара.

Правильно именно так:

double square = 4 * M_PI * r * r;
double v = 4 * M_PI * r * r * r / 3;
  1. В коде не должен присутствовать “хардкод” – числовые константы и прочие “магические числа”, которые
  • взялись ниоткуда (подчас даже автор уже не помнит)
  • значения которых никому ни о чем не говорят
  • придется перезабивать по всему тексту программы при их изменении

Такие числа уносятся в константы.

Исключение – числа в 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 это кол-во минут в сутках(!)

  1. Имена переменных.
    Имена глобальных переменных и функций должны быть осмысленными и отражать назначение.

Слишком длинные имена не рекомендуются.

В именах допускаются сокращения, которые не затрудняют понимание имени и назначения функций и переменных.

В именах должны использоваться только английские слова. Транслитерации русских слов нежелательны (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;
  1. В программе не должны присутствовать закомментированные строки кода, которые использовались для отладки.

  2. В программе допускается оставлять комментарии, если какой-то фрагмент кода может оказаться трудным для восприятия ревьюера: объяснение, откуда берется итоговая формула, сложные поразрядные преобразования и т.д.

/* 
	многострочный комментарий
	позволяет в деталях объяснить
	сложный фрагмент кода
*/
if (very complicated formula) {

либо так

# комментарий
if (very complicated formula) {

либо так

if (very complicated formula) {		# комментарий
но есть ограничение в 80 символов для строки.
  1. Переменные объявляются по мере необходимости.

  2. Файлы должны закрываться (!)

  3. Файлы открываются как можно позже. Закрываются как можно раньше (к примеру, считали данные из файла – закрыли).