Нетипизированные файлы
При объявлении нетипизированного файла указывается только ключевое слово, например:
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).