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

    [C++] operare da due file in lettura

    Salve
    ho creato due file .txt, ho inserito dati nel primo e anche nel secondo.
    Vorrei che per un dato studente il programma stampasse l'elenco insegnanti per quel cognome.
    Studenti e insegnanti hanno in comune solo l'istanza "classe".

    Non capisco perchè il codice che ho creato mi restituisce zero insegnanti.
    Attendo vostre delucidazioni!



    codice:
    void Insegnante::findInsegnanti(){
         
         string nomeS,nomeI;
         string cognomeS,cognomeI;
         string luogoNascitaS,luogoNascitaI;
         string dataNascitaS,dataNascitai;
         string classeS,classeI;
         
         string materia;
         
         string std;
         
         int i=0;
         
         ifstream insegnanti;
         insegnanti.open("insegnanti.txt");
         
         ifstream studenti;
         studenti.open("registro.txt");
         
          cout << "Inserire il cognome dello studente:" <<endl;
          cin  >> std;
          
           while (studenti >> nomeS >> cognomeS >> luogoNascitaS >> dataNascitaS >> classeS)
                while (insegnanti >> nomeI >> cognomeI >> luogoNascitaI >> dataNascitaI >> classeI >> materia)
               {
                     if((std==cognomeS)and(classeS==classeI)){                          
                                    cout << "\tNome: " << nomeI << "\tCognome: " << cognomeI << "\tMateria: " << materia <<endl;
                                    i++; 
                                   }
               }                                
                                    cout << "\n\n" << i << "insegnanti trovati per questo studente\n\n" << endl; 
                              
          system("pause");
          cin.get();
          main();
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Cosa è std? Dove lo usi nella ricerca?

    Cosa significa quel main alla fine?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    std è il nome di una stringa che dichiaro nella funzione al fine di uguagliarla a cognomeS nell'if.
    main(); alla fine mi serve per tornare al menù una volta terminata questa funzione.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da protest00
    std è il nome di una stringa che dichiaro nella funzione al fine di uguagliarla a cognomeS nell'if.
    main(); alla fine mi serve per tornare al menù una volta terminata questa funzione.
    Non utilizzare una stringa che si chiama std perché è il nome del namespace std ed è meglio non utilizzarlo.

    Per la ricerca, non ho ancora capito la relazione tra i dati inseriti nei due file. Mostra un esempio semplice di contenuto dei due file. In ogni caso, se leggi una volta il file nel ciclo più interno, al prossimo giro non puoi leggerlo di nuovo dall'inizio se non resetti il puntatore della lettura (oppure chiudi e riapri il file).

    Infine è *sbagliatissimo* chiamare il main per tornare ad eseguirlo perché non stai eseguendo un goto ma una chiamata a funzione con impegno dello stack. E' un errore molto grave.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Secondo il mio ragionamente attraverso if((std==cognomeS)and(classeS==classeI)) dovrei poter selezionare solo lo studente con quel cognome e solo gli insegnanti della sua classe.

  6. #6
    -Il file "insegnanti.txt" contiene:

    Giulia Bianchi Bari 05/12/1945 3c Storia

    -Il file "registro.txt" contiene:

    Mario Rossi Bari 01/08/2000 3c

    Per quanto riguarda invece l'errore del main(); come posso tornare al menù principale senza inserire la funzione main(); ?

    Nel main() è contenuto uno switch.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E poi

    and

    non esiste in C/C++ ... non è BASIC

    Come hai compilato e provato questo codice ? Non l'hai mai potuto fare ...

    Per il main, il codice sta all'interno del metodo di una classe. Il metodo deve terminare quando lo chiami nel main e lì ci metti un ciclo che fa tornare all'inizio del main o al menu ... insomma dipende da cosa c'è nel main e dove chiami il metodo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Probabilmente perché il cognome dello studente non è il primo in "registro.txt" e quindi il ciclo interno, quello degli insegnanti, posiziona il cursore alla fine del file e non fa verificare mai la condizione dell' if. Di primo acchito mi sembrerebbe questo, ma non ne assicuro la certezza.

    Per risolvere potresti fare il ciclo più interno se e solo se il cognome inserito corrisponde a quello scansionato da "registro.txt".

    Scusa la mia povertà espressiva.

    P.s. come dice Oregon occhio a non richiamare il main! (basta far "ritornare" la funzione per tornare al main).

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Infatti ... la questione è in rosso

    codice:
        cin  >> cognome;
          
        while (studenti >> nomeS >> cognomeS >> luogoNascitaS >> dataNascitaS >> classeS)
    	{
    		insegnanti.seekg(0, insegnanti.beg);
            while (insegnanti >> nomeI >> cognomeI >> luogoNascitaI >> dataNascitaI >> classeI >> materia)
            {
                    if((cognome==cognomeS) && (classeS==classeI)){                          
                                cout << "\tNome: " << nomeI << "\tCognome: " << cognomeI << "\tMateria: " << materia <<endl;
                                i++; 
                                }
            }
    In ogni caso, dato che cerchi un solo cognome che sta nel file registro, non dovresti scrivere due while una dentro l'altra ma una prima while per trovare i dati del nominativo cercato nel registro e poi un solo while dopo per cercare i dati nel file insegnanti, ovveo

    codice:
        cout << "Inserire il cognome dello studente:" <<endl;
        cin  >> cognome;
          
        ifstream studenti;
        studenti.open("c:\\registro.txt");
         
        while (studenti >> nomeS >> cognomeS >> luogoNascitaS >> dataNascitaS >> classeS)
    		if(cognome==cognomeS)
    			break;
    
    	ifstream insegnanti;
        insegnanti.open("c:\\insegnanti.txt");
        
    	while (insegnanti >> nomeI >> cognomeI >> luogoNascitaI >> dataNascitaI >> classeI >> materia)
    		if(classeS==classeI)
    		{                          
    			cout << "\tNome: " << nomeI << "\tCognome: " << cognomeI << "\tMateria: " << materia <<endl;
                i++; 
            }                                
    
    	cout << "\n\n" << i << "insegnanti trovati per questo studente\n\n" << endl;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Perfetto adesso funziona,grazie.
    Ero convinto che con l'and andasse perchè compilando non mi dava errore ma effettivamente non lo avevo mai letto in nessun libro per questo linguaggio.

    Utilizzando l'istruzione return come posso tornare al main una volta eseguita la funzione ?

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