Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Заблокирован
1

Числа, находящиеся ниже главной диагонали марицы А, заменить их дополнением

14.07.2014, 23:51. Просмотров 860. Ответов 18
Метки нет (Все метки)

Помогите пожалуйста решить задачу:

Задана матрица целых чисел А размерностью 8х8. Числа, находящиеся ниже главной диагонали марицы А заменить их дополнением. Оформить в виде процедуры.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2014, 23:51
Ответы с готовыми решениями:

Вывести элементы марицы, расположенные ниже главной диагонали, не используя условный оператор
Дана матрица размера M х N. Вывести ее элементы, расположенные ниже главной диагонали . Вывод...

Обнулить элементы, находящиеся ниже главной диагонали
Пожалуйста помогите!=) 1. дана квадратная матрица размерности n. Обнулить элементы, находящиеся...

Найти сумму всех нечетных элементов выше главной диагонали и заменить ей все нечетные элементы ниже главной диагонали.
Разработать программу в среде матлаб для нахождения суммы всех нечетных элементов выше главной...

Найти произведение четных элементов, находящиеся ниже главной диагонали
Найти произведение четных элементов, находящиеся ниже главной диагонали

18
Ушел с форума
Автор FAQ
13853 / 6900 / 774
Регистрация: 11.11.2010
Сообщений: 12,440
15.07.2014, 04:26 2
artem_fang,
https://www.cyberforum.ru/assembler-articles/thread1005284.html https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow "Глава 14. МАССИВЫ" https://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow "Доступ к элементам массива"
0
1192 / 703 / 220
Регистрация: 26.05.2012
Сообщений: 2,210
15.07.2014, 04:36 3
делал на скорую руку. думаю, что можно еще оптимизировать

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
.model small
.386
 
.data
    db 'Bebin Of Data',0
A   db  01h,02h,03h,04h,05h,06h,07h,08h
    db  09h,0Ah,0Bh,0Ch,0Dh,0Eh,0Fh,10h 
    db  11h,12h,13h,14h,15h,16h,17h,18h 
    db  19h,1Ah,1Bh,1Ch,1Dh,1Eh,1Fh,20h  
    db  21h,22h,23h,24h,25h,26h,27h,28h  
    db  29h,2Ah,2Bh,2Ch,2Dh,2Eh,2Fh,30h  
    db  31h,32h,33h,34h,35h,36h,37h,38h 
    db  39h,3Ah,3Bh,3Ch,3Dh,3Eh,3Fh,40h
    db 'End Of Data',0
    
.stack
    db  0FFh
    
.code
start:
    mov ax,@data
    mov ds,ax
 
    xor si,si
    xor ax,ax
    mov bx,01h
    mov dx,08h
    mov cx,07h
    row:
        push cx
        
        mov al,type A
        mul dl
        add si,ax
        
        mov cx,bx
        fill:
            mov al,A[si]
            push ax
            call addition
            
            pop ax
            mov A[si],al
            
            mov ax,type A
            add si,ax
        loop fill
                
        inc bl 
        dec dl
        
        pop cx
    loop row
 
    mov ah,4Ch
    int 21h
    
    addition proc
        push bp
        mov bp,sp
        
        xor ah,ah
        mov al,byte ptr [bp+4]
        not al
        inc al
        
        mov [bp+4],al
        pop bp
        ret
    addition endp
end start
1
Mikl___
15.07.2014, 04:48
  #4

Не по теме:

proc3nt,
как же, будет ТС оптимизацией заниматься :rofl:, нужно было artem_fang дать неделю на "дозревание", он бы литературу почитал, свои бы версии программы показал, лучше уж выкладывай решения к старым топикам :rtfm:

0
1192 / 703 / 220
Регистрация: 26.05.2012
Сообщений: 2,210
15.07.2014, 05:34 5
ok!
1
3978 / 1705 / 195
Регистрация: 06.10.2010
Сообщений: 3,816
15.07.2014, 06:11 6
Может так
Assembler
1
2
3
4
5
6
mov eax,8
row:mov ecx,eax
    fill:neg byte[A+eax*8+ecx-9]
    loop fill
    dec eax
jnz row
2
1192 / 703 / 220
Регистрация: 26.05.2012
Сообщений: 2,210
15.07.2014, 16:27 7
o_O ребята.. а вы тестировали предыдущий вариант? по-моему так там затираются нужные байты.
посмотрите вот на мой вариант. сравните и ощутите разницу.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
    mov eax,8
    row:
    mov ecx,eax
    dec ecx
    
    test ecx,ecx
    je exit
    
    fill:neg byte[A+eax*8+ecx-0Ah]
    loop fill
    dec eax
    jnz row
    exit:
ведь как я понимаю ecx хранит количество элементов для изменения в каждой строке. а оно не может превышать семи и быть меньше одного, т.к. восьмой - это уже элемент главной диагонали, а в нулевой строке изменять вообще ничего не нужно. в задаче требуется изменять элементы только ниже главной диагонали.
к тому нужно отнимать не девять, а 0Ah. т.к. индекс массива будет изменяться от 0 до 63.
1
3978 / 1705 / 195
Регистрация: 06.10.2010
Сообщений: 3,816
15.07.2014, 17:06 8
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Верно там захватывается главная диагональ

