Salve,
ho un problema da risolvere con i file di testo, argomento per me nuovo.
(Nota: La domanda principale non riguarda i file di testo quindi, se volete potete andare a leggere direttamente alla fine, tenendo presente che commenti e critiche riguardanti il codice scritto qui sotto sono ben accetti. )
Avendo il file di testo "mediaEsami.txt"
De Rossi Mario;13240 28 25 0 24
Caio Mario;15340 28 0 26 24
Bianchi Antonio;12540 26 20 30 25
Ferrara Ciro;13124 30 28 0 27
dove ogni riga è, in generale, del tipo
nome cognome;n.matricola voto1 voto2 voto3 voto4
devo scrivere un programma che mi stampi, dato un numero M, tutti i nomi e le matricole degli studenti che hanno avuto una media maggiore o uguale a M.
So che risolvere con gli array di record (struct) sarebbe più ordinato ma è un argomento non ancora affrontato all'interno del corso. All'infuori di ciò, ogni commento, critica, o spunto che riguarda il codice è ben accetto.
Il codice che ho scritto funziona ed è questo:
L'output è di questo tipo:codice:#include <iostream> #include <fstream> using namespace std; #define MAX_LEN 100 #define MAX_STR 65 // PROTOTIPI void mediaEsami( char nomeFile[] ); // MAIN int main() { char nomeFile[MAX_STR]; double M; // media cout << "Inserisci il nome del file di input: "; cin >> nomeFile; mediaEsami( nomeFile ); cout << endl; system("pause"); return 0; } void mediaEsami( char nomeFile[] ) { ifstream ifile; char nome[MAX_STR]; int matricola; int nEsami, voto; int somma = 0, nVoti = 0; double M; ifile.open( nomeFile ); if ( !ifile ){ cerr << "Errore. File non trovato."; return; } cout << "Inserisci il numero di esami che gli studenti hanno sostenuto: "; cin >> nEsami; cout << "Inserisci un valore M, considerando che verranno stampati a video " << "gli studenti con media >= M: "; cin >> M; while ( !ifile.eof() ) { ifile.getline( nome, MAX_STR, ';' ); ifile >> matricola; somma = 0; // azzero i contatori ad ogni ripetizione del ciclo esterno nVoti = 0; for ( int i = 0; i < nEsami; i++ ) { ifile >> voto; if ( voto != 0 ) { somma += voto; nVoti++; } } if ( ( static_cast<double>(somma) / static_cast<double>( nVoti ) >= M ) ) cout << nome << " " << matricola << endl; } ifile.close(); }
codice:Inserisci il nome del file di input: mediaEsami.txt Inserisci il numero di esami che gli studenti hanno sostenuto: 4 Inserisci un valore M, considerando che verranno stampati a video gli studenti c on media >= M: 26 Caio Mario 15340 Ferrara Ciro 13124 Premere un tasto per continuare . . .
Ciò che non capisco è:
Tenendo presente che digito "cout << endl;" solo una volta all'interno della procedura void mediaEsami e non faccio nessuna operazione di estrazione se non quella dal file in input,
Perchè vi sono gli spazi tra i nomi in output?
Grazie.

Rispondi quotando