Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

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

В программе все переменные делятся на глобальные и локальные. Глобальные переменные — это те переменные, которые объявлены в описании основной части. Локальные переменные — это те, которые объявлены в процедурах и функциях. Они помещаются в стек при вызове подпрограммы и убираются из него при возвращении в точку вызова. Таким образом, локальные переменные существуют только тогда, когда работает подпрограмма, появляются при вызове и исчезают при завершении работы.

Разбор на примерах.

Пример

Составить программу, которая будет находить an, то есть n-ую степень числа а, где а и n — это целые числа, n>0. Вводятся с клавиатуры.

Решение

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

PROCEDURE DEGREE(X, Y: INTEGER; VAR ST: LONGINT);

{заголовок процедуры}

VAR I:INTEGER; {описательная часть}

BEGIN {тело процедуры}

ST:=1;

FOR I:=1 TO Y DO ST:=ST*X;

END;

Первая строчка в описании — это заголовок. Служебное слово PROCEDURE указывает на то, что именем DEGREE названа процедура. В скобках записан список формальных параметров, то есть, перечислены переменные с указанием их типа. Будем передавать три параметра: первый параметр — основание, то есть число, которое надо возвести в степень, второй параметр — это степень, а третий — это результат. Поэтому первые два формальные параметра — это параметры-значения, а третий — это параметр-переменная и перед ним надо написать слово VAR. Обозначим их X,Y и ST, где ST=XY. Все они описаны целым типом (X и Y типом INTEGER, а ST — LONGINT, так как степенная функция быстро возрастает).

НЕ нашли? Не то? Что вы ищете?

После заголовка идет описательная часть. В нашем примере она состоит только из раздела переменных, где имеется одна переменная I (для работы с циклом).

Далее идет тело процедуры, оно начинается с служебного слова BEGIN и заканчивается служебным словом END, после которого ставим точку с запятой (в конце программы после последнего END ставим точку). Между этими словами могут быть использованы те же операторы, что и в основной программе. В данном случае вычисляется степень некоторого числа с помощью цикла FOR.

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

Вся программа для нашей задачи может иметь следующий вид:

PROGRAM EX;

VAR A, N: INTEGER;

S: LONGINT;

PROCEDURE DEGREE(X, Y: INTEGER; VAR ST:LONGINT);

VAR I:INTEGER;

BEGIN

ST:=1;

FOR I:=1 ТО Y DO ST;=ST*X;

END;

BEGIN

WRITELN('введите два числа'); {ввод значений}

READLN(A, N);

DEGREE(A, N,S); {обращение к процедуре}

WRITELN('Результат ',S:); {вывод значения an}

READLN;

END.

Процедура вызывается как оператор, состоящий из имени процедуры. В круглых скобках передаются фактические параметры. В нашем примере, фактические параметры A, N и S передают свои значения соответственно формальным параметрам X, Y и ST. После завершения работы процедуры переменные A и N имеют те же значения, что и при вызове, а S получает новое значение.

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

Пусть A=3 и N=4. Когда в программе встречается оператор DEGREE(A, N,S), то ЭВМ выполняет следующие действия:

• выделяет память для переменных, описанных в процедуре DEGREE;

• присвоит формальным параметрам значения фактических: X:=A (X=3), Y:=N (Y=4),

ST:=S;

• выполняет операторы процедуры, то есть найдет З4;

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

Разница между параметрами–переменными и параметрами-значениями хорошо видна на таком примере:

PROGRAM PAR;

VAR A, B:INTEGER;

PROCEDURE H(X:INTEGER; VAR Y: INTEGER);

BEGIN

X:=X+1;Y:=Y+1;

WRITELN(X, Y)

END;

BEGIN

A:=0;B:=0;

H(A, B);

WRITELN(A, B);

END.

Результат работы программы будет таков:

1 1

0 1

Пример

Даны два целых числа. Поменять местами их значения.

Решение

Менять местами значения двух чисел можно двумя способами — через промежуточную переменную или без нее. Напишем процедуру, воспользовавшись первым способом.

PROCEDURE SWAP VAR X, Y:INTEGER);

VAR Z:INTEGER;

BEGIN

Z:=X; X:=Y; Y:=Z;

END;

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

В разделе описаний имеется промежуточная переменная Z, которую используем в теле процедуры.

