You are on page 1of 8

Matrices como argumento de funciones

1 Observacin

No confundir el paso de una matriz en su conjunto (multidimensional o no) como argumento de una funcin, con el paso de un elemento de una matriz. Ejemplo: int dias[2][12] = { {31,28,31,30,31,30,31,31,30,31,30,31}, {31,29,31,30,31,30,31,31,30,31,30,31} }; .... x = fun1(dias, f, c, d, e); // paso de matriz z = fun2(dias[f][c], d, e); // paso de elemento
2 Sinopsis

Cuando hay que pasar una matriz bidimensional como argumento a una funcin, la declaracin de parmetros formales de esta debe incluir el nmero de columnas, ya que la funcin receptora debe conoce la estructura interna de la matriz, para poder para acceder a sus elementos, y esto solo es posible informndole de su tipo y dimensiones. En el caso que nos ocupa las dimensiones son dos, por lo que la definicin de la funcin llamada sera algo as: func (int dias[2][12]) {...} // 2a

Observe que en la expresin anterior est incluida toda la informacin necesaria: nmero de filas, nmero de columnas y tamao de cada elemento (un int). Desde luego la funcin receptora necesita conocer tambin la direccin de inicio del almacenamiento, pero ya hemos sealado que "el identificador de una matriz puede ser utilizado como un puntero a su primer elemento", con lo que si mentalmente sustituimos dias por un puntero al nmero 31 (primer elemento) de la primera matriz, la informacin pasada es completa.

3 Ya se ha sealado que C++ no contiene operadores para manejar matrices como una sola unidad. Al contrario de lo que ocurre en otros lenguajes (por ejemplo Java), en C++ es responsabilidad del programador no salirse del mbito de la matriz al acceder a sus elementos, lo que una vez aceptado, nos conduce a que en realidad es innecesario conocer la primera dimensin. En efecto, en nuestro caso, el primer elemento (primera sub-matriz), es accedido directamente mediante el puntero dias; su tamao ya lo conocemos (12 int), y con esta informacin es suficiente para acceder a cualquier otro elemento n. Solo es necesario desplazar el puntero los las posiciones de memoria correspondientes. La conclusin anterior estaba ya implcitamente establecida en, donde hemos visto que, en una matriz bidimensional m[F][C], la posicin Pf,c respecto del comienzo del elemento m[f][c] viene determinado por: Pf,c = ( C * f ) + c

expresin que es independiente del valor F (nmero de filas). Como consecuencia, la definicin 2a podra ser del tipo: func (int dias[][12]) {...} // 3a

El primer parntesis vaco es necesario para colocar el segundo, que es el que interesa. La expresin es conceptualmente equivalente a: func (int (*dias)[12]) {...} // 3b

que indica explcitamente el hecho de que el parmetro es un puntero-a-matriz de 12 int.

4 Comprobamos la veracidad de lo expuesto a un sencillo ejemplo: #include <stdio.h> void escribe(int a[][12], int x, int y); // prototipo void escribo(int (*a)[12], int x, int y); // prototipo void main () { // ============= int dias[2][12] = { { 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12}, {13,14,15,16,17,18,19,20,21,22,23,24} }; escribe(dias, 1, 3); escribe(dias, 0, 7); escribo(dias, 1, 3); escribo(dias, 0, 7); } void escribe(int a[][12], int f, int c) { // definicin printf("Valor [%2i,%2i] = %3i\n", f, c, a[f][c]); } void escribo(int (*a)[12], int f, int c) { // definicin printf("Valor [%2i,%2i] = %3i\n", f, c, a[f][c]); } Salida: Valor [ 1, 3] = 16 Valor [ 0, 7] = 8 Valor [ 1, 3] = 16 Valor [ 0, 7] = 8

Declaracin y definicin de funciones


