Examen escrito de Programación 1. Viernes 22 de enero de Problema 1 o (3.0 puntos) Problema 2 o (3.0 puntos)

Documentos relacionados
Examen escrito de Programación 1. Jueves 5 de febrero de Problema 1 o (3.5 puntos)

Examen escrito de Programación 1

Examen escrito de Programación 1

Programación 1 Desarrollo de proyectos de programación. Desarrollo de un módulo C++ de biblioteca para trabajar con conjuntos de letras

Programación 1 Desarrollo de proyectos de programación. Desarrollo de un módulo C++ de biblioteca para trabajar con conjuntos de letras

Programación 2. Lección 3. Introducción a la recursividad

Elementos de un programa en C

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

Programación 1 Tema 4. Diseño de programas elementales

Segundo parcial de Programación 2

ESTRUCTURAS DE DATOS Y ALGORITMOS

1/1. Diseño Modular. 18 de febrero de 2017

Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2

Examen escrito de Programación 1

Programación 1. Diseño modular de nuevos tipos de datos en un programa. Diseño modular de un tipo de dato con estructura de conjunto

SESIÓN DE EJERCICIOS E1

Introducción rápida a la programación (estructurada ) con C++

Programación 1 Problemas del Composición condicional

LENGUAJES DE PROGRAMACIÓN. Solución al examen de Junio 2016, Primera Semana

Métodos CON valor de retorno

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

PHP: Lenguaje de programación

LENGUAJES DE PROGRAMACIÓN. Solución al Ejercicio de Autocomprobación 1

Programación 1 Tema 15. Trabajo con ficheros binarios

1. (1 punto) Dado el siguiente fragmento de programa:

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1

Tema 7: Recursividad

Ejercicio 2 Considere la representación para Lista de Naturales y Árbol Binario de Naturales de la Figura 1.

7.3. Estructura de un programa

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Indique la veracidad o falsedad de cada una de las afirmaciones siguientes, explicando detalladamente en cada caso el motivo de su respuesta.

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Tipos Recursivos de Datos

Programación 2. Lección 1. Introducción a la especificación formal de algoritmos

Introducción a la Programación

Declaración. Introducción. Definición o implementación. Llamada. Un programa en C consta de una o más funciones.

Programación 1 Tema 11. Estructuración agregada de datos

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

Instituto Tecnológico de Celaya

Fundamentos de la programación

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa

Cátedra I Informática Autor I Carlos Bartó

Tipos de datos y operadores en C++

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

Programación en Lenguaje C

Ejercicios Tema 6. Funciones

Estructura de datos y de la información Boletín de problemas - Tema 10

Fundamentos de Programación

CLAVE EXAMEN: a cd. c u r s o r = c u r s o r. g e t S i g u i e n t e ( ) ; p o s i c i o n ++;

Porque usar Arreglos?

Funciones: Pasos por Referencia Recursividad

A l g o r i t m o y E s t r u c t u r a d e D a t o s Ing. en Sistemas de Información - 1º año -

Características de JavaScript

JavaScript Básico. Elementos Básicos: Comentarios: Literales: Valores que puede tomar una variable o una constante.

Tipos de Datos en C. Palabras reservadas en C

Informática PRÀCTICA 3 Curs Práctica Nº 3: Tipos de datos simples. Constantes y variables. Operadores aritméticos. Formato de salida.

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

Paradigmas de lenguajes de programación. Introducción a la programación imperativa. Lenguaje C. Programación imperativa

Arreglos. Algoritmos y Estructuras de Datos I. Arreglos en C++ Arreglos y listas

FUNDAMENTOS DE PROGRAMACIÓN LABORATORIO SESIÓN 2

Programación Estructurada

Lenguajes de programación. Algoritmos y Estructuras de Datos I. Lenguajes compilados. Lenguajes compilados

<tipo> Tipo de dato de los elementos del vector

CAPÍTULO 3 ESTRUCTURAS DE DATOS ESTÁTICAS

A) PREORDEN B) INORDEN C) POSTORDEN D) NIVELES

Programación Estructurada

SESIÓN DE EJERCICIOS E1

Estructuras de Datos Dinámicas: Listas

Tema 2. Tipos y Estructuras Básicas

1.2.4 Listas enlazadas

Implementación de las Clases Pila, Cola, Lista y Arbol

Examen 23 de Julio de 2012

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Instituto de Computación. Facultad de Ingeniería. Universidad de la República Examen de Programación 2 03 de Agosto de 2006 Generalidades:

A l g o r i t m o y E s t r u c t u r a d e D a t o s Ing. en Sistemas de Información - 1º año -

Cadenas (strings) y Estructuras

PROPIEDADES DE LOS CAMPOS. Cada campo de una tabla dispone de una serie de características que proporcionan un control

