EJERCICIOS TEMA 1 1. Supongamos el siguiente fragmento de código: int unidades; unidades=leerUnidades(); if(unidades<20) { float precio_final=unidades*140; } else { float precio_final=unidades*120; } cout<<”El precio final es:”<<precio_final; ¿Es correcta la utilización de las variables? 2. Tenemos una variable de tipo int llamada unidades, y queremos pasarla como parámetro a una función llamada modificarUnidades, la cual cambiará el valor del parámetro. Escribe la llamada a la función y su cabecera en los siguientes dos casos: a) Con un paso de parámetros mediante punteros. b) Con un paso de parámetros mediante referencias. 3. Dada la siguiente variable: struct Pieza { int codigo; int precio; } nueva_pieza; Escribe una función que reciba como parámetro un struct Pieza y pida al usuario los valores de sus campos. Escribe también la llamada a dicha función pasándole la variable nueva_pieza. Escribe dos versiones, una con punteros, y otra con referencias. 4. ¿Cuál de las siguientes funciones es incorrecta? int funcion1 (int x, float f=6.0) { …. } int funcion2 (int x=1, float f) { … } 5. Dada la siguiente función: inline float distanciaEuclidea(float x0, float y0, float x1, float y1) { return sqrt(pow(x0-x1, 2)+pow(y0-y1, 2));1 } ¿cómo se transformaría la siguiente instrucción al expandir el compilador la función inline? distancia = distanciaEuclidea (p0.x, p0.y, p1.x, p1.y); 1 La función pow eleva el primer parámetro a la potencia indicada por el segundo parámetro. 6. ¿Cuál de las siguientes respuestas es correcta a cerca de la sobrecarga de funciones? La sobrecarga de funciones consiste en: a. Definir varias funciones con el mismo nombre y los mismos parámetros. b. Definir varias funciones con el mismo nombre, pero con diferentes parámetros. c. Definir varias funciones con el mismo nombre y los mismos parámetros, pero con distinto tipo de retorno. d. Definir varias funciones con distinto nombre, pero con los mismos parámetros. 7. ¿Cómo definirías (crearías) con memoria dinámica una variable de tipo Pieza (ver ejercicio 3)? ¿Y un vector dinámico de Piezas con tamaño 10? ¿Cómo serían las instrucciones que liberarían las anteriores reservas de memoria? 8. Dados los siguientes tipos de datos: struct NodoLista { string nombre; nodoLista *sig; }; struct ListaPersonal { NodoLista *cap; // Cabeza de la lista }; ¿Cómo completarías la siguiente función para que permitiese insertar un nuevo nombre de persona al principio de la lista ListaPersonal? void insercionInicio (ListaPersonal &l, string name) {…} 12. Completa la siguiente función para que muestre por la salida estándar el contenido de una variable de tipo ListaPersonal: void mostrar (const ListaPesonal & l) {…} 13. Completa la siguiente función para que se libere el contenido de una variable de tipo ListaPersonal: void liberar (const ListaPesonal & l) {…} 14. Dados los tipos de datos NodoLista y ListaPersonal, y el siguiente programa: …// Declaración de tipos de datos y prototipos int main () { ListaPersonal l1, l2; // Declaración de dos listas insercionInicio (l1, “Juan García”); insercionInicio (l1, “Luis Montoya”); copiarLista (l2, l1); // Hace un duplicado de l1 sobre l2 liberar (l1); mostrar (l2); return 0; } void copiarLista ( ListaPersonal &ld, const ListaPersonal &lo) { ld.cap=lo.cap; } a. ¿Crees que falta hacer algo antes de llamar a la función insercionInicio? b. ¿Qué sucedería al ejecutar la instrucción mostrar(l2)? c. ¿Crees que la siguiente función copiarLista sería correcta? ¿Por qué? void copiarLista ( ListaPersonal &ld, const ListaPersonal { NodoLista *nuevo; NodoLista *aux; ld.cap=NULL; aux=ld.cap; nuevo = new NodoLista; for (NodoLista *t=lo.cap; t!=NULL; t=t->sig) { nuevo->nombre=t->nombre; nuevo->sig=NULL; if(aux==NULL) aux=nuevo; else { aux->sig=nuevo; aux=aux->sig; } } } &lo) d. ¿Crees que la siguiente función copiarLista sería correcta? ¿Por qué? void copiarLista ( ListaPersonal &ld, const ListaPersonal { NodoLista *nuevo; NodoLista *aux; ld.cap=NULL; aux=ld.cap; for (NodoLista *t=lo.cap; t!=NULL; t=t->sig) { nuevo = new NodoLista; nuevo->nombre=t->nombre; nuevo->sig=NULL; if(ld.cap==NULL) ld.cap=aux=nuevo; else { aux->sig=nuevo; aux=aux->sig; } } } &lo)