Matrice diagonale

di il
12 risposte

Matrice diagonale

Ciao a tutti! stavo scrivendo un programma che verificasse se una matrice è diagonale ma non capisco perchè non mi risulti. qualcuno mi può dare una mano? questo è il codice
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
#define D 4

void stampa(int n, int m[n][n]){
int i,j;
for(i=0; i<n; i++){
for(j=0; j<n; j++){
printf("%3d ", m[j]);
}
printf("\n");
}
}

void inizializza(int n, int m[n][n]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
m[j]=rand()%100+1;
}
}
}

int main(void){
int M[N][N];
int A[D][D]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
int i,j;
int condizione1, condizione2;

srand(time(0));
inizializza(N,M);
stampa(N,M);
printf("\n\n");

//vero=0 e falso=1
i=0;
while(i<N){
j=0;
while(j<N){
if(i!=j && M[j]==0 || i==j && M[j]==1 ){
condizione1=0;
j++;
}else{
condizione1=1;
}
i++;
}

}
if(condizione1=0) printf("la prima matrice risulta essere diagonale");
else if(condizione1=1) printf("la prima matrice non e' diagonale");
printf("\n\n");
stampa(D,A);
printf("\n\n");

i=0;
while(i<D){
j=0;
while(j<D){
if((i!=j && A[j]==0) || (i==j && A[j]==1) ){
condizione2=0;
j++;
}else {
condizione2=1;
}
i++;
}

}
if(condizione2=0) printf("la seconda matrice risulta essere diagonale");
else if(condizione2=1) printf("la seconda matrice non e' diagonale");
}


Da premettere che vorrei scrivere due matrici: una creata da me in modo tale che fosse diagonale e una generata casualmente e quindi poco probabile che risulti diagonale. L'ho fatto per evidenziare la differenza tra le due matrici. Grazie in anticipo a chi sarà così gentile da rispondermi

