// Fundamentos de Programación II // Examen de Diciembre de 2003 #include <fstream.h> #include <string.h> int const kTAM=10; int const kTAMCOD=4; int const kTAMTEX=51; int const kTAMASI=5; typedef char TCadena[kTAMTEX]; typedef char TCod[kTAMCOD]; --- DLSI // ****** estructura del vector de "asignaturas" ****** struct TAsignatura { TCod codAsig; TCadena nomAsig; TCod codDpto; }; // ****** estructura del nodo con los resultados de las asignaturas ****** struct TNodo { TCod codAsig; float nota; TNodo *sig; }; typedef TNodo * TEnlace ; // ****** estructuras del vector de donde se almacenan // los punteros al inicio de cada lista de cada dpto. struct TPunteros{ TCod codDpto; TNodo * pt; }; // ****** estructuras de datos del fichero "personal.dat" struct TFecha{ int dia, mes, anyo; }; struct TMatri { TCod codAsig; float nota; }; struct TAlu { int numAsig; TMatri matricula [kTAM]; }; struct TProf { TFecha fecAnti; TCadena cargo; }; union TUnion { TProf prof; TAlu alu; }; struct TPersona { char dni[kTAM]; TCadena nombre; TFecha fecNac; bool esProf; TUnion masDatos; }; // ****** fin estructura del fichero ****** // función para inicializar el vector de asignaturas // y para crear el fichero personal.dat void Inicializar(TAsignatura v[]) { fstream f; TPersona aux; ****** //Creación del fichero de pruebas "personal.dat" f.open("personal.dat", ios::out); strcpy(aux.dni,"11111111A"); strcpy(aux.nombre,"Juan Sin Miedo"); aux.fecNac.dia=1; aux.fecNac.mes=1; aux.fecNac.anyo=1970; aux.esProf=true; aux.masDatos.prof.fecAnti.dia=1; aux.masDatos.prof.fecAnti.mes=1; aux.masDatos.prof.fecAnti.anyo=2000; strcpy(aux.masDatos.prof.cargo,"titular doctor"); f.write ((char *) &aux, sizeof(TPersona)); strcpy(aux.dni,"22222222B"); strcpy(aux.nombre,"Pepe Con Miedo"); aux.fecNac.dia=2; aux.fecNac.mes=2; aux.fecNac.anyo=1980; aux.esProf=false; aux.masDatos.alu.numAsig=5; aux.masDatos.prof.fecAnti.mes=1; aux.masDatos.prof.fecAnti.anyo=2000; strcpy(aux.masDatos.alu.matricula[0].codAsig,"FP2"); aux.masDatos.alu.matricula[0].nota=5; strcpy(aux.masDatos.alu.matricula[1].codAsig,"FP1"); aux.masDatos.alu.matricula[1].nota=4; strcpy(aux.masDatos.alu.matricula[2].codAsig,"BD"); aux.masDatos.alu.matricula[2].nota=6; strcpy(aux.masDatos.alu.matricula[3].codAsig,"LPO"); aux.masDatos.alu.matricula[3].nota=3; strcpy(aux.masDatos.alu.matricula[4].codAsig,"TAD"); aux.masDatos.alu.matricula[4].nota=7; f.write ((char *) &aux, sizeof(TPersona)); strcpy(aux.dni,"33333333C"); strcpy(aux.nombre,"Lucas Trapaza"); aux.fecNac.dia=2; aux.fecNac.mes=2; aux.fecNac.anyo=1980; aux.esProf=false; aux.masDatos.alu.numAsig=5; aux.masDatos.prof.fecAnti.mes=1; aux.masDatos.prof.fecAnti.anyo=2000; strcpy(aux.masDatos.alu.matricula[0].codAsig,"FP2"); aux.masDatos.alu.matricula[0].nota=5; strcpy(aux.masDatos.alu.matricula[1].codAsig,"FP1"); aux.masDatos.alu.matricula[1].nota=4; strcpy(aux.masDatos.alu.matricula[2].codAsig,"BD"); aux.masDatos.alu.matricula[2].nota=6; strcpy(aux.masDatos.alu.matricula[3].codAsig,"LPO"); aux.masDatos.alu.matricula[3].nota=3; strcpy(aux.masDatos.alu.matricula[4].codAsig,"TAD"); aux.masDatos.alu.matricula[4].nota=7; f.write ((char *) &aux, sizeof(TPersona)); f.close(); // introduccion de datos en el vector ORDENADO de asignaturas strcpy(v[0].codAsig,"BD"); strcpy(v[0].nomAsig,"Bases de Datos"); strcpy(v[0].codDpto,"LSI"); strcpy(v[1].codAsig,"FP1"); strcpy(v[1].nomAsig,"Fundamentos 1"); strcpy(v[1].codDpto,"TIC"); strcpy(v[2].codAsig,"FP2"); strcpy(v[2].nomAsig,"Fundamentos 2"); strcpy(v[2].codDpto,"LSI"); strcpy(v[3].codAsig,"LPO"); strcpy(v[3].nomAsig,"Logica Primer Orden"); strcpy(v[3].codDpto,"TIC"); strcpy(v[4].codAsig,"TAD"); strcpy(v[4].nomAsig,"Tipos Abstractos de Datos"); strcpy(v[4].codDpto,"LSI"); } // función para añadir un nodo al inicio de la lista enlazada bool Insertar (TEnlace &inicio, char cod[], float nota) { TEnlace pt; bool retorno=true; pt = new TNodo; if (!pt) retorno=false; else { pt->sig = inicio; strcpy(pt->codAsig,cod); pt->nota=nota; inicio = pt; } return(retorno); } void Ver (TEnlace inicio) { //Visualización de los nodos de una lista while (inicio!=NULL) { cout<<inicio->codAsig<<" "<<inicio->nota<<endl; inicio=inicio->sig; } } bool LeerPersonal (char dni[], char nombre[], TAlu &reg) { fstream fEnt; TPersona aux; bool apertura=true, noEsta=true; fEnt.open("personal.dat", ios::in); if (!fEnt) apertura=false; else { fEnt.read ((char *) &aux, sizeof(TPersona)); while (!fEnt.eof() && (noEsta)) { if(!aux.esProf) noEsta = strcmp(dni,aux.dni);//solo busco dni si es alumno // Si he encontrado al alumno no leo otro registro if(noEsta) fEnt.read ((char *) &aux, sizeof(TPersona)); } fEnt.close(); if (!noEsta) { strcpy (nombre,aux.nombre); reg=aux.masDatos.alu; } } return(apertura&&!noEsta); } int BusBinaria (TAsignatura v[], TCod cod) { bool encontrado; int alto, bajo, central, valor; encontrado = false ; bajo= 0; alto = kTAMASI-1 ; central = (bajo + alto) / 2; while ((bajo<=alto) && (valor=strcmp(cod,v[central].codAsig))) { if (valor<0) alto = central-1; else bajo = central+1 ; central = (bajo+alto)/2; } return(central); } void main() { int n,k,ind,ocupa=0; bool ok=true; char dni[kTAM]; TCadena nombre; TAlu mat; TAsignatura asig[kTAMASI]; // vector con todas las asignaturas TPunteros listas[kTAM]; // vector donde pondremos para cada Dpto // el puntero de inicio a su lista enlazada Inicializar (asig); cout<<"dni del alumno:"; cin>>dni; cin.get(); if (LeerPersonal(dni,nombre,mat)) { //si la búsqueda del alumno tiene éxito // inicialización de las 10 posibles listas // correspondientes a los 10 dptos. existentes for (n=0;n<10;n++) listas[n].pt=NULL; for (n=0;n<mat.numAsig && ok; n++) { //Para cada asignatura buscamos su Dpto. ind=BusBinaria(asig, mat.matricula[n].codAsig); // para cada Dpto. buscamos el elemento del vector donde está su pt inicio for (k=0; k<ocupa && strcmp(asig[ind].codDpto,listas[k].codDpto);k++) ; if (k==ocupa) { //Añadimos un nuevo Dpto.al vector strcpy(listas[k].codDpto, asig[ind].codDpto); ++ocupa; } // localizado el elemento con el pt de inicio, añadimos la asignatura ok=Insertar(listas[k].pt,mat.matricula[n].codAsig, mat.matricula[n].nota); } cout<<"alumno: "<<nombre<<endl; for (n=0;n<ocupa;n++){ // Visualizamos las listas de cada Dpto. cout<<"Departamento: "<<listas[n].codDpto<<endl; Ver(listas[n].pt); cout<<endl; } } else cout << "Error fichero o no existe el registro o no es alumno"; cin.get(); }