Учебник по дополнительным модулям языка Pascal

advertisement
1
1. Записи (комбинированный тип)
1.1.Описание записи.
Во многих задачах возникает необходимость в обработке документов: ведомостей, списков и т.д., при этом приходится
объединять данные различных типов в одну группу. Для хранения и обработки группы данных разного типа в Паскале
используется специальный сложный тип – запись.
Пример.
Ведомость с оценками учащихся
№ Ф.,И.,О.
Оценки Средний балл
1
Иванов П.И.
3,4,5
4
2
Петров С.И.
5,4,5
4,67
3
Сидоров М.Т. 3,3,4
3,33
………………………………………………………..
Каждая строка ведомости состоит из отдельных элементов разного типа:
№ - целое число;
Ф.,И.,О. – строка;
Оценки – массив из 3-х чисел от 2..5;
Средний балл – действительное число;
Эти данные можно объединить в одну группу и считать эту группу записью.
Запись и отдельные ее элементы, которые называются полями записи, обозначаются именами.
В нашем примере всю запись об одном ученике обозначим именем – Stud., а все записи ведомости именем –Wedom.
Поля обозначим:
N – порядковый номер;
Fam – фамилия;
Oc – оценки;
Srball – средний балл;
Тип записи для данной ведомости можно описать в разделе Var.
В общем виде описание типа записи, выглядит следующим образом:
Var
<имя записи>:Record
<имя поля 1>:<тип>;
<имя поля2>:<тип>;
:
<имя поля К>:<тип>;
End;
Record – запись.
Для нашего примера :
1.{для одной записи}
Var
Stud:Record
N:Integer;
Fam:String;
Oc:Array[1..3] of 2..5;
Srball:Real;
End;
2.{для всей ведомости}
Var
Wedom:Array[1..25] of Record
N:Integer;
Fam:String;
Oc:Array[1..3] of 2..5;
Srball:Real;
End;
К полям записи можно обращаться по именам:
1. Stud.N:=1;
Stud.Fam:=’Иванов П.И.’;
2. Wedom[1].N:=1;
Wedom[1].Fam:=’Иванов П.И.’;
Wedom[3].Oc[2]:=3;
Поля записи могут использоваться как в левой части оператора присваивания, так и в составе выражений
Wedom[3].N:=Stud.N+5;
Wedom[3]:= Wedom[1];{вся строка записи}
Пример.
Ввести и вывести данные для ведомости с оценками учащихся.
Program Z;
Var
C:Array[1..3] of Record
N:Integer;
Fam:String;
Oc:Array[1..3] of 2..5;
SrBall:real;
Begin
For i:=1 to 3 Do
Begin
Writeln(’Введите данные’,i,’ученика’);
C[i].N:=i;
Writeln(’Фамилия’);
Readln(C[i].Fam);
Writeln(’3 оценки’);
C[i].SrBall:= 0;
For x:=1 to 3 Do
Begin
Readln(C[i].Oc[x]);
C[i].SrBall:=C[i].SrBall+C[i].Oc[x];
End;
C[i].SrBall:=C[i].SrBall/3;
End;
For i:=1 to 3 Do
Begin
Write(C[i].N,’ ’:2,C[i].Fam,’ ’:2);
For x:=1 to 3 Do
Write(C[i].Oc[x],’ ’:2);
Writeln(C[i]SrBall);
End;
End.
Задачи.
1. Описать запись с несколькими полями разного типа: а)сведения о книгах;
б)анкета на учеников класса;
в)номера телефонов учеников класса;
2. Записать операторы присваивания, по 2 на каждую ведомость с комментариями к каждому оператору.
3. Составить программу ввода и вывода данных к первой задаче
1.2.Оператор присоединения.
При обращении к полям записи возникает необходимость в использовании составных имен. Это приводит к значительному
удлинению программы. Для устранения этого неудобства в Паскале предусмотрен оператор присоединения, который
позволяет обращаться к полям записи непосредственно по их именам. При этом имя всей записи выносится в заголовок
оператора присоединения и добавляется к именам полей автоматически.
Общий вид оператора присоединения следующий:
With<имя записи>Do P;
With – с;
Do – выполнять;
P – оператор, который обращается к именам полей (может быть и составным).
Пример.
Вывод данных для ведомости с оценками учащихся
:
For i:=1 to 3 Do
Begin
With C[i] Do
Begin
Write(N,’ ’:2,Fam,’ ’:2);
For x:=1 to 3 Do
Write(Oc[x],’ ’:2) ;
Writeln(SrBall);
End;
End;
:
Задачи.
1. Решить задачу 3 параграфа 1.1, используя оператор присоединения
1. Создать журнал для учеников класса по 5-ти предметам.
2. Оформить функцию, подсчитывающую средний балл конкретного ученика.
3. Оформить функцию, подсчитывающую средний балл класса по конкретному предмету.
4. Оформить процедуру, сортирующую учеников по алфавиту.
2. Стандартные модули
Модули можно использовать для создания библиотек стандартных подпрограмм и данных. В Турбо Паскале в настоящее
время имеется большое количество стандартных подпрограмм и данных, объединенных в несколько стандартных модулей.
Мы рассмотрим следующие модули:
2.1. Модуль System
В модуль System входят следующие подпрограммы:
- арифметические функции;
- функции для величин порядкового типа;
- функции преобразования типов;
- {все вышеперечисленные функции рассмотрены в параграфе 3.3, первой части}
- процедуры и функции работы со строками;
- процедуры и функции работы с файлами;
2.2. Модуль Dos
Использование возможностей операционной системы;
2.3. Модуль Crt
Содержит подпрограммы управления текстовым выводом на экран монитора, звуковым генератором и чтения клавиатуры;
2.4. Модуль Printer
Подпрограммы работы с принтером;
2.5. Модуль Graph
Содержит графические подпрограммы;
Лишь один модуль System подключается к любой программе автоматически, все остальные становятся доступными только
после указания их имен в списке, следующем за словом Uses
Далее в скобках будет отмечаться к каким модулям принадлежат описываемые процедуры и функции
3. Работа со строками (System)
3.1.Функции работы со строками
Function Сoncat(S1[S2,...,Sn]:String):String;
Объединяет несколько строк в одну.
S1,S2,...,Sn - объединяемые строки;
Пример1.
Program Ct1;
Var S,S1,S2:String;
Begin
Writeln(’Введите 1 строку’);
Readln(S1);
Writeln(’Введите 2 строку’);
Readln(S2);
S:=Сoncat(S1,S2);
Writeln(’S= ’,S);
End.
Function Сopy(S:String;I,C:Integer):String;
Создает подстроку строки S
S - исходная строка
I - номер первого выделяемого символа строки
С - число выделяемых символов
Пример2.
Program Ct2;
Var S,S1:String;
Begin
Writeln(’Введите строку’);
Readln(S1);
S:=Сopy(S1,3,4);{копирует 4 символа, начиная с 3-го}
Writeln(’S= ’,S);
End.
Function Length(S:String):Integer;
Возвращает текущий размер строки
S - строка, у которой определяют размер
Пример3.
Program Ct3;
Var S:String;
Y:Integer;
Begin
Writeln(’Введите строку’);
Readln(S);
Y:= Length(S);
Writeln(’Количество символов в строке = ’,Y);
End.
Function Pos (S1,S2:String):Byte;
Поиск последовательности S1 в строке S2 (результат равен номеру первого символа строки S2, с которого начинается
искомая последовательность, или 0, если такой последовательности в строке нет)
S1 – искомая последовательность;
S2– строка, в которой ищется последовательность;
Пример4.
Program Ct4;
Var S2,S1:String;
Y:Integer;
Begin
Writeln(’Введите строку’);
Readln(S2);
Writeln(’Введите искомые символы’);
Readln(s1);
y:= Pos(S1,S2);
Writeln(’Искомая последовательность начинается с символа ’,Y);
End.
3.2.Процедуры работы со строками
Procedure Delete(Var S:String;I,C:Integer);
Удаляет подстроку из строки S
S - исходная строка
I - номер первого удаляемого символа
С - число удаляемых символов
Пример5.
Program Ct5;
Var S:String;
Begin
Writeln(’Введите строку’);
Readln(S);
Delete(S,5,3);{удаляет из строки 3 символа, начиная с 5-го}
Writeln(S= ’,S);
End.
Procedure Insert(C:String;Var S:String;I:Integer);
Помещает подстроку C в строку S
S - исходная строка
C - подстрока, помещаемая в строку
I - номер позиции исхoдной строки, начиная с которой, помещается подстрока
Пример6.
Program Ct6;
Var C,S:String;
Begin
Writeln(’Введите исходную строку’);
Readln(S);
Writeln(’Введите подстроку’);
Readln(C);
Insert(C,S,5);{в строку S помещается подстрока С, раздвигая ее, с 5 позиции}
Writeln(’S= ’,S);
End.
Procedure Str(X[:M[:N]];Var S:String);
Преобразует число в последовательность символов.
X - выражение вещественного или целого типа
S - строка, в которую записывается символьное представление числа
M,N - формат вывода
Пример7.
Program Ct7;
Var S:String;
Y:Integer;
Begin
Writeln(’Введите число’);
Readln(Y);
Str(Y,S);
Writeln(строка, имеющая вид числа = ’,S);
End.
Procedure Val (S:String;Var X; Var C:Integer);
Преобразует символьное представление числа в число.
S – строка c символьным представление числа;
X -переменная вещественного или целого типа для записи числа;
С – номер неправильного символа (0 – если изображение числа правильное)
Пример8.
Program Ct8;
Var S:String;
Y:Integer;
Begin
Writeln(’Введите строку из цифр’);
Readln(S);
Val(S,Y,C);
Writeln(’число = ’,Y*10);{можно производить арифметические действия}
End.
Задача: Составить программу, которая подсчитывает количество слов в предложении.
Пример8.
Program Ct8;
Var S:String;
K,Y:Integer;
Begin
Writeln(’Введите строку’);
Readln(S);K:=1;
For Y:=1 to Length(S) do
If Copy(S,Y,1)=’ ’ Then K:=K+1;
Writeln(’В предложении ’,K,’ слов);
End.
Задачи:
Дана строка, имеющая вид предложения.
1. Вставит в предложение с 3-го символа слово «кит».
2. Удалить из предложения 3 символа, начиная с 6-го.
3. Скопировать из предложения 3 символа, начиная со 2-го.
4. Подсчитать сколько раз встречается буква «м», предлог «не» в предложении.
5. Выяснить, есть ли в предложении хотя бы одна пара одинаковых символов.
6. Удалить из предложения все пробелы.
7. Вставить в предложение пробелы после каждой буквы «а».
8. Проверить, есть ли в предложении запятые
4. Работа с файлами (модуль System)
4.1. Текстовые файлы
При решении задач часто возникает необходимость в сохранении полученных результатов для использования их другими
программами или той же самой программой в процессе работы. Для сохранения информации в Паскале существует
специальный тип данных (Text), который позволяет выводить данные в файлы и вводить данные из файлов.
Текстовый файл представляет собой совокупность строк переменной длины. Доступ к каждой строке возможен лишь
последовательно, начиная с первой.
Как и любая переменная, переменная типа файл должна быть описана в программе. Будем называть такой файл
программным. Но чтобы значения заносились в реально существующие файлы на дисках, надо установить соответствие м/у
программным и реальным файлами.
Файловые переменные типа Text описываются следующим образом:
Var
<Имя файла>:Text;
Пример.
Var
F1, F2:Text;
Для привязки описанных в программе файлов к реальным файлам используется процедура
Procedure Assign(Var F;Name:String);
Здесь файловая переменная F (программный файл) связывается с реальным файлом, имя которого указано в строке Name.
F - имя программного файла;
Name - имя реального файла с указанием пути;
Пример.
Пусть в программе описан файл с именем File1, а на диске существует файл: a:\forma.txt; тогда, прежде чем считывать
данные из файла Form в программе надо записать обращение к процедуре
Assign(File1,a:\forma.txt);
С файлами можно производить операции чтения и записи.
4.2. Запись и чтение файлов
Procedure Rewrite(Var F);
F – имя программного файла.
Открывает новый пустой файл и ему присваивается имя, заданное процедурой Assign Если файл с таким именем уже
существует, то он уничтожается..
Procedure Write(Var F,V1[,V2,…,Vn]);
Procedure Writeln(Var F,V1[,V2,…,Vn]);
F – имя программного файла.
V1[,V2,…,Vn] – выражения, значения которых выводятся в текстовый файл.
Записывает информацию в файл. Перед записью файл должен быть открыт процедурой Rewrite. При выводе информации в
текстовый файл по умолчанию отводится сколичество позиций равное размеру этой информации. Значит при выводе
информации необходимо предусматривать меры, чтобы отдельные элементы информации не сливались друг с другом.
Исключение составляют вешественные числа (Real), под них выделяется 17 позиций. Изменить стандартную форму вывода
можно используя формат вывода:
Write(A:M:N);
Writeln(A:M:N);
A – выражение значение которого выводится в файл
M – определяет размер поля, в которое выводится данное значение, используется для вывода значений любого типа
N – определяет
Procedure Close(Var F);
Закрывает открытый файл.
F – имя программного файла.
Пример:
Создать новый файл в корневом каталоге диска (а:\) и записать в него числа от 1 до 10 в столбец;
Program f1;
Var
F:Text;
I:integer;
begin
assign(f,'a:\file.txt');
rewrite(f);
for i:=1 to 10 do
writeln(f,i);{ вывод в столбец}
close(f);
end.
Задачи:
1. Создать файл на диске a:, содержащий
А) 10 фамилий в столбец
б) 30 чисел в строку, через пробел;
Procedure Reset(Var F);
F – имя программного файла.
Открывает существующий реальный файл для чтения. При этом специальная переменная-указатель, связанная с этим
файлом, будет указывать на начало файла, т.е. на элемент с порядковым номером 0.
Procedure Read(Var F,V1[,V2,…,Vn]);
Procedure Readln(Var F,V1[,V2,…,Vn]);
F – имя программного файла
V1..Vn – список переменных
Читает информацию из файла. Считывает из файла столько последовательно идущих значений, сколько переменных
содержит список в обращении к данной процедуре. При этом указатель считывания, первоначально установленный на 1-й
элемент, смещается каждый раз на следующий элемент файла. Нельзя читать из файла значений больше чем он содержит.
Пример
На диске находится файл a:\file.txt содержащий целые числа. Сосчитать сумму 10-ти первых чисел и вывести результат в этот
же файл.
program f1;
var f:text;
s,k:integer;
begin
assign(f,'a:\file.txt');
reset(f);
s:=0;
for k:=1 to 10 do
begin
readln(f,k);
s:=s+k;
end;
append(f);
writeln(f,’сумма =’,s);
close(f);
end.
Задачи:
На диске находится файл a:\file.txt содержащий 10 строк.
а) Проверить есть ли в строках запятые;
б) Проверить есть ли в строках предлог «не»;
в) Сосчитать сколько раз в тексте встречается «.»;
г) Удалить из строк все пробелы;
Ответы выводить в этот же файл.
Если нам неизвестно сколько строк содержит файл, то для контроля за достижением конца файла существует специальная
стандартная функция логического типа
Function Eof[(Var F)]: Boolean;
F – имя программного файла
Эта функция получает значение – True, когда указатель считывания передвигается на последнее значение файла. А пока
конец файла не достигнут, функция имеет значение – False.
Если нам необходимо знать какой длины строки в файле, то для контроля за достижением конца строки файла существует
специальная стандартная функция логического типа
Function Eoln[(Var F)]: Boolean;
F – имя программного файла
Эта функция получает значение – True, когда указатель считывания передвигается на последнее значение строки файла. А
пока конец файла не достигнут, функция имеет значение – False.
Пример:
На диске находится файл a:\file.txt содержащий текст. Сосчитать количество строк в тексте
program f1;
var f:text;
k,i:integer;
s:string;
begin
assign(f,'a:\file.txt');
reset(f);
k:=0;
while not eof(f) do
begin
k:=k+1;
readln(f,s);
end;
append(f);
writeln(f,k);
close(f);
end.
Задачи:
1. На диске находится файл a:\file.txt имеющий вид отформатированного текста. Сосчитать сколько символов в строке и
сколько строк в тексте
2. На диске находится файл a:\file.txt содержащий целые числа, отделеные друг от друга пробелами. Сосчитать количество и
сумму всех чисел и вывести результат в этот же файл
3. На диске находится файл a:\file.txt содержащий список фамилий расположенных в столбец. Отсортировать фамилии по
возрастанию.
5. Управлене текстовым выводом на экран монитора (модуль Crt );
Procedure ClrScr;
Очищает текущее окно, заполняет его цветом фона и помещает курсор в его верхний левый угол с координатами (1,1)
Procedure Delay(m:Word);
Задает задержку выполнения программы в М миллисекунд.
M – выражение, определяющее величину задержки (в миллисекундах)
Procedure TextColor(c:Byte);
Задает цвет символов.
С-задаваемый цвет символов.
Procedure TextBackground(c:Byte);
Задает цвет фона
С – задаваемый цвет фона
Procedure Window(x1,y1,x2,y2:Byte);
Задает размеры окна на экране и помещает курсор в левый верхний угол окна с координатами (1,1)
X1,Y1 – координаты левого верхнего угла окна;
X2,Y2 – координаты правого нижнего угла окна
Procedure GotoXY(x,y:Byte);
Перемещает курсор к элементу экрана с заданными координатами;
X,Y – координаты элемента экрана (координаты отсчитываются от левого верхнего угла текущего окна)
6.Управление клавиатурой (модуль Crt )
Function KeyPressed:Boolean;
Анализирует нажатие клавиши клавиатуры (за исключением вспомогательных клавиш ). Результат – True, если клавиша на
клавиатуре нажата, и False – в противном случае.
Function ReadKey:Char;
Считывает символ с клавиатуры и освобождает буфер от считанного символа
7. Графика (модуль Graph )
Для работы с графикой необходимо подключить графический модуль Graph в разделе Uses
Процедура InitGraph – устанавливает графический режим.
Заголовок процедуры:
InitGraph(Var i,j:Integer; p:String);
i – переменная, в которую необходимо записать код требуемого графического драйвера
i:=Detect; - автоматический выбор драйвера
j – переменная, в которую процедура помещает код графического режима
0 – 640*200
1 – 640*350
2 – 640*480
р – строка содержащая путь к драйверу. Если строка пуста, считается, что драйвер находится в текущем каталоге.
Процедура InitGraph оповещает пользователя через
Download