Нетипизированные файлы

При объявлении нетипизированного файла указывается только ключевое слово, например:

Var F: File.

Нетипизированные файловые переменные предназначены для низкоуровневой работы с файлами.

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

Для работы с нетипизированными файлами можно применять почти все процедуры и функции, что и для типизированных. Исключение составляет то, что вместо процедур Read и Write используются процедуры BlockRead и BlockWrite, а процедуры Reset и Rewrite могут иметь второй параметр типа Word, который определяет размер записи, используемый при передаче данных. Если этот параметр опущен, то размер записи принимается по умолчанию равным 128 байтам.

РЕГУЛЯРНЫЕ ТИПЫ ДАННЫХ

Одномерные массивы.

Работа с элементами

(разбор на примерах)

Пример 1

Найти сумму пяти целых чисел.

Решение

Для решения этой задачи можно описать пять целых переменных для данных чисел и еще одну − для их сум­мы. Обозначим исходные числа а1, а2, а3, а4 и а5, а их сумму - s. Тогда можно составить такую программу, используя функцию нахождения суммы пяти чисел:

Program Example_87;

Var а1, а2, аЗ, а4, а5, s: Integers;

Function Sum(х1, х2, хЗ, х4, х5: Integer):

Integer;

Begin

Sum:=x1+x2+x3+x4+x5;

End;

Begin

Writeln('Введите пять целых чисел');

Readln(а1, а2, а3, а4, а5);

{Вводим пять целых чисел}

s:=Sum (a1,а2, аЗ, а4,а5);

{Находим их сумму}

Writeln('их сумма равна ', s);

{Выводим результат на экран}

Readln;

End.

Пример 2

Найти сумму тридцати целых чисел.

Решение

Если решать эту задачу по аналогии с предыдущей, то необходимо будет описать 30 переменных для всех исходных чисел. Это не очень удобно. Поэтому исполь­зуем для решения этой задачи одномерный массив.

Одномерный массив - это фиксированное количество элементов одного типа, объединенных одним именем, при­чем каждый элемент имеет свой уникальный номер и но­мера элементов идут подряд. Например, введем 30 целых чисел от 25 до 54 и объединим их общим именем А.

А

Имя А - общее для всех элементов. Элементы массива - целые числа, их 30.

Опишем в разделе описания тип − од­номерный массив, состоящий из 30 целых чисел.

Type myarray = Array[1..30] Of Integer;

Напомним, что раздел типов начинается со служебного словаType, после него идут имя нового типа и его описание. Между именем типа и его описанием ставится знак "равно" (в разделе описания переменных между именем перемен­ной и ее описанием ставится двоеточие). Тогда:

myarray - это имя нового типа;

Array - служебное слово (в переводе с английско­го означает "массив", "набор");

[1..30] - в квадратных скобках указывается но­мер первого элемента, затем, после двух точек, номер последнего элемента массива; в этом примере первый элемент имеет номер 1, а последний - номер 30;

Of - служебное слово (в переводе с английского означает "из");

Integer - тип всех элементов массива.

Таким образом, одномерный массив описывается сле­дующим образом:

Array[n1..n2] Of <тип элементов>;

где n1 - номер первого элемента, n2 - номер послед­него элемента, в качестве типа элементов может исполь­зоваться любой тип данных, кроме файлового.

Для того чтобы обратиться к элементу этого масси­ва, необходимо указать имя массива и в квадратных скобках - номер элемента. Например, первый эле­мент массива А - А[1], а пятый - А[5] .

Program Example_88;

Const n=30; {Количество элементов массива}

Var A: array[1..n] Of Integer;

i,sum: Integer;

Begin

Writeln('Введите ', n, ' чисел');

For i:=1 To n Do

{Ввод массива с клавиатуры}

Readln(a[i]);

{Чтение i-гo элемента}

For i:=1 To n Do {Вывод массива}

Write(a[i]: 3);

{Вывод i-гo элемента}

sum:=0; {Начальное значение суммы}

For i:=1 To n Do sum:=sum+a[i];

{К уже найденной сумме прибавляем

i-й элемент}

Writeln('их сумма равна ',sum);

Readln;

End.

Пример 3

Составить программу нахождения суммы элементов массива.

Решение

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

Program Example_89;

Const n=30; {Количество элементов массива}

Type myarray=Array[1..n] Of Integer;

Var A: myarray;

s: Integer;

{Значение этой переменной s будет равно

сумме всех элементов массива}

Procedure Init1(Var m: myarray);

Var i: Integer; {Переменная для работы с элементами

массива}

Begin

Writeln('Введите ', n, ' чисел');

