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

    [C++] Estrazione da file TXT per confronto, riordino ed eliminazione

    Salve a tutti il mio programma è molto semplice devo prendere da file una lista di professori con dei numeri caricarla nel programma riordinarla e eliminare quelli che si ripetono.

    Questo è il mio file txt

    chianese
    3321
    moscato
    3345
    picariello
    2134
    moscato
    3345

    Questa è la mia libreria:

    codice:
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <cstring>
    
    
    using namespace std;
    
    
    #define STR_MAX 100
    #define VET_MAX 100
    
    
    typedef char Stringa [STR_MAX];
    
    
    typedef struct Lista{
        
        Stringa Cognome;
        int Numero;
        Lista *next;
        
    }Professore;
    
    
    typedef Lista* Pnodo;
    typedef Professore Docenti [VET_MAX];
    
    
    void carica_file(Stringa, fstream &f, Docenti , int *);
    void stampa_file(const Docenti,const int);
    void controllo_ordine(Docenti, int);
    void confronto(Stringa , Stringa , int *);
    void scambio(Docenti, int);
    void elimina_uguali(Docenti, int);
    void cancella_nodo(Stringa ,int , Pnodo &);


    Questa è sono le mie funzioni


    codice:
    #include "alfabetico.h"
    
    
    void carica_file(Stringa nome, fstream &f, Docenti professore, int *d){
        
        int i=0;
        
        cout<<"\n Inserisci nome del file che vuoi caricare :";
        cin.getline(nome,STR_MAX-1, '\n');
        f.open(nome, ios::in);
        if(!f){
            
            cout<<"\n Errore durante l'inserimento del nome del file...";
            exit(1);
            
        }else{
            
            while(!f.eof()){
                
                f>>professore[i].Cognome;
                f>>professore[i].Numero;
                i++;
            }
            i--;
        }
    
    
        *d=i;    
        f.close();
    }
    
    
    void stampa_file(const Docenti insegnanti,const int dimensione){
        
        cout<<"\n Stampo il file :\n";
        for(int i=0; i<dimensione; i++){
            
            cout<<insegnanti[i].Cognome<<endl;
            cout<<insegnanti[i].Numero<<endl;
            
        }
        
    }
    
    
    void controllo_ordine( Docenti professori, int size){
        
        Professore scambio;
        int risult, cont;
    
    
        
        for(int i=0; i<size; i++){
            
            for(int j=i+1; j<size; j++){
    
    
                risult=strcmp(professori[i].Cognome, professori[j].Cognome);
                
                    if(risult>0){
                    
                    scambio=professori[i];
                    professori[i]=professori[j];
                    professori[j]=scambio;
                    
                        }else{
            
                    cont++;
                    risult=cont;
            
                }
            }
                
        }
        
        if(risult==size){
            
            cout<<"\n L'elenco è già ordinato alfabeticamente \n";
            
        }
        
        stampa_file(professori, size);
        cout<<"\n Controllo se ci sono elementi uguali: \n";
        elimina_uguali(professori, size);
        stampa_file(professori, size);
        
    }
    
    
    void elimina_uguali(Docenti prof, int s){
        
    Pnodo L1;
    int ris;
        
    for(int i=0; i<s; i++){
            
        for(int j=i+1; i<s; j++){
        
            ris=strcmp(prof[i].Cognome, prof[j].Cognome);
            
                if(ris==0){
                
                    cancella_nodo(prof[j].Cognome,j, L1);
                                
                }
                        
            }
                    
        }    
                
    }
            
    void cancella_nodo(Stringa insegnante,int j, Pnodo &n1){
    
    
    
    
    Pnodo Temp;
            
        if(n1!=NULL){
    
    
            if(n1->Cognome==insegnante){
                                    
                Temp=n1;
                n1=n1->next;
                delete Temp;
                }else {
                
                    cancella_nodo(insegnante, j, n1);
                
                }
            }
    }
    Questo è il mio main:

    codice:
    #include "alfabetico.h"
    
    
    int main(){
        
        Stringa nome_file;
        fstream file;
        Docenti dati;    
        int dim;
        
        
        carica_file(nome_file, file, dati, &dim);
        stampa_file(dati, dim);
        controllo_ordine(dati, dim);
    
    
    }
    Mi compila tutto non mi da errori però mi succede questo:
    Immagine.png
    2.png

    Quando invece carico un altro txt qualunque esso sia non me lo carica per esempio ho caricato questo txt chiamato professore.txt(quello vecchio si chiamava professori.txt lo so lo so ho molta fantasia) e non va:

    rossi
    3321
    di lorenzo
    3345
    ferrante
    2134
    di lorenzo
    3345

    Mi stampa questo perchè?

    2.png

    Il trattino lampeggia all'infinito e rimane così perchè? Cosa c'è di sbagliato nel mio codice?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Perché di lorenzo sono due parole e sballa l'input.

    Se scrivi di_lorenzo dovrebbe andare bene
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Perché di lorenzo sono due parole e sballa l'input.

    Se scrivi di_lorenzo dovrebbe andare bene
    E invece il mistero di perchè si blocchi a "controllo gli elementi del file" e non prosegua? ho chiamato dentro a controllo_ordine ho chiamato le funzioni elimina_uguali e stampa_file ma è come se le ignorasse come mai?

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quote Originariamente inviata da TheBlackWolf Visualizza il messaggio
    E invece il mistero di perchè si blocchi a "controllo gli elementi del file" e non prosegua? ho chiamato dentro a controllo_ordine ho chiamato le funzioni elimina_uguali e stampa_file ma è come se le ignorasse come mai?
    Ma hai corretto il cognome come ti ho detto?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    si si l'ho fatto ma niente non mi parte la funzione

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Nella funzione controllo_ordine devi inizializzare cont

    int risult, cont=0;

    e nella funzione elimina_uguali devi correggere la for in questo modo

    for (int j = i + 1; j<s; j++) {
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Nella funzione controllo_ordine devi inizializzare cont

    int risult, cont=0;

    e nella funzione elimina_uguali devi correggere la for in questo modo

    for (int j = i + 1; j<s; j++) {
    Ancora nessun risultato non mi stampa niente rimane sempre con Controllo se ci sono elementi uguali: e non mi stampa niente

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quote Originariamente inviata da TheBlackWolf Visualizza il messaggio
    Ancora nessun risultato non mi stampa niente rimane sempre con Controllo se ci sono elementi uguali: e non mi stampa niente
    Adesso qual è il contenuto del file di testo e il codice che utilizzi? Mostra nuovamente tutto per essere sicuri di cosa stai utilizzando.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Adesso qual è il contenuto del file di testo e il codice che utilizzi? Mostra nuovamente tutto per essere sicuri di cosa stai utilizzando.

    Questo è il file di testo professore.txt

    rossi
    3321
    lorenzo
    3345
    ferrante
    2134
    lorenzo
    3345

    Libreria

    codice:
    #include <iostream>#include <fstream>
    #include <cstdlib>
    #include <cstring>
    
    
    using namespace std;
    
    
    #define STR_MAX 100
    #define VET_MAX 100
    
    
    typedef char Stringa [STR_MAX];
    
    
    typedef struct Lista{
        
        Stringa Cognome;
        int Numero;
        Lista *next;
        
    }Professore;
    
    
    typedef Lista* Pnodo;
    typedef Professore Docenti [VET_MAX];
    
    
    void carica_file(Stringa, fstream &f, Docenti , int *);
    void stampa_file(const Docenti,const int);
    void controllo_ordine(Docenti, int);
    void confronto(Stringa , Stringa , int *);
    void scambio(Docenti, int);
    void elimina_uguali(Docenti, int);
    
    void cancella_nodo(Stringa ,int , Pnodo &);


    Funzioni:

    codice:
    #include "alfabetico.h"
    
    void carica_file(Stringa nome, fstream &f, Docenti professore, int *d){
        
        int i=0;
        
        cout<<"\n Inserisci nome del file che vuoi caricare :";
        cin.getline(nome,STR_MAX-1, '\n');
        f.open(nome, ios::in);
        if(!f){
            
            cout<<"\n Errore durante l'inserimento del nome del file...";
            exit(1);
            
        }else{
            
            while(!f.eof()){
                
                f>>professore[i].Cognome;
                f>>professore[i].Numero;
                i++;
            }
            i--;
        }
    
    
        *d=i;    
        f.close();
    }
    
    
    void stampa_file(const Docenti insegnanti,const int dimensione){
        
        cout<<"\n Stampo il file :\n";
        for(int i=0; i<dimensione; i++){
            
            cout<<insegnanti[i].Cognome<<endl;
            cout<<insegnanti[i].Numero<<endl;
            
        }
        
    }
    
    
    void controllo_ordine( Docenti professori, int size){
        
        Professore scambio;
        int risult, cont=0;
    
    
        
        for(int i=0; i<size; i++){
            
            for(int j=i+1; j<size; j++){
    
    
                risult=strcmp(professori[i].Cognome, professori[j].Cognome);
                
                    if(risult>0){
                    
                    scambio=professori[i];
                    professori[i]=professori[j];
                    professori[j]=scambio;
                    
                        }else{
            
                    cont++;
                    risult=cont;
            
                }
            }
                
        }
        
        if(risult==size){
            
            cout<<"\n L'elenco è già ordinato alfabeticamente \n";
            
        }
            cout<<"\n L'elenco è ora ordinato alfabeticamente \n";
        stampa_file(professori, size);
        cout<<"\n Controllo se ci sono elementi uguali nel caso li elimino \n";
        elimina_uguali(professori, size);
        stampa_file(professori, size);
        
    }
    
    
    void elimina_uguali(Docenti prof, int s){
        
    Pnodo L1;
    int ris;
        
    for(int i=0; i<s; i++){
            
    for (int j = i + 1; j<s; j++) {
        
            ris=strcmp(prof[i].Cognome, prof[j].Cognome);
            
                if(ris==0){
                
                    cancella_nodo(prof[j].Cognome,j, L1);
                                
                }
                        
            }
                    
        }    
                
    }
            
    void cancella_nodo(Stringa insegnante,int j, Pnodo &n1){
    
    
    
    
    Pnodo Temp;
            
        if(n1!=NULL){
    
    
            if(n1->Cognome==insegnante){
                                    
                Temp=n1;
                n1=n1->next;
                delete Temp;
                }else {
                
                    cancella_nodo(insegnante, j, n1);
                
                }
            }
    }


    Main

    codice:
    #include "alfabetico.h"
    
    int main(){
        
        Stringa nome_file;
        fstream file;
        Docenti dati;    
        int dim;
        
        
        carica_file(nome_file, file, dati, &dim);
        stampa_file(dati, dim);
        controllo_ordine(dati, dim);
    
    
    }
    1.png
    2.png
    3.png

    Mi stampa il file già eliminando il cognome e il numero uguale perchè?Lorenzo dovrebbe essere stampato due volte prima quando stampo in generale la struct dopo averla caricata e poi dopo quando l'ho ordinata solo in elimina uguali non ci dovrebbe essere.
    #strangethings #sottosopra
    Ultima modifica di TheBlackWolf; 09-07-2018 a 14:48

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Per leggere correttamente il file di testo, è necessario che all'ultima riga (dove c'è il 3345) si vada a capo. Quindi, se usi il notepad, l'ultima riga la devi scrivere

    3345

    e tasto Invio.

    Fatto questo, il codice leggerà correttamente l'ultimo nominativo ma ci sarà un errore nella funzione

    cancella_nodo

    quando verrà eseguita con il parametro L1 che non ha nessun valore ... Come intendevi utilizzare L1 all'inizio chiamando la cancella_nodo?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.