Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование. Методичка по лабам..doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
526.34 Кб
Скачать

Объявление массива в Паскале.

В языке Паскаль существует два способа описания типов: сокращенный и полный. Первый способ имеет место, когда тип переменной определяется при описании переменной в разделе VAR.

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

TYPE

Имя типа = array [тип индекса1, тип индекса2,.,тип индексаn] of

< тип элемента > ;

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

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

TYPE

vector = array [1..10] of real;

matric=array[1..5,1..4) of byte;

VAR

x :vector;

y :matric;

В результате этого описания в оперативной памяти будут выделены 60 байт под вектор x[10] и область длиной в 20 байт под матрицу y[5,4].

Доступ к отдельному элементу массива указывается с помощью имени массива и индексов. Обращение к элементу массива имеет вид:

имя массива [список индексов].

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

Примеры работы с одномерными массивами

В

Рис. 5. Цикл For

о всех примерах используется массив типа vector. В циклах ввода-вывода элементов массива использован оператор цикла с параметром For, так как число повторений заранее известно. Параметр цикла, индекс элемента массива, меняется с постоянным шагом, равным 1 или -1. На рис. 5 представлено изображение цикла на блок-схеме.

Пример 1. Демонстрация приемов ввода и вывода одномерного массива.

program nomer_1;

USES CRT;

TYPE

vector = array [1..100] of real;

VAR

X : vector;

N,i: integer; { N текущая длина массива от 1 до 100 }

BEGIN

{ 1. ВВОД МАССИВА }

Repeat

Write (' введите число элементов N от 1 до 100 ');

Readln (N);

until (N> =1) and (N < = 100);

Writeln('в массиве ', N', элементов');

for i = 1 to N do

begin

write('X[', i,'] =');

ReadLn(X[i]);

end;

WriteLn ('конец ввода');

Readln;

{ 2. ВЫВОД МАССИВА на ЭКРАН }

clrscr;

writeln(' Массив X[N] ');

for i:=1 to n do

write(x[i]:12:3);

writeln;

END.

Пример 2. Последовательный поиск компоненты вектора.

Заданы вектор A(n) целого типа и X. Если в векторе А есть элемент, равный Х, то переменной Х присвоить значение True, а переменной K присвоить индекс найденного элемента. В противном случае присвоить переменной P значение False.

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

Программа решения этой задачи методом простейшего линейного поиска приведена ниже. Поиск закончится при выполнении одного из двух условий: a[i]=x (искомый элемент найден) или i>n (все элементы отличаются от Х).

program lin_poisk;

const n=10;

TYPE

vector=array[1..n] of integer;

VAR

a:vector; { массив }

x:integer; { искомое значение }

p:boolean; { признак поиска }

i:integer; { параметр цикла и индекс найденного элемента }

BEGIN

I:=0;

Repeat

I:=i+1;

Until (i>n) or (a[i]=x);

If i>n then p:=false { не нашли } Else p:=true; {нашли a[i] = x }

If p then writeln('индекс найденного элемента ', i)

END.

Чтобы избежать многократной проверки условия и тем самым ускорить поиск (за счет дополнительной памяти), применяют следующий прием: в конец вектора А добавляется вспомогательный элемент, которому присваивается значение Х, что гарантирует выполнение условия a[i] = x.

program Uskor_poisk;

const n=10;

TYPE

vector=array[1..n+1] of integer;{ на один элемент больше }

VAR

a:vector; { массив }

x:integer;{искомое значение}

p:boolean; { признак поиска }

i:integer; { параметр цикла и индекс найденного элемента }

BEGIN

Writeln('ввод массива из ',N, ' чисел ');

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

Write('Введите искомое значение:');readln(x);

A[n+1]:=x; { n+1 -й элемент равен X }

{ поиск }

I:=0;

Repeat

I:=i+1;

Until (a[i]=x);

If i>n then p:=false { не нашли }

Else p:=true; {нашли a[i]=x }

If p then writeln('индекс найденного элемента ',i)

END.

Пример 3. Часто встречаются задачи, решение которых требует форми-рования новых массивов из элементов исходных массивов. Пусть дан массив А[N] вещественных чисел, где N не больше 20. Положительные элементы массива нужно занести в массив В, а отрицательные возвести в квадрат и занести в массив С. Составим списки входных и выходных данных для данной задачи.

