Программы, написанные на процедурных языках, наиболее распространенном типе, похожи на рецепты: в них есть списки ингредиентов и пошаговые инструкции по их использованию. Практически в каждом процедурном языке есть три основные управляющие структуры:
Последовательность — это структура управления по умолчанию; инструкции выполняются одна за другой. Например, чтобы найти корни квадратного уравнения ax2 + bx + c = 0, можно выполнить серию арифметических операций, присваивая результаты переменным. Условная структура управления IF-THEN или IF-THEN-ELSE позволяет программе следовать альтернативным путям выполнения. Итерация, или зацикливание, дает компьютерам большую часть их возможностей. Они могут повторять последовательность шагов так часто, как это необходимо, и соответствующие повторения довольно простых шагов могут решить сложные проблемы.
Эти управляющие структуры можно комбинировать. Последовательность может содержать несколько циклов; цикл может содержать цикл, вложенный в него, или две ветви условного сигнала могут содержать последовательности с циклами и еще больше условных сигналов. В «псевдокоде», используемом в этой статье, «*» обозначает умножение, а «←» используется для присвоения значений переменным. В следующем фрагменте программирования используется структура IF-THEN для нахождения одного корня квадратного уравнения по квадратичной формуле:
.
В квадратичной формуле предполагается, что a ненулевое и что дискриминант (часть в знаке квадратного корня) не отрицательный (чтобы получить корень из действительного числа). Условные обозначения проверяют эти предположения:
Функция SQUARE_ROOT, использованная в приведенном выше фрагменте, является примером подпрограммы (также называемой процедурой, подпрограммой или функцией). Подпрограмма — это как рецепт соуса, который дается один раз и используется как часть многих других рецептов. Подпрограммы принимают входные данные (необходимое количество) и выдают результат (соус). Часто используемые подпрограммы обычно находятся в коллекции или библиотеке, поставляемой вместе с языком. Подпрограммы могут вызывать другие подпрограммы в своих определениях, как показано в следующей процедуре (где ABS — функция абсолютного значения). SQUARE_ROOT реализуется с помощью цикла WHILE (неопределенного), который дает хорошее приближение для квадратного корня из действительных чисел, если только x не очень мал или не очень велик. Подпрограмма пишется с объявлением ее имени, типа входных данных и выходных:
Подпрограммы позволяют разбить проблему на более мелкие и легко решаемые подпроблемы. Иногда проблему можно решить, сведя ее к подпроблеме, которая является уменьшенной версией исходной. В этом случае программа называется рекурсивной подпрограммой, поскольку она решает проблему путем многократного вызова самой себя. Например, функция факториала в математике (n! = n∙(n-1)⋯3∙2∙1- т. е. произведение первых n целых чисел), может быть запрограммирована как рекурсивная подпрограмма:
Преимущество рекурсии в том, что она часто представляет собой простое переформулирование точного определения, позволяющее избежать бухгалтерских тонкостей итеративного решения.
На уровне машинного языка циклы и условия реализуются с помощью инструкций ветвления, которые говорят о «переходе к» новой точке программы. Оператор «goto» в языках более высокого уровня выражает ту же операцию, но используется редко, поскольку затрудняет слежение за «течением» программы. Некоторые языки, такие как Java и Ada, не допускают его.