Вся программа примет вид:

PROGRAM SW1;

VAR A, B:INTEGER;

PROCEDURE SWAP(VAR X, Y:INTEGER;);

VAR Z:INTEGER;

BEGIN

Z:=X; X:=Y; Y:=Z;

END;

BEGIN

WRITELN(‘введите два числа’);{ввод значений}

READLN(A, B);

SWAP(A, B);

WRITELN(‘A= ‘,A.’ B= ‘,B);

READLN;

END.

В этом примере процедуре передаются два параметра, которые являются параметрами-переменными, то есть после выполнения они получат новые значения, значение переменной A будет равно B, а значение B будет равно A.

1. Что такое подпрограмма? Для чего она нужна? Какие преимущества она дает?

2. Что такое процедура? Ее общий вид.

3. Какими бывают параметры? Какими бывают формальные параметры? Чем они отличаются друг от друга? Что такое фактический параметр?

4. Сколько новых значений может быть у параметров процедуры? Какими они должны быть?

5. Как обращаться к процедуре?

Задачи для самостоятельного решения.

1. Даны координаты трех вершин треугольника. Найти длины всех его сторон. Использовать процедуру.

2.Дано натуральное число. Найти все его делители. Подсчитать их количество.

3.Даны два натуральных числа. Определить, является ли первое число перевертышем второго?

4.Даны стороны двух треугольников. Найти сумму их периметров и сумму их площадей. (Определить процедуру для расчета периметра и площади треугольника по его сторонам).

5. Даны основания и высоты двух равнобедренных трапеций. Найти сумму их периметров и сумму их площадей. (Определить процедуру для расчета периметра и площади равнобедренной трапеции по ее основаниям и высоте)

6.Даны координаты трех вершин треугольника ABC и даны координаты четвертой точки D. Определить, является ли эта точка внутренней точкой треугольника.

Функции

Описание

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

Второе отличие заключается в заголовке функции. Он состоит из слова FUNCTION, за которым идет имя функции, затем в круглых скобках идет список формальных параметров, после чего через двоеточие записывается тип результата функции. Остальное как в процедуре.

Кроме того:

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

Таким образом, общий вид такой:

FUNCTION <имя>

[(<список формальных параметров>)]:<тип результата>; {эта часть заголовка может отсутствовать}

<описательная часть>

BEGIN •

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

<имя>:=<значение>;

END;

Разбор на примерах

Пример

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

Число сочетаний без повторения считается по формуле:

Cnk=

Обозначим:

n, k — переменные для хранения введенных чисел;

C — переменная для хранения результата.

Чтобы подсчитать количество сочетаний без повторения, необходимо вычислить n!, (n—k)!, k!.

Опишем функцию, вычисляющую факториал числа n (n!=1*2*...*n).

FUNCTION FACTORIAL(N:INTEGER):LONGINT; {заголовок функции}

VAR I:INTEGER; {описательная часть}

REZ:LONGINT;

BEGIN {тело функции}

REZ:=1;

FOR I:=1 TO N DO REZ:=REZ*I;

FACTORIAL:=REZ; {присвоение значения имени функции}

END;

Первая строчка в описании функции — это заголовок функции. Служебное слово FUNCTION (функция) указывает на то, что именем FACTORIAL названа функция. В скобках перечислен список формальных параметров функции, указаны их имена и задан их тип. Функция FACTORIAL

имеет один параметр N (число, факториал которого мы будем находить), который является целым числом. Далее в заголовке указывается тип значения функции, ее результата. В данном примере результат функции FACTORIAL — целое число.

За заголовком функции следует описательная часть функции, которая, как и у программы, может состоять из раздела описаний переменных, констант, типов и т. д. В данном примере нам понадобится только раздел переменных. Опишем переменные I (переменная для управления циклом) и REZ (для накопления значения факториала).

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

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

Итак, составим программу:

PROGRAM F;

VAR N, K:INTEGER;

A1,A2, A 3,C:LONGINT;

FUNCTION FACTORIAL(N:INTEGER):LONGINT;

VAR I:INTEGER; REZ:LONGINT;

BEGIN

REZ:=1;

FOR I:=1 TO N DO REZ:=REZ*I;

FACTORIAL:=REZ;

END;

BEGIN

