Académique Documents
Professionnel Documents
Culture Documents
Funciones y procedimientos.
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;
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 | ---+---+---+
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.
} /*----------------------------------------------------------------*/
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 (*).
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).
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:
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