TRABAJO DE INVESTIGACION FUNCIONES DEFINIDAS POR EL USUARIO Y POR EL PROPIO LENGUAJE

22.05.2013 05:27

  

 

          

INSTITUTO TECNOLOGICO DE SALINA CRUZ

 

 

UNIDAD 4. FUNCIONES BASICAS.

 

TRABAJO DE INVESTIGACION DOCUMENTAL:

FUNCIONES DEFINIDAS POR EL USUARIO Y FUNCIONES DEFINIDAS POR EL LENGUAJE DE PROGRAMACION.

 

QUE PARA ACREDITAR LA MATERIA DE ALGORITMOS Y PROGRAMACION PRESENTA:

 

Fabián Cruz Raquel

 

TITULAR DE LA MATERIA: M. EN C. SUSANA MONICA ROMAN NAJERA

CARRERA: ING. MECANICA GRUPO: 2 B1

 

 

 

 

 

 

 

 

 

 

 

Índice de contenido.

 

 

Introducción…………………………………………………………………………...3

Funciones definidas por el usuario……………………………………………….. 4

Encabezado de la función…………………………………………………………..5

Clase de datos……………………………………………………………………….. 6

Lista de parámetros…………………………………………………………………..7

Funciones definidas por el lenguaje de programación..………………………...8

Parámetros.………...………………………………………………………………….9

Llamar a una función....…………………………………………………………….10

Variables estáticas y automáticas…...…………………………………………….11

Parámetros y constantes...………………………………………………………....12

Funciones sobrecargada.…………………………………………………………..14

Número variable de parámetros…………………………………………………...15

Conclusiones………………………………………………………………………..17

Otras fuentes de información.……………………………………………………..18

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTRODUCCION.

 

 

Hemos mencionado anteriormente que uno de los puntos fuertes del lenguaje C es que las funciones de C son fáciles de definir y utilizar. Funciones de C se pueden clasificar en dos categorías, a saber, las funciones de la biblioteca y funciones definidas por el usuario principal. Es un ejemplo de función definida por el usuario. printf y scanf pertenecen a la categoría de funciones de la biblioteca. La distinción principal entre definida por el usuario y la función de biblioteca es que los primeros no están obligados a ser escrito por el usuario mientras que el segundo tiene que ser desarrollado por el usuario en el momento de escribir un programa. Sin embargo, la función definida por el usuario puede convertirse en una parte de la biblioteca de programas C. 
 

El uso de las funciones en C sirve muchas ventajas: 


1. Facilita la programación modular de arriba hacia abajo. En este estilo de programación, el alto nivel del problema general se resuelve primero, mientras que los detalles de cada función de bajo nivel se abordará más adelante. 

2. La longitud de un programa de origen se puede reducir mediante el uso de las funciones en un lugar adecuado. 

 

3. Es fácil de localizar y aislar una función defectuosa de nuevas investigaciones. 
 

4. Una función puede ser utilizada por muchos otros programas. Esto significa que un programador de C se puede construir sobre lo que otros ya lo han hecho, en lugar de empezar desde cero. Un programa multi-función. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FUNCIONES DEFINIDAS POR EL USUARIO.

 

 

C++ incluye funciones para el manejo de cadenas y funciones matemáticas, así como funciones para el manejo de E/S. Sin embargo, suponga que quiere realizar alguna operación que no es una función predefinida en C++, por ejemplo elevar al cubo. Debido a que C++ no incluye ninguna función estándar para tal operación, es posible Codificar en el programa la operación con un enunciado como el siguiente:

 

Cubo = x * x * x

 

Después, insertar este enunciado dentro del programa cada vez que se quiera elevar al cubo el valor de x. Sin embargo, ¿no sería más sencillo insertar el comando cubo(x) cada vez que se quiera elevar x al cubo, de tal manera que C++ sepa qué hacer al igual que sabe cómo ejecutar sqrt(x)? Puede hacer esto definiendo su propia función cubo(x). A esta función se le conoce con el nombre de función definida por el usuario, por razones obvias.

 

Una función definida por el usuario es un subprograma que, cuando se invoca, realiza alguna tarea o regresa un solo valor que se asigna al nombre de la función en cualquier parte que se utilice el nombre en el programa llamador. De esta manera, si cubo(x) es una función definida por el usuario que calculará un valor, por decir, x, el enunciado cout << cubo(x); invocará la función y hará que se muestre el cubo de x. Ahora será necesario aprender a crear funciones definidas por el usuario.

 

FORMATO DE FUNCIONES DEFINIDAS POR EL USUARIO

 

// Encabezado de la función

<claseRetorno> <nombreFunción> (<listaParámetros>)

{// Empieza el bloque de enunciados de la función

// Variables y constantes locales

<los objetos variables y las constantes locales deberán ir aquí>

// Enunciados de la función o cuerpo

enunciado #1;

enunciado #2;

.......................................

enunciado #n;

return <valor de regreso>;

} // Final del bloque de enunciados de la función

 

 

 

 

 

 

 

El formato de la definición de una función consiste en tres secciones principales: una línea de encabezado de la función, cualquier variable local u objetos constantes requeridos por la función y una sección de enunciados.

 

ENCABEZADO DE LA FUNCIÓN

El encabezado de la función proporciona la interfaz de datos para la función. Una interfaz de función o encabezado de la función es un enunciado que forma un marco común entre la función y su programa llamador. Esta idea se muestra en la figura 1.

 

Observe que el encabezado indica que datos de la función aceptarán desde el programa llamador y qué datos de la función regresarán al programa llamador. Cuando desarrolle los encabezados de las funciones, su perspectiva necesita ser relativa a la función. Deberá preguntarse dos cosas:

 

1. ¿Qué datos debe aceptar la función desde el programa llamador para realizar la tarea designada?

 

2. ¿Qué datos, si los hay, deberán regresar la función al programa llamador para cumplir la tarea designada?

 

 

 

Figura 1. El encabezado de la función forma la interfaz entre el programa llamador y la función.

 

En general, el encabezado de la función consiste en las tres partes siguientes:

• La clase de dato que regresará la función, si lo hay.

• El nombre de la función.

• Una lista de parámetros.

LA CLASE DE DATOS RETURN

 

Lo primero que aparece en el encabezado de la función es la clase de datos del valor regresado. Recuerde que la función puede regresar un solo valor que reemplace el nombre de la función en donde aparece el nombre en el programa llamador. El valor que reemplaza el nombre de la función en el programa llamador se conoce con el nombre de valor de retorno o de regreso. Cuando se usa una función para este propósito, la clase de datos del valor de regreso se deberá especificar en el encabezado de la función.

 

