martes, 9 de junio de 2009

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 ...";
cin.get();
cin.ignore(255, '\n'); // rechazar caracteres introducidos antes de
}
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. Asi, 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 funcíon 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 éste 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);
// programa : funciones01.cpp
// autor : Wikipedia
#include
#include

using namespace std;

// declaración de prototipo
char *binstr(unsigned int);

// punto de prueba
int main()
{
int n = 128;
count << "decimal = " << 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) {
while (n > 0) {
buffer[i] = ( n & 1 ) + '0';
i++;
n >>= 1;
}
buffer[i] = '\0';
strrev(buffer);
} // fin (n > 0)
return buffer;
}


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 parametros 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.
Parametros 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 calculo ( 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;.
Parametros 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.



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.


Funciones I1.1. Que es una función?Una función es una sección de código independiente, con nombre, que ejecuta una tarea específica y opcionalmente devuelve un valor al programa que la llamó. En general toma unos valores de entrada, llamados parámetros y proporcionan un valor de salida o valor de retorno; aunque tanto unos como el otro pueden no existir. 1.2. Partes de una funciónAl igual que con las variables, las funciones deben declararse y definirse. Una declaración es simplemente una presentación, una definición contiene las instrucciones con las que realizará su trabajo la función.1.2.1. Declaración o PrototipoEn C++ es obligatorio usar prototipos. Un prototipo es una declaración de una función. Consiste en una definición de la función sin cuerpo y terminado con un ";". La estructura de un prototipo es:func(); Por ejemplo: int Mayor(int a, int b);Sirve para indicar al compilador los tipos de retorno y los de los parámetros de una función, de modo que compruebe si son del tipo correcto cada vez que se use esta función dentro del programa, o para hacer las conversiones de tipo cuando sea necesario. Los nombres de los parámetros son opcionales, y se incluyen como documentación y ayuda en la interpretación y comprensión del programa. El ejemplo de prototipo anterior sería igualmente válido y se podría poner como: int Mayor(int,int); Esto sólo indica que en algún lugar del programa se definirá una función "Mayor" que admite dos parámetros de tipo "int" y que devolverá un valor de tipo "int". No es necesario escribir nombres para los parámetros, ya que el prototipo no los usa. En otro lugar del programa habrá una definición completa de la función.En C++ es obligatorio el uso funciones prototipo, y aunque en C no lo es, resulta altamente recomendable. 1.2.2. DefiniciónEn general, la definición de una función se compone de las siguientes secciones:El tipo del valor de retorno, que puede ser "void", si no necesitamos valor de retorno. Si no se establece, por defecto será "int". Aunque en general se considera de mal gusto omitir el tipo de valor de retorno. El nombre de la función. Es costumbre, muy útil y muy recomendable, poner nombres que indiquen, lo más claramente posible, qué es lo que hace la función, y que permitan interpretar qué hace el programa con sólo leerlo. Cuando se precisen varias palabras para conseguir este efecto existen varias reglas aplicables de uso común. Una consiste en separar cada palabra con un "_", la otra, consiste en escribir la primera letra de cada palabra en mayúscula y el resto en minúsculas. Por ejemplo, si hacemos una función que busque el número de teléfono de una persona en una base de datos, podríamos llamarla "busca_telefono" o "BuscaTelefono". Una lista de declaraciones de parámetros entre paréntesis. Los parámetros de una función son los valores de entrada (y en ocasiones también de salida). Para la función se comportan exactamente igual que variables, y de hecho cada parámetro se declara igual que una variable. Una lista de parámetros es un conjunto de declaraciones de parámetros separados con comas. Puede tratarse de una lista vacía. En C es preferible usar la forma "func(void)" para listas de parámetros vacías. En C++ este procedimiento se considera obsoleto, se usa simplemente "func()". Un cuerpo de función que representa el código que será ejecutado cuando se llame a la función. El cuerpo de la función se encierra entre llaves "{}" Una función muy especial es la función "main". Se trata de la función de entrada, y debe existir siempre, será la que tome el control cuando se ejecute un programa en C.Una definición de la función "Mayor" podría ser la siguiente: int Mayor(int a, int b) {if(a > b)return a;elsereturn b;}1.2.3. LlamadoUna función tiene un único nombre, al utilizar éste nombre en otras partes del programa se pueden ejecutar los enunciados contenidos en la función. A esto se le conoce como llamar a la función. Una función puede ser llamada desde otra función.Una función opcionalmente devuelve un valor al programa que la llamó. Cuando un programa llama a una función se ejecutan los enunciados contenidos en ésta, si el programa lo requiere, éstos enunciados pueden devolver un valor al programa que llamó a la función.Cuando un programa llama a una función, la ejecución del código salta a la posición inicial definida por el nombre de la función, el programa ejecuta los enunciados contenidos en ésta y posteriormente el programa que llamó a la función continúa en la línea de código siguiente. Una función bien diseñada ejecuta una tarea específica y fácil de entender. Es recomendable ante una tarea complicada, dividirla en múltiples funciones y entonces llamarlas a su debido momento.1.3. Paso de Parámetros1.3.1. Por ValorEl paso por valor envía copia de los parámetros a la función por lo tanto los cambios que se hagan en ella no son tenidos en cuenta. El siguiente ejemplo ilustra lo anterior.#include void incrementa ( int variable ); //Definición o Prototipomain() {int x = 33;incrementa (x); //Llamado/* x no resulta afectada, sigue valiendo 33 */printf ( "la variable x vale ahora %dn", x );}void incrementa ( int variable ) //Definición {variable ++;}1.3.2. Por ReferenciaEn C el paso por referencia se hace utilizando apuntadores. Se envía la dirección de memoria de la variable, por lo tanto los cambios que haga la función si afectan el valor de la variable.#include void incrementa ( int *variable ); //Definición o Prototipomain() {int x = 33;incrementa (&x); //Llamado /* x si resulta afectada, ahora vale 34 */printf ( "la variable x vale ahora %dn", x );}void incrementa ( int *variable ) { //Definición *variable = *variable + 1;}1.4. Variables Locales y GlobalesAdemás de pasar variables como parte del argumento de una función, también es posible declarar variables dentro del cuerpo de una función, a este tipo de variables se les llama locales ya que sólo son útiles dentro del cuerpo de la función. Los parámetros utilizados en una función se consideran como variables de tipo local y se utilizan exactamente de la misma manera, como lo demuestra el fragmento de código siguiente.int multiplica(int valor1, int valor2) {int local; // variable locallocal = valor1 * valor2;return local;}Los parámetros de la función, ambos de tipo int, llamados valor1 y valor2 son en efecto variables de alcance local al igual que la variable declarada como de tipo int llamada local dentro del cuerpo de la función multiplica( ). El alcance de una variable es simplemente el espacio dentro del código fuente donde la variable puede ser utilizada, generalmente éste espacio está limitado por el par de llaves que sirven para encerrar las líneas de código que conforman una función.A las variables que declaramos fuera del cuerpo de cualquier función se dice que tienen un alcance global y por lo tanto estas funciones están disponibles para cualquier función del programa, incluyendo a main( ). Las variables locales que tienen el mismo nombre que las variables globales no cambian el valor de las globales, sin embargo una variable local con el mismo nombre que una variable global oculta a la variable global











Una función de inicioCada programa C++ debe tener una sola función externa denominada main(), que desde la óptica del programador define el punto de entrada al programa. Las funciones se declaran en cabeceras (estándar o específicas de usuario) o dentro de los ficheros fuente. Estas declaraciones son denominadas prototipos. En ocasiones la declaración y definición se realiza en el mismo punto (como ocurre con las variables), aunque es normal colocar al principio del fuente los "prototipos" de las funciones que serán utilizadas en su interior, y las definiciones en cualquier otro sitio (generalmente al final).La forma general del prototipo de una función es:valor-devuelto nombre-función (lista-de-argumentos);La forma general de la definición es:valor-devuelto nombre-función (lista-de-argumentos) {sentencias; // "cuerpo" de la función}Ejemplo:float cuadrado (float x); // prototipofloat cuadrado (float x) { return x*x; } // definiciónLa comunicación entre el programa y las funciones que lo componen se realiza mediante los argumentos de llamada, los valores devueltos y las variables globales y externas.El operador de invocación a funciónEn ocasiones, en especial al tratar la sobrecarga de operadores, es conveniente considerar una invocación del tipofunc(lista-de-argumentos);como un operador binario; el denominado operador de invocación a función ( ) que se aplica entre el primer argumento func y el segundo, lista-de-argumentos. En este sentido la invocación anterior sería equivalente a:func()lista-de-argumentos.


Los compiladores C++ incluyen un amplio repertorio de clases, funciones y macros que permiten realizar una amplia variedad de tareas, incluyendo entradas/salidas de bajo y alto nivel; manipulación de cadenas alfanuméricas y ficheros; control de procesos (incluyendo multiproceso); manejo de memoria; cálculos matemáticos y un largo etcétera.
Este repertorio de recursos es denominado colectivamente como "Rutinas de librería"; "Librerías de ejecución" RTL ("Runtime Librarys") o simplemente "Librerías". Puede decirse que el lenguaje aislado (tal cual) no tiene prácticamente ninguna utilidad sin la concurrencia de estas utilidades. El Estándar C++ las clasifica según su utilidad:
Soporte del lenguaje [7]
Diagnóstico
Utilidades generales
Cadenas alfanuméricas ("Strings")
Localización
Contenedores
Iteradores
Algoritmos
Cálculo numérico
Entrada/Salida
§2.1 Librería Estándar C++
Para poner un poco de orden, el Estándar C++ define la denominada Librería Estándar [3] que debe acompañar a cada implementación del compilador que se adhiera al estándar. Es decir: la norma determina cuales son, como se llaman y como se utiliza este conjunto de algoritmos que deben acompañar (como mínimo) a cada implementación del compilador que quiera llamarse "Estándar". La última versión, ISO/IEC 14882 del año 1998, especifica que se compone de 32 ficheros de cabecera de nombres fijos y conocidos agrupados según la funcionalidad de los algoritmos. Son los siguientes:
Ficheros
Funcionalidad/funciones

Parte de la STL que describe los algoritmos ( 5.1.3)

Parte de la STL relativa a contenedores tipo bitset ( 5.1.1e1). Set de valores booleanos.

Parte de la librería numérica de la STL relativa a los complejos ( ).

Parte de la STL relativa a contenedores tipo deque; un tipo de colas: "Double-ended-queue" ( 5.1.1c3).

Parte de la librería de diagnóstico relativa al manejo de excepciones ( 1.6)

Flujos hacia/desde ficheros.

Parte de la STL relativa a Objetos-función ( 4.9.18f)

Manipuladores.

Supreclases para manejo de flujos de E/S.

Contiene declaraciones adelantadas de todas las plantillas de flujos y sus typedefs estándar. Por ejemplo ostream.

Parte del a STL que contiene los algoritmos estándar de E/S.

Algoritmos estándar de flujos de entrada.

Parte de la STL relacionada con iteradores ( 5.1.2), un tipo de puntero que permite utilizar los algoritmos de la Librería con las estructuras de datos representadas por los contenedores.

Descripción de propiedades dependientes de la implementación ( 1.2.1) que afectan a los tipos fundamentales.

Parte de la STL relativa a contenedores tipo list ( 5.1.1c4); listas doblemente enlazadas ( 1.8)

Parte de la STL relativa a la internacionalización ( 5.2).

Parte de la STL relativa a contenedores tipo map ( 5.1.1e4).

Utilidades relativas a la gestión de memoria, incluyendo asignadores ( 5.1.5) y punteros inteligentes (auto_ptr).

Manejo de memoria dinámica ( 1.3.2)

Parte de la librería numérica de la STL relativa a operaciones numéricas ( ).

Algoritmos estándar para los flujos de salida.

Parte de la STL relativa a contenedores tipo queue ( 5.1.1d1); colas de objetos ( 1.8).

Parte de la STL relativa a contenedores tipo set ( 5.1.1e2).

Flujos hacia/desde cadenas alfanuméricas.

Parte de la STL relativa a contenedores tipo stack ( 5.1.1c5); pilas de objetos ( 1.8).

Parte de la STL relativa a las clases de las que derivan los objetos lanzados por las excepciones ocasionadas en los algoritmos de la propia STL y otras expresiones. Estas clases son utilizadas para reportar errores detectados durante runtime. Los usuarios también pueden utilizar excepciones para reportar errores en sus propios programas ( 1.6.1a).

Parte de la STL relativa al Almacenamiento de flujos de E/S ("Stream buffers"). Define los tipos que controlan la capa de transporte ( 5.3.2f).

Parte de la STL relativa a contenedores tipo string ( ); una generalización de las cadenas alfanuméricas para albergar cadenas de objetos.

Mecanismo de identificación de tipos en tiempo de ejecución ( 4.9.14).

Parte de la STL que contiene elementos auxiliares como operadores y pares (pairs).

Parte de la librería numérica de la STL relativa a manejo de matrices numéricas ()

Parte de la STL relativa a los contenedores tipo vector; una generalización de las matrices unidimensionales C/C++ ( 5.1.1c1)
Es digno de mención que aunque generalmente las librerías no aportan ninguna característica al lenguaje (se supone que son utilidades auxiliares que no forman parte del lenguaje propiamente dicho), una pequeña porción de la Librería Estándar C++ sí aporta características que se consideran pertenecientes a este, de forma que deben estar presentes los ficheros de cabecera correspondientes si se desea usarlas. En concreto se refieren a los siguientes elementos:
Operadores new, new[], delete y delete[] ( 4.9.20).
Clase type_info que corresponde al mecanismo RTTI de identificación de tipos en tiempo de ejecución representado por el operador typeid ( 4.9.14).
Rutinas de inicio y terminación ( 1.5).
Las excepciones estándar lanzadas por los algoritmos anteriores ( 1.6.1a)
§2.2 Librería C
Además de otras nuevas, cuyo diseño e importancia cambian drásticamente la filosofía del lenguaje, C++ incluye prácticamente la totalidad de funciones de la primitiva librería estándar C. A esta librería, mantenida por compatibilidad, la denominamos Librería clásica ( 5.5).
§3 Componentes
Al referirnos a las librerías C++ utilizamos la terminología siguiente:
RTL Conjunto de librerías que acompañan a un compilador ("Runtime Library"), sean o no estándar.
Librería Estándar. Conjunto de librerías cuyo contenido está definido por el Estándar C++ (abreviadamente LE)
Libería clásica. Parte de la Librería Estándar correspondiente al C clásico.
STL ("Standard Templete Library"). Parte de la LE genuina de C++ (que no es heredada de C) y que responde a la forma "++" de hacer las cosas.
La calidad de un compilador C++ viene determinada en gran medida por la calidad y cantidad de su RTL; por su grado de adherencia al Estándar [6] y por el grado de soporte que proporciona para la plataforma concreta a que se destina.
Nota: en lo que concierne a la programación para MS Windows (las referencias a la plataforma Wintel surgen de forma constante e inevitable), los compiladores Borland C++ y MS Visual C++ son quizás los más conocidos y utilizados. El primero incluye una completa librería denominada VCL (Visual Component Library 4.11.8b). La del segundo es conocida como MFC (Microsoft Foundation Classes 1.7.2).Linux dispone de su propio compilador: GNU Cpp, que comenzó siendo un compilador C y ha evolucionado a un producto que es en realidad un superconjunto de compiladores. No solo puede compilar código C y C++; también otros lenguajes como Ada o Fortran; de forma que es común referirse a ellos como GCC ("GNU Compiler Collection"). La buena noticia es que existen versiones de este compilador para plataformas Windows, de forma que incluso en este ambiente "Propietario" pueden realizarse desarrollos utilizando herramientas "Open source" (ver recuadro en 1.4.0a1).
A grandes rasgos la librería Estándar C++ comprende los siguientes módulos:
La denominada Librería Estándar de Plantillas ( 5.1), abreviadamente STL ("Standard Templete Library").
Librería numérica. Parte de la STL que contiene algoritmos especialmente concebidos para computación numérica. Por ejemplo, una clase valarray optimizada para matrices numéricas y una clase complex para manejo y representación estandarizada de números complejos (en realidad una plantilla con especializaciones para los tipos float, double y long double).
Utilidades. Parte de la STL dedicada a elementos auxiliares tales como adaptadores y la clase auto_ptr.
Unas utilidades de entrada/salida de flujos, denominadas genéricamente iostreamsUna utilidad locale para manejo de localismos

Una clase string para manejo estandarizado de cadenas de caracteres. En realidad es una instanciación (especialización) de la plantilla basic_string para cadenas de caracteres.
Un esquema para describir de modo uniforme el entorno de ejecución mediante la utilización de una clase estándar denominada numeric_limits y especialización para cada uno de los tipos de datos fundamentales.
Utilidades para manejo de memoria
Soporte para utilización de juegos de caracteres y signos de diversos idiomas.
Utilidades de diagnóstico y manejo de errores. Incluyen manejo de excepciones y la macro assert



Cada llamada a la función debe verificar:
El número de parámetros debe ser exactamente tres.
Los tipos deben ser compatibles con los de la declaración (más adelante explicaremos qué son tipos compatibles). Nótese que cuando llamamos a la función, la comprobación de tipo la hace el compilador basándose en el prototipo (en la declaración) puesto que la función todavía no ha sido definida.Los nombres de variables que aparecen en el prototipo son opcionales y actúan casi como comentarios al lector del programa, ya que son completamente ignorados por el compilador.
Tipos compatiblesSon compatibles cualquiera de los tipos simples (definidos en C++) que pueden ser convertidos de uno a otro de manera significativa. Por ejemplo, si llamamos con un entero a una función que está esperando un número real como parámetro, el sistema lo convertirá automáticamente, sin mencionarlo al usuario. Esto también es cierto de float a char, o de char a int.En cambio, si pasamos un puntero a un entero a una función que estaba esperando un entero, no habrá conversión de tipo, ya que son dos variables completamente distintas. De la misma forma, un tipo definido por el usuario (estructura o clase) no puede ser convertido automáticamente a un long float, a un array o incluso a otra estructura o clase diferente, porque son tipos incompatibles y no puede realizarse la conversión de manera significativa.Sin embargo, el tipo devuelto por la función, void en el ejemplo anterior, debe ser compatible con el tipo que se espera que devuelva en la función de llamada, o el compilador dará un warning.
Pequeños cambiosVolvamos al ejemplo anterior. Veamos qué sucede cuando hacemos pequeños cambios:
Llamamos a la función con do_stuff (12.2, 13, 12345). No se produce ningún error durante la compilación, pues estamos trabajando con tipos compatibles. La salida del programa es: There are 12 wings. There are 13 feet. There are 57 eyes.
There are 2 wings. There are 1000 feet. There are 2 eyes.
Llamamos a la función con sólo dos parámetros: do_stuff (12.2, 13). El compilador lanzará un mensaje de error:11:error: In this statement, "do_stuff(1.22e1, 13)" supplies 2 arguments, but 3 are expected.
En la segunda llamada a la función, ponemos un & delante del nombre de una de las variables, do_stuff (arm, &float, lookers). El mensaje de error es el siguiente:13:error:In this statement, "&lookers" is of type "pointer to char", and may not be converted to "char".
Cambiemos, en el prototipo, void por int, int do_stuff(int wings, float feet, char eyes);. Entonces, al compilar:16:error:In this declaration, the type of "do_stuff" is not compatible with the type of previous declaration of "do_stuff".
Si ahora modificamos además el tipo devuelto en la declaración de la función, int do_stuff (int wings, float feet, char eyes) { ...}, obtenemos:16:warning:Non-void function "do_stuff" does not contain a return statement.
Podemos cambiar la declaración de la función por:void do_stuff (int, float, char);
Esto no dará ninguna diferencia respecto al programa original. Esto demuestra que los nombres de las variables en el prototipo son tratados como comentarios por el compilador de C++.
La función podría haber sido declarada de la siguiente forma:
void do_stuff (int wings, //Number of wings float feet, //Number of feet char eyes, //Number of eyes
Esto hace que la cabecera de la función sea autoexplicatoria. Sin embargo, debe recordarse que los comentarios nunca deben usarse en lugar de nombres significativos para las variables. El uso de prototipos no supone coste alguno en tiempo ni en velocidad de ejecución. El prototipo se verifica durante la compilación. Ralentiza ésta, debido a que es una comprobación extra que el compilador debe hacer, pero es despreciable el tiempo que necesita. El prototipo sólo alarga el tamaño del código.




La declaración de una función es el prototipo. El prototipo da un modelo de la interface a la función. Veamos un ejemplo:
# include
void haz_algo (int alas, float pies, char ojos);
main() {
int ala = 2;
float pie = 1000.0;
char ojo = 2;
haz_algo (3, 12.0, 4);
haz_algo (ala, pie, ojo);
}
void haz_algo (int alas, float pies, char ojos) {
cout << "Hay " <<>



La salida de este programa será:
Hay 3 alas.
Hay 12 pies.
Hay 4 ojos.
Hay 2 alas.
Hay 1000 pies.
Hay 2 ojos.
Cada llamada a la función haz_algo() debe verificar:
El número de parámetros debe ser exactamente tres.
Los tipos deben ser compatibles con los de la declaración.
Nótese que cuando llamamos a la función, la comprobación de tipo la hace el compilador basándose en el prototipo (en la declaración) puesto que la función todavía no ha sido definida.
Los nombres de variables que aparecen en el prototipo son opcionales y actúan casi como comentarios al lector del programa, ya que son completamente ignorados por el compilador.



EJEMPLO:

# include
void do_stuff (int wings, float feet, char eyes);
main(){ int arm = 2; float foot = 1000.0; char lookers = 2;
do_stuff (3, 12.0, 4); do_stuff (arm, foot, lookers);}
void do_stuff (int wings, float feet, char eyes){ cout << "There are " << wings << "wings." << '\n'; cout << "There are " << feet << "feet. " << '\n'; cout << "There are " << int(eyes) << "eyes." << '\n';}
La salida de este programa será:
There are 3 wings.There are 12 feet.There are 4 eyes.
There are 2 wings.There are 1000 feet.There are 2 eyes.

lunes, 8 de junio de 2009



















Los programas sencillos, como los ejemplo planteados hasta ahora, normalmente no necesitan un nivel de estructuración elevado. Pero cuando éstos crecen un poco necesitamos estructurarlos adecuadamente para mantenerlos legibles, facilitar su mantenimiento y para poder reutilizar ciertas porciones de código. El mecanismo C que nos permite esto son las funciones. Con los compiladores, los fabricantes nos proporcionan un conjunto importante de funciones de librería. A veces, nos puede interesar construir nuestras propias librerías.

martes, 12 de mayo de 2009

sentencia for en lenguaje c

Las sentencias ("Statements") especifican y controlan el flujo de ejecución del programa. Si no existen sentencias específicas de selección o salto, el programa se ejecuta de forma secuencial en el mismo orden en que se ha escrito el código fuente (es el que podríamos considerar orden "natural" de ejecución).
En este capítulo explicaremos los distintos tipos de sentencias que existen en C++, pero antes ofreceremos una descripción formal de las mismas señalando qué se entiende por sentencia