Está en la página 1de 12

IMPLEMETACION DE BASES DE DATOS TEMA

Informe de Laboratorio

RESUMEN

Qu se va a investigar?
A continuacin vamos a tratar el tema de Paso de parmetros por referencia, se pueden pasar parmetros/variables por referencia. En este caso, se utilizan las mismas variables (direcciones fsicas de memoria). Al no hacer copia de las variables de entrada, debemos tener en cuenta que cualquier cambio, en el valor de alguna variable, se mantendr una vez finalizada la funcin. Esta modalidad de paso de parmetros suele utilizarse para implementar funciones que devuelvan ms de un valor, ya que ahora podemos definir funciones que devuelvan:

a). El valor de retorno por defecto, y b). Las variables por referencia o parmetros de salida empleados.

Cmo se realizar la investigacin?


La investigacin se realizara formando grupos de trabajo para investigar los diferentes puntos a tratar en el presente tema, dichos grupos de trabajo harn uso de herramientas como la internet, libros para obtener la informacin requerida necesaria para la construccin de nuestro trabajo.

Qu se espera del proyecto de investigacin?


Diferenciar el paso de variables/parmetros a una funcin por referencia y por valor, en el presente hablaremos sobre el paso por referencia, con respectivas aplicaciones en los distintos lenguajes de programacin (C++, Basic, Java, C#, Phyton) para su mejor entendimiento.

Con qu personas y recursos se realizar la investigacin?


Los alumnos integrantes del grupo Jhilapz, haciendo uso del internet (wikis, blog, monografas), hemos realizado de la siguiente investigacin.

Cunto tiempo tomar realizar la investigacin?


El tiempo promedio estimado es de 2 das, dividiendo el trabajo entre todos los integrantes del ya mencionado grupo de estudio.

Palabras clave: Funciones por Referencia

1. INTRODUCCION
Descripcin cronolgica del tema Los parmetros son los datos que reciben las funciones y que utilizan para realizar las operaciones de la funcin. Una funcin puede recibir cualquier nmero de parmetros, incluso ninguno. A la hora de definir la funcin, en la cabecera, se definen los parmetros que va a recibir. function f1 (parametro1, parmetro2) As definimos una funcin llamada f1 que recibe dos parmetros. Como se puede observar, no se tiene que definir el tipo de datos de cada parmetro. Los parmetros tienen validez durante la ejecucin de la funcin, es decir, tienen un mbito local a la funcin donde se estn recibiendo. Cuando la funcin se termina, los parmetros dejan de existir. De que se trata el Tema a desarrollar En numerosas ocasiones se requiere que ciertos parmetros sirvan como parmetros de salida, es decir, se devuelvan los resultados a la unidad o programas que llama. Este mtodo se denomina paso por referencia o tambin de llamada por direccin o variable. La unidad que llama pasa a la unidad llamada direccin del parmetro actual. Una referencia al correspondiente parmetro formal se trata como una referencia a la posicin de memoria, cuya direccin se ha pasado. Entonces una variable pasada como parmetros reales compartida, es decir, se puede modificar directamente por el programa. Diferencias con respecto a temas similares Las funciones, por norma general, resuelven algn subproblema requerido desde el programa principal o desde otra funcin. Para ello, en la mayora de ocasiones, necesitarn recibir parmetros (a modo de variables) desde el programa que las invoca, de forma que puedan operar con ellos y conseguir su objetivo. El paso de estos parmetros/variables puede implementarse en C++ de dos formas distintas: En primer lugar, todo sub/programa que llama a una funcin puede enviarle los parmetros necesarios por valor. En este caso, la funcin al recibir los parmetros se har una copia de los mismos y operar con esta copia, de modo que, las variables del sub/programa principal enviadas como parmetros no se vern afectadas (aunque se modifiquen en la funcin, realmente se modifica la copia). Por esta razn se dice que los parmetros pasados por valor son, parmetros de entrada a la funcin. En segundo lugar, en C++ se pueden pasar parmetros/variables por referencia. En este caso, se utilizan las mismas variables (direcciones fsicas de memoria). Al no hacer copia de las variables de entrada, debemos tener en cuenta que cualquier cambio, en el valor de alguna variable, se mantendr una vez finalizada la funcin. Esta modalidad de paso de parmetros suele utilizarse para implementar funciones que devuelvan ms de un valor, ya que ahora podemos definir funciones que devuelvan: a) el valor de retorno por defecto, y b) las variables por referencia o parmetros de salida empleados.

2. OBJETIVOS
Aprender que el paso de una variable por valor, ests asegurando que dicho valor no va a ser modificado por equivocacin. Por otro lado, al pasar una variable por referencia, aunque la variable puede ser modificada por equivocacin, ahorramos tiempo de ejecucin y memoria, puesto que no es necesario crear una copia de la variable.