Por ejemplo, suponga que nuestra función cubo() regresa el cubo de un entero. Debido a que el cubo de un entero es un entero, la función regresará un valor entero. Como resultado, la clase de datos del valor regresado deberá ser int y especificarse en el encabezado de la función, como sigue:

int cubo(<listaParámetros>)

 

De otra manera, si nuestra función cubo() fuera el cubo de un valor de punto flotante, laclase regresada deberá ser float y el encabezado deberá verse como sigue:

float cubo(<listaParámetros>)

 

Cuando una función no regresa ningún valor al programa llamador deberá usar la palabra reservada void como la clase de regreso, como se muestra a continuación:

 

void funcionMuestra(<listaParámetros>)

Las funciones que no regresan ningún valor al programa llamador se usan para realizar tareas específicas, como E/S.

 

EL NOMBRE DE LA FUNCIÓN

 

El nombre de la función puede ser cualquier identificador legal en C++. Sin embargo, elnombre de la función no deberá empezar con un subguión (guión bajo), porque algunos depuradores colocan un subguión frente al nombre de la función si se encuentra un error en la función.

 

El nombre de la función describirá la operación que la función realiza, al igual que cubo() describe el cubo de un valor. Cuando invoque la función dentro de un programa llamador, usará este nombre.

 

Cada función que cree dentro de su programa debe de tener un nombre único. Como ocurre con los nombres de variables, los nombres de las funciones deben corresponder con la área que realiza. Por ejemplo:

 

Nombre de la función      Propósito de la función

imprimirCalificacion        Imprimir calificación de los alumnos.

cuentasPorPagar             Procesa las deudas de una compañía.

pedirNombre                   Solicita el nombre del usuario.

imprimirDocumento        Imprime el archivo correspondiente al documento.

calcularImpuesto            Calcula el impuesto del cliente.

Recuerde dos cosas:

 

1. El nombre de la función nunca se puede usar dentro de la función. En otras palabras, el

siguiente enunciado dentro de la función cubo() generará un error:

cubo = x * x * x; Hay una excepción a esta regla que se llama recursividad.

 

2. El identificador de la función nunca se usará del lado izquierdo del símbolo de asignación fuera de la función.

 

LISTA DE PARÁMETROS.

 

La lista de parámetros de la función incluye variables, llamadas parámetros, que pasarán desde el programa llamador y serán evaluados por la función.

 

Piense en un parámetro como una variable de la función que espera recibir un valor desde el programa llamador cuando se invoca la función. Para determinar los parámetros de la función, pregúntese ¿qué datos deberá aceptar la función para realizar su tarea? Suponga que nuestra función cubo() elevará al cubo valores enteros. La función deberá aceptar un valor entero desde el programa llamador y regresará un valor entero al programa llamador. De esta manera, nuestra interfaz de función se puede describir como sigue:

 

Función cubo(): Un entero al cubo.

Acepta: Un valor entero.

Regresa: Un valor entero.

Vamos

 

 

 

 

 

 

 

 

 

 

 

 

Funciones definidas por el lenguaje de programación.

 

Figura 2. Diagrama de funciones.

 

Una función es un conjunto de líneas de código que realizan una tarea específica y puede retornar un valor. Las funciones pueden tomar parámetros que modifiquen su funcionamiento. Las funciones son utilizadas para descomponer grandes problemas en tareas simples y para implementar operaciones que son comúnmente utilizadas durante un programa y de esta manera reducir la cantidad de código. Cuando una función es invocada se le pasa el control a la misma, una vez que esta finalizó con su tarea el control es devuelto al punto desde el cual la función fue llamada.

 

<tipo> [clase::] <nombre> ( [Parámetros] )
{
    cuerpo;
}

Ejemplo de una función

Para comenzar, vamos a considerar el caso en el cual se desea crear la función cuadrado(), que deberá devolver el cuadrado de un número real (de punto flotante), es decir, cuadrado() aceptará números de punto flotante y regresará una respuesta como número flotante.

Nota: aunque para la función que veremos el tipo de retorno coincide con el tipo de parámetro pasado, algunas veces las cosas pueden cambiar, es decir, no es obligatorio que una función reciba un parámetro de un tipo y que tenga que regresar una respuesta de dicho tipo.

 
// regresar el cuadrado de un número
double cuadrado(double n)
{
    return n*n;
}
 
Parámetros.

Normalmente, las funciones operan sobre ciertos valores pasados a las mismas ya sea como constantes literales o como variables, aunque se pueden definir funciones que no reciban parámetros. Existen dos formas en C++ de pasar parámetros a una función; por referencia o por valor. El hecho es que si en una declaración de función se declaran parámetros por referencia, a los mismos no se les podrá pasar valores literales ya que las referencias apuntan a objetos (variables o funciones) residentes en la memoria; por otro lado, si un parámetro es declarado para ser pasado por valor, el mismo puede pasarse como una constante literal o como una variable. Los parámetros pasados por referencia pueden ser alterados por la función que los reciba, mientras que los parámetros pasados por valor o copía no pueden ser alterados por la función que los recibe, es decir, la función puede manipular a su antojo al parámetro, pero ningún cambio hecho sobre este se reflejará en el parámetro original.

 

Parámetros por valor.

La función cuadrado() (ver arriba) es un clásico ejemplo que muestra el paso de parámetros por valor, en ese sentido la función cuadrado() recibe una copia del parámetro n. En la misma función se puede observar que se realiza un cálculo ( n*n ), sin embargo el parámetro original no sufrirá cambio alguno, esto seguirá siendo cierto aún cuando dentro de la función hubiera una instrucción parecida a n = n * n; o n*=n;.

 

Parámetros por referencia.

Para mostrar un ejemplo del paso de parámetros por referencia, vamos a retomar el caso de la función cuadrado, salvo que en esta ocasión cambiaremos ligeramente la sintaxis para definir la misma. Veamos:

// regresar el cuadrado de un número
double cuadrado2(double &n)
{
    n *= n;
    return n;
}

Al poner a prueba las funciones cuadrado() y cuadrado2() se podrá verificar que la primera de estas no cambia el valor del parámetro original, mientras que la segunda sí lo hace.

 

 

 

 

 

 

 

Llamar a una función.

Para llamar a la función cuadrado() vista anteriormente, podemos emplear:

cout << cuadrado(25);
cout << cuadrado(X);
R = cuadrado(X); // guardar en R el cuadrado de X

Funciones void

