Funciones en C++: Nota: Este material es de estudio personal, en clases sólo revisaremos las láminas con. Usted revise todo.

Documentos relacionados
Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Funciones Definición de función

Estructuración del programa en partes más pequeñas y sencillas

Manejo de Punteros y objetos en memoria dinámica en C++ Agustín J. González ELO 329

Java. Introducción a la Programación Orientada a Objetos

Clases y Objetos en C++

TEMA 5: Subprogramas, programación modular

Tema 4: Corrección y Robustez en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

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

Métodos CON valor de retorno

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 )

Funciones: Pasos por Referencia Recursividad

Introducción a C# y la plataforma.net. Pablo Zaidenvoren 2013

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Programación: Estructuras de Control

Estructura de datos y Programación

Introducción a C# y la plataforma.net

Introducción al lenguaje C

Universidad de Cantabria

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

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

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Entrada y Salida vía Archivos

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Definición y Conversión de datos. Agustín J. González ELO-329

Clases en C++ Agustín J. González ELO329

Unidad IV: Funciones

UNIDAD 3 Modularidad

Recursividad. Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile

Palabras reservadas de C++ y C. Una palabra reservada no puede declararse como un identificador, esto haría un conflicto entre conectores y funciones.

PROGRAMACION ESTRUCTURADA: Tema 3. Funciones

TEMA 4: Programación estructurada

Programación Funcional Lisp-DrScheme Primera Parte. Dr. Oldemar Rodríguez Rojas Escuela de Informática Universidad de Nacional

Clases y Objetos en Java. ELO329: Diseño y Programación Orientados a Objetos

Lenguaje de Programación: C++, INPUT OUTPUT(Variables)

Lenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III

Estructuras de control Agosto de Facultad de Ingeniería. Universidad del Valle

8. Sentencia return y métodos

Unidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos

GENERACIÓN DE CÓDIGO ORIENTADO A OBJETOS

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

o Una clase en Java se compone de: o A los anteriores se les conoce también como miembros de la clase.

Unidad V. Ya veremos qué poner en "algunas_palabras" y "algo_más", por ahora sigamos un poco más.

Definición de clase: Una clase es un prototipo que define las variables y los métodos de todos los objetos con características comunes.

Definición de clase: Una clase es un prototipo que define las variables y los métodos de todos los objetos con características comunes.

Tema: Estructuras de Selección en C#.

Funciones Tipos de funciones y Recursividad

Bloque II. Elementos del lenguaje de programación Java

Tema: Funciones, Procedimientos y Recursividad en C#.

2.2 Nombres, Ligado y Ámbito

Elementos léxicos del lenguaje de programación Java

Tema: Funciones, Procedimientos y Recursividad en C#.

Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

Parte I: Programación en un lenguaje orientado a objetos

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

Programación I Teoría II.

Elementos de un programa en C

Procedimientos, Funciones y Recursividad

Memoria en C++ Punteros - Referencias Clases Y ahora, a trabajar! Memoria Dinámica en C++

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Programación 1 Problemas del Composición condicional

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

Programación I Recursividad.

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Tema 06: Recursividad

Universidad Central de Venezuela Facultad de Ciencias Escuela de Computación Algoritmos y Estructuras de datos. Taller #1. Guía básica de C++

Universidad Nacional Experimental del Táchira Departamento de Ingeniería Informática Computación I. Código: Punteros y Funciones

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Fundamentos de la programación

Ámbito y Funciones. Lenguaje de Programación Estructurado. Siempre imaginé el Paraíso como algún tipo de biblioteca.

Procedimientos y funciones

Introducción a la Programación en C Funciones

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)

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Manejo de excepciones en Java. ELO329: Diseño y Programación Orientados a Objetos Agustín J. González

Introducción a C++ y Code::Blocks

Tipos de Datos Simples Contenido del Tema

Manejo de errores: Excepciones en Java. ELO329: Diseño y Programación Orientados a Objetos

Introducción al lenguaje C

Tema 2. El lenguaje de programación Java (Parte 1)

Introducción a Java. Introducción a Java. Programación I

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

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

Estructuras de Control 3

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

AMBITO DE VARIABLES EN C. GLOBALES Y LOCALES. UNDECLARED (FIRST USE IN THIS FUNCTION). EJEMPLOS (CU00548F)

Introducción a C# y la plataforma.net. Pablo Zaidenvoren 2010

Qué es Java? Un lenguaje de programación Un entorno de desarrollo Un entorno de aplicación Un entorno de despliegue Es similar en sintaxis de C + +.

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

ASIGNATURA: COMPUTACIÓN II

Hoja de ejercicios del Tema 9

FUNCIONES EN C QUÉ SIGNIFICA VOID? QUÉ ES EL TIPO DE RETORNO? PARA QUÉ SIRVE RETURN? MÓDULOS (CU00547F)

