Inversione righe matrice su c

di il
22 risposte

Inversione righe matrice su c

Scrivere un programma che generata casualmente una matrice di numeri interi 4x4 dopo averla stampata inverta gli elementi nelle prime due righe (quindi la prima riga deve diventare la seconda e viceversa) e ristampi la matrice aggiornata. Potete aiutarmi ? Riesco solo a generare la matrice
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{int r = 8,c = 8;
int mat [r][c];
int nr, nc;
printf("\nInseriamo i dati nella matrice \n");
srand( time(NULL) );
for (nr=0;nr<r;nr++)
{
for (nc=0;nc<c;nc++)
{
mat[nr][nc] = 0+rand()%2;
}
}
printf("\nmatrice stampata\n");
for (nr=0;nr<r;nr++)
{
for (nc=0;nc<c;nc++)
{
printf("%3d", mat[nr][nc]);
}
printf ("\n");
}

22 Risposte

  • Re: Inversione righe matrice su c

    Usa i tag CODE per mostrare il codice.

    Per lo scambio non hai nessuna idea? Come scambieresti due variabili semplici?
  • Re: Inversione righe matrice su c

    Alloara di sicuro utilizzo una variabile temporanea inserita dentro un ciclo però il mio vero problema è che voreii vare qualcosa di generale non una cosa di questo tipo:
    mat[0][0]= temp;
    mat[0][0] = mat [1][0],
    mat [1][0] 0 tempo;
    ( sono nuova e non so cosa siano e come si utlizzano i CODE )
  • Re: Inversione righe matrice su c

    bat02 ha scritto:


    ( sono nuova e non so cosa siano e come si utlizzano i CODE )
    ciao sono dentro i tag code!
  • Re: Inversione righe matrice su c

    bat02 ha scritto:


    Alloara di sicuro utilizzo una variabile temporanea inserita dentro un ciclo però il mio vero problema è che voreii vare qualcosa di generale non una cosa di questo tipo:
    mat[0][0]= temp;
    mat[0][0] = mat [1][0],
    mat [1][0] 0 tempo;
    Prova a scambiare la prima con la seconda riga. Quello che ti serve è un ciclo che conti le colonne, con una variabile indice come hai fatto in

    for (nc=0;nc<c;nc++)

    Usa nc e tieni presente che le righe coinvolte sono 0 e 1
    ( sono nuova e non so cosa siano e come si utlizzano i CODE )
    Proprio per chi usa da poco il forum c'è il Regolamento da leggere e rispettare.
  • Re: Inversione righe matrice su c

    [if ( nc = 0; nc < c; c++)
    {
    mat [0][0]= tempo;
    mat [0][0]= mat [1][0];
    mat [1][0] = temp;
    }][/code]
    secomdo me una cosa così va bene però volevo avere qualcosa di più generale, che ad esempio inverisse tutte le righe e che poi io all'occorenza avrei potuto modificare
  • Re: Inversione righe matrice su c

    Aggiusta i tag CODE che non sono messi bene.

    Lo scambio non è fatto bene.

    Per generalizzare basta avere come parametri i numeri delle righe. Al posto di 0 e 1 utilizza riga e riga+1
  • Re: Inversione righe matrice su c

    Ho trovato quest asoluzione che però non funziona del tutto, mi potreste aiutare a perfeziornarlo ?

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int main()
    {int r = 4,c = 4;
    int mat [r][c];
    int nr, nc;
    printf("\nInseriamo i dati nella matrice \n");
    srand( time(NULL) );
    for (nr=0;nr<r;nr++)
    {
    for (nc=0;nc<c;nc++)
    {
    mat[nr][nc] = 0+rand()%2;
    }
    }
    printf("\nmatrice stampata\n");
    for (nr=0;nr<r;nr++)
    {
    for (nc=0;nc<c;nc++)
    {
    printf("%3d", mat[nr][nc]);
    }
    printf ("\n");
    }
    int temp;
    printf ("\n");
    for (nc=0;nc<c;nc++)
    {
    for (nr=0;nr<r-1;nr++)
    {
    mat[nr][nc] = temp;
    mat[nr][nc] = mat[nr+1][nc];
    mat[nr+1][nc] = temp;
    }
    }
    printf("\nmatrice stampata inversa\n");
    for (nr=0;nr<r;nr++)
    {
    for (nc=0;nc<c;nc++)
    {
    printf("%3d", mat[nr][nc]);
    }
    printf ("\n");
    }
    }
  • Re: Inversione righe matrice su c

    Già ti sei arresa con i tag CODE?! Eppure prima c'eri quasi!

    In ogni caso per curiosità... cosa intendi con "ho trovato"?!
    mat[nr][nc] = 0+rand()%2;
    Ma zero non era l'elemento neutro dell'addizione?
    for (nc=0;nc<c;nc++)
    {
    for (nr=0;nr<r-1;nr++)
    {
    mat[nr][nc] = temp;
    mat[nr][nc] = mat[nr+1][nc];
    mat[nr+1][nc] = temp;
    }
    }
    Ma non dovevi semplicemente scambiare le prime due righe?
    Mi sa che stai procedendo a tentativi senza sapere veramente quello che stai facendo!
  • Re: Inversione righe matrice su c

    1) per ho trovato intendo mi sono messa li ha provare molte possibilità
    2) zero nell'adiozione è l'elemento neutro ed è vero ma non capisco cosa centri io sommo sempre uno
    3) a me viene chiesto di scambiare le prime due righe ma per cuorisità vorrei trivare una soluzione più generale, cioè che inverta tutte le righe e che possa essere modificata in modo da poter invertire in qeusto caso la prima e la seconda riga ma all'occorenza anze le altre
  • Re: Inversione righe matrice su c

    bat02 ha scritto:


    2) zero nell'adiozione è l'elemento neutro ed è vero ma non capisco cosa centri io sommo sempre uno
    Scusa c'è scritto 0+rand()%2, ora a prescindere da quanto valga rand()%2, in che modo 0+ potrebbe mai modificare il risultato finale?!
    Inoltre cosa intendi con "sommo sempre uno"? Sai quanto vale rand()%2?

    bat02 ha scritto:


    3) a me viene chiesto di scambiare le prime due righe ma per cuorisità vorrei trivare una soluzione più generale, cioè che inverta tutte le righe e che possa essere modificata in modo da poter invertire in qeusto caso la prima e la seconda riga ma all'occorenza anze le altre
    Scusa ma cosa intendi con "che inverta tutte le righe"? Per esempio nel caso di una matrice 4x4 in cosa si traduce?
    Non so se conosci le funzioni, ma il massimo grado di generalizzazione in questo contesto (ossia quello di scambiare due righe), può essere ottenuto implementando una funzione
    void scambia_righe(int m[R][C], int i_1, int i_2);
    che scambia le righe di indice i_1 e i_2 di una matrice m di R righe e C colonne.
  • Re: Inversione righe matrice su c

    Rand()%2 è la generazione di numeri pseudo casuali ( volevo numeri compresi tra 0 e 1 )
    Con che inverta tutte le righe intendo una cosa di questo genere :
    0 0 0 0
    1 0 1 0
    0 0 1 1
    1 1 1 1
    che diventa:
    1 0 1 0
    0 0 1 1
    1 1 1 1
    0 0 0 0
  • Re: Inversione righe matrice su c

    bat02 ha scritto:


    Rand()%2 è la generazione di numeri pseudo casuali ( volevo numeri compresi tra 0 e 1 )
    Ok, ma ancora non mi hai spiegato l'utilità di quel 0+.

    bat02 ha scritto:


    Con che inverta tutte le righe intendo una cosa di questo genere :
    0 0 0 0
    1 0 1 0
    0 0 1 1
    1 1 1 1
    che diventa:
    1 0 1 0
    0 0 1 1
    1 1 1 1
    0 0 0 0
    Ok, ho capito, anche se con invertire di solito si intende altro.
    Il problema cmq è nello scambio
    mat[nr][nc] = temp;
    mat[nr][nc] = mat[nr+1][nc];
    mat[nr+1][nc] = temp;
    guarda bene, sono 3 righe di codice, non è difficile trovare l'errore.

    In ogni caso, anche se all'atto pratico non cambia nulla, ti consiglio di scambiare i due for innestati contenenti lo scambio. Dal momento che lo scopo è quello di scambiare righe, il tutto risulterebbe più chiaro ed in questo modo ad ogni iterazione del ciclo più esterno avrai effettivamente scambiato due righe.
  • Re: Inversione righe matrice su c

    Il punto è che ho trovato l'errore ma non so come risolverlo perchè nell'ultima iterazione il programma cerca di scambiare la 5 riga ( inesistente visto che io ho dichiarato una matrice 4x4 ) con la 4 riga
    succede che :
    0 0 0 0
    1 0 1 0
    0 0 1 1
    1 1 1 1
    che diventa:
    1 0 1 0
    0 0 1 1
    1 1 1 1
    163754450 04195299 0 ( diventa una cosa di questo genere che non ha senso )
    Si ho fatto come dicevi tu e ho scambiato i due cicli e in effeti risulta più chiaro.
  • Re: Inversione righe matrice su c

    Scusa ma se il ciclo for è
    for (nr=0;nr<r-1;nr++)
    significa che nr assume al massimo il valore 2, e quindi con mat[nr+1][nc] accederai al massimo alla riga di indice 3, ossia la quarta riga!

    Sicuro di aver aggiustato la parte relativa allo scambio? A scanso di equivoci posta il codice aggiornato.
Devi accedere o registrarti per scrivere nel forum
22 risposte