exa2003dic.txt - Bloc de notas

Anuncio
// 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();
}
Descargar