
- •1.Оформление лабораторных работ.
- •2.Лабораторная работа 1. Вычисление арифметического выражения.
- •3.Лабораторная работа 2. Программа табулирования функций, использующая ввод чисел с клавиатуры.
- •4.Лабораторная работа 3. Обработка одномерных массивов.
- •5.Лабораторная работа 4. Обработка двумерных массивов.
- •6.Лабораторная работа 5. Обработка строковых данных.
- •7.Лабораторная работа 6. Многомодульные программы.
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
Варианты заданий:
Заданы массивы А и С, каждый из N чисел. Образовать массив В из остатков деления чисел массива А на числа из массива С (Аi/Bi).
Задан массив А из N чисел. Удалить из этого массива все 0, т.е., если массив А был (1,0,2,0,4), то получим массив А (1,2,4). Более простой вариант решения задачи - образовать новый массив В. Более сложный – произвести сдвиг чисел в массиве А.
Задан массив А из N чисел. Найти в этом массиве первый 0 и забить все оставшиеся числа 0, т.е., если массив А был (2,1,0,4,8,0,5), то должны получить массив А (2,1,0,0,0,0,0).
Задан массив А из N чисел и массив В из М чисел. (М<N). Числа в массиве В могут быть больше или равны 0 и меньше N. Это индексы чисел из массива А. Найти среди чисел массива А, индексы которых указаны в массиве В, максимальное число.
Задан массив А из N чисел и некоторое число В. Убрать из массива А числа, равные В. Более простой вариант – образовать новый массив из чисел массива А. Более сложный – получить новый массив А путем сдвига чисел.
Задан массив А из N чисел. Убрать из массива А все повторяющиеся числа, т.е., если массив А был (2,0,1,2,3,2,0,4), то новый массив А должен быть (2,0,1,3,4). Более простой вариант – образовать новый массив из чисел массива А. Более сложный – получить новый массив А путем сдвига чисел.
Задан массив А из N чисел. Образовать массив В из индексов чисел массива А, делящихся нацело на 2.
Задан массив А из N чисел. N – кратно 3. Это надо проверить. Образовать массив В из сумм каждой тройки чисел массива А.
Задан массив А из N чисел и массив В из M чисел. Известно, что числа в массиве В могут быть положительными и отрицательными, причем сумма модулей этих чисел меньше или равна N. Это надо будет проверить. Найти М сумм чисел из массива А, просуммировав сначала !B0! чисел из массива А, потом !B1! и т.д. Т.е., если массив А был (3,2,10,5,6,7) и массив В (-2,3,1), получим 3 суммы: 5, 11,7. Эти суммы можно просто распечатать или создать из них массив С.
Задан массив А из N чисел. Преобразовать этот массив так, чтобы сначала шли четные числа, а потом – нечетные. Более простой вариант – образовать новый массив В, в котором следуют сначала четные числа из массива А, потом – нечетные. Более сложный вариант – выполнить все действия в массиве А. Алгоритм в этом случае таков: изменяем индекс i от 0 в сторону увеличения и j от N-1 в сторону уменьшения. Изменения ведем до тех пор, пока i<j. Если Аi – нечетное число, то изменяем j до тех пор, пока не найдем первое четное число. Меняем их местами и т.д.
Задан массив А из N чисел. Преобразовать этот массив так, чтобы сначала шли отрицательные числа, а потом – положительные. Более простой вариант – образовать новый массив В, в котором следуют сначала отрицательные числа из массива А, потом – положительные. Более сложный вариант – выполнить все действия в массиве А. Алгоритм в этом случае таков: изменяем индекс i от 0 в сторону увеличения и j от N-1 в сторону уменьшения. Изменения ведем до тех пор, пока i<j. Если Аi –положительное число, то изменяем j до тех пор, пока не найдем первое отрицательное число. Меняем их местами и т.д.
Задан массив А из N чисел и некоторое число В. Найти в массиве А все числа, равные В, подсчитать их количество. Преобразовать массив А, поставив вслед за числом, равным В, второе такое же число.
Задан массив А из N чисел. Убрать из массива А повторяющиеся числа, стоящие рядом, т.е., если массив А был (2,0,0,1,4,4,3,5,5,5), то массив А должен стать (2,0,1,4,3,5). Более простой вариант – получить новый массив. Более сложный – произвести все действия в самом массиве А путем сдвига чисел.
Задан массив А из N чисел. В массиве А рядом могут стоять одинаковые числа. Образовать массив В, подсчитав количество повторяющихся чисел в массиве А, стоящих рядом. Например, массив А был (2,0,0,1,4,4,3,5,5,5), тогда массив В будет (1,2,1,2,1,3).
Задан массив А из N чисел. Убрать из этого массива каждый третий элемент. Более простой вариант – образовать новый массив. Более сложный – произвести все действия в самом массиве А путем сдвига чисел.
Задан массив А из N чисел. N кратно 2. Это надо проверить. Найти сумму первой половины чисел массива А и второй. Если первая сумма меньше второй, то поменять числа из первой и второй половины местами. Порядок следования чисел должен сохраниться. Иначе, оставить массив А без изменения.
Задан массив А из N чисел. Задан массив В из М чисел. Известно, что все числа из массива В положительные, причем любое число больше или равно 0 и меньше N-1, т.е. числа из массива В задают индексы чисел из массива А. Индексы могут повторяться. Найти сумму чисел из массива А, индексы которых заданы в массиве В. Поиск суммы прекращается, если очередное число Аi =0 либо, если исчерпан массив В.
Задан массив А из N чисел. Подсчитать количество чисел, больших среднего арифметического.
Задан массив А из N чисел. Создать массив В, в котором будут находиться все числа, встречающиеся в массиве А только 1 раз.
Задан массив А из N чисел. Создать массив В, в котором будут записаны числа из массива А, и массив С, в котором Сi равно количеству чисел Вi в массиве А. Например, массив А (1,0,0,2,0,3,2,-4,1). Массив В должен быть (1,0,2,3,-4), а массив С (2,3,2,1).
Задан массив А из N чисел. N – четное или нечетное число. Образовать массив В, в котором В0= мах(А0,А1), В1=мах(А2,А3) и т.д.
Задан массив А из N чисел. N – не обязательно число, кратное 3. Убрать из этого массива каждый третий элемент. Более простой вариант – образовать новый массив без каждого третьего числа из массива А. Более сложный – удалять числа из массива А путем сдвига.
Задан массив А из 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 и т.д. до тех пор пока сравнивать слева и справа будет не с чем.
З
адан массив А из N чисел. Найти в этом массиве максимум и минимум. Напечатать все числа, находящиеся между первым максимальным (минимальным) числом и последним минимальным (максимальным) числом.