WRITELN(‘Введите n и k для подсчета числа Сn k’);|

READLN(N, K);

Al:=FACTORIAL(N); {вычисление n!}

A2:=FACTORIAL(K); {вычисление k!}

A3:= FACTORIAL(N—K);{вычисление (n—k)!}

C:=Al Div (A2 * A3); {результат}

WRITELN(C);

READLN;

END.

При выполнении программы описание функции хранится в памяти ЭВМ. Действия функции выполняются тогда, когда в основной части программы необходимо найти значение функции, то есть в момент обращения к этой функции. Ее вызов осуществляется внутри некоторого выражения. Обращение записывается в виде имени функции, за которым следует в круглых скобках список параметров, отделенных друг от друга запятыми. Например, Al:= FACTORIALl(N)—есть обращение к функции FACTORIAL.

Параметры, записываемые в обращении к функции, называются фактическими, а параметры, • указанные в ее описании, называют формальными. • В нашей функции N — это формальный параметр, фактические параметры указываются при каждом обращении к функции FACTORIAL. Тип фактических параметров определяется типом формальных параметров. Перед вычислением функции формальным параметрам присваиваются значения фактических параметров. Фактическими параметрами могут быть не только константы и переменные, но также и выражения.

Пусть n =5, a k=3. Когда в программе встретится оператор Al:=FACTORIALl(N), выполнятся следующие 1 действия:

выделится память для переменных, описанных в функции FACTORIAL;

присвоятся формальным параметрам значения фактических параметров: n=n(n=5);

выполнится программа функции, то есть, будет найден факториал числа 5;

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

Еще раз подчеркнем, что описание функции — это самостоятельная часть программы, имеющая собственные переменные, которым отводится отдельное, не зависящее от основной программы место в памяти ЭВМ. Этим объясняется тот факт, что переменные, именуемые одним именем и используемые как в описании функции, так и в основной программе, фактически являются разными переменными (в примере — переменная N основной части программы и параметр N в описании функции). При выполнении программы машина не путает имена этих переменных, так как области их действия не совпадают.

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

Пример

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

Решение

Для решения задачи вспомним, как подсчитать количество цифр? Для этого можно выделять последнюю цифру до тех пор, пока число не станет равным нулю. При этом каждый раз счетчик надо увеличивать на 1(начальное значение счетчика 0).

PROGRAM WW;

VAR N1,N2:LONGINT;K1,K2:BYTE;

FUNCTION QUANTITY(X:LONGINT):BYTE;

VAR K:BYTE;

BEGIN

K:=0;

WHILE X<>0 DO

BEGIN

INC(K);X:=X DIV 10;

END;

QUANTITY:=K;

END;

WRITELN(‘Введи два числа’);

READLN(N1,N2);

K1:= QUANTITY(N1);{количество цифр первого числа}

K2:= QUANTITY(N2); );{количество цифр второго числа}

IF K1=K2 THEN WRITELN(‘одинаковое количество цифр’)

ELSE

IF K1>K2 THEN WRITELN(‘в первом числе цифр больше’)

ELSE WRITELN(‘во втором числе цифр больше’)

READLN;

END.

Задачи для самостоятельного решения

1.  Найти сумму цифр числа.

2.  Найти первую цифру числа.

3.  Найти количество делителей числа.

4.  Найти числа из промежутка от A до B, у которых больше всего делителей.

5.  Составить программу нахождения общего делителя нескольких чисел, используя функцию нахождения НОД двух чисел.

6.  Найти периметр треугольника, заданного координатами своих вершин. (Определить функцию для расчета длины отрезка по координатам его вершин.)

7.  Даны основания и высоты двух равнобедренных трапеций. Найти сумму их периметров. (Определить функцию для расчета периметра равнобедренной трапеции по ее основаниям и высоте.)

8.  Даны два натуральных числа. Выяснить в каком из них сумма цифр больше. (Определить функцию для расчета суммы цифр натурального числа.)

9.  Получить все шестизначные, счастливые номера. Счастливым называют такое шестизначное число, что сумма его первых трех цифр равна сумме его последних трех цифр. (Определить функцию для расчета суммы цифр трехзначного числа.)

Рекурсия

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

Суть заключается в том, что при каждом вызове создается новая копия со всеми переменными, но как только она заканчивает работу, то память занятая этими локальными переменными, освобождается, а полученные результаты передаются в точку вызова.

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

