Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

kulakov-prog-pascal

.pdf
Скачиваний:
89
Добавлен:
13.02.2015
Размер:
540.49 Кб
Скачать

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

описании типа.

10. Переменные

Переменная – это величина, которая может изменять свое значение во время выполнения программы. При описании переменной необходимо указать ее тип. Тип переменной описывает набор значений, которые она может принимать, и действия, которые могут быть над ней выполнены.

Тип переменных определяется пользователем в разделе описания переменных, который размещается в программе или подпрограмме после раздела описания констант и перед первым словом begin.

Раздел описания переменных начинается с зарезервированного слова var. Для описания переменных используется следующий формат:

список переменных : тип;

Список содержит идентификаторы однотипных переменных, разделенные запятыми.

Пример описания переменных: var F, G: Real;

I, J, K: Integer;

C:Char;

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

Для задания начальных значений переменным (инициализации переменных) Паскаль позволяет присваивать начальные значения переменным одновременно с их описанием. Для этого используется конструкция

имя переменной: тип = значение;

которая должна быть размещена в разделе описания констант, например: const Weight: real = 0.4;

11. Структура программы

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

Заголовок программы содержит имя программы, например:

Program PRIM;

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

Раздел описания модулей определяется служебным словом USES и содержит имена подключаемых модулей (библиотек). Раздел описания модулей должен быть первым среди разделов описаний. Имена модулей отделяются друг от друга запятыми:

uses CRT, Graph;

11

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

label 3, 471, 29, Quit;

Описание констант позволяет использовать имена как синонимы констант, их необходимо определить в разделе описаний констант:

const K= 1024; MAX= 16384;

В разделе описания переменных необходимо определить тип всех переменных, используемых в программе:

var P,Q,R: integer; A,B: char; F1,F2: boolean;

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

Раздел операторов представляет собой составной оператор, который содержит между служебными словами begin и end последовательность операторов. Операторы отделяются друг от друга точкой с запятой. Текст программы заканчивается точкой. Кроме описаний и операторов программа может содержать комментарии, которые представляют собой произвольную последовательность символов, расположенную между открывающей фигурной скобкой и закрывающей фигурной скобкой.

12. Выражения

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

1)унарная операция not, унарный минус, взятие адреса (@);

2)операции типа умножения (*, /, div, mod, and, shl, shr);

3)операции типа сложения (+, -, or, xor);

4)операции отношения (=, <>, <, >, <=, >=, in, {}).

Выражения могут состоять из более простых выражений.

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

13. Операторы

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

12

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

Оператор присваивания состоит из двоеточия и знака равенства:

:=

Справа от оператора записывают выражение, слева указывают имя переменной, которой присваивается значение выражения:

имя:= выражение;

Примеры: x:=1; a:=5.02;

b:=32*a+Sin(x); S:='Иван Иваныч';

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

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

begin операторы end;

Составной оператор объединяет операторы в группу. Этим оператором начинается и заканчивается раздел выполнения основной программы или подпрограммы. После последнего оператора end основной программы ставится точка.

Для ввода исходных данных используются операторы ввода:

Read(A1, A2, … AK); ReadLn(A1, A2, … AK); ReadLn;

Первый из них реализует чтение К значений исходных данных и присваивание этих значений переменным А1, А2, …, АК. Второй оператор выполняет чтение К значений исходных данных, пропуск остальных значений до начала следующей строки, присваивание считанных значений переменным А1, А2, …, АК. Третий оператор выполняет пропуск строки данных.

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

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

var V, S: Real;

W, J: Integer; C, D: Char;

13

...

Read(V, S, W, J); Read(C, D);

Значения исходных данных могут отделяться друг от друга пробелами и нажатием клавиш табуляции и Enter.

Для вывода результатов работы программы на экран используются операторы вывода:

Write(A1, A2,… AK); WriteLn(A1, A2,… AK); WriteLn;

Первый из этих операторов реализует вывод значений переменных А1, А2, …, АК в строку экрана. Второй оператор выполняет вывод значений переменных А1, А2, …, АК и переход к началу следующей строки. Третий оператор выполняет пропуск строки и переход к началу следующей строки.

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

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

