Программирование на языках высокого уровня
Данный раздел содержит большой практический материал для начального изучения программирования. Задачи ориентированы, главным образом, на использование процедурных языков программирования, из которых в настоящее время наиболее распространенными являются Паскаль, Бейсик и СИ. Чаще всего именно эти языки изучаются на уроках информатики.
С точки зрения авторов, наиболее подходящим языком для первоначального освоения программирования является язык Паскаль. Как известно, автор Вирт создавал его прежде всего как учебный язык. Позднее фирмой Borland была разработана система программирования Турбо-Паскаль, расширившая область применения языка и развившая сам язык программирования. Современные версии Турбо-Паскаля достаточно широко распространены в компьютерных классах учебных заведений.
Предлагаемые в данном разделе задачи могут решаться с использованием любого языка программирования. Однако весь пояснительный материал и примеры программ приведены на Паскале. Таким образом, помимо задач, раздел содержит краткий справочник по программированию на Паскале. Описание языка не является полным. За более подробными сведениями о Паскале следует обращаться к специальной литературе.
Некоторые тематические разделы поделены на части, отличающиеся уровнем сложности задач. Эти части обозначены буквами А, В и т. д. по возрастанию сложности.
1. Программирование линейных алгоритмов
Программы с линейной структурой составляются из операторов присваивания, ввода, вывода, обращения к процедурам. Оператор присваивания можно назвать основным в любом языке программирования.
Оператор присваивания:
<переменная>:= <выражение>
Оператор выполняется следующим образом. Вычисляется значение <выражения>, после чего <переменная> получает вычисленное значение. При этом тип выражения должен быть совместим с типом переменной.
Примеры оператора присваивания:
X:=(Y+Z)/(2+Z*10)-1/3;
LogPer:=(A>B) and (C<=D).
Выражение может включать в себя константы, переменные, знаки операций, функции, скобки. В результате вычисления выражения получается значение определенного типа.
Тип выражения определяется типом полученного значения.
Арифметическое выражение — выражение числового типа (целого или вещественного). Идентификатор целого типа: integer, вещественного типа: real.
Арифметические операции бывают унарными и бинарными. К унарным относится операция изменения знака. Ее формат: – <величина>.
В следующей таблице представлены бинарные арифметические операции Паскаля. А и В обозначают операнды, для типов величин использованы обозначения: I — целый, R — вещественный.
Выражение | Тип операнда | Тип рез-та | Операция |
А + В | R, R | R | Сложение |
I, I | I | ||
I, R R, I | R | ||
А – В | R, R | R | Вычитание |
и | I | ||
I, R R, I | R | ||
А * В | R, R | R | Умножение |
I, I | I | ||
I, R R, I | R | ||
А/В | R, R | R | Вещественное деление |
I, I | R | ||
I, R R, I | R | ||
A div В | и | I | Целое деление |
A mod В | I, I | I | Остаток от целого деления |
Стандартные математические функции Паскаля представлены в следующей таблице:
Обращение | Тип аргумента | Тип рез-та | Функция |
abs(x) | I, R | I, R | Модуль аргумента |
arctan(x) | I, R | R | Арктангенс (радианы) |
cos(х) | I, R | R | Косинус (х в радианах) |
ехр(х) | I, R | R | ех — экспонента |
frac(x) | I, R | R | Дробная часть х |
int(x) | I, R | R | Целая часть х |
ln(x) | I, R | R | Натуральный логарифм |
Random | R | Псевдослучайное число в интервале [0,1] | |
random(x) | I | I | Псевдослучайное число в интервале [0,х] |
round(x) | R | I | Округление до ближайшего целого |
sin(x) | I, R | R | Синус (х - в радианах) |
sqr(x) | I, R | R | Квадрат х |
Sqrt(x) | I, R | I | Корень квадратный |
Trunk(х) | R | I | Ближайшее целое, но не превышающее х по модулю. |
Старшинство операций (в порядке убывания приоритета):
Þ вычисление функции;
Þ унарный минус;
Þ *,/, div, mod;
Þ +, -
Возведение положительного числа в вещественную степень следует производить, используя следующее математическое тождество:
. На Паскале это записывается так:
Exp(y*ln(x))
Записать математические выражения в виде арифметических выражений на Паскале возможно следующим образом:

