While not EoF(f1) do begin
Линейные массивы
Двумерные массивы
Текстовые файлы
Функции и процедуры
Линейные массивы
Описание массивов:
Var A: array[ 1. . 30 ] of byte;
S: array[ 1. . 30 ] of string;
SO: array[ 1. . 30 ] of string[12];
Присвоение значений элементам массива:
A[1]:= 5; A[2]:= 4; и т. д.
S[1]:= 'Иванов'; S[2]:= 'Петров'; и т. д.
Присвоение значения элементам массива "y" по зависимости:
y=sin(x), где x= Pi * i/180, 0<= i <=180 .
For i:= 0 to 180 Do y[i]:= sin(Pi * i/180);
Примеры работы с одномерными массивами (Фрагмент 1):
Присвоение случайных значений в диапазоне от -30 до +40 ста элементам массива "R":
Randomize; for i:=1 to 100 Do R[i]:= - 30+Random(71);
Присвоение значений семи элементам массива "A" оператором Readln:
For i:= 1 to 7 Do begin Write('Введите A[',i,'] ='); Readln( A [ i ] ) end;
Вывод "шапки таблицы"
For j:=1 to 66 do Write('-'); Writeln;
For j:=1 to 3 do Write('|_ _ Фамилия _ _| _ оценка _|'); Writeln;
For j:=1 to 66 do Write('-'); Writeln;
Вывод значений ста элементов массивов "S" и "A" в три пары колонок:
For i:=1 to 100 do begin Write('|',s[i]:11,'|',a[i]:8,'|');
if (i mod 3) = 0 Then Writeln;
if (i mod 60) = 0 then readln end;
Определение суммы элементов массива, наибольшего (наименьшего) элемента и создание новых массивов, удовлетворяющие некоторому условию:
s:=0; for i:=1 to 100 do s:=s+a[i];{s-сумма элементов массива}
a_max:=a[1]; for i:=1 to 100 do{поиск наибольшего элемента a[j]}
if a[i]>a_max then begin a_max:=a[i]; j:=i end;
j:= 0; k:= 0;
for i:=1 to 100 do {создание новых массивов с элементами: b[j]>=0, c[k]<0}
if a[i]>=0 then begin j:=j+1; b[j]:=a[i] end
else begin k:= k+1; c[k]:=a[i] end;
j:=0; k:=8;
for i:=1 to 100 do{создание массива номеров "M" для элементов: a[i]>a[k]}
if a[i]>a[k] then begin j:=j+1; M[j]:=i end;
Работа с элементами переменной строкового типа
Var S: string; C: char;
Begin
S:='Москва', то S[1]='М', S[2]='о' и т. д.
C:= S[1];
Перестановка местами элементов массива:
N:= ord(S[0]);{число символов в переменной "S" хранится в переменной S[0]}
for i:= 1 to N div 2 do{Функция "ord" преобразует символьный тип в целый}
begin C:= S[i];
S[i]:= S[N-i+1];
S[N-i+1]:= C
End;
Writeln(S);{ исходное слово выведется справа налево: "авксоМ" }
Двумерные массивы
Var A:array[1..30,1..7] of byte;
Примеры работы с двумерными массивами (Фрагмент 2):
Случайный ввод с последующим выводом двумерного массива оценок группы студентов по нескольким предметам:
for i:= 1 to N do
for j:= 1 to M do
A[i, j]:= random(4)+2;{ввод эл-в}
Writeln;
Write('Фамилия\\Предметы:|');{печать шапки таблицы}
For i:=1 to M do write(P[i]:9,'_ |');
for i:= 1 to N do{вывод элементов массива "A"}
Begin
Writeln;
write(S[i]:19, '_ |';
for j:= 1 to M do
write(A[i,j]:7, ' _ _ |')
End;
Пример расчета для массива "SS" сумм "M" элементов в каждой из "N" строк массива "A" (NxM):
for i:= 1 to N do
begin SS[i]:= 0;
for j:= 1 to M do
SS[i]:= SS[i] + A[i, j]
End;
Текстовые файлы
Var f: Text;{описание файловой переменной f}
Assign(f, 'Name_f');{связь f с файлом на диске}
где Name_f - имя файла.
Например,
Assign(f, 'file. dat');{файл находится в текущем каталоге}
Assign(f,'C:\Pascal\Work\file.dat'){файл находится}
{ по указанному пути на диске С}
Для записи данных в файл его необходимо открыть. Открытие файла для записи данных:
ReWrite(f); {При этом на диске создается новый файл}
Запись данных в файл:
Write(f,"сп"); или Writeln(f,"сп");{"сп" - список переменных}
Открытие файла для считывания данных:
Reset(f);
Считывание данных:
Read(f, "сп"); или Readln(f, "сп");
После окончания работы с файлом его необходимо закрыть процедурой:
Close(f);
Запись данных в конец закрытого файла:
Append(f);
Если переменная "f" в операторах ввода/вывода не указывается, то происходит запись данных на экран и считывание данных с клавиатуры с отображением на экране.
Данные, записанные в файл в одной программе часто используются (считываются) в другой программе. При этом данные, записанные в файл операторами Write(f, "сп"); и Writeln(f, "сп");, необходимо считывать соответственно операторами Read(f, "сп"); и Readln(f, "сп"); Причем тип и длина считываемых данных должны соответствовать записанным данным. Если записывать данные подряд (длина записи ограничена длиной сегмента, например до 1024 символов), то при просмотре редактором текста будет выдаваться сообщение об усечении данных по ограничителю длины строки редактора. Рекомендуется в текстовых файлах ограничивать длину строки размерами экрана для удобного просмотра данных. Запись данных в файл позволяет избежать использования массивов, занимающих большую часть оперативной памяти. При этом необходимо сразу после расчета записывать значения переменных в файл. При считывании данных из файла можно использовать массив или переменные того же типа.
При работе с числовыми данными необходимо учитывать, что числа в файле должны отделяться друг от друга хотя бы одним пробелом. Следовательно, при записи числовых данных в файл необходимо использовать формат с достаточным количеством позиций для вывода.
Примеры программ работы с файлами (Фрагмент 3)
Пример операторов записи и считывания данных
Assign(f1,'File1.dan');{назначить переменой f1, имя файла: File1.dan}
ReWrite(f1);{открыть файл для записи в первой программе }
Writeln(f1,'Значения "X","Y"' ); {начать запись }
For i:= 1 to N do begin
X:= 0.5*i; Y:= Ln(X);{пример расчета значений переменных }
write(f1, X:6:2, Y:10:4);{записать данные в файл File1. dan }
If i mod 5 = 0 then writeln(f1){ записать символ #13 }
End;
Close (f1);{закрыть файл в первой программе }
Assign(f2,'File1.dan');{назначить переменой f1, имя файла: File1.dan}
Reset(f2);{открыть файл для чтения во второй программе}
Readln(f2);{пропустить первую строчку}
For i:= 1 to N do begin
read(f2, a[i], b[i]);{считать данные в массивы "A" и "B" }
If i mod 5 = 0 then readln(f2){ считать символ #13 }
End;
Close (f2);{закрыть файл во второй программе }
Пример программы для считывания строковых и числовых данных из файла и записи их в другой файл.
var c: char; j, i: word;
s: array[1..10] of string[12];
a: array[1..10, 1..6] of word;
f1, f2: text;
BEGIN
assign(f1, 'F1.txt'); reset(f1);
assign(f2, 'F2.txt'); rewrite(f2);
for i:= 1 to 10 do begin
read(f1, s[i]); { считывание строки }
for j:= 1 to 6 do
read(f1, a[i,j]); { считывание шести чисел }
readln(f1) {считывание символа конца строки}
End;
for c:= 'А' to 'Я' do{цикл по перебору символов}
for i:= 1 to 10 do
if s[i,1] = c then begin
write(f2, s[i]); {запись строк в алф.порядке первых символов}
for j:= 1 to 6 do
write(f2, a[i,j]:2); { запись шести чисел }
Writeln(F2)
End;
Close(f1); close(f2);
END.
В файле F1. txt записаны данные, которые в редакторе текста имеют вид:
Леонтьев 5 4 4 5 4 3
Ивлев 4 5 3 4 3 4
и т. д.
EoF(f); {возвращает признак конца файла}
Пример считывания текста из файла FF1. t,
кодировки текста и записи в файл FF2. t с сохранением кода #13.
assign(f1, 'FF1. t'); reset(f1);
assign(f2, 'FF2. t'); rewrite(f2);
while not EoF(f1) do begin
read(f1,c); {считываем переменную типа Char }
if c <> #13 then c:=pred(c);
write(f2,c) {кодируем и выводим на экран }
End;
Функции и процедуры
Модули System, Crt, Graph
Описание процедур и функций (Фрагмент 4):
Заголовок процедуры состоит из служебного слова Procedure, имени процедуры и списка параметров, например:
Procedure Name_P(p1, p2,...:"тип"; Var p3, p4,...: "тип";...);
Заголовок функции состоит из служебного слова Function, имени функции и списка параметров, кроме того указывается тип возвращаемого функцией значения, например:
Function Name_F("список формальных параметров"):"тип результата";
где Function и Procedure - служебные слова,
Name_F, Name_P- имена функции и процедуры соответственно,
p1, p2- имена формальных параметров-значений,
p3, p4 - имена формальных параметров-переменных,
Тип возвращаемого функцией значения может быть простым, строковым или типом-указателем. Тип формальных параметров может быть любым, но должен указываться только идентификатором (именем типа), например:
Type M= array[1..100]of real;
Затем тип массива может указываться в заголовке процедуры, например:
Procedure Name_P(p: M);
Тип формальных параметров описывается только в заголовке процедуры. Список формальных параметров может отсутствовать, например, процедура Randomize; не имеет параметров.
Если в результате выполнения нескольких операторов получается одно значение переменной, то эти операторы можно включить в описание функции.
Если в результате выполнения нескольких операторов производится некоторое действие или расчет нескольких переменных, то эти операторы лучше включить в описание процедуры.
Вызов процедуры осуществляется в разделе выполнения основной программы или других процедур (вложенные процедуры). Программа (процедура) внутри которой вызывается другая процедура называется внешней по отношению к вызываемой процедуре.
При вызове процедуры вместо формальных параметров подставляются фактические параметры, значения которых используются в процедуре. Например:
Name_P(p11, p22,..., p33, p44,...); - вызов процедуры Name_P,
Y:= Name_F("список фактических параметров"): - вызов функции Name_F,
Здесьp11, p22, . . . - имена или значения переменных,
p33, p44, . . . - имена переменных, значения которых возвращаются в программу.
Y- переменная, которой присваивается значение возвращаемое функцией.
Типы соответствующих формальных и фактических параметров должны совпадать, а имена могут совпадать или быть различными. Вместо параметров-значений можно подставлять имена переменных, значения переменных или выражения, вместо параметров-переменных подставляются имена переменных. Функция и параметры-переменные возвращают во внешнюю программу значения, полученные после окончания работы функции или процедуры. Изменения параметров-значений в процедуре носит локальный характер, во внешней программе соответствующие фактические параметры не изменяются. Если не требуется передавать во внешнюю программу новые значения, то следует использовать параметры-значения, а не параметры-переменные.
В процедуре можно использовать локальные метки, константы и переменные, описав их в разделе описания процедуры. Локальные имена не должны совпадать с именами формальных параметров, а их значения не передаются во внешнюю программу. Метки, константы и переменные, описанные во внешней программе раньше, чем сама процедура, называются глобальными по отношению к вызываемой процедуре. Если локальные и глобальные имена совпадают, то в процедуре используются локальные значения, а во внешней программе - глобальные значения, т. е. локальные и глобальные идентификаторы независимы. Если имя глобальной переменной уникально (в процедуре не описывается переменная с таким же именем) и ее значение в процедуре изменяется, то оно изменяется и во внешней программе. Вызывая в программе процедуру программист использует ее имя и параметры не анализируя, а часто и не зная содержимого процедуры. Поэтому в целях универсальности процедур следует все значения в процедуру передавать через список параметров, а переменные внутри процедуры описывать, т. е. делать их локальными.
Пример процедуры вывода на экран визитной карточки , Фрагмент 5
Program NP_1;
Var Dat, Fam: string;{ Fam: глобальная переменная }
Procedure VIZ(D_R :string); { D_R - формальный параметр }
Var S_t: string; { S_t: локальная переменная }
Begin Writeln('|-------------------------------------------------|');
Writeln('|Разработчик программы:',Fam:14,' |');
Writeln('| |');
Writeln('| г. УФА, ', D_R:14,' |');
Writeln('|Телефон:22-44-66 |');
Writeln('| ----------------------------------------------------|');
Write(' Комментарий: ');
Readln(S_t)
End;
Begin
Fam:='И.И.Иванов';
Dat:='06.12.95';{Dat - фактический параметр }
VIZ(Dat);{вызов процедуры}
Readln END.
Если процедура описана в другом файле с именем, например, F_PR. pas, то ее можно подключить к программе, указав в разделе описания директиву: {$I F_PR. pas}
F_PR. pas
{$I F_PR. pas}
Пример использования стандартных процедур модуля DOS для вывода текущей даты и времени, Фрагмент 6:
uses DOS; { подключение модуля DOS }
Procedure Date_Time;
var y, m, d, d_w:word;
h, min, sec, hund: word;{локальные параметры }
Begin
GetDate(y,m,d,d_w); {вызов процедуры DOS, возвращающей параметры даты }
GetTime(h,min,sec,hund);{ процедура, возвращающая параметры времени }
writeln('сегодня: ' );
writeln('_':10, d, ' число');
writeln('_':10, m, ' месяц');
writeln('_':10, y, ' год' );
writeln('день недели: ', d_w );{ d_w= 0 - воскресенье, и т. д. }
writeln('Время: ' );
writeln('_':6, h, ' часов' );
writeln('_':6, min, ' минут' );
writeln('_':6, sec, ' секунд' ); readln
End;
Begin
Date_Time
End.
Пример процедуры расчета "N" значений функции Y= 4*Sin(x)+7*Cos(x); в заданном диапазоне x1<=x<=x2, при N<=100 и равномерной разбивке диапазона, Фрагмент 7.
type r_1000= array[1. . 1000] of real;{задается тип r_1000}
var Z: r_1000; x1, x2: real; n: word;
Procedure Mas_Y(var Y:r_1000; x1,x2:real; n:word);{Y - параметр-переменная}
var i: word; x, dx: real;{ локальные параметры }
Begin
If (n>1000) or (n<2) then begin
writeln('Длина массива >1 и не должна превышать 1000');
Readln; Halt end;
i:=0; x:=x1; dx:=(x2-x1)/(n-1); { dx - шаг изменения аргумента }
If dx<= 0 then begin
writeln('x2 должно быть больше x1'); Readln; Halt end;
While x<x2 do begin
i:=i+1; x:=x1+dx*(i-1); Y[i]:=4*Sin(x)+7*cos(x)
End;
End;
begin Writeln('Введите значения х1,х2, (x2>x1)'); Readln(x1, x2);
Writeln('Введите значение 1 <n<= 1000 '); Readln(n);
Mas_Y(Z, x1, x2, n); { вызов процедуры, возвращающей массив "Z" }
End.
Пример процедуры вывода массива чисел в файл, Фрагмент 8:
Type M_30х30_r= array[1..30, 1..30] of real;
{ задается тип M_30х30_r }
var x: M_30х30_r; i, j, n, m: byte;
{---------------------------------------------------}
Procedure Wr_M(a: M_30х30_r; name_f: string; n, m: byte);
Var i, j: byte; { a - массив NxM, n<=30, m<=30 }
f: text; { name_f - имя файла }