Vous êtes sur la page 1sur 8

Guin de prcticas

Funciones y procedimientos.

Guin de prcticas 5: FUNCIONES Y PROCEDIMIENTOS Introduccin.


En este guin vamos a ver cmo programar de forma modular en C. La programacin modular consiste en dividir un algoritmo (programa) en unidades de menor tamao, donde cada fragmento realiza una tarea explcita y nica. Cada uno de esos fragmentos recibe el nombre de subalgoritmo o mdulo. Por tanto, los subalgoritmos (sean funciones o procedimientos) nos permiten hacer pequeas porciones de cdigo reutilizable, que pueden ser llamados desde el resto del programa sin necesidad de repetir esas partes de cdigo cada vez que se necesiten. Todas las libreras de C estn repletas de funciones, como por ejemplo: printf, scanf, system, abs, etc. Por lo tanto, ya ests acostumbrado a utilizarlas, ya que en anteriores guiones las hemos utilizado con frecuencia. Ahora slo nos queda ver cmo crear nuestras propias funciones.

Una funcin de ejemplo.


A continuacin mostramos un programa que calcula el factorial de un nmero entero positivo (entre 1 y 20). Observar que el cdigo que calcula el factorial, no se incluye en el programa principal (main), sino que se ha creado un funcin especfica para ello.
#include <stdio.h> #include <stdlib.h> /*----------------------------------------------------------------*/ int factorial( int valor ){ int result=1; int i; for(i=valor; i>1; i--){ result = result * i; } return( result ); } /*----------------------------------------------------------------*/ int main( void ){ /*ENTRADAS*/ int numero=0; //Nmero para calcular el factorial while( numero<1 || numero>20){ /* Pedir un nmero*/ printf("Deme un valor: "); scanf("%i", &numero); /* Mostrar un mensaje si no est entre 1 y 20.*/ if( numero<1 || numero>20 ){ printf ("El valor debe estar entre 1 y 20.\n"); } } /* Mostrar el factorial */ printf("El factorial de %i es %i\n", numero, factorial(numero));

Pgina 1 de 8

Guin de prcticas

Funciones y procedimientos.

system("PAUSE");

Tanto la declaracin de las libreras a utilizar, como el programa principal ( main) ya han sido comentados y explicados en anteriores guiones. Por lo tanto, nos vamos a centrar en el cdigo que se encuentra en medio, la funcin en s. Dicho cdigo es el siguiente:
int factorial( int valor ){ int result=1; int i; for(i=valor; i>1; i--){ result = result * i; } return( result );

Este trozo de cdigo devuelve como salida el factorial de un valor dado como entrada. La primera lnea es la cabecera de la funcin y debe tener el siguiente formato:
tipo nombre_de_funcin( parmetros )

donde:

tipo: es el tipo de dato que devuelve (debe ser uno de los tipos simples). nombre_de_funcin: es el nombre que tiene la funcin. Dicho nombre no puede contener espacios, smbolos o letras acentuadas. El nombre debe comenzar siempre con una letra y puede contener cualquier letra o nmero a continuacin. parmetros: son los datos de entrada que necesita la funcin para realizar sus clculos. Los parmetros estn separados por comas y se declaran igual que las variables (tipo nombre).

A continuacin de la cabecera encontramos el cuerpo de la funcin que est entre un par de llaves ({...}). El cuerpo de nuestra funcin factorial tiene tres partes: 1. La declaracin de variables necesarias para el clculo de la funcin:
int result=1; int i;

2. Las instrucciones de clculo del factorial:


for(i=valor; i>1; i--){ result = result * i; }

3. La devolucin del resultado al algoritmo que invoca la funcin:


return( result );

Pgina 2 de 8

Guin de prcticas

Funciones y procedimientos.

NOTA: Toda funcin debe tener una instruccin return en su interior para devolver el resultado calculado. Ejercicio:

Cambia el nombre del parmetro valor por el de numero (igual que en el programa principal). Haz el mismo cambio dentro de la funcin y comprueba si esto afecta a la ejecucin del programa.

Procedimientos.
La declaracin de procedimientos en C es muy similar a la declaracin de las funciones. Los ms puristas diran que en C no existen los procedimientos como tales, ya que se declaran como funciones pero que no devuelven nada (void). Entonces, en el cuerpo de un procedimiento no devolveremos nada (no se escribe la instruccin return). Tambin observamos diferencias al realizar la llamada, porque ahora se llama directamente al procedimiento, sin necesidad de usar una instruccin de asignacin (resultado = .....). Veamos un ejemplo:
#include <stdio.h> #include <stdlib.h> #define TAMA 3 /*----------------------------------------------------------------*/ void PintaTablero( char tablero[TAMA][TAMA] ){ int i, j; for(i=0; i<TAMA; i++){ for(j=0; j<TAMA; j++){ printf(" %c", tablero[i][j]); } printf("\n"); } } /*----------------------------------------------------------------*/ int main( void ){ /*ENTRADAS*/ char enraya[TAMA][TAMA]; PintaTablero(enraya); system("PAUSE"); }

Como puedes comprobar la declaracin del procedimiento es exactamente igual que la declaracin de una funcin. La nica diferencia est en que el procedimiento devuelve un valor de tipo void, es decir, vaco/nada. En este caso, la cabecera es de la siguiente forma:
void PintaTablero( char tablero[TAMA][TAMA] )

Pgina 3 de 8

Guin de prcticas

Funciones y procedimientos.

El procedimiento PintaTablero, muestra por pantalla el contenido del array bidimensional que se le pasa como argumento. Como dicho array no se inicializa en ningn momento, al ejecutar el programa se mostrarn smbolos basura que hay dentro de la matriz. La salida ser parecida a sta:
| | | ---+---+---+ w | $ | | ---+---+---+ 1 | | C | ---+---+---+ Presione una tecla para continuar . . .

Ejercicio:

Crea un nuevo procedimiento llamado InicializaTablero, que tenga como entrada el array bidimensional de caracteres. El procedimiento debe rellenar dicho array con ceros. Modifica el programa principal para que inicialice el tablero llamando al procedimiento InicializaTablero antes de mostrarlo por pantalla. Tras ello, el programa debera mostrar lo siguiente:
0 | 0 | 0 | ---+---+---+ 0 | 0 | 0 | ---+---+---+ 0 | 0 | 0 | ---+---+---+

Paso de parmetros por referencia.


Como los procedimientos no devuelven ningn tipo de valor en la llamada, la nica forma de devolver valores es incluir la posibilidad de modificar el valor de sus parmetros. Vamos a ver un ejemplo de cmo hacer eso. El siguiente programa muestra cmo pasar 2 parmetros por referencia, llamando a una funcin que intercambia los valores de los 2 parmetros dados.
#include <stdio.h> #include <stdlib.h> /*----------------------------------------------------------------*/ void intercambia( float &a, float &b ){ float temp; temp = a;

Pgina 4 de 8

Guin de prcticas

Funciones y procedimientos.

} /*----------------------------------------------------------------*/ int main( void ){ /*ENTRADAS*/ float valor1, valor2; printf("Indroduce 2 valores reales: "); scanf("%f %f", &valor1, &valor2); /* Intercambiar valores */ intercambia( valor1, valor2 ); printf("Valores intercambiados: %f, %f\n", valor1, valor2); system("PAUSE"); }

