Está en la página 1de 10

#include <iostream> #include <fstream> #include <cstdlib> #include <cstring> #include <string> #include <vector> using namespace std;

class Estudiante { public: string codigo; float nota_de_la_primera_unidad; float nota_de_la_segunda_unidad; float nota_de_la_tercera_unidad; float nota_del_componente_practico; Estudiante() {} ~Estudiante() {} bool operator==(const Estudiante &estudiante) const { return this==&estudiante || this>codigo==estudiante.codigo; } bool operator<(const Estudiante &estudiante) const { return this->codigo<estudiante.codigo; } Estudiante& operator=(const Estudiante &estudiante) { if (this!=&estudiante) { this->codigo = estudiante.codigo;

this>nota_de_la_primera_unidad = estudiante.nota_de_la_prime ra_unidad; this>nota_de_la_segunda_unidad = estudiante.nota_de_la_segun da_unidad; this>nota_de_la_tercera_unidad = estudiante.nota_de_la_terce ra_unidad; this>nota_del_componente_practico = estudiante.nota_del_comp onente_practico; } return *this; } static void imprimir (Estudiante &estudiante, int *c ontador) { cout << "codigo : " << estudiante.codigo.c_str() << endl; cout << "nota de la primera unidad : " << estudiante.nota_de_la_primera_unidad << endl; cout << "nota de la segunda unidad : " << estudiante.nota_de_la_segunda_unidad << endl; cout << "nota de la tercera unidad : " << estudiante.nota_de_la_tercera_unidad << endl; cout << "nota del componente practico: " << estudiante.nota_del_componente_practico << endl; cout << endl; (*contador)++; } static void imprimir_en_archivo (Estudiante &estudia nte, ostream *archivo) { *archivo << estudiante.codigo.c_str() << "\t"; *archivo << estudiante.nota_de_la_primera_unidad

<< "\t"; *archivo << estudiante.nota_de_la_segunda_unidad << "\t"; *archivo << estudiante.nota_de_la_tercera_unidad << "\t"; *archivo << estudiante.nota_del_componente_pract ico << endl; } }; string leer_cadena (const char *mensaje); int leer_entero (const char *mensaje, int menor, in t mayor); float leer_decimal (const char *mensaje); bool leer_campo (istream &archivo, char *campo, cha r delimitador); template <class T> T* vector_buscar (vector<T> &arregl o, const T &dato); template <class T> void vector_quitar (vector<T> &arregl o, T &dato); template <class T> void quick_sort (vector<T> &arregl o, int inicio=0, int fin=-1); int main() { Estudiante *dato, estudiante; vector<Estudiante> arreglo; int i, n, opcion, contador=0; char campo[255], ruta[] = "estudiantes.tsv"; ifstream entrada (ruta); if (entrada!=NULL) { while (leer_campo (entrada, campo, '\t')) { estudiante.codigo = campo; leer_campo (entrada, campo, '\t'); estudiante.nota_de_la_primera_unidad = atof (campo);

leer_campo (entrada, campo, '\t'); estudiante.nota_de_la_segunda_unidad = atof (campo); leer_campo (entrada, campo, '\t'); estudiante.nota_de_la_tercera_unidad = atof (campo); leer_campo (entrada, campo, '\n'); estudiante.nota_del_componente_practico = at of (campo); arreglo.push_back (estudiante); } entrada.close(); } do { system ("cls"); cout << "MEN\351" << endl << "1.Altas" << endl << "2.- Consultas" << endl << "3.Actualizaciones" << endl << "4.- Bajas" << endl << "5.- Ordenar registros" << endl << "6.Listar registros" << endl << "7.- Salir" << endl; opcion = leer_entero ("Seleccione una opci\242n", 1, 7); cout << endl; if (arreglo.empty() && opcion!=1 && opcion!=7) { cout << endl << "No hay registros." << endl << endl; system ("pause"); continue; } if (opcion<5) { estudiante.codigo = leer_cadena ("Ingrese el codigo del estudiante"); dato = vector_buscar (arreglo, estudiante); if (dato!=NULL)

Estudiante::imprimir (*dato, &contador); } if (dato!=NULL && opcion==1) cout << endl << "El registro ya existe."; else if (dato==NULL && opcion>=2 && opcion<=4) cout << endl << "Registro no encontrado."; else switch (opcion) { case 1: estudiante.nota_de_la_primera_unidad = l eer_decimal ("Ingrese el nota de la primera unidad"); estudiante.nota_de_la_segunda_unidad = l eer_decimal ("Ingrese el nota de la segunda unidad"); estudiante.nota_de_la_tercera_unidad = l eer_decimal ("Ingrese el nota de la tercera unidad"); estudiante.nota_del_componente_practico = leer_decimal ("Ingrese el nota del componente practico"); arreglo.push_back (estudiante); cout << endl << "Registro agregado correctamente."; break; case 3: cout << "Men\243 de modificaci\242n de campos" << endl; cout << "1.- nota de la primera unidad" << endl; cout << "2.- nota de la segunda unidad" << endl; cout << "3.- nota de la tercera unidad" << endl; cout << "4.- nota del componente practico" << endl; switch (leer_entero ("Seleccione un n\243mero de campo a modificar", 1, 4)) { case 1: dato-

>nota_de_la_primera_unidad = leer_decimal ("Ingrese el nota de la primera unidad"); break; case 2: dato>nota_de_la_segunda_unidad = leer_decimal ("Ingrese el nota de la segunda unidad"); break; case 3: dato>nota_de_la_tercera_unidad = leer_decimal ("Ingrese el nota de la tercera unidad"); break; case 4: dato>nota_del_componente_practico = leer_decimal ("Ingrese el nota del componente practico"); break; } cout << endl << "Registro actualizado correctamente."; break; case 4: vector_quitar (arreglo, *dato); cout << endl << "Registro borrado correctamente."; break; case 5: quick_sort (arreglo); cout << endl << "Registros ordenados correctamente."; break; case 6: n = arreglo.size(); contador = 0; for (i=0; i<n; i++) Estudiante::imprimir (arreglo[i], &c ontador);

cout << "Total de registros: " << contador << "."; break; } if (opcion<7 && opcion>=1) { cout << endl << endl; system ("pause"); } } while (opcion!=7); ofstream salida (ruta); if (salida!=NULL) { n = arreglo.size(); for (i=0; i<n; i++) Estudiante::imprimir_en_archivo (arreglo[i], &salida); salida.close(); } return EXIT_SUCCESS; } template <class T> T* vector_buscar (vector<T> &arreglo, const T &dato) { int i, n=arreglo.size(); for (i=0; i<n; i++) if (dato==arreglo[i]) return &arreglo[i]; return NULL; } template <class T> void vector_quitar (vector<T> &arreglo, T &dato) { int i, n=arreglo.size(); for (i=0; i<n; i++) if (dato==arreglo[i])

{ arreglo.erase (arreglo.begin()+i); return; } } template <class T> void quick_sort (vector<T> &arreglo, int inicio, int fin ) { int menor = inicio, mayor; if (fin==-1) fin = arreglo.size()-1; mayor = fin; T pivote; if (fin>inicio) { for (pivote=arreglo[(inicio+fin)/2]; menor<=mayo r;) { for (; menor<fin && arreglo[menor]<pivote; m enor++); for (; mayor>inicio && pivote<arreglo[mayor] ; mayor--); if (menor<=mayor) { pivote = arreglo[menor]; arreglo[menor] = arreglo[mayor]; arreglo[mayor] = pivote; menor++; mayor--; } } if (inicio<mayor) quick_sort (arreglo, inicio, mayor); if (menor<fin) quick_sort (arreglo, menor, fin); }

} string leer_cadena (const char *mensaje) { char cadena[255]; cout << mensaje << ": "; cin.getline (cadena, sizeof (cadena)); char *salto = strchr (cadena, '\n'); if (salto!=NULL) *salto = '\0'; string str(cadena); return str; } int leer_entero (const char *mensaje, int menor, int may or) { int entero; do { cout << mensaje << ": "; cin >> entero; cin.get(); if (entero<menor || entero>mayor) cout << "N\243mero no v\240lido." << endl; } while (entero<menor || entero>mayor); return entero; } float leer_decimal (const char *mensaje) { float decimal; cout << mensaje << ": "; cin >> decimal; cin.get(); return decimal; } bool leer_campo (istream &archivo, char *cadena, char de

limitador) { archivo.getline (cadena, 255, delimitador); if (archivo.eof()) return false; char *tab = strchr (cadena, delimitador); if (tab!=NULL) *tab = '\0'; return true; }

También podría gustarte