You are on page 1of 9

Funciones en Dev-C++ Qu es una funcin?

Una funcin es un conjunto de instrucciones que se la puede llamar desde el programa principal o desde otras funciones. Las funciones sirven para desarrollar algo en especial cuando el programa as lo necesite. Para usar funciones, se deben tener en cuenta dos cosas que necesita: 1. La declaracin de la funcin: Esto sirve para que al compilar el programa, el compilador reconozca que esa funcin existe; ya que si se llama desde alguna parte del programa sin haberla declarado o habindola declarado, se la declar mal eso dar error. Para declararla se sigue la siguiente sintaxis: prototipo_de_funcion nombre_de_la_funcion ( parametros opcionales ); Qu es prototipo y qu son parmetros? - Prototipo de la funcin: sirve para indicar que va a retornar la funcin, si va a retornar un entero, un double, un char, o simplemente no retorna nada (void). Esto es obligatorio. - Parmetros: son los datos que recibe o que se le envan a la funcin para que con ellos posiblemente desarrolle algo que se necesite. Esto es opcional. Entonces, una funcin para ingresar podra ser as: void ingresar(); Donde se aprecia que no va a retornar nada (por ello tiene void); entonces, la funcin hace lo que tiene que hacer y termina, no devuelve nada. Un ejemplo de devolucin seria en una suma de enteros, ya que se le podra enviar como dato los dos nmeros y la funcin hara internamente la suma devolviendo la suma de dichos nmeros (si son todos enteros, devolvera un int. Si son enteros y flotantes devolvera un float ), as: int suma_enteros ( int, int ); // suma nicamente enteros, devuelve un entero float suma_numeros ( float, float ); // suma enteros o flotantes, devuelve un flotante 2. La definicin de la funcin: Sirve ya para desarrollar la funcin; es decir ya programar dentro de ella para que haga lo que se necesita. Como consecuencia de que ya est creada se puede usarla, pero si no se hubiese declarado y se desarrolla (hacemos la definicin), al compilar dar error y dir que esa funcin no fue declarada, que no existe. La definicin es muy similar a la declaracin, solo que esta vez lleva un ambiente (donde se va a programar, es decir las llaves { } ), as: void ingresar() { // Lo que deba hacer esa funcion

} Tambin otra diferencia es que la declaracin lleva ; (punto y coma) al final, la definicin no lo lleva. Ejemplo: Hacer un programa que pida dos datos llamando a una funcin sin retorno y luego confirme si se ingresaron correctamente. Solucin: El programa debe usar una funcin sin retorno, es decir una void. Se deben pedir en esa funcin dos valores; en este caso se van a pedir dos cosas: nombre y nmero de la suerte; luego se mostrar el mensaje de que se ingresaron correctamente dichos datos. #include <iostream.h> #include <conio.h> // se declara la funcin ingresar void ingresar(); main() { cout<<\n Ingrese los datos: \n; ingresar(); cout<<\n Los datos se ingresaron correctamente! \n; getch(); } //se define la funcin ingresar void ingresar() { char nombre[10]; int numero; cout<<\n Ingrese su nombre: \n; cin>>nombre; cout<<\n Ingrese su numero de la suerte: \n; cin>>numero; } La declaracin de una funcin debe estar siempre antes de la definicin, por eso es recomendable que se la coloque al inicio del programa debajo de las libreras. Ya que se cre una funcin llamada ingresar para pedir los datos por medio de ella y no por medio del cuerpo principal main(), se debe llamar o invocar para que ejecute lo que tiene programado en su interior ya que por s sola (sin ser llamada), el programa terminara y ella no realizara alguna accin. Para llamar o invocar una funcin lo nico que se debe hacer es escribirla tal cual fue declarada sin alteraciones ya que las funciones son key sensitive, es decir que no es lo mismo: void HOLA(); que void HoLa(); Pues aunque son la misma palabra pero escrita diferente, para el compilador son dos funciones diferentes.