For i:=1 To n Do

{Ввод массива с клавиатуры}

Readln(m[i]); {Чтение i-гo элемента}

End;

Procedure Print (m: myarray);

Var i: Integer

Begin

For i:=1 To n Do {Вывод массива}

Write(m[i]: 3);

{Вывод i-гo элемента}

Writeln;

End;

Function Summa (m: myarray): Integer;

Var i, sum: Integer;

Begin

sum:=0; {Начальное значение суммы}

For i:=1 To n Do sum:=sum+m[i];

{К уже найденной сумме прибавляем

i-й элемент}

summa:=sum;

End;

Begin

Init1(A); {Обращение к процедуре

формирования массива}

Print(A); {Вывод массива}

s:=Summa(A); {Нахождение суммы элементов}

Writeln('их сумма равна ',s);

{Вывод результата на экран}

Readln;

End.

При решении задач часто приходится заполнять мас­сивы (присваивать значения элементам). Рассмотрим не­сколько способов заполнения массивов.

Первый способ заполнения одномерного массива - это заполнение с клавиатуры (этот способ был рассмот­рен выше - в процедуре Init1).

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

Для получения случайных чисел практически во всех современных языках программирования имеется стандартная функция. В языке Паскаль имеется функция Random. Формулы для расчета случайного числа x различного типа в программе приведены в таблице:

Тип величины х Диапазон возможных значений Паскаль
Вещественный 0≤x<1 x:=Random
0≤x<A x:=Random*A
A≤x<B x:=A+Random*(B-A)
Целый 0≤x≤A x:=Random(A+1)
A≤x≤B x:=Random(B-A+1)

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

Составим программу заполнения одномерного мас­сива с помощью генератора случайных чисел. Процедура вывода уже составлена ранее.

Program Example_90;

Const n=30; dd=51; {n - количество элементов

массива, dd используется в генераторе

случайных чисел}

Type myarray = Array [1..n] Of Integer;

Var A: myarray;

Procedure Init2 (Var m: myarray);

{Процедура заполнения (инициализации)

массива случайными числами}

Var :Integer;

Begin

For i:=1 To n Do m [i]:=-25+Random(dd);

{Функция Random выбирает случайное

число из отрезка от 0 до dd-1.

Оче­редному элементу массива будет

при­своена сумма выбранного случайного

числа и -25, таким образом, массив будет

заполняться случайными числами от -25

до -25+(dd-1), то есть до -26+dd}

End;

Procedure Print (m:myarray);

{процедура вывода (распечатки) массива}

Begin

Randomize;

{Инициализация генератора случайных чисел}

Init2(А);

{Обращение к процедуре заполнения массива}

Print(A);

{Обращение к процедуре вывода массива}

Readln;

End.

Третий способ заполнения массива − чтение зна­чений элементов из файла. Можно заранее создать ти­пизированный файл одномерных массивов (например, по тридцать элементов), а затем считывать из него сразу целый массив. Но мы воспользуемся текстовым файлом, так как его создавать намного удобнее. Пусть в файле записано несколько строк, а в каждой из них по 30 целых чисел. Тогда вся программа может быть такой:

Program Example_91;

Const n=30;

{Количество элементов массива}

Type myarray = Array[1..n] Of Integer;

Var A: myarray;

F: text;

Procedure Init3 (Var m:myarray);

{Процедура заполнения (инициализации)

массива}

Var i: Integer;

Begin

For i:=1 To n Do Read(f, m[i])

{Чтение из файла очередного числа}

End;

Procedure Print (m:myarray);

{Процедура вывода (распечатки) массива}

Begin

{Связываем файловую переменную с файлом

на диске}

Assign(F, 'путь\имя файла');

Reset(F);

{Открываем файл для чтения}

While Not EOf (F) Do

Begin{Считываем очередную строку}

Init3(А);

{Обращение к процедуре заполнения массива}

Print(A);

{Обращение к процедуре вывода}

Readln(F);

End;

Close(F); Readln;

End.

Четвертый способ − описание одномерного массива − типизированной константы:

Const

digit: array[0..9] of char=

('0', '1', '2', '3', '4', '5',

'6', '7', '8', '9');

DayOfWeek: array[0..6] of String =

('понедельник', 'вторник', 'среда',

'четверг', 'пятница', 'суббота');

Chislo: array[0..9] of byte=(0, 1, 2, 3,

4, 5, 6, 7, 8, 9).

Элемент массива может быть любого типа, кроме файлового. Напомним, что типизированные константы являются переменными, которым начальное значение присваивается в начале выполнения программы (см. §26).

Наши рекомендации