Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    16

    [c++]invertire elementi delle righe della matrice

    salve ragazzi il problema è semplice
    In pratica, data una matrice da file di testo, sto cercando di invertire gli elementi delle righe e poi salvarlo in un testo in append...
    Mi spiego meglio :
    Input
    2 5 3 14
    17 6 7 10
    9 12 1 0
    15 8 16 11
    Output:
    14 3 5 2
    10 7 6 17
    0 1 12 9
    11 16 8 15 questo in un file "output.txt"

    ragazzi io tutto questo l'ho già fatto ma l'output è una schefezza del genere:
    codice:
    OUTPUT:
    2 5 3 2424868 
    17 6 7 10 
    9 12 1 0 
    15 8 16 11
    Vi elenco il codice che ho scritto in relazione a questa operazione
    codice:
    void reverse_mat(matrice mat, int riemp){
         int i,j;
         int temp;
         FILE*fp=fopen("output.txt", "a");
         if(fp==0){
                   cout<<"\nErrore nel creare/aprire il file!!\n";
                   system("PAUSE");
                   exit(1);
                   }
         for(i=0;i<riemp;i++){
             
             temp=mat[0][j];
             mat[0][j]=mat[0][riemp-1];
             mat[0][riemp-1]=temp;
             for(j=0;j<riemp;j++)
                 fprintf(fp, "%d ", mat[i][j]);
                 fprintf(fp,"\n");
                
                
         }
         fclose(fp);
    }
    I parametri e tutto il resto appresso è fatto bene, è solo il calcolo che non mi trovo...forse ho fatto confusione sull'utilizzo degli indici e della variabile d'appoggio!

    Grazie mille!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    Non riesco proprio a capire con che logica cerchi di capovolgere la matrice.
    C'è un modo molto semplice:
    Fare due cicli for innestati per scorrere riga e colonne (il ciclo delle colonne naturalmente può arrivare, presa una matrice NxM, a M/2). All'interno del secondo ciclo basta fare uno scambio tra l'elemento i-simo della riga e il suo opposto.

    Tradotto in codice potrebbe essere una cosa del genere:
    codice:
        for(i=0;i<4;i++)
        {
            for(j=0;j<(4/2);j++)
            {
                temp = mat[i][j];
                mat[i][j] = mat[i][3-j];
                mat[i][3-j] = temp;
            }
        }
    Naturalmente adattato al tuo caso può diventare un algoritmo generico funzionante

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    16
    si, innanzi tutto grazie per avermi aiutato, infatti rileggendo il codice primascritto non lo capisco neanche io.
    Però dopo un pò di tempo mi sono avvicinato a quello che hai scritto tu.
    Però il fatto che non riesco a capire è che nel momento in cui la matrice è generica, quel 3 cosa diventa?
    io ho scritto questo
    codice:
    void reverse_mat(matrice mat, int riemp){
         int i,j;
         int temp;
         int col=riemp-1;
         FILE*fp=fopen("output.txt", "a");
         if(fp==0){
                   cout<<"\nErrore nel creare/aprire il file!!\n";
                   system("PAUSE");
                   exit(1);
                   }
         for(i=0;i<riemp;i++)   
            for(j=0;j<(riemp/2);j++){
                temp = mat[i][j];
                mat[i][j] = mat[i][col-j];
                mat[i][col-j] = temp;
                fprintf(fp, "%d ", mat[i][j]);
                fprintf(fp,"\n");
            }
        
        fclose(fp);
    }
    ma mi esce questo
    codice:
    14 
    3 
    10 
    7 
    0 
    1 
    11 
    16
    Vi giuro sto fuso! e pure ne ho fatti di esercizi

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    Per prima cosa metti bene le parentesi del primo ciclo for.
    Scusami ma quel riemp cosa rappresenta? Il numero di riga o di colonna? Oppure entrambe poichè l'esercizio prevede solo matrici quadrate?
    Inoltre il secondo fprintf va fuori dal ciclo for interno altrimenti ad ogni numero ti va a capo come ora...Se noti bene il tuo esercizio inizia già a funzionare infatti i primi due te li inverte...
    Metti bene parentesi e questi accorgimenti che ti ho detto e controllalo col mio codice e vedi che va.
    Comunque quel 3 nel tuo caso deve diventare il numero di colonne - 1....se riesci a tradurlo bene ti deve funzionare per forza, io l'ho provato ora ti mostro tutto il codice anche se l'ho scritto in C e in modo statico con una matrice 4x4:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    #define N 4
    #define M 4
    
    
    int main()
    {
        int mat[N][M] = {{2,5,3,14}, {17, 6, 7, 10}, {9,12,1,0}, {15,8,16,11}};
        int i, j;
        int temp;
    
    
        for(i=0;i<N;i++)
        {
            for(j=0;j<(M/2);j++)
            {
                temp = mat[i][j];
                mat[i][j] = mat[i][M-1-j];
                mat[i][M-1-j] = temp;
            }
        }
    
    
        for(i=0;i<N;i++)
        {
            for(j=0;j<M;j++)
            {
                printf("%d ", mat[i][j]);
            }
            printf("\n");
        }
    
    
        return 0;
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2015
    Messaggi
    16
    L'ho riscritto aggiustando i dettagli sotto la tua guida!
    Giuro te ne sono molto grato!

Tag per questa discussione

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.