Оператор вывода позволяет задать ширину поля вывода для каждого элемента списка вывода. В этом случае элемент списка вывода имеет вид А:К, где А – выражение или строка, К – выражение либо константа целого типа. Если выводимое значение занимает в поле вывода меньше позиций, чем К, то перед этим значением располагаются пробелы. Если выводимое значение не помещается в ширину поля К, то для этого значения будет отведено необходимое количество позиций. Для величин действительного типа элемент списка вывода может иметь вид А:К:М, где А – переменная или выражение действительного типа, К – ширина поля вывода, М – число цифр дробной части выводимого значения. К и М – выражения или константы целого типа. В этом случае действительные значения выводятся в форме десятичного числа с фиксированной точкой.

Пример записи операторов вывода: var A, B: real;

P, Q: integer;

...

writeln(A, B:10:2); writeln(P, Q:8);

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

PROGRAM SUM;

var A,B,C,S: real; begin

read(A,B,C); S:= A+B+C;

writeln('S=', S:8:3) end.

14

Битовая арифметика введена в Паскаль для обеспечения возможности работы с двоичными разрядами (битами). Операции битовой арифметики применимы только к целым типам.

Первая группа битовых операций – логические операции not (отрицание), and (И), or (ИЛИ) и xor (исключающее ИЛИ). Операция not является унарной, она изменяет каждый разряд целого числа на обратный. Операции and, or и xor – бинарные, операнды этих операций – целые величины одинаковой длины. Операции выполняются поочередно над всеми двоичными разрядами операндов.

Вторая группа операций – это операции сдвига влево shl и вправо shr:

I shl N I shr N

Эти операции сдвигают двоичную последовательность значения I влево или вправо на N двоичных разрядов. При этом биты, уходящие за пределы разрядной сетки, теряются, а освободившиеся двоичные разряды заполняются нулями. При сдвиге вправо отрицательных значений освободившиеся разряды заполняются единицами.

Условный оператор включает в себя операторы, которые выполняются или не выполняются в зависимости от записанного в операторе условия. Оператор имеет вид:

If условие Then оператор1 Else оператор2;

Условие – выражение логического типа. Оператор1 выполняется, если условие верно (TRUE); оператор2 выполняется, если условие не верно (FALSE).

В условном операторе может отсутствовать блок Else т. е. условный оператор может иметь вид:

If условие Then оператор;

Поскольку операции сравнения имеют низший приоритет, то при проверке нескольких условий эти условия заключаются в скобки.

Условный оператор может применяться для идентификации объекта по определенным признакам составляющих его элементов. Если объектом является треугольник, то элементами могут быть три его угла a, b и c:

if (a>90) or (b>90) or (c>90)

then writeln('Треугольник - тупоугольный'); if (a<90) and (b <90) and (c<90)

then writeln('Треугольник - остроугольный');

В случае зависимых событий могут применяться вложенные условные операторы. Во вложенных условных операторах служебное слово else относится к ближайшей конструкции If.

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

For i:= N1 To N2 Do оператор;

Оператор для цикла с декрементом имеет вид:

For i:= N1 DownTo N2 Do оператор;

Здесь i – параметр цикла, N1– начальное значение параметр, N2 – конечное значение. N1 и N2 могут быть константами, переменными или выражениями.

15

Цикл с инкрементом выполняется при условии N1 <= N2. Значение параметра i возрастает с шагом 1 от N1 до N2.

Цикл с декрементом выполняется при условии N1 >= N2. Значение параметра i убывает с шагом 1 от N1 до N2.

В операторе цикла не разрешается присваивать параметру цикла какое-либо значение. После окончания цикла значение параметра не определено.

Оператор цикла часто применяется для суммирования некоторой последовательности чисел. Сумма членов последовательности величин a1, a2, …, aN

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

SN = 12 + 32 + 52 + … + (2*N–1)2:

PROGRAM SUM_K;

var a,S,i,N: word; begin

write('Введите число членов суммы N='); readln(N);

S:= 0;

