Visualizzazione dei risultati da 1 a 10 su 15

Hybrid View

  1. #1

    [C++] Problema con la lettura di una matrice da file

    Ciao a tutti, sono nuovo del forum! Vorrei chiedere aiuto a voi esperti circa un programma che non riesco a fare. Devo leggere una matrice da file di testo e poi trovarne il punto di sella. Sul punto di sella non ci sono problemi, so come si fa, il problema è leggere la matrice da file e soprattutto il riempimento delle righe e delle colonne... è una matrice quadrata 4x4. L'input da file di testo è questo:
    4
    2 17 19 22
    3 20 7 9
    25 23 32 40
    13 21 27 39

    Tuttavia non so come fargli leggere solamente il primo numero come riempimento delle righe e delle colonne. Vi posto quello che ho fatto fino ad ora, ma funziona solo se l'input è questo:

    2 17 19 22
    3 20 7 9
    25 23 32 40
    13 21 27 39


    Ecco il programma (così funziona, ma va completato e non so come! Grazie a chiunque mi darà una mano):


    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <stdlib.h>
    #define R 4
    #define C 4




    using namespace std;


    void leggomat() {


    int mat[R][C];


    // legge dati
    ifstream dati("mat.txt");
    int r = 0;
    while(!dati.eof())
    {
    dati >> mat[r][0] >> mat[r][1] >> mat[r][2] >> mat[r][3];
    r++;
    }
    dati.close();


    // visualizza dati
    int i;
    for(i=0; i<r; i++)
    cout << mat[i][0] << " " << mat[i][1] << " " << mat[i][2] << " "<< mat [i] [3] << endl;

    }


    int main () {

    leggomat();


    return 0; }
    Ultima modifica di DaemonDestroyer; 10-06-2014 a 12:31

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Prima del while scrivi

    dati >> riempimento;

    e poi usa la variabile riempimento per allocare dinamicamente l'array.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ciao oregon, grazie per la risposta. Quindi devo dichiarare un intero (riempimento), e una volta fatto questo qual'è il procedimento? Scusami, ma sono un neofita della programmazione... grazie per il Tuo tempo
    Ultima modifica di DaemonDestroyer; 10-06-2014 a 12:28

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Non di "tipo" riempimento (non esiste un tipo simile) ma un intero che chiami come vuoi (riempimento era solo un esempio di nome).

    E poi devi allocare dinamicamente l'array con la funzione malloc ... l'hai mai usata?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Si ha ragione, mi sono espresso male, ho modificato il messaggio.
    Ecco è questo il problema, l'allocazione dinamica con malloc... pur avendo visto diversi esempi sul libro e su internet non mi è proprio chiaro come essa funzioni, e da dove devo partire innanzitutto!

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da DaemonDestroyer Visualizza il messaggio
    Si ha ragione, mi sono espresso male, ho modificato il messaggio.
    Ecco è questo il problema, l'allocazione dinamica con malloc... pur avendo visto diversi esempi sul libro e su internet non mi è proprio chiaro come essa funzioni, e da dove devo partire innanzitutto!
    In C++ puoi anche usare new e delete (o new[] e delete[]).

    In ogni caso malloc ritorna un puntatore a un blocco di memoria che ha dimensione in bytes pari all'unico argomento della funzione:
    codice:
    void *p_blocco = malloc(n);
    p_blocco è un puntatore a un blocco di memoria di n bytes.
    Per essere utile tuttavia bisogna fare alcune considerazioni:

    sizeof ritorna le dimensioni in bytes dell'argomento:
    ad esempio sizeof(char) ritornerà sempre 1, sizeof(type *) ritorna le dimensioni in bytes di un puntatore (8 su 64bit, 4 su 32bit, 2 su 16bit)

    dunque sizeof(tipo) ti da il numero di byte di un elemento, moltiplichi questo per il numero degli elementi e ottieni il numero di byte del blocco.

    per utilizzare il blocco alla fine ti serve un cast al puntatore di tipo.

    Ad esempio per allocare un array di interi di n elementi servirà
    codice:
    int *array = (int *)malloc( sizeof(int) * n );
    Ti allego la soluzione dell'esercizio che è un esempio di allocazione dinamica:
    codice:
    #include <iostream>
    #include <fstream>
    
    //necessario se usi malloc e free, non necessario altrimenti
    #include <cstdlib>
    
    using namespace std;
    
    int **readMat(int**&m, size_t& size, ifstream& in) {
        in >> size;
        m = new int *[size];
        for(int i = 0; i < size; ++i)
            m[i] = new int[size];
        for(int i = 0; i < size; ++i)
            for(int j = 0; j < size; ++j)
                in >> m[i][j];
        return m;
    }
    
    int **readMat1(int **&m, size_t& size, ifstream &in) {
        in >> size;
        m = (int **)malloc(sizeof(int *) * size);
        for(int i = 0; i < size; ++i)
            m[i] = (int *)malloc(sizeof(int) * size);
        for(int i = 0; i < size; ++i)
            for(int j = 0; j < size; ++j)
                in >> m[i][j];
        return m;
    }
    
    void freeMat(int **&m, size_t size) {
        for(int i = 0; i < size; ++i)
            delete[] m[i];
        delete[] m;
    }
    
    void freeMat1(int **&m, size_t size) {
        for(int i = 0; i < size; ++i)
            free(m[i]);
        free(m);
    }
        
    int main(void) {
        ifstream in("input.txt");
        size_t size;
        int **m;
        readMat1(m, size, in);
        for(int i = 0; i < size; ++i) {
            for(int j = 0; j < size; ++j)
                cout << m[i][j] << '\t';
            cout << endl;
        }
        freeMat1(m, size);
        return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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 © 2026 vBulletin Solutions, Inc. All rights reserved.