LENGUAJES DE PROGRAMACIÓN. Solución al Trabajo Práctico - Junio de 2015

Documentos relacionados
LENGUAJES DE PROGRAMACIÓN. Trabajo Práctico - Junio de 2015

LENGUAJES DE PROGRAMACIÓN. Solución al Trabajo Práctico - Septiembre de 2016

LENGUAJES DE PROGRAMACIÓN. Solución al Trabajo Práctico - Septiembre de 2017

LENGUAJES DE PROGRAMACIÓN. Solución al examen de Septiembre 2014

LENGUAJES DE PROGRAMACIÓN. Solución al Trabajo Práctico - Junio de 2014

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

LENGUAJES DE PROGRAMACIÓN. Solución al examen de Septiembre 2015

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

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

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

LENGUAJES DE PROGRAMACIÓN. Solución al Trabajo Práctico - Septiembre de 2012

LENGUAJES DE PROGRAMACIÓN. Solución al examen de Junio 2012, Segunda Semana

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

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

LENGUAJES DE PROGRAMACIÓN. Solución al examen de Septiembre 2016

LENGUAJES DE PROGRAMACIÓN. Solución al examen de Septiembre 2017

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

LENGUAJES DE PROGRAMACIÓN. Pregunta 1 (3 puntos)

LENGUAJES DE PROGRAMACIÓN. Solución al Trabajo Práctico - Junio de 2018

LENGUAJES DE PROGRAMACIÓN. Solución al Trabajo Práctico - Septiembre de 2015

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

LENGUAJES DE PROGRAMACIÓN. Pregunta 1 (3 puntos)

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

LENGUAJES DE PROGRAMACIÓN. Pregunta 1 (3 puntos)

LENGUAJES DE PROGRAMACIÓN. Trabajo Práctico - Septiembre de 2017

LENGUAJES DE PROGRAMACIÓN. Trabajo Práctico - Junio de 2016

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

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

LENGUAJES DE PROGRAMACIÓN. Trabajo Práctico - Septiembre de 2012

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

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

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

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

Examen escrito de Programación 1

Variables y tipos básicos 1. Definir una variable de tipo char. Convertirla a una variable de tipo entera e imprimir su valor asociado.

Examen escrito de Programación 1

Examen de prácticas de Programación 1

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

Fundamentos de la programación

Hoja de ejercicios del Tema 3

Hoja de ejercicios del Tema 3

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

LENGUAJES DE PROGRAMACIÓN Ejercicio de autocomprobación 2. Pregunta 1 (1 punto) Pregunta 2 (1 punto)

PRUEBA DE FUNDAMENTOS DE INFORMÁTICA. 1.- Qué se mostrará por pantalla tras ejecutar el código correspondiente a la función main?

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 1. Problemas de tratamiento de información, algoritmos y programas

8. Vectores (arrays)

Especificación IEEE-754, para representar valores decimales en punto flotante de simple precisión.

Programación 1 Tema 5. Instrucciones simples y estructuradas

Vectores y Matrices. Dept. Ciencias de la Computación e I.A. Universidad de Granada

Soluciones al Examen de Fundamentos de Computadores y Lenguajes

Programación 1. Tema V Clase de problemas. Desarrollo de un módulo de biblioteca C++ para trabajar con conjuntos de letras

PROGRAMACIÓN ORIENTADA A OBJETOS

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

Programación 1 Tema 5. Instrucciones simples y estructuradas

Introducción a C++ Algoritmos y Estructuras de datos II Dra. Carmen Mezura Godoy. Febrero 2009

Introducción a c++ Introducción a la programación EIS Informática III

CONDICIONALES SWITCH CASE DEFAULT BREAK EN C. ELEGIR ENTRE VARIAS OPCIONES. EJEMPLO. (CU00532F)

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

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

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

EJEMPLOS Y EJERCICIOS

Tema 4. Control de flujo. Programación Programación - Tema 4: Control de Flujo

Programación: Estructuras de Control

Programación 1 Tema 2. Lenguaje de programación y ejecución de un programa

Lenguaje de Programación: C++ Repaso de Material C++

Ejercicios Tema 6. Funciones

Codificación en C. Como pasar de Pseudocódigo a C (con pequeños trucos de C++)

Fundamentos de Programación