{Цикл суммирования}

for i:= 1 to N do begin a:= Sqr(2*i-1);

S:= S+a

end;

writeln('Конечная сумма S=', S); writeln('Нажмите Enter'); readln

end.

В Паскале применяются два оператора цикла с условием.

Цикл с предусловием выполняет проверку условия перед каждым выполнением оператора:

While условие Do оператор;

Цикл с постусловием выполняет проверку условия после каждого выполнения оператора:

Repeat операторы Until условие;

Условие – это выражение логического типа (Boolean).

В цикле While оператор выполняется если условие верно (True), если условие ложно (False), то цикл заканчивается, т. е. цикл While повторяется пока выполняется условие. Цикл While начинается проверкой условия, поэтому, если начальное условие ложно, то оператор не выполняется ни разу. Для включения в тело цикла нескольких операторов применяется составной оператор.

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

Циклы с условием обычно используются в тех случаях, если количество повторений блока операторов заранее не известно, например, при расчете суммы членов бесконечного ряда с заданной погрешностью.

16

Если члены ряда являются функциями аргумента x, то ряд называется функциональным. Приведем пример расчета значения функции y=sin(x) с использованием представления функции в виде ряда:

y = x – x3/3! + … + (–1)(N+1)x(2*N+1)/(2*N+1)! + … ,

где a0=x, aN=k*aN-1, k=(–x2)/(2*N*(2*N+1)), N=0, 1, 2, …

Каждый член ряда аN при N>0 можно получить умножением предыдущего члена ряда aN-1 на коэффициент k. Приближенное значение функции находится как частичная сумма N членов ряда. Погрешность вычисления значения функции зависит от количества членов ряда и значения х, поэтому расчет заканчивается при |aN| < eps, где eps – допустимая погрешность.

PROGRAM SIN_R;

var y,x,eps,a,k: real; n: word;

begin

write('Введите значение x='); readln(x);

write('Введите значение погрешности еps='); readln(eps); writeln;

n:= 0;

a:= x; {первый член ряда}

y:= a; {первая частичная сумма ряда} while abs(a)>eps do begin

n:= n+1;

k:= -x*x/(2*n*(2*n+1)); a:= a*k;

y:= y+a;

writeln('Приближенное значение функции ',y:11:8,' при n=',n) end;

writeln('Нажмите Enter'); readln; end.

Операторы ограничения и прерывания цикла применяются внутри операторов цикла. Операторы имеют вид:

Continue; – ограничение цикла, Break; – прерывание цикла.

Действие оператора Continue заключается в передаче управления на начало цикла, при этом проверяется условие выхода из цикла. Действие оператора Break заключается в передаче управления оператору, следующему за последним оператором цикла. Во вложенных циклах операторы Continue и Break действуют только на цикл в котором они записаны.

Оператор перехода служит для передачи управления помеченному оператору и имеет вид:

Goto метка;

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

17

Меткой может быть целое положительное число или идентификатор. Меткой помечается оператор, которому передается управление, например:

M1: write('Введите x>=0'); readln(x); if x<0 then goto M1;

Метки описываются в разделе описания, например: label M1;

Метка не может стоять перед оператором Begin.

Оператор варианта Case состоит из выражения (переключателя) и списка операторов, каждому из которых предшествует одна или более констант (они называются константами выбора) или ключевое слово else:

case выражение of константа_1: оператор;

константа_N: оператор; else оператор;

end;

Переключатель должен иметь тип Byte, Shortint, Integer, Boolean или Char;

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

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

Приведем пример оператора варианта: case I of

0, 2, 4, 6, 8: writeln('Четная цифра');

1, 3, 5, 7, 9: writeln('Нечетная цифра'); end;

14. Структурированные типы данных

Массивы представляют собой упорядоченную совокупность однотипных величин. Каждая отдельная величина называется компонентой массива. Тип компонент называется базовым типом. Тип компонент может быть любым, кроме файлового.

Вся совокупность компонент определяется одним именем. Для обозначения отдельных компонент используется конструкция, называемая переменной с индексом:

A[5]