Пример

Вычислить факториал натурального числа.

Для того чтобы вычислить N!, нужно вычислить(N-1)! и умножить его на N, при этом 1!=1.

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

FUNCTION FACTORIAL(N:INTEGER):LONGINT;

BEGIN

IF N=1 THEN FACTORIAL:=1

ELSE FACTORIAL:=N*FACTORIAL(N-1)

END;

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

Найдем 5!. N<>1, пойдем по ветке ELSE и функции FACTORIAL присваиваем значение 5*FACTORIAL(5-1), то есть надо умножить 5 на значение FACTORIAL(4). Поэтому обращаемся второй раз к этой же функции, но передаем ее новое значение параметра:4. Так делаем до тех пор, пока не передадим значение, равное 1. FACTORIAL(1)=1, N=1-это условие, по которому процесс входа в следующую рекурсию заканчивается. Идет возвращение в точку вызова и подстановка в оператор присвоения значения вычисленной функции. Таким образом происходит возврат до тех пор, пока не вычислим значение FACTORIAL(5)=120.

Разбор на примерах

Пример

Нахождение НОД (наибольшего общего делителя) двух натуральных чисел.

Решение

Есть несколько способов нахождения этого значения. Одним из них является алгоритм Евклида.

Пусть есть два целых числа A и B. Если A=B, то НОД(A, B)=A. Если A>B, то НОД(A, B)=НОД(A-B, B). Если A<B, то НОД(A, B)=НОД(A, B-A). Рассмотрим на конкретном примере: НОД(123,36)= НОД(87,36)= НОД(51,36)= НОД(15,36)= НОД(15,21)= НОД(15,6)= НОД(9,6)= НОД(3,6)= НОД(3,3)=3

Таким образом, можно составить следующую функцию:

FUNCTION NOD(a, b: INTEGER): INTEGER;

BEGIN

IF A=B THEN NOD:=A ELSE

IF A>B THEN NOD:=NOD(A MOD B, B) Else NOD:=NOD(A, B MOD A);

End;

Пример

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

Решение

Для решения этой задачи рассмотрим сначала, как перевести число из десятичной системы счисления в двоичную. Пусть есть число 39, которое и надо представить в двоичной системе. Для этого разделим его на 2, получим целую часть и остаток от деления. Целую часть снова делим на 2 и получаем целую часть и остаток. Так делаем до тех пор, пока целую часть можно делить на 2 (то есть, пока она не станет равна 1)

39 MOD 2=1

19 MOD 2=1

9 MOD 2=1

4: MOD 2=0

2 MOD 2=0

1

Теперь, начиная с этой единицы, выписываем в обратном порядке все остатки от деления, это и будет запись числа 39 в двоичной системе счисления:

3910=10011l2.

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

Опишем процедуру:

PROCEDURE REC(N: INTEGER);

BEGIN

IF N>l THEN REC(N Div 2);

WRITE(N MOD 2);

End;

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

Результат на экране: 100111

Первая цифра 1 выводится на экран из последнего вызова, следующая цифра 0 из предпоследнего, и так далее, последняя 1—из первого. Таким образом, вывод очередной цифры происходит перед тем, как выйти из данной функции.

Пример

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

PROGRAM EXAMPLE;

USES GRAPH;

VAR XC, XA, XB, YA, YB, YC:INTEGER;{координаты вершин треугольника} N, GD, GM:INTEGER;

PPOCEDURE TRIANGLEle(XA, YA, XB, YB, XC, YC, N:INTEGER);

{координаты середин сторон треугольника} VAR XP, XQ, XR, YP, YQ, YR: INTEGER;

BEGIN

IF N>0 THEN {"заглушка"}

BEGIN {вычисление координат середин сторон треугольника}

XP:=(XB+XC) Div 2; YP:=(YB+YC) Div 2;

XQ:=(XA+XC) Div 2; YQ:=(YA+YC) Div 2;

XR:=(XB+XA) Div 2; YR:=(YB+YA) Div 2;

{изображение средних линий треугольника}

LINE(XP, YP, XQ, YQ);

LINE(XQ, YQ, XR, YR);

LINE(XP, YP, XR, YR);