UTN FRBA Algoritmos y Estructura de Datos Examen Final 13/02/2015. Apellido y nombre: Legajo: Cursó con Prof:

Tipos de datos y Operadores Básicos

PRÁCTICA 1.BASE DE DATOS ACCESS

UNADM. Estructura de datos. Guillermo Duran Garcia AL Actividad 2. Identificación de errores en métodos de ordenación

Programación 2. Pruebas para la evaluación voluntaria de la asignatura. Grado en Ingeniería Informática. Curso

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

EXAMEN PROGRAMACION I FEBRERO 2007

GUÍA DE TRABAJO GRADO 11. Programación de Software Ing. Néstor Raúl Suarez Perpiñan Página 1 de 5. Tema: VALIDACIONES DE CAMPOS - LENGUAJE C#

Estructura de Datos y de la Información

Especificación de programas. Algoritmos y Estructuras de Datos I. Correctitud de ciclos

PRINCIPIOS DE PROGRAMACIÓN. Mtro. en Ingeniería de Software. Especialidad en e-commerce Ismael Jiménez Hernández

Árboles. Árboles. Árboles binarios de búsqueda. Árboles. Inserción en un árbol. Árbol binario de búsqueda

Prof. Dr. Paul Bustamante

LISTAS ENLAZADAS FUNDAMENTOS TEORICOS

Práctica : Creación y uso de métodos

La forma general que tiene un condicional (una pregunta) es la siguiente:

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

UNIDAD 5. PROPIEDADES DE LOS CAMPOS

Programación 1 Tema 3. Información, datos, operaciones y expresiones

Examen de Fundamentos de la Programación (Modelo 1)

Estructura de datos y Programación

PRESENTACIÓN DEL ALGORITMO

FUNDAMENTOS DE PROGRAMACIÓN. 1º ING. INFORMÁTICA (Plan 2000) 2ª Convocatoria. 21 de junio de 2001

Transcripción:

Examen escrito de Programación 1. Viernes 22 de enero de 2016 Se debe disponer de un documento de identificación con fotografía sobre la mesa. Se debe comenzar a resolver cada uno de los problemas del examen en una hoja de papel diferente, para facilitar su calificación por distintos profesores. Escribir en cada hoja de papel nombre y apellidos y utilizar, en su caso, ambas caras de la hoja. Tiempo máximo para realizar este examen: 3 horas Problema 1 o (3.0 puntos) Se debe completar el diseño de la función coincidencias(primero,segundo,tercero), que se especifica a continuación, escribiendo su código C++. En él no se debe hacer uso de ninguna función predefinida en otros módulos. Se valorará el planteamiento de un diseño descendente programando alguna o algunas funciones auxiliares. Todas las funciones que integren la solución deben estar adecuadamente especificadas No obstante, se admite que la especificación de la función pedida sea un resumen de la especificación que se muestra a continuación. Pre: primero >= 0, segundo >= 0 y tercero >= 0 Post: Si una misma cifra se repite k1 veces en primero, k2 veces en segundo y k3 veces en tercero, el número de coincidencias de dicha cifra en ellos es el menor de k1, k2 y k3. Así, la cifra 6 se repite 4 veces en 601866726, 2 veces en 96086 y 3 veces en 6600060, por lo tanto el número de coincidencias del 6 en esos tres números es 2. Así también la cifra 0 se repite una vez en 601866726, una vez en 96086 y 4 veces en 6600060, por lo tanto el número de coincidencias del 0 en esos tres números es 1. Ninguna otra cifra está repetida en los tres números citados. Devuelve la suma del número de coincidencias de cada cifra decimal en primero, segundo y tercero, cuando los tres números se escriben en base 10. Ejemplos: primero segundo tercero coincidencias (primero, segundo, tercero ) ===== ===== ====== ========================= 46004 239 804231 0 0 0 0 1 2241 1344 131112 1 12345678 202303 8321200 2 601866726 96086 6600060 3 41001 1110000 1010123 4 655623 53356623 4335656 5 123321321 111222333 918171223 6 int coincidencias (const int primero, const int segundo, const int tercero ); Problema 2 o (3.0 puntos) Se debe completar el diseño de la función tramoordenado(t,n,desde,hasta) que se especifica a continuación escribiendo su código C++. En él no se debe hacer uso de ninguna función predefinida en otros módulos. Se valorará el planteamiento de un diseño descendente programando alguna o algunas funciones auxiliares. Todas las funciones que integren la solución deben estar adecuadamente especificadas, incluyendo la función pedida.