Programación imperativa. Algoritmos y Estructuras de Datos I. Lenguaje C. Segundo cuatrimestre de 2014

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

Capítulo 3. Subprogramas. 3.1 Subprogramas FUNCTION

Texto estructurado (ST)

INTERACCION ENTRE OBJETOS

IMPORTAR Y USAR CLASES DEL API DE JAVA. EJEMPLO CLASE MATH Y MÉTODO POW. CONSTRUCTORES PRIVADOS. (CU00647B)

Transcripción:

Funciones en C++: Nota: Este material es de estudio personal, en clases sólo revisaremos las láminas con. Usted revise todo. Agustín J. González ELO329 1

Parámetros Un parámetro actual (o valor, argumento) es el valor pasado a la función desde el código invocador. Un parámetro formal (o variable) es la variable declarada en la lista de parámetros de la función que recibe los valores. Parámetros de entrada reciben los valores pasados a la función. Parámetros de salida retornan valores desde la función al código invocador. 2

double future_value( double p ) Función Valor Futuro Esta función calcula el valor futuro de una inversión de 1000 sobre 10 años y calculado mensualmente. No es muy flexible, pero se conserva como una sola tarea. double b = 1000 * return b; Parámetro formal pow(1 + p / (12 * 100), 12 * 10); 3

Función Valor Futuro La siguiente secuencia llama a future_value(): cout << "Please enter the interest rate " double rate; cin >> rate; " in percent:"; Valor retornado double balance = future_value(rate); cout << "After 10 years, the balance is " << balance << "\n"; parámetro actual 4

Haciendo al Función más Flexible Esta versión de future_value() es más flexible porque el balance inicial y el número de años son pasados como parámetros actuales. double future_value(double initial_balance, double p, int nyear) double b = initial_balance * pow(1 + p / (12 * 100), 12 * nyear); return b; 5

Uso de Comentarios, Recomiendo usar doxygen Esta versión de future_value tiene comentarios según se espera sus tareas de programación: double future_value(double initial_balance, double p, int nyear) // Propósito: calcula el valor de la inversión // usando interés compuesto // Recibe: // initial_balance - El valor inicial de la // inversión. // p - la tasa de interés en porcentaje // nyear - el número de años que la // inversión será mantenida // Retorna: el balance después de nyear años // Observaciones: el interés es actualizado // mensualmente 6

Retorno cuando encontramos un Error Use la sentencia return para terminar inmediatamente. En el ejemplo, errores de rango son manejados retornando un valor por defecto: double future_value(double initial_balance, double p, int nyear) if( nyear < 0 ) return 0; // error if( p < 0 ) return 0; // error double b = initial_balance * pow(1 + p / (12 * 100), 12 * nyear); return b; 7

Funciones Booleanas (1) Funciones que retornan un valor booleano son apropiadas para validación de datos. Se recomienda centralizar sólo una tarea por función: bool IsValidYear( int year ) if(( year > 1600 ) and ( year < 2100 )) return true; else return false; Alternativamente: bool IsValidYear( int year ) return(( year > 1600 ) and ( year < 2100 )); 8

Funciones Booleanas (2) Las funciones booleanas pueden retornar sus valores dentro de expresiones booleanas, conduciendo así a código más fácil de entender: if( IsValidYear( birthyear ) and IsLeapYear( birthyear )) cout << "You were born in a Leap Year\n"; 9

Prototipo de Funciones Una declaración de función (or prototipo) es requerida cuando un llamado a función no ha sido precedida por una definición de función. El prototipo indica información de llamado que es esencial para el compilador. double future_value(double initial_balance, double p, int nyear); // function prototype Alternativamente: double future_value(double, double, int); // function prototype 10

Efecto Lateral (o secundario) Un efecto lateral ocurre cuando una función produce algún efecto adicional al valor retornado. Por ejemplo, se podría desplegar información o modificar una variable global. double future_value(double initial_balance, double p, int nyear) if( nyear < 0 ) cout << "Error: invalid number of years\n"; return 0; double b = initial_balance * pow(1 + p / (12 * 100), 12 * nyear); return b; 11

Procedimientos Un procedimiento (o función void) siempre produce un efecto lateral porque no retorna valores. void DisplayReport( double initial_balance, double p, int nyear) cout << "An investment of " << initial_balance << " will be worth " (etc.) 12

Paso por Referencia (1) Pasar un parámetro por referencia significa que el nombre del parámetro formal queda definido en la misma localización de memoria del parámetro actual. Así la función puede modificar la variable (parámetro actual). Por ejemplo:: void swap( int & x, int & y ) // Exchange the values of two variables. int temp = x; x = y; y = temp; 13

Paso por Referencia (2) Una función que recibe varias entradas del usuario normalmente usa parámetros por referencia porque la función no puede retornar más de un valor. void GetUserName( string &lastname,string &firstname ) cout << "Last name: "; cin >> lastname; cout << "First name: "; cin >> firstname; 14

