Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 / МУ_ЭВМ+ПУ_ч1 / 8-МУ_ЭВМ+ПУ-цикл.docx
Скачиваний:
49
Добавлен:
28.05.2015
Размер:
80.55 Кб
Скачать

8.9 Пример программы 5

8.9.1 Формулировка задачи

В квадратной матрице 4х4 (элементы – слова, беззнаковые числа) подсчитать:

  • сумму элементов, принадлежащих условной линии, параллельной главной диагонали и расположенной выше ее (назовем «линия 1»);

  • сумму элементов, принадлежащих условной линии, параллельной побочной диагонали и расположенной ниже ее (назовем «линия 2»).

Сформировать одномерный массив, содержащий первую и вторую суммы.

      1. Схема условного расположения элементов

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.

      1. Постановка задачи

Принять тип элементов одномерного массива - слово. Так как каждый из элементов этого массива представляет собой сумму трех элементов исходного двумерного массива (слов), ограничить значения элементов двумерного массива величиной 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.

      1. Листинг программы

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

Соседние файлы в папке МУ_ЭВМ+ПУ_ч1