Gotoxy(35,13)

Writeln(‘Здравствуйте!’);

Readln;

End.

Работа с окнами.

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

Window(x1,y1,x2,y2);

Которая определяет на экране новое активное текстовое окно. Где х1, у1- координаты верхнего левого угла окна, х2, у2- координаты нижнего правого угла.

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

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

§ Весь вывод выполняется только в активное окно.

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

Процедура или функция Назначение
ClrScr Очищает активное окно и устанавливает курсор в левый верхний угол
ClrEol Очищает строку активного окна от текущей позиции курсора до конца строки без изменения позиции курсора.
GoToXY(x,y) Перемещает курсор в позицию с координатами Х,У в рамках активного окна
WhereX Функция, которая возвращает Х координату текущей позиции курсора, (относительно активного окна)
WhereY Функция, которая возвращает У координату текущей позиции курсора, (относительно активного окна)

Пример2. Демонстрация процедуры WINDOW и различных цветов фона.

USES Crt;

Var k,x:integer;

Begin

TextBackGround(0);

ClrScr;

X:=2;

For k:=1 to 7 do begin

TextBackGround(k);

Window(x,1,x+11,25);

ClrScr;

X:=x+11; End;

Readln;

End.

Задержка при выполнении программы.

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

Delay(time); где Time- время задержки в миллисекундах

Управление клавиатурой

Keypresed -проверяет наличие символов в буфере клавиатуры и возвращает значение true, е сли на клавиатуре была нажата какая либо клавиша(т.е. буфер не пуст), и false в противном случае.

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

Repeat

Until keypresed;

Функция Keypresed не удаляет введенный символ из буфера клавиатуры. Это делает функция Readkey- возвращает значение типа Char,


Тема № 9: «Структурированные типы данных»

9.1. Массивы

Массив - это одномерная упорядоченная совокупность элементов некоторого типа, которые адресуются с помощью некоторого индекса. Члены этой совокупности называются элементами массива. Каждый элемент определяется именем массива и его положением в массиве. Положение элемента в массиве определяется его индексом (порядковым номером).

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

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

Объявление одномерного массива:

VAR

Имя_массива: ARRAY[1..k] OF <Тип_данных>;

Здесь переменная k задает количество элементов в массиве, при этом значение индекса элементов лежит в интервале от 1 до k и может принимать только целые значения.

Массивы могут иметь и более одного измерения. Размерность ("мерность") массива определяет количество индексов отдельного элемента.

Объявление двумерного массива (двумерной матрицы):

Имя_массива: ARRAY [1..k1,1..k2] OF Тип_данных;

Здесь k1 задает количество строк и диапазон изменения индекса строк, k2 - количество столбцов и диапазон изменения индекса столбцов.

Объявление трехмерного массива:

Имя_массива: ARRAY[1..k1,1..k2,1..k3] OF < Тип_данных>;

Здесь k1 задает количество строк и диапазон изменения индекса строк, k2 - количество столбцов и диапазон изменения индекса столбцов, k3 - количество слоев и диапазон изменения индекса слоев.

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

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

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

На примере двумерного массива А(5х6) рассмотрим ввод элементов массива и вывод их на экран в виде строк и столбцов.

Program Wwod_Wywod;

Var A: Array [1..5,1..6] of integer;

I,J: Integer;

Begin

For I:=1 to 5 do

For J:=1 to 6 do

read(A[I,J]); - считывание в цикле всех 30 элементов массива

For I:=1 to 5 do Begin

For J:=1 to 6 do Write (A[i,J]:4); - вывод в одну строку значений элементов массива вложенного цикла длиной в 4 символа.

Writeln; переход на новую строку.

End;

End.

При работе с массивами не надо забывать, что в каждый момент времени мы работаем с одним конкретным элементом массива заданного типа. Если элементов массива много, то для ввода значений часто используют функцию Random(Х), которая возвращает случайное целое число, равномерно распределенное в диапазоне от 0 до Х-1 (Х – параметр обращения). Если параметр Х опущен, то функция возвращает вещественное число в диапазоне от 0 до 1.

Program Wwod;

Var A: Array [1..8,1..10] of Integer;

I, J: Integer;

Begin

For I:=1 to 8 do

For J:=1 to 10 do A[I,J]:= Random(100);

……………

End.

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

Сортировка выбором:

Устанавливаем номер наименьшего элемента массива и меняем местами наименьший и первый элементы массива. Затем эту процедуру повторяем над оставшимися элементами массива, до тех пор, пока остаток не сократится до одного элемента.

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