Paso por Referencia (3) En el código que invoca la función, las variables pasadas a la función son actualizadas: string firstname; string lastname; GetUserName( lastname, firstname ); // Ahora los valores de firstname y LastName // han cambiado... 15

Parámetros de Entrada y Salida Parámetros de Entrada contienen datos que han sido pasados a la función desde el código llamador. Parámetros de Salida contienen datos que son fijados dentro de la función y retornados al código llamador. Parámetros de Entrada/Salida reciben datos desde el código llamador, modifica los datos, y retorna los datos al código llamador. 16

Parámetros de Entrada CalcPay() usa parámetros de entrada, hours y payrate: double CalcPay( double hours, double payrate ) return hours * payrate; 17

Parámetros de Salida GetUserName(), visto antes, usa dos parámetros de salida: void GetUserName( string & lastname, string & firstname ) cout << "Last name: "; cin >> lastname; cout << "First name: "; cin >> firstname; 18

Parámetros de Entrada/Salida La función swap() usa dos parámetros de entrada y salida: void swap( int & x, int & y ) int temp = x; x = y; y = temp; 19

Paso por Referencia Constante Cuando pasamos un objeto por referencia, se recomienda usar paso por referencia constante. El compilador impide a la función llamada modificar su valor. void ShowName( const string & firstname, const string & lastname ) cout << firstname << " " << lastname; firstname = "George"; // error 20

No pases Objetos por Valor El paso de objetos por valor desperdicia memoria y tiempo de procesamiento al crear un duplicado del objeto en el stack. Debemos evitar esto: void ShowName( string firstname, string lastname ) cout << firstname << " " << lastname; 21

Alcance de Variables (1) Una variable declarada dentro de un bloque es sólo visible desde el punto donde está declarada hasta el término del bloque. if( X > Y ) // begin block int sum = X + Y; // end block cout << sum; // error: not visible 22

Alcance de Variables (2) No enmascarar variables de alcance mayor dentro con otra que posee alcance interior. Si esta función recibe como entrada 10, qué retornará? int Evaluate( int n ) int j = 99; if( n > 5 ) int j = 20; return j; 23

Variables Globales Una variable global es declarada fuera de cualquier función. Evitar esto cuando sea posible. Nunca usarlas como una forma de evitar paso de parámetros a funciones. double g_initial_balance, g_principal; int g_nyear; double future_value() return (g_initial_balance * pow(1 + g_principal / (12 * 100), 12 * g_nyear)); 24

Uso de Precondiciones (1) La macro assert() puede ser llamada cuando se desee garantizar absolutamente que se satisface alguna condición. Chequeo de rango es común: double future_value(double initial_balance, double p, int nyear) assert( nyear >= 0 ); assert( p >= 0 ); double b = initial_balance * pow(1 + p / (12 * 100), 12 * nyear); return b; 25

Uso de Precondiciones (2) Si la expresión pasada a la macro assert() es falsa, el programa se detiene inmediatamente con un mensaje de diagnóstico del tipo: Assertion failure in file mysub.cpp, line 201: nyear >= 0 Con assert el programa no tiene la posibilidad de recuperarse del error. Para eliminar el efecto de assert se debe compilar el programa con la definición de NDEBUG para el procesador. #define NDEBUG 26

Uso de Precondiciones (3) Una mejor forma para manejar errores es usar el mecanismo de manejo de excepciones de C++ (lo veremos más delante). En este caso el programa tiene la posibilidad de recuperarse e intentar nuevamente: double future_value(double initial_balance, double p, int nyear) if( nyear >= 0 ) throw RangeException( "nyear", 0 ); // etc. 27

Recursión (1) Recursión ocurre cuando una función ya sea (a) se llama así misma, o (b) llama a otra función que eventualmente termina por llamar a la función original. Aquí, una función se llama así misma, creando lo que parece una recursión infinita: void ChaseMyTail() //... ChaseMyTail(); 28

Recursión (2) Recursión Indirecta ocurre cuando una serie de llamados a función conduce a una función previa en la serie, creando un efecto de bucle. Esto parece trabajar pero su correcto funcionamiento puede ser un problema. void One() Two(); void Three() Four(); void Two() Three(); void Four() One(); 29

Recursión (3) Recursión tiene que ser controlada proveyendo una condición de término que permite detener la recursión cuando el caso básico es alcanzado. long Factorial( int n ) if( n == 0 ) Condición de térmico return 1; else long result = n * factorial( n - 1 ); return result; 30

Función Factorial Recursiva Pensemos n! Como el producto de n por (n-1)!. Esto siempre es verdadero mientras n>0. 5! = 5 * 4! and 4! = 4 * 3! and 3! = 3 * 2! and 2! = 2 * 1! and 1! = 1 * 0! and 0! = 1 (por definición) 31