Ragazzi buonasera, devo capire il funzionamento di questo programma. Il problema è che lo vedo decisamente aggrovigliato, se riusciste a spiegarmi qualche pezzo ve ne sarei veramente grato.
Le uniche cose che sono riuscito a capire è che il programma crea un elenco di studenti con nome,peso e altezza, e poi nella seconda fase si può rivisitare questo elenco. Se riuscite ditemi anche se vi funziona, soprattutto l' input dell' altezza dello studente.
// librerie
//*#include <stdlib.h>
#include <cstring> // libreria per gestione delle stringhe
#include <cstdlib> // libreria per gestione utility varie
#include <iostream>
#include <fstream>
using namespace std;
bool LeggiNumeri();
bool ControlloNum(string stnum);
// Utilizzo Direttiva "pragma pack" per COMPATTARE lo spazio occupato dai CAMPI del
// TRACCIATO RECORD: VERIFICA CON XVI32 qual e' il comportamento con e senza queste due
// ISTRUZIONI "pragma pack(push" e "pragma pack(pop"
//#pragma pack(push,1);
struct s
{
char nome[20];
char del1;
float peso;
char del2;
double pesod;
char del3;
float altezza;
char del4;
double altezzad;
char del5[4];
};
//#pragma pack(pop);
s studente,verifica;
const int max_cin = 1000;
int main()
{
bool Errore=false;
bool FineElabora=false;
string stnum;
// Prima Parte dell'Elaborazione: Processo P1 di DATA ENTRY - COSTRUZIONE ARCHIVIO STUDENTI
ifstream FlussoL; // dichiarazione flusso sola lettura
ofstream FlussoS; // dichiarazione flusso sola scrittura
char nm[sizeof(studente.nome)];
//*string che_nome = "Gabriele";
char che_nome[sizeof(studente.nome)]="********";
cout << "Lunghezza Record totale: " << sizeof(studente) << "\n";
cout << "Lunghezza float peso : " << sizeof(studente.peso) << "\n";
cout << "Lunghezza double peso : " << sizeof(studente.pesod) << "\n";
cout << "Lunghezza float altezza: " << sizeof(studente.altezza) << "\n";
cout << "Lunghezza double altezz: " << sizeof(studente.altezzad) << "\n";
FlussoS.open("studenti2cmp.dat", ios:: binary); // apertura flusso di scrittura file binario
Errore = false;
FineElabora = false;
do
{
Errore = false;
FineElabora = false;
cout << "inserisci nome dello studente, 'fine' per terminare: " << endl;
// cin >>nm;
for (int i=0;i < sizeof(nm);i++) {nm[i]=' ';};
for (int i=0;i < sizeof(studente.nome);i++) {studente.nome[i]=' ';};
cin.getline(nm,sizeof(nm),'\n');
// cin.clear(); cin.ignore(100,'\n');
// cin.ignore(100,'\n');
cin.clear();
if (strcmp(nm,"fine")!=0)
{
strcpy(studente.nome,nm);
Errore=LeggiNumeri();
}
else
{
FineElabora = true;
};
if (Errore)
{
FineElabora = true;
};
if ((!FineElabora)&&(!Errore))
{
/*
cout << "inserisci peso\n";
cin >> studente.peso;
cout << "inserisci altezza\n";
cin >> studente.altezza;
cin.clear(); cin.ignore(max_cin,'\n');
*/
studente.pesod = studente.peso;
studente.altezzad = studente.altezza;
strcpy(studente.del5,"FINE");
studente.del1 = '1';
studente.del2 = '2';
studente.del3 = '3';
studente.del4 = '4';
FlussoS.write((char *)&studente, sizeof(studente)); //scrittura del record nel file
};
if (Errore)
{
FineElabora = true;
};
} while(!FineElabora);
if (Errore)
{
FineElabora = true;
};
FlussoS.close(); // chiusura flusso di scrittura
if (Errore)
{
cout << "Elaborazione Terminata con Errore" << endl;
system("PAUSE");
return 99;
};
// Seconda Parte dell'Elaborazione: Processo P2 di INQUIRY - RICERCA STUDENTE
cout << endl << endl << "INIZIA LA FASE RICERCA STUDENTE: " << endl;
Errore = false;
FineElabora = false;
do
{
Errore = false;
FineElabora = false;
cout << "inserisci nome dello studente da ricercare, 'fine' per terminare: " << endl;
// cin >>nm;
for (int i=0;i < sizeof(che_nome);i++) {nm[i]=' ';};
cin.getline(che_nome,sizeof(che_nome),'\n');
// cin.clear(); cin.ignore(100,'\n');
// cin.ignore(100,'\n');
cin.clear();
if (strcmp(che_nome,"fine")!=0)
{
FineElabora = false;
}
else
{
FineElabora = true;
};
if (Errore)
{
FineElabora = true;
};
if ((!FineElabora)&&(!Errore))
{
FlussoL.open("studenti2cmp.dat", ios:: binary); // apertura flusso di lettura file binario
bool trovato=false;
while (!FlussoL.eof()&&!trovato)
{
FlussoL.read((char *)&verifica,sizeof(verifica)); // lettura del record dal file
//* if (strcmp(verifica.nome,"Gabriele")==0)
if (strcmp(verifica.nome,che_nome)==0)
{
cout << "studente presente" << endl;
trovato=true;
// break;
}
};
if (trovato)
{
cout << "studente presente" << endl;
cout << "Nome Studente : " << verifica.nome << endl;
cout << "float peso : " << verifica.peso << "\n";
cout << "double peso : " << verifica.pesod << "\n";
cout << "float altezza : " << verifica.altezza << "\n";
cout << "double altezza: " << verifica.altezzad << "\n";
}
else
{
cout << "Studente NON Presente" << endl;
};
FlussoL.close(); // chiusura flusso di lettura per eventuale ripristino per nuova ricerca
};
if (Errore)
{
FineElabora = true;
};
} while(!FineElabora);
system("PAUSE");
return 0;
};
// "LIBRERIA" delle Funzioni CUSTOM richiamate dai PROCESSI ... da completare
bool ControlloNum(string stnum)
{
bool Errore=false;
for(int i=0;i<sizeof(stnum);i++)
{
if (!((stnum[i] >= '0' && stnum[i] <= '9')||stnum[i]=='-'||stnum[i]==','||stnum[i]=='.'))
Errore=false;
};
return Errore;
};
bool LeggiNumeri ()
{
bool ErrNum = false;
string stnum;
char stchar [20];
cout << "inserisci il peso dello Studente: \n";
// cin >> studente.peso;
cin >> stnum;
ErrNum = ControlloNum(stnum);
for(int i=0;i<sizeof(stnum);i++){stchar[i] = stnum[i];};
// strcpy(stchar,stnum);
studente.peso = atof(stchar);
if (!ErrNum)
{
cout << "inserisci l'altezza dello Studente: \n";
cin >> stnum;
ErrNum = ControlloNum(stnum);
for(int i=0;i<sizeof(stnum);i++){stchar[i] = stnum[i];};
// strcpy(stchar,stnum);
studente.altezza = atof(stchar);
};
cin.clear(); cin.ignore(max_cin,'\n');
return ErrNum;
};