Разберем еще один алгоритм сортировки массива.

Обменная сортировка:

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

Пример.

Отсортировать массив в порядке убывания (сортировка осуществляется при помощи двух вложенных циклов)

For j:=1 to N-1 do

Begin

NEW:=MAS[N];

K:=N;

For i:=N downto j do

If MAS[i]>NEW then

Begin

K:=i;

NEW:=MAS[i]

End;

MAS[K]:=MAS[j];

MAS[J]:=NEW;

End;


9.2. Записи

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

Структура объявления записи такова:

<имя типа>=RECORD <список полей> END

Здесь <имя поля >-правильный идентификатор;

RECORD(запись), END(конец) - зарезервированные слова;

<список полей> - список полей; представляет собой последовательность разделов записи, между которыми ставится точка с запятой.

Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором ставится двоеточие и описание типа поля (полей), например:

VAR Reference_book = RECORD

Surname,

Name,

Address,

City: STRING[20];

Post_Index: STRING[4];

Telephone: STRING[12];

END;

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

Например:

Reference_book.Surname:=’Иванов’;

9.2.1. Оператор присоединения

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

WITH <имя записи> DO

BEGIN

<операторы, содержащие имена полей записи>

END;

Например:

WITH Reference_book DO

BEGIN

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

END;

9.2.2. Записи с вариантами.

Особой разновидностью записей являются записи с вариантами, которые объявляются с использованием зарезервированного слова CASE. С помощью записей с вариантами можно одновременно сохранять различные структуры данных, которые имеют большую общую часть, одинаковую во всех структурах, и небольшие отличающиеся части в различных структурах. Например, рассмотрим запись PERSON, расширяющую возможности записи Reference_book, за счет введения дополнительных полей:

TYPE

Person = RECORD

Surname,

Name,

Address,

City: STRING[20];

Post_Index: STRING[4];

Telephone: STRING[12];

CASE Hobby: (Computer, Music) of

Computer: (Type_Comp:STRING[20];

Mbyte:BYTE;

Compatible:BOOLEAN);

Music: Instrument: ARRAY[1..3] OF STRING[10];

END;

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


9.3. Множества

Наряду с записями и массивами в ТП 7.0 существует еще один структурированный тип данных - множество.

Множество - это наборы однотипных логически связанных друг с другом объектов. Количество элементов, входящих в множество, может меняться в пределах от 0 до 256 (множество, не содержащее элементов, называется пустым). Именно непостоянством количества своих элементов множества отличаются от массивов и записей.

Описание типа множества имеет вид:

<имя типа>=SET OF<баз. тип>

Здесь <имя типа> - правильный идентификатор;

SET (множество), OF (из)- зарезервированные слова;

<баз. тип> - базовый тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме WORD, INTEGER, LONGINT.

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

Над множествами определены следующие операции:

* - пересечение множеств; результат содержит элементы, общие для обоих множеств;

[1,2]*[3.4]=[];

+ - объединение множеств; результат содержит элементы первого множества, дополненные недостающими элементами из второго множества:

[1,2]+[3,4]=[1,2,3,4];

- - разность множеств; результат содержит элементы из первого множества, которые не принадлежат второму:

[1..10] - [5..15]=[1..4];

= проверка эквивалентности; возвращает TRUE, если оба множества эквивалентны;

[1,2,3] =[1,2] - FALSE;

<> - проверка неэквивалентности; возвращает TRUE, если оба множества неэквивалентны;

[1,2,3]<>[1,2,2] - TRUE;

<= - проверка вхождения; возвращает TRUE, если первое множество включено во второе;

[X] <= [1..20], если Х -целое число из диапазона 1.. 20;

>= - проверка вхождения; возвращает TRUE, если второе множество включено в первое;

[1,2,3] >=[1,2] - TRUE;

IN - проверка принадлежности; первый элемент - выражение, а второй - множество одного и того же типа; возвращает TRUE, если выражение имеет значение, принадлежащее множеству:

3 IN [1..10,12] - TRUE

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

INCLUDE- включает новый элемент в множество.

INCLUDE (S,I)

Здесь S- множество, состоящее из элементов базового типа;

I - элемент, который необходимо включить во множество.

EXCLUDE - исключает элемент из множества

EXCLUDE (S,I)

Здесь S- множество, состоящее из элементов базового типа;

I - элемент, который необходимо исключить в множестве.


9.4. Строки

Турбо - Паскаль предоставляет средства для работы с данными строкового типа. Строковый тип данных представляет собой цепочку символов. Длина цепочки может изменяться от 0 до 255. Для определения строкового типа используется служебное слово STRING, за которым в квадратных скобках указывается максимальная длина строки