Para utilizar una funcin en un programa se requiere en primer lugar declararla y despus definirla. La declaracin de la funcin le indica al compilador el nombre, el tipo de dato devuelto por la funcin y los parmetros pasados a la funcin. A la declaracin de una funcin se le llama tambin el prototipo de la funcin. Cuando un programa llama a una funcin, el programa puede enviar hacia la funcin informacin en la forma de uno o ms argumentos. Los argumentos son datos que la funcin puede necesitar para realizar su trabajo. Cuando la funcin termina su trabajo, la ejecucin del programa regresa a la lnea siguiente a la llamada a la funcin. Las funciones pueden enviar informacin al programa en la forma de un valor devuelto. El prototipo de una funcin provee al compilador con informacin de una funcin que ser definida posteriormente en el programa. El prototipo incluye, en este orden, El El la El tipo de valor que la funcin devolver nombre de la funcin, el cual debe ser significativo del trabajo realizado por funcin tipo de variables utilizadas como argumentos que sern pasados a la funcin.

Opcionalmente se puede incluir el nombre de las variables utilizadas como argumentos. El prototipo de una funcin, como todo enunciado ejecutable en un programa C debe terminarse con un smbolo de punto y coma. La definicin de una funcin es en s la funcin misma, est compuesta en su primer lnea de cdigo por el encabezado que debe ser idntico al prototipo de la funcin pero en ste caso no se utiliza el punto y coma, adems, al contrario del prototipo, donde es opcional incluir el nombre de las variables utilizadas como argumentos, en el encabezado de la funcin se debe incluir el nombre de las variables. Enseguida del encabezado est el cuerpo de la funcin que contiene, encerrados entre llaves, los enunciados ejecutables propios del trabajo a ejecutar por la funcin. Si la funcin devuelve un tipo de valor, ste se debe especificar al final del cuerpo de la funcin. Con toda la informacin reunida hasta este punto, estamos en condicin de escribir un programa que demuestre el prototipo y definicin de una funcin. Primero escribo la definicin de la funcin y despus copio el encabezado de la misma para formar el prototipo, agregandole un punto y coma al final del enunciado.

//********************************************************* // funcion1.cpp // Demuestra el prototipo y definicin de una funcin //********************************************************* #include <iostream.h> // Prototipo de funciones void resta(int valor1, int valor2); int multiplica(int, int);

// Funcin principal int main() { int numero1, numero2, resultado; cout << "Introduzca dos numeros" << endl; cin >> numero1 >> numero2; resta(numero1, numero2); // llama a la funcin "resta" resta(numero2, numero1); resultado = multiplica(numero1, numero2); cout << "La multiplicacion de los dos valores es: " << resultado << endl; return 0; } // Funcin resta void resta(int valor1, int valor2) { int sustraccion; // variable local sustraccion = valor1 - valor2; cout << "La resta de los dos valores es: " << sustraccion << endl; } // Funcin multiplica int multiplica(int valor1, int valor2) { int local; // variable local local = valor1 * valor2; return local; } En el cdigo funcion1.cpp se demuestra el uso bsico de las funciones en un programa C++, se aprecia en primer lugar el prototipo de dos funciones, una llamada resta y la otra propiamente llamada multiplica, utilizando nombres significativos para las funciones evitamos hacer comentarios redundantes y facilitamos la lectura del cdigo. En el prototipo de la funcin resta est especificada la palabra clave void lo que nos indica que la funcin resta no devuelve valor alguno al programa que la llame, adems especifica dos variables de tipo int llamadas valor1 y valor2 para ser utilizadas como argumentos de la misma. Recuerde que en el prototipo de la funcin no es necesario incluir los nombres de las variables utilizadas como argumentos, esto se demuestra el el prototipo de la funcin llamada multiplica que como est indicado, devuelve un valor de tipo int y requiere dos variables de tipo int como argumentos.