TRIANGLE(XA, YA, XR, YR, XQ, YQ, N-l);

TRIANGLE (XB, YB, XP, YP, XR, YR, N-l);

TRIANGLE (XC, YC, XQ, YQ, XP, YP, N-l);

END;

END;

BEGIN

{задание начальных значений}

{координаты вершин самого большого треугольника}

XC:=300; YC:=0;

XB:=600; YB:=400;

XA:=0; YA:=4ОО;

GD:=DETECTt;GM:=1;

INITGRAPH(GD, GM, ‘’);

{изображение первого самого большого треугольника}

LINE(XA, YA, XB, YB);

LINE(XB, YB, XC, YC);

LINE(XA, YA, XC, YC);

TRIANGLE(XA, YA, XB, YB, XC, YC, 6);

READLN;{задержка на экране}

CLOSEGRAPH;

END.

Задачи для самостоятельного решения

1.Написать рекурсивную функцию для вычисления k-го члена последовательности Фибоначчи. Последовательность Фибоначчи f1,f2,… образуется по закону: f1=1; f2=1; fi=fi-1+fi-2(I=3,4…)

2. В некоторых языках программирования (например, в Паскале) не предусмотрена операция возведения в степень. Написать рекурсивную функцию для расчета степени n вещественного числа a(n-натуральное число)

3. Написать рекурсивную функцию:

а) вычисления суммы цифр натурального числа;

б) вычисления количества цифр натурального числа.

4. Дан первый член и разность арифметической прогрессии. Написать рекурсивную функцию для нахождения: а) n-го члена прогрессии; б) суммы n первых членов.

5. Написать рекурсивную процедуру для вывода на экран цифр натурального числа в обратном порядке.

6. Дан первый член и знаменатель геометрической прогрессии. Написать рекурсивную функцию нахождения ее n-го члена.

Файловый тип данных

Общие положения

Все данные, которые рассматривались ранее, обладают двумя свойствами: неделимость и упорядоченность их значений (кроме вещественного,- у которого нет упорядоченности). Например, каждое значение типа INTEGER есть объект, не распадающийся на отдельные компоненты (цифры). С другой стороны, множество целых чисел упорядочено. Поэтому можно оперировать с некоторой i-й цифрой (компонентой) целого числа. Если же целое число рассматривать как последовательность десятичных цифр, то можно говорить об i-й цифре этого числа. В данном случае множество элементов (десятичных цифр) имеет общее имя — целое число. Такая возможность давать общее имя всему множеству элементов имеет большое значение в программировании. Множества значений или переменных с одним общим именем называются структурированными (составными) типами. Существует несколько способов построения составных типов, каждый из которых отличается способом обращения к отдельным компонентам и, следовательно, способом обозначения компонент, входящих в структурированные данные.

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

• регулярный тип (массивы);

• комбинированный тип (записи);

• файловый тип (файлы);

•множественный тип (множества).

Использование структурированных типов данных позволяет решать разнообразные и достаточно сложные задачи.

Операции для работы с последовательными файлами

Описание

Мы рассматривали задачи, в которых во время выполнения программ данные поступают с клавиатуры, а результаты выводятся на экран дисплея. Поэтому ни исходные данные, ни результаты не сохраняются. Всякий раз при выполнении одной и той же программы, особенно во время ее отладки, приходится заново вводить исходные данные. А если их очень много? В языке Паскаль есть возможность записать их на диск. Для этого необходимо оформить исходные данные и результаты в виде файлов, которые хранятся на диске точно так же, как и программа. Под файлом понимают любой набор данных: исходные данные, программы, результаты, любые тексты.

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

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

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

Переменные файлового типа могут быть описаны в программе либо явно в разделе переменных Var, либо с использованием раздела типов Type. Объявление файлов в разделе переменных имеет вид:

VAR <имя файла>: FILE OF <базовый тип элементов >;

Например,

VAR FT: FILE OF INTEGER; {файл целых данных}

М: FILE OF CHAR; {файл символьных данных}

Описание файлов с помощью раздела типов имеет такой вид:

TYPE FILE_INTEGER = FILE OF INTEGER;

FILE_CHAR = FILE OF CHAR;

Var Fl: FILE_INTEGER;

F2: FILE_CHAR;

Элементами файла Fl могут быть целые числа, а F2 — символы.

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

