Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб 9.doc
Скачиваний:
1
Добавлен:
25.04.2019
Размер:
229.38 Кб
Скачать

Практика по программированию - 2012 ПЗ- II курс

Занятие №9

Тема: Описание и использование одномерных массивов. Решение задач на обработку одномерных массивов.

Цель: усвоение понятия массив, их видов, понятия индекса, знакомство с представлением в памяти ЭВМ; формирование навыков в описании массивов, их инициализации,. формирование умений и навыков составления программ на решение типовых задач обработки одномерных массивов.

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

Описание типа линейного массива выглядит так:

Type <Имя типа>=Array [<Диапазон индексов>] Of <Тип элементов>;

Теперь возможно описание:

Var <Переменная-массив>:<Имя типа>;

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

Описать переменную-массив можно и сразу (без предварительного описания типа) в разделе описания переменных:

Var <Переменная-массив>:Array [<Диапазон индексов>] Of <Тип элементов>;

Примеры описания массивов:

Var

S, BB: Array [1..40] Of Real;

N: Array ['A'..'Z'] Of Integer;

R: Array [-20..20] Of Word;

T: Array [1..40] Of Real;

Теперь переменные S, BB и T представляют собой массивы из сорока вещественных чисел; массив N имеет индексы символьного типа и целочисленные элементы; массив R может хранить в себе 41 число типа Word.

Наряду с переменными массивами данных могут быть использованы и постоянные массивы. Описание их производится в разделе описаний констант.

Const

m:array[1..7] of real=(4.5,-12,0.23,9.23,-1.54,8,-3);

f:array[1..10] of char='аеёиоуыэюя';

Действия над массивами

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

Для данного примера описания впоследствии допустима следующая запись: S:=BB;

Однако, присваивать можно только массивы одинаковых типов. Даже массиву T присвоить массив S нельзя, хотя, казалось бы, их описания совпадают, произведены они в различных записях раздела описания.

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

R[10] - элемент массива R с индексом 10.

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

BB[15] - прямая адресация;

BB[K] - косвенная адресация через переменную K, значение которой будет использовано в качестве индекса элемента массива BB.

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

Инициализация линейного массива. Ввод и вывод элементов одномерного массива

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

Методы заполнения одномерного массива:

  1. по формуле:

For i:= 1 to n do a[i]:= i*i;

  1. с клавиатуры:

For i:= 1 to n do

begin

Write('a[',i,']=');Readln(a[i]);

end;

  1. случайным образом (с помощью генератора случайных чисел)

For i:= 1 to n do

a[i]:=random(50)-25;

или

For i:= 1 to n do

a[i]:=100*random;

Random - генерирует значения случайного числа из диапазона от 0 до 0,99. Тип результата - вещественный.

Random(М) - генерирует значения случайного числа из диапазона от 0 до М-1. Тип результата - целый.

Чтобы случайные числа были «более случайными», необходимо периодично менять базу генерации. Для этого используется процедура Randomize, которая позволяет при каждом новом запуске программы получать разные случайные числа.

Выражение, дающее целое случайное число в интервале [-50,50] будет выглядеть так:

Trunc(Random*101)-50

Вывод элементов одномерного массива:

1) Вывод линейной таблицы (вектора) данных A состоящей из n целочисленных элементов в строку.

For i:= 1 to n do Write(a[i]:3);

или

For i:= 1 to n do Write(a[i],’ ’);

2) Вывод линейной таблицы (вектора) данных A состоящей из n целочисленных элементов в столбец:

For i:= 1 to n do Writeln(a[i]);

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

Однотипная обработка всех или указанных элементов массивов.

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

Пример: Найти сумму положительных элементов массива:

Program example1;

const n=20;

var a: array [1..n] of integer;

i,S: integer;

begin

for i:=1 to n do

begin

a[i]:=random(50)-25;

Write(a[i]:3);

end;

for i:=1 to n do

if a[i]>0 then S:=S+a[i];

writeln (‘Сумма положительных элементов равна ‘ ,S)

end.

Пример: Вычислить произведение четных и сумму нечетных элементов целочисленной линейной таблицы состоящей из 10 элементов.

Program Element;

Var

a:array[1..10] or real;

i,s:integer;

p:longint;

Begin

For i:= 1 to 10 do

begin

Write('a[',i,']=');Readln(a[i]);

end;

s:=0;p:=1;

For i:=1 to 10 do

If odd(a[i]) then s:=s+a[i] else p:=p*a[i];

{если элемент нечетный находим сумму иначе произведение}

Writeln('Сумма нечетных s =',s);

Writeln('Произведение четных p =',p);

Readln;

End.

Задачи, в результате решения которых изменяется структура массива.

Пример: Поменять местами пары соседних элементов, т.е. первый и второй, третий и четвертый и т.д. (n-1)-ый и n-ый

i:=2;

while i<n do

begin

r:=a[i];

a[i]:=a[j];

a[j]:=r;

i:=i+2

End.

Сортировка элементов массива

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

Сортировка – это расположение элементов линейной таблицы в порядке возрастания или убывания их значений.

При проведении сортировки элементов таблицы любым из известных способов используются операции сравнения и перестановки двух элементов. Перестановку (обмен элементов местами) можно произвести двумя способами – с использованием дополнительной переменной или без нее.

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

В начале, согласно схеме, производим сохранение значения переменной A в переменной C (шаг 1). Далее заменяем значение переменной A на значение переменной B (шаг 2). И завершается перестановка присвоением переменной B значения переменной C (шаг 3). Таким образом, обмен производится за 3 шага: C:=A; A:=B; B:=C;

Способ обмена целочисленных данных (переменных величин) без буферной переменной основывается на использовании математических действий, например:

A:=A+B; B:=AB; A:=AB;

    1. Метод перестановок

При сортировке этим методом производится сравнение двух рядом стоящих элементов, т.е. x[1] и x[2], x[2] и x[3],…, x[n-1] и x[n]. Если в сравниваемой паре значение первого элемента оказывается больше второго, их меняют местами. Таким образом, после первого сравнительного прохода по всем парам наибольший элемент ряда будем установлен на последнее место в таблице. При втором проходе на предпоследнее место в таблице будет поставлен второй максимальный по величине элемент ряда и т.д.

Program Sort_1;

Var

a:array[1..50] of integer;

i,j,n,c:integer;

Begin

Write('Элементов-');Readln(n);

For i:= 1 to n do

begin

Write('a[',i,']=');

Readln(a[i]);

end;

{вложенные циклы сортировки}

For i:=1 to n-1 do

For j:=i+1 to n do

If a[i]>a[j] then

begin

c:=a[i];

a[i]:=a[j];

a[j]:=c;

end;

For i:=1 to n do Write(a[i]:3);

Readln;

End.

Б лок-схема:

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

Program Sort_2;

Var

a:array[1..50] of integer;

i,n,k,c,fl:integer;

Begin

Write('Элементов-');Readln(n);

For i:= 1 to n do

begin

Write('a[',i,']=');

Readln(a[i]);

end;

Б

k:=n;

Repeat

fl:=0;

For i:=2 to k do

If a[i-1]>a[i] then

begin

c:=a[i];

a[i]:=a[i-1];

a[i-1]:=c;

fl:=1;

end;

k:=k-1;

Until fl=0;

For i:=1 to n do Write(a[i]:3);

Readln;

End.

лок-схема:

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

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

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

Программу, написанную для сортировки в порядке возрастания значений, легко переделать в сортировку по убыванию. Для этого достаточно при сравнении значений элементов таблицы a[i] и a[j] изменить знак больше « > » на знак меньше « < ».

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]