Из сборника Введение в информатику. Лабораторные работы. Ч. II / Авт.-сост. А.П. Шестаков; Перм. ун-т. — Пермь, 1999. — 71 с.

Массивы

Массив — это совокупность величин одинакового типа, расположенных в памяти ЭВМ последовательно друг за другом.

Для работы с элементами массива достаточно знать адрес первого элемента и их количество. Номер элемента массива называют его индексом. Чаще всего при решении задач с массивом его элементы просматриваются поочередно, с первого до последнего.

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

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

Идея решения. Просматривая массив, необходимо запомнить адреса первого отрицательного элемента и максимального элемента. По окончанию просмотра совершить обмен.

План решения

1.  i := 2
2.  max := 1
3.  otr := 0
4.  Если a[1]<0, то k:=1, otr:= 1.
5.  Сравнить i с n.
6.  Если i>n, перейти к п. 11.
7.  Если a[i]<0 и otr=0, то k:=i, otr:= 1.
8.  Если a[i]>a[max], то max := i.
9.  i := i + 1.
10. Перейти к п. 5.
11. vsp := a[k].
12. a[k] := a[max].
13. a[max] := vsp.
14. Стоп.

Распределение памяти
R0 R1 R2 R3
адреса элементов массива адреса i, otr адреса k, nmax

Тест. Массив разместим с адреса 0080. Пусть n=8.

Исходный массив                  Преобразованный массив
Адрес  Значение                  Адрес   Значение
0080   0005 			 0080    0005
0082   0006 			 0082    0006
0084   FFFE         		 0084    0100
0086   0066 			 0086    0066
0088   0012 			 0088    0012
008A   0100 			 008A    FFFE
008C   FFFF 			 008C    FFFF
008E   0020 			 008E    0020


00A0 i   00A2 otr   00A4 k   00A6 n

Программа

Адрес Команда  Действие                                Замечания
0000  01D5     2 => (R1)  			       i := 2
0002  0002
0004  0103     R0 => R3 			       адрес максимального элемента
0006  02D1     R1 := R1 + 2 			       адрес otr
0008  0002
000A  01D5     0 => (R1) 		               otr := 0
000C  0000
000E  04D4     сравнить a[1] с 0 		       (R0) - 0
0010  0000
0012  2D06     если a[1]>=0, переход на 6 байт
0014  0106     R0 => (R2)  			       адрес первого отрицательного элемента
0016  01D5     1 => (R1)  			       otr := 1
0018  0001
001A  02D2     R2 := R2 + 2			       адрес n
001C  0002
001E  03D1     R1 := R1 - 2 			       адрес i
0020  0002
0022  02D0     R0 := R0 + 2			       адрес 2-го элемента массива
0024  0002
0026  0456     сравнить (R1) с (R2) (i с n) 	       (R2) - (R1)
0028  3D32     если <0, переход на 32 байта	       переход на обмен значений
002A  02D1     R1 := R1 + 2			       адрес otr
002C  0002
002E  04D4     сравнить (R0) c 0 		       (R0) - 0
0030  0000
0032  2D14     если >= 0, переход на 14 байт
0034  04D5     сравнить (R1) c 0		       (R1) - 0
0036  0000
0038  4D0E     если <>0, переход на E байт
003A  03D2     R2 := R2 - 2			       адрес k
003C  0002
003E  0106     R0 => (R2) 			       адрес первого отрицательного элемента
0040  01D5     1 => (R1)			       otr := 1
0042  0001
0044  02D2     R2 := R2 + 2			       адрес n
0046  0002
0048  0447     ср. (R0) с (R3) (a[i] c a[max])	        (R3) - (R0)
004A  2D02     если >=0, переход на 2 байта	        если a[max]>=a[i]
004C  0103     R0 => R3				        адрес максимального элемента
004E  03D1     R1 := R1 - 2			        адрес i
0050  0002
0052  02D5     (R1) := (R1) + 1			        i:= i + 1
0054  0001
0056  02D0     R0 := R0 + 2			        адрес i-го элемента
0058  0002
005A  1DCA     переход на -36(16) байт			на сравнение i с n
005C  03D2     R2 := R2 - 2			        адрес k
005E  0002
0060  0162     (R2) => R2
0062  0161     (R2) => R1 				vsp := a[k]
0064  0176     (R3) => (R2)				a[k] := a[max]
0066  0117     R1 => (R3)				a[max] := a[k]
0068  0F00     стоп