a = b; b = temp;

Para indicar que los dos parmetros se pasan por referencia se coloca el smbolo & delante del nombre de cada parmetro.
void Cambia( float &a, float &b )

La utilizacin de dichos parmetros dentro del procedimiento es exactamente igual que el uso de cualquier otra variable. NOTA: La utilizacin del smbolo & para indicar el paso de parmetros por variable es propio de C++, pero por su facilidad es el mtodo que usaremos para pasar parmetros por referencia. En C el paso de parmetros por referencia es totalmente distinto. Ejercicios: Elimina el smbolo & delante del nombre de algn parmetro y comprueba los efectos que esto produce. Elimina el smbolo & de los dos parmetros y haz las mismas pruebas.

Paso de parmetros por referencia en formato C.


El paso de parmetros en C es muy distinto y algo ms complicado que en C++. Veamos el mismo ejemplo de antes pero usando el paso de parmetros de C:
#include <stdio.h> #include <stdlib.h> /*----------------------------------------------------------------*/ void intercambia( float *a, float *b ){ float temp; temp = (*a); (*a) = (*b); (*b) = temp;

} /*----------------------------------------------------------------*/

Pgina 5 de 8

Guin de prcticas

Funciones y procedimientos.

int main( void ){ /*ENTRADAS*/ float valor1, valor2; printf("Indroduce 2 valores reales: "); scanf("%f %f", &valor1, &valor2); /* Intercambiar valores */ intercambia( &valor1, &valor2 ); printf("Valores intercambiados: %f, %f\n", valor1, valor2); system("PAUSE"); }

Como puedes comprobar los cambios son importantes. Vamos a verlos uno a uno: En la declaracin del procedimiento ya no se utiliza el smbolo &, en su lugar, se utiliza el asterisco (*).