Дано: N – число элементов [1..20], массив А[1..N] of single.

Найти: массивы B и С, KB и KC – количество элементов в массивах В и C. (0  KC и KB  N).

Ниже дается словесное описание алгоритма решения.

1. Ввод массива А из N элементов.

2. Положить количество элементов в новых массивах КВ = 0; KC = 0/

3. Цикл по i = 1, N, 1

3.1 Если а[i] < 0, то КС := КС + 1 и C[КС] := A[i] * A[i],

иначе КВ := KB + 1, B[KB] := A[i]

4. Вывод на экран элементов массива В.

5. Вывод на экран элементов массива С.

Текст программы:

program form_mas;

uses crt;

Type

Vector=array[1..20] of single;

Var

N:byte;

A,b,c:vector; { массивы предельно допустимого размера }

Kb,kc:byte;

Begin

Repeat

Write (' введите число элементов N от 1 до 20 ');

Readln (N);

Until (N> =1) and (N < = 20);

for i = 1 to N do

begin

write('A[', i,'] ='); ReadLn(A[i] ) ;

end;

WriteLn ('Массив А введен');

{ Формирование массивов B и C }

kc:=0; kb:=0;

For i:=1 to n do

If a[i]<0 then begin Kc:=kc+1; c[kc]:=a[i]*a[i] end

Else begin Kb:=kb+1; b[kb]:=a[i] end;

{ Вывод массивов B и C }

if kb=0 then writeln('В исходном массиве нет положительных элементов')

else begin

writeln('Массив В');

for i:=1 to kb do write(b[i]:8:3);

writeln;

end;

if kс=0 then writeln('В массиве A нет отрицательных элементов')

else begin

writeln('Массив С');

for i:=1 to kс do write(с[i]:8:3);

writeln;

end;

readln;

end.

Пример 4. Алгоритм поиска максимального элемента.

Текст соответствующей программы на Паскале:

program MAXM;

Uses CRT;

Const n=10;

TYPE

vector=array[1..n] of longint;

VAR

a:vector; { массив }

MAXD:longint; { наибольший элемент }

k:integer; { параметр цикла }

BEGIN

ClrScr; { опустим операторы ввода массива }

{ поиск максимума, вариант с оператором For }

X:=A[1]; { k:=2;x:=A[1]; }

For k:=2 to n do { repeat }

if X< A[k] then X=A[k];{ if x < A[k] then x:=A[k]; }

Writeln('max=',X); { k:=k+1; }

Readln { until k>n; }

end.

Рассмотрим задачу, решение которой является продолжением примера 4:

Максимальный элемент массива А[n] поменять местами с последним элементом. Пусть n=5 и массив a[1..5]={0, 7, - 2, 4, 6}

Обозначим max – наибольший элемент, k – его позиция в массиве. Решение задачи состоит из двух этапов:

  • найти max и его номер k;

  • поменять местами A[n] и A[k].

Программа имеет вид:

Program Obmen;

Const

n=5;

Var

a: array [1..n] of real;

i,k : byte

max: real;

Begin

{ пропустим операторы ввода массива }

max: = a[1];

K=1:

for i=2 to n do

if a [i] > max then

begin

max: = a[i]; K: = i; { индекс заносится в К}

end;

{ выполним перестановку элементов }

A[K]: = A[n]; A[n]: = max;

{ вывод массива А }

end.

Пример 5. Операция сдвига элементов массива и примеры применения.

Пусть в массиве А[20] заполнены первые К мест, где 1 <= K < 20.

а) Требуется ввести новое значение в поле переменной B и вставить его в начало массива.

Решение задачи будет состоять из двух этапов: сдвиг и вставка. Вначале сдвигаем массив А на 1 позицию вправо. «Формула» сдвига вправо запишется следующим оператором присвоения: A[i + 1] := A[i], где i меняется от k до 1 с шагом -1. После сдвига массива элемент A1 будет равен элементу A2, необходимо выполнить вставку значения B в первую позицию массива. На Паскале алгоритм запишется в виде:

for i := K downto 1 do

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

A[1] := B; { после сдвига массива элемент a[1] получит значение в }

Если необходимо вставить новый элемент в позицию с некоторым номером J, где 0 < j < k + 1, то запись на Паскале будет следующей:

for i := K downto j do a[i + 1] := a[i];

a[j]:= b;

