[C++]I/O di un elenco studenti esterno

di il
2 risposte

[C++]I/O di un elenco studenti esterno

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;
};

2 Risposte

  • Re: [C++]I/O di un elenco studenti esterno

    Per evitare di compilare e provare tutto il codice, ci dici qual è il problema che hai? Non è detto che ti si possa rispondere con un esame completo di tutto il codice, per ovvi motivi di tempo.
  • Re: [C++]I/O di un elenco studenti esterno

    Il programma crea un file binario composto da una sequenza di struct 's', ogni struct contiene il nome di uno studente. Dopo aver immesso i nomi degli studenti, si entra in una sezione dove, se si immette un nome, viene fatta una ricerca lineare nel file creato. Se il nome viene trovato, viene stampato il messaggio corrispondente.
    Questo è più o meno quello che fa il programma. Funziona? Non lo so e non ho voglia di provarlo.
    E' fatto bene? No, ed inoltre il codice è pieno di ripensamenti, parti commentate e parti incomplete.
Devi accedere o registrarti per scrivere nel forum
2 risposte