Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инф - видеолекции.docx
Скачиваний:
15
Добавлен:
28.10.2018
Размер:
5.57 Mб
Скачать

Целые типы в языке Паскаль

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

Например:

VAR X, Y, Z: INTEGER

Операции для целого типа:

- Арифметические операции

- Операции отношения

- Побитовые логические операции

Арифметические операции:

1) «+» – сложение (2–х операндов) или «неизменение» знака (для 1–го операнда); результат имеет целый

тип, например R := A+2; A := +R;

2) «–» – вычитание (для двух операндов) или изменение знака (для 1–го операнда); результат имеет целый

тип, например R := A–B; D := –C.

3) «*» – умножение; результат имеет целый тип

4) «DIV» – деление для целых с отбрасыванием дробной части; результат имеет целый тип

5) «MOD» – вычисление остатка от деления 2–х целых чисел; результат имеет целый тип и определяется

так: A MOD B = A – ( A DIV B ) * B

6) «/» – деление для целых с сохранением дробной части, результат имеет вещественный тип, например, в результате деления 1/4 получится 0.25, а в результате вычисления 6/2 получится 3.0

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

К данным целого типа можно применять следующие стандартные функции:

– ABS, SQR, SUCC, PRED, INC, DEC (дают результат целого типа)

– SIN, COS, ARCTAN, LN, EXP, SQRT (дают результат вещественного типа)

– ODD (даёт результат булевского типа)

– CHR (даёт результат символьного типа)

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

В это множество обычно входят:

- Латинские буквы

- Буквы национального алфавита (например, кириллица)

- Десятичные цифры

- Скобки, знаки препинания, символ подчеркивания ( '_' )

- Символы арифметических операций

Необходимо отметить, что пробел является отдельным символом, входящим в множество символов.

Символы в множестве строго упорядочены, т.е. каждый символ имеет свой номер (код): 0, 1,…255, … .

В реализации языка Паскаль в системе Delphi имеется два вида наборов символов:

Первый соответствует однобайтовой кодировке ANSI

Второй – двухбайтовой кодировке символов Unicode

Пример:

Кодировка ASCII предполагает следующее соответствие символов и кодов:

' ' (пробел) – 32; 'A' – 65 … 'z' – 90 ; '0' – 48 … '9' – 57,

поэтому выражение '1' >= 'A' принимает значение FALSE, а выражение ' ' <= 'z' – значение TRUE.

Имена переменных и констант символьного типа рекомендуется начинать с символов «с» или «ch».

Например

«сKeyPressed», «chGetKey»

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

Вещественные типы в языке Паскаль

Тип

Диапазон значений

Число значащих разрядов

Требования к памяти в байтах

Real48

–2.9·1039 .. 1.7·1038

11–12

6

Real

–5.0·10324 .. 1.7·10308

15–16

8

Single

–1.5·1045 .. 3.4·1038

7–8

4

Double

–5.0·10324 .. 1.7·10308

15–16

8

Extended

–3.6·10–4951 .. 1.1·104392

10–20

10

Comp

–263 +1 .. 263–1

10–20

8

Currency

–922337203685477.5808 ..

922337203685477.5807

10–20

8

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

Родовым (т.е. обеспечивающим максимальную производительность) является тип Real, который в настоящий момент эквивалентен типу Double, но в последующих версиях Delpi это может быть изменено.

Примеры вещественных чисел с десятичным порядком:

1. Вещественное число 45,3·10–3 может представляться на языке Паскаль в виде вещественной константы с десятичным порядком следующим образом: +45.3E–3 или 4.53E–2 или 0.453E–1

2. Вещественное число –45·104 может быть представлено на языке Паскаль в виде вещественной константы с десятичным порядком следующим образом: –45E4 или –4.5E5 или –0.45E+6

Переменные вещественного типа – это переменные, для которых в разделе описания переменных указывается один из вещественных типов.

Например:

«VAR A, B: REAL;»

Арифметические операции для вещественных чисел:

«+» – сложение или неизменение знака

