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

Книга Лекции Паскаль

.pdf
Скачиваний:
19
Добавлен:
24.02.2016
Размер:
902.53 Кб
Скачать

Василькова И.В.

Лекции

Паскаль

type mas =

array [1 .. 10] of real;

{1}

Color

= array [byte] of mas;

{2}

В первом операторе описан тип массива из вещественных элементов, которые нумеруются от 1 до 10. Во втором операторе элементами массива являются массивы типа mas, а нумеруются они в пределах, допустимых для типа byte, то есть от 0 до 255.

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

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

const n = 6;

type intmas = array [1 .. n] of integer;

После задания типа массива переменные этого типа описываются обычным образом, например:

var a, b : intmas;

Можно описать тип прямо при определении переменных: var a, b : array [1 .. n] of integer;

С массивами в целом можно выполнять только присваивание. При этом массивы должны быть одного типа, например:

b := a;

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

a[4] b[i]

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

Инициализация массивов. Можно присвоить значения элементам массива до начала выполнения программы. Это делается в разделе описания констант:

const a : intmas = (0, 5, -7, 100, 15, 1);

Количество констант должно точно соответствовать числу элементов массива.

Пример #7.1.

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

Program

max_elem;

const n

= 20;

var a :

array [1 .. n] of real;

i :

integer;

max

: real;

begin

 

writeln('Введите ', n, ' элементов массива'); for i := 1 to n do read(a[i]);

31

Василькова И.В.

Лекции

Паскаль

 

 

 

max := a[1];

 

 

for i := 2 to n do

 

 

if a[i] > max then max := a[i]; writeln('Максимальный элемент: ', max:6:2)

end.

Пример #7.2.

Упорядочивание по возрастанию элементов массива из 20 целых величин.

Для сортировки будем использовать метод выбора. Алгоритм состоит в том, что сначала выбирается наименьший элемент массива и меняется местами с первым элементом, затем просматриваются элементы, начиная со второго, и наименьший из них меняется местами со вторым элементом, и так далее n - 1 раз. На последнем проходе цикла при необходимости меняются местами предпоследний и последний элементы массива.

Program

sort;

{ Сортировка выбором }

const n

= 20;

 

 

var a : array [1 .. n] of integer;

 

 

i, j, nmin, buf : integer;

 

 

begin

 

 

 

writeln('Введите ', n, ' элементов массива');

 

for

i := 1 to n do read(a[i]);

{ просмотр массива

n-1

for

i := 1 to n - 1 do begin

раз }

nmin := i;

 

 

 

{ поиск минимума

}

 

for j := i + 1 to n do

if a[j] < a[nmin] then nmin := j;

buf :=

a[i];

{ перестановка }

a[i]:=

a[nmin];

{

двух }

a[nmin]:= buf;

{

элементов массива }

end;

writeln('Упорядоченный массив:'); for i := 1 to n do write(a[i]:5)

end.

7.4. Двумерные массивы

Элемент массива может быть любого типа, кроме файлового, следовательно, он может быть и массивом:

const n = 4; m = 3;

type mas = array [1 .. n] of integer; mas2 = array [1 .. m] of mas;

Более компактно это можно записать так:

type mas2 = array [1 .. m, 1 .. n] of integer;

Здесь описан тип массива, состоящего из m массивов, каждый из которых содержит n целых чисел. Иными словами, это матрица из m строк и n столбцов (рис. 7.1). Обе размерности массива должны быть константами

32

Василькова И.В. Лекции Паскаль

или константными выражениями. Имя типа указывается при описании переменных:

var a, b : mas2;

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

a11 a12 a13 a14 a21 a22 a23 a24 a31 a32 a33 a34 | 1-я строка | 2-я строка | 3-я строка |

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

Рис. 7.1.

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

a[1, 4] b[i, j] b[j, i]

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

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

const a : mas2 = (( 2, 3, 1, 0), ( 1, 9, 1, 3),

( 3, 5, 7, 0) );

С массивами в целом определена только одна операция – присваивание массивов одного типа (например, b:= a). Все остальные действия выполняются с отдельными элементами. Например, чтобы ввести с клавиатуры двумерный массив, необходимо организовать вложенные циклы:

