Scrivere un programma in C++ che permetta di scrivere una sequenza di matrici in un file di testo. All’avvio il programma deve chiedere all’utente di aggiungere nel file una nuova matrice, dando la possibilità di annullare l’inserimento mediante uno zero. Successivamente deve visualizzare tutte le matrici memorizzate nel file. Le matrici memorizzate nel file possono avere una dimensione a piacere e le dimensioni possono essere fra loro diverse.
La figura di sotto mostra un esempio di output che il programma dovrà produrre a video in corrispondenza dell’inserimento di una matrice di dimensioni 2×4, quando una matrice 2×3 è già presente nel file, in quanto già caricata nel corso di un’esecuzione precedente.
(Soluzione proposta)
La figura seguente mostra il file di testo dell’archivio prodotto in corrispondenza dell’esecuzione dell’esempio di sopra. Essa mostra il file aperto con un editor di testi ed evidenzia in giallo gli elementi di ogni riga che rappresentano le dimensioni delle matrici in esso memorizzate.
La soluzione proposta, infatti, si basa su un’organizzazione dei dati che prevede che nel file:
- ciascuna riga del file rappresenta una matrice;
- (poiché le matrici possono avere dimensioni diverse) la dimensione di ciascuna matrice viene memorizzata nel file all’inizio di ogni riga, nei primi due elementi: il primo rappresenta il numero di righe, il secondo invece il numero di colonne.
- gli elementi successivi di una riga rappresentano in sequenza le righe della matrice, dalla prima fino all’ultima.
Il problema può essere scomposto nei seguenti sotto-problemi:
e il programma può essere cosi organizzato:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <fstream> #include <string> using namespace std; const string NOME_FILE = "matrici.txt"; void inserisciMatrice(string); void visualizzaMartici(string); int nMatrici(string); int main(){ inserisciMatrice(NOME_FILE); visualizzaMartici(NOME_FILE); return 0; } |
L’aggiunta di una nuova matrice nel file di testo avviene tramite la chiamata alla funzione inserisciMatrice():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//aggiunge una matrice nel file con pathname mioFile void inserisciMatrice(string mioFile){ int righe, colonne, elemento; ofstream matrici(mioFile.c_str(), ios::app); //apre il file in SCRITTURA (in AGGIUNTA) cout<<"CARICA MATRICE"<<endl; //si procura la dimensione della matrice da caricare n.righe e n. colonne cout<<"Quante sono le RIGHE? (0 per annullare il caricamento): "; cin>>righe; if(righe==0) { matrici.close(); //chiude il file return; //annulla il caricamento della nuova matrice uscendo dalla funzione } cout<<"Quante sono le COLONNE?: "; cin>>colonne; matrici<<righe<<' '<<colonne; //scrive nel file il n. di righe e di colonne //si procura gli elementi della nuova matrice da caricare e li scrive nel file cout<<endl<<"CARICA MATRICE "<<righe<<" x "<<colonne<<endl; for(int i=0; i<righe; i++){ //lavora per righe cout<<"Inserisci i "<<colonne<<" valori della riga n."<<i+1<<": "; for(int j=0; j<colonne; j++){ cin>>elemento; matrici<<' '<<elemento; //scrive nel file l'elemento caricato } } matrici<<endl; //prepara il file per il caricamento della prossima matrice su un nuova riga matrici.close(); } |
La visualizzazione delle matrici memorizzate nel file di testo, avviene tramite la chiamata alla funzione visualizzaMartici():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//visualizza a video tutte le matrici presenti nel file con pathname mioFile void visualizzaMartici(string mioFile){ string s; int righe, colonne, v; int n=nMatrici(mioFile); //calcola il n. di matrici presenti nel file cout<<endl<<"MATRICI MEMORIZZATE NEL FILE"<<endl; if(n==0){ cout<<"Il file non contiene matrici."<<endl; } else { cout<<"Nel file sono presenti "<<n<<" matrici"<<endl; ifstream matrici(mioFile.c_str()); //apre il file in LETTURA int c=1; //contatore per le righe lette //legge sequenzialmente le righe del file matrici>>righe; //legge nel file il n. di righe della prima matrice matrici>>colonne; //legge nel file il n. di colonne della prima matrice while(!matrici.eof()){ cout<<endl<<"Matrice n."<<c++<<" ("<<righe<<"x"<<colonne<<")"<<endl; //legge l'intera matrice e la visualizza a video for(int i=0; i<righe; i++){ //lavora per righe for(int j=0; j<colonne; j++){ matrici>>v; //legge un elemento dal file cout<<v<<' '; //visualizza l'elemeno a video } cout<<endl; } matrici>>righe; //legge nel file il n. di righe della successiva matrice matrici>>colonne; //legge nel il n. di colonne della successiva matrice } matrici.close(); //chiude il file } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//determina e restituisce il numero di matrici memorizzate nel file con pathname miofile int nMatrici(string mioFile){ string s; ifstream matrici(mioFile.c_str()); //apre il file delle matrici int c=0; //contatore per le matrici presenti nel file getline(matrici, s); //legge nel file la prima riga while(!matrici.eof()){ c++; //conta la matrice letta getline(matrici, s); //legge nel file la riga successiva } matrici.close(); return c; //chiude il file } |