Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Examen Final: Introducción a la Programación - Ejercicios Resueltos, Exámenes de Ingeniería Infórmatica

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

Antes del 2010

Subido el 31/12/2009

galaxia_musica1
galaxia_musica1 🇪🇸

3.6

(5)

11 documentos

1 / 10

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
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.5
(c) pred(8 / 4) = 2.0
(d) 7 mod 5 > 4.3
pf3
pf4
pf5
pf8
pf9
pfa

Vista previa parcial del texto

¡Descarga Examen Final: Introducción a la Programación - Ejercicios Resueltos y más Exámenes en PDF de Ingeniería Infórmatica solo en Docsity!

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^=

Ejercicio 2: [30 puntos]

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.

Ejercicio 3: [25 puntos]

FOR i:=1 TO MAX DO cifrada[i]:=contrasena[sinCifrar[i]];

END;{Cifrar}

{SOLUCION 3}

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]

{SOLUCION 1}

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}

{SOLUCION 3}

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}

Ejercicio 4: [25 puntos]

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}