for i := 1 to m do

for j := 1 to n do read(a[i, j]);

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

Пример #7.3.

Программа, которая для целочисленной матрицы 3 х 4 определяет среднее арифметическое ее элементов и количество положительных элементов в каждой строке. Схема алгоритма приведена на рис. 7.2.

33

Василькова И.В.

Лекции

Паскаль

 

 

 

 

 

 

Рис. 7.2.

34

Василькова И.В.

 

 

 

 

Лекции

Паскаль

program

sred_n;

=

4;

 

 

const m

=

3; n

 

 

var a : array [1

.. m, 1 .. n] of integer;

 

i, j,

n_pos_el : integer;

 

sred : real;

 

 

 

begin

i

:= 1

to m

do

 

for

 

for

j

:= 1

to n

do read(a[i, j]);

 

sred := 0;

to m

do begin

 

for

i

:= 1

 

 

n_pos_el

:=

0;

 

 

for j :=

1 to n do begin

 

 

 

sred

:=

sred + a[i, j];

 

if a[i, j] > 0 then inc(n_pos_el);

end;

writeln('В ', i, '-й строке ', n_pos_el, ' положительных элементов');

end;

sred := sred / m / n;

writeln('Среднее арифметическое: ', sred:6:2);

end.

7.5. Строки

Строки используются для хранения последовательностей символов. В Паскале три типа строк:

стандартные (string);

определяемые программистом на основе string;

строки в динамической памяти.

Строка типа string может содержать до 255 символов. Под каждый символ отводится по одному байту, в котором хранится код символа. Еще один байт отводится под фактическую длину строки. Для коротких строк использовать стандартную строку неэффективно, поэтому в язык введена возможность самостоятельно задавать максимальную длину строки, например:

type str4 = string [4];

Здесь описан собственный тип данных с именем str4. Переменная этого типа занимает в памяти 5 байт. Длина строки должна быть константой или константным выражением. Примеры описания строк:

const n = 15;

var s : string;

{ строка стандартного типа }

s1

: str4;

{ строка типа str4, описанного выше }

s2

: string [n]; {описание типа задано при описании переменной}

Инициализация строк, как и переменных других типов, выполняется в разделе описания констант:

const s3 : string [15] = 'shooshpanchik';

35

Василькова И.В.

Лекции

Паскаль

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

s2 := 'shooshpanchik';

s1 := s2; { в s1 будут помещены символы "shoo" } Строки можно склеивать между собой с помощью операции

конкатенации, которая обозначается знаком +, например:

s1

:=

'ком';

{ результат - "компот" }

s2

:=

s1 + 'пот';

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

'abc' > 'ab' 'abc' = 'abc' 'abc' < 'abc '

Имя строки может использоваться в процедурах ввода-вывода: readln (s1, s2);

write (s1);

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

К отдельному символу строки можно обращаться как к элементу массива символов, например, s1[4]. Символ строки совместим с типом char, их можно использовать в выражениях одновременно, например:

s1[4] := 'x'; writeln (s2[3] + s2[5] + 'r');

7.6. Процедуры и функции для работы со строками

Функция Concat(s1, s2, ..., sn) возвращает строку, являющуюся слиянием строк s1, s2, ..., sn. Ее действие аналогично операции конкатенации.

Функция Copy(s, start, len) возвращает подстроку длиной len, начинающуюся с позиции start строки s. Параметры len и start должны быть целого типа.

Процедура Delete(s, start, len) удаляет из строки s, начиная с позиции start, подстроку длиной len.

Процедура Insert(subs, s, start) вставляет в строку s подстроку subs, начиная с позиции start.

Функция Length(s) возвращает фактическую длину строки s, результат имеет тип byte.

36

Василькова И.В.

Лекции

Паскаль

Функция Pos(subs, s) ищет вхождение подстроки subs в строку s и возвращает номер первого символа subs в s или 0, если subs не содержится в s.

Процедура Str(x, s) преобразует числовое значение x в строку s, при этом для x может быть задан формат, как в процедурах вывода write и writeln,

например, Str(x:6:2, s).