Примечание. Расчет переходов предлагаем читателю проделать самостоятельно.

Задания для самостоятельного выполнения

  1. Подсчитать число положительных элементов массива и занести его в массив вместо первого элемента.
  2. Заменить все элементы массива их модулями.
  3. Найти сумму элементов массива и сравнить ее с заданным числом K. Если сумма меньше K, то все элементы массива с четными индексами заменить на нули.
  4. Адрес первого неотрицательного элемента массива поместить в регистр R0.
  5. Определить номера всех отрицательных элементов массива и сформировать из них массив, расположенный сразу после заданного.
  6. В массиве есть положительные и отрицательные элементы. Найти количество элементов массива, которые больше суммы всех его элементов.
  7. Заменить каждый элемент массива суммой всех последующих.
  8. Вычислить отдельно сумму отрицательных и положительных элементов массива.
  9. Заменить K-й элемент массива адресом максимального по модулю элемента этого же массива.
  10. Задан массив A. Сформировать массив B, элементами которого являются разности соседних элементов массива A. Массив B разместить перед массивом A.
  11. В массиве есть положительные и отрицательные элементы. Сравнить модуль минимального элемента с максимальным. При совпадении занести 1 в качестве последнего элемента массива, иначе — 0.
  12. Исключить из массива все нулевые элементы, сформировав при этом новый массив.
  13. Из заданного массива сформировать новый, состоящий только из положительных элементов исходного массива.
  14. Все отрицательные элементы массива заменить нулями. Количество произведенных замен записать в регистр R3.
  15. Произвести циклический сдвиг массива в сторону возрастания адресов. Последний элемент при этом сделать первым.
  16. Найти минимальный элемент массива и поставить его на первое место, если он положителен, и на последнее, если он отрицателен.
  17. Определить, сколько раз в массиве встречаются элементы, равные данным числам K и L.
  18. Построить массив, элементами которого являются числа n2, (n-1)2, ..., 12.
  19. Массив заканчивается нулем. Определить количество элементов в массиве.
  20. В массиве есть единственный нулевой элемент. Уплотнить массив, удалив нулевой элемент.
  21. Число положительных элементов в массиве поместить в R1, число отрицательных — в R2, число нулей — в R3.
  22. Даны два массива из одинакового числа элементов. Произвести обмен минимальными элементами.
  23. Положительные элементы массива увеличить на 1, а отрицательные — уменьшить на 1.
  24. Заданы два массива с одинаковым количеством элементов. Переписать тот массив, сумма элементов которого больше, в другой.
  25. Изменить знак всех элементов массива на противоположные. Нули заменить на данное число b.
  26. Даны два массива с различным числом элементов. Найти сумму максимальных элементов этих массивов.
  27. Переписать массив в другое место памяти, изменив при этом порядок следования элементов на противоположный.
  28. Умножить все элементы массива на одно и то же натуральное число k.
  29. В целочисленном массиве есть нулевые элементы. Создать новый массив из номеров этих элементов.
  30. Дан массив целых чисел. Выяснить, упорядочены ли по возрастанию его элементы. Если да, то поместить по адресу 76 1, иначе — 0.
  31. Дан массив целых чисел. Создать новый массив из четных элементов этого массива. Если таких чисел нет, то поместить 0 по адресу 76, иначе — 1.
  32. Дан массив. Указать наименьшую длину числовой оси, содержащую все элементы этого массива.
  33. Дана последовательность целых положительных чисел. Найти произведение только тех чисел, которые больше заданного числа M. Если таких нет, то поместить по адресу 76 число 0, иначе — 1.
  34. Дан массив, состоящий из n трехзначных натуральных чисел. Образовать новый массив, элементами которого будут элементы исходного, начинающиеся на цифру k.
  35. Дан массив. Составить программу нахождения произведения элементов этого массива.
  36. Дан массив. Найти число нечетных элементов в нем.
  37. Дан массив.Составить программу замены отрицательных элементов данного массива их квадратами.

     


    Рейтинг ресурсов УралWeb
    © А.П. Шестаков, 1999-2010
    Сайт создан в системе uCoz