Файл: Обзор языков программирования высокого уровня ( ЯЗЫКИ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ ).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 31.03.2023

Просмотров: 81

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

ProgramOp_goto;

usescrt;

labelm1;

var

a: integer;

begin

a:=5;

goto m1;

a:=a*10;

m1: writeln('a = ', a);

end.

Рассмотрим последовательность действий данной программы. В первую очередь переменной а присваивается значение 5. Затем в программе встречается оператор безусловного перехода, который посылает компьютеру сигналу о том, что следующий оператор, подлежащий исполнению, помечен меткой m1. Следовательно, дальнейшие действия программы – вывод результата на экран, а не умножение значения переменной на 10. Важно отметить, что оператор a:=a*10 в данной программе не исполнится никогда.

Результат исполнения данного кода приведен на рисунке 11.

Рисунок 11 – Пример работы с оператором безусловного перехода

Другой вид оператора перехода – условный переход. Данный оператор служит для выбора одной из двух альтернативных ветвей алгоритма в зависимости от значения некоторого условия [20].

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

  • логическое сложение – or;
  • логическое умножение – and;
  • отрицание – not;
  • исключающее «ИЛИ» - xor.

В языке Паскаль существуют условные операторы с одной и двумя ветвями. Если в условном операторе прописаны две ветви, такой оператор называется полным (см. рисунок 12), в противном случае – неполным (см. рисунок 13) [10].

Рисунок 13 – Полное ветвление

Рисунок 14 – Неполное ветвление

В качестве примера программы, использующей операторы ветвления, рассмотрим следующий код:

Program Op_perehod;

uses crt;

var

a,b,c: integer;

begin

write('Введите стороны треугольника: ');

read(a,b,c);

if (a>=(b+c)) or (b>=(a+c)) or (c>=(a+b))

then writeln ('Такого треугольника не существует!')

else

begin

if (a<b) and (a<c) then writeln ('Минимальнаясторонаа = ',a)

else if (b<a) and (b<c) then writeln ('Минимальнаясторона b = ',b)

else writeln ('Минимальная сторона с = ',c);

if ((a+b+c)>50) then writeln('Периметрбольше 50');

end;

end.

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


Для примера использования неполного ветвления реализована проверка периметра треугольника. Так, если он больше 50, программа выдаст соответствующее сообщение, в противном случае просто завершит свою работу (см. рисунок 16).

Рисунок 15 – Пример работы оператора полного ветвления

Рисунок 16 – Пример работы оператора неполного ветвления

2.4 Операторы выбора

В том случае, когда в условном операторе необходимо использовать больше, чем две ветви, можно пойти двумя путями:

  • использовать вложенные условия;
  • использовать оператор выбора.

Очевидно, использование вложенных условий является не самым удобным способом решения подобных задач, поэтому в языке Паскаль был создан оператор выбора Case, синтаксис которого выглядит следующим образом:

Case<ключ>of

C_1: <операторы_1>;

C_2: <операторы_2>;

C_N: <операторы_N>;

else<операторы 0>

end;

В данной записи ключом называется выражение порядкового типа, в зависимости от значения которого и принимается решение. Значениями C_1, C_2, …, C_N обозначены константы - возможные варианты значения ключа, которые необходимо рассмотреть при вычислениях. Данным значениям соответствуют блоки операторов, которые исполняются, если значение ключа совпадает со значением C. Если же значение ключа не совпало ни с одной из указанных констант, выполнится блок <операторы_0>. Важно отметить, что этот блок может отсутствовать [15].

В качестве примера использования оператора выбора рассмотрим задачу определения времени года по введенному месяцу[13]:

Program Op_vybor;

uses crt;

var

m: integer;

begin

write('Введите номер месяца: ');

readln(m);

case m of

1,2,12: writeln('Время года - зима');

3,4,5: writeln('Время года - весна');

6,7,8: writeln('Время года - лето');

9,10,11: writeln('Время года - осень');

elsewriteln('Такого месяца не существует!');

end;

end.

В данной программе реализован оператор выбора, который в качестве констант использует сразу несколько значений, операторы для которых идентичны. Данный подход является очень удобным и позволяет сократить число ветвей программы с 13 до 5. Результат выполнения приведенного кода представлен на рисунке 17.

Рисунок 17 – Пример работы с оператором выбора


2.5 Операторы цикла

Циклическим называется такой алгоритм, в котором задана некоторая последовательность действий для многократного исполнения. Эта последовательность действий называется телом цикла. Заметим, что тело цикла указано в алгоритме один раз, но исполняться оно может многократно. Однократное исполнение тела цикла называется итерацией. В языках программирования высокого уровня, как правило, используют три вида циклов:

  • цикл с предусловием – while. Состоит из условия цикла и его тела (см. рисунок 18). Пока условие цикла будет иметь значение «истина», тело цикла будет исполняться.

Рисунок 18 – Блок-схема цикла с предусловием

Как видно из блок-схемы, если условие цикла с самого начала имеет значение «Ложь», то тело цикла ни разу не будет исполнено. Если в процессе исполнения цикла условие всегда принимает значение «Истина», то цикл начинает исполняться бесконечно – происходит зацикливание. Это означает, что в алгоритме допущена ошибка. Пример использования цикла с предусловием:

