Каждый человек на протяжении своей жизни решает множество задач разной сложности. Но даже самые простые из задач выполняются последовательно, то есть за несколько шагов. Эту последовательность можно назвать алгоритмом. Последовательности бывают разные, но начинать их изучение лучше всего с линейных.
Прежде чем приступить к рассмотрению основной темы статьи, следует сделать краткое отступление и сказать несколько слов про алгоритмический язык.
Алгоритмический язык
Представьте, что человеку, работающему за компьютером, поставлена некая вычислительная задача. В языке программирования решение этой задачи выполняется с помощью алгоритмизации. Решение предполагает:
— разбиение на этапы;
— разработку алгоритма;
— составление программы решения на алгоритмическом языке;
— ввод данных;
— отладку программы (возможны ошибки — их надо исправить);
— выполнение на ПК;
— анализ результатов.
Алгоритмический язык является средством описания алгоритмов, а уже алгоритм, в свою очередь, представляет собой чёткое описание определённой последовательности действий, направленных на решение необходимой задачи.
Свойства алгоритма
Их несколько:
— конечность. Любой алгоритм должен быть завершённым, а окончание наступает после выполнения определённого числа шагов;
— однозначность, понятность. Не допускается разных толкований, неопределённости и двусмысленности — всё должно быть чётко и ясно, а также понятно исполнителю — и правила выполнения действий линейного алгоритма, и сами действия;
— результативность. Итог работы — результат, полученный за конечное число шагов;
— универсальность, массовость. Качественный алгоритм способен решать не одну задачу, а целый класс задач, имеющих схожую постановку/структуру.
Линейная структура
Любой алгоритм составляется из ряда базовых структур. Простейшей базовой структурой является следование — структура с линейными характеристиками. Из этого можно сформулировать определение.
Линейный алгоритм — это алгоритм, образуемый командами, которые выполняются однократно и именно в той последовательности, в которой записаны. Линейная структура, по сути, проста. Записать её можно как в текстовой, так и в графической форме.
Представим, что у нас стоит задача пропылесосить ковёр в комнате. В текстовой форме алгоритм будет следующим:
— принести пылесос к месту уборки;
— включить;
— пропылесосить;
— выключить;
— унести пылесос.
И каждый раз, когда нам надо будет пылесосить, мы будем выполнять один и тот же алгоритм.
Теперь поговорим про графическую форму представления.
Блок-схема
Для изображения алгоритма графически используют блок-схемы. Они представляют собой геометрические фигуры (блоки), соединённые стрелками. Стрелки показывают связь между этапами и последовательность их выполнения. Каждый блок сопровождается надписью.
Рассмотрим фигуры, которые используются при визуализации типичной линейной последовательности.
Блок начала-конца:
Блок ввода-вывода данных (отображает список вводимых и выводимых переменных):
Арифметический блок (отображает арифметическую операцию/группу операций):
Условный блок (позволяет описать условие). Алгоритмы с таким блоком используются при графической визуализации алгоритмов с ветвлением:
Условного блока нет в классическом линейном алгоритме, так как в нём, как уже было сказано ранее, все операции выполняются последовательно, то есть одна за другой. В линейном алгоритме размещение блоков выглядит следующим образом:
А вот, как решается задача по нахождению площади треугольника по формуле Герона. Здесь a, b, c – это длины сторон, S – площадь треугольника, P – периметр.
Следует обратить внимание, что запись «=» — это не математическое равенство, а операция присваивания. В результате этой операции переменная, стоящая слева от оператора, получает значение, которое указано справа. Значение не обязательно должно быть сразу определено (a = 3) — оно может вычисляться посредством выражения (a = b + z), где b = 1, a z = 2.
Примеры линейных алгоритмов
Если рассмотреть примеры решения на языке Pascal (именно этот язык до сих пор используется для изучения основ алгоритмизации и программирования), то можно увидеть следующую картину:
И, соответственно, блок-схема программы линейной структуры будет выглядеть следующим образом:
Как составить программу линейной структуры?
Порядок следующий:
— определите, что именно относится к исходным данными, а также каков типы/класс этих данных, выберите имена переменных;
— определите, каков тип данных будет у искомого результата, выберите название переменных (переменной);
— определите, какие математические формулы связывают результат и исходные данные;
— если требуется наличие промежуточных данных, определите класс/типы этих данных и выберите имена;
— опишите все используемые переменные;
— запишите окончательный алгоритм. Он должен включать в себя ввод данных, вычисления, вывод результатов.
На этом всё, в следующий раз рассмотрим на примерах программу разветвлённой структуры. Если же вас интересует тема алгоритмизации в контексте разработки программного обеспечения, ждём вас на профессиональном курсе OTUS!
Источники:
• https://inep.sfedu.ru/wp-content/uploads/2018/05/25/lection_27.pdf;
• https://www.sites.google.com/site/415ict/textbooks/prog-9/02-linejnyj-algoritm.
Содержание
- Линейный алгоритм
- Структура программы на языке Паскаль
- Заголовок программы
- Раздел описания переменных
- Тело программы
- Команды в Паскаль для ввода и вывода данных
- Команда Read
- Команда Write
- Примеры программ на паскале — задания на линейные алгоритмы
Линейный алгоритм
Линейным называется алгоритм, в котором команды выполняются последовательно друг за другом. Это самая простая конструкция. Программирование линейных алгоритмов освоить очень легко. Для написания простых программ на паскале разберем основные правила записи кода, основные команды и операторы Паскаль.
Структура программы на языке Паскаль
Прежде чем самостоятельно писать программы, разберем ее структуру на примере. Ниже приведен код программы, которая вычисляет сумму двух чисел и выводит ее на экран.
program primer1; var х,у,z:integer; { описание переменных } begin { начало программы } х := 3; { установка значения х } у := 5; { установка значения у } z := х + у; { вычисление суммы } write(z); {вывод результата вычисления на экран } end. { конец программы }
Заголовок программы
Текст программы начинается со слова program. После него записывается имя программы. Данная строка носит информативный характер и ее можно не писать.
Раздел подключения модулей начинается со служебного слова uses, за которым следует список имен модулей, перечисляемых через запятую.
Раздел описаний может включать разделы описания переменных, констант, меток, типов, процедур и функций, которые следуют друг за другом в произвольном порядке. Раздел подключения модулей и раздел описаний меток, констант и др. могут отсутствовать.
Раздел описания переменных
Раздел программы, обозначенный служебным словом var, содержит описание переменных с указанием их типов. Они используются для хранения исходных данных, результатов вычисления и промежуточных результатов.
Комментарии в программе можно записывать внутри фигурных скобок. Они игнорируются во время выполнения программы. Эти пояснения вы пишите только для себя.
В нашем примере переменные с именами X и Y используются для хранения исходных данных. Переменная с именем Z используется для хранения результата вычислений.
Имя переменной может записываться большими или маленькими латинскими буквами. Имя может содержать цифры, знак подчеркивания и не должно начинаться с цифры. Прописные и строчные символы считаются одинаковыми. В качестве имени нельзя использовать служебное слово языка Pascal.
Переменные одного типа можно указать в одной строке через запятую. После ставится двоеточие и указывается тип, к которому принадлежат переменные. Тип определяет допустимый диапазон значений.
Принадлежность переменной к типу integer означает, что она может хранить только целые числа. Если требуется хранить действительные (дробные) числа, тогда используется тип real.
Тело программы
Все что находится между служебными словами Begin и end — тело программы. Здесь записываются основные команды.
Оператор присваивания значений переменным имеет следующую структуру: переменная := выражение
Значок : = (двоеточие, равно) читается как «присвоить».
Умножение обозначается символом * (звездочка), деление — символом / (слеш).
Вывод результата выполняет команда write или print.
Каждая строка содержащая команду на языке Паскаль обязательно заканчивается символом «точка с запятой«.
Команды в Паскаль для ввода и вывода данных
Команда Read
В первом примере мы присвоили значения переменным непосредственно в тексте программы. Но так как программа пишется для решения множества однотипных задач, то удобнее задавать значения переменным во время ее работы. Для этого применяется команда read, которая позволяет ввести текстовые или числовые данные с клавиатуры.
Модифицируем код программы из примера выше.
program primer1; var х,у,z:integer; { описание переменных } begin { начало программы } read(x,y); { ввод значений х и y с клавиатуры } z := х + у; { вычисление суммы } write(z); {вывод результата вычисления на экран } end. { конец программы }
Теперь ввод значений переменных Х и У будет осуществляться по запросу работающей программы. В этот момент нужно будет с клавиатуры ввести два числа через пробел и нажать клавишу Enter, чтобы продолжить выполнение программы.
При работающей программе в системе программирования PascalABC появится строка ввода данных. Там и пишутся значения переменных.
Команда Write
В предыдущем примере, при работе программы, не совсем понятно, что нужно вводить и что за числа появляются на экране по завершению работы программы. Поэтому изменим код программы, чтобы у нее появился минимальный пользовательский интерфейс. Для этого задействуем уже знакомую нам команду Write.
program primer1; var х,у,z:integer; { описание переменных } begin { начало программы } writeln('Вычисление суммы двух чисел'); write('Введите два целых числа через пробел'); readln(x,y); { ввод значений х и y с клавиатуры } z := х + у; { вычисление суммы } write('Сумма = ',z); {вывод результата вычисления на экран } end. { конец программы }
Теперь посмотрите, как добавленные строки повлияли на работу программы.
У нас появились подсказки. Посмотрите на команду write. В качестве ее аргумента был использован текст, заключенный в апострофы. И еще, появилось окончание ln у оператора write. Именно оно заставляет последующий вывод информации делать с новой строки. Это же окончание можно использовать совместно с оператором read.
Readln и Writeln в паскале — это модифицированные команды Read и Write. В командах добавлено окончание ln (line new — новая строка). Такая форма операторов делает последующий вывод информации, при работе программы, с новой строки.
Также поменялся вывод результата. Здесь тоже появилась подсказка.
Примеры программ на паскале — задания на линейные алгоритмы
Задание 1. Модифицировать программу так, чтобы она вычисляла и выводила на экран сумму и произведение трех целых чисел.
Решение:
program zadanie1; var х,у,k,z,p:integer; { описание переменных } begin { начало программы } writeln('Вычисление суммы и произведения трех чисел'); write('Введите три целых числа через пробел'); readln(x,y,k); { ввод значений х,y,k с клавиатуры } z := x + y + k; { вычисление суммы } p := x * y * k; { вычисление произведения } write('Сумма = ',z); {вывод результата сложения на экран } write('Произведение = ',p); {вывод результата произведения на экран } end. { конец программы }
Задание 2. Дана длина ребра куба а. Найти объем куба V=a3 и площадь его поверхности S=6a2.
Решение:
program zadanie2; var a,v,s:real; { описание переменных } begin { начало программы } writeln('Вычисление объема и площади поверхности куба'); write('Введите длину ребра куба'); readln(a); { ввод значения a с клавиатуры } v := a * a * a; { вычисление объема } s := 6 * a * a; { вычисление площади } write('Объем куба = ',v); {вывод результата объем куба } write('Площадь поверхности = ',s); {вывод результата площадь поверхности } end. { конец программы }
Посмотрите еще примеры линейных алгоритмов.
Дополнительные задания:
Lin1 Введите значения для двух переменных. Обменяйте их значения, используя третью (буферную) переменную.
Хотите подробнее узнать о системе PascalABC и начать писать в ней свои первые программы, тогда статья «Знакомство с PascalABC» для вас.
Следующая тема для изучения Условный оператор
Тест «Линейный алгоритм»
Проверь свои знания по теме «Линейный алгоритм»
§ 3.3. Программирование линейных алгоритмов
Информатика. 8 класса. Босова Л.Л. Оглавление
Ключевые слова:
• вещественный тип данных
• целочисленный тип данных
• символьный тип данных
• строковый тип данных
• логический тип данных
Программы, реализующие линейные алгоритмы, являются простейшими. Все имеющиеся в них операторы выполняются последовательно, один за другим.
Программируя линейные алгоритмы, рассмотрим более подробно целочисленные, логические, символьные и строковые типы данных.
3.3.1. Числовые типы данных
Вы уже знакомы с основными числовыми типами данных integer и real. К ним применимы стандартные функции, часть из которых приведена в табл. 3.3.
Таблица 3.3
Стандартные функции Паскаля
Исследуем работу функций round, int и frас, применив их к некоторому вещественному х. Соответствующая программа будет иметь вид:
Запустите программу несколько раз для каждого х ? {10,2; 10,8; -10,2; -10,8}. Что вы можете сказать о типе результата каждой из этих функций?
3.3.2. Целочисленный тип данных
Над целыми числами в языке Паскаль выполняются следующие операции: сложение (+), вычитание (-), умножение (*), получение целого частного (div), получение целого остатка деления (mod) и деление (/). Результаты первых пяти операций — целые числа. Результатом операции деления может быть вещественное число.
Рассмотрим пример использования операций div и mod, записав на языке Паскаль программу нахождения суммы цифр вводимого с клавиатуры натурального трёхзначного числа.
Используем тот факт, что положительное трёхзначное число можно представить в виде следующей суммы: х — а*100 + 6*10 + с, где а,Ь,с — цифры числа.
Чему равна сумма цифр числа 123? А числа -123? Совпадают ли ваши результаты с результатами работы программы? Как можно объяснить и исправить ошибку в программе?
3.3.3. Символьный и строковый типы данных
Значением символьной величины (тип char) в языке Паскаль является любой из символов, который можно получить на экране нажатием на клавиатуре одной из клавиш или комбинации клавиш, а также некоторых других символов, в том числе и невидимых. Множество таких символов состоит из 256 элементов, каждому из которых согласно используемой кодовой таблице поставлен в соответствие код — число 0 до 255.
Символы, соответствующие первым 32 кодам, являются управляющими, а остальные — изображаемыми. К изображаемым символам относится и пробел, имеющий код 32.
Знакам препинания, знакам арифметических операций, цифрам, прописным и строчным латинским буквам соответствуют коды от 33 до 127. Буквам национального алфавита соответствуют коды с номерами 128 и далее.
В тексте программы константу символьного типа можно задать, заключив любой изображаемый символ в апострофы: ‘5’, ‘В’, ‘*’.
Если значение символьной переменной считывается с клавиатуры, то его следует набирать без апострофов.
Чтобы найти код символа, используют функцию ord, где в качестве параметра задают символ.
Чтобы по коду узнать символ, используют функцию chr, где в качестве параметра указывают код символа.
Значением строковой величины (тип string) является произвольная последовательность символов, заключенная в апострофы. В Паскале (как и в алгоритмическом языке) строки можно сцеплять.
Пример. Запишем на языке Паскаль программу, в которой для введённой с клавиатуры буквы на экран выводится её код. Затем на экран выводится строка, представляющая собой последовательность из трёх букв используемой кодовой таблицы: буквы, предшествующей исходной; исходной буквы; буквы, следующей за исходной.
3.3.4, Логический тип данных
Как известно, величины логического типа принимают всего два значения; в Паскале это false и true. Эти константы определены так, что false < true.
Логические значения получаются в результате выполнения операций сравнения числовых, символьных, строковых и логических выражений. Поэтому в Паскале логической переменной можно присваивать результат операции сравнения.
Пример. Напишем программу, определяющую истинность высказывания «Число п является чётным» для произвольного целого числа n.
Пусть ans — логическая переменная, а n — целая переменная. Тогда в результате выполнения оператора присваивания
ans:=n mod 2 = 0
переменной ans будет присвоено значение true при любом чётном n и false в противном случае.
Логическим переменным можно присваивать значения логических выражений, построенных с помощью известных вам логических функций и, или, не, которые в Паскале обозначаются соответственно and, or, not.
Пример. Напишем программу, определяющую истинность высказывания «Треугольник с длинами сторон а, b, с является равнобедренным» для произвольных целых чисел а, Ь, с.
САМОЕ ГЛАВНОЕ
В языке Паскаль используются вещественный, целочисленный, символьный, строковый, логический и другие типы данных. Для них определены соответствующие операции и функции.
Вопросы и задания
1. Для заданного х вычислите у по формуле у = х3 + 2,5х2 — х + 1.
2. По заданным координатам точек А и В вычислите длину отрезка АВ.
3. Известны длины сторон треугольника а, b, с. Напишите программу, вычисляющую площадь этого треугольника.
4. Известны координаты вершин А, В, С треугольника. Напишите программу, вычисляющую площадь этого треугольника.
5. Если сумма налога исчисляется в рублях и копейках, то налоговая служба округляет её до ближайшего рубля (до 50 копеек — с недостатком, свыше 50 копеек (включая 50) — с избытком). Используйте компьютер, чтобы ввести точную сумму налога и вывести, сколько следует уплатить.
6. Исследуйте работу функции random, запустив многократно на выполнение программу: program n_8;var х, n: integer; beginwriteln (‘Исследование функции random’); randomize (*для генерации различных случайных чисел при каждом запуске программы *) ; write (‘Введите х» ‘) ; readln (х); write (‘Введите n»’); readln (n); writeln ( ‘random (‘, х, ‘) =’, random ( х )); writeln ( ‘random ( ‘, к, ‘) + ‘, n, ‘ = ‘, random (x) + n) end.Как можно получить случайное число из промежутка (0; х)? Как можно получить случайное число из промежутка (0; х]? Как можно получить случайное число из промежутка (n; х + n)?
7. Одна компания выпустила лотерейные билеты трёх разрядов: для молодежи, для взрослых и для стариков. Номера билетов каждого разряда лежат в пределах: для молодёжи — от 1 до 100; для взрослых — от 101 до 200; для стариков — от 201 до 250. С помощью компьютера выберите случайным образом лотерейный билет в каждом разряде.
8. Запишите на языке Паскаль программу, которая для произвольного двузначного числа определяет:
а) сумму и произведение его цифр; б) число, образованное перестановкой цифр исходного числа.
9. Запишите на языке Паскаль программу, реализующую алгоритм работы кассира, выдающего покупателю сдачу (s) наименьшим количеством банкнот по 500 (k500), 100 (k100), 50 (k50) и 10 (k10) рублей.
10. Идёт k-я секунда суток. Разработайте программу, которая по введённой k-й секунде суток определяет, сколько целых часов h и целых минут m прошло с начала суток.
11. Запишите на языке Паскаль программу, которая вычисляет сумму кодов букв в слове БАЙТ.
12. Запишите на языке Паскаль программу, которая выводит на экран строку символов, коды которых равны 66, 69, 71, 73, 78.
13. Разработайте программу, которая запрашивает три строковые величины — взаимосвязанные прилагательное, существительное и глагол, а затем печатает все варианты фраз с использованием введённых слов.
14. Даны значения целочисленных переменных: а = 10, b = 20. Чему будет равно значение логической переменной rez после выполнения операции присваивания? а) rez:=(а=10) or (b>10) б) rez:=(а>5) and (b>5) and (a<20) and (b<30) в) rez: = (not (a<15)) or (b>20)
15. Составьте программу, вводящую true, если высказывание является истинным, и false в противном случае: а) сумма цифр трёхзначного числа х является чётным числом; б) треугольник со сторонами а, b, с является разносторонним.
Оглавление
§ 3.2. Организация ввода и вывода данных
§ 3.3. Программирование линейных алгоритмов
§ 3.4. Программирование разветвляющихся алгоритмов
Конспект
Составление линейных алгоритмов
На предыдущих уроках мы узнали, что
такое алгоритм, какие бывают виды алгоритмов, и кто их исполняет.
Сегодня мы попрактикуемся в составлении
алгоритмов. Это очень важные навыки. Мы уже неоднократно отмечали, что
составить алгоритм, то есть объяснить другому, как выполнять те или иные задачи
так, чтобы это было понятно каждому, — очень тяжело. Наша задача – научиться
составлять алгоритмы для различных примеров, чтобы впоследствии, когда вы
столкнётесь с необходимостью составлять алгоритмы для написания различных
программ, это не составляло для вас особого труда.
Начнём мы с самых простых алгоритмов –
линейных. Их составление, обычно, не вызывает особого труда. Однако, навыки
составления таких алгоритмов чрезвычайно важны.
Пример 1. Составить алгоритм запуска программы
Paint в ОС Windows 7.
Решение: Вспомним из курса информатики 5
класса порядок действий для запуска программы Paint.
- Войти в меню «Пуск».
- Войти в пункт «Все программы».
- Войти в пункт «Стандартные».
- Выбрать программу «Paint».
Данный алгоритм в виде блок-схемы имеет
следующий вид:
Рис. 1. Блок-схема к примеру 1.
Составление алгоритмов с ветвлениями
Рассмотрим пример на составление алгоритмов с
ветвлениями.
Пример 2. Составьте алгоритм для
перехода дороги на светофоре.
Рис. 2. Светофор (Источник).
Решение:
Возможны следующие ситуации: в тот момент,
когда мы подошли к дороге горел красный или зелёный свет. Если горел зелёный
свет, то можно переходить дорогу. Если же горел красный свет, то необходимо
дождаться зелёного – и уже тогда переходить дорогу.
Таким образом, алгоритм имеет следующий вид:
- Подойти к светофору.
- Посмотреть на его свет.
- Если горит зелёный, то перейти дорогу.
- Если горит красный, то подождать, пока
загорится зелёный, и уже тогда перейти дорогу.
Блок-схема данного алгоритма имеет вид:
Рис. 3. Блок-схема к примеру 2.
Составление циклических алгоритмов
Рассмотрим пример на составление циклического
алгоритма. Мы уже несколько раз обсуждали перевод чисел из десятичной системы в
двоичную. Теперь пришло время чётко сформулировать этот алгоритм.
Напомним, что его принцип состоит в делении
числа на 2 и записей остатков, получающихся при делении.
Пример 3. Составить алгоритм перевода чисел из
десятичной системы в двоичную.
Решение:
То есть, алгоритм будет выглядеть так:
- Если число равно 0 или 1, то это и будет его
двоичное представление. - Если число больше 1, то мы делим его на 2.
- Полученный остаток от деления записываем в
последний разряд двоичного представления числа. - Если полученное частное равно 1, то его
дописываем в первый разряд двоичного представления числа и прекращаем
вычисления. - Если же полученное частное больше 1, то мы
заменяем исходное число на него и возвращаемся в пункт 2).
Блок-схема этого алгоритма выглядит следующим
образом:
Рис. 4. Блок-схема к примеру 3.
Примечание: подумайте, можно ли как-то упростить
приведенную блок-схему.
«Чтение» алгоритмов
Пример 4. По заданной блок-схеме выполнить
действия алгоритма для числа 23.
Рис. 5. Блок-схема к примеру 4.
Решение:
- a=23
- 23+5=28
- 28<35
- 28+5=33
- 33<35
- 33+5=38
- 38>35
- 76 – двузначное число
- 76-50=26.
Ответ: 26.
На этом уроке мы разобрали примеры составления
алгоритмов, а также пример «чтения алгоритма» по готовой блок-схеме.
На следующем уроке мы обсудим игры и
выигрышные стратегии.
Как убить Кощея?
Наверное, все помнят из детства сказку, в
которой рассказывается о местонахождении смерти Кощея Бессмертного: «Смерть моя
– на конце иглы, которая в яйце, яйцо – в утке, утка – в зайце, заяц в сундуке
сидит, сундук на крепкий замок закрыт и закопан под самым большим дубом на
острове Буяне, посреди моря-океяна …»
Рис. 6. Кощей Бессмертный и Василиса Премудрая
(Источник).
Предположим, вместо Ивана-царевича бороться с
Кощеем был брошен Иван-дурак. Давайте поможем Василисе Премудрой составить
такой алгоритм, чтобы даже Иван-дурак смог убить Кощея.
- Конечно же, сначала необходимо разыскать
остров Буян (на такие вещи, будем считать, Иван-дурак способен). - Поскольку сундук закопан под самым большим
дубом, то сначала необходимо найти самый большой дуб на острове. - Затем нужно выкопать сам сундук.
- Прежде чем доставать зайца, необходимо
сломать крепкий замок. - Теперь уже можно достать зайца.
- Из зайца нужно достать утку.
- Из утки достать яйцо.
- Разбить яйцо и достать иголку.
- Иголку поломать.
Это тоже линейный алгоритм, хотя и более
длинный, чем алгоритм запуска программы Paint.
Его блок-схема выглядит так:
Рис. 7. Блок-схема.
На распутье…
И снова обратимся к сказочным персонажам в
поисках примеров различных алгоритмов. Когда речь идёт об алгоритмах с
ветвлениями, то, конечно, нельзя не вспомнить о богатыре, стоящем на распутье
возле камня.
Рис. 8. Богатырь на распутье (Источник).
На камне написано:
«Направо пойдёшь – коня потеряешь, себя
спасёшь; налево пойдёшь – себя потеряешь, коня спасёшь; прямо пойдёшь – и себя
и коня потеряешь».
Попробуем составить алгоритм действий, который
составил автор надписи на камне для путников?
- Если мы пойдём направо, то потеряем коня.
Если же мы не пойдём направо, то у нас остаётся два варианта (мы считаем,
что назад возвращаться путник не будет): пойти прямо и налево. - В случае, если мы пойдём налево, то потеряем
себя, а коня спасём. - Если же мы пойдём прямо, то потеряем и себя,
и коня.
Блок-схема этого алгоритма выглядит так:
Рис. 9. Блок-схема.
Репка
Русские народные сказки не оставили нас и без
циклического алгоритма. И, как ни странно, спрятался он в одной из самых
незамысловатых сказок – «Репке».
Рис. 10. Репка.
Вспомним сюжет сказки: дед тянет-потянет –
вытянуть не может. Затем на помощь к деду по очереди подходят новые персонажи –
и так до тех пор, пока не приходит мышка.
Попытаемся составить алгоритм действий всех
персонажей сказки для того, чтобы они всё-таки смогли вытянуть Репку.
- Изначально к Репке подошёл дед и попытался
вытянуть. - Поскольку вытянуть Репку не получилось, то
понадобилась помощь следующего персонажа. - И так происходит до тех пор, пока не
появилась мышка (или, другими словами, до тех пор, пока Репку не
вытащили).
В виде блок-схемы этот алгоритм выглядит
следующим образом:
Рис. 11. Блок-схема.
Вопросы:
·
Правила
преобразования числовых типов данных.
·
Операции
и функции над выражениями числовых типов.
· Целочисленные типы
данных.
Рассмотрим правила преобразования числовых типов в
среде программирования Pascal
ABC. И так к числовым типам данных относятся
целочисленные типы: byte
и integer, а также
вещественный тип real.
Мы можем легко преобразовать переменные типа byte
в тип integer или даже real.
Достаточно просто присвоить переменной типа integer
или real значение
переменной типа byte.
Точно также можно перевести переменные типа integer
в real. Переменные
вещественного типа real
нельзя перевести в целочисленный тип неявно. Это можно сделать только с помощью
специальных функций, которые мы рассмотрим позже. Переменные типа integer
также можно неявно преобразовать в byte,
но это происходит немного сложнее. Если значение исходной переменной
соответствует диапазону типа byte,
то есть находится в промежутке от 0 до 255, то значение результирующей
переменной будет равно значению исходной. Если же значение исходной переменной
больше 255 – итоговое значение будет равно остатку от деления исходного на 256.
Если же значение исходной переменной будет отрицательным – к нему будет
добавляться число 256, до тех пор, пока не будет получено положительное
значение, это значение и будет итоговым.
Возможности
неявного преобразования данных числовых типов
Рассмотрим операции и функции общие для всех числовых
типов. Прежде всего над любыми числами, как над целыми, так и над вещественными
можно производить основные арифметические операции: сложение вычитание,
умножение и деление. Они записываются соответственно знаками: +, -, * и / и
работают над двумя выражениями, которые указываются слева и справа от них. Сложение,
вычитание и умножение возвращают результат в зависимости от типа переменных,
над которыми производится операция. Если оба аргумента целочисленных типов, то
есть byte и integer
– то и результат будет целым числом. Если один или оба аргумента принадлежат
вещественному типу real,
то и результат будет принадлежать типу real.
Деление же, независимо от типа аргументов, всегда возвращает результат
вещественного типа, real.
Основные
арифметические операции
Так же есть ещё две, хорошо знакомые нам,
арифметические функции: возведение в квадрат и извлечение квадратного корня из
числа. Первая функция записывается английскими буквами sqr,
сокращённо от слова square, что в переводе на русский язык означает квадрат.
После неё в круглых скобках указывается аргумент. Результат выполнения этой
функции будет того же типа, что и аргумент. По тем же правилам записывается функция
извлечения квадратного корня из числа она обозначается служебным словом sqrt.
Результат выполнения этой функции всегда будет вещественного типа.
Ещё одна функция общая для числовых типов – модуль
числа. Как мы помним, модулем числа называется расстояние от начала отсчёта до
точки, соответствующей этому числу на числовой оси. То есть если аргумент
положительный или нулевой – то эта функция вернёт значение равное аргументу,
если же аргумент отрицательный – то функция вернёт значение противоположное
аргументу по знаку. Функция модуля записывается сочетанием букв abs
её значение будет того же типа, что и аргумент.
Функции
возведения в квадрат и извлечения квадратного корня
Операции
и функции общие для числовых типов
Теперь рассмотрим функции, аргументом которых может
быть только вещественное число. Это функция округления, а также функции
выделения целой и дробной части. Функция округления записывается служебным
словом
round, что в переводе на
русский язык и означает округление. Значение этой функции имеет целочисленный
тип. Функция округления – это единственный способ преобразования
вещественных чисел к целому типу. Функции выделения целой и дробной части
записываются соответственно int
и frac – эти функции
возвращают значение вещественного типа.
Отдельно стоит рассмотреть функцию random,
которая не имеет аргументов. Эта функция возвращает случайное вещественное
число от 0 до 1, при этом 0 входит данный промежуток, а 1 — нет.
Функции
вещественного аргумента
Давайте посмотрим, как работают, изученные нами
функции. Напишем программу, которая будет генерировать случайное число от 0 до 1,
умножать его на 100, после чего выводить на экран: полученное число, его
квадрат и квадратный корень, его целую и дробную части и результат его
округления до целых.
И так программа начинается со служебного слова program,
назовём нашу программу test.
Для работы программы нам потребуется одна переменная, назовём её a, по
условию он должна выть вещественного типа real.
Запишем логические скобки программы. И начнём записывать операторы. В начале
нам нужно сгенерировать случайное число от 0 до 1. И присвоить его переменной a.
Запишем оператор a:=random.
Теперь присвоим переменной a
значение a * 100.
Далее нам нужно вывести полученное число и всё, что перечислено в условии
задачи на экран. Как мы помним это можно сделать с помощью оператора writeln.
Далее будет следовать 6 операторов вывода writeln.
Cкопируем первый оператор 6 раз.
В первом операторе вывода выведем сначала поясняющее
сообщение в виде строкового значения ‘Само число – ‘. После поясняющего
сообщение выведем значение переменной a.
Второй оператор будет содержать поясняющее сообщение ‘Квадрат – ‘, а также
функцию sqrt (a).
Следующий оператор будет содержать всё тоже самое для квадратного корня.
Функция квадратного корня записывается sqrt.
Следующий оператор будет содержать тоже самое для функции выделения целой части
числа – int. Следующий – для
функции выделения дробной части – frac.
И последний для функции округления до целых – round.
program test;
var
a: real;
begin
a:=random;
a:=a*100;
writeln (‘Число — ‘, a);
writeln (‘Квадрат — ‘, sqr
(a));
writeln (‘Корень — ‘,
sqrt (a));
writeln (‘Целая часть — ‘, int
(a));
writeln (‘Дробная часть — ‘,
frac (a));
writeln (‘Округление — ‘,
round (a));
end.
Исходный код программы
Запустим нашу программу на выполнение и посмотрим на
данные которые вывела программа. Обратим внимание на отличие в работе функций int
и round. Первая функция
просто отбрасывает дробную часть числа, а функция round
округляет число до целых по всем правилам математики.
Результат
работы программы
Теперь рассмотрим операции и функции, уникальные для
целочисленных типов. Помимо функций, и операций общих для всех числовых типов
для целочисленных переменных есть две уникальные операции. Это операция
безостаточного деления – div.
И операция выделения остатка от деления – mod.
Результаты этих операций также имеют целочисленные типы. Также для
целочисленных типов есть своя функция генерации случайного числа она, так же,
как и для вещественных чисел, записывается словом random,
после него в скобках указывается целочисленный аргумент. Данная функция возвращает
случайное значение целочисленного типа на промежутке от нуля до аргумента, не
включая аргумент. Таким образом случайное число на промежутке [a;
b] можно сгенерировать, вычислив сумму
a + random
(b — a).
Задача: Найти разность
произведения и суммы цифр случайного целого положительного трёхзначного целого
числа.
Программа начинается со служебного слова program.
Назовём нашу программу cifry.
Напишем раздел описания переменных. Для работы программы нам их потребуется
четыре. Это непосредственно число, зовём её c.
Так же нам потребуются переменные для хранения суммы и произведения цифр числа.
Назовём их соответственно s
и p. По условию задачи все
они – целые числа – укажем их тип integer.
Ещё нам понадобится переменная для хранения одной из цифр числа, назовём её d.
Для хранения одной цифры нам будет достаточно типа byte.
Запишем логические скобки. В начале с помощью
оператора writeln выведем на экран
поясняющее сообщение о том, что это программа расчёта разности произведения и
суммы цифр трёхзначного числа. Сгенерируем случайное целое трёхзначное число.
Но как это сделать? Для этого присвоим переменной с значение суммы числа
100 и случайного числа от 0 до 899, которое сгенерируем оператором random
(900). Эта сумма будет в любом случае иметь три знака, так
как её минимальное значение равно 100, а максимальное – 999. Теперь с помощью
оператора writeln выведем на экран
поясняющее сообщение и само число.
Теперь мы будем вычислять значения суммы и
произведения цифр числа. Для этого переменной p
присвоим значение 1, а s
– 0. В дальнейшем переменную p
будем умножать на значения цифр числа, а переменную s
– увеличивать на это же значение. Теперь подумаем, как можно выделить одну из
цифр числа, допустим наименьшую по разряду. Эта цифра будет равна остатку от
деления числа на 10. Присвоим это значение переменной d.
Операция нахождения остатка от деления записывается словом mod.
Увеличим на значение d
переменную s. Теперь умножим
переменную p на d.
Присвоим результат ей же. Теперь у переменной c
нужно отбросить наименьшую по разряду цифру. Для этого достаточно разделить её
значение без остатка на 10. Операция безостаточного деления записывается словом
div. Для того чтобы выделить
следующую цифру числа, достаточно точно также, как и в случае с первой цифрой, воспользоваться
функцией нахождения остатка от деления на 10. Просто скопируем и вставим
последние четыре оператора. Тоже самое сделаем и для последней цифры числа.
Снова вставим последние четыре скопированных оператора.
Таким образом мы вычислили значения произведения и
суммы цифр числа. Нам остаётся вывести значение их разности. Используем для
этого оператор write.
Сначала выведем поясняющее сообщение о том, что это разность произведения и
суммы цифр числа, а потом и само значение разности (p
—
s).
program cifry;
var
c, s, p: integer;
d: byte;
begin
writeln (‘Программа расчёта разности произведения и суммы цифр трёхзначного
числа.’);
c:=100+random (900);
writeln (‘Число — ‘, c);
p:=1;
s:=0;
d:=c mod 10;
s:=s+d;
p:=p*d;
c:=c div 10;
d:=c mod 10;
s:=s+d;
p:=p*d;
c:=c div 10;
d:=c mod 10;
s:=s+d;
p:=p*d;
c:=c div 10;
write (‘Разность произведения и суммы цифр числа — ‘, p-s);
end.
Исходный код программы
Запустим программу на выполнение.
Программа сгенерировала число 344. Разность произведения и суммы его цифр
действительно равна 37.
Результат работы программы
Важно запомнить:
·
Линейный алгоритм – это алгоритм, в
котором используется лишь один тип конструкции – следование. Он состоит из
операторов, записанных в порядке их выполнения.
·
Возможно
неявное преобразование значений целочисленных типов byte
и integer в вещественный
тип real, но не наоборот.
·
Для
всех числовых типов определён ряд операций и функций над ними.
·
Также
определены отдельные операции и функции для целочисленных типов: byte
и integer, а также для
вещественного типа real.