Наиболее часто встречающиеся операции над скалярными типами данных реализованы в языке Паскаль с помощью встроенных (иногда говорят — стандартных) функций и процедур. Наиболее известные функции над переменными целого, вещественного, логического и литерного типов приведены в таблицах 8 – 11.
Таблица 8. Встроенные арифметические функции
Функция
| Содержание
|
ABS(X)
| Модуль (абсолютная величина) X, |Х|
|
ARCTAN(X)
| Главное значение арктангенса X, ArctgX
|
COS(X)
| Косинус от X, заданного в радианах, Cos(X)
|
ЕХР(Х)
| Показательная функция от X, ех
|
FRAC(X)
| Дробная часть от X, {X}
|
INT(X)
| Целая часть числа X в вещественной форме, ]Х[
|
LN(X)
| Натуральный логарифм от X, Ln(X)
|
SIN(X)
| Синус от X, заданного в радианах, Sin(X)
|
SQR(X)
| Квадрат (вторая степень) числа X, т.е. X2
|
SQRT(X)
| Корень квадратный из X,
|
RANDOM(N)
| Равномерно распределенное псевдослучайное целое число от 0 до N
|
RANDOM
| Равномерно распределенное псевдослучайное вещественное число от 0 до 1
|
ROUND(X)
| Возвращает значение X, округленное до ближайшего целого числа
|
TRUNC(X)
| Возвращает ближайшее целое число, меньшее или равное X, если X > 0, и большее или равное X, если X < 0
|
В таблице 9 приведены примеры вычислений по функциям INT, ROUND, TRUNC пояснения особенностей их использования.
Таблица 9
Функция
| X
| INT(X)
| ROUND(X)
| TRUNC(X)
|
Тип
| REAL
| REAL
| INTEGER
| INTEGER
|
Номер примера:
|
|
|
|
|
| 123.44
| 123.0
|
|
|
| 34.50
| 34.0
|
|
|
| 1.70
| 1.0
|
|
|
| -25.14
| -25.0
| -25
| -25
|
| -10.70
| -10.0
| -11
| -10
|
| -0.41
| 0.0
|
|
|
| -0.50
| 0.0
| -1
|
|
Таблица 10. Встроенные логические (булевские) функции
Функция
| Содержание
|
ODD(N)
| N — целочисленная переменная; результат TRUE, если N — нечетное число, и FALSE, если N — четное число
|
EOF(F)
| Возвращает значение TRUE, если достигнут конец файла F, в противном случае FALSE
|
EOLN(F)
| Принимает значение TRUE, если при чтении текстового файла F достигнут конец текущей строки, FALSE — в противном случае
|
Таблица 11. Встроенные функции над перечислимыми типами данных
SUCC(s)
| SUCC('O')
| 'П'
| Возвращает значение следующего за S данного перечисляемого типа
| совпадает с типом аргумента S
|
SUCC(-90)
| -89
|
SUCC('a')
| 'b'
|
PRED(s)
| PRED('П')
| 'О'
| Возвращает значение предшествующего S в порядке возрастания в списке
| совпадает с типом аргумента S
|
PRED(-90)
| -91
|
PRED('b')
| 'a'
|
ORD(s)
| ORD('Щ')
|
| Возвращает порядковый номер идентификатора S в списке
| INTEGER
|
ORD('4')
|
|
ORD(FALSE)
|
|
CHR(s)
| CHR(87)
| 'W'
| Возвращает литеру с кодом S, если она существует
| CHAR
|
CHR(20l)
| 'r'
|
CHR(53)
| '5'
|
1.4. Структура программы
Программист вводит текст программы, произвольно располагая строки на экране. Отступ слева выбирает сам программист, чтобы программа была более читабельной. В одной строке допускается писать несколько операторов. Длинные операторы можно переносить на следующую строку. Перенос допускается в любом месте, где можно сделать пробел. Максимальная длина строки не должна превышать 127 символов. Из соображений наглядности, удобства просмотра и отладки программы рекомендуется длину строки ограничивать 80 символами. Программы имеют жесткую структуру, описанную в таблице 12.
Таблица 12. Структура программы
Фрагмент программы
| Содержание
| Примечание
|
Заголовок
| Program <имя программы>
| Необязательный
|
Раздел 0
| USES, описание модулей, библиотек
| Разделы описаний программного блока
|
Раздел I
| LABEL, описание меток
|
Раздел 2
| CONST, описание констант
|
Раздел 3
| TYPE, описание типов данных
|
Раздел 4
| VAR, описание переменных
|
Раздел 5
| PROCEDURE, FUNCTION - описание процедур и функций, используемых в программе
|
Раздел 6
| BEGIN ... END. - тело программы
| Раздел исполняемых операторов
|
Синтаксические правила построения предложений языка можно описывать следующими способами:
• схемой (форматом предложения или раздела). В учебном процессе выбран именно этот способ, поскольку он наиболее понятен начинающему программисту;
• синтаксической диаграммой. Этот способ детально формализует синтаксис предложения и используется разработчиками трансляторов с языка Паскаль;
• порождающими правилами РАСШИРЕННЫХ БЭКУСА-НАУРА ФОРМ (РБНФ). Это весьма компактный и в то же самое время наглядный способ записи языковых конструкций. Этот способ используется в статьях и научных разработках. В данном курсе используются только пять элементов РБНФ (таблица 13).
Таблица 13
Соглашение
| Толкование
|
Угловые скобки < >
| Угловые скобки заключают в себе элемент синтаксиса, который Вы должны задать. Текст внутри угловых скобок характеризует элемент, однако, не описывает синтаксис этого элемента
|
Квадратные скобки [ ]
| Квадратные скобки в синтаксических конструкциях заключают в себе один или несколько необязательных элементов
|
Вертикальная черта |
| Разделяет два альтернативных элемента синтаксической конструкции, один из которых нужно выбрать
|
Фигурные скобки { }
| Фигурные скобки заключают в себе несколько элементов, разделенных '|'. Из них нужно выбрать один
|
Многоточие
…
| Многоточие показывает, что можно повторить некоторый элемент один и более раз
|
Раздел описания модулей USES
Раздел имеет структуру:
USES
Модуль 1, Модуль 2, ... Модуль N,
где за ключевым словом USES указывается список, в котором перечисляются все имена библиотек (модулей) стандартных и пользовательских, к процедурам и функциям которых есть обращение в программе. Если таких обращений нет, то раздел USES не нужен.
Пример:
USES CRT, GRAPH, HELP, MYLIB;
В этом примере две стандартные библиотеки — CRT, GRAPH и две пользовательские библиотеки — HELP, MYLIB.
Раздел описания меток LABEL
Раздел имеет структуру:
LABEL Метка 1, Метка 2,Метка N,
где за ключевым словом LABEL указывается список, в котором перечисляются все имена меток, встречающихся в программе.
Пример:
LABEL Ml, 12_BL, 9999;
Метки позволяют менять естественный ход выполнения программы. Ссылка на метку осуществляется оператором GOTO <метка>. Если в программе меток нет, то раздел LABEL отсутствует. В теле программы (в разделе операторов) метка ставится перед требуемым оператором и отделяется от него двоеточием.
Пример:
М27: X := А * В - С/2;
Областью действия метки является блок, где она описана. Ниже приведена схема использования меток в тексте программы.
LABEL метка 1, метка 2;
BEGIN
метка 1: <Оператор 1>;
…
метка 2: <Оператор 2>;
…
END.
Раздел описания констант CONST
Раздел существует, если в алгоритме используется по крайней мере одна константа, то есть величина, не изменяющая своего значения в процессе выполнения программы. Попытка изменить значение константы в теле программы будет обнаружена на этапе трансляции.
В стандарте на Паскаль константы определяются следующим способом:
CONST
<Идентификатор 1> = <3начение 1>;
<Идентификатор 2> = <3начение 2>;
<Идентификатор N> = < Значение N>;
Примеры констант:
CONST
А = 15.7;
BXZ = 'Серия N123/5';
MIN_IND = $15D;
С_10 = -0.57Е-6;
L125 = 695;
FLAG = TRUE;
Константа может иметь только предопределенный (стандартный) тип данных. Тип присваивается константе по внешнему виду значения и в соответствии с этим типом отводится память для хранения значения константы.
В качестве расширения стандартного Паскаля разрешено использовать выражения, составленные из ранее определенных констант и некоторых стандартных функций (Abs, Chr, Hi, Length, Lo, Odd, Ord, Pred, Prt, Round, SizeOf, Succ, Swap, Trunc). Примеры использования константных выражений:
CONST
Min = 0;
Max = 250;
Centr = (Max-Min) div 2;
Beta = Chr(225);
NumChars = Ord('2') - Ord('A')+l;
Message = 'не хватает памяти';
ErrStr = 'Ошибка:' + Message + '.';
Ln10 - 2.302585092994045884;
Ln10R = 1/Ln10;
Константные выражения вычисляются компилятором без выполнения программы на этапе ее создания.
Раздел описания типов TYPE
Стандартные типы данных (REAL, INTEGER, BOOLEAN, CHAR) не требуют описаний в этом разделе. Описания требуют только типы, образованные пользователем.
Концепция типов — одно из основных понятий в языке. С каждым данным связывается один и только один определенный тип.
Тип — это множество значений + множество операций, которые можно выполнять над этими значениями, то есть правила манипулирования данными. Использование типов позволяет выявлять многочисленные ошибки, связанные с некорректным использованием значений или операций еще на этапе трансляции без выполнения программ.
О Паскале говорят, что он строго типизирован, то есть программист должен описать все объекты, указывая их типы, и использовать в соответствии с объявленными типами. Программы становятся более надежными и качественными. При компиляции информация используется для уточнения вида операции. Так знаком + для данных типа REAL и INTEGER обозначается операция сложения, а для множеств (тип SET) — объединение. Структура раздела описания типов имеет вид:
TYPE
<имя типа 1> = <значение типа 1>;
<имя типа 2> = <значение типа 2>;
…
<имя типа L> = <значение типа L>;
Имя типа представляет собой идентификатор, который может употребляться в других типах, описанных вслед за данным типом. Раздел TYPE не является обязательным, так как тип можно описать и в разделе переменных VAR. Примеры описания пользовательских типов:
TYPE
DAY = 1..31; Year = 1900.. 2000; {Интервальный тип}
LatBukv = ('А', 'С, 'D', 'G, 'Н'); {Перечисляемый тип}
Matr = array[-1..12, 'А'.. 'F'] of real; {Регулярный тип}
Раздел описания переменных VAR
Это обязательный раздел. Любая встречающаяся в программе переменная должна быть описана. В языке нет переменных, объявляемых по умолчанию. Основная цель этого раздела определить количество переменных в программе, какие у них имена (идентификаторы) и данные каких типов хранятся в этих переменных. Таким образом, переменная это черный ящик, а тип показывает, что мы в него можем положить.
Структура раздела имеет вид:
VAR
<список 1 идентификаторов переменных>:<тип 1>;
<список 2 идентификаторов переменных>:<тип 2>;
…
<список N идентификаторов переменных>:<тип N>;
Тип переменных представляет собой имя (идентификатор), описанный в разделе TYPE при явном описании типа, или собственно описание типа в случае его неявного задания. Примеры описания переменных:
TYPE
DAY= 1..31; Matr = ARRAY[1..5,1..8] OF INTEGER;
VAR
A, B: DAY; X, Y: Matr; {явное описание типов }
YEAR: 1900.. 2000; LES: (LPT, PRN); {неявное описание типов }
А, В, CD, FER51: REAL; {описание переменных стан-}
EQUAL: BOOLEAN; SH: CHAR; {дартных типов производится }
I, J, К: INTEGER; {только в разделе VAR}
Раздел описания процедур и функций
Стандартные процедуры и функции, имена которых включены в список зарезервированных слов, в этом разделе не описываются. Описанию подлежат только процедуры и функции, определяемые пользователем.
PROCEDURE <имя процедуры> (<параметры>); {заголовок процедуры}
<разделы описаний> {тело процедуры }
BEGIN
<раздел операторов >
END;
FUNCTION <имя функции>(<параметры>): <тип результата>; { заголовок }
<разделы описаний > {тело функции}
BEGIN
<раздел операторов >
END;
Структура процедур и функций та же самая, что и у основной программы. Отличие описаний состоит в том, что идентификаторы констант, переменных, процедур и функций, описанных в соответствующих разделах описаний пользовательских процедур и функций, распространяются только на блоки, где они описаны и на блоки внутренние по отношению к ним. На внешние блоки, в том числе на тело основной программы, они не распространяются.
Раздел операторов
Это основной раздел, именно в нем в соответствии с предварительным описанием переменных, констант, функций и процедур выполняются действия, позволяющие получать результаты, ради которых программа и писалась.
Синтаксис раздела операторов основной программы:
BEGIN
<Оператор 1;> { Операторы выполняются}
<Оператор 2;> { строго последовательно}
… {друг за другом.}
<Оператор N>
END.
Комментарий
Это пояснительный текст, который можно записать в любом месте программы, где разрешен пробел. Текст комментария ограничен: слева - '{', справа - '}', и может содержать любые символы. Комментарий игнорируется транслятором, и на программу влияния не оказывает.
Пример использования комментария:
PROGRAM PR;
<Разделы описаний >
BEGIN
<Оператор 1; >
<Оператор 2; >
{< Оператор 3; >
…
<Оператор N > }
END.
Средства комментария часто используются для отладки. Так в приведенном выше примере, операторы — 3,... N, заключенные в фигурные скобки, временно не выполняются.
Правила пунктуации
Основным средством пунктуации является символ точка с запятой – ';'.
1. Точка с запятой не ставится после слов LABEL, TYPE, CONST, VAR, а ставится
после каждого описания этих разделов.
2. Точка с запятой не ставится после BEGIN и перед END, так как эти слова – операторные скобки.
3. Точка с запятой разделяет операторы, и ее отсутствие вызовет:
А := 333 {ошибка — нет ';'}
В := А/10;;;;; {четыре пустых оператора}
4. Возможна ситуация:
END; следует писать END
END; ------------------ > END
END; END;
5. Допускается запись метки на пустом операторе — <Метка>: ;
6. Точка с запятой не ставится после операторов WHILE, REPEAT, DO и перед UNTIL.
7. В условных операторах ';' не ставится после THEN и перед ELSE.
2. ПРОГРАММИРОВАНИЕ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ
Решение задачи на ЭВМ — это сложный процесс, в ходе которого пользователю приходится выполнять целый ряд действий, прежде чем он получит интересующий его результат.
Идеальная модель процесса решения задач на компьютере показана в таблице 14.
Детальное рассмотрение этапов решения задачи на ЭВМ выходит за рамки данного курса. Напомним лишь некоторые существенные определения и понятия, которые будем использовать далее.
Алгоритмизация — это процесс проектирования алгоритма, то есть выделение совокупности действий, используемых в математическом методе, и сведения их к совокупности действий, которые будет выполнять ЭВМ.
Таблица 14
Этапы решения задачи
| Исходные данные, результаты
| |
Начало решения
| Формулировка цели. Концептуальная, содержательная постановка задачи
| |
Постановка задачи
Построение модели
| |
Формальная математическая постановка задачи для ЭВМ
| |
Алгоритмизация
| |
Алгоритм
| |
Запись алгоритма на языке программирования
| |
Исходный текст программы на алгоритмическом языке. Программа в кодах ЭВМ
| |
Выполнение программы
| |
Результаты выполнения программы — числа, диаграммы, графики
| |
Анализ и использование результатов работы программы
| |
Выводы по результатам решения исходной задачи
| |
Конец решения
| |
Алгоритм — совокупность точно описанных действий, приводящих от исходных данных к желаемому результату и удовлетворяющих следующим свойствам:
• определенности — алгоритм должен однозначно, точно и понятно задавать выполняемые действия (для одних и тех же исходных данных должен получаться один и тот же результат);
• дискретности — алгоритм должен представлять действие в виде последовательности составных частей;
• результативности — алгоритм должен приводить к желаемому точному результату за конечное время;
• массовости — алгоритм должен быть приемлем для решения всех задач определенного класса.
Структурное проектирование — проектирование сверху вниз, это подход к разработке и реализации, который состоит в преобразовании алгоритма в такую последовательность все более конкретных алгоритмов, окончательный вариант которой представляет собой программу для вычислительной машины.
Существуют различные способы записи алгоритмов (словесный, формульно-словесный, графический, аналитический). Каждый из способов имеет свои плюсы и минусы; В данном курсе в основном используется два способа графического представления алгоритма: блок-схема и структурограмма.
Блок-схемы — это графическое представление алгоритма, дополняемое словесными записями. Каждый блок алгоритма отображается геометрической фигурой (блоком). Правила выполнения схем алгоритмов регламентируют ГОСТ 19.701-90. Графические фигуры соединяются линиями, потоками информации. Эти линии задают порядок переходов от блока к блоку. Блок-схемы наглядны для представления простых вычислительных алгоритмов и ориентированы для
программирования задач на языках АССЕМБЛЕР, АЛГОЛ, БЕЙСИК, ФОРТРАН, ПЛ. В этих языках программирования требуется четко отслеживать последовательность команд и широко используется оператор GOTO.
В ПАСКАЛЕ и ему подобных языках структурного программирования использовать блок-схемы в классическом виде стало неудобно. Это связано, во-первых, с громоздкостью алгоритма, реализованного в виде блок-схем, во-вторых, с нарушением основного принципа структурного проектирования программ сверху вниз. В соответствии с этим принципом рисуются укрупненные блоки алгоритма, которые потом уточняются. Этот процесс продолжается до тех пор, пока каждый алгоритмический блок не станет однозначно отражать одну или несколько языковых конструкций выбранного разработчиком языка программирования. Такие операторы
как For... То, While... Do, Repeat... Until, Case... of отразить с помощью блок-схем, не описывая принципов их работы невозможно. Поэтому для пояснения работы этих и некоторых других операторов Паскаля будем использовать блок-схемы как алгоритмы нижнего уровня. А для объяснения вычислительных процессов решения сложных задач, в том числе численных методов, используем изображения алгоритма с помощью структурограммы (схемы Насси-Шнайдермана). Для Паскаля использование структурограмм существенно упрощает запись алгоритма, так как явно описываются такие операторы как IF, FOR, WHILE ... DO, REPEAT... UNTIL, CASE ... OF, что делает алгоритм компактным, наглядным и легко программируемым.
2.1. Линейные процессы вычислений
Простейший алгоритм представляет собой цепочку блоков (операторов) от начального блока до конечного. Каждый блок должен быть выполнен один единственный раз. Это линейный алгоритм. Он отражает линейный вычислительный процесс. Основой линейных процессов является последовательность операторов, обеспечивающих ввод исходных данных, вычисление выражений, вывод результатов расчетов на экран или печать.
Операторы ввода (чтения)
Ввод числовых данных, символов, строк и т.д. с клавиатуры обеспечивается операторами вызова стандартных процедур:
READ(X1, Х2, ХЗ, ...), или READLN(X1, Х2, ХЗ, ...),
где X1, Х2, ХЗ,... — идентификаторы скалярных переменных. Данные, соответствующие переменным X1, Х2, ХЗ, вводятся с клавиатуры и разделяются либо пробелом, либо Enter. После ввода последнего данного всегда нажимается клавиша Enter.
Отличие оператора READLN от READ заключается в том, что после считывания последнего в списке X1 Х2, ХЗ,... значения данные для следующего оператора READLN будут считываться с начала новой строки. То есть, если список ввода X1, Х2, ХЗ,... оператора READLN меньше чем число набранных в одну строку через пробел чисел, то оставшиеся в строке числа будут проигнорированы. Оператор READ сохранит оставшиеся числа для дальнейшего ввода. Вводимые данные должны строго соответствовать типам переменных, описанных в разделе VAR, в противном случае будут возникать сообщения об ошибках ввода.
Оператор READLN без параметров вызывает приостановление программы до момента нажатия клавиши Enter.
Операторы вывода (записи)
Вывод числовых данных, символов, строк и булевских значений на экран дисплея осуществляется с помощью операторов вызова стандартных процедур: WRITE(X1, Х2, ХЗ, ...), или WRITELN(X1, Х2, ХЗ, ...).
Отличие этих операторов состоит в том, что WRITELN после распечатки списка выражений XI, Х2, ХЗ,... автоматически переводит курсор в начало следующей строки, а после выполнения оператора WRITE курсор остается за последним символом, выведенным на экран.
Оператор WRITELN с пустым списком выводимых данных выводит строку пробелов. Управление форматом выводимых данных осуществляется непосредственно в операторе вывода. Для этого используется запись элемента из списка {Xi} в виде — X [: В [: С ]], где X — выражение, идентификатор переменной или константа, В – ширина поля для вывода данного X, С – точность (только для типа REAL). Точность представления определяет количество цифр после точки (дробная часть числа). Если указанная ширина поля оказывается 'слишком большой', то
значение данного выводится со стоящими впереди пробелами. Если указанная ширина ноля 'мала', то в строке вывода для значения этого данного добавляются (автоматически) необходимые позиции. Параметры формата (ширина поля B и точность С) могут быть константой, переменной или выражением целого типа.
Пример 2.
Описать формат вывода арифметического выражения X, численное значение которого |X|< 1000, с точностью до пяти знаков после десятичной точки.
Решением этой задачи является оператор: WRITELN( X : 10 : 5 ). На рисунке 1 показана схема формата Х:10:5.
Цифра 10 определяет ширину поля, то есть общее количество литер, отведенное для отображения вещественного числа вместе со знаком и десятичной точкой. Цифра 5 – точность - указывает количество цифр мантиссы. В этом примере результат вычисления X выводится на экран дисплея в форме вещественного числа с
фиксированной точкой.
Если задать формат в виде Х:8, то вещественное число будет представлено в формате с плавающей точкой и будет включать для своего представления восемь литер. Ограничение ширины поля скажется на разрядности мантиссы. Для вывода целой части X можно форматировать — Х:5:0. В этом случае 'точность' равна 0 и десятичная точка не отображается на экране. Дробная часть вещественного числа округляется с указанной точностью, а не отбрасывается.
Таблица 15. Примеры форматов вещественных чисел
X
| Тип
| Формат
| Результат
| Примечание
|
12.336
| REAL
| X:5:2
| 12.34
| Формат вещественного числа с фиксированной точкой
|
12.334
| REAL
| X:5:2
| 12.33
|
-12.339
| REAL
| X:6:2
| -12.34
|
-0.0123
| REAL
| X:6:3
| -0.012
|
12.334
| REAL
| X:5:0
|
| Округление вещественного числа до целого числа с помощью формата
|
12.534
| REAL
| X:5:0
|
|
-12.534
| REAL
| X:5:0
| -13
|
-123.456
| REAL
| X:10
| 1.235E+02
| Формат вещественного числа с плавающей точкой
|
-12.3456
| REAL
| X:8
| -1.2E+01
|
12.3456
| REAL
| X:8
| 1.2E+01
|
0.012
| REAL
| X:11
| 1.2000E-02
|
0.0156
| REAL
| X
| 1.5600000000E+02
| Бесформатный вывод вещественного числа
|
12.3456
| REAL
| X
| -1.2345600000E+01
|
Оператор присваивания
Вычисления в большинстве случаев реализуются с помощью оператора присваивания, который имеет формат:
<Идентификатор> := <Выражение>;
Оператор присваивания заменяет значение переменной, идентификатор которой стоит в левой части, на значение, задаваемое выражением в правой части. Выражение строится из операндов (переменных и констант), функций, операций и круглых скобок.
Арифметические выражения используют арифметические операции: *, /, DIV, MOD, AND, OR, +, - . Операнды имеют тип REAL или INTEGER.
Пример арифметического выражения:
X := (1 - В)*ЕХР(-0.5*А)/(1 - А).
Список встроенных арифметических функций, наиболее часто используемых в программах на Паскале, приведен в таблице 8. Последовательность выполнения операции в выражении определяется их приоритетом. В первую очередь делаются операции умножения и деления (*, /), а в последнюю — сложения и вычитания (+, -) слева направо. Приоритетность арифметических операций:
1. Вычисления в круглых скобках;
2. Вычисления значений функции;
3. Унарные операции (NOT, унарный +, унарный -);
4. Арифметические операции 1 уровня (*, /, div, mod, and, shl, shr);
5. Арифметические операции 2 уровня (+, -, or, xor);
6. Операции отношения (=, <, >, <>, >=, <=, in);
В языке существуют ограничения на преобразование типов данных путем присваивания. Переменной А типа REAL можно присвоить значение переменной В типа INTEGER ==> А := В. Однако обратное присвоение В := А вызовет прерывание по причине несоответствия типов.
Для этого случая предусмотрены функции преобразования типов TRUNC(A) или ROUND(A), то есть используется присвоение вида В := TRUNC(A) или В := ROUND(A).
Примеры линейных программ
Пример 3. Рассчитать площадь шара в кв. см. Радиус шара ввести с клавиатуры в миллиметрах.
PROGRAM PR3; {Программа вычисляет площадь поверхности шара}
VAR PL: REAL; { PL - площадь шара}
R: INTEGER; { R - радиус }
BEGIN
WRITELN('Введите радиус шара, мм');
READLN(R);
PL:=4*PI*SQR(R)/100;
WRITELN('Площадь шара =', PL:8:1, 'кв. см')
END.
Пример 4. Осуществить расчеты по формуле:
,
где φ=arctg(b/a), ψ=arctg(d/c), c=n*a, d=m*b.
Поскольку набор символов, используемых в идентификаторах переменных в программе (латиница), не включает традиционные для тригонометрии символы греческого алфавита α, β, φ, ψ, необходимо составить таблицу имен, которая установит соответствие между идентификаторами переменных и этими символами. В таблице имен мы также зафиксируем промежуточные (рабочие) переменные, упрощающие программирование исходной формулы:
Математическая величина, выражение
| Идентификатор переменной в программе
|
α
| ALPHA
|
β
| BETA
|
φ
| FI
|
ψ
| PS I
|
α + φ + 15°
| AF
|
β + ψ + 75°
| BP
|
| SQAB
|
| SQCD
|
Программирование линейных вычислительных процессов очень похоже на вычисления по формулам, которые математик осуществляет на бумаге. Алгоритм таких вычислений, как правило, не составляется в виде блок-схем. Наиболее удобной формой представления такого алгоритма является формульно-словесный способ, при котором действия пронумерованы пунктами 1, 2,3 и т.д. Каждое действие поясняется словами, формулами и расчетами.
Алгоритм решения этой задачи описан формульно-словесным способом:
1. Ввод с клавиатуры параметров А, В, М, N, ALPHA, BETA.
2. Вычисление аргументов тригонометрических функций по формулам:
где AF и BP промежуточные рабочие переменные, которые в исходной формуле встречаются по два раза в числителе и знаменателе. Следует отметить, что аргументы встроенных функций Sin и Cos в Паскале должны задаваться в радианах. В исходной формуле подразумевается, что углы α, β, φ, ψ измеряются в радианах. Поэтому углы 15° и 75° градусов подлежат пересчету в радианы, что и сделано в приведенных выше формулах для расчета AF и BP.
3. Последовательное вычисление величин С, D, FI, PSI по формулам:
C = n*a, D = m*b, FI = arctg(b/a), PSI = arctg(d/c).
4. Нахождение значений промежуточных переменных SQAB и SQCD по формулам:
,
5. Вычисление Y по упрощенной формуле за счет уже выполненных в предыдущих пунктах алгоритма расчетов.
6. Последним пунктом этого алгоритма является вывод найденного значения Y на экран монитора.
PROGRAM PR4;
VAR
ALPHA, BETA, FI, PSI, SQAB, SQCD, AF, BP, А, В, C, D, N, M, Y: REAL;
BEGIN
WRITELN('Введите значения А, В, M, N');
READLN(A, В, M, N);
WRITELN('Введите значения АЛЬФА, БЕТТА');
READLN(ALPHA, BETA);
С := N*A;
D := M*B;
FI := ARCTAN(B/A);
PSI := ARCTAN(D/C);
AF := ALPHA + FI + 15*PI/180;
BP = BETA + PSI + 75*PI/180;
SQAB := SQRT(A*A + B*B);
SQCD := SQRT(C*C + D*D);
Y:=ARCTAN((0.5*SQAB*SIN(AF)+SQCD*SIN(BP))/(SQAB*COS(AF) + SQCD*COS(BP)));
WRITELN('Y =', Y:7:3)
END.
Следует выделить следующие типичные действия программиста при разработке программ такого класса (формализация линейного вычислительного процесса).
1. Формирование таблицы имен. На этом этапе подбираются латинские обозначения (идентификаторы) для отображения в программе математических величин, используемых в формулах. Для некоторых выражений, встречающихся в формулах два и более раза, можно ввести свои идентификаторы (временные переменные). Эти величины рассчитываются один раз перед основной формулой (формулами), что упрощает исходные формулы и ускоряет расчеты.
2. Учитывая последовательный принцип выполнения операторов в программе – друг за другом по мере их написания – необходимо установить порядок расчета формул. Основное требование состоит в том, чтобы при расчете формулы все переменные и параметры были ранее вычислены или введены с клавиатуры. Если формулы можно упростить путем алгебраических преобразований, то это нужно сделать до начала программирования.
3. Все математические величины нужно разбить на две группы: константы и переменные. Константы следует определить в разделе CONST программы, а переменные — в разделе VAR.
4. Проанализировав возможные значения переменных и требуемую точность расчетов, следует определить тип каждой переменной.
5. Требуется проанализировать все переменные из раздела VAR и определить, какие из них вводятся с клавиатуры, а какие вычисляются по ходу программы.
6. Если в тригонометрических функциях в качестве аргументов используются величины в градусах, то необходимо в программе сделать преобразование этих величин в радианы.
7. При выводе результатов расчетов на экран нужно выбрать формат, способ представления результатов (с плавающей или с фиксированной точкой) и задать точность (число значащих чисел).
Пример 5. Осуществить расчеты по формуле:
Для решения этой задачи следует использовать известные математические преобразования, которые приведут исходную формулу к виду, удобному для программирования. Эти преобразования описаны в следующей таблице:
Исходная формула
| Формула для программирования
| Текст программы
|
, Z>0
|
| EXP(LN(Z)/N)
|
Zn+l, Z>0
|
| EXP((N+1)*LN(Z))
|
LogN|X +11
|
| LN(ABS(X+1))/LN(N)
|
PROGRAM PR5;
VAR
X, Y: REAL;
N: INTEGER;
BEGIN
WRITELN('Введите значения X, N');
READLN(X, N);
Y := EXP(LN(ABS(EXP((N+1)*LN(X)) + LN(ABS(X+1))/LN(N)))/N);
WRITELN( Y = ', Y:8:4)
END.