Ejercicio 1 Fundamentos de Programación II 7 ESTRUCTURAS DE DATOS Registros, Uniones y Enumerados Ejercicios z Escribir una función que recibiendo como parámetro una estructura de datos con los resultados de la jornada, devuelva en otra estructura la quiniela correspondiente. z Resultados de la jornada: – nombre equipo local – nombre equipo visitante – goles local – goles visitante z Quiniela: – nombre equipo local – nombre equipo visitante – signo de la quiniela:’1’,’X’,’2’ Curso 2002/2003 D.L.S.I. 1 D.L.S.I. Ejercicio 1. Solución (I) Ejercicio 1. Solución (II) void HacerQuiniela (Tresult result [ ], TQuiniela quiniela[ ] ) { int i; for ( i= 0; i < kPartidos; i++) { quiniela[i].local = result[i].local; quiniela[i].visitante = result[i].visitante; if (result[i].golesL == result[i].golesV) quiniela[i].signo = 'X'; else if (result[i].golesL > result[i].golesV) quiniela[i].signo = '1'; else quiniela[i].signo = '2'; } } const int kPartidos = 15; struct Tresult { string local, visitante; int golesL, golesV; }; struct Tquiniela { string local, visitante; char signo; }; D.L.S.I. 3 Ejercicio 2 z z 2 D.L.S.I. 4 Ejercicio 2. Solución (I) Diseñar las estructuras de datos necesarias para almacenar la información de los 600 alumnos que cursan estudios en informática: – Nombre (máx. 30 caracteres) – Domicilio (máx. 45 caracteres) – Curso ( 1, 2 ó 3) Dependiendo del curso, se dispone de los siguientes datos: Curso 1: – notas de las 6 asignaturas de primer curso Curso 2: – número de asignaturas pendientes – notas de las 4 asignaturas de segundo curso. Curso 3: – número de asignaturas pendientes – notas de las 5 asignaturas de tercer curso – nombre del tutor del proyecto (máx. 30 caracteres) D.L.S.I. Fundamentos de Programación. Ingeniería en Informática 5 struct TCurso2 { int numAsig; float notas[4]; }; struct TCurso3 { int numAsig; float notas[5]; char nombreTutor [31]; }; D.L.S.I. 6 1 Ejercicio 2. Solución (II) Ejercicio 3 union TCurso { float notas[6]; TCurso2 datosCurso2; TCurso3 datosCurso3; }; z z z z struct TAlumno { char nombre [31]; char domicilio [46]; int curso ; // el campo curso hace de selector Tcurso masDatos; }; Talumno alumnos [600]; D.L.S.I. Se supone que hay un máximo de 2000 ejemplares D.L.S.I. 8 Ejercicio 3. Solución (II) const int kTAM = 2000; union TEspecifico { TRevista revista; TLibro libro; }; struct TFecha { int dia, mes, anyo; } ; struct TLibro { char ISBN[11] ; int anyoPub; TFecha fecNacAutor; }; struct TBib { char titulo [41]; char editorial [26]; char tipo; // Selector ‘R’ Revista, ‘L’ Libro TEspecifico dato; }; struct TRevista { TFecha fecPublic; int precio; }; D.L.S.I. 9 Ejercicio 4 D.L.S.I. 10 Ejercicio 4. Solución A partir de los datos definidos en el ejercicio anterior, escribir una función que recibiendo los siguientes parámetros: – el vector de las fichas de la biblioteca – el número de fichas almacenadas – dos enteros denominados mes y anyo devuelva el número de revistas de la biblioteca con una fecha de publicación posterior a dicho mes / anyo. z z 7 Ejercicio 3. Solución (I) z z Definir los tipos de datos necesarios, las constantes y variables para almacenar en un vector los datos de los libros y revistas, de una biblioteca, cuyas fichas contienen la siguiente información : Título: del libro o de la revista (máximo 40 caracteres). Nombre: de la editorial (máximo 25 caracteres). Si se trata de una revista: – fecha de publicación (día, mes, año) – precio Si se trata de un libro: – código de ISBN (10 caracteres) – año de publicación. – fecha de nacimiento del autor (día, mes, año) Ej. si se recibe mes = 3 y anyo = 1997, contar las revistas cuya fecha de publicación es mayor o igual al 1/4/1997 D.L.S.I. Fundamentos de Programación. Ingeniería en Informática 11 int ContarRevistas (TBib biblio[ ], int numFichas, int mes, int anyo) { int numero = 0, revA, revM, i; for ( i = 0; i < numFichas ; i++) if (biblio[i].tipo == 'R') { revM = biblio[i].dato.revista.fecPublic.mes; revA = biblio[i].dato.revista.fecPublic.anyo; if (( revA > anyo) || ((revA == anyo) && (revM> mes))) numero++; } return(numero); } D.L.S.I. 12 2 Ejercicio 5 Ejercicio 5. Solución (I) z Crear en una función que permita introducir por teclado los datos de un registro y devuelva el mismo. z El registro deberá contener la siguiente información : – Nombre de la persona (máximo 30 caracteres ) – Categoría : Profesor o Alumno (“P” o “A”) En caso de ser profesor : – Dpto. al que pertenece: TIC, LSI, CCIA (enumerado). En caso de ser alumno : – código de matrícula (entero) – si es o no repetidor. z Definir los tipos de datos necesarios D.L.S.I. 13 enum TDepto { TIC, LSI, CCIA } ; struct TAlumno { int codMat; bool repetidor; }; union TEspecifico { TDepto depto; TAlumno datosAlumno; } ; struct TPersona { char nombre[31]; char categoria; // ‘P’ Profesor TEspecifico dato; }; ‘A’ Alumno D.L.S.I. Ejercicio 5. Solución (II) Ejercicio 5. Solución (III) TPersona LeerDatos( ) { TPersona rec; char car; int num; cout << "Introduce Nombre : " ; cin >> rec.nombre; do { cout << "Introduce Categoria : "; cin >> rec.categoria ; } while ( (rec.categoria != 'P') && ( rec.categoria != 'A')); switch (rec.categoria) { case 'A' : cout << "Introduce numero de matricula : "; cin >>rec.dato.datosAlumno.codMat; do { cout<<”Es repetidor (S/ N) "; cin >> car; } while ((car != 'S') && ( car != 'N')); if (car == 'S' ) rec.dato.datosAlumno.repetidor = true; else rec.dato.datosAlumno.repetidor = false; break; D.L.S.I. 15 Ejercicio 5. Solución (IV) Fundamentos de Programación. Ingeniería en Informática 16 Ejercicio 5. Solución (V) void EscribirDatos ( TPersona rec) { cout <<rec.nombre << endl; switch (rec.categoria) { case 'P’ : cout << "Profesor del depto "; switch (rec.dato.depto) { case TIC : cout<< “TIC" << endl; break; case LSI : cout << "LSI" << endl; break; case CCIA : cout << "CCIA " << endl; break; } break; case 'P' : do { cout << "Introduce departamento 1-TIC, 2-LSI, 3-CCIA "; cin >> num; } while (( num < 1 ) || ( num > 3)); switch (num) { case 1 : rec.dato.depto = TIC; break; case 2 : rec.dato.depto = LSI; break; case 3 : rec.dato.depto = CCIA; break; } break; } return(rec); } D.L.S.I. D.L.S.I. 14 17 D.L.S.I. 18 3 Ejercicio 5. Solución (VI) Ejercicio 5. Solución (VII) case 'A' : cout << "Alumno con codigo:”; cout << rec.dato.datosAlumno.codMat ; if (rec.dato.datosAlumno.repetidor) cout << " ES REPETIDOR "; else cout << " NO ES REPETIDOR "; break; int main( ) { TPersona rec; rec = LeerDatos ( ); EscribirDatos (rec); } } } D.L.S.I. Fundamentos de Programación. Ingeniería en Informática 19 D.L.S.I. 20 4