АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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

Читайте также:
  1. I. КУРСОВЫЕ РАБОТЫ
  2. I. ОБЩИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ КУРСОВОЙ РАБОТЫ
  3. II. ДИПЛОМНЫЕ РАБОТЫ
  4. II. МЕТОДИЧЕСКИЕ УКАЗАНИЯ ДЛЯ ВЫПОЛНЕНИЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
  5. II. ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ КУРСОВОЙ РАБОТЫ
  6. III. Задания для самостоятельной работы по изучаемой теме.
  7. III. Задания для самостоятельной работы по изучаемой теме.
  8. III. Задания для самостоятельной работы по изучаемой теме.
  9. III. Задания для самостоятельной работы по изучаемой теме.
  10. III. Задания для самостоятельной работы по изучаемой теме.
  11. III. Задания для самостоятельной работы по изучаемой теме.
  12. III. Требования охраны труда во время работы

Рис. 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: а) упорядочен по возрастанию элементов; б) упорядочен по убыванию элементов. в) не упорядочен; г) состоит из равных элементов.

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |


Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.028 сек.)