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:
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();
}
L'output è di questo tipo:
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.