- Методы программирования
- а. Вычисление значения арифметического выражения, заданного в инфиксной форме.
- Теория
- Формулировка задания
- Примеры
- b. * Выполнение программы вычислений
- Формулировка задания
- Примеры
- 1.3.2. Правила вычисления выражений
- 1.3.3. Встроенные функции в Турбо Паскаль
- 1.3.4. Описание констант и переменных
- 1.3.5. Операторы в Турбо Паскаль
- 1. Операции вычисления
Методы программирования
Задание состоит из двух частей, первая из которых обязательна для выполнения, вторую необходимо выполнить для получения отличной оценки. Срок сдачи задания — 9 октября.
а. Вычисление значения арифметического выражения, заданного в инфиксной форме.
Теория
Говорят, что выражение записано в инфиксной форме, если знак операции (сложения, умножения, вычитания либо деления) стоит между своими аргументами, например, 5 + 7 . Каждая операция имеет приоритет выполнения (сначала выполняются умножение и деление, затем сложение и вычитание). Для изменения приоритета выполнения операций используются круглые скобки.
Вычислять значение выражения, записанного в инфиксной форме, неудобно. Проще сначала перевести его в постфиксную, или обратную польскую запись, в которой знак операции записывается после своих операндов, например, 5 7 + .
Для перевода выражения из инфиксной формы в постфиксную с учетом приоритетов операций и скобок существует простой алгоритм (Дейкстры). Алгоритм работает со стеком, в котором хранятся знаки операций. Сначала стек пуст. На вход алгоритму подается последовательность лексем (числа, скобки или знаки операций), представляющая некоторое арифметическое выражение, записанное в инфиксной форме. Результатом работы алгоритма является эквивалентное выражение в постфиксной форме. Вводятся приоритеты операций: открывающая скобка имеет приоритет 0 , знаки + и – — приоритет 1 и знаки * и / — приоритет 2 .
- Если не достигнут конец входной последовательности, прочитать очередную лексему.
- Если прочитан операнд (число), записать его в выходную последовательность.
- Если прочитана открывающая скобка, положить ее в стек.
- Если прочитана закрывающая скобка, вытолкнуть из стека в выходную последовательность все до открывающей скобки. Сами скобки уничтожаются.
- Если прочитан знак операции, вытолкнуть из стека в выходную последовательность все операции с большим либо равным приоритетом, а прочитанную операцию положить в стек.
Заметим, что порядок операндов в выходной последовательности не отличается от порядка операндов в исходной последовательности. В выходной последовательности отсутствуют скобки.
Для вычисления значения выражения, записанного в постфиксной форме, можно использовать описанный далее алгоритм. На вход подается последовательность лексем (числа или знаки операций), представляющая некоторое арифметическое выражение, записанное в постфиксной форме. Результатом работы алгоритма является значение этого выражения.
- Если не достигнут конец входной последовательности, прочитать очередную лексему.
- Если прочитан операнд (число), положить его в стек.
- Если прочитан знак операции, вытолкнуть из стека два операнда и положить в стек результат применения прочитанной операции к этим операндам, взятым в обратном порядке.
Ясно, что эти два алгоритма можно объединить, если в первом алгоритме вместо вывода в выходную последовательность передавать лексему сразу на вход второму алгоритму и обрабатывать «на лету» (придется поддерживать одновременно два стека).
Формулировка задания
Во входном файле input.txt в единственной строке находится арифметическое выражение, записанное в инфиксной форме (используются только целые положительные числа и четыре операции + , – , * , / . В выходной файл output.txt записать значение этого выражения. Стеки реализовывать при помощи связанных списков (операции добавления в начало списка и удаления первого элемента, см. теорию по заданию 1.
Примеры
b. * Выполнение программы вычислений
Формулировка задания
Во входном файле input.txt находится программа, написанная на специальном языке программирования. В языке существуют два вида операторов: оператор присваивания VARIABLE=EXPRESSION , где VARIABLE — имя переменной, состоящее из букв и цифр, не начинающееся с цифры и длиной не более 5 символов, а EXPRESSION — выражение в инфиксной форме, содержащее целые числа, скобки, знаки операций ( + , – , * , / ) и переменные и не содержащее пробелов. Значением любой переменной изначально считается 0 , оператор присваивания изменяет значение переменной на значение выражения. Второй вид оператора — оператор вывода на экран: PRINT EXPRESSION , где PRINT — служебное слово, а EXPRESSION определяется так же, как и для оператора присваивания. Этот оператор выводит в файл output.txt значение выражения EXPRESSION и переводит строку.
Примеры
1.3.2. Правила вычисления выражений
Выражение – это синтаксическая единица языка, определяющая вычисление некоторых значений. Выражение на языке программирования Паскаль формируется из констант, переменных, функций, знаков операций и круглых скобок.
Доминантным моментом в вычислении выражения выступает порядок обработки элементов, составляющих выражение.
В Паскале весь набор допустимых операторов, разбит на шесть равноправных групп, каждой из которых присвоен определённый приоритет действия.
Операции, входящие в группы с данным приоритетом
1.3.3. Встроенные функции в Турбо Паскаль
Кроме этих стандартных операций, в Паскаль встроены специальные подпрограммы-функции, которые программисты могут использовать в выражениях как готовые элементы. Библиотека Турбо Паскаля содержит значительный набор внешних функций, которые подключаются автоматически при компиляции или при исполнении программы. Эти внешние процедуры и функции сгруппированы в системный блок – модуль System. Для пользователя внешний блок System, входящий в состав библиотеки Турбо Паскаль, — «прозрачный», то есть его функции применяются аналогично встроенным операторам. Функции системного блока System, применяемые при обработке числовых значений приведены в таблице 4.
Математические функции
Функции Турбо Паскаля
Рассмотрим дополнительные операции над вещественными числами:
Trunc (x) – дробная часть вещественного числа отбрасывается и выдается целый остаток;
Int (x) – возвращает целую часть аргумента;
Round (x) – округляет вещественное число до целого порядкового типа;
Frac (x) – результатом является дробная часть значения аргумента.
1.3.4. Описание констант и переменных
Описание констант имеет вид:
Описание переменных имеет вид:
- integer – целый;
- real – вещественный;
- char – символьный;
- string – строковый;
- Boolean – логический:
- false – ложь;
- true – истина.
- простые:
- оператор присваивания;
- пустой оператор;
- оператор ввода;
- оператор вывода;
- составной оператор;
- сложные:
- условный оператор;
- циклические операторы;
- оператор выбора (варианта);
- оператор присоединения в записях;
- оператор перехода.
- READ (a1, a2. ak), где a1, a2. ak – список вводимых параметров. Здесь, каждое вводимое значение присваивается последовательно данным переменным.
- READLN (a1, a2. ak) – каждое вводимое значение присваивается последовательно переменным a1, a2. ak, после чего происходит переход на новую строку.
- READLN – обеспечивает пропуск одной строки и переход к началу новой строки.
- WRITE (b1, b2. bk), где b1, b2. bk – список переменных подлежащих выводу. Выводимые значения размещаются в одной строке.
- WRITELN (b1, b2. bk) – осуществляется вывод значений b1, b2. bk и после вывода последнего значения осуществляется переход на новую строку.
- WRITELN – обеспечивает пропуск строки в файле и переход к новой строке.
1.3.5. Операторы в Турбо Паскаль
Операторы языка программирования Турбо Паскаль можно разделить на следующие операторы:
Оператор присваивания Оператор присваивания обозначается знаком “:=”. Формат оператора присваивания: V := A; где V – имя переменной, := — знак присваивания, A – выражение. Тип выражения должен соответствовать типу переменной. Допускается присваивание переменной вещественного типа значения выражения целого типа, но не наоборот! Для преобразования значения вещественного типа в значение целого типа предназначены функции TRUNC(X) – нахождение целой части X и ROUND(X) – округление X в сторону ближайшего целого. Например, A := 5; B := A*A-2; C := ‘A’; Операторы ввода и вывода Операторы ввода и вывода служат для организации обмена информацией между внешними устройствами (дисплей, клавиатура, принтер) и памятью ЭВМ. Оператор ввода имеет следующие форматы:
Примечание. Ввод переменных логического типа недопустим. Числовые значения задаются после запуска программы через пробел (или ввод). Например, ввести данные A=5, B=1.7, C = ‘L’. … READ (A, B, C); … 5_1.7_L /после запуска программы на выполнение/ Оператор вывода имеет следующие форматы:
Примечание. В качестве выводимых параметров могут быть целые, вещественные, символьные и логические переменные и константы. Пример1.1. Вычислить значение выражения по формуле.
Рекомендуется числитель и знаменатель вычислить как отдельные выражения: A := exp (abs(x-z)) + sqr (sin (sqr(z)*z)); B := sin (x) / cos (x) – sqrt (abs(cos (sqr(x))-exp(z))); Y := A/B; З
адача1.1. Рассмотрим разработку алгоритма и программы вычисления площади треугольника по формуле Герона. Блок-схема алгоритмаЛистинг программы PROGRAMTREUG; USESCRT; VAR A, B, C, P, S : REAL; BEGIN CLRSCR; WRITELN(‘Введите стороны треугольника’); READLN (A, B, C); P := (A+B+C)/2; S := SQRT(P*(P-A)*(P-B)*(P-C)); WRITELN(‘Площадь треугольника равна — ’,S); READLN; END. Задача1.2. Ввести с клавиатуры четырёхзначное число и найти произведение цифр этого числа. Листинг программы PROGRAM PRIMER1; USES CRT; VAR A, A1, A2, A3, A4, A5, A6, A7 : INTEGER; BEGIN WRITELN(‘Введите целое 4-хзначное число’); READLN (A); // 4375 A1 := A MOD 10; // 5 WRITELN (A1); A2 := A DIV 10; // 437 A3 := A2 MOD 10; // 7 WRITELN (A3); A4 := A2 DIV 10; // 43 A5 := A4 MOD 10; // 3 WRITELN (A5); A6 := A DIV 1000; // 4 WRITELN (A6); A7 := A1 * A3* A5*A6; // 420 WRITELN (A1, ‘*’, A3, ‘*’, A5, ‘*’, A6, ‘=’, A7); WRITELN; END.
1. Операции вычисления
сложение — \(+\) \(5+5=10\) вычитание — \(-\) \(9-4=5\) деление обычное — \(/\) \(5/2=2.5\) целочисленное деление, определяет целую часть от деления — \(//\) \(5//2=2\) определяет остаток от деления — % 5 % 2 = 1 возведение в степень — \(**\) \(3**\) \(2=9\) Знаки \(>>>\) — это приглашение к работе. В таком режиме научимся записывать выражения и определять результат.
После значков \(>>>\) запишем выражение на языке программирования, оно будет выглядеть так: 5 + 2 \(/6~\) − 4 ∗ ∗ 2 .