Bajo ciertas circunstancias se deseará escribir funciones que no regresen valor alguno (esto sería algo parecido a escribir procedures en Pascal) y para ello podemos declarar a la función como void. La palabra reservada void es utilizada para declarar funciones sin valor de retorno y también para indicar que una función específica no requiere de parámetros. Por ejemplo, la función pausa() que se verá en seguida, no devolverá valor alguno y la misma no requiere de parámetros.

// esta función requiere de la librería iostream
void pausa(void)
{
    cout << "Por favor presione <Enter> HOLA...";
    cin.get();
    cin.ignore(255, '\n');  // rechazar caracteres introducidos antes de <Enter>
}

Notas: se debe de aclarar que el uso de la palabra void dentro de los parentesis es opcional al momento de declarar una función. Así, la función pausa() podría haberse declarado como void pausa(), y la misma puede invocarse como: pausa();.

Funciones anidadas

A diferencia de Pascal, el lenguaje C, C++ no permite anidar funciones, sin embargo, dentro de una función puede existir la llamada a una o más funciones declaradas previamente.

Funciones de tipo puntero (*)

En muchas ocasiones se desea que ciertas funciones regresen una referencia o puntero hacia un tipo (sea este estructurado o no) específico de dato en lugar de un valor específico. En tales casos, la función se deberá declarar como para que regrese un puntero. Por ejemplo, supongamos que deseamos crear una función para convertir un número entero en notación decimal a una cadena de caracteres en forma de números binarios, luego, la función mencionada podría escribirse para que reciba el número entero como parámetro y regrese un puntero a una cadena de caracteres conteniendo la conversión. Para ser más puntuales, vamos a escribir un programa en donde se verá la función binstr(), y cuyo objetivo será precisamente convertir números decimales en cadenas binarias.

Nota: observe que en la sintaxis para declarar funciones tipo puntero se debe de poner el símbolo * despues del tipo y antes del nombre de la función que se está declarando. Esto se puede ver en el programa, ya que la función binstr se declara como: char *binstr(unsigned int);

 
#include <iostream>
#include <string.h>
 using namespace std;
 // declaración de prototipo
char *binstr(unsigned int);
 // punto de prueba
int main()
{
    int n = 128;
    cout << "decimal = " << n << ",  binario = " << binstr(n) << endl;
    cin.get();
}
 // definición de función binstr()
// nota: esta funcion requiere de la librería estándar string
char *binstr(unsigned int n)
{
    static char buffer[65];
    int i = 0;
  strcpy(buffer, "0");
   if (n > 0) {
        while (n > 0) {
            buffer[i] = ( n & 1 ) + '0';
            i++;
            n >>= 1;
        }
        buffer[i] = '\0';
        strrev(buffer);
     }    // fin (n > 0)
    return buffer;
}

 

 

Variables estáticas y automáticas.

Dentro de una función, las variables y/o constantes pueden ser declaradas como: auto (por omisión) o como static. Si una variable dentro de una función es declarada como estática significa que la misma retendrá su valor entre las llamadas a la función. Por otro lado, la variables automáticas pierden su valor entre las llamadas. En el programa anterior puede verse que el arreglo de caracteres (buffer[65]) se ha declarado como estático para garantizar que dicho buffer retenga los datos aún después de que la función termine. En el mismo ejemplo, si el buffer no se declara como estático, el contenido del mismo podría ser destruido al salir de la función y los resultados obtenidos podrían ser no deseados.

 

 

 

Parámetros constantes.

Los parámetros usados por una función pueden declararse como constantes ( const ) al momento de la declaración de la función. Un parámetro que ha sido declarado como constante significa que la función no podrá cambiar el valor del mismo ( sin importar si dicho parámetro se recibe por valor o por referencia ).

Ejemplo:

int funcionX( const int n );
void printstr( const char *str );

 

Parámetros con valor por defecto.

Los parámetros usados por una función pueden declararse con un valor por defecto. Un parámetro que ha sido declarado con valor por defecto es opcional a la hora de hacer la llamada a la función. Ejemplo: Dada la función:

void saludo( char* mensaje = "Hola sudafrica 2010" );

la misma puede ser invocada como:

saludo();  // sin parámetro
saludo("Sea usted bienvenido a C++"); // con parámetro

Para ver un ejemplo más, vamos a considerar el caso de la función binstr() del programa funciones01. Ahora, vamos modificar dicha función, salvo que esta ocasión nos interesa que la misma sirva para convertir números decimales en cadenas numéricas y cuya base de conversión sea pasada como parámetro. Es decir, la función de la que estamos hablando podrá convertir números decimales a: binario, octal, decimal, hexadecimal, etc.; y la única condición será que la base indicada esté entre el 2 y el 36, inclusive.

Nota: Ya que la función servirá para convertir números a cualquier representación la nombraremos como numstr() en lugar de binstr(). Si la función es invocada sin el parámetro base regresará una cadena de digitos decimales.

#include <iostream>
#include <stdlib.h>
 using namespace std;
 // declaración de prototipo
char *numstr(unsigned int, const int base = 10);
 // punto de prueba
int main()
{ int n = 128;
    cout << "decimal = " << n << ",  binario = " << numstr(n, 2) << endl;
    cout << "decimal = " << n << ",  octal.. = " << numstr(n, 8) << endl;
    cin.get();}
 // definición de función numstr()
// nota: esta funcion requiere de la librería stdlib.h
char *numstr(unsigned int n, const int base)
{ static char buffer[65];
    itoa(n, buffer, base);
    return buffer;}

Parámetros de tipo puntero.

Anteriormente se mencionó que en C++ los parámetros a una función pueden pasarse por valor o por referencia, al respecto, podemos agregar que los parámetros también pueden pasarse como punteros. El paso de parámetros de punteros es bastante parecido al paso de parámetros por referencia, salvo que el proceso de los datos dentro de la función es diferente. Por ejemplo, las funciones:

void referencia( int &X ) { X = 100; }
void puntero( int *X ) { *X = 100; }

Ambas reciben un puntero o referencia a un objeto de tipo entero, por lo tanto cualquiera de las funciones del ejemplo puede cambiar el valor de la variable entera apuntada por X, la diferencia radica en la forma en que cada una de las mismas lleva cabo la tarea. Si en la función puntero() en lugar de usar *X = 100; se usara X = 100; se le asignaría 100 al puntero X, más no al objeto apuntado por X, y esto podría ser la causa de que el programa se terminara de manera abrupta.

Parámetros estructurados.