void intercambia( float *a, float *b ){

El uso de los parmetros pasados por referencia es totalmente distinto. Cada vez que se utiliza un parmetro pasado por referencia debe ir precedido del smbolo * (los parntesis no son obligatorios, pero ayudan a evitar confusiones).

(*a) = (*b);

En la llamada al procedimiento tenemos que utilizar el smbolo & antes del nombre de la variable que se pasa por referencia (al igual que ocurre con la funcin scanf).

intercambia( &valor1, &valor2 );

Pasar un array como parmetro.


Ya hemos visto cmo se pasan los parmetros por valor y por referencia. No obstante, hay que realizar una pequea aclaracin: los arrays en C/C++ siempre se pasan por referencia, sin necesidad de indicarlo. Esto quiere decir que, en la funcin de ejemplo de pintar el tablero, el paso del array tablero se est realizando por referencia:
void PintaTablero( char tablero[TAMA][TAMA] ){

Ejercicio:

Incluye algunas lneas de cdigo dentro de la funcin PintaTablero que modifiquen el contenido del array y comprueba cmo dichos cambios se

Pgina 6 de 8

Guin de prcticas

Funciones y procedimientos.

mantienen en el programa principal (por ejemplo, llama dos veces a dicha funcin para que pinte el tablero antes y despus).

Recuerda.
Las funciones slo devuelven un tipo de dato simple (entero, real, carcter o lgico) Los nombres de las funciones y los procedimientos no pueden contener espacios, slo pueden tener nmeros y letras. Tampoco pueden empezar por un nmero. Toda funcin debe tener una instruccin return en su interior para devolver el resultado calculado. Los parmetros de las funciones y procedimientos estn separados por comas y se declaran igual que las variables (tipo nombre). Dentro de los procedimientos no se escribe la instruccin return, ya que no devuelven el valor en la llamada. La utilizacin del smbolo & para indicar el paso de parmetros por referencia es propio de C++. El paso de parmetros por referencia es distinto en C que en C++. Los arrays siempre se pasan por referencia, sin indicarlo en la cabecera.

Ejercicios finales.
1. Realiza una funcin que tenga como entradas 3 nmeros y devuelva el mayor de ellos. Crea un programa principal para probar la funcin. 2. Crear un subalgoritmo que reciba como entrada un valor entero e indique si se trata de un nmero par o impar. Qu tipo de subalgoritmo crees ms apropiado, procedimiento o funcin?. Escribe tambin un programa principal para probar el subalgoritmo. 3. Realizar una funcin que tenga como entrada dos valores enteros, m y n, y determine si m es mltiplo de n. La funcin devolver un valor lgico. Realiza un programa principal para probar la funcin. 4. Escribir un subalgoritmo que reciba tres valores reales como entrada y los devuelva ordenados de mayor a menor. 5. Disear un algoritmo que lea las longitudes de los tres lados de un tringulo (L1,L2,L3) y determine qu tipo de tringulo es, de acuerdo a los siguientes casos. Suponiendo que A determina el mayor de los tres lados y B y C corresponden con los otros dos, entonces:

Si A>=B + C Si A2 = B2 + C2 Si A2 > B2 + C2 Si A2 < B2 + C2

No se trata de un tringulo Es un tringulo rectngulo Es un tringulo obtusngulo Es un tringulo acutngulo

Pgina 7 de 8

Guin de prcticas

Funciones y procedimientos.

Utiliza como subalgoritmos el cdigo creado en ejercicios de guiones anteriores para ordenar los lados. 6. Escribir un subalgoritmo que calcule la suma de los cuadrados de los N primeros nmeros enteros, siendo N la entrada del subalgoritmo. Crea un programa principal para probarlo.

7. Existen muchos mtodos capaces de proporcionar aproximaciones numricas de . Uno de ellos es el siguiente: =

i=1

6 i2

Crea un un subalgoritmo que tenga como entrada nmero de trminos de la sumatoria y devuelva el valor aproximado de segn la frmula anterior. Realizar un programa principal que pruebe dicho subalgoritmo. 8. Escribe un subalgoritmo que dado un nmero entero lo descomponga dgito a dgito, lo vuelva a componer al revs y lo devuelva. Por ejemplo: si le datos el nmero 187365, el programa mostrar 563781. Crear un programa principal para probarlo. 9. Crea un subalgoritmo que lea de teclado una secuencia de nmeros enteros positivos entre 0 y 100, ambos inclusive. La secuencia de nmeros introducidos terminar cuando se introduzca un nmero que no cumpla la condicin (que no est entre 0 y 100). El subalgoritmo devolver un array con los valores ledos y el nmero de valores que hay dentro del array. 10. Realiza un subalgoritmo que tenga como entrada un array de enteros y su tamao y muestre por pantalla el contenido de dicho array. 11. Crea un programa principal que utilice los dos subalgoritmos anteriores para leer una secuencia de nmeros y los muestre por pantalla. 12. Realizar un subalgoritmo que dado un vector de reales y su tamao, los ordene de mayor a menor. Crea un programa principal para probarlo. 13. Crea un subalgoritmo que muestre por pantalla una matriz de N filas y M colunmas. 14. Necesitamos un subalgoritmo que dada una matriz cuadrada y su tamao, nos devuelva dicha matriz transpuesta. Realizar un programa principal que lea por teclado el tamao de la matriz y su contenido, transponga la matriz utilizando el subalgoritmo y la muestre por pantalla. 15. Realiza un procedimiento que inicialice un array bidimensional cuadrado de un tamao dado, con un valor dado como entrada. 16. Se necesita una funcin que dada una matriz cuadrada, una fila y un valor, devuelva verdadero si el valor ya se encuentra en dicha fila y falso en caso contrario. 17. Crea una funcin que dada una matriz cuadrada y la posicin de una submatriz dentro de ella, devuelva el contenido de dicha submatriz en un array unidimensional.

Pgina 8 de 8

Vous aimerez peut-être aussi