Pre: n > 0 Post: Sea T[i, j] la subtabla de T[0,n 1] que almacena un mayor número de datos ordenados de menor a mayor valor: T[i]<=T[i+1], T[i+1]<=T[i+2],..., T[j 1]<=T[j]. Asigna a desde el valor del índice i y a hasta el del índice j void tramoordenado (const double T [], const int n, int& desde, int& hasta ); Problema 3 o (4.0 puntos) Se desea diseñar un módulo de biblioteca denominado lista, programado en C++, que defina el tipo de dato ListaOrdenada y ofrezca una colección de funciones para trabajar con datos de tipo ListaOrdenada. Las características fundamentales de un dato de tipo ListaOrdenada son las siguientes: Cada dato del tipo ListaOrdenada puede verse como una secuencia de elementos de la forma < D 1, D 2,..., D k >. Cada uno de dichos elementos es un dato de tipo int. El número k de elementos de una lista ordenada está comprendido entre 0 y el valor de la constante CAPACIDAD MAXIMA. Los k elementos de una lista ordenada están ordenados de menor a mayor valor: D 1 D 2 D k 1 D k La colección de funciones disponibles en el módulo lista para trabajar con datos del tipo ListaOrdenada es la siguiente: crear(). Al ser invocada devuelve una lista ordenada sin ningún elemento. void insertar(lo,nuevo). Inserta el elemento nuevo en la lista ordenada LO. void retirar(lo). Elimina de la la lista ordenada LO el elemento de menor valor. int consultar(lo,i). Devuelve el elemento que ocupa la posición i-ésimo, D i, de la lista ordenada LO = < D 1, D 2,..., D i,..., D k >, sin modificar la lista ordenada LO. int numelementos(lo). Devuelve el número de elementos de la lista ordenada LO, sin modificar la lista ordenada LO. Ejemplo ilustrativo del uso de los recursos definidos en el módulo lista: ListaOrdenada L = crear (); // L = <> int numdatos = numelementos(l); // numdatos = 0 insertar (L, 20); // L = <20> insertar (L, 40); // L = <20, 40> insertar (L, 10); // L = <10, 20, 40> int elemento = consultar (L,3) // elemento = 40 insertar (L, 30); // L = <10, 20, 30, 40> numdatos = numelementos(l); // numdatos = 4 elemento = consultar (L,3) // elemento = 30 retirar (L); // L = <20, 30, 40> elemento = consultar (L,3) // elemento = 40 numdatos = numelementos(l); // numdatos = 3 En primer lugar se debe definir la estructura interna del tipo ListaOrdenada, escribiendo los comentarios que faciliten la comprensión de cómo se representan los datos de este tipo. 2

// Capacidad máxima de una lista ordenada const int CAPACIDAD MAXIMA = 375; // Modificar en caso necesario Un dato del tipo ListaOrdenada almacena una secuencia de datos de tipo int, con capacidad máxima CAPACIDAD MAXIMA.... completar, en su caso, la explicación de la estructura... struct ListaOrdenada {... definir y explicar la estructura interna de este tipo de dato... ; A continuación, se deben especificar las cinco funciones que siguen, atendiendo a las explicaciones previas, y se debe escribir el código de cada una de ellas. En las precondiciones de las funciones se debe atender a garantizar la viabilidad de la ejecución de cada función. ListaOrdenada crear (... escribir su lista de parámetros... ) { void insertar (... escribir su lista de parámetros... ) { void retirar (... escribir su lista de parámetros... ) { int consultar (... escribir su lista de parámetros... ) { int numelementos (... escribir su lista de parámetros... ) { 3

Una solución del problema 1 o // Base numérica en la que se va a trabajar const int BASE = 10; Pre: n>=0 y veces tiene al menos BASE componentes. Post: Al terminar su ejecución, veces[ i] almacena el número de veces que el dígito i aparece en el número n cuando se escribe en base BASE. void calcularvecesdigito (const int n, int veces []) { // Inicialización de la tabla for ( int i = 0; i < BASE; i++) { veces[ i ] = 0; if (n == 0) { // Caso particular : el 0 se representa con un dígito 0 veces[0] = 1; else { // Caso general: actualización del número de veces que aparece el último // dígito de m y división del mismo por la base para la siguiente // iteración. int m = n; while (m > 0) { veces[m % BASE]++; m = m / BASE; Pre: Post: Ha devuelto el menor de los valores {a, b, c. int menor (const int a, const int b, const int c) { int menor = a; if (b < menor) { menor = b; if (c < menor) { menor = c; return menor; Pre: primero >= 0, segundo >= 0 y tercero >= 0. Post: Ha duevuelto la suma del número de coincidencias de cada cifra decimal en primero, segundo y tercero, cuando los tres números se escriben en base BASE. int coincidencias (const int primero, const int segundo, const int tercero ) { int vecesprimero[base]; int vecessegundo[base]; int vecestercero [BASE]; calcularvecesdigito (primero, vecesprimero ); calcularvecesdigito (segundo, vecessegundo); 4