С каждым файлом можно связать понятие — текущий указатель. Это неявно описанная переменная, которая указывает на конкретный элемент файла

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

Обработка файлов

1. Связь переменной файлового типа с конкретным внешним файлом

В Паскале файл является некоторой переменной, как и любая другая переменная, поэтому ему можно присвоить имя. С другой стороны, существует операционная система, которая в свою очередь использует имена файлов, например А: ММ. Dat, В: Test. Pas. Для установления связи между переменной-файлом в Паскале и именем файла, присваиваемого операционной системой, имеется стандартная процедура ASSIGN.

Общий вид:

ASSIGN(<Имя переменной-файла>,’<имя внешнего файла>’); Процедура устанавливает соответствие между файловой переменной и внешним файлом. Например,

ASSIGN(Fl, ‘A:INT. DAT’);

Такое соответствие обозначает, что все операции, выполняемые над переменной F1, будут выполняться над файлом, хранящимся на диске А и имеющим имя ‘INT. DAT’.

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

2. Чтение из файла

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

• открыть файл для чтения — процедура:

RESET(<имя переменной-файла>);

прочитать данные файла в программу, последовательно читая элементы — процедура:

READ(<имя переменной-файла >, <элемент >).

Элемент должен быть того же типа, что и компоненты файла. Оператор ввода для чтения данных файла обладает всеми свойствами обычного оператора ввода READ. Если оператор ввода имеет вид READ(<элемент>), то данные вводятся с клавиатуры, а если READ(<имя переменной-файла >,<элемент>), то данные вводятся из файла, хранящегося на диске.

3. Закрытие файла

Процедура CLOSE(<имя переменной-файла>). Общая форма чтения файла имеет вид:

RESET(<имя переменной-файла>);

READ(<имя переменной-файла>, <элемент>);

CLOSE(<имя перемённой-файла>).

Многоточием отмечено наличие других операторов в программе.

4. Признак конца файла

Так как, по определению, число элементов файла не задается заранее, то в языке Паскаль введен признак конца файла. Это логическая функция: ЕОF (<имя переменной-файла>). Она используется для определения, достигнут ли конец файла, или еще нет (принимает истинное значение (TRUE), если достигнут конец файла, и ложное (FALSE) — в противном случае). Для определения конца файла используется оператор цикла, например, (пока не достигнут конец файла...):

WHILE NOT ЕОF(<имя переменной-файла>) Do...

Пример

Прочитаем файл целых чисел и выведем их на экран:

ASSIGN(Fl,’A:INT. DAT’); {связываем с внешним файлом}

RESET(Fl); {открываем его для чтения}

WHILE NOT EOF (F1) DO {пока не достигнут конецфайла F1}

BEGIN

READ(Fl, N); {считываем очередное число}

WRITE(N,’ ‘);{выводим его на экран}

END;

CLOSE(F1); {закрываем файл}

5. Запись в файл

Под записью файла понимается вывод результатов программы из оперативной памяти ЭВМ на диск, т. е. создание нового файла на внешнем устройстве. Для записи файла в программе необходимо выполнить следующие действия:

• открыть файл для записи — процедура:

REWRITE(<имя переменной-файла>);

записать данные в файл, при этом запись идет поэлементно — процедура:

WRITE(<имя переменной-файла >, <элемент >).

Элемент должен быть того же типа, что и тип элементов файла. Оператор вывода для записи данных в файл обладает всеми свойствами обычного оператора WRITE. Если оператор вывода имеет вид WRITE(<элемент>), то данные выводятся на экран дисплея, а если WRITE (<имя переменная файла> <элемент>), то данные записываются в файл, который хранится на диске. После работы с файлом его закрытие обязательно.

Общая форма записи файла имеет вид:

REWRITE(<имя переменной-файла>);

WRITE(<имя переменной-файла >, <элемент >).

CLOSE(<имя переменной-файла>).

Разбор на примерах

Пример

Создадим файл целых чисел с именем DAN1.DAT, причем ни одно из чисел не равно 0.

Решение

Первоначально “свяжем” файловую переменную с конкретным внешним файлом при помощи процедуры ASSIGN. Откроем файл для записи - процедурой REWRITE. Конец ввода чисел-ввод числа 0. Поэтому программа может иметь такой вид:

