Как написать хорошую программу
Итак, вы получили задание написать программу на некотором языке программирования (Basic, Pascal, C++, Fortran,…). Что делать?
 

1. Постановка задачи

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

2. Алгоритм

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

Рассмотрим пример. Вам дали задание написать программу для создания лексикографической последовательности комбинаций (сочетаний) из 5 первых натуральных чисел (1, 2, 3, 4, 5) по 3 элемента.
 
Результат должен быть следующим:

  123
  124
  125
  134
  135
  145
  234
  235
  245
  345

 

На первый взгляд, задача может показаться сложной, однако если присмотреться внимательно и понять, как строится каждая следующая комбинация из предыдущей, то вы с легкостью составите алгоритм:
 
Шаг 1. Первая комбинация составлена из 3 наименьших чисел, расставленных в порядке возрастания. Если для первой комбинации вы создаете вектор a из трех элементов, то для первой комбинации необходимо произвести операцию a_i=i для всех i
(в нашем случае i=1,2,3).

 
Шаг 2. Обратите внимание, что последующие комбинации созданы из первой заменой последней цифры до тех пор, пока последняя цифра становится равной максимальному числу из нашего набора (то есть 5): 123→124→125.
 
Шаг 3. Теперь предпоследнее число в комбинации увеличиваем на единицу, а последнее должно быть на единицу больше предпоследнего. 125→134.
 

Далее вы снова проделываете шаг 2 и снова шаг 3.
 

Подобные рассуждения могут помочь, даже если вам дали задание для большего числа элементов. Если вы не можете сразу осмыслить большую задачу, то можно ее упростить, и попытаться решить для простого случая, а потом частные рассуждения и результаты обобщить.
 

Так, например, если нужно создать комбинации из N чисел по K элементов, надо слегка усовершенствовать шаг 3. Сначала вы увеличиваете предпоследнее число на единицу, затем число, стоящее перед ним, и так до первого числа в комбинации.
 

3. “Читабельность”

Вы должны понимать, что код должен быть написан таким образом, что проверяющий или кто-либо другой без лишнего труда разобрался в логике программы. Возможно, Вам самим придется использовать старый код спустя некоторое время, и легко читаемая структура позволит Вам быстро освежить в памяти написанное ранее. В этом Вам помогут отступы, небольшие комментарии, удобные имена, имена со смыслом для переменных и функций (например, Comb для комбинации, Time для времени, Num от “number” для числа или номера в списке).
 

4. Простота

Нет смысла писать программу в 100 строк, если можно уложиться в 20 строк! Если вам необходимо повторять какое-либо действие много раз, используйте цикл. А если вам нужно повторять набор циклов и команд? Тогда лучше создавать функции, процедуры или классы, которые вы можете вызвать в любой части программы столько раз, сколько необходимо.
 

Так, например, для приведенного выше примера, мы можем создать процедуру, которую будем вызывать в цикле много раз. На языке С++, мы можем написать это в следующем виде:
 

int NewPermutation (int* Comb, int N, int K, int step)
{
    if (step == 0)
       for (int i = 0; i < K; i++)
          Comb[i] = i;
    if (step != 0)
       if (N - 1 > Comb[K - 1])
          Comb[K - 1] = Comb[K - 1] + 1;
       else
       {
          for (int i = K - 1; i > 0; i--)
             if ((N - K + i - 1) > Comb[i - 1])
             {
                Comb [i - 1] = Comb [i - 1] + 1;
                for (int j = i; j < K; j++)
                   Comb[j] = Comb[i - 1] + j - (i - 1);
                break;
             }
       }
    return 0;
}

 
Здесь функция использует предыдущую комбинацию Comb и создает следующую.
Если вы хотите создать весь список, то вам надо будет запустить цикл

for (int step = 0; step < NumComb; step++),

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

5. Не изобретайте велосипед

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

6. Проверка и работа над ошибками

Речь не о пропущенных знаках. На пропущенные скобки и точки с запятыми или двоеточиями компилятор будет ругаться, выдавая, чаще всего, сообщения с указанием строки, в которой произошло упущение. Так что подобное обычно легко устраняется. Хуже, если компилятор не ругается, а ваша программа все еще работает неправильно. Тогда надо искать идеологические ошибки.
 

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

7. Навороты и Оптимизация

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

Заказать задачу по программированию

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