Правильнее так
Assembler
1
2
3
4
5
6
mov eax,7
row:mov ecx,eax
    fill:neg byte[A+eax*8+ecx-1]
    loop fill
    dec eax
jnz row
1
Ушел с форума
Автор FAQ
13853 / 6900 / 774
Регистрация: 11.11.2010
Сообщений: 12,440
15.07.2014, 17:17 9
Assembler
1
2
3
4
5
6
  mov eax,7
@0: mov ecx,eax
@@: neg byte ptr A[eax*8+ecx-1]
    loop @b
    dec eax
    jnz @0
murderer,
извини, пока проверял ты дал правильный ответ
1
1192 / 703 / 220
Регистрация: 26.05.2012
Сообщений: 2,210
15.07.2014, 17:34 10
murderer,
и опять наступаешь на те же самые грабли. здесь к первому элементу массива A условно добавляется еще что-то.
и это нужно учитывать. так что

Assembler
1
neg byte[A+eax*8+ecx-2]
0
Ушел с форума
Автор FAQ
13853 / 6900 / 774
Регистрация: 11.11.2010
Сообщений: 12,440
15.07.2014, 17:43 11
proc3nt,
а не смущает, что у меня то же самое? К нулевому элементу массива добавляется 7*8+7=63 и вычитается 1, заменяем на дополнения с 62 по 56 элементы, далее с 54 по 48 и т.д. пока не дойдем до 8-го элемента
0
1192 / 703 / 220
Регистрация: 26.05.2012
Сообщений: 2,210
15.07.2014, 17:58 12
считаем. К нулевому элементу массива (1 элемент) ДОБАВЛЯЕТСЯ 7*8+7=63 (63 элемента). в итоге 1+63=64.
нам нужно вернуться к элементу 62, т.к. 63 - элемент главной диагонали. 64-62=2. поскольку мы возарвщаемся, то -2
0
Ушел с форума
Автор FAQ
13853 / 6900 / 774
Регистрация: 11.11.2010
Сообщений: 12,440
15.07.2014, 18:07 13
proc3nt,
считай, считай 0+7*8+7-1=?

так нагляднее
00 01 02 03 04 05 06 07
08 09 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63
0
1192 / 703 / 220
Регистрация: 26.05.2012
Сообщений: 2,210
15.07.2014, 18:09 14
ладно, пускай. только если посмотреть в дамп после того как выполнится команда neg с числом -1 почему-то байт 40h изменяется на свое дополнение. а байт 40h ведь стоит на главной диагонали.
0
Ушел с форума
Автор FAQ
13853 / 6900 / 774
Регистрация: 11.11.2010
Сообщений: 12,440
15.07.2014, 18:18 15
Цитата Сообщение от proc3nt Посмотреть сообщение
ладно, пускай. только если...
proc3nt,
я не "делаю программы на скорую руку" и перед тем как выкладывать что-либо на всеобщее обозрение -- проверяю, что бы потом не краснеть...
0
1192 / 703 / 220
Регистрация: 26.05.2012
Сообщений: 2,210
15.07.2014, 18:37 16
черте што. извини. вообще к тебе у меня претензий нету вообще. у меня была претензия к murderer. и как я только что понял, это была претензия к тому, что он не написал оператор ptr. и из-за этого наверное началась катавасия. оператор neg наверное работал со словом, а не с байтом. а у слова ведь обратный порядок следования байт. вот из-за этого затерся лишний байт.
а я просто скопировал его код и не обратил внимание на это
1
3978 / 1705 / 195
Регистрация: 06.10.2010
Сообщений: 3,816
15.07.2014, 19:17 17
это была претензия к тому, что он не написал оператор ptr
Обычно я пишу либо в FASM либо в BASM - там ptr не нужен

Добавлено через 2 минуты
neg наверное работал со словом, а не с байтом.
Хорошо, что сам разобрался что к чему
0
1192 / 703 / 220
Регистрация: 26.05.2012
Сообщений: 2,210
15.07.2014, 19:52 18
понял. ну а все-таки если твой вариант прикрутить к tasm (в котором я обычно делаю, и который уже 10 лет не поддерживается), то оператор byte просто смещает указатель на один байт (без толку). и ни с каким словом neg не работает. в итоге вот и получается число 64.
0
3978 / 1705 / 195
Регистрация: 06.10.2010
Сообщений: 3,816
15.07.2014, 20:10 19
Одна из причин не использовать TASM - https://www.cyberforum.ru/post3566825.html

Доверие к TASM`у окончательно улетучивается когда он заменяет инструкцию shl ax,4 на 4 инструкции shl ax,1 без какого-либо предупреждения.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2014, 20:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Элементы выше главной диагонали заменить на ноль, а ниже главной диагонали – округлить
Всем привет. Очень давно не работал с Pascal'ем и ни как не могу понять, что надо сделать, думаю у...

С помощью сортировки пузырьком упорядочить элементы матрицы, находящиеся ниже главной диагонали
отсортировать элементы двумерного массива которые находятся ниже главной диагонали

Модули. В матрице N*N заменить единицами элементы находящиеся на побочной диагонали и ниже ее
Задание такое: необходимо в матрице N*N заменить единицами элементы находящиеся на побочной...

Дана квадратная матрица целых чисел. Выписать все элементы матрицы, находящиеся ниже главной диагонали
Дана квадратная матрица целых чисел. Выписать все элементы матрицы, находящиеся ниже главной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.