Version:0.9 StartHTML:0000000105 EndHTML:0000009466 StartFragment:0000000152 EndFragment:0000009432
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/******************************************************/
/****************** Telematica ************************/
/******************************************************/
/************* Practica 8 Ejercicio 4 *****************/
/******************************************************/


#include <iostream.h>
#include <stdlib.h>
#include <string>
#include <fstream.h>

const int MAXALU = 100;

struct alu
{
    string nombre;
    string apellido;
    float nota;
};

typedef alu Vector[MAXALU];

bool CargarDatos(ifstream & fentrada, alu & dat);
void GrabarDatos(ofstream & fsalida, alu & dat);

int main()
{
    ifstream fentrada;
    ofstream fsalida;

    Vector alumnos;
    int opcion, pos,i;
    float suma, divisor;
    bool salir,seguir;

    seguir = true;
    salir = false;
    pos = 0;
    i=0;

    fentrada.open("alumnos.dat");

    if (!fentrada)
        cout << "\n Error al abrir el fichero alumnos.dat\n";
    else
    {

       while (CargarDatos(fentrada, alumnos[i]))
        {
            i++;
        }
        fentrada.close();
    } // else

    pos = i;

    do
    {
        cout << "\n Practica 8 Ejercicio 4 \n";
        cout << " 1.- Ver todo el fichero\n";
        cout << " 2.- Ver alumnos aprobados\n";
        cout << " 3.- Aņadir alumno\n";
        cout << " 4.- Calcular la nota media\n";
        cout << " 5.- Salir\n";
        cout << " Elige una opcion -> ";
        cin >> opcion;
        cout << endl;

        switch (opcion)
        {
            case 1:
                for (i = 0; i < pos; i++)
                    cout << alumnos[i].nombre << " " << alumnos[i].apellido << " " << alumnos[i].nota << endl;
                break;
            case 2:
                 cout << "\n Lista de alumnos aprobados: \n";

                 for (i = 0; i < pos; i++)
                 {
                     if ( (alumnos[i].nota) >= 5)
                         cout << alumnos[i].nombre << " " << alumnos[i].apellido << endl;
                 }
                break;
            case 3: // aņadir alumnos
                cin.ignore();
                cout << "\n Introduccion de nuevo alumno: \n";
                cout << " Introduce el nombre -> ";
                getline(cin, alumnos[pos].nombre);
                cout << "\n Introduce el apellido -> ";
                getline(cin, alumnos[pos].apellido);
                do
                {
                    cout << "\n Introduce la nota -> ";
                    cin >> alumnos[pos].nota;
                }
                while ( alumnos[pos].nota < 0 || alumnos[pos].nota > 10);
                pos++;
                break;

            case 4: // calculo de la nota media
                suma = 0;
                divisor = 0;
                for (i = 0; i < pos; i++)
                {
                    suma = suma + alumnos[i].nota;
                    divisor++;
                }
                cout << "\n La nota media de todos los alumnos es de "<< suma/divisor << endl;
                break;
            case 5:
                salir = true;
                break;
            default:
                cout << "\n Opcion no valida ...... \n";
                break;
        }// switch
    }
    while (!salir);

    fsalida.open("alumnos.dat");


    for ( i = 0; i < pos; i++) // grabaremos datos justo hasta antes de la ultima posicion con datos de nuestro array
        {
            GrabarDatos(fsalida, alumnos[i]); // llamamos a la funcion que ira escribiendo en el fichero los datos del registro
        }
        fsalida.close(); // cerramos el fichero ya que no lo vamos a usar mas

    system("PAUSE");
    return 0;
}

bool CargarDatos(ifstream & fentrada, alu & dat)
{
    getline (fentrada, dat.nombre);
    getline(fentrada, dat.apellido);
    fentrada >> dat.nota;
    fentrada.get();
    return !(fentrada.eof());
}

void GrabarDatos(ofstream & fsalida, alu & dat)
{
    fsalida << dat.nombre << endl;
    fsalida << dat.apellido << endl;
    fsalida << dat.nota << endl;
    return;
}