Al igual que cualquier otro tipo los parámetros de tipo estructurado pueden pasarse por valor o por referencia, sin embargo, podría ser que si una estructura es pasada por valor el compilador mostrara una advertencia (warning ) indicando que se pasado por valor una estructura, puesto que el paso de estructuras por valor es permitido usted puede ignorar la advertencia, pero lo mejor es pasar estructuras por referencia. Si una estructura es pasada por valor y si esta es muy grande podria ser que se agotara la memoria en el segmento de pila ( Stack Segment ), aparte de que la llamada a la función sería más lenta.

Pensemos que deseamos escribir una función para imprimir variables del tipo empleado. Así, la función puede escribirse de las tres maneras siguientes:

void ImprimeEmpleadoV( empleado e)
{
        cout << "Nombre: " << e.nombre << endl;
        cout << "Edad: " << e.edad << endl;
        cout << "Sexo: " << e.sexo << endl;
 }
 // Parametro empleado pasado por referencia
void ImprimeEmpleadoR( empleado &e )
{
        cout << "Nombre: " << e.nombre << endl;
        cout << "Edad: " << e.edad << endl;
        cout << "Sexo: " << e.sexo << endl;
 }
 // Parametro empleado pasado como puntero
void ImprimeEmpleadoP( empleado *e )
{
        cout << "Nombre: " << e->nombre << endl;
        cout << "Edad: " << e->edad << endl;
        cout << "Sexo: " << e->sexo << endl; }

Funciones sobrecargadas.

C++, a diferencia del C estándar, permite declarar funciones con el mismo nombre y a esto se conoce como sobrecarga de funciones. Las funciones sobrecargadas pueden coincidir en tipo, pero al menos uno de sus parámetros tiene que ser diferente. En todo caso, si usted trata de declarar funciones sobrecargadas que coincidan en tipo y número de parámetros el compilador no se lo permitirá. Para poner un ejemplo vamos a considerar el caso de dos funciones cuyo nombre será divide, ambas regresarán el cociente de dos números, salvo que una de ellas operará sobre números enteros y la otra lo hará sobre números reales ( de punto flotante ).

Nota: cuando en los programas se hace una llamada a una función sobrecargada, el compilador determina a cuál de las funciones invocar en base al tipo y número de parámetros pasados a la función.

#include <iostream.h>
#include <stdlib.h>
 
using namespace std;
 
// divide enteros
int divide(int a, int b)
{
    cout << "división entera" << endl;
    return ( (b != 0) ? a/b : 0);
}
 
// divide reales
double divide(double a, double b)
{
    cout << "división real" << endl;
    return ( (b != 0) ? a/b : 0);
}
// punto de prueba
int main()
{
    cout << divide(10, 3) << endl;
    cout << divide(10.0, 3.0) << endl;
    cin.get();
}
 
 
 
 
 
 
 
 
 
Número variable de parámetros.

En C,C++ se pueden crear funciones que operen sobre una lista variable de parámetros, es decir, en donde el número de parámetros es indeterminado. En esta sección se mostrará un ejemplo de la manera en que podemos crear funciones para manejar tales asuntos, y para ello haremos uso de tres macros soportadas por C++:

1.   va_list puntero de argumentos

2.   va_start inicializar puntero de argumentos

3.   va_end liberar puntero de argumentos

La sintaxis que usaremos para declarar funciones con lista de parámetros variables es:

1) tipo nombre función (...)
2) tipo nombre función (int num, ...)

Donde:

1.   tipo es el tipo regresado por la función

2.   nombre funcion es el nombre de la función

3.   int num es el número de parámetros que la función procesará

4.   ... esta notación se emplea para indicar que el número de parámetros es variable

Nota: observe que la primera forma de declaración es realmente variable el número de parámetros a procesar y en estos casos se debe establecer el mecanismo para determinar cuándo se ha procesado el último de los argumentos, en el segundo tipo de declaración el número total de parámetros a procesar es igual al valor del parámetro num.

En el siguiente programa, por ejemplo, se define una función ( printstr ) que despliega una lista variable de cadenas de caracteres.

#include <iostream.h>
#include <stdarg.h>
 // despliega una lista de cadenas, la ultima debe ser NULL
void printstr(...)
{
   va_list ap;
   char    *arg;
   va_start(ap, 0);
   while ( (arg = va_arg(ap, char*) ) != NULL) {
      cout << arg;
   }
   va_end(ap);
}
 int main()
{
    printstr("Hola, ", "Esta es\n", "una prueba\n", NULL);
    cin.get();
    return 0;
}

En el programa que se listará en seguida, se define la función suma(), misma que operará sobre listas de números enteros, la función devolverá la suma de dichos números.

#include <iostream>//entrada y salida
#include <stdarg.h>
 
using namespace std;
 
// Esta función opera sobre una lista variable de números enteros
int suma( int num, ... )
{
    int total = 0;
    va_list argptr;
    va_start( argptr, num );
 
    while( num > 0 ) {
    total += va_arg( argptr, int );
    num--;
    }
 
    va_end( argptr );
    return( total );
}
 
