Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_ОАиП.doc
Скачиваний:
6
Добавлен:
01.04.2025
Размер:
5.06 Mб
Скачать

Типичные задачи на обработку массивов.

Изменение значения некоторых элементов

Задача. Заменить отрицательные элементы на противоположные по знаку.

Для этого опишем процедуру. Ей будем передавать один параметр – массив, который будет результатом ее выполнения, так как некоторые элементы могут быть заменены.

Procedure Zamena (Var m : MyArray; n:integer);

Var

i : integer;

Begin

for i := 1 to n do

if m[i] < 0

then

m[i] := -1*m[i];

End;

Нахождение номеров элементов с заданным свойством

Задача. Найти и вывести на экран номера четных элементов.

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

Procedure PoiskChet(m : MyArray; n:integer);

Var

i : integer;

Begin

for i := 1 to n do

if m[i] mod 2 =0

then

Write(i:5);

End;

Нахождение количества элементов с заданным свойством

Задача. Найти количество положительных и отрицательных элементов в данном массиве.

Опишем процедуру, которой будем отправлять три параметра – массив и два счетчика, один для элементов, больших нуля, а второй – для отрицательных элементов.

Procedure OtrPol(m : MyArray; ; n:integer; Var k1,k2 : Integer);

Var

i : integer;

Begin

k1 :=0;

k2 :=0;

for i := 1 to n do

if m[i] > 0

then

Inc(k1)

else

if m[i] < 0

then

Inc(k2);

End;

Есть ли в данном массиве элементы с данным свойством?

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

Задача. Есть ли отрицательный элемент в массиве?

Начинаем с первого элемента (i=1). пока не просмотрен последний элемент (i<=n) и не найден отрицательный (m[i]>=0), будем переходить к следующему (Inc(i)). Таким образом, мы закончим просмотр массива в одном из двух случаев: первый – просмотрели все элементы и не нашли отрицательный, тогда i>n, второй – нашли нужный, при этом i<=n. Опишем функцию, значение которой истина (True), если такой элемент есть, и ложь (False), если его нет.

Function Control (m : MyArray; n:integer) : Boolean;

Var

i : integer;

Begin

i := 1;

while (i<=n) and (m[i]>0) do

Inc(i);

Control := (i<=n);

End;

Задачи для самостоятельного решения.

1. Дан одномерный массив. Найдите разность наибольшего и наименьшего чисел в этом массиве.

2. Даны два одномерных массива А и В. Подсчитайте количество тех i, для которых:

а) А[i] < B[i]

б) A[i] = B[i];

в) A[i] > B[i]

3. Составьте программу определения количества элементов массива, больших среднего арифметического всех его элементов.

4. Дан одномерный массив. Подсчитайте, сколько раз встречается в этой таблице максимальное по величине число.

5. Дан одномерный целочисленный массив. Составьте программу определения значения наибольшего элемента этого массива.

6. Дан одномерный целочисленный массив. Составьте программу определения индекса(-ов) минимального элемента массива.

7. Составьте программу, проверяющую упорядочены ли элементы одномерного массива по возрастанию.

8. Дан одномерный массив чисел. Определите сумму его элементов.

9. Дан одномерный массив чисел. Измените знаки всех его элементов на противоположные.

10. Дан одномерный массив чисел. Подсчитайте, сколько раз встречается число 1.

11. Дан одномерный массив чисел. Подсчитать в нем количество элементов равных нулю, отрицательных элементов и положительных элементов.

12. В массиве А (m,n) найдите количество чисел, по модулю меньших заданного Т.

Самостоятельная работа.

1. Сформировать массив B из элементов массива C, кратных трем. Массив C состоит из 25 элементов целого типа.

V ar k,I: real;

C,B: array[1 . . 25] of integer;

begin

for I:=1 to 25 do begin

write('Ввод С',i); readln(C[ i ]);

if C[ i ] mod 3 = 0 then begin

k:=k+1; B[ k ]:=C[ i ] end;

end;

writeln('Массив B:');

for I:=1 to k do write(B[ i ]:6); {печать в строку}

writeln; {перевод курсора} End

2. Организовать циклический сдвиг элементов массива A на m позиций влево, при этом m элементов из конца массива перемещается в начало. Массив состоит из n элементов.

Ц иклический сдвиг будем организовывать с помощью

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

Эта процедура повторяется m раз. Такой вариант сдвига

требует больших затрат времени на многократное перемещение элементов массива.

