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

Материал из Информационная безопасностя
Версия от 15:56, 27 апреля 2023; Безуглов Сергей (обсуждение | вклад) (Новая страница: «{{TOCRight}} Линейный алгоритм («следование») – самый простой из всех алгоритмов. Он представ...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

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

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

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

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

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

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

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

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

Предполагается, что исходные данные и выводимые результаты имеют целочисленный тип (если это не олимпиадная задача, обычно достаточно типа 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