3. MARCO CONCEPTUAL
Teoras sobre la cual basa el tema El paso de parmetros por referencia consiste en proporcionar a la subrutina a la que se le quiere pasar el argumento la direccin de memoria del dato. En este caso se tiene un nico valor referenciado (o apuntado) desde dos puntos diferentes, el programa principal y la subrutina a la que se le pasa el argumento, por lo que cualquier accin sobre el parmetro se realiza sobre el mismo dato en la memoria. Todas las variables que pasamos a un mtodo declarado normalmente, son por valor. Para pasar argumentos por referencia es necesario utilizar las palabras reservada ref o out, tanto al declarar el mtodo como al invocarlo. Cuando pasamos un argumento usando ref, es necesario que dicha variable est ya inicializada, de lo contrario obtendremos una excepcin. Si la variable que deseamos pasar por referencia no est inicializada, es nesesario usar out, de tal manera que podamos inicializar la variable dentro del contexto del mtodo.

4. PROCEDIMIENTOS
Ejemplo de Introduccin

Analicemos el siguiente cdigo:

Public Class Form1 Private Sub btnAcccion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAcccion.Click Dim X As Integer 'Paso 1 X = 120 'Paso 2 proc(X) 'Paso 3 MsgBox("NUEVO VALOR DE X: " & X) 'Paso 6 End Sub Private Sub proc(ByRef A As Integer) MsgBox("VALOR DE A: " & A) A = 200 End Sub End Class

'Paso 3 'Paso 4 'Paso 6

1. Al darle click en ACCION, nos mostrara:

2. Luego nos mostrara:

Esquema de que es lo que sucede en la memoria:

Cdigos fuentes REF and OUT

Introduccin
En C#, como en Java, u otros lenguajes de programacin, es posible pasar variables a los mtodos (funciones) de dos maneras: Por referencia y Por valor. La diferencia entre el uno y el otro es bsicamente que:

Cuando una variable es pasada por valor, el mtodo recibe una copia del valor de la variable. Por lo tanto, los cambios realizados a esa variable dentro del contexto de la funcin, NO afecta a la variable original. Pero

Cuando es pasada por referencia, el mtodo recibe la referencia a la variable original. Por tanto los cambios realizados a esa variable dentro del contexto de la funcin, AFECTA a la variable original.

Cul debo usar?


Eso depende de lo que quieras hacer. Cada una tiene sus ventajas y desventajas. Al pasar una variable por valor, ests asegurando que dicho valor no va a ser modificado por equivocacin. Por otro lado, al pasar una variable por referencia, aunque la variable puede ser modificada por equivocacin, ahorramos tiempo de ejecucin y memoria, puesto que no es necesario crear una copia de la variable.

Pasar variables por referencia


Todas las variables que pasamos a un mtodo declarado normalmente, son por valor. Para pasar argumentos por referencia es necesario utilizar las palabras reservada ref o out, tanto al declarar el mtodo como al invocarlo. Cuando pasamos un argumento usando ref, es necesario que dicha variable est ya inicializada, de lo contrario obtendremos una excepcin. Si la variable que deseamos pasar por referencia no est inicializada, es nesesario usar out, de tal manera que podamos inicializar la variable dentro del contexto del mtodo.

Ejemplo
En el siguiente ejemplo tenemos dos variables (y Y z), las cuales son procesadas por mtodos que reciben variables por valor y por referencia. El resultado y el cdigo son:

// Fig. 6.8: RefOutTest.cs // Demonstrating ref and out parameters. using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace RefOutTest { /// <summary> /// Summary description for Form1. /// </summary>

public class RefOutTest : System.Windows.Forms.Form { private System.Windows.Forms.Button showOutputButton; private System.Windows.Forms.Label outputLabel; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public RefOutTest() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.showOutputButton = new System.Windows.Forms.Button(); this.outputLabel = new System.Windows.Forms.Label(); this.SuspendLayout(); // // showOutputButton // this.showOutputButton.Location = new System.Drawing.Point(105, 8); this.showOutputButton.Name = "showOutputButton"; this.showOutputButton.Size = new System.Drawing.Size(83, 23); this.showOutputButton.TabIndex = 0; this.showOutputButton.Text = "Show Output"; this.showOutputButton.Click += new System.EventHandler(this.showOutputButton_Click); // // outputLabel // this.outputLabel.Location = new System.Drawing.Point(10, 40); this.outputLabel.Name = "outputLabel"; this.outputLabel.Size = new System.Drawing.Size(272, 104);

this.outputLabel.TabIndex = 1; // // RefOutTest // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(292, 149); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.outputLabel, this.showOutputButton}); this.Name = "RefOutTest"; this.Text = "RefOutTest"; this.ResumeLayout(false); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new RefOutTest()); } // x passed by reference and method modifies // original variable's value void SquareRef( ref int x ) { x = x * x; } // x passed as out parameter and method initializes // and modifies original variable's value void SquareOut( out int x ) { x = 6; x = x * x; } // x passed by value and method cannot modify // original variable's value void Square( int x ) { x = x * x; } private void showOutputButton_Click( object sender, System.EventArgs e ) { int y = 5; // create new int and initialize to 5 int z = 8; // declare z, but do not initialize it // display original values of y and z outputLabel.Text = "Original value of y: " + y + "\n"; outputLabel.Text += "Original value of z: "+ z +"\n"; // pass y and z by reference SquareRef( ref y ); SquareOut( out z );

// display values of y and z after modified by methods // SquareRef and SquareOut outputLabel.Text += "Value of y after SquareRef: " + y + "\n"; outputLabel.Text += "Value of z after SquareOut: " + z + "\n\n"; // pass y and z by value Square( y ); Square( z ); // display unchanged values of y and z outputLabel.Text += "Value of y after Square: " + y + "\n"; outputLabel.Text += "Value of z after Square: " + z + "\n";

} // end method showOutputButton_Click } }