Program Op_pred;

uses crt;

var

N, p: integer;

begin

write('Введитецелоечисло N = ');

readln(N);

writeln('Степени числа 2, не превосходящие ', N);

p:= 2;

while p <= N do

begin

write(p,' ');

p:= p * 2;

end;

writeln();

end.

Данная программа запрашивает у пользователя целое число, а затем выводит все степени двойки, которые не превосходят заданное число. Результат работы программы представлен на рисунке 19 [1];

Рисунок 19 – Пример работы цикла с предусловием

  • цикл с постусловием – repeat-until. В данном случае сначала выполняется тело цикла, после чего проверяется выражение, записанное в блоке until (см. рисунок 20).

Рисунок 20 – Блок-схема цикла с постусловием

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

ProgramOp_post;

usescrt;

varm, N, sum: integer;

begin

write('N = ');

read(N);

m:=0;

sum:=0;

repeat

m:=m+1;

sum:=sum+m;

until m=N;

writeln ('Сумма первых ',N,' чисел равна ', sum);

end.

В данной программе определяется сумма первых N натуральных чисел. N задается пользователем с клавиатуры [12];

Рисунок 21 - Пример работы цикла с постусловием


  • цикл с параметром – for. Данный цикл выполняется заданное количество раз. Существует две формы записи данного цикла в зависимости от того, каким образом должна изменяться переменная цикла. Если она должна увеличиваться, используется запись:

for<переменная_цикла>:= <начальное_значение>to<конечное_значение>do<операторы>.

Если же переменная цикла должна уменьшаться, используется другая запись:

for<переменная_цикла>:= <начальное_значение>downto<конечное_значение>do<операторы> [14].

Чаще всего данный цикл используется при обработке массивов. Рассмотрим пример подобной программы:

Program Op_param;

uses crt;

var i, n, sum, a: integer;

begin

write('N = ');

readln(n);

write('Введите ',n,' элементов массива: ');

sum:=0;

for i:=1 to n do

begin

read(a);

sum:=sum+a;

end;

writeln('Сумма введенных элементов = ', sum);

end.

В данной программе у пользователя запрашивается размерность массива, а затем и сам массив. В результате выполнения программы считается сумма введенных элементов. Результат выполнения приведенного кода представлен на рисунке 22.

Рисунок 22 - Пример работы цикла с параметром

В данной главе рассмотрены основные операторы языков программирования высокого уровня на примере языка Паскаль.

ГЛАВА 3 ПРИМЕНЕНИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ ВЫСОКОГО УРОВНЯ ПРИ ИСПОЛЬЗОВАНИЕ АВТОМАТНОЙ ГРАММАТИКИ ПРИ ПОСТРОЕНИИ ЛЕКСИЧЕСКОГО АНАЛИЗАТОРА

Мы живем в XXI веке - столетии тотальной информатизации и автоматизации окружающих нас процессов. Информационные технологии и производство компонент ЭВМ за последние десятилетия совершили небывалый прорыв.

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

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


Чтобы код программы, написанной программистом на языке программирования, мог быть выполнен ЭВМ, должны осуществиться компиляция и компоновка.

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

В этой научной работе авторы ставят задачу ознакомления читателя с этапами лексического анализа и демонстрации примера построения простейшего лексического анализатора для конкретного фрагмента программы на языке программирования Java.

На основе приведенной теории и примера возможно построение лексического анализатора любого языка программирования со сколь угодно сложными конструкциями.

Ознакомиться с основными терминами теории регулярных грамматик. Рассмотреть принципы работы лексических анализаторов. Построить собственный лексический анализатор для цикла с предусловием на языке Java на основе автоматной грамматики.

Лексический анализатор - часть компилятора, выполняющая разбор входной последовательности символов и выделяющая в ней лексемы исходного языка. В результате работы лексического анализатора создается последовательность токенов - классифицированных по типу лексем [2].

Лексема - последовательность допустимых символов языка программирования, имеющая смысл.

Символы языка делятся на терминальные и нетерминальные. Терминальный символ непосредственно присутствует в «словах» языка, соответствующего грамматике, и имеет неизменяемое значение. Нетерминальный символ обозначает какую-либо сущность языка (например выражение) и не имеет конкретного символьного значения.

В зависимости от языка можно выделить различные типы лексем. Для языков программирования высокого уровня можно выделить следующие виды:

  • ключевые слова (begin, while, do, for),
  • идентификаторы (i, j,Test),
  • константы(123,"name",1E-5),
  • знаки операций (=,++,<<),
  • разделители(,:.)

В процессе построения лексического анализатора языка составляются таблицы идентификаторов и лексем. Таблица лексем содержит все их возможные виды, любая лексема может повторится несколько раз. Таблица идентификаторов содержит только идентификаторы и константы, каждые из которых встречаются только один раз [3].

Таблица 1.

Пример таблицы лексем

Индекс

Символ

Категория

Тип

Комментарий

0

while

ключевое слово

while

начало цикла

1

for

ключевое слово

for

начало цикла

2

<

спец. символ

rel

операция сравнения

3

>

спец. символ

rel

операция сравнения

4

+

спец. символ

ao

операция сложения

5

-

спец. символ

ao

операция вычитания

6

=

спец. символ

as

операция присваивания