int main()
{
    cout << suma(4, 100, 200, 300, 400) << endl;
    cin.get();
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

Conclusiones:

 

De lo que hemos estudiado en páginas anteriores pues nos quedan algunos conceptos definidos que cabe la pena rescatar y estos son los siguientes:

 

*    Una función se invoca por medio de una llamada de función. Dicha llamada menciona la función por su nombre y proporciona la información (en forma de argumentos) que necesita para realizar su tarea.

 

*      Las funciones se invocan normalmente en los programas escribiendo su nombre seguido de sus argumentos entre paréntesis.

 

*      Todas las funciones definidas por el usuario que se usan en main() se definen después de cerrar la llave de main().

 

*      La función se define escribiendo un encabezado de función, que incluye la clase de regreso, el nombre de la función y una lista de parámetros. El cuerpo o sección de enunciado de la función sigue al encabezado de la función.

 

*      Cada función debe de tener un nombre único.

 

*      Las funciones pueden regresar un valor al programa llamador y pueden recibir información llamadas parámetros.

 

*      Si una función regresa un valor, debe definir el tipo del valor regresado (int, char, etc.) antes del nombre de la función; en caso contrario tiene que preceder al nombre de la función con void.

 

*      Si la función recibe parámetros, debe definir un nombre único para cada parámetro así como su tipo.

 

*      Si la función no recibe parámetros, debe colocar la palabra reservada void dentro de los paréntesis que siguen al nombre de la función.

 

 

 

 

 

 

 

 

OTRAS FUENTES DE INFORMACION:

 

 

 

(2010, 11). Funciones Definidas Por El Usuario. BuenasTareas.com. Recuperado 11, 2010, de https://www.buenastareas.com/ensayos/Funciones-Definidas-Por-El-Usuario/1155835.html  en línea consultada el 26 de abril de 2013

 

https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Funciones en línea consultada el 26 de abril de 2013.

 

          

INSTITUTO TECNOLOGICO DE SALINA CRUZ

 

 

UNIDAD 4. FUNCIONES BASICAS.

 

TRABAJO DE INVESTIGACION DOCUMENTAL:

FUNCIONES DEFINIDAS POR EL USUARIO Y FUNCIONES DEFINIDAS POR EL LENGUAJE DE PROGRAMACION.

 

QUE PARA ACREDITAR LA MATERIA DE ALGORITMOS Y PROGRAMACION PRESENTA:

 

Fabián Cruz Raquel

 

TITULAR DE LA MATERIA: M. EN C. SUSANA MONICA ROMAN NAJERA

CARRERA: ING. MECANICA GRUPO: 2 B1

 

 

 

 

 

 

 

 

 

 

 

Índice de contenido.

 

 

Introducción…………………………………………………………………………...3

Funciones definidas por el usuario……………………………………………….. 4

Encabezado de la función…………………………………………………………..5

Clase de datos……………………………………………………………………….. 6

Lista de parámetros…………………………………………………………………..7

Funciones definidas por el lenguaje de programación..………………………...8

Parámetros.………...………………………………………………………………….9

Llamar a una función....…………………………………………………………….10

Variables estáticas y automáticas…...…………………………………………….11

Parámetros y constantes...………………………………………………………....12

Funciones sobrecargada.…………………………………………………………..14

Número variable de parámetros…………………………………………………...15

Conclusiones………………………………………………………………………..17

Otras fuentes de información.……………………………………………………..18

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

INTRODUCCION.

 

 

Hemos mencionado anteriormente que uno de los puntos fuertes del lenguaje C es que las funciones de C son fáciles de definir y utilizar. Funciones de C se pueden clasificar en dos categorías, a saber, las funciones de la biblioteca y funciones definidas por el usuario principal. Es un ejemplo de función definida por el usuario. printf y scanf pertenecen a la categoría de funciones de la biblioteca. La distinción principal entre definida por el usuario y la función de biblioteca es que los primeros no están obligados a ser escrito por el usuario mientras que el segundo tiene que ser desarrollado por el usuario en el momento de escribir un programa. Sin embargo, la función definida por el usuario puede convertirse en una parte de la biblioteca de programas C. 
 

El uso de las funciones en C sirve muchas ventajas: 


1. Facilita la programación modular de arriba hacia abajo. En este estilo de programación, el alto nivel del problema general se resuelve primero, mientras que los detalles de cada función de bajo nivel se abordará más adelante. 

2. La longitud de un programa de origen se puede reducir mediante el uso de las funciones en un lugar adecuado. 

 

3. Es fácil de localizar y aislar una función defectuosa de nuevas investigaciones. 
 

4. Una función puede ser utilizada por muchos otros programas. Esto significa que un programador de C se puede construir sobre lo que otros ya lo han hecho, en lugar de empezar desde cero. Un programa multi-función. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FUNCIONES DEFINIDAS POR EL USUARIO.

 

 

C++ incluye funciones para el manejo de cadenas y funciones matemáticas, así como funciones para el manejo de E/S. Sin embargo, suponga que quiere realizar alguna operación que no es una función predefinida en C++, por ejemplo elevar al cubo. Debido a que C++ no incluye ninguna función estándar para tal operación, es posible Codificar en el programa la operación con un enunciado como el siguiente:

 

Cubo = x * x * x

 

Después, insertar este enunciado dentro del programa cada vez que se quiera elevar al cubo el valor de x. Sin embargo, ¿no sería más sencillo insertar el comando cubo(x) cada vez que se quiera elevar x al cubo, de tal manera que C++ sepa qué hacer al igual que sabe cómo ejecutar sqrt(x)? Puede hacer esto definiendo su propia función cubo(x). A esta función se le conoce con el nombre de función definida por el usuario, por razones obvias.

 

Una función definida por el usuario es un subprograma que, cuando se invoca, realiza alguna tarea o regresa un solo valor que se asigna al nombre de la función en cualquier parte que se utilice el nombre en el programa llamador. De esta manera, si cubo(x) es una función definida por el usuario que calculará un valor, por decir, x, el enunciado cout << cubo(x); invocará la función y hará que se muestre el cubo de x. Ahora será necesario aprender a crear funciones definidas por el usuario.

 

FORMATO DE FUNCIONES DEFINIDAS POR EL USUARIO

 

// Encabezado de la función

<claseRetorno> <nombreFunción> (<listaParámetros>)

{// Empieza el bloque de enunciados de la función

// Variables y constantes locales

<los objetos variables y las constantes locales deberán ir aquí>

// Enunciados de la función o cuerpo

enunciado #1;

enunciado #2;

.......................................

enunciado #n;

return <valor de regreso>;

} // Final del bloque de enunciados de la función

 

 

 

 

 

 

 

El formato de la definición de una función consiste en tres secciones principales: una línea de encabezado de la función, cualquier variable local u objetos constantes requeridos por la función y una sección de enunciados.

 

ENCABEZADO DE LA FUNCIÓN

El encabezado de la función proporciona la interfaz de datos para la función. Una interfaz de función o encabezado de la función es un enunciado que forma un marco común entre la función y su programa llamador. Esta idea se muestra en la figura 1.

 

Observe que el encabezado indica que datos de la función aceptarán desde el programa llamador y qué datos de la función regresarán al programa llamador. Cuando desarrolle los encabezados de las funciones, su perspectiva necesita ser relativa a la función. Deberá preguntarse dos cosas:

 

1. ¿Qué datos debe aceptar la función desde el programa llamador para realizar la tarea designada?

 

2. ¿Qué datos, si los hay, deberán regresar la función al programa llamador para cumplir la tarea designada?

 

 

 

Figura 1. El encabezado de la función forma la interfaz entre el programa llamador y la función.

 

En general, el encabezado de la función consiste en las tres partes siguientes:

• La clase de dato que regresará la función, si lo hay.

• El nombre de la función.

• Una lista de parámetros.

LA CLASE DE DATOS RETURN

 

Lo primero que aparece en el encabezado de la función es la clase de datos del valor regresado. Recuerde que la función puede regresar un solo valor que reemplace el nombre de la función en donde aparece el nombre en el programa llamador. El valor que reemplaza el nombre de la función en el programa llamador se conoce con el nombre de valor de retorno o de regreso. Cuando se usa una función para este propósito, la clase de datos del valor de regreso se deberá especificar en el encabezado de la función.

 

Por ejemplo, suponga que nuestra función cubo() regresa el cubo de un entero. Debido a que el cubo de un entero es un entero, la función regresará un valor entero. Como resultado, la clase de datos del valor regresado deberá ser int y especificarse en el encabezado de la función, como sigue:

int cubo(<listaParámetros>)

 

De otra manera, si nuestra función cubo() fuera el cubo de un valor de punto flotante, laclase regresada deberá ser float y el encabezado deberá verse como sigue:

float cubo(<listaParámetros>)

 

Cuando una función no regresa ningún valor al programa llamador deberá usar la palabra reservada void como la clase de regreso, como se muestra a continuación:

 

void funcionMuestra(<listaParámetros>)

Las funciones que no regresan ningún valor al programa llamador se usan para realizar tareas específicas, como E/S.

 

EL NOMBRE DE LA FUNCIÓN

 

El nombre de la función puede ser cualquier identificador legal en C++. Sin embargo, elnombre de la función no deberá empezar con un subguión (guión bajo), porque algunos depuradores colocan un subguión frente al nombre de la función si se encuentra un error en la función.

 

El nombre de la función describirá la operación que la función realiza, al igual que cubo() describe el cubo de un valor. Cuando invoque la función dentro de un programa llamador, usará este nombre.

 

Cada función que cree dentro de su programa debe de tener un nombre único. Como ocurre con los nombres de variables, los nombres de las funciones deben corresponder con la área que realiza. Por ejemplo:

 

Nombre de la función      Propósito de la función

imprimirCalificacion        Imprimir calificación de los alumnos.

cuentasPorPagar             Procesa las deudas de una compañía.

pedirNombre                   Solicita el nombre del usuario.

imprimirDocumento        Imprime el archivo correspondiente al documento.

calcularImpuesto            Calcula el impuesto del cliente.

Recuerde dos cosas:

 

1. El nombre de la función nunca se puede usar dentro de la función. En otras palabras, el

siguiente enunciado dentro de la función cubo() generará un error:

cubo = x * x * x; Hay una excepción a esta regla que se llama recursividad.

 

2. El identificador de la función nunca se usará del lado izquierdo del símbolo de asignación fuera de la función.

 

LISTA DE PARÁMETROS.

 

La lista de parámetros de la función incluye variables, llamadas parámetros, que pasarán desde el programa llamador y serán evaluados por la función.

 

Piense en un parámetro como una variable de la función que espera recibir un valor desde el programa llamador cuando se invoca la función. Para determinar los parámetros de la función, pregúntese ¿qué datos deberá aceptar la función para realizar su tarea? Suponga que nuestra función cubo() elevará al cubo valores enteros. La función deberá aceptar un valor entero desde el programa llamador y regresará un valor entero al programa llamador. De esta manera, nuestra interfaz de función se puede describir como sigue:

 

Función cubo(): Un entero al cubo.

Acepta: Un valor entero.

Regresa: Un valor entero.

Vamos

 

 

 

 

 

 

 

 

 

 

 

 

Funciones definidas por el lenguaje de programación.

 

Figura 2. Diagrama de funciones.

 

Una función es un conjunto de líneas de código que realizan una tarea específica y puede retornar un valor. Las funciones pueden tomar parámetros que modifiquen su funcionamiento. Las funciones son utilizadas para descomponer grandes problemas en tareas simples y para implementar operaciones que son comúnmente utilizadas durante un programa y de esta manera reducir la cantidad de código. Cuando una función es invocada se le pasa el control a la misma, una vez que esta finalizó con su tarea el control es devuelto al punto desde el cual la función fue llamada.

 

<tipo> [clase::] <nombre> ( [Parámetros] )
{
    cuerpo;
}

Ejemplo de una función

Para comenzar, vamos a considerar el caso en el cual se desea crear la función cuadrado(), que deberá devolver el cuadrado de un número real (de punto flotante), es decir, cuadrado() aceptará números de punto flotante y regresará una respuesta como número flotante.

Nota: aunque para la función que veremos el tipo de retorno coincide con el tipo de parámetro pasado, algunas veces las cosas pueden cambiar, es decir, no es obligatorio que una función reciba un parámetro de un tipo y que tenga que regresar una respuesta de dicho tipo.

 
// regresar el cuadrado de un número
double cuadrado(double n)
{
    return n*n;
}
 
Parámetros.

Normalmente, las funciones operan sobre ciertos valores pasados a las mismas ya sea como constantes literales o como variables, aunque se pueden definir funciones que no reciban parámetros. Existen dos formas en C++ de pasar parámetros a una función; por referencia o por valor. El hecho es que si en una declaración de función se declaran parámetros por referencia, a los mismos no se les podrá pasar valores literales ya que las referencias apuntan a objetos (variables o funciones) residentes en la memoria; por otro lado, si un parámetro es declarado para ser pasado por valor, el mismo puede pasarse como una constante literal o como una variable. Los parámetros pasados por referencia pueden ser alterados por la función que los reciba, mientras que los parámetros pasados por valor o copía no pueden ser alterados por la función que los recibe, es decir, la función puede manipular a su antojo al parámetro, pero ningún cambio hecho sobre este se reflejará en el parámetro original.

 

Parámetros por valor.

La función cuadrado() (ver arriba) es un clásico ejemplo que muestra el paso de parámetros por valor, en ese sentido la función cuadrado() recibe una copia del parámetro n. En la misma función se puede observar que se realiza un cálculo ( n*n ), sin embargo el parámetro original no sufrirá cambio alguno, esto seguirá siendo cierto aún cuando dentro de la función hubiera una instrucción parecida a n = n * n; o n*=n;.

 

Parámetros por referencia.

Para mostrar un ejemplo del paso de parámetros por referencia, vamos a retomar el caso de la función cuadrado, salvo que en esta ocasión cambiaremos ligeramente la sintaxis para definir la misma. Veamos:

// regresar el cuadrado de un número
double cuadrado2(double &n)
{
    n *= n;
    return n;
}

Al poner a prueba las funciones cuadrado() y cuadrado2() se podrá verificar que la primera de estas no cambia el valor del parámetro original, mientras que la segunda sí lo hace.

 

 

 

 

 

 

 

Llamar a una función.

Para llamar a la función cuadrado() vista anteriormente, podemos emplear:

cout << cuadrado(25);
cout << cuadrado(X);
R = cuadrado(X); // guardar en R el cuadrado de X

Funciones void

Bajo ciertas circunstancias se deseará escribir funciones que no regresen valor alguno (esto sería algo parecido a escribir procedures en Pascal) y para ello podemos declarar a la función como void. La palabra reservada void es utilizada para declarar funciones sin valor de retorno y también para indicar que una función específica no requiere de parámetros. Por ejemplo, la función pausa() que se verá en seguida, no devolverá valor alguno y la misma no requiere de parámetros.

// esta función requiere de la librería iostream
void pausa(void)
{
    cout << "Por favor presione <Enter> HOLA...";
    cin.get();
    cin.ignore(255, '\n');  // rechazar caracteres introducidos antes de <Enter>
}

Notas: se debe de aclarar que el uso de la palabra void dentro de los parentesis es opcional al momento de declarar una función. Así, la función pausa() podría haberse declarado como void pausa(), y la misma puede invocarse como: pausa();.

Funciones anidadas

A diferencia de Pascal, el lenguaje C, C++ no permite anidar funciones, sin embargo, dentro de una función puede existir la llamada a una o más funciones declaradas previamente.

Funciones de tipo puntero (*)

En muchas ocasiones se desea que ciertas funciones regresen una referencia o puntero hacia un tipo (sea este estructurado o no) específico de dato en lugar de un valor específico. En tales casos, la función se deberá declarar como para que regrese un puntero. Por ejemplo, supongamos que deseamos crear una función para convertir un número entero en notación decimal a una cadena de caracteres en forma de números binarios, luego, la función mencionada podría escribirse para que reciba el número entero como parámetro y regrese un puntero a una cadena de caracteres conteniendo la conversión. Para ser más puntuales, vamos a escribir un programa en donde se verá la función binstr(), y cuyo objetivo será precisamente convertir números decimales en cadenas binarias.

Nota: observe que en la sintaxis para declarar funciones tipo puntero se debe de poner el símbolo * despues del tipo y antes del nombre de la función que se está declarando. Esto se puede ver en el programa, ya que la función binstr se declara como: char *binstr(unsigned int);

 
#include <iostream>
#include <string.h>
 using namespace std;
 // declaración de prototipo
char *binstr(unsigned int);
 // punto de prueba
int main()
{
    int n = 128;
    cout << "decimal = " << n << ",  binario = " << binstr(n) << endl;
    cin.get();
}
 // definición de función binstr()
// nota: esta funcion requiere de la librería estándar string
char *binstr(unsigned int n)
{
    static char buffer[65];
    int i = 0;
  strcpy(buffer, "0");
   if (n > 0) {
        while (n > 0) {
            buffer[i] = ( n & 1 ) + '0';
            i++;
            n >>= 1;
        }
        buffer[i] = '\0';
        strrev(buffer);
     }    // fin (n > 0)
    return buffer;
}

 

 

Variables estáticas y automáticas.

Dentro de una función, las variables y/o constantes pueden ser declaradas como: auto (por omisión) o como static. Si una variable dentro de una función es declarada como estática significa que la misma retendrá su valor entre las llamadas a la función. Por otro lado, la variables automáticas pierden su valor entre las llamadas. En el programa anterior puede verse que el arreglo de caracteres (buffer[65]) se ha declarado como estático para garantizar que dicho buffer retenga los datos aún después de que la función termine. En el mismo ejemplo, si el buffer no se declara como estático, el contenido del mismo podría ser destruido al salir de la función y los resultados obtenidos podrían ser no deseados.

 

 

 

Parámetros constantes.

Los parámetros usados por una función pueden declararse como constantes ( const ) al momento de la declaración de la función. Un parámetro que ha sido declarado como constante significa que la función no podrá cambiar el valor del mismo ( sin importar si dicho parámetro se recibe por valor o por referencia ).

Ejemplo:

int funcionX( const int n );
void printstr( const char *str );

 

Parámetros con valor por defecto.

Los parámetros usados por una función pueden declararse con un valor por defecto. Un parámetro que ha sido declarado con valor por defecto es opcional a la hora de hacer la llamada a la función. Ejemplo: Dada la función:

void saludo( char* mensaje = "Hola sudafrica 2010" );

la misma puede ser invocada como:

saludo();  // sin parámetro
saludo("Sea usted bienvenido a C++"); // con parámetro

Para ver un ejemplo más, vamos a considerar el caso de la función binstr() del programa funciones01. Ahora, vamos modificar dicha función, salvo que esta ocasión nos interesa que la misma sirva para convertir números decimales en cadenas numéricas y cuya base de conversión sea pasada como parámetro. Es decir, la función de la que estamos hablando podrá convertir números decimales a: binario, octal, decimal, hexadecimal, etc.; y la única condición será que la base indicada esté entre el 2 y el 36, inclusive.

Nota: Ya que la función servirá para convertir números a cualquier representación la nombraremos como numstr() en lugar de binstr(). Si la función es invocada sin el parámetro base regresará una cadena de digitos decimales.

#include <iostream>
#include <stdlib.h>
 using namespace std;
 // declaración de prototipo
char *numstr(unsigned int, const int base = 10);
 // punto de prueba
int main()
{ int n = 128;
    cout << "decimal = " << n << ",  binario = " << numstr(n, 2) << endl;
    cout << "decimal = " << n << ",  octal.. = " << numstr(n, 8) << endl;
    cin.get();}
 // definición de función numstr()
// nota: esta funcion requiere de la librería stdlib.h
char *numstr(unsigned int n, const int base)
{ static char buffer[65];
    itoa(n, buffer, base);
    return buffer;}

Parámetros de tipo puntero.

Anteriormente se mencionó que en C++ los parámetros a una función pueden pasarse por valor o por referencia, al respecto, podemos agregar que los parámetros también pueden pasarse como punteros. El paso de parámetros de punteros es bastante parecido al paso de parámetros por referencia, salvo que el proceso de los datos dentro de la función es diferente. Por ejemplo, las funciones:

void referencia( int &X ) { X = 100; }
void puntero( int *X ) { *X = 100; }

Ambas reciben un puntero o referencia a un objeto de tipo entero, por lo tanto cualquiera de las funciones del ejemplo puede cambiar el valor de la variable entera apuntada por X, la diferencia radica en la forma en que cada una de las mismas lleva cabo la tarea. Si en la función puntero() en lugar de usar *X = 100; se usara X = 100; se le asignaría 100 al puntero X, más no al objeto apuntado por X, y esto podría ser la causa de que el programa se terminara de manera abrupta.

Parámetros estructurados.

Al igual que cualquier otro tipo los parámetros de tipo estructurado pueden pasarse por valor o por referencia, sin embargo, podría ser que si una estructura es pasada por valor el compilador mostrara una advertencia (warning ) indicando que se pasado por valor una estructura, puesto que el paso de estructuras por valor es permitido usted puede ignorar la advertencia, pero lo mejor es pasar estructuras por referencia. Si una estructura es pasada por valor y si esta es muy grande podria ser que se agotara la memoria en el segmento de pila ( Stack Segment ), aparte de que la llamada a la función sería más lenta.

Pensemos que deseamos escribir una función para imprimir variables del tipo empleado. Así, la función puede escribirse de las tres maneras siguientes:

void ImprimeEmpleadoV( empleado e)
{
        cout << "Nombre: " << e.nombre << endl;
        cout << "Edad: " << e.edad << endl;
        cout << "Sexo: " << e.sexo << endl;
 }
 // Parametro empleado pasado por referencia
void ImprimeEmpleadoR( empleado &e )
{
        cout << "Nombre: " << e.nombre << endl;
        cout << "Edad: " << e.edad << endl;
        cout << "Sexo: " << e.sexo << endl;
 }
 // Parametro empleado pasado como puntero
void ImprimeEmpleadoP( empleado *e )
{
        cout << "Nombre: " << e->nombre << endl;
        cout << "Edad: " << e->edad << endl;
        cout << "Sexo: " << e->sexo << endl; }

Funciones sobrecargadas.

C++, a diferencia del C estándar, permite declarar funciones con el mismo nombre y a esto se conoce como sobrecarga de funciones. Las funciones sobrecargadas pueden coincidir en tipo, pero al menos uno de sus parámetros tiene que ser diferente. En todo caso, si usted trata de declarar funciones sobrecargadas que coincidan en tipo y número de parámetros el compilador no se lo permitirá. Para poner un ejemplo vamos a considerar el caso de dos funciones cuyo nombre será divide, ambas regresarán el cociente de dos números, salvo que una de ellas operará sobre números enteros y la otra lo hará sobre números reales ( de punto flotante ).

Nota: cuando en los programas se hace una llamada a una función sobrecargada, el compilador determina a cuál de las funciones invocar en base al tipo y número de parámetros pasados a la función.

#include <iostream.h>
#include <stdlib.h>
 
using namespace std;
 
// divide enteros
int divide(int a, int b)
{
    cout << "división entera" << endl;
    return ( (b != 0) ? a/b : 0);
}
 
// divide reales
double divide(double a, double b)
{
    cout << "división real" << endl;
    return ( (b != 0) ? a/b : 0);
}
// punto de prueba
int main()
{
    cout << divide(10, 3) << endl;
    cout << divide(10.0, 3.0) << endl;
    cin.get();
}
 
 
 
 
 
 
 
 
 
Número variable de parámetros.

En C,C++ se pueden crear funciones que operen sobre una lista variable de parámetros, es decir, en donde el número de parámetros es indeterminado. En esta sección se mostrará un ejemplo de la manera en que podemos crear funciones para manejar tales asuntos, y para ello haremos uso de tres macros soportadas por C++:

1.   va_list puntero de argumentos

2.   va_start inicializar puntero de argumentos

3.   va_end liberar puntero de argumentos

La sintaxis que usaremos para declarar funciones con lista de parámetros variables es:

1) tipo nombre función (...)
2) tipo nombre función (int num, ...)