S[k+1]

B[3,5]

В качестве индекса может быть использовано выражение. Тип индексов может быть только интервальным или перечисляемым. Индексы интервального типа, для

18

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

Чтобы использовать массив в программе на Паскале, требуется, во первых, определить параметры массива (тип индекса и тип компонента), во-вторых, описать переменную-массив. Описание типа массива задается следующим образом:

имя типа = array [список типов] of тип;

Тип индекса в определении типа заключается в квадратные скобки после служебного слова array, а тип компонента задается после служебного слова of.

Пример:

type wordtype = array[1..12] of char; var Name: wordtype;

Второй способ описания массива – упрощенный: тип массива определяется неявно вместе с описанием переменной. Пример:

var Name: array[1..12] of char;

Двумерные массивы хранятся в памяти ЭВМ по строкам. Первый индекс определяет номер строки, второй – номер столбца. Пример описания матрицы целых чисел, состоящей из 5 строк и 10 столбцов:

var Matrix: array[1..5, 1..10] of integer;

Пример описания трехмерного массива:

var B: array[1..5, 1..10, 1..8] of integer;

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

R1:=Z;

Для ввода или вывода массива в список ввода или вывода помещается переменная с индексом, а операторы ввода или вывода выполняются в цикле.

Инициализация массивов выполняется с помощью типизированных констант, например:

type Dim10 = array[1..10] of real;

const M10: Dim10 = (0, 2.1, 4, 5.65, 6.1, 6.7, 7.2, 8, 8.7, 9.3);

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

type Dim3x2 = array[1..3,1..2] of integer; const M3x2: Dim3x2 = ((1,2)(3,4)(5,6));

Особое место в языке Паскаль занимают массивы символов. Стандартный Паскаль допускает два способа хранения символьных массивов в памяти ЭВМ: распакованный и упакованный. Распакованные массивы символов хранятся в памяти ЭВМ по одному символу в машинном слове, упакованные – по одному символу в байте. При описании упакованного массива символов используют служебное слово PACKED, например:

var Mas: packed array[1..20] of char;

Описание распакованного массива символов имеет вид: var M: array[1..20] of char;

Для преобразования символьного массива из распакованной формы в упакованную и наоборот, из упакованной в распакованную, в язык Паскаль введены две стандартные функции Pack и UnPack.

19

Упакованный массив символов образует символьную строку. Символьная строка может быть либо строковой константой, либо строковой переменной. Строковая константа, или строка, представляет собой совокупность символов, заключенную в апострофы. Строка – это элементарная конструкция языка Паскаль. Строковые константы могут входить в состав выражений. Как и числовые константы, они могут быть описаны в разделе описания констант.

Строковые переменные – это одномерные упакованные массивы символов, для описания которых введен тип String. Например, если строка содержит до 30 символов, ее тип будет определен как

type s= String[30];

Длина строки не может содержать более, чем 255 символов.

В Турбо Паскале определено понятие строки переменной длины, в этом случае ее описание задается как

type s= String;

Тип String без указания длины совместим со всеми типами строк. Особенностью строковых переменных является то, что к ним можно

обращаться как к скалярным переменным, так и к массивам. Во втором случае применяется конструкция «переменная с индексом», что обеспечивает доступ к отдельным символам строки. При этом нижняя граница индекса равна 1. Отдельный символ строки совместим с типом Char.

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

Для строк определены операции присваивания, слияния (конкатенации) и сравнения.

Для сравнения строк применяются все операции отношения. Сравнение строк происходит посимвольно, начиная с первого символа. Строки равны, если имеют одинаковую длину и посимвольно эквивалентны.

Строки могут быть элементами списка ввода – вывода, при этом записывается имя строки без индекса.

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

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

Для определения длины строки предназначена стандартную функцию Length, которая получает в качестве аргумента строку (значение типа String), а возвращает длину строки (значение типа Integer).

Пример программы, которая присоединяет одну строку к концу другой:

PROGRAM SCON;

var s1, s2: string; k: integer;

begin

{ Ввод первой строки } write(’Введите строку: ’);

20

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]