Var n, m, i, k: byte;

A: array[1 . . 50] of real; P: real;

begin write('Ввод n, m');

readln(n,m); writeln('Ввод ',n,'элементов');

for i:=1 to n do read(A[ i ]);

for i:=1 to m do begin

P:=A[ 1 ];

For k:=2 to n do

A[k–1]:=A[ k ];

A[ n ]:=P end;

writeln; writeln('преобразованный

массив');

for i:=1 to n do write(A[ i ]:8:3);

writeln End.

3. Организовать циклический сдвиг элементов массива A на m позиций влево, при этом m элементов из конца массива перемещается в начало. Массив состоит из n элементов.

Циклический сдвиг будем организовывать с помощью вспомогательного массива P. “Хвост” массива пересылается во вспомогательный массив, все остальные элементы перемещаются влево на m позиций. Далее, в первые элементы массива A пересылаются элементы вспомогательного массива, в котором временно хранится “хвост” исходного массива. Такой вариант сдвига требует больше памяти для вспомогательного массива.

V ar n, m, i: byte;

A: array[1 . . 50] of real;

P: array[1 . . 10] of real;

begin write('Ввод m ≤ 10, n');

readln(m,n);

writeln('Ввод ',n,'элементов');

For i:=1 to n do read(A[ i ]);

For i:=1 to m do P[ i ]:=A[ i ];

For i:=m+1 to n do A[i–m]:=A[ i ];

For i:=n–m+1 to n do

A[ i ]:=P[I–n+m];

writeln;

writeln('преобразованный

массив');

For i:=1 to n do write(A[ i ]:8:3);

writeln End

4. Требуется определить, сколько элементов заданного массива P,

содержащего n элементов, удовлетворяет заданному условию. Условие

имеет вид P[ i ]>T, где T – заданное число.

Для решения задачи следует организовать цикл по i и для каждого

значения i проверять условие P[ i ]>T. Если условие удовлетворяется, то к

счетчику числа элементов прибавляется 1, а если не удовлетворяется, то

осуществляется переход к следующему элементу

м ассива.

Программа 4

Var i, k, n: byte;

P:array[1 . . 30] of real;

T:real;

begin k:=0;

write('Введите n и число T');

readln(n,T);

write('Ввод ',n,'элемента');

For i:=1 to n do begin

Read (P[ i ]);

If P[ i ]>T then k:=k+1;

end;

Writeln('Количество удовлетворяющих

элементов ',k)

End.

5. Требуется объединить два массива A и B, содержащие по n

э лементов, в один массив C, (который будет содержать 2n элементов) с чередованием элементов исходных массивов. Можно заметить, что индекс массива C зависит от индекса пересылаемого в него элемента массива A или B. Организовав цикл по i, и выполняя для каждого i присваивания, мы решим задачу.

Var i: byte;

A, B:array[1 . . 40] of integer;

C:array[1 . . 80] of integer;

begin write('Введите n<40');

readln(n);

for i:=1 to n do begin

writeln('Введите A',i,' B',i);

readln(A[ i ],B[ i ]);

C[2*i-1]:=A[ i ];

C[2*i ]:=B[ i ];

end;

Writeln('Массив C');

For i:=1 to 2*n do write(C[ i ]:6);

Writeln

End.

6. Требуется изменить порядок следования элементов массива A,

состоящего из n элементов, на обратный порядок, используя одну

вспомогательную переменную. Результат получить в том же массиве A.

Сначала поменяем местами первый и n-й элементы, используя

вспомогательную переменную C. Для этого перешлем A1 в C (C=A1).

З атем в A1 перешлем An (A1=An). Значение A1, которое временно

находится в C, перешлем в An (An=C). Также поступим с элементами A2 и

An-1 и так далее, пока не дойдем до середины массива.

Последними элементами, которые нужно поменять местами, будут

An\2 и An\2+1, если n – четно, и An\2 и An\2+2 , если n – нечетно, то есть

цикл по i в общем случае можно организовать от i = 1 до n\2.

Var i, n, m: byte;

C: integer;

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

begin write('Введите n<50');

readln(n);

for i:=1 to n do

writeln('Введите A',i);

readln(A[ i ]);

m:=n div 2;

for i:=1 to m do begin

C:= A[ i ];

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

A[ i ]:=C end;

Writeln('Инвертированный массив A');

For i:=1 to n do write(A[ i ]:6);

Writeln End.