Donde:

1.   tipo es el tipo regresado por la función

2.   nombre funcion es el nombre de la función

3.   int num es el número de parámetros que la función procesará

4.   ... esta notación se emplea para indicar que el número de parámetros es variable

Nota: observe que la primera forma de declaración es realmente variable el número de parámetros a procesar y en estos casos se debe establecer el mecanismo para determinar cuándo se ha procesado el último de los argumentos, en el segundo tipo de declaración el número total de parámetros a procesar es igual al valor del parámetro num.

En el siguiente programa, por ejemplo, se define una función ( printstr ) que despliega una lista variable de cadenas de caracteres.

#include <iostream.h>
#include <stdarg.h>
 // despliega una lista de cadenas, la ultima debe ser NULL
void printstr(...)
{
   va_list ap;
   char    *arg;
   va_start(ap, 0);
   while ( (arg = va_arg(ap, char*) ) != NULL) {
      cout << arg;
   }
   va_end(ap);
}
 int main()
{
    printstr("Hola, ", "Esta es\n", "una prueba\n", NULL);
    cin.get();
    return 0;
}

En el programa que se listará en seguida, se define la función suma(), misma que operará sobre listas de números enteros, la función devolverá la suma de dichos números.

#include <iostream>//entrada y salida
#include <stdarg.h>
 