Ввод данных с клавиатуры производится путем обращения к стандартным процедурам:
Read(<список ввода>) ReadLn(<список ввода>)
Элементы списка ввода — идентификаторы переменных. Вводимые значения отражаются на экране. При выполнении оператора пользователь набирает на клавиатуре соответствующую последовательность значений, разделяя их пробелами.
Вывод данных на экран производится путем обращения к стандартным процедурам:
Write(<список вывода>) WriteLn(<список вывода>).
Элементы списка вывода — константы, переменные, выражения, форматы вывода.
Структура программы на Паскале:
Program <Имя программы>;
Label <раздел описания меток>;
Const <раздел описания констант>;
Туре <раздел описания типов>;
Var <раздел описания переменных>;
Procedure (Function) <раздел описания подпрограммы>;
Begin
<раздел операторов>
End.
Для любой программы обязательным является лишь раздел операторов. Все программные объекты (константы, переменные, типы и пр.) должны быть описаны в соответствующих разделах описаний.
Здесь и в дальнейшем служебные слова Паскаля будут выделяться полужирным шрифтом. Служебными называются слова, значения которых в языке однозначно определены.
Пример 1. Скорость первого автомобиля v1 км/ч, второго — v2 км/ч, расстояние между ними s км. Какое расстояние будет между ними через t ч, если автомобили движутся в разные стороны?
Решение. Согласно условию задачи искомое расстояние s1 = s + (v1 + v2)t (если автомобили изначально двигались в противоположные стороны) или
s2=|(v1+v2)t-s| (если автомобили первоначально двигались навстречу друг другу).
Программа организует ввод исходных данных, вычисление искомых величин по формулам и вывод их на экран. Все величины в программе — вещественного типа.
Program Car;
Var V1, V2, T, S, SI, S2 : Real;
Begin
Write (' Введите скорости автомобилей, расстояние между ними и время движения:' ) ;
ReadLn (V1, V2, S, Т) ;
S1:= S+(V1+V2)*T;
S2:= Abs((V1+ V2)*T-S);
WriteLn('Расстояние будет равно ',S1:7:4,'км или',S2:7:4,' км' )
End.
Пример 2. Выполнить вычисление по формуле:

Решение:
Program Expession;
Var T, К, M, L, X, Y, Z : Real;
Begin
Write {'Введите значения переменных Т, К, М, L, X, Y:');
ReadLn (T, K,M, L, X,Y) ;
Z:=sqr((T*T-K*K)/(sqr(sqr(M))-exp(5*ln(L))))+sqrt(abs((sqrt(X)+Y)/(12-abs(X))+4));
WriteLn ('Значение выражения: ', Z:12:6)
End.
Логические выражения в результате вычисления принимают логические значения true или false. Операндами логического выражения могут быть логические константы, переменные логического типа, отношения. Идентификатор логического типа в Паскале: boolean.
Логические операции. В Паскале имеются 4 логические операции: отрицание — NOT, логическое умножение — AND, логическое сложение — OR, исключающее «или» — XOR. Результаты логических операций для различных значений операндов приведены в таблице. Использованы обозначения: Т — true, F — false.

Приоритеты логических операций:
not | and | or | xor |
Примеры логических выражений:
True | False | А>В | (А=В) and (C<=D) |
Операции отношений (= , <>, >=, <=, <, >) имеют более низкий приоритет, чем логические операции, поэтому их следует заключать в скобки при использовании по отношению к ним логических операций.
Пример 3. Составить программу, по которой выведется значение true, если точка с заданными координатами (х, у) лежит внутри заштрихованной области, и false — в противном случае.

Решение: Рассматриваемая область состоит из двух частей, каждая из которых описывается системой неравенств.
1-я часть: х <= 0; х2 + у2 <= 9; у >= - х - 3.
2-я часть: х >= 0; х2 + у2 <= 25.
Точка с координатами (х, у) лежит в заштрихованной области, если она принадлежит 1-й или 2-й части.
Программа вводит координаты точки, вычисляет логическое выражение, определяющее принадлежность точки области и выводит полученную логическую величину на экран.
Program Point;
Var X, Y : real; L: boolean;
Begin
Write ('Введите X:' ); Readln(X);
Write ('Введите Y:' ) ; ReadLn(Y);
L:= (X<=0) and (Sqr(X)+Sqr(Y)<=9) and (Y>=-X-3) or (X>=0) and (Sqr(X)+Sqr(Y)<=25); WriteLn (' Точка лежит в заданной области? ' , L)
End.


