[C++] Accesso a file
Inviato: 20/12/2018, 01:04
Un'università possiede la lista di tutti gli studenti memorizzata su un solo file. A ciascun studente sono attribuite diverse informazioni: numero d'identificazione, cognome, nome, data di nascita, indirizzo, sezione, ciclo di studio. Per ciascun studente le informazioni sono memorizzate linea per linea nel formato seguente sul file:
ID
<numero d'identificazione>
LASTNAME
<cognome>
FIRSTNAME
<nome>
ADDRESS
<indirizzo>
BIRTHDATE
<data di nascita>
SECTION
<sezione>
LEVEL
<ciclo di studio>
###
Dove "###" è un separatore (di fine) che c'è tra i differenti studenti. NB: le coppie di linee (etichetta,valore) possono essere in un ordine qualunque.
Ad esempio
ID
12345
LASTNAME
Doe
ADDRESS
Av. du Mail 12, 1205 Geneve
SECTION
Matematica
BIRTHDATE
1982 07 25
FIRSTNAME
John
LEVEL
PHD
###
1) Definire i tipi di dati che ti permettono di gestire tali informazioni.
2) Scrivere il prototipo e il corpo della funzione chiamata "load" che permette di caricare in memoria la lista degli studenti, a partire dal nome del file.
È fortemente consigliato di utilizzare un approccio modulare, in particolare per tutto quello che concerne gli accessi al file. Non è domandato di scrivere il codice di vostre, eventuali, sotto-funzioni ma semplicemente di spiegare in una linea di commento cosa fanno.
3) Scrivere il prototipo e il corpo della funzione "pourcentage" che ritorna la percentuale di studenti di studenti di una sezione e di un ciclo di studi passati in parametro alla funzione, rispetto alla popolazione totale di studenti (già caricata in memoria).
Vi domandiamo di scrivere il codice completo (niente modularizzazione)
Per il punto 1) io ho fatto così
Per il punto 2)
Avrei un paio di domande, non capisco bene cosa voglia dire salvare in memoria. E dunque se la funzione "load" debba ritornare qualcosa, credo comunque di no, e inoltre non so se la concezione del programma è corretta, cosa ne pensate?
3) Per il terzo, la mia difficoltà sta nel capire come faccio a prendere gli studenti. Nel senso come faccio a recuperare il numero totale di studenti ? Sarebbe la taglia della tabella di studenti che mi sono calcolato precedentemente, il problema che la mia funzione "pourcentage" riceve in parametro una sezione e un ciclo di studi, dunque due string. Ma non ha informazione sul vector precdente, ne tanto meno ha informazione su un nome di un file da cui può prenderli.
Insomma come recupero gli studenti che sono caricati in memoria?? Poi da lì non penso di avere problemi.
Grazie per l'aiuto.
ID
<numero d'identificazione>
LASTNAME
<cognome>
FIRSTNAME
<nome>
ADDRESS
<indirizzo>
BIRTHDATE
<data di nascita>
SECTION
<sezione>
LEVEL
<ciclo di studio>
###
Dove "###" è un separatore (di fine) che c'è tra i differenti studenti. NB: le coppie di linee (etichetta,valore) possono essere in un ordine qualunque.
Ad esempio
ID
12345
LASTNAME
Doe
ADDRESS
Av. du Mail 12, 1205 Geneve
SECTION
Matematica
BIRTHDATE
1982 07 25
FIRSTNAME
John
LEVEL
PHD
###
1) Definire i tipi di dati che ti permettono di gestire tali informazioni.
2) Scrivere il prototipo e il corpo della funzione chiamata "load" che permette di caricare in memoria la lista degli studenti, a partire dal nome del file.
È fortemente consigliato di utilizzare un approccio modulare, in particolare per tutto quello che concerne gli accessi al file. Non è domandato di scrivere il codice di vostre, eventuali, sotto-funzioni ma semplicemente di spiegare in una linea di commento cosa fanno.
3) Scrivere il prototipo e il corpo della funzione "pourcentage" che ritorna la percentuale di studenti di studenti di una sezione e di un ciclo di studi passati in parametro alla funzione, rispetto alla popolazione totale di studenti (già caricata in memoria).
Vi domandiamo di scrivere il codice completo (niente modularizzazione)
Per il punto 1) io ho fatto così
- Codice:
struct studente{
string id;
string cognome;
string nome;
string indirizzo;
string data;
string sezione;
string ciclo;
};
Per il punto 2)
Avrei un paio di domande, non capisco bene cosa voglia dire salvare in memoria. E dunque se la funzione "load" debba ritornare qualcosa, credo comunque di no, e inoltre non so se la concezione del programma è corretta, cosa ne pensate?
- Codice:
void load(string filename){
ifstream entrata(filename);
if(not entrata.fail()){
string s("###");
size_t k(lire(s,filename));
/* la funzione "lire" prende due string in parametro, e conta quante volte è presente nel file chiamato "filename" la stringa s, e ritorna quante volte è presente! */
vector<studente> v(k);
for(size_t i(0); i < v.size(); i++){
vector<string> w;
w= ligne("LASTNAME",filename);
/* la funzione "ligne", prende due string in parametro, e ritorna un vector di string composto dalla linea seguente alla quale ha letto "LASTNAME" nel file di nome filename */
v[i].cognome.push_back(w[i]);
w.clear();
w= ligne("FIRSTNAME",filename);
v[i].nome.push_back(w[i]);
w.clear();
w= ligne("ADDRESS",filename);
v[i].indirizzo.push_back(w[i]);
w.clear();
w= ligne("ID",filename);
v[i].id.push_back(w[i]);
w.clear();
w= ligne("BIRTHDATE",filename);
v[i].data.push_back(w[i]);
w.clear();
w= ligne("LASTNAME",filename)
v[i].cognome.push_back(w[i]);
w.clear();
w= ligne("SECTION",filename)
v[i].sezione.push_back(w[i]);
w.clear();
w= ligne("LEVEL",filename)
v[i].ciclo.push_back(w[i]);
w.clear();
}//chisura for
}
entrata.close();
}
3) Per il terzo, la mia difficoltà sta nel capire come faccio a prendere gli studenti. Nel senso come faccio a recuperare il numero totale di studenti ? Sarebbe la taglia della tabella di studenti che mi sono calcolato precedentemente, il problema che la mia funzione "pourcentage" riceve in parametro una sezione e un ciclo di studi, dunque due string. Ma non ha informazione sul vector precdente, ne tanto meno ha informazione su un nome di un file da cui può prenderli.
Insomma come recupero gli studenti che sono caricati in memoria?? Poi da lì non penso di avere problemi.
- Codice:
double pourcentage(string s, string cs){
vector<studenti> tot;
vector<studenti> ok;
/* in qualche modo qui recupero il vector<studenti> in memoria e la copio in "tot" */
int t(0);
int k(0);
for(size_t i(0); i < tot.size(); i++){
t+=1;
if( (tot[i].sezione == s ) and (tot[i].ciclo == cs) ){
k+=1;
}
}
double percentuale( (100*k)/t );
return percentuale;
}
Grazie per l'aiuto.