Мансуров. Основы программирования в среде Lazarus. 2010
.pdfГлава 3 Более сложные элементы языка
____________________________________________________________________
LightCyan -ярко-бирюзовый;
LightRed - ярко-красный;
LightMagenta - ярко-малиновый;
Yellow - желтый;
White - белый;
Blink - мерцание (мигание);
Процедура TextBackGround(Color)- устанавливает цвет фона.
Процедура ClrScr - очищает экран, одновременно окрашивая его в цвет установленного фона.
Процедура Window(x1, y1, x2, y2)- определяет на экране окно,
где x1, y1- координаты левого верхнего угла, а x2, y2- координаты пра-
вого нижнего угла окна
Функция KeyPressed - возвращает значение true, если клавиша нажата и false – в противном случае.
Функция readkey – считывает символ с клавиатуры.
Пример.
Написать программу, которая очищает экран и устанавливает синий фон.
Затем выводит текст желтым цветом.
program project1;
uses
CRT, FileUtil;
begin
TextBackGround(Blue);
ClrScr;
GoToXY(6, 6);
TextColor(Yellow);
221
3.5 Модули в Паскале
____________________________________________________________________
writeln(UTF8ToConsole('Привет, Вася!'));
writeln(UTF8ToConsole('Нажмите любую клавишу'));
readkey;
end.
Дальнейшие "игры" с цветами и окнами предоставляю вам самому, ува-
жаемый читатель, а сейчас давайте напишем более серьезную программу.
Пример.
В некой компании по продаже компьютеров имеются менеджеры, фамилии которых, хранятся в массиве Name. В другом массиве имеются данные о коли-
честве проданных компьютеров каждым менеджером за месяц. Написать про-
грамму, которая выводит таблицу, в которой следующие графы: фамилия, ко-
личество проданных компьютеров, сумма выручки, сумма премии. Итоговая строка должна содержать общее количество проданных компанией компьюте-
ров за месяц, общую сумму выручки, сумму премиальных.
Стоимость компьютера принять равной 1000$, размер премии за каждый проданный компьютер 25$
program manager; uses
CRT, FileUtil, SysUtils; var
name: array of string[18]; kol: array of integer;
sum, cost, prem, i, k, n: integer; progprem: integer;
begin
writeln(UTF8ToConsole('Введите количество менеджеров'));
readln(n);
SetLength(name, n);
222
Глава 3 Более сложные элементы языка
____________________________________________________________________
SetLength(kol, n);
for k:= 0 to n - 1 do
begin
writeln(UTF8ToConsole('Введите фамилию'));
readln(name[k]);
writeln(UTF8ToConsole('Введите количество компьютеров'));
readln(kol[k]);
end;
ClrScr;
GoToXY(6,1);
write(UTF8ToConsole('Сведения о реализации компьютеров'));
GoToXY(14,2);
write(UTF8ToConsole('за январь 2010 г.'));
GoToXY(1,3); |
|
write('------------------------------------------------ |
'); |
GoToXY(1,4); |
|
write(UTF8ToConsole('Фамилия |
Количество Выручка Премия')); |
GoToXY(1,5); |
|
write('------------------------------------------------ |
'); |
cost:= 1000; |
|
progprem:= 25; |
|
for k:= 0 to n - 1 do |
|
begin |
|
sum:= cost * kol[k]; |
|
prem:= progprem * kol[k]; |
|
writeln; |
|
writeln(name[k]); |
|
GoToXY(24, k + 6); |
|
write(kol[k]); |
|
223
3.5 Модули в Паскале
____________________________________________________________________
GoToXY(32, k + 6); |
|
write(sum); |
|
GoToXY(40, k + 6); |
|
write(prem); |
|
end; |
|
sum:= 0; |
|
i:= 0; |
|
for k:= 0 to n - 1 do |
|
begin |
|
i:= i + kol[k]; |
|
sum:= i * cost; {Сумма выручки} |
|
prem:=i * progprem; |
|
end; |
|
GoToXY(1, n + 6); |
|
write('------------------------------------------------ |
'); |
GoToXY(17, n + 7); |
|
writeln(UTF8ToConsole('Итого:')); |
|
GoToXY(24, n + 7); |
|
write(i); |
|
GoToXY(32, n + 7); |
|
write(sum); |
|
GoToXY(40, n + 7); |
|
write(prem); |
|
GoToXY(1, n + 9); |
|
write(UTF8ToConsole('Нажмите любую клавишу')); readkey;
end.
224
Глава 3 Более сложные элементы языка
____________________________________________________________________
3.6. Файлы
Файл – некоторый участок на диске, где хранятся данные. Каждому файлу присваивается уникальное имя, благодаря которому становится возможным об-
ращаться к различным данным на диске. Файлы состоят из отдельных элемен-
тов одного типа. Размер файла зависит от объема того физического устройства,
на котором он хранится.
3.6.1 Тип данных – запись
Запись – совокупность данных, имеющих свои имена и тип, объединенных одним именем. Запись - комбинированный тип данных. Каждая запись состоит из отдельных полей, которые могут иметь разные типы.
Общий вид объявления записи:
type
<имя записи> = record
<имя1>: <тип1>;
<имя2>: <тип2>;
..............
<имяN>: <типN>;
end;
После этого можно объявить переменные с типом запись:
var <имя переменной>: <имя записи>;
Пример. Пусть имеется таблица следующей структуры:
Фамилия |
Имя |
Отчество |
Группа |
Год рождения |
|
|
|
|
|
Тогда можно объявить запись следующего вида:
type
225
3.6 Файлы
____________________________________________________________________
student = record
family, name, otch, group: string[20];
birthday: integer;
end;
var
a, b: student;
Обращение к элементам записи выполняется через уточненное (состав-
ное) имя.
a.family:= 'Иванов';
b.group:= 'ПОВТАС-1/08';
Чтобы не удлинять слишком текст программы, в Паскале предусмотрен оператор присоединения with. Это дает возможность определить кусок про-
граммы, внутри которого можно просто указывать требуемые поля записи, не указывая каждый раз при этом имя самой записи.
Синтаксис оператора:
with <список имен записей> do
begin
… {в этом блоке при обращении к полям записи не обязательно каж-
дый раз указывать имя записи}
………
end;
Пример:
type
student = record
family, name, otch, group: string[20];
end;
226
Глава 3 Более сложные элементы языка
____________________________________________________________________
var
a, b: student;
begin
with b do
begin
family:= 'Иванов';
group:= 'ПОВТАС-1/08';
end;
end.
3.6.2Файловые типы
Впрограмме для работы с файлами вводятся файловые переменные. Пере-
менные файловых типов необходимы тем программам, которым требуется чи-
тать данные с диска или записывать данные на диск. Синтаксис описания фай-
ловой переменной:
var <имя файловой переменной>: <тип файла>;
Различают три типа файлов:
текстовый файл;
типизированный файл;
нетипизированный файл Текстовый файл состоит из последовательности любых символов перемен-
ной длины, поделенных на строки. Каждая строка заканчивается специальным признаком "конец строки" – eoln (end of line).
Описание текстового файла имеет вид:
var <имя файловой переменной>: TextFile;
Типизированный файл состоит из элементов одного типа. Однако про-
граммист может создать свой тип данных – запись с разнородными типами по-
227
3.6 Файлы
____________________________________________________________________
лей данных. Таким образом, вообще говоря, в типизированном файле можно хранить данные различных типов, но только в структурированном виде – в виде записей.
Описание типизированного файла имеет вид:
var <имя файловой переменной>: File of <тип компонентов>;
И, наконец, в нетипизированных файлах хранятся данные любого типа и структуры. Описание нетипизированного файла имеет вид:
var <имя файловой переменной>: File;
Пример.
var
name: TextFile; // Текстовый файл
kol: File of integer; // Типизированный файл buf: File; // Нетипизированный файл
Файл name состоит из последовательности строк любых символов пере-
менной длины, файл kol из целых чисел, файл buf содержит данные любого типа и структуры, т.е. интерпретируются независимо от типа и структуры со-
держащихся в нем данных.
Для всех типов файлов определяется специальный признак "конец файла"
– eof (end of file).
3.6.3 Процедуры для работы с файлами
3.6.3.1. Общие процедуры для работы с файлами всех типов
Для связи файловой переменной с файлом во внешней памяти использует-
ся процедура:
AssignFile(f, fname);
228
Глава 3 Более сложные элементы языка
____________________________________________________________________
где f - файловая переменная, fname - переменная типа string, содер-
жащая имя файла. Процедура AssignFile – связывает имя внешнего файла на диске с файловой переменной.
Общий вид имени файла:
<диск>:\<имя каталога>\<имя подкаталога>\...\<имя файла> (Windows) /<имя каталога>/<имя подкаталога>/.../<имя файла> (Linux)
Если указано только имя файла, то принимается текущий каталог и теку-
щее логическое устройство. Только после выполнения AssignFile можно обращаться к другим процедурам по обработке файлов.
AssignFile(name, 'Name.dat')
AssignFile(kol, 'C:\Work\Kol.dat')
AssignFile(data, '/home/user/data.dat')
Процедура Rewrite – создает и открывает новый файл.
Описание:
Rewrite(f)
f - является файловой переменной. Перед использованием Rewrite пере-
менная f должна быть связана с дисковым файлом с помощью процедуры
AssignFile. Если файл с таким именем уже существует, то он удаляется, а
на его месте создается новый пустой файл.
Процедура Reset- открывает существующий файл для чтения или запи-
си. Описание:
Reset(f)
где f - файловая переменная. Перед использованием Reset переменная f
должна быть связана с файлом на диске с помощью процедуры AssignFile.
После создания или открытия любого файла создается специальный указа-
229
3.6 Файлы
____________________________________________________________________
тель, с помощью которого отслеживается местоположение текущего элемента в файле. После чтения очередного элемента файла указатель автоматически пе-
ремещается к следующему элементу. После записи указатель автоматически перемещается к только что записанному в файл на диске элементу.
Процедура CloseFile (f)- закрывает открытый файл.
Функция Eof() в случае, если достигнут конец файла, возвращает зна-
чение true и false , если конец файла еще не достигнут.
Процедура Rename(f, newname); позволяет переименовать файл; newname - переменная типа string, содержащая новое имя файла;
Процедура Erase(f);- удаляет файл.
Функция IOResult – позволяет определить результат последней опера-
ции ввода/вывода. Возвращает 0, если ввод/вывод прошел успешно. Если опе-
рация ввода/вывода прошла неудачно, возвращает код ошибки.
Функция FileExists(fname) – позволяет определить существует ли файл fname на диске. Здесь fname - переменная типа string, в ней задается имя файла на внешнем устройстве, чаще всего на диске. Допускается указывать имя файла вместе с путем к файлу, например
FileExists('C:\Work\Data\Student.dat') – возвращает true,
если файл существует и false, если файл с этим именем в указанной папке не существует.
3.6.3.2. Процедуры для работы с текстовыми файлами
Текстовые файлы являются файлами с последовательным доступом. Дос-
туп к каждой строке возможен лишь последовательно, начиная с первой. Если нужно, например, прочитать строку n, то сначала нужно прочитать все n-1
строк.
Процедура Reset(f) открывает текстовый файл только для чтения.
Процедура Rewrite(f) создает новый файл (если файл с тем же именем
230