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

4.Лабораторная работа 3. Обработка одномерных массивов.

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

Для выполнения этой лабораторной работы следует взять за основу текст программы “Labn3.ASM”. В сегмент данных вписать свои переменные и их значения. В сегмент кодов в процедуру MAIN ввести операторы, выполняющие действия, соответствующие индивидуальному заданию.

Данное задание использует процедуру печати элементов массива PRMASS.

Ниже приведен пример выполнения следующего задания:

Задан массив А из N целых чисел. Найти сумму чисел, больших 2, и образовать массив В из отрицательных чисел массива А, взяв их по модулю.

Контрольный пример:

Пусть массив А – это следующие числа: 2,-3,10,4,-4,5,-20,1,-12.

Тогда сумма должна быть равна 19, а массив В будет состоять из чисел: 3,4,20,12.

Рис.2. Блок-схема к лабораторной работе 3.

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

Dseg Segment

; индивидуальные данные - начало

N dw 10

A dw -2,3,4,-8,0,1,6,-15,-20,-24

B dw 10 dup (?)

TextMA db 'Массив А: ',10,13,'$'

TextMB db 'Массив В: ',10,13,'$'

TextSum db 'сумма=$'

; индивидуальные данные - конец

Prob db ' $'

Buffer db 6 dup (?),'$'

NL db 10,13,'$'

Dseg Ends

Stacks segment

dw 128 dup (?)

Stacks ends

Codes segment

Main proc far

Assume CS:codes, DS:dseg, SS:stacks

Mov AX,Dseg

Mov DS,AX

; индивидуальная часть программы - начало

LEA DX,TextMA ;блок 1

CALL PRT ;напечатать 'Mассив А:'

LEA BP,A ;блок 2

Mov CX,N ;загрузить в регистр ВР адрес начала массива А

CALL PRINTMAS ;печать массива А

LEA DX,NL ;перевод строки

CALL PRT

Xor AX,AX ;блок 2 SUM - регистр AX

Xor BX,BX ;блок 3 i - регистр BX

Xor SI,SI ;блок 4 j - регистр SI

BL5:

Mov DI,BX ;блок 5

SAL DI,1

Mov CX,A[DI]

CMP CX,2

JG BL6 ;если A[i] >2, то на блок 6

JMP BL7 ; иначе на блок 7

BL6:

Add AX,CX

JMP BL10 ; переход на блок 10

BL7:

Cmp CX,0 ;блок 7

JL BL8 ; если А[i]<0, то на блок 8

JMP BL10 ; иначе на блок 10

BL8:

NEG CX ; изменили знак A[i]

Mov DI,SI

SAL DI,1

Mov B[DI],CX ; B[j]:=-A[i]

INC SI ; блок 9

BL10:

INC BX ; блок 10

CMP BX,N ; блок 11

JL BL5 ;если i<N, то на блок 5

LEA DX,TextMB ;блок 9

CALL PRT ;напечатать 'Mассив В:'

LEA BP,B

Mov CX,SI ;перепишем в СХ SI=j

CALL PRINTMAS ;печать массива В

LEA DX,NL

CALL PRT ; перевод строки

Lea DX,TextSUM ; печать текста "сумма="

CALL PRT

CALL PRN ; печать полученной суммы

; индивидуальная часть программы - конец

mov ah,1

int 21h

Mov AH,4CH

Int 21h

Main Endp

;****************************************************************

CONVBA PROC

CONVBA endp

;****************************************************************

PRINTMAS PROC ; процедура печати массива

; процедура печатает по 8 чисел в строке

; адрес начала массива записан в регистре ВР, количество элементов ;массива – в регистре СХ.

push AX

push BX

push DX

push SI

Mov BX,0

Xor DX,DX

PRMAS1:

Mov SI,BX

SAL SI,1

Mov AX,[DS:BP] [SI]

push BX

LEA BX,Buffer

CALL CONVBA

POP BX

push DX

LEA DX,Buffer

Mov AH,09h

Int 21h

LEA DX,PROB

Int 21h

POP DX

Inc DX

Inc BX

Cmp BX,CX

Jge psmas

CMP DX,8

JL PRMAS2

Psmas:

LEA DX,NL

Mov AH,09h

Int 21h

Xor DX,DX

PRMAS2:

CMP BX,CX

JL PRMAS1

POP SI

POP DX

POP BX

POP AX

RET

PRINTMAS endp

;*******************************************************

PRT PROC ; процедура печати текста

PRT ENDP

;******************************************************

PRN PROC ; процедура печати числа

