- •1 Основные определения. Размерность и описание массивов, индексирование их элементов
- •2 Ввод и вывод массивов
- •2.1 Ввод массивов
- •2.2 Создание пробных, отладочных массивов
- •2.3 Вывод одномерных массивов
- •2.4 Вывод матриц
- •3 Вычисление массива значений функции
- •4 Суммирование и перемножение элементов массивов
- •5.1 Задачи выборок
- •5.2 Преобразование одних массивов в другие
- •5 Типовые задачи обработки массивов
- •5.3 Выбор наименьших и наибольших элементов в массивах
- •5.4 Вычисление статистических характеристик массивов
- •6 Некоторые задачи работы с матрицами
- •7 Контрольные вопросы и упражнения
- •8 Задания для самостоятельной работы
- •9 Список рекомендуемой литературы
2 Ввод и вывод массивов
Отметим прежде всего, что действия с массивами, как правило, предполагают многократное повторение тех или иных операций, поэтому основными операторами в этих действиях являются операторы циклические. Эта особенность в полной мере относится и к операциям ввода и вывода.
2.1 Ввод массивов
Если число элементов массива невелико, скажем порядка 10–15, то ввод его может быть выполнен обычным способом с помощью оператора read, включенного в простой (для одномерного массива) или сложный (для многомерного) цикл. Заметим также что, если массив вводится в качестве исходных данных, то для проверки правильности ввода целесообразно предусматривать и вывод вводимых величин. Рассмотрим соответствующие примеры:
Пример 1.2. Ввести массив целых чисел l (к=1,2,...10) с одновременным выводом их для проверки.
program Vvod 1;
Var l: array[1..10] of integer;
k: integer;
begin
writeln ('Массив исходных данных')
for k:=1 to 10 do
begin
read (l[k]); write (l[k]);
end;
(продолжение программы)
Пример 2.2. Ввести матрицу R(3,4)
Обозначим i – номер строки матрицы, j – номер столбца. Тогда общий элемент матрицы обозначится ri,j. При вводе элементов матрицы с клавиатуры по строкам необходимо после прочтения последнего элемента строки переходить к новой строке. Для этого удобно использовать комбинацию операторов read и readln.
program Vvod 2;
Var r:array[1..3,1..4] of real;
i,j: integer;
begin
for i=1 to 3 do
begin
for j=1 to 3 do read(r[i,j]);
readln(r[i,4]);
end;
(продолжение программы)
Совершенно так же может быть осуществлен ввод этой матрицы по столбцам. В этом случае операторы циклов по индексам i и j следует поменять местами, а числа при вводе набирать в последовательности их расположения по столбцам. Соответствующий фрагмент программы применительно к данному примеру будет иметь вид:
begin
for j:=1 to 4 do
begin
for i=1 to 2 do read(r(i,j));
readln(r(3,j));
end;
(продолжение программы)
Отметим, что ввод массивов с помощью операторов read имеет одно существенное неудобство. Как известно, первоначальный вариант программы практически никогда не бывает без ошибок, которые могут обнаруживаться как на стадии компиляции программы, так и на стадии ее выполнения. В последнем случае выявление и исправление ошибок связано с многократными пробными запусками программы. При каждом таком запуске элементы массива приходится набирать на клавиатуре заново. Это весьма неудобно даже для массивов из 10–15 элементов, не говоря уже о больших.
Более удобным в таком случае является ввод с использованием констант типа массив, который при работе программы осуществляется автоматически.
Пример 2.3. Ввести одномерный массив Vec: 8.2 4.9 9.7 6.3 3.1,
а также матрицу Маt
В данном случае ввод может быть выполнен в разделе описания констант:
program Vvod 3;
{константы типа массив}
Const Vec: array[1...5] of real=(8.2,4.9,9.7,6.3,3.1);
Mat: array[1..3,1..4] of integеr=((10,20,30,40),
(50,60,70,80),(25,35,45,55));
i,j: integer;
begin
(продолжение программы)
В дальнейшем в программе обращения к элементам описанных массивов будут обычными: Vес[i], Mat[i,j] и т.п. Общее правило использования констант типа массив таково: после описания массива и знака = числовые значения его элементов записываются в скобках через запятую, для двумерных массивов элементы каждой строки записываются в отдельных скобках.
Однако и описанный способ ввода не слишком удобен, когда число элементов массива выражается десятками, не говоря уже о сотнях и более.
В таком случае выходом из положения является предварительная запись массива в файл, хранящийся в памяти отдельно от программы. При каждом запуске программы чтение элементов массива из этого файла и передача их в программу будет осуществляться уже автоматически. Не излагая всех вопросов, относящихся к понятию файлов и к операциям с ними, проиллюстрируем этот способ на примерах записи файлов на диск. Эти примеры всегда могут быть использованы в качестве образцов, где следует оставить неизменным все стандартные части, изменив лишь имена и параметры в соответствии с конкретными условиями решаемой задачи.
При записи массива в виде файла следует различать имя массива, програмное имя файла, а также его имя, под которым он записывается в соответствующий каталог на диск. Последние два имени могут быть как разными, так и одинаковыми.
Пример 2.4. Записать в текущий каталог, в файл с именем fd (файл данных) массив y состоящий из 50 вещественных чисел:
program Vvod4;
Var fd: file of real;
y: array[1..50] of real;
k: integer;
begin
assign(fd,'fd');
rewrite(fd);
for k:=1 to 50 do writeln(fd,y[k]);
close(fd);
end.
По этой программе при наборе на клавиатуре каждого очередного числа y оно будет записываться под соответствующим номером в файл с именем fd. В этом фрагменте переменными(зависящими от выбора программиста) являются: имя файла – fd, имя массива – y; число элементов в нем –50, обозначение индекса – к, и место нахождения формируемого файла – запись 'fd' в операторе аssign. Все остальные записи являются стандартными. Поясним кратко смысл основных из них.
Запись fd: file оf real; объявляет переменную fd файлом, состоящим из вещественных чисел.
Оператор assign связывает файл, программное имя которого fd,с местом его расположение и именем, под которым он записывается на этом месте. В приведенном примере assign(fd,'fd') означает, что файл с именем fd записывается под тем же именем в текущий каталог. Оператор assign в данном случае мог бы выглядеть и так, например:
assign (fd,'masdat')
Это означало бы, что имя файла в программе fd, а его имя в текущем каталоге masdat. Если же, мы хотим записать этот файл в корневой каталог диска а: под именем, скажем, fajl.dat, то оператор assign следует представить в виде:
assign (fd,'a:\fajl.dat')
Иными словами в апострофах оператора assign записывается путь к месту нахождения формируемого файла и его имя на этом месте. Оператор rewrite (fd); открывает файл для записи, оператор close (fd) закрывает его.
При необходимости вызова в программу массива, записанного в виде файла, выполняется аналогичная по смыслу группа операторов.
Пример 2.5. Ввести массив а из 150 целых чисел, записанный файлом в каталоге DANNYE на диске A:, под именем mas.dat.
program Vvod_5;
Var f: file of integer;
a: array[1..150] of integer;
n: integer;
begin
assign (f,'a:\DANNYE\mas.dat');
reset(f);
for n:=1 to 150 do read (f,a[n]);
close(f);
(Продолжение программы)
Здесь f – программное имя файла (разумеется произвольное); оператор Reset(f) открывает этот файл для чтения, все остальные операторы рассмотрены выше.
По этому фрагменту 150 целых чисел, записанных на дискете, будут переданы в программу под именами а1 ,а2 ,...,а150 и могут обрабатываться в ней в соответствии с необходимостью.