Ya en el cuerpo de la funcin principal, main( ) el programa empieza declarando tres variables llamadas numero1, numero2 y resultado, le solicita introducir dos nmeros que son almacenados en las variables numero1 y numero2 y entonces llama en primer lugar a la funcin llamada resta( ) en la lnea 21 pasandole como argumentos las variables llamadas numero1 y numero2. El programa entonces brinca a la parte del cdigo donde se encuentra la funcin llamada resta( ), en el encabezado de sta funcin vemos que se especifican para los argumentos de la funcin los nombres de dos variables, valor1 y valor2, en el encabezado de la funcin s es obligatorio especificar el nombre de las variables utilizadas como argumentos, se trata en efecto, de la declaracin de dos variables de tipo int que sern utilizadas en forma local por la funcin. Dentro del cuerpo de la funcin resta se declara una variable int llamada sustraccion en donde se almacena el resultado de restar los valores pasados como argumentos a la funcin, ste resultado se despliega en pantalla como parte de los enunciados ejecutables de la funcin. La funcin resta( ) no devuelve un valor al programa, as que una vez terminados los enunciados ejecutables de la misma la ejecucin del programa contina en la lnea 22, pero entonces el programa vuelve a llamar a la funcin resta( ), sin embargo observe que los argumentos estn invertidos con respecto a la llamada anterior, sto demuestra que los valores se pasan a la funcin en el orden en que son colocados en la llamada, de tal manera que en la segunda llamada a la funcin resta( ), valor1 toma el valor almacenado en la variable llamada numero2 y valor2 toma el valor almacenado en numero1. Despus de ejecutar por segunda vez la funcin resta( ) el programa contina en la lnea 24 en donde se asigna a la variable llamada resultado el valor devuelto por la funcin llamada multiplica( ) a la que nuevamente le pasamos como argumentos los valores almacenados en las variables llamadas numero1 y numero2, esto es, el programa llama a la funcin multiplica( ) y ya en el cuerpo de sta funcin se declara una variable local de tipo int llamada local en donde se almacena el resultado de multiplicar los valores pasados a la funcin como argumentos, despus la funcin devuelve el valor almacenado en la variable llamada local. Finalmente el programa despliega el valor almacenado en resultado y termina devolviendo al sistema el valor de 0.

Funciones con argumentos


Escribe un programa que calcule la potencia de un nmero real. La funcin main debe solicitar: El nmero real o base de la potencia. El exponente que es un nmero entero. Tienes que definir una funcin con el siguiente prototipo: double potencia (double base, int exponente); La funcin main puede enviar el valor de la base y el exponente a la funcin potencia sin necesidad de utilizar variables globales. Solucin 1 #include <stdio.h> double potencia (double base, int exponente) { int i; double pot; for (i=0, pot=1; i<exponente; i++) pot *= base; return pot; } void main () { double b, resultado; int exp; printf ("Introduzca base: "); scanf ("%lf", &b); printf ("Introduzca exponente: "); scanf ("%d", &exp); resultado = potencia (b, exp); printf ("%lf elevado a %d es %lf\n", b, exp, resultado); }

Solucin 2 Funciona tanto para exponentes positivos como negativos. El formato %g es ms flexible que %.lf pues se adapta a las cifras significativas del nmero real que se representa. #include <stdio.h> double potencia (double base, int exponente) { int i; double resultado, negativo = 1; if (exponente < 0) negativo = -1; /* exponente * negativo siempre es positivo */ for (i=0, resultado=1; i<exponente*negativo; i++) resultado *= base; if (negativo == -1) resultado = 1.0 / resultado; return resultado; } void main() { double b; int e; printf ("Introduzca una base: "); scanf ("%lf", &b); printf ("\nIntroduzca un exponente: "); scanf ("%d", &e); printf ("\nEl resultado es = %g\n\n", potencia (b, e)); }

INSTITUTO POLITECNICO NACIONAL ESCUELA SUPERIOR DE INGENIERIA MECANICAY ELECTRICA

INGENIERIA EN COMUNICACIONES Y ELECTRONICA

ARGUMENTOS CON FUNCIONES

ALUMNO:

Caballero Chvez Cecilia

GRUPO :

1CM10

MATERIA: Fundamentos de Programacin

PROFESORA:

Ma. Guadalupe Bauchan

You might also like