Elementos de un programa en C

Sentencias de control. Condiciones

ALMACENAMIENTO PERSISTENTE DE DATOS

Soluciones del Examen de Fundamentos de Computadores y Lenguajes

Programación de Ordenadores

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

Cálculo del histograma de una imagen

EJERCICIOS PARA EMPEZAR CON PHP

Examen escrito de Programación 1

Estructuras de Decisión Simples y Dobles

Examen de Introducción al Software (Ingeniería Informática)

Soluciones al Examen de Fundamentos de Computadores y Lenguajes

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Impresión por pantalla. 3. Indicar la salida por pantalla (2 puntos-20 minutos)

INTRODUCCION A LA SIMULACION DE MODELOS. Simulación es la descripción de un sistema a través de modelos que se pueden aplicar a varias disciplinas.

Programación. Ejercicios Tema 6 Tipos de Datos Estructurados: Vectores y Matrices

LABORATORIO 10 FICHEROS EN EL LENGUAJE C

Tema 3. Estructuras de control

Una clasificación de los tipos de datos existentes en los diferentes lenguajes de programación se presenta a continuación:

Programación Concurrente y Distribuida Ingeniería Informática Facultad de Ciencias Universidad de Cantabria.

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

Introducción al lenguaje C

Entrada de ejemplo

Instituto Tecnológico de Celaya

Examen Junio- Grupo B Lunes 17 de Junio - Programación en C++ Pág. 1

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Desarrollo de Programas. Prof. Lisbeth C. Pérez Rivas

Programación 1 Tema III Clase de problemas. Diseño de algoritmos que extraen información de ficheros de texto (1)

Introducción a la Programación

Introducción 1. Fundamentos C++ //programa para imprimir texto #include <iostream>

EXPOSICIÓN UNIDAD II

Fundamentos de Informática Examen 18 de Septiembre de 2006 Mecánica y Electricidad

Transcripción:

Solución al Trabajo Práctico - Junio de 2015 EJERCICIO 1 Uno de los primeros generadores combinados de números pseudoaleatorios fue el propuesto por Wichmann y Hill en 1982. El generador de Wichmann-Hill emplea los siguientes tres generadores lineales congruenciales para obtener tres números enteros {x i,y i,z i : x i = (171 x i 1 ) mód 30269 y i = (172 y i 1 ) mód 30307 z i = (170 z i 1 ) mód 30323 de los cuales se obtiene un número pseudoaleatorio u i en el intervalo (0,1): u i = ( xi 30269 + y i 30307 + z ) i 30323 mód 1 donde i = 1,2,... La semilla de este generador son tres números enteros, {x 0,y 0,z 0, que deben estar comprendidos entre 1 y 30000. Escriba un programa en C++ que realice las acciones siguientes: 1. Solicitar al usuario que introduzca por consola la semilla del generador. 2. Comprobar que estos tres números están comprendidos entre 1 y 30000. Si no lo están, el programa vuelve a solicitar por consola los números al usuario.

3. Empleando el algoritmo de Wichmann-Hill, obtener 100 números pseudoaleatorios e ir almacenándolos en un array de 100 componentes. 4. Mostrar en la consola el contenido del array. Los números deberán mostrarse en formato fijo, con 5 dígitos detrás del punto decimal. 5. Almacenar los números, en el formato anteriormente indicado y formando una única columna (es decir, un número por fila), en un fichero de texto llamado random.txt. 6. Terminar. 2 Dpto. de Informática y Automática, UNED

SOLUCIÓN AL TRABAJO PRÁCTICO - JUNIO DE 2015 Solución al Ejercicio 1 // Fichero: random.cpp #include <iostream> #include <cmath> #include <iomanip> #include <fstream> #include <string> const unsigned intn =100; const intc1=171,m1 =30269; const intc2=172,m2 =30307; const intc3=170,m3 =30323; conststd::string nombrefich ="random.txt"; intmain() { intxt,yt,zt; // Entrada semilla por consola (enteros entre 1 y 30000) do { std::cout <<"Introduzca 3 valores enteros:"<< std::endl; std::cin >> Xt >> Yt >> Zt; while (Xt<1 Xt>30000 Yt<1 Yt>30000 Zt<1 Zt>30000); // Generador de Wichman-Hill double U_RH[N]; for (unsigned inti=0;i<n;i++) { Xt = (c1*xt) %m1; Yt = (c2*yt) %m2; Zt = (c3*zt) %m3; U_RH[i] =fmod( ((double)xt)/m1 + ((double)yt)/m2 + ((double)zt)/m3,1); // Muestra resultado en consola for (unsigned inti=0;i<n;i++) { std::cout <<"u["<<i <<"]: "<< std::fixed << std::setprecision(5) << U_RH[i] << std::endl; // Apertura fichero para escritura std::ofstream outfich(nombrefich.c_str(), std::ios::out std::ios::trunc); if (!outfich) { std::cout <<"ERROR al abrir fichero"<< std::endl; // Graba resultado en fichero for (unsigned inti=0;i<n;i++) { outfich << std::fixed << std::setprecision(5) << U_RH[i] << std::endl; outfich.close(); return0; Código 1.1: Solución al Ejercicio 1. Dpto. de Informática y Automática, UNED 3

EJERCICIO 2 Escriba un programa en C++ que, a partir de una secuencia de 2 N números pseudoaleatorios, obtenga N = 45 posiciones aleatorias uniformemente distribuidas sobre una superficie plana rectangular de longitud L = 30 mm y altura A = 2 mm. Para ello, el programa debe realizar las acciones siguientes: 1. El número de posiciones N, así como la longitud (L) y altura (A) de la superficie, son constantes del programa: N = 45, L = 30, A = 2. 2. Abrir para lectura un fichero de texto llamado random.txt, en el cual hay escrita una columna de números pseudoaleatorios. Estos números pueden ser los obtenidos de ejecutar el programa del ejercicio anterior o cualquier otra secuencia de números pseudoaleatorios. 3. Almacenar el contenido completo del fichero en un vector de double llamadorandomnums. 4. Si el vector contiene menos de 2 N componentes, mostrar un mensaje de error y terminar. 5. Operar de la forma siguiente los primeros2 N números del vector. Por cada pareja de números, {u 2i,u 2i+1, calcular una posición aleatoria {x i,y i de la forma siguiente: x i = L u 2i y i = A u 2i+1 donde i = 0,...,N 1. 6. Almacenar las posiciones en un fichero de texto llamado posiciones.txt. Deberán almacenarse en dos columnas: en la primera las posiciones x i y en la segunda las correspondientes posicionesy i. Deberán expresarse en formato fijo, con 3 dígitos detrás del punto decimal. 7. Terminar. 4 Dpto. de Informática y Automática, UNED

SOLUCIÓN AL TRABAJO PRÁCTICO - JUNIO DE 2015 Solución al Ejercicio 2 // Fichero: posicaleat.cpp #include <iostream> #include <iomanip> #include <fstream> #include <string> #include <vector> const unsigned intn =45; const doublel =30; const doublea =2; conststd::string nombrefichi ="random.txt"; conststd::string nombreficho ="posiciones.txt"; intmain() { // Apertura del fichero para lectura std::ifstream infich(nombrefichi.c_str(), std::ios::in); if (!infich) { std::cout <<"ERROR al abrir fichero"<< std::endl; // Lectura de datos del fichero e inclusión en vector std::vector<double> randomnums; while (!infich.eof()) { double rn; infich >>rn; randomnums.push_back(rn); infich.close(); // Comprobar que el vector contiene al menos 2*N elementos if (randomnums.size()<2*n) { std::cout <<"Error: el fichero contiene " << randomnums.size() <<"elementos y deberia contener al menos " << 2*N << std::endl; // Apertura del fichero para escritura std::ofstream outfich(nombreficho.c_str(), std::ios::out std::ios::trunc); if (!outfich) { std::cout <<"ERROR al abrir fichero"<< std::endl; for (unsigned inti=0;i<2*n;i+=2) { outfich << std::fixed << std::setprecision(3) << L*randomNums[i] <<"\t"<< A*randomNums[i+1] << std::endl; outfich.close(); return0; Código 1.2: Solución al Ejercicio 2. Dpto. de Informática y Automática, UNED 5

EJERCICIO 3 Considérense N = 45 círculos de radio r = 0.5 mm distribuidos aleatoriamente sobre una superficie rectangular del = 30 mm de longitud ya = 2 mm de altura. Los círculos que se encuentran sobre la superficie se agrupan en conjuntos de la manera siguiente: Cada círculo debe pertenecer a un único conjunto. Dos círculos entre los cuales existe solapamiento deben estar en el mismo conjunto. Se considera que existe solapamiento entre dos círculos si la distancia entre sus centros es menor o igual que2 r. Escriba un programa en C++ que cumpla las especificaciones siguientes: El número de círculos (N) y su diámetro (2 r) deben ser constantes del programa. El programa debe leer las posiciones de los centros de los N círculos de un fichero de texto llamado posiciones.txt, que contiene dos columnas de números reales expresados en formato fijo, con 3 dígitos detrás del punto decimal. Los números de la primera columna son la coordenada x del centro del círculo y los de la segunda columna la correspondiente coordenada y. Este fichero podría ser, por ejemplo, el obtenido al ejecutar el programa escrito en el ejercicio anterior. Si el fichero posiciones.txt contiene menos de 2 N números, el programa debe mostrar un mensaje de error y terminar. El programa debe agrupar los círculos en conjuntos. Cada conjunto está compuesto por uno o más círculos. El programa debe escribir en un fichero de texto llamado nelemconj.txt el número de círculos de que consta cada conjunto. Los números se escribirán formando una columna. El orden de escritura de los números es irrelevante. Puede usar en el programa las estructuras de datos que estime convenientes. La figura mostrada a continuación es un ejemplo que pretende ilustrar la clasificación de los círculos en conjuntos. Por simplicidad en este ejemplo se consideran 6 Dpto. de Informática y Automática, UNED

SOLUCIÓN AL TRABAJO PRÁCTICO - JUNIO DE 2015 C 7 C 6 C 1 C 3 C 2 C 13 C 11 C 12 C 4 C 9 C 10 C 15 C 8 C 14 C 5 Figura 1.1: Los círculos mostrados en esta figura se clasifican en 5 conjuntos: {C 7, {C 2,C 11,C 9,C 15,{C 6,C 1,C 13,C 4,C 10,{C 3,C 12,{C 8,C 14,C 5 sólo N = 15 círculos. Los círculos se han etiquetado C 1,..., C 15 con el propósito de facilitar referirse a ellos al indicar los círculos pertenecientes a cada conjunto. Dados los conjuntos del ejemplo mostrado en la Figura 1.1, la salida del programa debería ser los números siguientes escritos en cualquier orden en una columna: 1, 4, 5, 2, 3. Dpto. de Informática y Automática, UNED 7

Solución al Ejercicio 3 // Fichero: circulos.cpp #include<iostream> #include<fstream> #include<string> #include<vector> #include<cmath> const unsigned intn =45; const doubler2 =2*0.5; conststd::string nombrefichi ="posiciones.txt"; conststd::string nombreficho ="nelemconj.txt"; structcirculo { double xpos; double ypos; int iconjunto; // Campo que indica el conjunto del circulo ; intmain() { // Apertura del fichero de posiciones para lectura std::ifstream infich(nombrefichi.c_str(), std::ios::in); if (!infich) { std::cout <<"ERROR al abrir fichero " << nombrefichi << std::endl; // Carga de N circulos en el vector std::vector<circulo> circulos; while (!infich.eof() &&circulos.size()<n ) { // Coordenadas del centro Circulo c; infich >>c.xpos >>c.ypos; c.iconjunto =0; circulos.push_back(c); infich.close(); // Comprueba que se hayan leido 2*N valores del fichero if (circulos.size()<n ) { std::cout <<"ERROR: el fichero "<< nombrefichi << " contiene menos de "<<2*N <<" valores"<<std::endl; Código 1.3: Solución al Ejercicio 3 (parte inicial). 8 Dpto. de Informática y Automática, UNED

SOLUCIÓN AL TRABAJO PRÁCTICO - JUNIO DE 2015 // Asigna valor al campo iconjunto intnconjunto =1; for (inti=0;i<circulos.size();i++) { if (circulos[i].iconjunto ==0) { circulos[i].iconjunto =nconjunto; nconjunto++; for (intj=i+1;j<circulos.size();j++) { // Distancia entre los centros de los círculos i y j doubled =pow(pow(circulos[i].xpos-circulos[j].xpos,2) + pow(circulos[i].ypos-circulos[j].ypos,2), 0.5); if (d <=r2 ) { // Los círculos i y j solapan if (circulos[j].iconjunto!=0 ) { // Si j pertenece a un grupo inticonjuntoalias =circulos[j].iconjunto; // Todos los circulos del grupo de j pasan a ser del grupo de i for (intk=0;k<circulos.size();k++) if (circulos[k].iconjunto ==iconjuntoalias ) circulos[k].iconjunto =circulos[i].iconjunto; else { // j no pertenece todavía a ningún grupo // El círculo j pasa a ser del grupo del círculo i circulos[j].iconjunto =circulos[i].iconjunto; // Apertura del fichero para escritura std::ofstream outfich(nombreficho.c_str(), std::ios::out std::ios::trunc); if (!outfich) { std::cout <<"ERROR al abrir fichero" << nombreficho << std::endl; // Cuenta el número de elementos de cada conjunto y salida for (intic=1;ic<nconjunto;ic++) { intnelem =0; for (inti=0;i<circulos.size();i++ ) if (circulos[i].iconjunto ==ic ) nelem++; if (nelem >0 ) outfich <<nelem <<std::endl; outfich.close(); return0; Código 1.4: Solución al Ejercicio 3 (parte final). Dpto. de Informática y Automática, UNED 9

EJERCICIO 4 Escriba un programa en C++ que calcule la frecuencia con la que aparece cada número de un determinado conjunto de números naturales. Por ejemplo, dado el conjunto {2,1,1,2,4,1,1,1, el programa debe obtener que la frecuencia del número 1 es 5/8 (cinco de los ocho números tienen valor 1), la frecuencia del número 2 es 2/8 (dos de los ocho números tienen valor 2) y la frecuencia del número 4 es1/8 (uno de los ocho números tiene valor 4). El conjunto de números naturales se encuentra almacenado en un fichero de texto llamado nelemconj.txt. Los números están escritos formando una única columna. El programa debe leer el contenido del fichero, calcular la frecuencia de cada número natural, mostrar el resultado en la consola y terminar. El resultado debe mostrarse en dos columnas: en la primera los números, ordenados crecientemente, y en la segunda su frecuencia, expresada como fracción. En el ejemplo anterior, la salida del programa debería ser: 1 5/8 2 2/8 4 1/8 Solución al Ejercicio 4 // Fichero: histograma.cpp #include<iostream> #include<fstream> #include<string> #include<vector> conststd::string nombrefichi ="nelemconj.txt"; structbarrahistograma { intvalor; intnumvecesaparece; ; Código 1.5: Solución al Ejercicio 4 (parte inicial). 10 Dpto. de Informática y Automática, UNED

SOLUCIÓN AL TRABAJO PRÁCTICO - JUNIO DE 2015 intmain() { // Apertura del fichero para lectura std::ifstream infich(nombrefichi.c_str(), std::ios::in); if (!infich) { std::cout <<"ERROR al abrir fichero " << nombrefichi << std::endl; // Lectura del fichero y cálculo frecuencia std::vector<barrahistograma> hist; intnumtotalvalores =0; while (!infich.eof() ) { intnum; infich >>num; if (infich.eof()) break; numtotalvalores++; bool encontrado = false; for ( inti=0;!encontrado &&i<hist.size();i++ ) { if (hist[i].valor ==num ) { hist[i].numvecesaparece++; encontrado = true; if (!encontrado ) { barrahistograma bh = {num,1 ; hist.push_back(bh); infich.close(); if (hist.size()>1 ) { // Ordenación del vector y salida bool desordenado = true; while (desordenado) { desordenado = false; for (inti=0;i<hist.size()-1;i++) { if (hist[i].valor >hist[i+1].valor ) { desordenado = true; barrahistograma bh =hist[i+1]; hist[i+1] =hist[i]; hist[i] =bh; for (unsigned inti=0;i<hist.size();i++) std::cout << hist[i].valor <<"\t"<< hist[i].numvecesaparece <<"/"<< numtotalvalores << std::endl; else { std::cout <<"El fichero no contiene numeros" << std::endl; return0; Código 1.6: Solución al Ejercicio 4 (parte final). Dpto. de Informática y Automática, UNED 11