«–» – вычитание или изменение знака

«*» – умножение

«/» – деление с сохранением дробной части

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

К данным вещественного типа можно применять следующие стандартные функции:

- ABS

- SQR

- SIN

- COS

- ARCTAN

- LN

- EXP

- SQRT (результат вещественного типа)

- TRUNC

- ROUND (результат целого числа)

Имена переменных и констант вещественного типа рекомендуется начинать с символа «f».

Например:

«fMyFunction»

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

Константы в списке считаются упорядоченным слева направо и имеют внутренние номера: 0, 1, 2, и т.д. Данные перечисляемого типа делают программу более наглядной, понятной и облегчают её отладку.

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

Пусть, например, в программе должна быть переменная FileMode, в которой хранится один из возможных режимов работы приложения с файлом: чтение, редактирование и запись данных. Если не использовать перечисляемый тип, то можно объявить переменную FileMode типа Word и присваивать ей в нужные моменты времени одно из трех чисел: 0 – режим чтения, 1 – режим редактирования, 2 – режим записи. Тогда программа будет содержать операторы вида «if (FileMode = 1) then ...».

Но через некоторое время программист наверняка забудет, что означает значение FileMode, равное 1, а разбираться другим пользователям в таком коде будет очень сложно. Используя перечисляемый тип, можно определить переменную FileMode как переменную перечисляемого типа и обозначить ее возможные значения как mRead, mEdit, mWrite. Тогда приведенный выше оператор изменится следующим образом: «if (FileMode = mEdit) then ...». Очевидно, такой оператор понятнее, чем предыдущий.

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

«VAR <имя переменной> : (<значение 1>, ..., < значение n>);».

Пример:

Задание переменной перечисляемого типа FileMode.

VAR

FileMode: (mRead, mEdit, mWrite);

BEGIN

. . .

FileMode: =mRead;

. . .

Case FileMode of

mRead: ReadFile();

mEdit: EditFile();

mWrite: WriteFile();

END;

. . .

END.

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

<const1>..<const2> , где сonst1 и const2 – константы одного и тоже базового типа, которые задают минимальное и максимальное значение в диапазоне, причём const1 <= const2.

Базовым типом может быть:

- Булевский

- Целый

- Символьный

- Перечисляемый

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

Например:

VAR

Month1, Month2: 1..12;

C, D: ‘A’..’F’;

Temperature, T2: –50..50;

Константы ограниченного типа – константы, расположенные в указанном отрезке базового типа.

Данные ограниченного и перечисляемого типов делают программу более наглядной и облегчают её отладку.

Массивом называется структура данных, позволяющая хранить под одним именем совокупность (последовательность) данных (переменных) любого, но только одного какого–то типа. Массив характеризуется размерностью, своим именем, базовым типом хранимых элементов, размером и способом нумерации элементов.

Имя массива – общее имя переменных, входящих в массив.

Базовый тип массива – тип переменных, входящих в массив.

Элементы массива – переменные, входящие в массив.

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

Размерность массива – количество индексов, которое необходимо для однозначной идентификации любого элемента массива.

Размер массива – общее количество элементов в массиве.

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

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

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

ARRAY [ТИП ИНДЕКСА, …] OF ТИП ЭЛЕМЕНТА

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

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

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

Пример:

A[2,3]:=3.14;

A[i,j]:=i*i+j–2;

A[i,2]:=A[i–1,j+2];

B[j]:=3; B[j+i]:=i+j;

C['B',–3,December, j>15] := –25;

C['F',0,January, TRUE] := j*i;

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

Строки представляют собой последовательность символов и фактически реализованы как массив из символов.

Пример описания строк:

VAR S: ARRAY[1..50] of char;

или

VAR S: String[50];

или

VAR S: String; //без указания размера строки

Переменные комбинированного типа или записи – это набор (совокупность) данных различных типов, объединенных одним общим именем.

Физически запись представляет собой структуру данных, в которой содержится информация о характеристиках какого-либо объекта. Каждая запись имеет поля. Это отдельные данные записи, которые можно рассматривать как различные характеристики (свойства) объекта. Поля записи могут быть любого допустимого в языке Паскаль типа данных.