Например:

Type

line = string[25];

Var

mline: line;

...

В данном примере переменная mline представляет собой последовательность, включающую до 25 символов, причем каждый символ имеет стандартный тип CHAR.

9.4.1. Основные операции

Для строковых типов данных определена операция "конкатенация", обозначаемая символом '+'. Смысл операции заключается в формировании новой строки. Динамическая длина сформированной строки равна сумме символов строк-операндов, а ее значение равно последовательности символов исходных строк.

Например:

Var

str1, str2: string[10];

st: string[25];

Begin

str1:= 'Турбо - ';

str2:= 'Паскаль';

st:= str1 + str2;

WriteLn(st)

End.

В результате выполнения программы будет на экране отображена текстовая строка: 'Турбо - Паскаль '.

Кроме операции конкатенации над значениями строковых типов разрешены операции сравнения <, <=, >, >=, =, <>, IN, при выполнении которых действуют следующие правила:

а) более короткая строка всегда меньше более длинной;

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

Например:

'a' < 'б', т.к. ORD('a') < ORD('б');

в) компаратор IN определяет вхождение левого операнда в правый. Если левый операнд входит в правый, то результат компарации будет истинным (TRUE), в противном случае - ложным (FALSE). Левым операндом может быть только элементарное данное (здесь символ), а правым - любое множество элементов.

9.4.2. Доступ к элементам строковых данных

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

Например:

Var

mline: string;

i: integer;

Begin

...

for i:= 1 to length(mline) do

if mline[i] IN ['a'...'z'] then

mline[i]:= chr(ord(mline[i]) + 1);

...

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

9.4.3. Пустой стринг

Стринг, длина которого равна 0, называется пустым. Пустой стринг изображается в виде двух апострофов, записанных рядом, без пробела: ''.

Например:

...

If st = '' then

writeln('стринг st пуст');

...

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

9.4.4. Функции преобразования

Для строковых типов данных определены следующие функции преобразования:

STR(x[:width[:decimals]];var s:string) - эта функция преобразует численное значение x в его строковое представление s.

VAL(s:string; var x,code:integer) - эта функция преобразует строковое значение s в его численное представление x.

9.4.5. Стандартные процедуры и функции

INSERT(source: string; var s: string; index: integer) - эта процедура предназначена для вставки строки SOURCE в строку S, начиная с символа с номером INDEX в этой строке.

DELETE(var s: string; index, count: integer) - эта процедура производит удаление из строки-параметра S подстроки длиной COUNT, начиная с символа с номером INDEX.

CONCAT(s1, [s2,...]: string): string - эта функция выполняет слияние строк-параметров, которых может быть произвольное количество. Каждый параметр является выражением строкового типа. Если длина результирующей строки превышает 255 символов, то она усекается до этой длины.

COPY(s: string; index: integer; count: integer): string - эта функция возвращает подстроку, выделенную из исходной строки S, длиной COUNT символов, начиная с символа под номером INDEX.

POS(substr, s: string): byte - эта функция производит поиск в строке S подстроки SUBSTR. Результатом функции является номер позиции подстроки в исходной строке.

LENGTH(s: string): integer - эта функция возвращает текущую длину строки S.

MOVE(var x, y; count: word) - эта функция копирует заданное количество COUNT последовательных байт из источника X в приемник Y.

FILLCHAR(var x; count: word; value) - эта функция заполняет заданное количество COUNT последовательных байт переменной X указанным значением VALUE.

UPCASE(CH) - эта функция возвращает для символьного выражения CH соответствующую заглавную букву; если значением CH является любой другой символ (в т.ч. строчная буква русского алфавита), функция возвращает его без преобразования.


Тема № 10: Работа с файлами

Файл - это именованная область внешней памяти компьютера (жесткого диска, гибкой дискеты, электронного «виртуального» диска), содержащая логически связанную совокупность данных.

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

В зависимости от способа объявления можно выделить три типа файлов: типизированные файлы (задаются предложением FILE OF...), текстовые файлы (определяются типом NEXT), нетипизированные файлы (определяются типом FILE), которые в программе (в разделе VAR) объявляются следующим образом:

<файловая переменная>: file of <тип компоненты>;

<файловая переменная >: text;

<файловая переменная>: file;

<файловая переменная> - это логическое имя файла, используемое в программе. <тип компоненты>-компонентой файла может быть как переменная базового уровня, так и структурного. Структурный тип определяет данные типа «запись» (record).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: