Методические указания и задания к лабораторным работам по курсу "алгоритмы и структуры данных "




НазваниеМетодические указания и задания к лабораторным работам по курсу "алгоритмы и структуры данных "
страница19/19
Дата публикации28.09.2013
Размер1.39 Mb.
ТипМетодические указания
vbibl.ru > Информатика > Методические указания
1   ...   11   12   13   14   15   16   17   18   19

. . .

ng:=1; vg:= n;

fl:=false;

while (ng<=vg) and not fl do

begin

i:=(ng+vg) div 2;

if keythen

vg:=i-1

else

if key>T[i].kl then

ng:=i+1

else

fl:=true;

end;

Оператор WHILE называют оператором цикла с предусловием.

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

REPEAT

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

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

. . .

UNTIL < логическое выражение >;

Последовательность операторов между ключевыми словами ^ REPEAT и UNTIL составляет тело цикла.

< логическое выражение > - определяет условие выхода из цикла.

Выполнение оператора: сначала выполняется тело цикла, затем проверяется Until – условие. Если оно не удовлетворяется (то есть логическое выражение принимает значение False), то итерация повторяется и снова проверяется условие. Процесс итераций продолжается до тех пор, пока логическое выражение примет значение True (условие выполнится). После этого произойдет выход из цикла.

Оператор ^ REPEAT называют оператором цикла с постусловием.

Пример:

i:=1; j:=n;

Repeat

. . .

i:=i+1;

. . .

j:=j-1;

. . .

Until i>j ;
Оператор над записями

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

< имя переменной > . < имя поля >

Рассмотрим фрагмент программы:

Type

Stud = record

Name: string[25];

Day: 1..31;

Montsh: 1..12;

Year: integer;

. . . . . . .

end;

Var

student: Stud;

Group: Array [1..25] Of Stud;

. . .

Begin

Student.Name:=’Иванов И.И.’;

Student.Day:=10;

Student.Montsh:=2;

. . . . . . . . .

End;

( в программе использованы составные имена ).

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

Структура оператора:

^ WITH < имя переменной > DO

< оператор >;

Или

WITH < имя переменной > DO

Begin

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

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

. . .

End;

С использованием WITH предыдущие операторы будут выглядеть так:

WITH Student DO

begin

Name:=’Иванов И.И.’;

Day:=10;

Montsh:=2;

. . .

end;

Теперь операторы, манипулирующие с полями записи, выглядят компактнее и нагляднее, чем в предыдущем варианте. Кроме того, эти операторы будут выполняться быстрее, так как адрес записи Student вычисляется только один раз при обработке конструкции

WITH Student DO

Использование WITH дает еще большую эффективность при обработке массива записей. Например,

For i:=1 to 25 do

Begin

. . .

WITH Group[i] DO

Begin

. . .

Writeln (‘Фамилия:’, Name);

Writeln (‘Год рождения:’, Year);

. . .

end;

. . .

end;
Если фрагмент программы содержит операции над записями разных видов, то в операторе ^ WITH можно указать список необходимых переменных-записей:

WITH < имя1 >[, < имя2 > . . . ] DO

Begin

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

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

. . .

End;
^ 5. ПРОЦЕДУРЫ И ФУНКЦИИ
Если программу, реализующую весь алгоритм решения задачи, представить единым блоком, то ее будет трудно отлаживать и изменять. Нужно выделить в алгоритме части, соответствующие определенным функциям вычислительного процесса, и согласно этому выделению разбить программу на самостоятельные фрагменты – подпрограммы.

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

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

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

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

- способствует разработке структурированных программ.

В системе ТР представлены два вида подпрограмм:

- процедуры.

- функции.

Они различаются назначением и способом использования.

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

^ Структуру процедуры (описание процедуры) можно представить так:

< заголовок процедуры >

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

< конец процедуры >

Заголовок процедуры:

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

(все формальные параметры должны указываться с типами данных).