Aplicaciones

5. CONCLUSIONES
Hasta ahora siempre hemos declarado los parmetros de nuestras funciones del mismo modo. Sin embargo, ste no es el nico modo que existe para pasar parmetros. La forma en que hemos declarado y pasado los parmetros de las funciones hasta ahora es la que normalmente se conoce como "por valor". Esto quiere decir que cuando el control pasa a la funcin, los valores de los parmetros en la llamada se copian a "objetos" locales de la funcin, estos "objetos" son de hecho los propios parmetros.

#include <iostream> using namespace std; int funcion(int n, int m); int main() \{ int a, b; a = 10; b = 20; cout << "a,b ->" << a << ", " << b << endl; cout << "funcion(a,b) ->" << funcion(a, b) << endl; cout << "a,b ->" << a << ", " << b << endl; cout << "funcion(10,20) ->" << funcion(10, 20) << endl; return 0; } int funcion(int n, int m) \{ n = n + 2; m = m - 5; return n+m; }

Bien, qu es lo que pasa en este ejemplo? Empezamos haciendo a = 10 y b = 20, despus llamamos a la funcin "funcion" con las objetos a y b como parmetros. Dentro de "funcion" esos parmetros se llaman n y m, y sus valores son modificados. Sin embargo al retornar a main, a y b conservan sus valores originales. Por qu? La respuesta es que lo que pasamos no son los objetos a y b, sino que copiamos sus valores a los objetos n y m. Piensa, por ejemplo, en lo que pasa cuando llamamos a la funcin con parmetros constantes, es lo que pasa en la segunda llamada a "funcion". Los valores de los parmetros no pueden cambiar al retornar de "funcion", ya que esos valores son constantes. Si queremos que los cambios realizados en los parmetros dentro de la funcin se conserven al retornar de la llamada, deberemos pasarlos por referencia. Esto se hace declarando los parmetros de la funcin como referencias a objetos. Por ejemplo:

#include <iostream> using namespace std; int funcion(int &n, int &m); int main() \{ int a, b; a = 10; cout << cout << cout << /* cout b = 20; "a,b ->" << a << ", " << b << endl; "funcion(a,b) ->" << funcion(a, b) << endl; "a,b ->" << a << ", " << b << endl; << "funcion(10,20) ->" << funcion(10, 20) << endl; (1) es ilegal pasar constantes como parmetros cuando estos son referencias */ return 0; } int funcion(int &n, int &m) \{ n = n + 2; m = m - 5; return n+m; }
En este ejemplo los identificadores a y r se refieren al mismo objeto, cualquier cambio en una de ellos se produce en el otro, ya que son, de hecho, el mismo objeto. El compilador mantiene una tabla en la que se hace corresponder una direccin de memoria para cada identificador de objeto. A cada nuevo objeto declarado se le reserva un espacio de memoria y se almacena su direccin. En el caso de las referencias, se omite ese paso, y se asigna la direccin de otro objeto que ya exista previamente. De ese modo, podemos tener varios identificadores que hacen referencia al mismo objeto, pero sin usar punteros.

6. REFERENCIAS
Bibliografa JOYANES AGUILAR Luis, FUNDAMENTOS DE PROGRAMACIN: Algoritmos, estructura de datos y objetos (4ta edicion) pg. 219, 220 SENATI, Desarrollo de Aplicaciones .Net para Windows Parte II Web Site

http://es.wikipedia.org/wiki/Argumento_(inform%C3%A1tica) http://informatica.uv.es/iiguia/FP/pract_fp_n6_04.pdf http://c.conclase.net/curso/?cap=015 http://www.superhosting.cl/manuales/mas-sobre-funciones-paso-de-parametros.html http://www.onglasses.net/Default.aspx?id=1257

http://msdn.microsoft.com/es-es/library/038ya724(v=vs.80).aspx http://www.cristalab.com/tutoriales/variables-por-referencia-y-valor-en-php-c64201l/ http://sopa.dis.ulpgc.es/so/cpp/intro_c/introc69.htm http://www.desarrolloweb.com/articulos/1484.php http://www.ccg.unam.mx/~contrera/bioinfoPerl/node46.html

También podría gustarte