Пример:

Type

TStudent = record

Fam, Name, Otch : String[20];

YearBirth : Integer;

Sex : Boolean;

Group : String[10];

Stipendia, Wes : Real;

end;

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

Синтаксис оператора следующий:

WITH <переменная 1>, <переменная 2>, …

DO <оператор>;

где

«переменная1», «переменная2»,… – это имена переменных комбинированного типа (записей)

«оператор» – один оператор, в котором осуществляется доступ к полям указанных переменных, причем префикс с точкой в такой переменной отсутствует.

Как правило, оператор является составным (begin…end), чтобы сгруппировать множество операторов доступа к записи, например, операторы присваивания, приведенные выше, могут быть записаны с использованием оператора WITH следующим образом:

WITH Stud1 DO BEGIN

Fam := ’Иванов’;

YearBirth := 1990;

Wes := 75.3;

END;

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

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

Например:

Type

ALFA = set of ‘A’..’Z’;

OPER = set of (‘+’,’-’, ’/’, ’*’);

Digits = set of 0..9;

setMonths = set of 1..12;

Var setDig: Digits;

A: ALFA;

O: OPER;

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

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

Пример.

Если на основе описанного выше типа setMonths (месяцы в году) необходимо сконструировать множество «весна», то для этого можно применить конструктор множества: [3,4,5],

а для множества «зима» [12,1,2].

В программе это может быть сделано следующим образом:

Var

Vesna: setMonths = [3,4,5];

Zima : setMonths = [12,1,2];

или в разделе операторов с помощью присваивания:

Begin

Vesna := [3,4,5];

Zima := [12,1,2];

Пусть заданы три множества.

Var

A,B,C: setMonths;

Begin

A:= [1,2,3,4];

B:= [3,4,5,6];

C:= [2,4];

End.

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

Под вводом понимается процесс передачи информации с внешнего устройства в оперативную память ЭВМ.

Под выводом – передача информации в противоположном направлении.

В консольном приложении экран монитора состоит из N строк и M символов в каждой строке. В стандартном режиме N=25, M=80.

Для создания консольных приложений в код программы вставляется директива компилятору {$APPTYPE CONSOLE}.

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

Стандартные процедуры ввода могут вводить с клавиатуры следующие данные:

- Целые, вещественные константы в двух формах записи

- Символьные и строковые константы без ограничивающих апострофов

Стандартные процедуры вывода позволяют выводить на экран:

- Целые и вещественные константы и переменные

- Символьные и строковые переменные и константы без ограничивающих апострофов

- Булевские константы и переменные

Формат стандартных процедур ввода READ и READLN следующий:

Read(<переменная1>,<переменная2>,...);

или

ReadLn[(<переменная1>,<переменная2>,...)];

Здесь:

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

Пример.

Фрагмент программы ввода может иметь следующий вид:

Var Ch : char;

Begin

Writeln (‘Введите первый символ - ’);

ReadLn ( Ch );

Writeln (‘первый символ - ’, Ch );

Writeln (‘Введите второй символ - ’);

ReadLn ( Ch );

Writeln (‘второй символ - ’, Ch )

End.

Формат стандартных процедур вывода:

Write (<выражение1>[:<ширина поля вывода>[:<дробных цифр>]],

<выражение2>[:<ширина поля вывода>[:<дробных цифр>]],

...);

или

WriteLn [(<выражение1>[:<ширина поля вывода>[:<дробных цифр>]],

<выражение2>[:<ширина поля вывода>[:<дробных цифр>]],

...)];

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

Процедуры и функции

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

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

- Процедуры

- Функции

Процедура – подпрограмма, которая имеет 0, 1 или несколько входных или выходных параметров.

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

Процедуры и функции делятся на:

- Стандартные

- Пользовательские

К стандартным процедурам относятся:

- Write

- Writeln

- Read

- Readln

К стандартным функциям относятся:

- SIN(X)

