Программирование линейных алгоритмов
Рецепт выполняют по шагам сверху вниз, ничего не пропуская и не переставляя. Линейная программа работает так же: ввести данные, вычислить, вывести ответ — и каждая команда выполняется ровно один раз.
Что такое линейный алгоритм
Линейный алгоритм — алгоритм, в котором команды выполняются последовательно, одна за другой, без ветвлений и повторений. Его основа — три действия: ввод, вычисление (присваивание), вывод.
Арифметика в трёх языках
Сложение, вычитание и умножение записываются одинаково: +, -, *. Порядок действий — как в математике: сначала умножение и деление, потом сложение и вычитание; скобки меняют порядок.
С делением сложнее. Нужно различать три операции:
| Операция | Си | Паскаль | Python | 17 и 5 |
|---|---|---|---|---|
| обычное деление | 17.0 / 5 | 17 / 5 | 17 / 5 | 3.4 |
| целая часть от деления | 17 / 5 | 17 div 5 | 17 // 5 | 3 |
| остаток от деления | 17 % 5 | 17 mod 5 | 17 % 5 | 2 |
Ловушка Си: знак / для двух целых чисел даёт целую часть. 17 / 5 в Си равно 3, а не 3.4. Чтобы получить дробный результат, хотя бы одно число должно быть вещественным: 17.0 / 5. В Паскале и Python / всегда даёт дробный результат.
Для отрицательных чисел целое деление в Си и Python работает по-разному. В этом уроке берём только положительные числа.
Функции
| Си | Паскаль | Python | |
|---|---|---|---|
| квадратный корень | sqrt(x), нужен #include <math.h> | sqrt(x) | math.sqrt(x), нужен import math |
| модуль числа | abs(x) для целых, fabs(x) для дробных | abs(x) | abs(x) |
| квадрат числа | x * x | sqr(x) или x * x | x ** 2 или x * x |
Пример 1. Секунды в часы, минуты и секунды
Пользователь вводит время в секундах, программа переводит его в часы, минуты и секунды. В часе 3600 секунд, в минуте — 60.
#include <stdio.h>
int main(void) {
int total, h, m, s;
printf("Сколько секунд? ");
scanf("%d", &total);
h = total / 3600; // целых часов
m = total % 3600 / 60; // минут в остатке
s = total % 60; // секунд в остатке
printf("%d ч %d мин %d с\n", h, m, s);
return 0;
}
program Time;
var
total, h, m, s: integer;
begin
write('Сколько секунд? ');
readln(total);
h := total div 3600; { целых часов }
m := total mod 3600 div 60; { минут в остатке }
s := total mod 60; { секунд в остатке }
writeln(h, ' ч ', m, ' мин ', s, ' с');
end.
total = int(input("Сколько секунд? "))
h = total // 3600 # целых часов
m = total % 3600 // 60 # минут в остатке
s = total % 60 # секунд в остатке
print(h, "ч", m, "мин", s, "с")
Проверим на 7384 секундах: 7384 // 3600 = 2 часа; остаток 7384 % 3600 = 184, из них 184 // 60 = 3 минуты; 7384 % 60 = 4 секунды. Ответ: 2 ч 3 мин 4 с.
Пример 2. Гипотенуза
По двум катетам находим гипотенузу по теореме Пифагора: c = √(a² + b²). Катеты могут быть дробными, поэтому переменные вещественные.
#include <stdio.h>
#include <math.h>
int main(void) {
double a, b, c;
printf("Катеты: ");
scanf("%lf %lf", &a, &b);
c = sqrt(a * a + b * b);
printf("Гипотенуза: %.2f\n", c);
return 0;
}
program Hypotenuse;
var
a, b, c: real;
begin
write('Катеты: ');
readln(a, b);
c := sqrt(a * a + b * b);
writeln('Гипотенуза: ', c:0:2);
end.
import math
a = float(input("Первый катет: "))
b = float(input("Второй катет: "))
c = math.sqrt(a * a + b * b)
print(f"Гипотенуза: {c:.2f}")
Для катетов 3 и 4 все три программы выведут Гипотенуза: 5.00.
Пример 3. Обмен значениями
Как поменять местами значения двух переменных? Сразу написать a = b нельзя — старое значение a пропадёт. Нужна третья, вспомогательная переменная, как третий стакан, чтобы поменять местами сок и воду.
t = a;
a = b;
b = t;
t := a;
a := b;
b := t;
t = a
a = b
b = t
# в Python можно и короче: a, b = b, a
🎯 Самое главное
- Линейный алгоритм — команды выполняются по порядку, каждая один раз.
- Целая часть от деления:
/для целых в Си,divв Паскале,//в Python. - Остаток:
%в Си и Python,modв Паскале. - В Си
17 / 5равно 3: для дробного результата нужно17.0 / 5. - Корень:
sqrt; в Си нуженmath.h, в Python —import math.
🤔 Проверь себя
1. Чему равны целая часть и остаток от деления 29 на 4?
Целая часть 7, остаток 1: 29 = 4 · 7 + 1.
2. Как получить последнюю цифру числа n?
Остаток от деления на 10: n % 10 в Си и Python, n mod 10 в Паскале.
3. В Си переменная double x = 7 / 2; — чему равно x?
3.0. Сначала делятся два целых числа — получается 3, и только потом результат записывается в дробную переменную. Чтобы получить 3.5, пишут 7.0 / 2.
4. Почему для обмена значений нужна третья переменная?
После a = b прежнее значение a теряется. Его заранее сохраняют во вспомогательной переменной.
Линейные программы всегда делают одно и то же. Дальше научим программу выбирать действие в зависимости от условия.
Проверь себя
5 случайных вопросов по этому уроку — при следующем открытии будут другие. Ответы проверяются сразу, без регистрации.