Процедура Val(s, x, errcode) преобразует строку s в значение числовой переменной x, при этом строка s должна содержать символьное изображение числа. В случае успешного преобразования переменная errcode равна нулю. Если же обнаружена ошибка, то errcode будет содержать номер позиции первого ошибочного символа, а значение x неопределено.

Пример #7.4.

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

Program censor;

var s, str : string[10];

f

:

text;

i, dl

:

integer;

begin

assign(f, 'primer.txt'); reset(f); writeln('Какую последовательность заменять?');

readln(s);

dl := length(s);

while not Eof(f) do begin readln(f, str);

i := 1;

while i <> 0 do begin i := Pos(s, str);

if i <> 0 then begin Delete(str, i, dl); Insert('...', str, i);

end;

end;

writeln(str);

end;

close(f)

end.

7.7.Записи

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

37

Василькова И.В.

Лекции

Паскаль

разнотипных данных предназначен тип "запись". Он вводится с помощью ключевого слова record. Элементы записи называются полями:

type имя_типа = record

описание 1-го поля записи; описание 2-го поля записи;

...

описание n-го поля записи;

end;

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

type goods

=

record

name

:

string[20];

price :

real;

number:

integer;

end;

Переменные типа "запись" описываются обычным образом. Можно задавать описание типа при описании переменной, создавать массивы из записей, записи из массивов:

var g1, g2

:

goods;

stock

:

array [1 .. 100] of goods;

student :

record

name

 

: string [30];

group

: byte;

marks

: array [1 .. 4] of byte;

end;

Можно присваивать одну запись другой, если они одного типа, например:

g1 := g2;

g2 := stock[3];

Все остальные действия выполняются с отдельными полями записи. Есть два способа доступа к полю записи: либо с помощью конструкции имя_записи.имя_поля, либо с использованием оператора присоединения with, например:

g1.price := 200; with g1 do begin

price := 200; number := 10 end;

Пример #7.5.

Сведения о товарах на складе хранятся в текстовом файле. Для каждого товара отводится одна строка, в первых 20 позициях которой записано наименование товара, а затем через произвольное

38

Василькова И.В.

Лекции

Паскаль

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

program store; const Max_n = 100; type

str20 = string [20]; goods = record

name

: str20;

price

: real;

number : integer;

end;

: array[1 .. Max_n] of goods;

var stock

i, j, len : integer;

name

: str20;

found

: boolean;

f

: text;

begin

 

assign(f, 'stock.txt'); reset(f); i := 1;

while not Eof(f) do begin

with stock[i] do readln(f, name, price, number);

inc(i);

{1}

if i > Max_n then begin

writeln('Переполнение массива'); exit end;

 

end;

{2}

while true do begin

writeln('Введите наименование'); Readln(name);

 

len := length(name);

{3}

if len = 0 then break;

for j := len + 1 to 20 do name := name + ' ';

{4}

found := false;

{5}

for j := 1 to i - 1 do begin

if name <> stock[j].name then continue;

 

with stock[j] do writeln (name:22, price:7:2,

number:5);

 

found := true;

 

break;

 

end;

{6}

if not found then writeln ('Товар не найден');

end;

 

end.

 

Инициализация записей выполняется в разделе констант, при этом для каждого поля задается его имя, после которого через двоеточие указывается значение:

const g : goods = ( name: 'boots';

price: 200; number: 10 );

39

Василькова И.В.

Лекции

Паскаль

8. Файлы

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

Файловые типы языка Паскаль бывают стандартные и определяемые программистом. Стандартными являются текстовый файл (text) и бестиповой файл (file). Они описываются в программе, например, так:

var ft : text; fb : file;

Программист может определить файл, состоящий из элементов определенного типа. Такой файл называется компонентным, или типизированным:

var fc : file of <тип_компонент>

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

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

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

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

'primer.pas' - имя файла в текущем каталоге

'd:\pascal\input.txt' - полное имя файла 'CON' 'NUL' 'COM1' 'PRN' - имена устройств

Для организации ввода-вывода в программе необходимо выполнить следующие действия:

объявить файловую переменную;

связать ее с физическим файлом;

открыть файл для чтения и/или записи;

выполнить операции ввода-вывода;

закрыть файл.

40