- •Лабораторная работа 8 применение команд цикла для программирования действий с массивами данных
- •Цикл по счетчику и пока равно (пока ноль):
- •Цикл по счетчику и пока не равно (пока не ноль):
- •8.6 Пример программы 2
- •8.7 Пример программы 3
- •8.8 Пример программы 4
- •8.9 Пример программы 5
- •8.10 Задания для самостоятельной работы
8.9 Пример программы 5
8.9.1 Формулировка задачи
В квадратной матрице 4х4 (элементы – слова, беззнаковые числа) подсчитать:
сумму элементов, принадлежащих условной линии, параллельной главной диагонали и расположенной выше ее (назовем «линия 1»);
сумму элементов, принадлежащих условной линии, параллельной побочной диагонали и расположенной ниже ее (назовем «линия 2»).
Сформировать одномерный массив, содержащий первую и вторую суммы.
Схема условного расположения элементов
j=0 1 2 3
i si=0 2 4 6


0 bх=0 00 01 02 03
линия 2: j+i=4
j+i-2=2 s[2]
1 bх=8 10 11 12 13 

2 bх=16 20 21 22 23 s[0]
s[2]

линия 1: j-i=1
j-i-1=0 s[0]

3 bх=24 30 31 32 33 массив s


индексы элементов матрицы
8.9.3 Общие замечания
При решении задач, в которых необходимо произвести действия с элементами квадратной матрицы в зависимости от их расположения относительно диагоналей, нужно, во-первых, использовать известные зависимости между значениями индексов элементов, во-вторых, четко представить себе, какие переменные или регистры содержат номера строк и столбцов, а если таковых нет, то как их можно получить.
Если принять i – номер строки, j – номер столбца, то для линии 1 существует зависимость: j – i = 1, а для линии 2: j + i = 4.
Две суммы элементов, принадлежащих соответственно линии 1 и линии 2, должны сформировать массив, например s, из двух элементов-слов, доступ к которым пусть обеспечивается выражением s[di]. Символьный адрес первого элемента будет s[0] (di=0), второго - s[2] (di=2).
Идея дальнейшей работы: преобразовать приведенные выше выражения, связывающие i и j, таким образом, чтобы в правой части были соответственно 0 или 2. Это позволит при последовательном «просмотре» элементов матрицы выбрать те, у которых выполняется первое или второе равенство, после чего добавить их к нужному элементу массива s. Естественно, начальные значения элементов массива s должны быть равны нулю.
Преобразованное равенство для линии 1: j-i-1=0, для линии 2: j+i-2=2.
В связи с тем, что ни регистр bx, ни si не совпадают со значениями номеров строк и столбцов i и j, логично ввести специальные переменные и изменять их синхронно с изменением регистров bx и si.
Постановка задачи
Принять тип элементов одномерного массива - слово. Так как каждый из элементов этого массива представляет собой сумму трех элементов исходного двумерного массива (слов), ограничить значения элементов двумерного массива величиной 65535 / 3 =21845.
Двумерный массив задать при описании переменной, для конкретики выбрать массив из следующих элементов:10121, 21000, 32, 4412, 5975, 6321, 7, 8000, 9254, 0, 19254, 21, 372, 4173, 53, 6823.
Нумерацию строк и столбцов начинать с нуля.
Для выборки элементов двумерного массива, отвечающих условиям задачи, ввести переменные i и j, равные соответственно номерам строки и столбца, и воспользоваться известными равенствами:
для линии 1: j-i-1=0,
для линии 2: j+i-2=2.
Листинг программы
model small
include io.asm ; подключение модуля IO.ASM (см. прил. А)
.stack 100h
.data
mas dw 10121, 21000, 32, 4412
dw 5975, 6321, 7, 8000
dw 9254, 0, 19254, 21
dw 372, 4173, 53, 6823
s dw 0, 0 ; резервирование памяти для одномерного массива сумм
j dw 0 ; номер столбца
i dw 0 ; номер строки
.code
start:
mov ax, @data
mov ds, ax
xor bx, bx ; 0 bx
mov cx, 4 ; 4 – количество строк
next_str: ; внешний цикл (переход от строки к строке)
push cx
mov cx, 4 ; 4 – количество столбцов
xor
si, si ; 0
si
mov j, 0 ; 0 j
next_el: ; внутренний цикл (переход по элементам строки)
; проверка индексов элементов
mov di, j ; di = j
sub di, i ; di = j - i
dec di ; di = j – i - 1
cmp di, 0 ; j – i – 1 = 0? ( элемент принадлежит линии 1?)
jne line2 ; если нет, перейти на метку line2,
; чтобы проверить на принадлежность линии 2
; принадлежит формирование первой суммы s[di] (di = 0)
mov ax, mas[bx][si]
add s[di], ax
jmp next ;переход на следующий элемент матрицы
line2: ; проверка на принадлежность элемента линии 2
mov di, j ; di = j
add di, iI ; di = j + i
sub di, 2 ; di = j + i -2
cmp di, 2 ; j + i -2 = 2? ( элемент принадлежит линии 2?)
jne next ; если нет, перейти на следующий элемент матрицы
; принадлежит формирование второй суммы s[di] (di = 2)
mov ax, mas[bx][si]
add s[di], ax
next:
add
si,
2 ; переход по строке 
inc j ; новый номер столбца
loop next_el
; строка завершена, переход на следующую
pop cx
add
bx, 8
inc i
loop next_str
;вывод одномерного массива
xor di, di ; 0 di
mov cx, 2 ; элементов - 2
t: outword s[di] ; элемент выведен
mov ah, 2 ; табуляция (перевод курсора)
mov dl, 9
int 21h
add di, 2 ; переход на следующий элемент
loop t
mov ah, 1 ; задержка для обозрения
int 21h
mov ax, 4С00h
int 21h
end start