using namespace std;
 
// Esta función opera sobre una lista variable de números enteros
int suma( int num, ... )
{
    int total = 0;
    va_list argptr;
    va_start( argptr, num );
 
    while( num > 0 ) {
    total += va_arg( argptr, int );
    num--;
    }
 
    va_end( argptr );
    return( total );
}
 
int main()
{
    cout << suma(4, 100, 200, 300, 400) << endl;
    cin.get();
    return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

Conclusiones:

 

De lo que hemos estudiado en páginas anteriores pues nos quedan algunos conceptos definidos que cabe la pena rescatar y estos son los siguientes:

 

*    Una función se invoca por medio de una llamada de función. Dicha llamada menciona la función por su nombre y proporciona la información (en forma de argumentos) que necesita para realizar su tarea.

 

*      Las funciones se invocan normalmente en los programas escribiendo su nombre seguido de sus argumentos entre paréntesis.

 

*      Todas las funciones definidas por el usuario que se usan en main() se definen después de cerrar la llave de main().

 

*      La función se define escribiendo un encabezado de función, que incluye la clase de regreso, el nombre de la función y una lista de parámetros. El cuerpo o sección de enunciado de la función sigue al encabezado de la función.

 

*      Cada función debe de tener un nombre único.

 

*      Las funciones pueden regresar un valor al programa llamador y pueden recibir información llamadas parámetros.

 

*      Si una función regresa un valor, debe definir el tipo del valor regresado (int, char, etc.) antes del nombre de la función; en caso contrario tiene que preceder al nombre de la función con void.

 

*      Si la función recibe parámetros, debe definir un nombre único para cada parámetro así como su tipo.

 

*      Si la función no recibe parámetros, debe colocar la palabra reservada void dentro de los paréntesis que siguen al nombre de la función.

 

 

 

 

 

 

 

 

OTRAS FUENTES DE INFORMACION:

 

 

 

(2010, 11). Funciones Definidas Por El Usuario. BuenasTareas.com. Recuperado 11, 2010, de https://www.buenastareas.com/ensayos/Funciones-Definidas-Por-El-Usuario/1155835.html  en línea consultada el 26 de abril de 2013

 

https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Funciones en línea consultada el 26 de abril de 2013.