12 Risposte

  • Re: Matrice diagonale

    Usa i tag CODE altrimenti non si capisce nulla ( pulsante < / > )

    Provate anche a non mettere subito al primo tentativo le chiamate a funzione, che se va tutto bene ok, ma se le cose non funzionano poi dovete fare più fatica a isolare il problema...
  • Re: Matrice diagonale

    Ok ma potresti dirmi oltre a questo come risolvere il problema? Sicuramente tutto sta nei due cicli che permettono di verificare se la matrice è diagonale o no
  • Re: Matrice diagonale

    Metti il codice nei tag CODE. Non vedi che è illeggibile e viene interpretato come corsivo?
  • Re: Matrice diagonale

    Scusa se ti faccio delle domande, ma il codice che hai postato riesci a compilarlo? come?
    es:
    
    void inizializza(int n, int m[n][n]){
        int i,j;
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
            m[j]=rand()%100+1;
            }
        }
    }
    
    ho errore sulle variabili intere n che definiscono le dimensioni della matrice.
    dichiari la matrice m[n][n] a due dimensioni, poi nel ciclo for è a una dimensione: m[j]=rand()%100+1;
  • Re: Matrice diagonale

    @Rubik

    Infatti il codice è stato tagliato.
  • Re: Matrice diagonale

    Il codice postato è pieno di errori di trascrizione, ma l'errore lampante è nell'if finale dove invece di verificare il valore di condizione2, gli viene assegnato il valore.
    
    // sbagliato
       if(condizione2=0) printf("la seconda matrice risulta essere diagonale");
        else if(condizione2=1) printf("la seconda matrice non e' diagonale");
        
     // corretto
        if(condizione2==0) printf("la seconda matrice risulta essere diagonale");
        else if(condizione2==1) printf("la seconda matrice non e' diagonale");
    
    codice corretto, ma solo riferito alla matrice diagonale A e condizione2, non ho verificato altro, non so se ci sono errori di concetto.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 4 // matrice casuale stesse dimensioni di quella di confronto
    #define D 4
    void stampa(int n, int m[N][N]){
        int i,j;
        for(i=0; i<n; i++){
            for(j=0; j<n; j++){
                printf("%3d ", m[i][j]);
            }
            printf("\n");
        }
    }
    
    void inizializza(int n, int m[N][N]){
        int i,j;
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
            m[i][j]=rand()%100+1;
            }
        }
    }
    
    
    int main(void){
        int M[N][N];
        int A[D][D]={{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
        int i,j;
        int condizione1, condizione2;
    
        srand(time(0));
        inizializza(N,M);
        stampa(N,M);
        printf("\n\n");
    
        //vero=0 e falso=1
        i=0;
        while(i<D){
            j=0;
            while(j<D){
            if(i!=j && M[i][j]==0 || i==j && M[i][j]==1 ){
                    condizione1=0;
                    j++;
                }else{
                    condizione1=1;
                }
            i++;
            }
        }
        if(condizione1=0) printf("la prima matrice risulta essere diagonale");
        else if(condizione1=1) printf("la prima matrice non e' diagonale");
        printf("\n\n");
        stampa(D,A);
        printf("\n\n");
    
        i=0;
        while(i<D){
            j=0;
            while(j<D){
                if((i!=j && A[i][j]==0) || (i==j && A[i][j]==1) ){
                    condizione2=0;
                    j++;
                }else {
                    condizione2=1;
                }
            i++;
            }
        }
        if(condizione2==0) printf("la seconda matrice risulta essere diagonale");
        else if(condizione2==1) printf("la seconda matrice non e' diagonale");
    }
    
    Il codice non funziona, domanda
    
    Questa matrice è diagonale!
    1000
    0100
    0010
    0001
    [si]
    
    Questa matrice è diagonale?
    1001
    0100
    0010
    0001
    [no]
    
    Questa matrice è diagonale?
    1234
    2134
    3415
    6781
    [no]
    
    Questa matrice è diagonale?
    0001
    0010
    0100
    1000
    [no]
    
    
  • Re: Matrice diagonale

    È vero, ho scordato a mettere il doppio uguale. Purtuppo capita di fare questi errori talvolta di distrazione. Comunque ora il codice funziona. Grazie mille
  • Re: Matrice diagonale

    Clara517 ha scritto:


    È vero, ho scordato a mettere il doppio uguale. Purtuppo capita di fare questi errori talvolta di distrazione. Comunque ora il codice funziona. Grazie mille
    Puoi postare il codice che funziona?, quello che ho io non funziona, dice sempre che la matrice è diagonale, ma non lo posso correggere se non conosco la definizione di matrice diagonale...

    Se per favore rispondi ai quesiti...
    
    Questa matrice è diagonale?
    1001
    0100
    0010
    0001
    [no]
    
    Questa matrice è diagonale?
    1234
    2134
    3415
    6781
    [no]
    
    Questa matrice è diagonale?
    0001
    0010
    0100
    1000
    [no]
    
  • Re: Matrice diagonale

    Il codice non funziona anche correggendo l'==. Una matrice quadrata è diagonale quando, per qualsiasi i e j, se i != j allora M[ i ][ j ] = 0
  • Re: Matrice diagonale

    Weierstrass ha scritto:


    Il codice non funziona anche correggendo l'==. Una matrice quadrata è diagonale quando, per qualsiasi i e j, se i != j allora M[ i ][ j ] = 0
    se non ho capito male la definizione, questa matrice quadrata è diagonale?
    2000
    0300
    0070
    0001
    [si]

    e questa?
    1222
    2122
    2212
    2221
    [no]
  • Re: Matrice diagonale

    In parole più semplici

    "è una matrice quadrata in cui solamente i valori della diagonale principale possono essere diversi da 0"

    e fai attenzione al "possono"
  • Re: Matrice diagonale

    oregon ha scritto:


    In parole più semplici

    "è una matrice quadrata in cui solamente i valori della diagonale principale possono essere diversi da 0"

    e fai attenzione al "possono"
    Capito!
    Ora funziona:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #define N 4 // matrice casuale stesse dimensioni di quella di confronto
    #define D 4
    void stampa(int n, int m[N][N]){
        int i,j;
        for(i=0; i<n; i++){
            for(j=0; j<n; j++){
                printf("%3d ", m[i][j]);
            }
            printf("\n");
        }
    }
    
    void inizializza(int n, int m[N][N]){
        int i,j;
        for(i=0;i<n;i++){
            for(j=0;j<n;j++){
            m[i][j]=rand()%100+1;
            }
        }
    }
    
    int main(void){
        int M[N][N];
        int A[D][D]={{5,0,0,0},{0,3,0,0},{0,0,2,0},{0,0,0,8}};
        int i, j, condizione = 0;
    
        srand(time(0));
        inizializza(N,M);
        stampa(N,M);
        printf("\n\n");
        /*
        // codice non corretto
        // vero=0 e falso=1
        i=0;
        while(i<D){
            j=0;
            while(j<D){
            if(i!=j && M[i][j]==0 || i==j && M[i][j]==1 ){
                    condizione=0;
                    j++;
                }else{
                    condizione=1;
                }
            i++;
            }
        }
        if(condizione=0) printf("la prima matrice risulta essere diagonale");
        else if(condizione=1) printf("la prima matrice non e' diagonale");
        */
    
        printf("\n\n");
        stampa(D,A);
        printf("\n\n");
    
        // tutti i valori al di fuori della diagonale devono essere a zero
        // codice seconda matrice corretto e funzionante
    
        i=0;
        while(i<D){
            j=0;
            while(j<D){
                if((i!=j & A[i][j]!=0) ){
                    condizione=1;
                    break; // al primo valore non in diagonale diverso da zero si esce
                }else {
                    condizione=0;
                    j++;
                }
            }
            // se condizione==1 obbligatorio uscire
            // per evitare che altri confronti rimettano a zero condizione
            if (condizione==1){break;}
            i++;
        }
        
        if(condizione==0) printf("la seconda matrice risulta essere diagonale\n");
        else if(condizione==1) printf("la seconda matrice non e' diagonale\n");
    }
    
Devi accedere o registrarti per scrivere nel forum
12 risposte