Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1

    [C] Matrice e diagonali

    Salve a tutti, avrei bisogno di un aiutino su questo esercizio: input di una matrice (possibilmente quadrata), inserimento dei valori sulle diagonali in un vettore, output della matrice e del vettore contenente i valori.
    Mi sono bloccato in un punto: non riesco a trovare un modo per stampare il vettore dei valori delle diagonali

    codice:
    #include <stdio.h>
    #define max 10
    /*PROTOTIPI*/
    void dimensioni(int matrice[max][max], int *righe, int *col);
    void input(int matrice[max][max], int righe, int col);
    void diagonali(int matrice[max][max], int righe);
    void output(int matrice[max][max], int righe, int col);
    /*FUNZIONE MAIN*/
    int main(void) {
    int matrice[max][max], righe, col;
    dimensioni(matrice, &righe, &col);
    input(matrice, righe, col);
    diagonali(matrice, righe);
    output(matrice, righe, col);
    return 0;
    }
    /*DIMENSIONE MATRICE*/
    void dimensioni(int matrice[max][max], int *righe, int *col) {
    printf("Numero righe: ");
    scanf("%d", righe);
    printf("Numero colonne: ");
    scanf("%d", col);
    }
    /*INPUT MATRICE*/
    void input(int matrice[max][max], int righe, int col) {
    int i, j;
    for(i=0;i<righe;i++) {
     for(j=0;j<col;j++) {
      printf("Immetti valore [%d][%d]: ", i, j);
      scanf("%d", &matrice[i][j]);
      }
     }
    }
    /*DIAGONALI MATRICE*/
    void diagonali(int matrice[max][max], int righe) {
    int i, j;
    int v[max];
    j=0;
    for(i=0;i<righe;i++) {
     v[j++]=matrice[i][i];
     if(matrice[i][i]!=matrice[i][righe-1-i]) v[j++]=matrice[i][righe-1-i];
     }
    for(j=0;j<                       /*Qui non so come stampare i valori*/
     printf("%d ", v[j]);
     }
    }
    /*OUTPUT MATRICE*/
    void output(int matrice[max][max], int righe, int col) {
    int i, j;
    for(i=0;i<righe;i++) {
     for(j=0;j<col;j++) {
      printf("%d     ", matrice[i][j]);
      }
     printf("\n");
     }
    }
    Vi ringrazio in anticipo!

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Quali sono gli elementi della diagonale principale? Tutti gli elementi di indice i,i con i ∈ [0,max[ .
    Per cui ti basta un solo for per stamparli, scrivi il codice ora che sai come farlo.

  3. #3
    non è una semplice stampa dei valori.. sto parlando della stampa di un vettore contenente i valori delle due diagonali di una matrice quadrata

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Una matrice quadrata ha una diagonale principale , quando dici "le due diagonali" intendi quelle sotto e sopra quella principale?
    E qual'è il motivo di questo if:
    codice:
    if(matrice[i][i]!=matrice[i][righe-1-i]) 
        v[j++]=matrice[i][righe-1-i];
    ?

  5. #5
    intendo creare un vettore che contenga i valori della diagonale principale e della diagonale secondaria di una matrice quadrata, non c'è molto da spiegare..
    quell'if serve per evitare la doppia acquisizione di un valore comune alle due diagonali (ad esempio quando hai una matrice 3x3 le due diagonali hanno lo stesso valore centrale)

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: [C] Matrice e diagonali

    Ma utilizzi un solo vettore per metterci le due diagonali?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7

    Re: Re: [C] Matrice e diagonali

    Originariamente inviato da oregon
    Ma utilizzi un solo vettore per metterci le due diagonali?
    Ma appunto...parla di "diagonali" ma ha dichiarato solo il vettore v[max]

    codice:
     
    for(i=0;i<righe;i++) {
     v[j++]=matrice[i][i]; //diagonale principale OK
     if(matrice[i][i]!=matrice[i][righe-1-i]) //non capisco il senso di questa
         v[j++]=matrice[i][righe-1-i];
     }
    quell'if serve per evitare la doppia acquisizione di un valore comune alle due diagonali (ad esempio quando hai una matrice 3x3 le due diagonali hanno lo stesso valore centrale)
    Ma perché qual'è il problema?
    Nel caso sia una matrice 3x3 per memorizzare la diagonale principale fa tre cicli:
    1) v[0]=matrice[0][0];
    2) v[1]=matrice[1][1];
    3) v[2]=matrice[2][2];

    e non c'è nessuna doppia acquisizione!!

    Per memorizzare l'altra diagonale dichiari v2[max] e fai ancora un ciclo:
    1) v2[0] = matrice[0][2]
    2) v2[1] = matrice[1][1]
    3) v2[2] = matrice[2][0]

    che tradotto in C diventa:
    codice:
    j=0;
    for(i=0;i<righe;i++) 
     v[j++]=matrice[i][max-j]; //diagonale secondaria
    Quindi, mettendo tutto assieme:
    codice:
    /*DIAGONALI MATRICE*/
    void diagonali(int matrice[max][max], int righe) {
    int i, j;
    int v[max],v2[max];
    j=0;
    for(i=0;i<righe;i++) {
     v[j++]=matrice[i][i];         //diagonale principale
     v[j++]=matrice[i][max-j]; //diagonale secondaria
     }
    }

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Esatto ... e in quel caso la visualizzazione avviene usando un contatore da 0 a max (non compreso) per i due vettori.

    Ma se ne volessi usare uno solo, puoi inserire le diagonali una dopo l'altra ... ovviamente il contatore andrà da 0 a max*2 (non compreso).
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Originariamente inviato da robe92
    intendo creare un vettore che contenga i valori della diagonale principale e della diagonale secondaria di una matrice quadrata, non c'è molto da spiegare..
    Ora l' hai spiegato, ma prima non avevi spiegato proprio niente dicendo "le due diagonali" , non posso leggerti nel cervello.

    E' il classico problema espresso male che ci si mette più a capirlo che a farlo:

    codice:
    int m=righe;
    int diag1[righe],diag2[righe];
    for(int i=0;i<righe;i++)
    {
        diag1[i]=matrice[i][i]; // diagonale principale
        diag2[i]=matrice[i][--m]; // diagonale secondaria
    }

  10. #10

    Re: Re: Re: [C] Matrice e diagonali

    Ma perché qual'è il problema?
    Nel caso sia una matrice 3x3 per memorizzare la diagonale principale fa tre cicli:
    1) v[0]=matrice[0][0];
    2) v[1]=matrice[1][1];
    3) v[2]=matrice[2][2];

    e non c'è nessuna doppia acquisizione!!

    Per memorizzare l'altra diagonale dichiari v2[max] e fai ancora un ciclo:
    1) v2[0] = matrice[0][2]
    2) v2[1] = matrice[1][1]
    3) v2[2] = matrice[2][0]
    se noti v[1] e v2[1] hanno entrambi matrice[1][1].. è questo che intendo evitare

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.