Тело процедуры практически повторяет структуру всей Pascal – программы: содержит описания объектов, с которыми осуществляются действия, и последовательность операторов, составляющих смысл процедуры.

Конец процедуры: ключевое слово END и ”;”.
Пример 1

Program Lin_Sort;

Uses Crt;

Const Nmax=100;

Type Rec=Record

Name: String;

Area: Integer;

end;

Table=array [1..Nmax] of Rec;
Var T: Table; {таблица}

n: integer; {количество записей}

ch: byte;
. . . . . . . . .

procedure SortTab(var T:Table; n:integer);

{процедура сортировки таблицы методом линейного выбора}

var i, imin,j:integer;

tmp:rec;

begin

for i:=1 to n-1 do

begin

imin:=i;

for j:=i+1 to n do

if t[j].Areathen

imin:=j;

if imin<>i then

begin

{обмен записей}

tmp:=t[i];

t[i]:=t[imin];

t[imin]:=tmp;

end;

end;

end; { конец процедуры}
begin

. . .

SortTab(Т, n);

. . .

End. { конец программы}
Переменные, описанные в процедуре (в данном примере это переменные i, j, imin, tmp), называются локальными переменными. Они размещаются в оперативной памяти (в сегменте стека) при активизации процедуры. После завершения выполнения процедуры память, отведенная для локальных переменных, освобождается (то есть связь с этими переменными разрывается). Кроме того, в сегменте стека размещаются и формальные параметры процедуры.
В некоторый момент выполнения программы в сегменте стека может присутствовать несколько групп локальных переменных, соответствующих цепочке вызванных и не завершенных процедур. Отведение и освобождение памяти для локальных переменных выполняется по принципу стека. По умолчанию сегменту стека назначается размер, равный 16 К.
Формальные параметры процедуры могут быть:

- входными (передают в процедуру данные, необходимые для выполнения алгоритма, реализованного в процедуре),

- выходными (возвращают результаты выполнения процедуры).

Возможны частные случаи:

- входной параметр может быть одновременно и выходным,

- отсутствуют входные параметры,

- отсутствуют выходные параметры,

- вообще отсутствуют параметры (процедуры без параметров).

Формальные параметры не являются реальными объектами программы: при вызове процедуры они заменяются фактическими параметрами. Именно фактические параметры передаются процедуре и обрабатываются в ней.

В ТР существуют два способа передачи параметров:

- по ссылке,

- по значению.

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

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

< имя процедуры > (список фактических параметров);

Фактические параметры – это реальные объекты программы; при компиляции программы им выделяются участки памяти.

Требования к фактическим параметрам:

- между фактическими и формальными параметрами должно соблюдаться соответствие в количестве, порядке следования, типах;

- фактический параметр, передаваемый по значению, может быть константой, переменной, выражением;

- фактический параметр, передаваемый по ссылке, не может быть константой или выражением;

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

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

По определению работа процедуры завершается после выполнения последнего оператора ее тела. Однако в любой точке процедуры можно прервать ее выполнение с помощью системной процедуры Exit. Exit завершает работу процедуры и возвращает управление в точку вызова. Если же вызов Exit был произведен из главной программы , то программа завершит выполнение. Кроме того, можно выйти из программы в операционную систему с помощью системноq процедуры Halt.

Пример 2

Program Summa;

Var i, j, k : integer;

Procedure Sum1 (x, y, z : integer);

{ все параметры передаются по значению}

Begin

z:=x+y;

Writeln (‘Sum1: сумма=’, z);

End;

Procedure Sum2 (x, y : integer; Var z:integer);

{ x, y передаются по значению, z – по ссылке}

Begin

z:=x+y;

Writeln (‘Sum2: сумма=’, z);

End;

Begin { главная программа }

i:=1;

j:=2;

Sum1 (i, j, k);

Writeln ( ‘После обращения к Sum1: сумма=’, k);

Sum2 (i, j, k);

Writeln ( ‘После обращения к Sum2: сумма=’, k);