PRN ENDP

;******************************************************

Codes ends

END MAIN

Варианты заданий:

  1. Заданы массивы А и С, каждый из N чисел. Образовать массив В из остатков деления чисел массива А на числа из массива С (Аi/Bi).

  2. Задан массив А из N чисел. Удалить из этого массива все 0, т.е., если массив А был (1,0,2,0,4), то получим массив А (1,2,4). Более простой вариант решения задачи - образовать новый массив В. Более сложный – произвести сдвиг чисел в массиве А.

  3. Задан массив А из N чисел. Найти в этом массиве первый 0 и забить все оставшиеся числа 0, т.е., если массив А был (2,1,0,4,8,0,5), то должны получить массив А (2,1,0,0,0,0,0).

  4. Задан массив А из N чисел и массив В из М чисел. (М<N). Числа в массиве В могут быть больше или равны 0 и меньше N. Это индексы чисел из массива А. Найти среди чисел массива А, индексы которых указаны в массиве В, максимальное число.

  5. Задан массив А из N чисел и некоторое число В. Убрать из массива А числа, равные В. Более простой вариант – образовать новый массив из чисел массива А. Более сложный – получить новый массив А путем сдвига чисел.

  6. Задан массив А из N чисел. Убрать из массива А все повторяющиеся числа, т.е., если массив А был (2,0,1,2,3,2,0,4), то новый массив А должен быть (2,0,1,3,4). Более простой вариант – образовать новый массив из чисел массива А. Более сложный – получить новый массив А путем сдвига чисел.

  7. Задан массив А из N чисел. Образовать массив В из индексов чисел массива А, делящихся нацело на 2.

  8. Задан массив А из N чисел. N – кратно 3. Это надо проверить. Образовать массив В из сумм каждой тройки чисел массива А.

  9. Задан массив А из N чисел и массив В из M чисел. Известно, что числа в массиве В могут быть положительными и отрицательными, причем сумма модулей этих чисел меньше или равна N. Это надо будет проверить. Найти М сумм чисел из массива А, просуммировав сначала !B0! чисел из массива А, потом !B1! и т.д. Т.е., если массив А был (3,2,10,5,6,7) и массив В (-2,3,1), получим 3 суммы: 5, 11,7. Эти суммы можно просто распечатать или создать из них массив С.

  10. Задан массив А из N чисел. Преобразовать этот массив так, чтобы сначала шли четные числа, а потом – нечетные. Более простой вариант – образовать новый массив В, в котором следуют сначала четные числа из массива А, потом – нечетные. Более сложный вариант – выполнить все действия в массиве А. Алгоритм в этом случае таков: изменяем индекс i от 0 в сторону увеличения и j от N-1 в сторону уменьшения. Изменения ведем до тех пор, пока i<j. Если Аi – нечетное число, то изменяем j до тех пор, пока не найдем первое четное число. Меняем их местами и т.д.

  11. Задан массив А из N чисел. Преобразовать этот массив так, чтобы сначала шли отрицательные числа, а потом – положительные. Более простой вариант – образовать новый массив В, в котором следуют сначала отрицательные числа из массива А, потом – положительные. Более сложный вариант – выполнить все действия в массиве А. Алгоритм в этом случае таков: изменяем индекс i от 0 в сторону увеличения и j от N-1 в сторону уменьшения. Изменения ведем до тех пор, пока i<j. Если Аi –положительное число, то изменяем j до тех пор, пока не найдем первое отрицательное число. Меняем их местами и т.д.

  12. Задан массив А из N чисел и некоторое число В. Найти в массиве А все числа, равные В, подсчитать их количество. Преобразовать массив А, поставив вслед за числом, равным В, второе такое же число.

  13. Задан массив А из N чисел. Убрать из массива А повторяющиеся числа, стоящие рядом, т.е., если массив А был (2,0,0,1,4,4,3,5,5,5), то массив А должен стать (2,0,1,4,3,5). Более простой вариант – получить новый массив. Более сложный – произвести все действия в самом массиве А путем сдвига чисел.

  14. Задан массив А из N чисел. В массиве А рядом могут стоять одинаковые числа. Образовать массив В, подсчитав количество повторяющихся чисел в массиве А, стоящих рядом. Например, массив А был (2,0,0,1,4,4,3,5,5,5), тогда массив В будет (1,2,1,2,1,3).

  15. Задан массив А из N чисел. Убрать из этого массива каждый третий элемент. Более простой вариант – образовать новый массив. Более сложный – произвести все действия в самом массиве А путем сдвига чисел.

  16. Задан массив А из N чисел. N кратно 2. Это надо проверить. Найти сумму первой половины чисел массива А и второй. Если первая сумма меньше второй, то поменять числа из первой и второй половины местами. Порядок следования чисел должен сохраниться. Иначе, оставить массив А без изменения.

  17. Задан массив А из N чисел. Задан массив В из М чисел. Известно, что все числа из массива В положительные, причем любое число больше или равно 0 и меньше N-1, т.е. числа из массива В задают индексы чисел из массива А. Индексы могут повторяться. Найти сумму чисел из массива А, индексы которых заданы в массиве В. Поиск суммы прекращается, если очередное число Аi =0 либо, если исчерпан массив В.

  18. Задан массив А из N чисел. Подсчитать количество чисел, больших среднего арифметического.

  19. Задан массив А из N чисел. Создать массив В, в котором будут находиться все числа, встречающиеся в массиве А только 1 раз.

  20. Задан массив А из N чисел. Создать массив В, в котором будут записаны числа из массива А, и массив С, в котором Сi равно количеству чисел Вi в массиве А. Например, массив А (1,0,0,2,0,3,2,-4,1). Массив В должен быть (1,0,2,3,-4), а массив С (2,3,2,1).

  21. Задан массив А из N чисел. N – четное или нечетное число. Образовать массив В, в котором В0= мах(А01), В1=мах(А23) и т.д.

  22. Задан массив А из N чисел. N – не обязательно число, кратное 3. Убрать из этого массива каждый третий элемент. Более простой вариант – образовать новый массив без каждого третьего числа из массива А. Более сложный – удалять числа из массива А путем сдвига.

  23. Задан массив А из N чисел. Выбрать из этого массива любое число и сделать так, чтобы все числа левее его были его меньше, а правее – больше. Алгоритм: берем любое число из массива А – Аj. Начинаем сравнивать это число со всеми числами, находящимися левее его, причем начинаем сравнение с самым первым числом, потом со вторым и т.д. Если Аi меньше Аj, то меняем их местами. Теперь мы знаем, что все числа, располагающиеся левее Аi,, меньше интересующего нас числа. Начинаем сравнивать число Аj с числами, располагающими правее этого числа, причем сравнение производим с конца. Если какое-то число оказывается меньше Аi, то меняем их местами. Теперь мы знаем, что все числа, находящиеся правее этого числа, больше его. Но ничего не знаем о числах, находящихся левее этого числа до места предыдущего положения этого числа. Вновь повторяем сравнения с числами, располагающимися левее, но не с нулевого элемента, а с элемента, который стоит на месте после предыдущего размещения числа т.д. Например, пусть задан массив А(1,2,3,8,9,12,4,2,6,1,9). Возьмем число 12. Его индекс 5. Начнем сравнивать это число с числами левее его. Все числа меньше 12. Теперь начинаем сравнивать с числами правее его. Число 9 меньше 12. Его индекс 10. Меняем местами 5-ый и 10-ый элементы. Получим массив А(1,2,3,8,9,9,4,2,6,1,12). Начинаем сравнивать число 12, стоящее теперь на 10 месте, с числами левее его, начиная с 6-ого элемента. Все числа меньше 12. Второй пример. Возьмем число 8. Его индекс 3. Все числа левее его, меньше его. Начинаем сравнивать с числами, находящимися правее. Нужно поменять местами число 8 и число 1, находящееся по индексу 9. Получим А(1,2,3,1,9,12,4,2,6,8,9). Опять сравниваем число 8, находящееся теперь по индексу 9, с числами левее его, начиная с числа по индексу 4. Поскольку 9 больше 8, то меняем их местами. Получим: А(1,2,3,1,8,12,4,2,6,9,9). Сравниваем 8, находящееся теперь по индексу 4 с числами правее его, начиная с числа, находящегося по индексу 8. Опять меняем местами. Получим: А(1,2,3,1,6,12,4,2,8,9,9). Опять сравниваем число 8, находящееся по индексу 8, с числами левее его, начиная с числа по индексу 5. Опять меняем их местами. Получим А(1,2,3,1,6,8,4,2,12,9,9). Сравниваем 8, находящееся по индексу5, с числами правее его, начиная с индекса 7 и т.д. до тех пор пока сравнивать слева и справа будет не с чем.

  24. З адан массив А из N чисел. Найти в этом массиве максимум и минимум. Напечатать все числа, находящиеся между первым максимальным (минимальным) числом и последним минимальным (максимальным) числом.