Линейные алгоритмы (PascalABC.NET)

Материал из Информационная безопасностя
Перейти к навигации Перейти к поиску

Линейный алгоритм («следование») – самый простой из всех алгоритмов. Он представляет собой последовательность блоков (участков) программы, которые однократно выполняются друг за другом. В то же время, это самый универсальный из алгоритмов. В самом деле, любая программа может быть укрупненно описана линейным алгоритмом из трех блоков:

  • получение исходных данных;
  • обработка данных;
  • вывод результатов.

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

Любой алгоритм имеет некоторое начальное состояние, которое обеспечивается набором стартовых условий. Так, чтобы сложить «в столбик» два числа на бумаге, нужно иметь саму бумагу, карандаш или ручку, а также получить числа, которые требуется сложить. У компьютера проблемы с бумагой и карандашами отсутствуют, но числа ему все равно нужно предоставить. Для алгоритма нахождения суммы двух чисел сами эти числа будут называться исходными данными.

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

Под обработкой данных обычно понимается процесс преобразования исходных данных к результатам. Это наиболее ёмкая часть алгоритма, а большинство возникающих у школьника проблем связано именно с обработкой данных.

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

Целочисленная арифметика

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

Перевод мер

Автомобиль проехал n километров. Найдите пройденный путь в метрах и сантиметрах.

Вспоминаем, что 1 км = 1000 м, 1 м = 100 см. Перевод из крупных мер в мелкие связан с умножением. Расстояние в метрах nm = 1000 × n, а расстояние в сантиметрах n sm = 100 × n m. Эти значения требуется вывести. Поскольку об оформлении вывода ничего не сказано, его можно сделать сообразно своему вкусу и умению. Значение n будем задавать путем ввода, оформление которого также сделаем самостоятельно.

1 ##
2 var n := ReadInteger('Путь в км:');
3 var nm := 1000 * n;
4 var nsm := 100 * nm;
5 Println('Путь в метрах равен', nm);
6 Print('Путь в сантиметрах равен', nsm);
Путь в км: 192
Путь в метрах равен 192000
Путь в сантиметрах равен 19200000

При оформлении ввода учитывайте, что ReadInteger и прочие функции ввода после подсказки автоматически вставляют пробел. При оформлении вывода не забывайте, что функция Print после каждого выводимого элемента автоматически вставляет пробел. Println по окончании вывода выполняет переход к следующей строке, Print такого перехода не выполняет, но в последней выводимой строчке нет нужды делать такой переход.

Решение этой же задачи можно записать и без промежуточных переменных, сократив себе работу.

1 ##
2 var n := ReadInteger('Путь в км:');
3 Write('Путь в метрах равен ', 1000 * n, ', в сантиметрах - ', 100000 * n);
Путь в км: 192
Путь в метрах равен 192000, в сантиметрах - 19200000

Здесь для вывода использована процедура Write и все пробелы ставятся вручную. Если бы мы использовали функцию Print, между значением 192000 и запятой оказался пробел, а это некрасиво.

Дана масса в килограммах. Найти количество полных центнеров и полных тонн в ней.

Снова вспоминаем соотношение мер. 1 ц = 100 кг, 1 т = 1000 кг. Поскольку делается перевод в более крупные меры, потребуется выполнять деление. Указание о том, что нужны полные центнеры и тонны подсказывает, что деление должно быть целочисленным.

1 ##
2 var m := ReadInteger('Задайте массу в килограммах:');
3 Write('Полных центнеров: ', m div 100, ', полных тонн: ', m div 1000);
Задайте массу в килограммах: 12397
Полных центнеров: 123, полных тонн: 12
С некоторого момента прошло 234 дня. Сколько полных недель прошло за этот период?

В полной неделе 7 дней. Следовательно, нужно найти результат целочисленного деления 234 на 7. Ввод в этой задаче не требуется.

1 ## Print('В 234 днях полных недель -', 234 div 7);
В 234 днях полных недель – 33
Представить указанное число секунд, прошедших от ближайшей полуночи, в виде количества часов, минут и секунд. Результат вывести в формате ЧЧ:ММ:СС, незначащие нули не вставлять. 5 часов, 23 минуты и 9 секунд запишутся в виде 5:23:9.

В минуте 60 секунд, в часе 60 минут или 60 × 60 = 3600 секунд. Пусть s – исходное количество секунд. Тогда полное количество часов h будет равно результату целочисленного деления s на 3600, т.е. h := s div 3600. Остаток от этого деления (количество секунд, которые составляют неполный час) можно снова поместить в s посредством присваивания s := s mod 3600. Далее при помощи целочисленного деления находим полное количество минут: m := s div 60. Остаток от такого деления даст количество секунд в неполной минуте: s := s mod 60. При выводе значений h, m и s используем процедуру Write, обеспечивая требуемое оформление.

1 ##
2 var s := ReadInteger('Количество секунд:');
3 var h := s div 3600;
4 s := s mod 3600;
5 var m := s div 60;
6 s := s mod 60;
7 Write('Показание часов ', h, ':', m, ':', s);
Количество секунд: 53051
Показание часов 14:44:11

Выделение цифр в числе заданной разрядности

В семизначном числе найти сумму второй и пятой слева цифр. 

Вторая слева цифра – это 7 – 2 + 1 = 6-я справа. Пятая слева – это 7 – 5 + 1 = 3-я справа

1 ##
2 var n := ReadInteger('Введите семизначное натуральное число');
3 Print('Сумма второй и пятой цифр равна', n mod 1000000 div 100000 + n mod 1000 div 100);
Введите семизначное натуральное число 4690129
Сумма второй и пятой цифр равна 7
В трехзначном числе переставить цифры в обратном порядке.

Обозначим цифры числа буквами s (сотни), d (десятки) и e (единицы). Исходное число имеет значение 100s + 10d + e. Требуется получить число 100e + 10d + s. Для чего сначала нужно найти s, d и e.

1 ##
2 var n := ReadInteger('Введите трехзначное натуральное число');
3 var s := n div 100;
4 var d := n mod 100 div 10;
5 var e := n mod 10;
6 Print(100 * e + 10 * d + s);
Введите трехзначное натуральное число 825
528
Найти сумму и произведение цифр четырёхзначного числа.

Обозначим цифры числа буквами t (тысячи), s (сотни), d (десятки) и e (единицы). Найдем вначале каждую цифру, в потом их сумму и произведение.

1 ##
2 var n := ReadInteger('Введите четырехзначное натуральное число');
3 var t := n div 1000;
4 var s := n mod 1000 div 100;
5 var d := n mod 100 div 10;
6 var e := n mod 10;
7 Write('Сумма цифр ', t + s + d + e, ', произведение ', t * s * d * e);
Введите четырехзначное натуральное число 3926
Сумма цифр 20, произведение 324