End.
Проанализируем работу приведенной программы.

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

Таким образом, значения фактических параметров i, j, k заносятся в системные переменные, например, в s1, s2, s3 соответственно.

После обращения к Sum1 на экран выведутся такие сообщения:

Sum1: сумма = 3

После обращения к Sum1: сумма = ???

что означает, что значение переменной k не определено.

После обращения к Sum2 на экран будет выведено:

Sum2: сумма = 3

После обращения к Sum2: сумма = 3

Процедура Sum1 организована неправильно, так как параметр-результат должен передаваться по ссылке.

Пример 3

Если в программе, приведенной в примере 1, написать заголовок процедуры в виде

procedure SortTab(T:Table; n:integer);

то при обращении к процедуре возникнут следующие ошибки.

Так как параметр T процедуры SortTab передается по значению, то при активизации SortTab создается копия таблицы Т, которая помещается в сегмент стека. Сразу же возникнет прерывание Переполнение стека, так как объем памяти, требуемый для Т, равен (2+255+1)*100=25800 байт, что превышает размер сегмента стека, назначаемый по умолчанию (16 К). Кроме того, процедура SortTab будет работать с копией таблицы Т и, следовательно, сама таблица Т останется неотсортированной.

Параметр Т является входным – выходным, поэтому его нужно передавать по ссылке ( пример 1).
Как было сказано ранее, подпрограмму можно оформить в виде функции. Назначение функции заключается в задании алгоритма вычисления некоторого значения и организации передачи этого значения в точку вызова.
^ Заголовок функции имеет следующую структуру:

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

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

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

Выход из функции осуществляется или после выполнения последнего оператора ее тела или с помощью Exit.
Пример 4
function hfunc(s:string; n:integer):integer;

{преобразование символьного ключа в целое число}

var len:integer;

begin

len:=length(s); {длина ключа}

hfunc:=((ord(s[1])+ord(s[len]))*len) mod n+1;

end;


6. ФАЙЛЫ
Определение файлов

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

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

Var

F :File Of integer;

понимается как определение под именем F последовательности целых чисел, расположенных, например, на магнитном диске.

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

При выполнении операций ввода – вывода текущий указатель может перемещаться по файлу, настраиваясь на тот или иной элемент файла. Этот элемент становится активным (текущим) и, как следствие, доступным для обработки.

В системе ТР поддерживаются три типа файлов (файловых переменных):

- файлы с типом (типизированные файлы),

- файлы без типа (нетипизированные или бестиповые файлы),

- текстовые файлы.

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

Объявление файла с типом имеет вид:

^ Var < имя переменной > : #File Of < тип >;

File, Of – служебные слова;

“тип” - тип элементов файла (базовый тип).

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

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