calcularvecesdigito ( tercero, vecestercero ); int sumacoincidencias = 0; for ( int digito = 0; digito < BASE; digito++) { sumacoincidencias += menor(vecesprimero[ digito ], vecessegundo[ digito ], vecestercero [ digito ]); return sumacoincidencias; 5

Una solución del problema 2 o Pre: n > 0, desde >= 0, desde <= n 1 y T tiene al menos n componentes. Post: Ha devuelto el mayor de los índices i comprendidos en el intervalo [desde, n 1] tal que T[desde, i] es una tabla cuyos datos están ordenados de menor a mayor valor. int fintramoordenado(const double T[], const int n, const int desde) { int fintramo = desde; while (fintramo < n 1 && T[finTramo] <= T[finTramo+1]) { // Los datos de T[desde, fintramo + 1] están ordenados de menor a mayor fintramo++; // Los datos de T[desde, fintramo] están ordenados de menor a mayor // fintramo >= n 1 T[finTramo] > T[finTramo+1] // Los datos de T[desde, fintramo] están ordenados de menor a mayor // o no hay siguiente componente, o su valor es mayor que la de T[finTramo] return fintramo; Pre: n > 0 y T tiene al menos n componentes. Post: Sea T[i, j] la subtabla de T[0, n 1] que almacena un mayor número de datos ordenados de menor a mayor valor: T[i] <= T[i+1], T[i+1] <= T[i+2],..., T[j 1] <= T[j]. Se ha asignado a desde el valor del índice i y a hasta el del índice j. void tramoordenado(const double T[], const int n, int& desde, int& hasta) { // Establecimiento del primer intervalo ordenado desde = 0; hasta = fintramoordenado(t, n, 0); // Establecimiento del inicio del siguiente intervalo ordenado int nuevodesde = hasta + 1; while (nuevodesde < n) { // Establecimiento del final del siguiente intervalo ordenado int nuevohasta = fintramoordenado(t, n, nuevodesde); // Determinación de si el último intervalo ordenado tiene mayor longitud // que el mayor hasta el momento if (nuevohasta nuevodesde > hasta desde) { desde = nuevodesde; hasta = nuevohasta; // Establecimiento del inicio del siguiente intervalo ordenado nuevodesde = nuevohasta + 1; 6

Una solución del problema 3 o Un dato del tipo ListaOrdenada almacena una secuencia de datos de tipo int, con capacidad máxima CAPACIDAD MAXIMA. La lista se gestiona en función del valor de los datos almacenados en ella. Cuando se retira un dato de la lista, el dato retirado es siempre el de menor valor. struct ListaOrdenada { // Número de elementos de la lista ordenada int numelementos; // Los elementos de la lista están almacenados en elemento[0, numelementos 1] // y están ordenados de menor a mayor valor: elemento[0] <= elemento[1], // elemento[1] <= elemento[2],..., elemento[numelementos 2] // <= elemento[numelementos 1] int elemento[capacidad MAXIMA]; ; Fichero listaordenada. cc de implementación del módulo listaordenada #include listaordenada. h Pre: Post: Devuelve una lista ordenada sin ningún elemento ListaOrdenada crear () { ListaOrdenada LO; LO.numElementos = 0; return LO; Pre: numelementos(l) < CAPACIDAD MAXIMA Post: Añade nuevo como nuevo elemento de la lista ordenada LO void insertar (ListaOrdenada& LO, const int nuevo) { bool encontrado = false ; int i = 0; while (! encontrado && i < LO.numElementos) { if (LO.elemento[i] > nuevo) { encontrado = true; else { i = i + 1; if (encontrado) { for ( int j = LO.numElementos 1; j >= i; j) { LO.elemento[j+1] = LO.elemento[j ]; LO.elemento[i] = nuevo; else { LO.elemento[LO.numElementos] = nuevo; 7

LO.numElementos = LO.numElementos + 1; Pre: numelementos(l) > 0 Post: Elimina de la lista ordenada LO el menor de sus elementos void retirar (ListaOrdenada& LO) { for ( int i = 1; i < LO.numElementos; ++i) { LO.elemento[i 1] = LO.elemento[i ]; LO.numElementos = LO.numElementos 1; Pre: i >= 1 y i <= numelementos(lo) Post: Devuelve el valor de su i ésimo menor elemento int consultar (const ListaOrdenada& LO, const int i ) { return LO.elemento[i 1]; Pre: Post: Devuelve el número de elementos de la int numelementos (const ListaOrdenada& LO) { return LO.numElementos; lista ordenada LO 8