Лабораторная работа № 1.Программная реализация алгоритмов линейной структуры
Цель работы: ознакомиться с принципами языка программирования Паскаль, научиться разрабатывать простейшие программы на Паскале, производить их отладку и тестирование.
Задание:
1. Разработать алгоритмы для решения задач варианта.
2. Записать алгоритмы на языке программирования Turbo Pascal.
3. Произвести отладку и тестирование программы.
Краткие теоретические сведения
Программа на языке Паскаль записывается строго определенным образом и состоит из заголовка, раздела описаний и раздела операторов.
Заголовок программы состоит из ключевого слова Program и собственно имени программы, например: Program prim;. Заголовок является необязательной частью программы.
Описание (объявление данных) содержит упоминание всех объектов, используемых в программе и включает в себя:
· раздел подключаемых библиотек (модулей) определяется служебным словом USES и содержит имена подключаемых модулей: uses CRT, Graph;
· раздел описания меток: любой оператор в программе может быть помечен меткой. Имя метки задается по правилам образования идентификаторов Турбо Паскаль: label 3, 471, 29, Quit;
· раздел описания констант позволяет использовать имена как синонимы констант, их необходимо определить в разделе описания констант: const K= 1024; MAX= 16384;
· раздел описания типов;
· раздел описания переменных; необходимо указать все переменные, используемые в программе, и определить их тип: var P,Q,R: Integer; A,B: Char; F1,F2: Boolean;
· раздел описания процедур и функций.
Операторы (исполняемая часть) представляет собой составной оператор, который содержится между служебными словами begin.......end. Операторы отделяются друг от друга символом ”;”. Текст программы заканчивается символом ”точка”.
Кроме описаний и операторов Паскаль - программа может содержать комментарии, которые представляют собой произвольную последовательность символов, расположенную между открывающей скобкой комментариев “{“ и закрывающей скобкой комментариев “}”.
Алфавит языка Паскальвключает следующие символы:
· Латинские прописные и строчные буквы A – Z, a – z; символ _ «подчерк» (код ASCII 95) используются для формирования идентификаторов и служебных слов;
· Арабские цифры 0 – 9 – для записи чисел и идентификаторов.
· Специальные символы: математические (+| - | * | / | = | > | < | ( | ) |; пунктуации | . | , | : | ; |; прочие | [ | ] | - для обозначения массивов и множеств, | { | } | - для записи комментариев, | _ | - для разделения лексем, | ' | - апостроф для записи констант символьного и текстового типа, | $ | # | @ | ^ |.
Лексическая структура языка Паскаль.Программа на Паскале состоит из последовательности лексем – минимальныхлексических единиц языка, имеющих самостоятельный смысл. Лексемы условно делятся на несколько классов:
· Ключевые (служебные, зарезервированные) слова. Всего 51 слово, в редакторе интегрированной среды Borland Pascal изображаются белым цветом. Перечень зарезервированных слов приведен в приложении.
· Идентификаторы (изображаются желтым цветом) могут быть двух разновидностей: имена, которые программист присваивает какой-либо переменной, константе, типу, метке, процедуре или функции (нельзя использовать ключевые слова); стандартные идентификаторы, которые являются именами встроенных в язык процедур и функций. Компилятор воспринимает 63 символа идентификатора, который должен начинаться с буквы и может содержать буквы, цифры и знак подчеркивания.
а) Десятичные числа, которые записываются чаще всего в традиционном формате с фиксированной точкой: <Вещ_фикс>::=<целое>.< целое>. Кроме того применяется экспоненциальный формат (вещественное с плавающей точкой): <Вещ_эксп>::=<Вещ_фикс>E<порядок>, где <порядок>::=[+-] <целое>. Например: 7,4Е-2 Þ 7.4 × 10-2 Þ 0.074.
б) Строки – последовательность любых символов из расширенного набора ASCII, заключенная в апострофы;
в) Комментарии (изображаются серым цветом) – любая комбинация произвольных символов, заключенная либо в фигурные скобки { }, либо в комбинированные {* *}. Если за открывающейся скобкой следует знак $, комментарий интерпретируется как директива компилятора.
Между лексемами разрешено вставлять один или несколько разделителей: пробелов, комментариев, символов «конец строки» (код 13) и других управляющих символов (коды от 0 до 31). разделителями являются знаки математических операций, круглые и квадратные скобки, запятые.
Типы данных.Под типом данных понимается множество допустимых значений этих данных, а также совокупность операций над ними. Тип определяет также и формат внутреннего представления данных в памяти компьютера. Паскаль характеризуется разветвленной структурой типов данных. Классификация и подробное описание типов данных приводится в приложении.
К простым типам относятся порядковые и вещественные типы. Они не требуют предварительного определения.
Порядковые типы отличаются тем, что каждый из них имеет конечное число возможных значений. Эти значения можно определенным образом упорядочить и, следовательно, с каждым из них можно сопоставить некоторое целое число – порядковый номер значения. Это integer (целое со знаком), boolean (логический), char (символьный) и другие.
Вещественные типы тоже имеют конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественных типов настолько велико, что сопоставить с каждым из них целое число (его номер) не представляется возможным. Это single, real, double, extended, comp.
В программе ни один идентификатор не принимается по умолчанию. Если компилятор обнаружит неизвестное имя, будет выдано сообщение об ошибке.
Описание константиспользуется в программе для задания значений, которые не изменяются в процессе выполнения действий. Предложение описания констант имеет вид: Const с1 = value; c2 = value;
Здесь с1, с2 – имена констант; value – определяет значение константы.
Описание переменных. Переменные используются для записи значений, изменяющихся в программе. Выбор имен осуществляется так, чтобы были понятны смысл и назначение. Все переменные, используемые в программе, должны быть перечислены в разделе описания переменных. Предложение описания переменных имеет вид: Var v1, v2, … : type_id;
Здесь v1, v2,… - список переменных, в котором имена переменных разделяются запятыми, а type_id задает тип переменных из данного списка.
Например: Var a, b, c: integer; x1, x2: real;
Операции и выражения. Для определения действий, которые в математике обычно описываются формулами, в программировании служат выражения. Выражения – это конструкции, которые могут включать в себя константы, переменные, стандартные функции, пользовательские функции и числа, соединенные между собой знаками операций и парами круглых скобок. Выражения состоят из операндов и операций, записываются в одну строку и всегда имеют конечное значение определенного типа.
По количеству операндов операции делятся на унарные (присвоение знака числу [+ -] и бинарные (умножение [ * ], деление [ / ], деление нацело [ div ], остаток от деления [ mod ], сложение [ + ], вычитание [ - ]. Например: С := A mod B, при A := 13 и B := 4 С := 1; С := A div B, при A := 13 и B := 4 С := 3.
Булевы (логические) выражения включают в себя переменные и простые логические операции: =, <, >, <=, >=, <>. Например: A>=B. Простые булевы выражения могут объединяться в сложные с помощью логических операций: конъюнкция AND, дизъюнкция OR, отрицание NOT, строгая дизъюнкция XOR.
Порядок вычисления выражения определяется скобками, а в их отсутствие – в соответствии с приоритетом операций:
1) Операция отрицание NOT;
2) Мультипликативные *, /, div, mod, AND;
3) Аддитивные +, -, OR;
4) Простые логические операции =, <, >, <=, >=, <>.
Подробное описание операций приведено в приложении.
Стандартные функции. Результат работы функции возвращается в виде значения этой функции, и, следовательно, вызов функции может использоваться наряду с другими операндами в выражениях. В выражении функция вычисляется в первую очередь, если нет скобок.
Abs(X) – вычисляет абсолютное значение X;
Exp(X) – основание натурального логарифма возводит в степень Х;
Ln(X) – вычисляет натуральный логарифм Х;
Sqr(X) – Х возводит в квадрат;
Sqrt(X) – вычисляет квадратный корень из Х;
Sin(X), Cos(X), Arctan(X) – тригонометрические функции синус, косинус и арктангенс (аргумент задается в радианах);
Trunc(X) – определяет целую часть числа Х, тип результат Longint;
Round(X) – округляет число Х до целого;
Frac(X) – определяет дробную часть аргумента;
Int(X) – определяет дробную часть аргумента, тип результат Real;
Random(X) – равномерное псевдослучайное число 0£ I < X, при отсутствии Х интервал чисел от 0 до I.
Математические функции, не представленные в языке Паскаль в явном виде:
Десятичный логарифм Lg(X) = Ln(X)/Ln(10);
Возведение в степень Y = Mn ® Y:= Exp(n*Ln(M)), A = 146 ® A := Exp(6*Ln(14));
Для перевода из градусов в радианы и наоборот используются соотношения: 1 радиан = 180°/Pi = 57°17’45” 1 градус = Pi/180 радиана = 0,0174 радиана.
Операторы – это единицы действия языка (синонимы – предложения, утверждения, инструкции). Операторы могут быть выполняемые и невыполняемые. Выполняемые производят вычисления и управляют процессом вычислений. Невыполняемые содержат сведения о структуре и организации данных, их свойствах и размещении данных в памяти. Операторы также могут быть пустые и составные. Составной оператор – это последовательность произвольных операторов программы, заключенная в операторные скобки Begin ... End. Пустой оператор не содержит никаких действий, просто в программу добавляется лишняя точка с запятой. В основном пустой оператор используется для передачи управления в конец составного оператора.
Оператор присваивания вызывает выполнение выражений и присваивание значения имени результата: <имя переменной> := <выражение>. Например C := A/B; D := 54 *S +(21 +n)/g); P := P*i.
Операторы ввода-вывода. В Паскале используются стандартные процедуры. Процедура – это некоторая последовательность операторов языка, к которой можно обратиться по имени.
Для ввода данных используются следующие операторы обращения к встроенной стандартной процедуре ввода данных:
Read (A, B, C); где A, B, C – имена переменных, значения которых подлежат вводу для запоминания в оперативной памяти.
Readln (A, B, C); после окончания ввода курсор перемещается к началу новой строки.
Readln; означает ожидание нажатия клавиши <Enter>.
Для вывода данных на экран монитора используется оператор обращения к стандартной процедуре вывода данных:
Write(список имен);. Например: Write(‘a=’, a:7:3, ‘_b=’, b:6:3) – число после первого двоеточия означает количество позиций, выделяемых для вывода значения численной переменной, включая знак, целую часть, десятичную точку и цифры после запятой, цифра после второго двоеточия означает количество цифр после десятичной запятой. Лишние позиции будут заменены пробелами перед целой частью числа и нулями после дробной части. В приведенном операторе ввода при a = 3,14744 и b = -3,4 на экране выведется a = __3.147 b = -3.400.
Writeln(список имен); - после вывода курсор переводится к началу новой строки.
Writeln; - означает пропуск одной строки и переход к началу новой строки.
Для вывода данных на печатающее устройство необходимо переопределить вывод, для чего в списке вывода задается имя устройства LST. Например: Writeln(lst, x1, x2);.
Примеры решения задач
Пример 1. Вычислить площадь круга и длину окружности по заданному радиусу.
Решение: Схема алгоритма представлена рис.3.1. Напишем программный код:
program circle;
const pi := 3.14159;
var r, s, l : real;
begin
writeln (‘введите радиус’); readln (r);
s:= pi*r*r; l:= 2*pi*r;
writeln (‘площадь круга =’, s:8:4);
writeln (‘длина окружности =’, l:8:4);
end.
Пример 2. Вычислить высоты сторон треугольника, если известны длины сторон треугольника. Для вычисления использовать формулу Герона.
Решение:Схема алгоритма рассматривается рис.3.2. Напишем программный код:
program primer2;
var a, b, c, p, t, ha, hb, hc: real;
begin
writeln (‘введите длины сторон треугольника a, b, c’); readln (a, b, c);
p:= (a + b + c)/2; p:= 2*sqrt(p * (p – a) * (p – b) * (p – c));
ha:= t/a; hb:= t/b; hc:= t/c;
writeln (‘ha =’, ha:8:4);
writeln (‘hb =’, hb:8:4);
writeln (‘hc =’, hc:8:4); end.
Рис.3.1. Алгоритм вычисления площади круга и длины окружности