^ Var < имя переменной > : File;
Текстовый файл - это последовательность строк переменной длины, каждая из которых завершается маркером конца строки (CR/LF): управляющий код “перевод каретки”/ управляющий код “перевод строки” (#13/#10). Заканчивается текстовый файл специальным кодом ”конец файла” (^Z или #26).

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

Представителем текстового файла в Pascal-программе является переменная файлового типа, которая должна быть описана стандартным типом text. . Например,

Var inf: text;

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

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

Примеры описания файловых переменных:

Type

zap=record

kl: integer;

inf: string [60];

end;

str80= file of strinr[80];

Var

f1: file of char; { с типом }

f2: text; {текстовый}

f3: file; { без типа }

f4: str80; { с типом }

f1: file of zap; { с типом }
Операции над файлами с типами

Язык Pascal не содержит встроенных операций над файловыми переменными. Операции над файлами полностью реализованы в виде системных процедур и функций.
Для файлов с типами используются такие системные процедуры: ^ Assing, Reset, Rewrite, Close, Read, Write, Seek и системные функции Eof, FileSize, FilePos:
- Assing (F, < имя файла >

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

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

имя . расширение

(имя<=8 символов, расширение = 3 символам; в имени не допускаются символы ' ' (пробел), ‘.’, ‘,’, ‘:’, ‘*’, ‘?’, ‘\’).

Максимальная длина имени вместе с путем не должна превышать 79 символов.

Например, пусть в программе имеется оператор

Assing (F, 'd:\mydir\test.dta');

После выполнения данной процедуры файловая переменная F будет связана с файлом test.dta, расположенным на диске d в каталоге mydir. Для файла, находящегося в текущем каталоге, обращение к процедуре будет иметь вид:

Assing (F, 'test.dta');

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

предназначена для открытия файла. Открытие файла в данном случае предполагает поиск файла, связанного с файловой переменной F с помощью Assign. Эту процедуру нужно использовать в случаях, когда открываемый файл уже существует, то есть для операции чтения из файла. Текущий указатель файла устанавливается при этом на его начало (на первую компоненту, имеющую номер 0).

С помощью Reset можно также открывать файл для занесения в него дополнительной информации. И так как занесение возможно только в конец файла, то сначала необходимо позиционироваться в конец файла, а затем производить запись.
- Rewrite (F)

также предназначена для открытия файла, но при этом создается новый файл и текущий указатель устанавливается на его начало. Если файл с таким именем уже существует на диске, то он удаляется, а затем создается новый файл. Процедуру Rewrite нужно использовать для выполнения операции занесения записей в файл.
- Close (F)

предназначена для закрытия файла (то есть все действия с файлом завершаются). При этом ликвидируются внутренние буферы, образованные при открытии этого файла. После этого файловую переменную F можно связать посредством процедуры Assign с другим файлом.
- Read (F, P1 [, P2…])

предназначена для чтения компонент из файла в указанные переменные Р1, Р2, … . Тип файла и тип переменных должны совпадать. Выполнение операции чтения начинается с текущей позиции файла. Значения, содержащиеся в файле, последовательно считываются и поочередно присваиваются переменным Р1, Р2, … После считывания каждого значения указатель файла смещается на следующую позицию. Если в процессе чтения будет достигнут конец файла (то есть указатель установится на позицию, не содержащую информацию), то операция будет завершена. Возникновение состояния ”конец файла” проверяется с помощью системной функции Eof.
- Write (F, P1 [, P2…])

предназначена для записи в файл содержимого переменных Р1, Р2, … Тип файла и тип переменных должны совпадать. Информация записывается в позицию файла, определяемую текущим указателем. После записи очередной переменной указатель файла передвигается на одну позицию.
- Seek (F, n)

устанавливает указатель на n-ую компоненту файла (n- выражение типа longint). Первая компонента имеет номер 0, поэтому Seek (F, 0) установит указатель на начало файла.
- Eof (F)

используется для поверки состояния ”конец файла”. Функция принимает логическое значение True, если достигнут ”конец файла”, и False – в противоположном случае.
- FileSize (F)

возвращает количество компонент в файле (предварительно файл нужно открыть). Результат имеет тип longint.
- FilePos (F)

возвращает номер текущей компоненты файла (первая компонента имеет номер 0). Тип результата - longint.
^ Обработка ошибок ввода-вывода

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

Ошибки ввода-вывода можно обрабатывать в пользовательской программе. Для этого используется директива компилятора {$I-}, отключающая автоматическую проверку кода завершения, и системная функция IOResult, которая передает код в программу. В зависимости от полученного значения можно указать в программе те или иные действия.
Нулевое значение функции IOResult свидетельствует об успешном выполнении операции ввода-вывода, ненулевое – о возникшей ошибке. Например,

“Файл не найден” ( код = 2 )

“Путь не найден” ( код = 3 )

“Слишком много открытых файлов” ( код = 4 )

“Файл не открыт” ( код = 103 )

“Файл не открыт для ввода” ( код =104 )

“ Файл не открыт для вывода ” ( код =105 )

При использовании программной обработки ошибок нужно помнить следующее положение: если какая-либо операция завершилась аварийно, то до обращения к функции IOResult все последующие операции ввода-вывода с любыми файлами будут игнорироваться. Поэтому обработку ошибки нужно организовать так, чтобы обращение к IOResult и анализ кода ошибки осуществлялись сразу после выполнения операции с файлом.
Следует также помнить, что после обращения к функции IOResult код возврата последней операции устанавливается в 0. То есть все последующие обращения к IOResult будут давать нулевой результат, пока какая-либо файловая операция не закончится аварийно.
Замечание

Для того чтобы расширить файл, открытый процедурой ^ Reset(F), нужно сначала выполнить позиционирование с помощью обращения к процедуре Seek (F, FileSize(F)). И так как записи нумеруются с нуля, то функция FileSize(F) вернет номер позиции, следующей за последней записью. На эту позицию установится текущий указатель, и с нее начнется добавление записей.
^ Операции над файлами без типов

Для файлов без типа системные процедуры Reset и Rewrite используются с двумя параметрами:

Reset (F [,n]), Rewrite (F [,n])

nпараметр типа word, задает размер записи в байтах. Если второй параметр опущен, то предполагается размер, равный 128 б.

Используются также процедуры ^ Seek (F, n) и функции Eof, FileSize, FilePos.
Операции над текстовыми файлами

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

Для работы с текстовыми файлами также используются процедуры ^ Assign, Reset (только для чтения из файла), Rewrite (только для записи в файл), Close.

Дополнительно для текстовых файлов определены процедуры Append, Read, ReadLn, Write, WriteLn и функция Eoln:

  • ^ Append (F)

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


  • Read ([F,] P1 [, P2…])

читает информацию из файла F (если файл задан, иначе – с клавиатуры) в переменные P1, P2,…Процедура чтения зависит от типа переменной, стоящей в списке.


  • ReadLn ([F, ] [P1, P2, …])

отличается от процедуры Read тем, что после прочтения данных в переменные пропускаются все оставшиеся символы данной строки и маркер конца строки. Если в процедуре отсутствует список переменных, то происходит переход к следующей строке.


  • Write ([F,] P1 [, P2…])

записывает информацию в файл (если он задан, иначе – на экран) из задаваемых переменных P1, P2,… Процедура записи зависит от типа переменной, стоящей в списке. Для символьных, арифметических и строковых переменных выводится их значение, для Boolean – строка TRUE или FALSE. Если поле задает больше позиций, чем требуется для вывода, то оно слева дополняется пробелами, иначе выводятся самые правые символы из представления переменной.


  • WriteLn ([F, ] [P1, P2, …])

отличается от процедуры ^ Write тем, что после вывода всех переменных в файл записывается маркер конца строки.
- Eoln (F)

используется для проверки конца строки. Если конец строки достигнут, то функция ^ Eoln возвращает значение TRUE, иначе – FALSE. Если Eof (F) возвращает TRUE, то значение Eoln (F) также будет TRUE.

Пример

Процедура чтения записей из файла в таблицу:

. . .

Const Nmax=100;

Type Rec=Record

Name: String[15];

Area: Integer;

end;

Table=array [1..Nmax] of Rec;
Var T: Table {таблица}

n: integer; {количество записей в таблице}

. . .

procedure InFileTab( var T: Table; var n: integer);

var cod: byte;

f: file of rec;

fname: string;

ch: char;

begin

ClrScr; {очистка экрана}

repeat

Writeln('Введите имя файла');

ReadLn(fname);

Assign(f,fname);

{$I-} {отключение контроля ошибок ввода/вывода}

Reset(f);

{$I+}

cod:=IOResult;

if cod<>0 then { файл не найден }

begin

WriteLn('Не могу найти файл ', fname);

Writeln('Продолжить работу? y/n');

ch:=ReadKey;

if ch in ['n','N','т','Т'] then

exit; {выход в меню}

end;

until cod=0;

n:=0;

while not eof(f)do

begin

n:=n+1;

read(f,T[n]);

end;

close(f);

end;

. . .

^ 7. УПРАВЛЕНИЕ КОНСОЛЬЮ
Консоль оператора физически состоит из двух устройств: клавиатуры и монитора. Программы управления консолью содержатся в Unit Crt. Они позволяют считывать символы с клавиатуры без отображения на экране, устанавливать различные режимы отображения текста, определять “окна”, позиционировать курсор, определять положение курсора внутри окна, устанавливать цвет фона и символов, включать-выключать звуковой динамик IBM PC.
Для управления консолью используются следующие системные функции:

- KeyPressed

возвращает TRUE в случае когда на клавиатуре нажата клавиша, порождающая символ. На клавиши Alt, Ctrl, NumLock, ScrollLock, Shift, CapsLock функция не реагирует.
- ReadKey

возвращает символ, соответствующий нажатой клавише, или ждет нажатия. Введенный символ на экране не отображается.
- Window (X1, Y1, X2, Y2)

определяет окно (X1, Y1 – координаты левого верхнего угла, X2, Y2 – правого нижнего; тип координат – байт). Курсор устанавливается в позицию (1,1) окна, то есть в левый верхний угол. Применение процедур и функций из Unit Crt в дальнейшем будет оказывать влияние только на эту область экрана. При запуске Pascal – программы начальное окно совпадает со всем физическим экраном. На экране в каждый момент времени активно только одно (последнее) окно.
- GotoXY (X, Y)

перемещает курсор в позицию (X, Y) (координаты определяются в пределах окна)
- WhereX

определяет X – координату положения курсора относительно текущего окна.
- WhereY

определяет Y – координату положения курсора относительно текущего окна.
Для управления цветовым режимом вывода символов на экран удобнее всего пользоваться системной переменной TextAttr, определенной в секции Interface CRT.
Переменная TextAttr имеет следующую битовую структуру:


Номер бита

7

6 5 4

3 2 1 0

Что определяет

Мерцание

1-да, 0-нет

Цвет фона

(8 значений)

Цвет символов

(16 значений)

Цвет




Крас Зел Гол

Ярк Крас Зел Гол


Общая формула для значений типа Byte имеет вид:
Значение = B7*27 + B6*26 + B5*25 + B4*24 + B3*23 + B2*22 + B1*21 + B0*20
Множители B0, B1, … B7 – это значения соответствующих битов, равные 0 или 1, а числовые множители – это два в степени номера бита.

Выражение можно упростить:
Значение=24 *(B7*23 +B6*22 + B5*21 + B4*20)+(B3*23+B2*22+ B1*21+ B0*20)=

= 16* (< цвет фона >) + (< цвет символа>)
(константа, определяющая цвет фона, умножается на 16).
В Unit CRT введены следующие цветовые константы:

{константы для цвета букв и фона}

Black = 0; {0000 - черный}

Blue = 1; {0001 - голубой}

Green = 2; {0010 - зеленый}

Cyan = 3; {0011 - бирюзовый}

Red = 4; {0100 - красный}

Magenta = 5; {0101 - малиновый}

Brown = 6; {0110 - коричневый}

LightGray = 7; {0111 – свело-серый}
{константы для цвета букв}

DarkGray = 8; {1000 – темно-серый}

LightBlue=9; {1001 – светло-голубой}

LightGreen=10; {1010 – светло-зеленый}

LightCyan=11; {1011 - салатный}

LightRed=12; {1100 – светло-красный}

LightMagenta=13; {1101 - розовый}

Yellow = 14; {1110 - желтый}

White = 15; {1110 - белый}

Blink = 128; {мерцание букв}
Пример цветовых установок:

TextAttr:= 16*4 + 15=79; или TextAttr:=16*Red + White;

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

  • ClrScr

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


  • TextColor (Color)

устанавливает цвет выводимых на экран символов (параметр может принимать значения от 0 до 31).


  • TextBackground (Color)

устанавливает цвет фона под символом.


  • HighVideo

устанавливает повышенную яркость выводимых символов.


  • LowVideo

устанавливает обычную яркость выводимых символов.


СОДЕРЖАНИЕ


Введение………………………………………………………………………..….4

Классификация структур данных…………………………………………….…5

Структура оперативной памяти……………………………………………….....6

Лабораторная работа 1. Методы сортировки постоянных таблиц и поиска в таблицах…………………………………………….…..7

Лабораторная работа 2. Динамические структуры данных……………….….33

Лабораторная работа 3. Таблицы с вычисляемым входом…………………...57

Литература……………………………………………………………...….….…65

Приложение А. Пример программы, выполняющей сортировку таблицы.....66

Приложение Б. Пример программы обработки списка………………....…....71

Приложение В. Пример программы для работы с хеш-таблицей …………...74

Приложение Г. Краткое описание системы Turbo Pascal…………………...77





МЕТОДИЧЕСКИЕ УКАЗАНИЯ И ЗАДАНИЯ


к лабораторным работам по курсу

«Алгоритмы и структуры данных»

( направление подготовки 6.050103 ”Программная инженерия”)


Составители: Галина Георгиевна Шалдырван

Наталья Стефановна Костюкова


1   ...   11   12   13   14   15   16   17   18   19

Похожие:

Методические указания и задания к лабораторным работам по курсу \"алгоритмы и структуры данных \" iconФизика методические указания к лабораторным работам 10, 31
Козлов В. А., Курушин А. Д., Серов Е. А. Физика. Методические указания к лабораторным работам 10, 31 // Под общ ред доц. С. Г. Стоюхина....

Методические указания и задания к лабораторным работам по курсу \"алгоритмы и структуры данных \" iconМетодические указания и задания к лабораторным работам по курсам “
Дискретные структуры“, “Теория алгоритмов и вычислительных процессов“ (для студентов специальностей 050102 “Программное обеспечение...

Методические указания и задания к лабораторным работам по курсу \"алгоритмы и структуры данных \" iconМетодические указания к лабораторным наборам предназначены для студентов,...
Металлургическая гидроаппаратура: Методические указания к лабораторным работам / Санкт-Петербургский государственный горный институт...

Методические указания и задания к лабораторным работам по курсу \"алгоритмы и структуры данных \" iconМетодические указания к лабораторным работам по дисциплине «Автоматизация...
Сапр простейшей структуры на основе расчета и анализа критериев эффективности с использованием имитационных моделей

Методические указания и задания к лабораторным работам по курсу \"алгоритмы и структуры данных \" iconМетодические указания к лабораторным работам по курсу “
В прологе предусматриваются основные арифметические операции +, -, /, ×, mod, div. Чтобы заставить систему выполнить присваивание...

Методические указания и задания к лабораторным работам по курсу \"алгоритмы и структуры данных \" iconМетодические указания к лабораторным работам по дисциплине «Программирование»
Тема: Разработка классов, создание конструкторов и деструкторов. Использование статических членов класса

Методические указания и задания к лабораторным работам по курсу \"алгоритмы и структуры данных \" iconУчебное пособие к лабораторным работам
Автоматизированные информационно-управляющие системы: учебное пособие к лабораторным работам / Л. С. Казаринов, Т. А. Барбасова,...

Методические указания и задания к лабораторным работам по курсу \"алгоритмы и структуры данных \" iconКонтрольные задания по курсу «Экономико-математическое моделирование»...
Контрольные задания по курсу «Экономико-математическое моделирование» и методические указания к их выполнению

Методические указания и задания к лабораторным работам по курсу \"алгоритмы и структуры данных \" iconКонтрольные задания по курсу «Экономико-математическое моделирование»...
Контрольные задания по курсу «Экономико-математическое моделирование» и методические указания к их выполнению

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

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
vbibl.ru
Главная страница