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

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

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

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

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

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

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

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

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

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

18
Mikl___
Автор FAQ
13487 / 6418 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
15.07.2014, 04:26 2
artem_fang,
http://www.cyberforum.ru/assembler-articles/thread1005284.html http://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow "Глава 14. МАССИВЫ" http://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow "Доступ к элементам массива"
0
proc3nt
волшебник
958 / 526 / 161
Регистрация: 26.05.2012
Сообщений: 1,491
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
proc3nt
волшебник
958 / 526 / 161
Регистрация: 26.05.2012
Сообщений: 1,491
15.07.2014, 05:34 5
ok!
1
murderer
4305 / 1567 / 158
Регистрация: 06.10.2010
Сообщений: 3,468
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
proc3nt
волшебник
958 / 526 / 161
Регистрация: 26.05.2012
Сообщений: 1,491
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
murderer
4305 / 1567 / 158
Регистрация: 06.10.2010
Сообщений: 3,468
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
Mikl___
Автор FAQ
13487 / 6418 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
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
proc3nt
волшебник
958 / 526 / 161
Регистрация: 26.05.2012
Сообщений: 1,491
15.07.2014, 17:34 10
murderer,
и опять наступаешь на те же самые грабли. здесь к первому элементу массива A условно добавляется еще что-то.
и это нужно учитывать. так что

Assembler
1
neg byte[A+eax*8+ecx-2]
0
Mikl___
Автор FAQ
13487 / 6418 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
15.07.2014, 17:43 11
proc3nt,
а не смущает, что у меня то же самое? К нулевому элементу массива добавляется 7*8+7=63 и вычитается 1, заменяем на дополнения с 62 по 56 элементы, далее с 54 по 48 и т.д. пока не дойдем до 8-го элемента
0
proc3nt
волшебник
958 / 526 / 161
Регистрация: 26.05.2012
Сообщений: 1,491
15.07.2014, 17:58 12
считаем. К нулевому элементу массива (1 элемент) ДОБАВЛЯЕТСЯ 7*8+7=63 (63 элемента). в итоге 1+63=64.
нам нужно вернуться к элементу 62, т.к. 63 - элемент главной диагонали. 64-62=2. поскольку мы возарвщаемся, то -2
0
Mikl___
Автор FAQ
13487 / 6418 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
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
proc3nt
волшебник
958 / 526 / 161
Регистрация: 26.05.2012
Сообщений: 1,491
15.07.2014, 18:09 14
ладно, пускай. только если посмотреть в дамп после того как выполнится команда neg с числом -1 почему-то байт 40h изменяется на свое дополнение. а байт 40h ведь стоит на главной диагонали.
0
Mikl___
Автор FAQ
13487 / 6418 / 635
Регистрация: 11.11.2010
Сообщений: 11,588
15.07.2014, 18:18 15
Цитата Сообщение от proc3nt Посмотреть сообщение
ладно, пускай. только если...
proc3nt,
я не "делаю программы на скорую руку" и перед тем как выкладывать что-либо на всеобщее обозрение -- проверяю, что бы потом не краснеть...
0
proc3nt
волшебник
958 / 526 / 161
Регистрация: 26.05.2012
Сообщений: 1,491
15.07.2014, 18:37 16
черте што. извини. вообще к тебе у меня претензий нету вообще. у меня была претензия к murderer. и как я только что понял, это была претензия к тому, что он не написал оператор ptr. и из-за этого наверное началась катавасия. оператор neg наверное работал со словом, а не с байтом. а у слова ведь обратный порядок следования байт. вот из-за этого затерся лишний байт.
а я просто скопировал его код и не обратил внимание на это
1
murderer
4305 / 1567 / 158
Регистрация: 06.10.2010
Сообщений: 3,468
15.07.2014, 19:17 17
это была претензия к тому, что он не написал оператор ptr
Обычно я пишу либо в FASM либо в BASM - там ptr не нужен

Добавлено через 2 минуты
neg наверное работал со словом, а не с байтом.
Хорошо, что сам разобрался что к чему
0
proc3nt
волшебник
958 / 526 / 161
Регистрация: 26.05.2012
Сообщений: 1,491
15.07.2014, 19:52 18
понял. ну а все-таки если твой вариант прикрутить к tasm (в котором я обычно делаю, и который уже 10 лет не поддерживается), то оператор byte просто смещает указатель на один байт (без толку). и ни с каким словом neg не работает. в итоге вот и получается число 64.
0
murderer
4305 / 1567 / 158
Регистрация: 06.10.2010
Сообщений: 3,468
15.07.2014, 20:10 19
Одна из причин не использовать TASM - http://www.cyberforum.ru/post3566825.html

Доверие к TASM`у окончательно улетучивается когда он заменяет инструкцию shl ax,4 на 4 инструкции shl ax,1 без какого-либо предупреждения.
0
15.07.2014, 20:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2014, 20:10

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

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

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


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

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

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