Ejerc Punteros

Anuncio
Laboratorio de Programación II. Grupo C
PRACTICA 3: FUNCIONES Y PUNTEROS(I)
EJERCICIO GUIADOS
Ejercicio 1
Se va a implementar una sencilla función que calcule el área de un triángulo. Para calcular
el área de un triángulo es necesario conocer la base y la altura. Estos dos datos se deben
pedir al usuario y luego calcular el área por medio de la función. Probar el siguiente código:
#include <iostream.h>
float AreaTriangulo( float , float );
void main(void)
{
float base,alt;
cout << "Escribe la base: " ;
cin >> base;
cout << "Escribe la altura: " ;
cin >> alt;
cout << "El area del triangulo es: " << AreaTriangulo(base,alt);
}
float AreaTriangulo( float b, float h)
{
float tmp = b*h/2.0;
return tmp;
}
Ejercicio 2
En este ejercicio se va a hacer uso de algunas funciones definidas en el estándar del C++
para obtener los datos de fecha y hora del PC. Probar el código siguiente:
#include <iostream.h>
#include <time.h>
void ImprimeHora(void);
void Delay(double seg);
void main(void)
{
ImprimeHora();
Delay(2.5); //retardo de 2.5 seg.
ImprimeHora();
}
void ImprimeHora(void)
{
long t1;
tm *mihora; //estructura para time
time(&t1); //obtener los datos actuales (en long)
mihora = localtime(&t1); //convierte long a struct tm
cout << "Fecha: " << mihora->tm_mday << "/" ;
cout << mihora->tm_mon+1<<"/"<<mihora->tm_year+1900;
cout << " Hora: " << mihora->tm_hour << ":" ;
cout << mihora->tm_min << ":“ <<mihora->tm_sec << endl;
}
void Delay(double seg)
{
long start;
long end;
time(&start);
end = start;
while( difftime(end,start) < seg){
time(&end);
}
1
Laboratorio de Programación II. Grupo C
}
Explicación:
1. Todas las funciones se encuentran definidas en el fichero time.h, el cual se debe incluir
al comienzo del programa.
2. La función time(long&) obtiene en una variable del tipo long un valor que representa la
fecha y hora a partir del 1 de enero de 1900. Se le debe pasar la dirección de la variable
(&t1), ya que la función tiene que escribir el dato.
3. El valor obtenido con time() se introduce como parámetro a la función localtime(), la
cual se encarga de convertir ese long en “algo más inteligible” La función devuelve un
puntero a una estructura tm (por eso se define tm *mihora) definida en el fichero time.h,
que tiene los siguientes miembros:
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
};
4. Una vez que se tiene la estructura, se puede sacar la hora, minutos, segundos, día, etc.,
por medio de los miembros de la estructura.
5. Existe también una función difftime(time1, time2) que obtiene la diferencia de dos
tiempos, la cual se utiliza para medir el tiempo que ha transcurrido entre una operación y
otra. En el caso del ejemplo, se usa para crear una función delay() que hace que el
programa se quede en un bucle while un tiempo determinado, dado como argumento a
delay(double seg).
Ejercicio 3
Tomando como contexto el cálculo de la posición de un cuerpo en caída libre y la ecuación
que rige este movimiento es:
y=h-(g*t2 / 2.0) donde h: altura inicial(metros)
g: 9.81 m/s2
se pide implementar un programa que saque por la consola las posiciones del cuerpo para
un determinado diferencial de tiempo (dt), hasta que el cuerpo llegue a la superficie.
Los datos que el usuario debe dar son dos:
1) Altura de la caída del cuerpo (en metros.).
2) Diferencial de tiempo para el cálculo (en milisegundos).
El esqueleto del programa podría ser el siguiente:
#include <iostream.h>
#include <math.h>
void Calcula(float alt, float dt);
void main(void)
{
2
Laboratorio de Programación II. Grupo C
float alt, dt;
cout << "Escribe la altura de la caida: " ;
cin >> alt;
cout << "Escribe el dt(ms) para el calculo: " ;
cin >> dt;
Calcula(alt,dt);
}
void Calcula(float alt, float dt)
{
//escribir el código de la función
}
Recordar que el tiempo al inicio es cero. Luego va incrementando de acuerdo a lo que el
usuario ha especificado, por medio de dt.
EJERCICIO PROPUESTOS
Ejercicio 1
Se pide crear una función AreaCirculo, la cual recibirá como único argumento el radio del
círculo (que se debe pedir al usuario) y devolverá el área calculada. Recordar que se debe
definir la función y declararla.
Ejercicio 2
3
Laboratorio de Programación II. Grupo C
Se pide crear un programa que pida una serie de números al usuario y halle el máximo, el
mínimo y la media aritmética de ellos. Para ello se debe crear una variable puntero tipo
float , pedir al usuario que introduzca el número de datos, y después los datos a calcular.
Recordar que se debe reservar memoria de forma dinámica para almacenar el vector de
dato. La salida del programa debe ser algo así:
Numero de datos: 10
Máximo: 25
Minimo: 4
Media Aritmética: 14.6
Ejercicio 3
Se pide crear un programa que permita trabajar sumar, restar y multiplicar dos números
complejos. Para lo cual se debe crear una estructura Complejo de la forma:
struct Complejo{
float real;
float imag;
};
El programa debe pedir al usuario que seleccione de un menú la operación que desea
realizar: sumar, restar o multiplicar dos complejos y como resultado debe mostrar el
complejo resultante, su módulo y su fase. Se puede usar la función getch() para capturar la
tecla presionada o usar cin para pedir que elija la opción el usuario y se deberán utilizar las
funciones matemáticas ( sqrt(), atan() ) que se encuentran definidas en el fichero math.h.
Ejercicio 4
Realizar un programa mediante el uso de funciones para controlar las plazas de un
aparcamiento. El aparcamiento dispone de 24 plazas de dos tamaños diferentes: 14
pequeñas y 10 grandes con la disposición que se muestra a continuación:
G G G G G G G G G G
1 2 3 4 5 6 7 8 9 10
P P P P P P P P P P P P P P
1 2 3 4 5 6 7 8 9 10 11 12 13 14
La asignación se realizará automáticamente según el tamaño del vehículo que se quiere
aparcar con el siguiente algoritmo:
-Cada vehículo solamente ocupará una plaza.
-Un vehículo pequeño siempre ocupará una plaza pequeña, salvo que estén todas
ocupadas y exista alguna grande libre.
-Un vehículo grande sólo puede aparcar en una plaza grande. Si todas están ocupadas no
podrá aparcar aunque estén todas las pequeñas libres.
-De todas las plazas libres, siempre se ocupará primero la de número menor.
El programa tendrá un menú con 4 opciones básicas: Aparcar coche, Retirar coche, Ver
situación del parking y Terminar. Además observar que en la información que se introduce
al programa se debe concretar:
Entrada: es necesario indicar el tamaño del coche (P/G).
Salida: es necesario indicar la plaza que se deja libre. Por ejemplo P 5.
Situación del aparcamiento: indicando las plazas libres y las ocupadas.
4
Laboratorio de Programación II. Grupo C
Ejercicio 5
Realizar un programa mediante el uso de funciones que simule un cajero automático de
monedas. Los tipos de monedas que dispone el cajero son de 1,5,25,50,100 y 500 pesetas.
Inicialmente el cajero tiene 100 monedas de cada tipo, que se van consumiendo para
proporcionar las cantidades solicitadas. El cajero debe obtener la cantidad solicitada con los
tipos de moneda que tenga en cada momento, tratando siempre de utilizar las monedas de
mayor valor. El programa debe tener un menú con tres opciones: Pedir dinero al cajero, Ver
estado del cajero o Salir del programa.
Observar que el cajero no puede dar más dinero del que tiene.
Ejercicio 6
Este ejercicio consiste en calcular el valor del Seno de un ángulo X, cuyo desarrollo en
serie es:
sen(x)=x-(x3/3!)+(x5/5!)-(x7/7!)+… (x en radianes)
Este ejercicio se va a desarrollar en dos partes:
1. Hacer una función seno1 que reciba como argumentos el ángulo y el número de
iteraciones y tiene que devolver el valor de la serie como double. La declaración de dicha
función puede ser de la siguiente manera.
double seno1( double x, int N )
2. Hacer otra función seno2 que reciba como argumentos el ángulo, el error entre una
iteración y otra y un puntero a una variable entera para que devuelva el número de
iteraciones empleadas. La declaración de esta función puede ser de la siguiente manera:
double seno2( double x, double error, int *num)
Para probar las funciones crear un main().
Ejercicio 7
En este ejercicio se va a hallar el valor de la función ex, utilizando los dos criterios de
terminación:
1. Por número de iteraciones.
2. Por error entre una iteración y otra.
El desarrollo en series de ex es:
ex=1+(x/1!)+(x2/2!)+(x3/3!)+…
Recordar que en el caso del criterio de terminación Nº2 se debe devolver y sacar por la
consola el número de iteraciones empleadas para el cálculo. Se puede usar la función
exp(x), definida en math.h, de la librería estándar del C++, para contrastar los resultados.
Ejercicio 8
Se pide crear implementar un programa mediante las funciones que sean necesarias que
simule una pequeña calculadora que realizas las cuatro operaciones básicas (suma, resta,
multiplicación y división) tiene 4 posiciones de memoria (A, B, C y D) para guardar
resultados intermedios y además indica los errores que se producen al introducir las
operaciones a realizar. Se pueden introducir todas las operaciones que se necesiten
separadas por punto y coma (;). Cada operación está formada por el primer operando, el
correspondiente operador (+,-,*,/) y el segundo operando. Un operando puede ser
5
Laboratorio de Programación II. Grupo C
cualquiera de las 4 posiciones de memoria o un valor numérico. Los valores numéricos se
indican mediante una secuencia de dígitos del 0 al 9 sin blancos ni ningún otro carácter
entre ellos. El resultado de una operación se puede guardar en una posición de memoria
indicándolo a continuación de la operación con el símbolo (->) seguido de la posición (A,
B, C, D). Se finaliza el programa con un punto (.). El programa detecta errores en los
operandos, en los operadores y la falta de algunos de los símbolos necesarios. La salida del
programa debe ser algo así:
¿Cálculo?
23+56 -> A;
A*5 -> B;
H
Error 1: Operando (Número o Variable)
¿Cálculo?
12+P
Error 1: Operando (Número o Variable)
¿Cálculo?
12+450M
Error 5: Falta punto y coma
¿Cálculo?
A+B;
A-B.
La variable A mantiene el valor ….
La variable B mantiene el valor …
La variable C mantiene el valor….
La variable D mantiene el valor….
¿Cálculo?
ENTREGA DE LOS EJERCICIOS
La forma de entregar la práctica será a través de la asignatura virtualizada en el campus virtual. En la
asignatura virtualizada verás una serie de enlaces, entre ellos, hay uno titulado como prácticas. Navega sobre
dicho enlace, y verás que hay un grupo con los apellidos de los integrantes de los grupos. Dicho grupo de
trabajo tiene asociado una carpeta sobre la que puedes subir , eliminar o editar archivos(Accedes usando
Editar Archivos). Zippea el trabajo correspondiente, y dentro del zip incluye un archivo de texto en que
aparezcan los nombres de los que formáis el grupo. Etiqueta el archivo zip con el nombre
LabnApellidoApellido.zip. Por ejemplo si Juan Martínez Martin y Silvia Pérez García están en el laboratorio
1, y forman un grupo etiquetan su zip como Lab1MartinezPerez.zip. A continuación usa la opción cargar
que hay en la parte derecha del área donde te encuentras, y te permitirá subir archivos desde tu disco duro.
Almacénalo en la carpeta correspondiente al grupo al que perteneces.
Tenéis de plazo para subir la correspondiente práctica 3 hasta este viernes día 26 de Noviembre. Acabado el
plazo no se podrán subir las prácticas, y se considerará como práctica no entregada. Si tienes alguna duda o
problema sobre el procedimiento de entrega no dudes en preguntar.
6
Descargar