- COS(X)

- SQRT(X)

Использование процедур и функций осуществляется для того, чтобы:

1. Разбить большую и сложную программу на более простые модули

2. Сократить объем памяти

3. Упростить и ускорить отладку и проектирование программы

4. Использовать стандартные и ранее разработанные подпрограммы

Для использования процедур в программе необходимо:

1. В разделе описания процедур и функций поместить описание процедур и функций

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

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

Procedure <имя процедуры> [(<список формальных параметров>)];

<тело процедуры>;

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

«тело процедуры» – блок, имеющий такую же структуру, что и программа на языке Паскаль

Параметры могут быть следующими:

- Параметры переменные

- Параметры значения

- Параметр процедура или параметр функция

Первыми в списке формальных параметров следуют формальные параметры значения. Они описываются так:

<Параметр>, <Параметр>, … : тип1;

<Параметр>, <Параметр>, … : тип2;

. . .

После этого следуют параметры переменные. Они начинаются с ключевого слова Var и имеют точно такой же синтаксис.

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

Синтаксис для описания функции:

Function <имя функции> [(<список формальных параметров>)] : <Тип

выходного параметра>;

<тело функции>;

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

оператор, присваивающий значение функций. Кроме того, значение функции можно присвоить с использованием второй неявной переменной Result

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

Пример.

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

Program min_max_array;

Function minarray ( x: array [1..10] of integer): integer;

Var i, min: integer;

Begin

min:= x[1];

for i:= 2 to 10 do

if x[i] < min then min:= x[i];

minarray:= min;

end;

Procdure maxarray ( x: array [1..10] of integer; var max: integer);

Var i: integer;

Begin

max:= x[1];

for i:= 2 to 10 do

if x[i] > max then max:= x[i];

end;

Var A[10], B[10], C[10], x, y: integer;

begin

//ввод массивов А,В,С

maxarray(A,x); //находим мах в массиве А. Результат в переменной х

y:= minarray (A) + x; //находим сумму мах и мин

writeln (y);

maxarray(B,x); //находим мах в массиве B. Результат в переменной х

y:= minarray (B) + x; //находим сумму мах и мин

writeln (y);

maxarray(C,x); //находим мах в массиве C. Результат в переменной х

y:= minarray (C) + x; //находим сумму мах и мин

writeln (y);

end.

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

Например:

Procedure X (var a:real); Forward;

Procedure Y (var b:integer);

Begin

...

X(b);

...

End;

Переменные, описанные вне процедуры и функции, называются глобальными переменными и описываются вне подпрограммы. Переменные, а также подпрограммы, описанные в самой процедуре или функции, называются локальными переменными или подпрограммами. Доступность имен в подпрограммах зависит от уровня вложенности подпрограмм. Главная программа имеет уровень вложенности 0. Подпрограмма, описанная внутри подпрограммы i-го уровня, имеет уровень i+1.

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

Под рекурсивным определением подпрограммы или под рекурсией будем понимать такое описание (представление) подпрограммы, которое содержит внутри себя ссылку на определяемую подпрограмму.

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

к подпрограммам.

Примеры алгоритмов и программ

Пример.

Разработаем блок-схемы алгоритма и программу поиска действительных корней квадратного уравнения

program kvUravnenie;

var a,b,c,D,x1,x2,x: real;

begin

Write ('Введите a,b,c: ');

Readln (a,b,c);

If (a=0) then

begin

If (b=0) then Writeln('a и b не могут быть равны 0 одновременно')

Else

Begin

Writeln('Это линейное уравнение.');

Writeln('Корень один, х = ', -c/b)

end;

end

Else // т.е. a<>0

Begin

D:=b*b-4*a*c; //вычисляем дискриминант

If D<0 then Writeln('Действительных корней нет.')

Else

If D=0 then writeln ('Один корень: x=', -b/(2*a))

Else writeln ('Два корня: x1=',(-b+sqrt(D))/(2*a),

', x2=',(-b-sqrt(D))/(2*a));

End;

Readln

end.

Часть 14