PROGRAM FF;

VAR F:FILE OF INTEGER; N:INTEGER;

BEGIN

ASSIGN(F,’A:DAN1.DAT’);{связываем с внешним файлом}

REWRITE(F);

WRITELN(‘конец ввода чисел-0’);

REPEAT

WRITELN(‘введите число’);

READLN(N);{ввод числа с клавиатуры}

{если введено число, отличное от 0, то дописываем его в данную строку файла}

IF N<>0 THEN WRITE(F, N);

UNTIL N=0{если ввели 0, то заканчиваем запись данного файла}

CLOSE(F);

END.

Задачи для самостоятельного решения

1. Дан целочисленный файл A. Записать в файл B все четные числа, а в C нечетные.

2. Даны два файла A B(тип элементов одинаковый). Поменять местами содержимое этих файлов.

3. Дан файл F, компоненты которого являются целыми числами. Найти:

а)наибольшее из значений;

б)среднее арифметическое элементов.

Текстовые файлы

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

VAR A: Text

Надо заметить, что этот тип не равен типу FILE OF CHAR, который является типизированным.

У текстовых файлов есть два отличия от типизированных.

1.  Элементами этих переменных являются символы, и они имеют строковую структуру

2.  .При чтении и записи числа преобразуются автоматически.

Обработка текстовых файлов

Для текстовых файлов применимы те же процедуры и функции, что и для обычных файлов. Сначала они должны быть связаны с конкретным внешним файлом при помощи процедуры ASSIGN. Затем они могут быть открыты для чтения процедурой RESET или для записи процедурой REWRITE. Кроме этих процедур так же применяется процедура READ, которая считывает очередной элемент строки, но если необходимо прочитать и перейтина следующую строку, то применяется процедура READLN (<имя переменной текстового файла>,<элемент>). Если просто перейти к следующей строке, то используется процедура READLN(<имя переменной текстового файла>), которая переносит текущий указатель на первый элемент следующей строки.

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

Так как в разных строках может быть разное количество элементов, то используется логическая функция EOLN(<имя переменной текстового файла >), которая определяет признак конца данной строки, если достигнут конец строки, то имеет истинное значение, а если нет — ложное. Ее так же, как и функцию определения конца файла, лучше всего применять в цикле, например, (пока не достигнут конец строки...):

WHILE NOT EOLN(Fl) DO...

Кроме уже перечисленных действий, к текстовым файлам применима процедура APPEND(<имя переменной текстового файла>). Она открывает внешний файл, с которым связана данная переменная, текущий указатель помещает в конец для добавления новой информации.

Пример

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

Решение

Пусть в файле содержится следующая информация:

8

6

1 2

-1 -2 -4

-1 -2 4

Этот файл можно создать в среде турбо Паскаль таким образом:

• создайте новый файл (команда NEW меню FILE);

• записать все числа в строках через пробелы;

• сохранить его, например, ‘A:INIT. DAT’

Теперь этот файл будем использовать в программе.

PROGRAM EXAMPLE;

VAR F: TEXT;

X, K: INTEGER;

BEGIN

ASSIGN(F, ‘A:INIT. DAT’); {связываем с внешним файлом}

RESET(F);{открываем для чтения}

WHILE NOT EOF(F) DO {пока не конец файла}

BEGIN

K:=0; {начальное количество элементов строки}

WHILE NOT EOLN(F) DO {пока не конец строки}

BEGIN

READ( F, X ); {считываем очередное число}

WRITE(X,’ ‘); {вывод его на экран}

INC(K); {увеличиваем счетчик}

END;

WRITELN(‘ в строке ‘, K,’ элементов’);

READLN(F); {переходим к следующей строке файла}

END;

CLOSE(F);

READLN;

END.

Задачи для самостоятельного решения

1.  1. Дан текстовый файл. Вставить в начало каждой строки ее номер и записать преобразованные строки в новый файл.

2.  2. Даны два текстовые файла. Записать в третий только те строки, которые есть и в первом и во втором файлах.

3.  3. Дан текстовый файл, содержащий строки. Найти:

4.  а) количество строк;

б) количество строк, заканчивающихся и начинающихся одинаковыми символами

Регулярные типы данных

. Одномерные массивы. Работа с элементами

•Пример: найти сумму 5 целых чисел.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5