PROBLEMA scambio diagonali in c

Pubblicità

ilfe98

Utente Èlite
Messaggi
3,083
Reazioni
1,317
Punteggio
134
Salve a tutti ho fatto un programma che doveva essere alquanto banale in c tuttavia lo scambio delle diagonali non avviene correttamente. so che sbaglio nel momento in cui la c viene riazzerata,avreste magari una soluzione più efficiente?
C:
#include"matrix.h"
extern struct matrix *scambia_diagonali(const struct matrix *m) {
    struct matrix *ret = malloc(sizeof(struct matrix));
    ret->cols = m->cols;
    ret->rows = m->rows;
    ret->data = malloc(sizeof(double)*ret->cols*ret->rows);
    double temp;
    for (size_t r = 0; r < m->rows; r++)
        for (size_t c = 0; c < m->cols; c++) {
            if (c == r) {
                temp = m->data[r*m->cols + c];
                ret->data[r*m->cols + c] = m->data[(r*m->cols) + (m->cols - c - 1)];
                ret->data[(r*m->cols) + (m->cols - c - 1)] = temp;
            }
            if (c == ret->cols - 1)
                break;
            else
                ret->data[r*m->cols + c] = m->data[r*m->cols + c];
        }
    return ret;
}
 
Non devi fare nessuno scambio, visto che non inizializzi la nuova matrice.
Se sei in una diagonale, assegna il valore della diagonale opposta, altrimenti assegna il valore della stessa posizione
C:
#include"matrix.h"
extern struct matrix *scambia_diagonali(const struct matrix *m) {
    struct matrix *ret = malloc(sizeof(struct matrix));
    ret->cols = m->cols;
    ret->rows = m->rows;
    ret->data = malloc(sizeof(double)*ret->cols*ret->rows);
    double temp;
    for (size_t r = 0; r < m->rows; r++)
        for (size_t c = 0; c < m->cols; c++) {
            if (c == r)
            {
                ret->data[r*m->cols + c] = m->data[(r*m->cols) + (m->cols - c - 1)];
            }
            else if (c == m->cols - 1 - r)
            {
                ret->data[r*m->cols + c] = m->data[(r*m->cols) + r];
            }
            else
            {
                ret->data[r*m->cols + c] = m->data[r*m->cols + c];
             }
        }
    return ret;
}
Un altro modo e' quello di copiare prima le matrice, poi dopo ogni riga scambiare tra loro gli elementi 'r' e 'cols-1-r'
Io preferisco il primo metodo, ma e' gusto personale.
Non ho provato il codice, ho scritto alla cieca ma quella e' l'idea.
 
Non devi fare nessuno scambio, visto che non inizializzi la nuova matrice.
Se sei in una diagonale, assegna il valore della diagonale opposta, altrimenti assegna il valore della stessa posizione
C:
#include"matrix.h"
extern struct matrix *scambia_diagonali(const struct matrix *m) {
    struct matrix *ret = malloc(sizeof(struct matrix));
    ret->cols = m->cols;
    ret->rows = m->rows;
    ret->data = malloc(sizeof(double)*ret->cols*ret->rows);
    double temp;
    for (size_t r = 0; r < m->rows; r++)
        for (size_t c = 0; c < m->cols; c++) {
            if (c == r)
            {
                ret->data[r*m->cols + c] = m->data[(r*m->cols) + (m->cols - c - 1)];
            }
            else if (c == m->cols - 1 - r)
            {
                ret->data[r*m->cols + c] = m->data[(r*m->cols) + r];
            }
            else
            {
                ret->data[r*m->cols + c] = m->data[r*m->cols + c];
             }
        }
    return ret;
}
Un altro modo e' quello di copiare prima le matrice, poi dopo ogni riga scambiare tra loro gli elementi 'r' e 'cols-1-r'
Io preferisco il primo metodo, ma e' gusto personale.
Non ho provato il codice, ho scritto alla cieca ma quella e' l'idea.
Grazie.comunque avevo risolto :D
 
Pubblicità
Pubblicità
Indietro
Top