Особенности программирования линейных алгоритмов
Рассмотрим следующие задачи. Алгоритмы их решения являются линейными.
Задача 1. Вычислить значение выражения
при разных заданных значениях переменных x и y.
Задача 2. Вычислить среднюю температуру воздуха, измеренную в 900, 1200 и 1500.
Задача 3. Определить сумму цифр некоторого случайного двухзначного числа.
Задача 4. Переставить местами первую и последнюю букву в слове.
Если известны исходные данные, то решить эти задачи «вручную» для Вас не составляет труда. Но Ваша цель – научиться объяснять, как их решать, формальному исполнителю – компьютеру.
Чтобы достичь цели во всех случаях нужно выполнить следующие действия:
определить, что является исходными данными и какого они типа;
определить, что будем считать результатом и какого типа будет это значение;
выбрать обозначения для переменных, в которых будут храниться исходные данные и результаты;
определить, потребуются ли вспомогательные переменные для хранения промежуточных результатов;
выбрать операции, которые необходимо выполнить для решения задачи и выяснить, как эти операции записываются в системе команд исполнителя;
обеспечить ввод исходных данных;
указать порядок выполнения операций;
обеспечить вывод результатов, чтобы он стал доступен человеку, который будет пользоваться этой программой.
Разработаем алгоритм и программу для каждой из задач в соответствии с указанным порядком действий.
Особенности первой задачи в том, что алгоритм достаточно прост: ввести значения переменных х и у; вычислить значение z по формуле; вывести значение z. Но чтобы его запрограммировать, нужно знать, как задаются арифметические операции сложения, вычитания, умножения и деления; можно ли выполнить операцию извлечения квадратного корня и как она записывается; какие операторы служат для ввода данных, присваивания значения переменным, вывода результата.
Следует всегда помнить, что в разных языках программирования обозначения операций и операторы одних и тех же действий могут значительно отличаться.
В ЯП Pascal операции сложения и вычитания обозначаются привычными знаками «+» и «–». Операция умножения – знаком «*». А вот операция деления для целых и вещественных чисел обозначается по-разному: для деления вещественных чисел используется знак «/», а для деления целых чисел включено две операции: «div» для обозначения деления нацело и «mod» для получения остатка от целочисленного деления.
Пример
Пусть a, b, c – переменные целого типа, x, y, z – вещественного типа. Значения переменных таковы:
a | b | с | x | y | z |
4 | 27 | 0 | –4 | 2,5 | 0 |
Тогда в результате операции z:=x/y в ячейку z будет помещено значение –4:2,5=–1,6. В результате операции c := b div a в ячейку с будет помещено значение 6. В результате операции с := b mod a в ячейку с будет помещено значение 3.
Для вычисления квадратного корня, тригонометрических функций, округления результата с заданной точностью и некоторых других операций в библиотеку стандартных подпрограмм включены стандартные функции.
Набор стандартных функций свой для каждой среды программирования.
Заметим, что практически во всех языках программирования аргументы функций заключаются в круглые скобки.
Для решения первой задачи нам потребуется функция вычисления квадратного корня и функция вычисления квадрата числа.
Во всех задачах нам придется присваивать значения переменным. Это можно сделать, введя значение с клавиатуры или из файла (для этого служит оператор ввода) или присвоив переменной конкретное или «случайное» значение с помощью оператора присваивания.
Пример
Задать значение переменной х в Pascal можно следующими способами:
x := 5; - в ячейку с именем х будет помещено число 5.
x := random(10); - в ячейку с именем х будет помещено какое-то число от 0 до 9.
read (x); - в ячейку с именем х будет помещено то число, которое пользователь введет с клавиатуры;
read (f, x); - будет открыт файл f и текущее число из этого файла будет помещено в ячейку с именем х.
Оператор присваивания обозначается обычно знаком «=» или знаком «:=». Слева от знака присваивания может стоять только имя переменной, а справа может находиться либо константа, либо имя переменной, либо выражение соответствующего типа. Выражение, в свою очередь, может содержать константы, имена переменных, знаки операций, стандартные функции, круглые скобки для указания порядка выполнения операций.
Пример
Правильно записанные в Pascal операторы присваивания (типы переменных как в предыдущем примере):
c:=5; c:=2*b+3*a–6; c:=sqr(a–b); c:=round(x/y); c:=c+1;
z:=10,2; z:=2*x+a; z:=sqrt(y); z:=x+sqrt(sqr(x)+sqr(y-2))/(sqr(y)+1);
Ошибочные операторы присваивания:
c:=x; - переменной целого типа нельзя присвоить вещественное значение.
c:=a/b; c:=sqrt(b); - результат операции «/» и функции «sqrt» вещественного типа.
z:= a mod b; - операция «mod» допустима для переменных целого типа.
с+1 := 6; - слева от знака присваивания может стоять только имя переменной.
Важное замечание. В математике выражение «с=с+1» не будет справедливым ни для какого значения с. В программе такого рода операторы (с:=с+1), где одна и та же переменная встречается справа и слева от знака присваивания, используются достаточно часто. Дело в том, что в математике и справа и слева от знака равенства подразумевается одна и та же переменная в одно и то же время. В программировании переменная означает одну и ту же ячейку памяти, но в разное время. При выполнении оператора с:=с+1; сначала идет обращение к ячейке памяти с; к числу, находящемуся в этой ячейке прибавляется 1; затем полученное значение помещается в ту же ячейку с.
Блок-схема и программа задачи 1. var x, y, z : real; begin read(x, y); z:=x+sqrt(sqr(x)+sqr(y-2))/(sqr(y)+1); write(‘z=’, z); end. |  |
Задача 2 сводится к вычислению среднего арифметического трёх чисел. Обозначим переменные для значений температур t9, t12, t15 и Sr для результата. Поскольку будет операция деления, то Sr может быть только вещественного типа.
Блок-схема и программа задачи 2. var t9, t12, t15: integer; Sr : real; begin read(t9, t12, t15); Sr:=(t9+t12+t15)/3; write(‘Средняя температура =’, Sr); end. |  |
Особенность решения задачи 3 заключается в том, что числа в памяти компьютера хранятся в двоичном коде. Поэтому нужны специальные действия, чтобы выделить цифры числа. Например, число единиц можно получить, если взять остаток от деления на 10, а число десятков в двузначном числе – это целое частное от деления на 10.
Другая особенность заключается в том, чтобы получить случайное число. Компьютер работает только по программам. Поэтому ни о какой «случайности» вести речь не приходится. Но для отладки программ иногда бывает полезно, чтобы значения переменных не вводились пользователем, а выбирались «случайным образом» из некоторого заданного диапазона. Для этого служит стандартная функция random(b-a)+a, которая по специальному алгоритму позволяет выбрать какое-нибудь число из диапазона [a, b], где a и b – конкретные целые числа. Для нашей задачи а=10, b=99.
Обозначим Х – случайное двузначное число, d1 и d2 – цифры этого числа.
Блок-схема и программа задачи 3. var X, d1, d2 : integer; begin X := random(89)+10; d1 := X mod 10; d2 := X div 10; write(‘Сумма цифр числа ’, X, ‘=’, d1+d2); end. |  |
Решение задачи 4.
Слово – это строка символов, каждый из которых имеет свой код в таблице кодировки. Обозначим переменную, в которой будет хранится строка, S.
Особенности решения задачи 4 состоят в следующем:
- поскольку можно ввести строку произвольной длины, то нужно уметь определять количество символов в ней. Для этого служит стандартная функция length(s);
- выделить символы из строки можно с помощью стандартной функции copy (s, k, n), но один символ проще выделить, если указать его номер в квадратных скобках после имени строки: s[1] – первый символ строки s, s[n] – n-ый символ строки s и т.п.;
- поменять местами значения двух ячеек памяти можно с помощью вспомогательной переменной, например: x:=s[1]; s[1]:=s[2]; s[2]:=x;. Это позволяет не потерять значения при переприсваивании (чтобы лучше понять, представьте себе ваши действия, если у Вас есть стакан с кофе и чашка с чаем и Вам нужно поменять содержимое посуды).
Обозначим S – строка символов, n – количество символов в строке и одновременно номер последнего символа, Х – вспомогательная переменная символьного типа.
Блок-схема и программа задачи 4. var S : string; n : integer; X : char; begin read(S); n:= length(S); X := S[1]; S[1] := S[n]; S[n] := X; write(‘Получилась строка ’, S); end. |  |
Еще раз повторим, что общим для всех этих задач является то, что алгоритмы их решения являются линейными структурами, когда все действия выполняются строго последовательно друг за другом ровно один раз и никакие действия, указанные в алгоритме, не пропускаются.
ПРАКТИКУМ
1 | Наберите, отладьте и выполните программы, приведенные в тексте параграфа. Проанализируйте допущенные Вами ошибки и полученные результаты. |
2 | Составьте алгоритмы и программы для решения следующих задач: Две точки на плоскости заданы своими координатами. Найти расстояние между точками. Даны координаты вершин треугольника на координатной плоскости. Найти периметр и площадь треугольника. Определите сумму цифр случайного целого трёхзначного числа. Известно, что X кг шоколадных конфет стоит Sx рублей, а Y кг карамели стоит Sy рублей. Определить, во сколько раз 1 кг шоколадных конфет дороже 1 кг карамели. Два автомобиля находятся на расстоянии S и движутся навстречу друг другу со скоростями V1 и V2. Определить, на каком расстоянии они будут друг от друга через T часов, если после встречи они продолжают двигаться в том же направлении (разъезжаются). |