






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Documento conteniendo la resolución de ejercicios de un examen final sobre introducción a la programación. Contiene preguntas relacionadas con declaración de variables, ciclos for, subprogramas recursivos y tipos de datos. Además, se incluyen ejemplos de código pascal.
Tipo: Exámenes
1 / 10
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







3:40 Introducción a la Programación Examen final 18 de enero de 2010
APELLIDOS: NOMBRE:
GRADO: DNI:
FIRMA: Duración: 3:00 h.
Ejercicio 1 Ejercicio 2 Ejercicio 3 Ejercicio 4 TOTAL
El examen se aprueba con una nota igual o superior a 50 puntos.
Ejercicio 1: [ 20 puntos : respuesta acertada = +2, respuesta incorrecta = – 0.75]
1.1. Señala la afirmación correcta (a) dispose(puntero) sirve para eliminar la variable puntero. (b) new(puntero) reserva espacio en memoria dinámica para una variable del tipo base del puntero. (c) Siempre ocurre que por cada declaración de variable de tipo puntero que escriba en la sección VAR debo escribir en la sección de instrucciones una llamada a new. (d) Después de llamar a new(puntero) , el valor al que apunta la variable puntero es indefinido.
1.2. Indica que sentencia es correcta a continuación del siguiente fragmento de código TYPE Tregistro = RECORD edad: integer; nombre: string[10]; END; Tfichero = FILE OF Tregistro; VAR reg: Tregistro; fich: Tfichero; ed: integer; nom: string[10]; BEGIN assign(fich, ‘fichero.dat’); rewrite(fich);
(a) readln(fich, reg.nombre); (b) write(fich, reg.edad); (c) writeln (fich, reg); (d) write(fich, reg);
1.3. Cual de las siguientes expresiones es de tipo boolean: (a) (2+3) div 2 * 5 (b) ord (2+3) div 2 + 1. (c) pred(8 / 4) = 2. (d) 7 mod 5 > 4.
1.4. ¿Cuál de las siguientes afirmaciones acerca de los ciclos (o bucles) preprobados es correcta? (a) En los ciclos preprobados se evalúa por primera vez la condición del ciclo después de ejecutar el cuerpo. (b) Los ciclos FOR son ciclos preprobados. (c) En el cuerpo de un ciclo preprobado no se necesita modificar el estado de la condición de salida del bucle. (d) Los ciclos preprobados son la mejor opción si al menos se va a ejecutar una vez el cuerpo del bucle.
1.5. Todo subprograma recursivo debe contener: (a) Una instrucción de iteración para ejecutar el caso recurrente varias veces. (b) Una instrucción de selección para distinguir entre casos recurrentes y casos base. (c) Una instrucción FOR. (d) Siempre más casos base que casos recurrentes.
1.6. Con respecto a los ficheros binarios:
(a) Siempre sus elementos son de tipo registro. (b) Cada elemento de un fichero binario puede tener un tipo distinto. (c) Los procedimientos y funciones predefinidas ASSIGN, REWRITE, READ, WRITE y EOF tienen similar comportamiento con ficheros binarios que con ficheros de texto. (d) La función FILEPOS(f) devuelve el elemento que se encuentra en la posición actual del fichero f.
1.7. Dado el siguiente código, después de ejecutar todas las instrucciones ¿Cuál es el valor de r, p^ y q^?:
PROGRAM Punteros; TYPE TPuntero = ^integer; VAR r:integer; p, q: TPuntero; BEGIN r:=5; new(q); q^:=3; p :=@r; p^:=2; p:=q; p^:=5; {¿Valor de r, p^ y q^?} END.
(a) r=5, p^=5, q^= (b) r=2, p^=2, q^= (c) r=2, p^=5, q^= (d) r=5, p^=5, q^=
Un supermercado necesita realizar un programa para gestionar las ventas en caja. Para ello, necesita de una serie de operaciones que incorporará al programa de gestión de cajas de que dispone. Todas las listas de la compra tienen exactamente 10 artículos.
Los tipos de datos ya definidos y que debemos usar son: TArticulo = RECORD Codigo: string[5]; Cantidad: integer; Precio: real; END; TListaCompra = array [1..10] of TArticulo; TFichero = FILE OF TArticulo;
Las operaciones que se quieren implementar serán las siguientes:
a) Escribir un subprograma que reciba el código de un artículo, lo busque y modifique la cantidad de dicho artículo de la lista. [10 puntos]
PROCEDURE ModificarCantidad (cod:string; VAR lista:tListaCompra); VAR i:integer; BEGIN {ModificarCantidad} i:=1; WHILE (i<10) AND (lista[i].codigo<>cod) DO i:=i+1; IF (lista[i].codigo=cod) THEN REPEAT writeln('La cantidad actual es :', lista[i].cantidad); writeln('Escriba la cantidad correcta :'); readln(lista[i].cantidad) UNTIL lista[i].cantidad>= ELSE writeln('No se encuentra el articulo en la lista') END;{ModificarCantidad}
b) Escribir un subprograma que ordene la lista de la compra por código de artículo. [5 puntos]
PROCEDURE Ordenar (VAR lista: tListaCompra); VAR i, j: integer ; aux: TArticulo;
BEGIN {Ordenar} FOR i := 1 TO pred(10) DO FOR j := 1 TO 10-i DO IF lista[j].codigo > lista[j+1].codigo THEN BEGIN aux := lista[j] ; lista[j] := lista[j+1] ; lista[j+1] := aux END; {IF} END; {Ordenar}
c) Escribir un subprograma que produzca el ticket de compra, imprimiendo el código de cada artículo, su cantidad y precio. Al final escribirá por pantalla el total de artículos y el precio total a pagar. [5 puntos]
PROCEDURE MostrarArticulo (art: tArticulo); BEGIN {MostrarArticulo} writeln; writeln('Codigo: ', art.codigo); writeln('Cantidad: ', art.cantidad); writeln('Precio por unidad: ', art.precio:0:2); writeln; END; {MostrarArticulo}
PROCEDURE MostrarLista (VAR lista: tListaCompra); VAR i, nArt: integer; total: real;
BEGIN {MostrarLista} nArt:=0; total:=0; FOR i := 1 TO 10 DO BEGIN MostrarArticulo(lista[i]); nArt:=nArt+lista[i].cantidad; total:=total+lista[i].cantidad*lista[i].precio; END; writeln('Total de articulos : ', nArt); writeln('Precio total : ', total:0:2); END; {MostrarLista}
d) Escribir un subprograma que añada por el final al fichero de las ventas del día, una lista de la compra. El subprograma recibirá el nombre lógico del fichero y la lista de la compra. [10 puntos]
PROCEDURE Anadir (lista: tListaCompra; VAR fich:tFichero); VAR i, nElem: integer; BEGIN {Anadir } {$I-} reset(fich); {$I+} IF IORESULT <> 0 THEN rewrite(fich); nElem:= FILESIZE(fich); SEEK(fich,nElem); FOR i:=1 TO 10 DO write(fich,lista[i]); CLOSE(fich) END; {Anadir }
NOTA: Se pueden usar los subprogramas de los apartados previos aunque no hayan sido resueltos.
FOR i:=1 TO MAX DO cifrada[i]:=contrasena[sinCifrar[i]];
END;{Cifrar}
PROCEDURE Cifrar3 (sinCifrar:tCuenta3; contrasena:tContrasena3;
VAR cifrada:tCuenta3);
VAR
i, ind:integer;
BEGIN {Cifrar}
FOR i:=1 TO MAX DO BEGIN IF sinCifrar[i]=0 THEN ind:= ELSE ind:=sinCifrar[i]; cifrada[i]:=contrasena[2,ind]; END;
END;{Cifrar}
c) Realizar un subprograma que reciba un número de cuenta cifrado y la tabla de correspondencia y devuelva el número de cuentas sin cifrar. [10 puntos]
PROCEDURE Descifrar (cifrada:tCuenta; contrasena:tContrasena; VAR sincifrar:tCuenta); VAR i, j:integer; BEGIN {Descifrar} FOR i:=1 TO MAX DO BEGIN j:=0; WHILE cifrada[i]<>contrasena[j] DO j:=j+1; sincifrar[i]:=j; END; END;{Descifrar}
PROCEDURE Descifrar3 (cifrada:tCuenta3; contrasena:tContrasena3; VAR sincifrar:tCuenta3); VAR i, j:integer; BEGIN {Descifrar} FOR i:=1 TO MAX DO
BEGIN j:=1; WHILE cifrada[i]<>contrasena[2,j] DO j:=j+1; sincifrar[i]:=contrasena[1,j]; END; END;{Descifrar}
Queremos guardar información sobre los alumnos de una clase. En la clase hay como máximo 100 alumnos pero en el curso actual tenemos 60 aunque ese número puede variar (dependiendo si hay nuevas incorporaciones o algún alumno anula la matricula y por tanto se da de baja). De cada alumno almacenaremos su nombre, su primer apellido, su número de expediente, si ha realizado las prácticas o no y las notas de los 15 exámenes parciales (valores numéricos reales).
Se pide:
a) Definir los tipos de datos adecuados para almacenar dicha información. [5 puntos]
CONST MAX=15; MAXALU=100; TYPE TCad25=string[25]; TExp=string[10]; TNotas= ARRAY [1..MAX] OF real; TAlumno= RECORD nombre,apellido:TCad25; expediente:tExp; practicas:boolean; notas:tNotas; END; TAlumnos=ARRAY[1..MAXALU] OF TAlumno; TClase = RECORD alumnos:TAlumnos; tope:integer; END;
b) Hacer un subprograma que añada un nuevo alumno a la clase (deberá internamente pedir el nombre, el apellido y el nº de expediente). Las 15 notas se inicializarán a 0 y la práctica no realizada. Si el número de expediente está repetido no se podrá realizar la inserción.
[10 puntos]
PROCEDURE Anadir (VAR clase:TClase); VAR expe:TExp; i: integer; encontrado:boolean;
BEGIN {Anadir } IF clase.tope<MAXALU THEN BEGIN
writeln('Introduzca la nota número ', j); readln(clase.alumnos[i].notas[j]); END ELSE writeln('El alumno no ha sido encontrado'); END; {ActualizarNotas}