ЗАПИСЬ ЧИСЛОВЫХ КОНСТАНТ, ПЕРЕМЕННЫХ И ВЫРАЖЕНИЙ. Целые числа в Паскале записываются в обычном виде, например: 0, +100,-56498. Вещественные числа представляются в одной из двух форм, которые называются: запись числа с фиксированной точкой и запись с плавающей точкой. Первая из них - это запись числа в виде целой и дробной частей, разделенных точкой, например: -3.15 , 0.1 , +23.0125. Вторая форма - с плавающей точкой - это запись числа с мантиссой и десятичным порядком, разделенными латинской буквой E. Такая запись означает, что мантисса (которая может быть целым числом или вещественным числом в форме с фиксированной точкой) умножается на 10 в степени, задаваемой порядком (который всегда должен быть целым числом), например -18.7Е+3 , 2.123Е4, 2.34Е-2 , 6Е-1. Если в записи числа содержится точка, то по крайней мере одна цифра ей должна предшествовать и следовать за ней. В выражениях допускается использовать константы (неизменяемый объект программы), переменные (объект программы, который может изменять свое значение), операции ( + , , / , * , . . . ) и функции. Пример 1. (6 x) x 10( xy 6 xyz) xy yz zx Записать выражение на Паскале Решение: ((6 - x) * x + 10 * (x * y - 6 * x * y * z)) / (x * y - y * z - z * x) Пример 2. Записать выражение (sqrt(sin(x*x)+cos(y*y)))/exp(sqr(2*x-5)) в общепринятой форме. sin x 2 cos y 2 Решение: e ( 2 x 5) 2 АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ. В таблице приведены арифметические операции, которые определены для целого и вещественного типов: Знак Операция Типы операндов Тип результата операции Целый или Целый, если оба Сложение + вещественный операнда целого типа, в противном Целый или Вычитание случае вещественный * Умножение Целый или вещественный / Деление Целый или вещественный вещественный. Вещественный Математические функции. Ниже приводится перечень часто используемых функций Паскаля. Вызов функции Abs(x) Pi Тип аргумента целый вещественный - Тип результата целый вещественный Назначение Возвращает абсолютное значение x вещественный Возвращает значение числа ПИ Sin(x) целый вещественный вещественный Возвращает синус x радиан Cos(x) целый вещественный вещественный Возвращает косинус x радиан ArcTan(x) целый вещественный вещественный Возвращает арктангенс x радиан Sqrt(x) целый вещественный вещественный Возвращает квадратный корень из x>=0 Sqr(x) целый вещественный Exp(x) целый вещественный вещественный Возвращает значение e в степени x Ln(x) целый вещественный вещественный Возвращает натуральный логарифм x, x>0 целый вещественный Возвращает значение квадрата x СТРУКТУРА ПРОГРАММЫ Любая программа на Паскале имеет следующий общий вид: Program <имя программы>; Блок. Первая строка - это заголовок программы, содержащий ее имя. Блок содержит описание действий, которые должны быть выполнены в соответствии с назначением данной программы. Обычно блок включает также описания используемых структур данных (константы, типы, переменные) и элементов организации алгоритма (метки, функции, процедуры). В общем случае блок состоит из описательной и исполняемой частей. Описательная часть содержит: 1. 1. Описание меток. Пример: Label 5, 361, 017, a2; Метки необходимы при использовании оператора перехода Goto. В качестве меток используются целые числа из диапазона 0 - 9999. 2. 2. Описание констант. Пример: Const a = -1.5; b = True; c = `pascal`; 3. 3. Описание типов. Кроме ранее перечисленных стандартных типов языка Паскаль в программе могут быть описаны собственные типы данных. Общий вид описания Type <имя типа> = <определение типа>; Пример: Type d = 1..100; abc = 'a' .. 'z'; color = (red, yellow, green); vektor = Array[d] Of Real; 4. 4. Описание переменных. Общий вид Var <список имен переменных> : <имя типа>; Имя типа здесь - это имя какого-либо стандартного или описанного в данной программе типа данных. Например: Var n,m: Integer; a: Real; b1,b2: Boolean; pen: color; x: vektor; 5. 5. Описание процедур и функций. Исполняемая часть содержит список выполняемых операторов программы. Обязательным является наличие служебного слова Begin в начале и служебного слова End в конце раздела. Весь текст программы должен завершаться точкой. Простейшие операторы перечислены ниже ОПЕРАТОР ПРИСВАИВАНИЯ Оператор присваивания вычисляет значение выражения, стоящего справа от знака “ := “ и присваивает его переменной, указанной слева. Его общий вид <имя переменной> := <выражение>; Тип переменной и тип значения выражения должны совпадать за исключением того, что переменной типа Real может быть присвоено значение выражения типа Integer. ОПЕРАТОРЫ ВВОДА-ВЫВОДА В программах на Паскале для ввода и вывода данных используют операторы обращения к процедурам ввода: Read (список ввода); Readln (список ввода); и процедурам вывода Write (список вывода); Writeln (список вывода); Процедура Writeln после вывода элементов списка переводит курсор на новую строку. В список ввода могут входить переменные типа Integer, Real, Char. В списке вывода могут содержаться константы, переменные, выражения типа Integer, Real, Char и Boolean. При выводе данных можно задавать формат вывода сразу за объектом вывода: <объект вывода> : <ширина поля> где <ширина поля> - целое выражение, значение которого определяет количество знаков отводимое для объекта вывода. Вещественные значения с <шириной поля> и без нее будут иметь экспоненциальную форму записи, поэтому для вывода значений с фиксированной точкой указанный формат вывода можно дополнить целым выражением через “ : ”, которое будет соответствовать количеству знаков после запятой: <объект вывода> : <ширина поля> : <после точки> Пример: Как будет выведено на экран: a:=10; b:=2; c:=421.65; Writeln(a,b,c); 1024.216500000E+02 Writeln(a,b:2,c:8:2) 10 2 421.65 ТИПЫ ДАННЫХ. ОПЕРАЦИИ И ФУНКЦИИ НАД ДАННЫМИ РАЗНЫХ ТИПОВ Любые объекты, т.е. константы, переменные, значения функций или выражения, в Паскале характеризуются своими типами. Тип определяет множество допустимых значений того или иного объекта, а также множество операций, которые к нему применимы. Кроме того, тип определяет формат внутреннего представления данных в памяти ЭВМ. Паскаль характеризуется разветвленной структурой типов данных: ПРОСТЫЕ ТИПЫ К простым типам относятся порядковый и вещественный типы. Порядковые типы отличаются тем, что каждый из них имеет конечное число возможных значений. Эти значения можно определенным образом упорядочить и, следовательно, с каждым из них можно сопоставить некоторое целое число - порядковый номер значения. Основные порядковые типы Паскаля: Integer - целый тип, представляет собой подмножество множества целых чисел, определяемое конкретной реализацией. Во внутреннем представлении он занимает 2 байта, диапазон возможных значений - от -32768 до +32767, данные представляются точно. Char - символьный тип, представляет собой набор символов, определяемый конкретной реализацией. Во внутреннем представлении он занимает 1 байт, множество значений этого типа фиксировано и упорядочено. Все символы считаются перенумерованными, начиная с нуля. Такой набор символов определен в каждой вычислительной системе. Константой символьного типа является один из допустимых символов, взятый в апострофы. Если апостроф сам является символом, то апостроф, являющийся значением константы, записывается дважды, например ‘7’ , ‘+’ , ‘F’ , ‘’’’ , ‘j’ , ‘?’ . Boolean - логический тип, определяет диапазон логических значений, который содержит два элемента False (ложь) и True (истина). Во внутреннем представлении он занимает 1 байт. Тип-диапазон - подмножество своего базового типа, в качестве которого может быть любой порядковый тип, кроме типа-диапазон. Тип- диапазон задается границами своих значений внутри базового типа <минимальное значение> . .<максимальное значение> При определении типа-диапазон нужно руководствоваться следующими правилами: - - ".." рассматриваются как один символ, поэтому между точками пробелы недопустимы;7 - - левая граница не должна превышать правую границу. Примеры: Type month = 1 ..12; lat = ’a’ .. ’z’; Вещественный тип, строго говоря, тоже имеет конечное число значений, которое определяется форматом внутреннего представления вещественного числа. Однако количество возможных значений вещественного числа настолько велико, что сопоставить с каждым из них целое число не представляется возможным. Real - вещественный тип, представляет собой определяемое конкретной реализацией подмножество множества вещественных чисел. Во внутреннем представлении он занимает 6 байт, диапазон возможных значений - от 2.9Е-39 до 1.7Е+38, точность представления данных - 11...12 значащих цифр. Примечание. В системе программирования Турбо-Паскаль определено несколько дополнительных простых типов данных для целых и вещественных величин. Они различаются своими диапазонами значений и размером занимаемой памяти. Информация о них представлена в следующих таблицах. Целые числа Диапазон Тип Byte Shortint Word Longint 0 ... 255 -128 ... 127 0 ... 65535 -2147483648 ... 2147483647 Размер в байтах 1 1 2 4 Вещественные числа Тип Singl e Double Extended Диапазон 1.5E-45 ... 34E38 5E-324 ... 1.7E308 1.6E-4951...1.1E4932 Знач. цифры 7-8 15-16 19-20 Размер в байтах 4 8 10 ОПЕРАЦИИ И ФУНКЦИИ НАД ПОРЯДКОВЫМИ ТИПАМИ ДАННЫХ В таблице приведены арифметические операции, которые, помимо рассмотренных выше (см. лабораторную работу №1), определены только для целого типа: Знак Операция Типы операндов Тип результата операции Целочисленное деление Целый Целый Div Остаток от целочисленного деления В Паскале определены следующие Mod Целый Целый логические операции: Not - логическое НЕ; And - логическое И; Or - логическое ИЛИ; Xor - исключающее ИЛИ. Данные операции определяются следующим образом P Q Not P P And Q P Or Q P Xor Q True True False True True False True False False False True True False True True False True True False False True False False False В Паскале используются следующие операции отношения: =, <>, >, <, <=, >=. Операции сравнения применимы к данным простых типов. Сравнивать можно между собой значения одного типа: целые, вещественные, символьные, логические, значения перечисляемого типа. Допустимо также сравнивать между собой целые и вещественные числа. При вычислении выражений любого типа приоритет вычислений определяется расставленными скобками, а при их отсутствии по следующей таблице (в порядке убывания приоритета). Приоритет 1 2 3 4 Операция Not *, /, Div, Mod, And +, -, Or, Xor =,<>, <, >, <=, >= Функции. Все функции можно разделить на два вида: не выводящие за пределы типа, т. е. аргументы и результат относятся к одному типу и те, у которых тип результата не совпадает или может не совпадать с типом результата. Первые перечислены в лабораторной работе №1. Ниже приводится перечень часто используемых функций Паскаля второго вида. Вызов функции Тип аргумента Тип результата Назначение Trunc(x) вещественный целый целый Возвращает целую часть значения x Frac(x) вещественный целый веществен ный Возвращает дробную часть значения x Int(x) вещественный целый веществен ный Возвращает целую часть значения x Round(x) вещественный целый целый Округляет x до ближайшего целого Odd(x) целый логический Проверяет нечетность значения x Ord(x) порядковый целый Возвращает порядковый номер, соответствующий значению x Chr(x) символьный целый Возвращает символ с заданным порядковым номером x Pred(x) порядковый порядковы й Возвращает предшествующее значение x Succ(x) порядковый порядковы й Возвращает последующее значение x УСЛОВНЫЙ ОПЕРАТОР С помощью условного оператора выбирается и выполняется один из операторов, входящих в его состав. Условный оператор имеет два варианта записи. Полная форма: If <логическое выражение> Then <оператор1> Else <оператор2> ; В этом случае в зависимости от значения логического выражения выбирается для выполнения оператор1 или оператор2 . Неполная форма: If <логическое выражение> Then <оператор> ; В этом случае в зависимости от значения логического выражения выполняется записанный после Then оператор или не производится никаких действий. Если после Then или Else необходимо выполнить действия, описанные несколькими операторами, то эти операторы должны быть заключены в операторные скобки Begin - End. Такая конструкция называется составным оператором. ОПЕРАТОРЫ ЦИКЛА В языке Паскаль имеются три различных оператора, с помощью которых можно запрограммировать повторяющиеся фрагменты алгоритмов. Оператор цикла с параметром (арифметический оператор цикла) имеет такую структуру: For <имя переменной> := <выражение1> To <выражение2> Do <оператор> ; <имя переменной> - параметр цикла <выражение1> - начальное значение параметра цикла <выражение2> - конечное значение параметра цикла Все три указанных выше объекта должны быть одного порядкового типа. <оператор> - тело цикла. Этот оператор цикла выполняется следующим образом: 1. Вычисляются значения выражения 1 и выражения 2. 2. Параметру цикла присваивается начальное значение. 3. Параметр цикла сравнивается с конечным значением. Если параметр цикла меньше или равен конечному значению, то перейти к п.4, иначе - конец цикла (переход на следующий оператор после оператора цикла). 4. Выполняется тело цикла. Параметр цикла принимает следующее значение, полученное с помощью функции Succ(увеличивается на 1). 5. Переход к п.3. Есть еще один вариант этого оператора цикла, когда параметр цикла после каждого выполнения тела цикла принимает следующее значение, полученное с помощью функции Pred (уменьшается на 1). В этом случае служебное слово To заменяется на Dowto и цикл идет до тех пор, пока параметр цикла не станет строго меньше конечного значения. Пример. Вычислить и напечатать первые 10 чисел Фибоначчи. Числа Фибоначчи образуют последовательность, в которой очередной член равен сумме двух предыдущих, а первые два равны единице. Решение: Program Fib; Сonst n=10; {количество чисел} Var i,f1,f2,f3:Integer; Begin f1 := 1; f2 := 1; {первые два числа Фибоначчи} For i := 3 To n Do Begin f3 := f1 + f2; {следующее число} Writeln(f3); f1 := f2; f2 := f3 End End. Оператор цикла с предусловием While <логическое выражение> Do <оператор> ; Здесь, тело цикла выполняется до тех пор, пока логическое выражение возвращает значение True. Оператор цикла с постусловием Repeat <операторы> Until <логическое выражение> ; Здесь, тело цикла выполняется до тех пор, пока логическое выражение возвращает значение False. Если в теле цикла операторов For и While более одного оператора, то необходимо использовать составной оператор. Пример. Напечатать таблицу значений функций sin x и cos x на отрезке [0,1] с шагом 0.1 в следующем виде: x sin(x) cos(x) --------------------------------0.0000 0.0000 1.0000 0.1000 0.0998 0.9950 ......................... 1.0000 0.8415 0.5403 Решение: Program Table; Const a=0; b=1; h=0.1; { границы и шаг табулирования} Var x: Real; Begin x:=a; Writeln(‘x sin(x) сos(x)‘); { заголовок таблицы} Writeln(‘---------------------------------‘); While x<=b Do Begin Writeln(x:7:4,sin(x):7:4,cos(x):7:4); {вывод значений аргумента и функций} x:=x+h {увеличение аргумента на шаг} End; Writeln(‘---------------------------------‘) End. Пример. 1 n! Найти приближенное значение суммы ряда n , учитывающее все слагаемые, от начала ряда до первого, величина которого меньше e = 0,0001 . Решение: Program SumRow; Сonst e=1E-4; {точность вычислений} Var U,S,F:Real; {очередное слагаемое и сумма ряда} n:Integer; Begin n:=1; S:=1; F:=1; Repeat n:=n+1; F:=F*n;{вычисление факториала} U:=1/F; {вычисление очередного слагаемого} S:=S+U; {вычисление суммы ряда} Until Abs(S)<e; Writeln(‘Сумма ряда S=‘, S:7:4); End. МАССИВЫ Массив – это структурированный тип данных, который используется для описания упорядоченной совокупности фиксированного числа элементов одного типа, имеющих общее имя. Для обозначения элементов массива используются имя переменной массива и индекс. Type <имя типа массив> = Array [<тип индекса>] Of <тип элементов>; Var <имя переменной>: <имя типа массив>; <тип индекса> – перечисляемый, логический, символьный, диапазон. Поскольку тип массив относится к стандартным типам языка Паскаль, то он может быть использован в описаниях переменных и без определения для него специального имени в разделе описания типов. Var <имя переменной>: Array [<тип индекса>] Of <тип элементов>; Массивы обычно используются в тех программах, где требуется сохранять во время выполнения программы в памяти ЭВМ некоторую совокупность величин одного типа. Например, это требуется для задач, алгоритмы решения для которых предполагают неоднократное обращение к элементам заданной последовательности. Кроме того, массивы часто используются и в тех случаях, когда для решения задачи достаточно однократного использования каждого элемента последовательности и, следовательно, нет необходимости хранить все элементы в памяти ЭВМ. Примерами таких задач являются все задачи с последовательностями из предыдущего параграфа. Пример. Дана последовательность из n вещественных чисел. Упорядочить ее элементы по возрастанию. Решение: рассмотрим метод сортировки выбором. Отыскивается максимальный элемент и переносится в конец массива; затем этот метод применяется ко всем элементам, кроме последнего (он уже находится на своем окончательном месте), и т. д. Program SortCase; Const n=10; Type mas: Array [1..n] Of Real; Var x: mas; i, j, m: Integer; r: Real; Begin {ввод элементов массива} For i := 1 To n Do Readln(x[i]); For j := n Downto 2 Do Begin {поиск m - номера max x[1..j]} m:=1; For i :=2 To j Do If x[i]>x[m] Then m:=i; {перестановка элементов x[m] и x[j]} r:=x[j]; x[j]:=x[m]; x[m]:=r; End; {вывод элементов упорядоченного массива} For i:=1 To n Do Writeln(x[i]) End.