Trasposizione di una matrice quadrata 4x4

di Anonimizzato13423 il
9 risposte
Salve a tutti Come da titolo sto cercando di trasporre una matrice 4x4,solo che la trasposizione della matrice avviene solo in parte,infatti se inserisco la seguente matrice
1 2 3 4
5 6 7 8
9 0 1 2
3 4 5 6

Mi stampa la seguente matrice che non è la trasposta!:
1 5 9 3
2 6 7 8
3 0 1 2
4 4 5 6

La trasposta è la seguente
1 5 9 3
2 6 0 4
3 7 1 5
4 8 2 6
data segment  'DATA' 
; La matrice è memorizzata per riga
mat     db ?,?,?,?                
        db ?,?,?,?
        db ?,?,?,?
        db ?,?,?,?
cont db 0
colonne equ 4
        dom db 'inserire la matrice :',13,10,'$'
        ris db 'La matrice inserita e:',13,10,'$'
        ris2 db 'Una volta effettuata la trasposizione della matrice :',13,10,'$'
                
data ends 

stack segment 'STACK'
    dw   128  dup(0)
stack ends

code segment 'CODE'
start:

    mov ax,@data
    mov ds, ax 
    
    mov ah,09h
    lea dx,dom
    int 21h
    
    mov cont,0
;Calcolo posizione della riga nell'array fisico. Uso per gestire la matrice il comando
;indice di riga*colonna + indice di colonna ossia mat+i*c+j
       
   cicloest1:mov al,colonne
             mul cont                   ;moltiplico per colonne e il risultato lo trovo in ax
             mov bx,ax                  ;sposto il risultato in ax
             xor si,si                  ; Inizializzo indice di colonna assegnato a SI
             mov cx,colonne
             mov dl,13
             mov ah,02h
             int 21h
             mov dl,10
             mov ah,02h
             int 21h  
             ciclo1:mov ah,01h
                   int 21h 
                   mov mat[bx+si],al   ;mat[bx+si]=[mat+bx+si] ma bx=i*c quindi = [mat+i*c+j]
                   ;uso la 02h per stampare a video l'elemento del vettore
                   mov dl," "          ;stampo a video lo spazio tra un elemento e l'altro
                   mov ah,02h
                   int 21h
                   inc si
                   loop ciclo1         ;ciclo che continua fino a quando non termino le colonne
                   inc cont            ;passo alla riga successiva
                   cmp cont,4          ;se sono arrivato alla terza riga ho finito
                   JL cicloest1
                  
   mov cont,0 
   
   mov ah,09h
   lea dx,ris
   int 21h
   
   cicloest:mov al,colonne
            mul cont                   ;moltiplico per colonne e il risultato lo trovo in ax
            mov bx,ax                  ;sposto il risultato in ax
            xor si,si                  ; Inizializzo indice di colonna assegnato a SI
            mov cx,colonne
            mov dl,13
            mov ah,02h
            int 21h
            mov dl,10
            mov ah,02h
            int 21h  
            ciclo:
                   mov dl,mat[bx+si]   ;mat[bx+si]=[mat+bx+si] ma bx=i*c quindi = [mat+i*c+j]
                   mov ah,02h
                   int 21h             ;uso la 02h per stampare a video l'elemento del vettore
                   mov dl," "          ;stampo a video lo spazio tra un elemento e l'altro
                   mov ah,02h
                   int 21h
                   inc si
                   loop ciclo          ;ciclo che continua fino a quando non termino le colonne
                   inc cont            ;passo alla riga successiva
                   cmp cont,4          ;se sono arrivato alla terza riga ho finito
                   JL cicloest         ;fino a quando è minore di 3 ripeto il ciclo
      
       mov cont,0 
      
       mov ah,09h
       lea dx,ris2
       int 21h
       
       mov bx,0 ; mi azzero l'indice delle righe
       mov si,0 ; mi azzero l'indice delle colonne
       mov cx,4 ; dimensione della riga
       mov dx,0 ; azzero un registro che mi servirà per lo scambio dei dati
scambio:
      mov dh,mat[bx] ; prendo l'elemento della riga.
      mov dl,mat[si] ; prendo l'elemento della colonna.
      xchg dh,dl ; effettuo lo scambio.
      mov mat[bx],dh ; posiziono l'elemento della riga.
      mov mat[si],dl ;posiziono l'elemento della colonna.
      inc bx  ; vado all'elemento successivo della riga.
      add si,4 ; vado all'elemento successivo della colonna.
      loop scambio ; ripeto lo scambio
      
      mov cont,0
      
      cicloest2:mov al,colonne
            mul cont                   ;moltiplico per colonne e il risultato lo trovo in ax
            mov bx,ax                  ;sposto il risultato in ax
            xor si,si                  ; Inizializzo indice di colonna assegnato a SI
            mov cx,colonne
            mov dl,13
            mov ah,02h
            int 21h
            mov dl,10
            mov ah,02h
            int 21h  
            ciclo2:
                   mov dl,mat[bx+si]   ;mat[bx+si]=[mat+bx+si] ma bx=i*c quindi = [mat+i*c+j]
                   mov ah,02h
                   int 21h             ;uso la 02h per stampare a video l'elemento del vettore
                   mov dl," "          ;stampo a video lo spazio tra un elemento e l'altro
                   mov ah,02h
                   int 21h
                   inc si
                   loop ciclo2          ;ciclo che continua fino a quando non termino le colonne
                   inc cont            ;passo alla riga successiva
                   cmp cont,4          ;se sono arrivato alla terza riga ho finito
                   JL cicloest2         ;fino a quando è minore di 3 ripeto il ciclo 
   
   fine:    NOP
            mov AH,4CH
            INT 21H
            
Grazie a tutti dell'attenzione!

9 Risposte

  • Semplicemente perché il codice che hai usato per lo scambio lavora solamente sulla prima riga e colonna e poi non fa altro.
  • E come posso correggere il codice?
  • Rifletti su quello che hai scritto ...
  • L'errore dovrebbe stare in quel bx giusto? perchè il ciclo in questo modo viene ripetuto una sola volta?!
  • Nessuno che può darmi una mano..
  • Invece di attendere soluzioni pronte prova a dare tu una soluzione
  • Oregon ho postato il codice,l'ho commentato,sto provando a capire dove è l'errore ma non ci riesco e sto chiedendo il vostro aiuto,se fossi in grado di risolvere di certo non avrei aperto un nuovo thread
  • Quello che un forum ti dà è un'indicazione. E l'indicazione che ti è stata data è che nel codice dello "scambio" tu lavori con una sola riga e una colonna.

    A questo punto, come hai scritto quel codice, lo rivedi, cerchi di modificarloe proponi il codice modificato anche se non funziona.

    Mi sembra invece che tu non ci tenti neanche attendendo la "pappa pronta" che scenda dal cielo. Un forum non è fatto per questo.
  • Ok,grazie dell'aiuto.Alla prossima
Devi accedere o registrarti per scrivere nel forum
9 risposte