Para llamar a la funcin se coloca tal como fue declarada seguida del punto y coma (no se le pone el prototipo), solo el nombre y los posibles parmetros que lleve. FUNCIONES EN DEV-C++ (PASO POR VALOR) Las funciones no solamente son llamadas para que realicen cierta necesidad, sino que en algunas ocasiones para que la funcin desarrolle dicha necesidad necesita que se le enven parmetros. Los parmetros que se le enviarn a la funcin para que ella pueda cumplir su papel correctamente, pueden ser enviados de dos maneras: 1) Pasar los parmetros por valor (paso por valor) 2) Pasar los parmetros por referencia (paso por referencia) Qu es el paso por valor? Es enviarle un parmetro (variable, constante, entre otros) a otra funcin que para resolver su contenido necesita obligatoriamente recibir ese parmetro; es decir, la funcin depende de los parmetros para funcionar. Al pasar por valor los parmetros qu se hace en s? Se enva el contenido de algo (ya sea una variable, constante) para que la funcin de destino la use y pueda completar con xito su objetivo. Pero se debe tener en cuenta que al pasar por valor; la variable original no se altera, se enva una copia de ella a la cual si se le aplican cambios sern alterados nicamente en ella, ms no en la original. Cmo se declara una funcin que reciba parmetros por valor? La sintaxis sera la siguiente: prototipo_de_la_funcin nombre_de_la_funcin tipo_de_dato del parmetro2 , ); Ejemplo: void suma (int, int); (tipo_de_dato del parmetro1,

Se declara una funcin suma que va a recibir dos parmetros que sern enteros porque el tipo de dato lo denota as. Aquellos parmetros son por valor, lo denotamos por el hecho que nicamente va el tipo de dato en los parntesis. El prototipo de la funcin suma es void, es decir que no va a retornar valores, ser un procedimiento. Si retornara un entero sera int el prototipo, un nmero con decimales sera float el prototipo, entre otros. Cmo se define una funcin que recibe parmetros por valor? La definicin de la funcin suma: Ejemplo: void suma (int n1, int n2) { . } Donde n1 y n2 son variables formales.

Qu son variables formales? Son aquellas que se declaran en el momento de recibir el parmetro en la funcin de destino, tienen el contenido de una variable existente; pero no tiene necesariamente el mismo nombre. Por ejemplo, en ste cdigo: // sueldo = 100. // comision = 20. main() { . . suma ( sueldo, comision); . } void suma (int n1, int n2) { . } Se observa que en el cuerpo principal (main), se hace un llamado a una funcin suma que recibe como parmetros dos nmeros enteros. En ste caso ser el sueldo y la comisin de un empleado. La funcin suma los recibe y con esos valores har un proceso interno. Pero, al momento de llamar a la funcin suma se enva: * sueldo ( variable entera ) * comision ( variable entera ) Pero en la definicin de la funcin suma, estn dos variables en donde llega el contenido de sueldo y comisin; aquellas variables son, n1 y n2. Como se puede ver, no necesariamente la funcin debe tener en su definicin el mismo nombre de la variable que le est pasando el dato, ms bien se suele recomendar cambiar el nombre a las variables formales (las que se crean / se declaran en la definicin de la funcin que recibe parmetros por valor). Lo que si interesa es que aquellas variables cualquiera que sea su nombre (en este caso n1 y n2), reciben el contenido esperado. Es decir que: Si sueldo vala 100 como estaba previsto, n1 va a tener el valor de 100 en su contenido. Si comisin vala 20 como estaba previsto, n2 va a tener el valor de 20 en su contenido. Y si a n1 y n2 se le suman 500 mas, qu pasa? Quedara as: n1 = 600 (es decir 100 + 500 ) n2 = 520 (es decir 20 + 500 ) Pero sueldo y comisin quedaran intactos, es decir: sueldo = 100 comision = 20

NO se alteran las variables originales en los pasos por valor como se haba indicado anteriormente, pero si pasan su contenido exacto a las variables formales de la funcin destinada que recibe parmetros. Se crea una copia y esas copias pueden ser alteradas pero no se alterarn las originales. Ejemplo: Hacer un programa que haga las veces de calculadora entre dos nmeros, es decir que el usuario ingresar dos nmeros y luego el programa por medio de funciones recibir los nmeros y mostrar su resultado en: suma, resta, multiplicacin y divisin. Luego tambin mostrar cules fueron los nmeros ingresados. Solucin: Se va a crear una funcin para cada caso: suma, resta, multiplicacin y divisin. De esta manera se entender mejor cmo va el paso por valor en funciones. #include <iostream.h> #include <conio.h> void suma(float,float); void resta(float,float); void multiplicacion(float,float); void division(float,float); main() { float n1,n2; cout<<\n -Operaciones aritmticas bsicas- \n <<\n Ingrese cantidad 1:; cin>>n1; cout<<\n Ingrese cantidad 2:; cin>>n2; suma(n1,n2); resta(n1,n2); multiplicacion(n1,n2); division(n1,n2); cout<<\n\n Los numeros ingresados fueron: <<n1<< y <<n2; getch(); } void suma(float x,float y) { cout<<\n La suma = <<(x+y); } void resta(float x,float y) { cout<<\n La resta = <<(x-y); } void multiplicacion(float x,float y) { cout<<\n La multiplicacion = <<(x*y); }

void division(float x,float y) { cout<<\n La division = <<(x/y); } Lo que se hace es llamar a cada funcin: suma, resta, multiplicacin, divisin. Como la funcin necesita de los nmeros ingresados anteriormente (n1 y n2) para calcular su respectiva suma resta multiplicacin divisin, entonces debemos enviarle como parmetros aquellos datos. Pero se debe tener en cuenta lo siguiente: La declaracin de la funcin debe ser acorde a la definicin de la misma funcin. No deben existir contradicciones por ejemplo al declarar: void suma(); y luego al momento de usar la funcin ( al definirla ) colocar: int suma (x, y, z) { } Eso conlleva a errores de compilacin, porque el lenguaje es key sensitive; es decir, que no es lo mismo suma que: Suma suMA summa, entre otros. Tambin con los parmetros, pues si se declara como void que no recibe parmetros; NO se debe despus definirla como void que si reciba parmetros, por ms que este bien escrito el nombre y el prototipo, no coincide a la hora de ser llamada la funcin por el simple hecho de que no es lo mismo: void resta (); -> declaracion void resta ( n1,n2 ) -> definicion { } El programa muestra los nmeros que fueron ingresados, con el fin de reconocer que en el paso por valor NO se alteran las variables originales, ya que se visualizarn n1 y n2 con los valores originales a pesar de que hubo acciones aritmticas en su contenido (sumas, restas,..) pero esos cambios NO afectaron a las variables originales sino a las formales; pues esa es una de las caractersticas de pasar por valor los datos, se pasan copias. Dev-C++, Funciones (paso por referencia) Las funciones por lo general reciben parmetros, stos hasta el momento fueron pasados a la funcin mediante el "paso por valor" que consiste en hacer una copia del argumento, para que la funcin trabaje con la copia y no con el argumento original. Esto significa que si la funcin modificara el valor, el original no se alterara ya que se est manejando una copia. Pero surgen dos problemas: Se podra querer modificar el argumento original y no una copia.

Con gran cantidad de variables el paso por valor (copiando) puede resultar un gasto excesivo de memoria. Para resolver estos problemas se cuenta con las referencias y los punteros. Una referencia a una variable es un "alias" de la variable. Para indicarle a C++ que estamos hablando de una referencia y no una variable anteponemos al nombre el caracter ampersand (&). Por ejemplo una referencia llamada refPresupuesto apuntando a un valor double se escribira as: double &refPresupuesto Si se quiere que una funcin trabaje con la variable original y no con una copia se podra indicarle a la funcin que reciba el parmetro como una referencia. Ejemplo: //Paso por referencia #include <iostream> using std::cout; using std::cin; using std::endl; void elevarCuadrado (int &); //prototipo de funcin que recibe una referencia a un int int main() { int x = 0; //Declaracin e inicializacin en 0. cout << "Ingrese x para elevarlo al cuadrado" << endl; cin >> x; cout << "antes de elevarse es " << x <<endl; elevarCuadrado(x); //Notar que la llamada no es diferente a un paso por valor. cout << "x despues de elevarse es " << x << endl;//muestra el valor modificado por la funcin return 0; } void elevarCuadrado (int &y) //funcin que no devuelve nada (void) y recibe una referencia a un int en este caso (x) { y = y*y; //La funcin no devuelve ningn valor, pero modifica el argumento original (x) //ya que estamos trabajando con una referencia. } Ejemplo: Hacer un programa, que reciba en una funcin dos valores enteros pero un dato que sea pasado por referencia y otro sea pasado por valor #include <iostream.h> #include <conio.h> void referencia ( int&, int ); int A,B; main() { cout<<\n Ingrese un valor para A: ;

cin>>A; cout<<\n Ingrese un valor para B: ; cin>>B; cout<<\n ; cout<<\n valor inicial de A: <<A; cout<<\n direccin inicial de A: <<&A; cout<<\n valor inicial de B: <<B; cout<<\n direccin inicial de B: <<&B; cout<<\n \n\n\n; referencia(A,B); getch(); } void referencia ( int &vieneA, int vieneB ) { cout<< [ PRUEBA 1 ] \n; cout<<\n\n valor de *vieneA* = <<vieneA<<\n << direccion de *vieneA* = <<&vieneA<<\n << valor de *A* = <<A<<\n << direccion de *A* = <<&A<<\n\n <<\n\n valor de *vieneB* = <<vieneB<<\n << direccion de *vieneB* = <<&vieneB<<\n << valor de *B* = <<B<<\n << direccion de *B* = <<&B<<\n << ______________________________________\n; getch(); cout<< [ PRUEBA 2 ] \n; vieneA = 10; cout<<\n\n valor de *vieneA* = <<vieneA<<\n << direccion de *vieneA* = <<&vieneA<<\n << valor de *A* = <<A<<\n << direccion de *A* = <<&A<<\n\n <<\n\n valor de *vieneB* = <<vieneB<<\n << direccion de *vieneB* = <<&vieneB<<\n << valor de *B* = <<B<<\n << direccion de *B* = <<&B<<\n << ______________________________________\n; getch(); cout<< [ PRUEBA 3 ] \n; vieneB = 1200; cout<<\n\n valor de *vieneA* = <<vieneA<<\n << direccion de *vieneA* = <<&vieneA<<\n << valor de *A* = <<A<<\n << direccion de *A* = <<&A<<\n\n <<\n\n valor de *vieneB* = <<vieneB<<\n << direccion de *vieneB* = <<&vieneB<<\n << valor de *B* = <<B<<\n << direccion de *B* = <<&B<<\n << ______________________________________\n;

getch(); cout<< [ PRUEBA 4 ] \n; A = 44; cout<<\n\n valor de *vieneA* = <<vieneA<<\n << direccion de *vieneA* = <<&vieneA<<\n << valor de *A* = <<A<<\n << direccion de *A* = <<&A<<\n\n <<\n\n valor de *vieneB* = <<vieneB<<\n << direccion de *vieneB* = <<&vieneB<<\n << valor de *B* = <<B<<\n << direccion de *B* = <<&B<<\n; getch(); }

You might also like