б) Пусть первые K элементов массива А[N] упорядочены по возрастанию (1 <= K < N). Вставить новый элемент в массив А, не нарушая его упоря-доченности.

Решение задачи состоит из трех этапов:

1. Поиск позиции J <= K в массиве, чтобы выполнилось условие A[J] > B. Просмотр элементов с начала массива.

2. Cдвиг вправо на 1 позицию части массива, начиная с элемента A[k] по элемент A[J].

3. Вставка нового элемента в позицию с номером J и увеличение K – длины отсортированной части массива на 1.

program Vstavka;

const n=15;

var

a:array[1..n] of real;

i,j,k:integer;

b:real;begin

{….. в массиве заполнены первые К позиций}

{Ввод значения В}

write('B=');readln(b);

{ Поиск J- места для вставки нового элемента }

{ Сдвиг вправо на 1 позицию }

j:=0;

repeat

j:=j+1;

until (j>k) or (a[j]> b);

for i:=k downto j do a[i+1]:=a[i];

{ Вставка } a[j]:=b;

{ увеличение K } k:=k+1;

end.

Правильность работы программы вставки можно проверить на следующих тестах:

N = 5, k = 3, A = (2,7,10)

a)B = 1

Промежуточные результаты: J = 1, после сдвига A = (2,2,7,10)

Результаты: k=4, A=(1,2,7,10).

2) B = 12

Промежуточные результаты: J = 4, k = 3, A = (2,7,10). Цикл по сдвигу не выполнится.

Результаты: k = 4, A = (1,2,7,12).

3)B = 6

Промежуточные результаты: J = 3, после сдвига A = (2,7,7,10)

Результаты: k = 4, A = (2,6,7,10).

Пример 6. Сортировка массива.

Дана последовательность чисел a1, a2, a3, ..., an и значение n. Переставить элементы этого вектора таким образом, чтобы они следовали в порядке возрастания, то есть удовлетворялось условие a1  a2  a3  ...  an. Простейший обменный метод сортировки (или метод пузырька) заключается в том, что просматриваются пары соседних элементов. Если элементы расположены не по возрастанию, то они обмениваются местами. В результате просмотра максимальный элемент окажется на своем последнем месте, даже если он находился на первой позиции. Работа внешнего цикла управляется параметром Р. Параметр Р – признак упорядоченности: если элементы вектора упорядочены, параметр Р = 1, в противном случае Р = 0, то есть необходима перестановка соседних элементов. Количество повторений внешнего цикла заранее не определено и зависит от того, насколько упорядочен исходный вектор. Во внутреннем цикле происходит сравнение смежных пар элементов: если ai больше ai+1., то элементы меняются местами. Внутренний цикл выполняется N-1 раз, то есть это цикл арифметического типа. Параметром цикла является i – индекс элемента массива. Вектор считается упорядоченным в том случае, если за один последовательный просмотр всех его элементов не нарушилось условие ai <= ai+1 ни для одной пары элементов.

Текст программы :

Program Sort_pusirek;

{ Дано целое число N и массив A[1..N] чисел вещественного типа Переставить элементы A[i] таким образом, чтобы они следовали в порядке возрастания их значений. }

USES CRT;

CONST

n = 10;

TYPE

vector= array [1..N] of real;

VAR

A :vector;

p:integer; { признак перестановки элементов }

i:integer; { параметр цикла (индекс) }

s:real; { вспомогательная переменная }

BEGIN

ClrScr;

writeln('ввод данных ');

For i:=1 to N do

begin

write('A[',i,']=');

readln(A[i] )

end;

{ сортировка --- методом обмена }

p:=0; {массив Не упорядочен }

While p=0 do

begin

p:=1; { Предположим, массив уже упорядочен }

For i:=1 to n-1 do

if A[i]>A[i+1} then

begin {перестановка}

s:=A[i];

A[i]:=A[i+1];

A[i+1]:= s;

p:=0{ массив не был упорядочен }

end;

end; сортировка завершена ------------}

{ вывод массива }

clrscr;

writeln(' Массив A ');

for i:=1 to n do

write(A[i]:8:3);

writeln;

readln;

END.

Можно рекомендовать следующие контрольные примеры для тестирования: Массив A: а) упорядочен по возрастанию элементов; б) упорядочен по убыванию элементов. в) не упорядочен; г) состоит из равных элементов.