UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS ESCUELA DE COMPUTACION GUIA DE LABORATORIO #03 CICLO: 02/ 2015 Nombre de la Practica: ARREGLOS EN C# Lugar de Ejecución: Centro de Computo Tiempo Estimado: 2 horas y 30 minutos MATERIA: Desarrollo de aplicaciones con software propietario I. OBJETIVOS Que el estudiante sea capaz de: Manejar cantidades masivas Arreglos/Vectores/Matrices Planificar los arreglos necesarios dentro de un programa Utilizar las combinaciones correctas de estructuras repetitivas para acceder a los elementos de un Vector Crear diversas aplicaciones haciendo uso de los tipos de arreglos de datos de un mismo tipo de datos por medio de los II. INTRODUCCION TEORICA ARREGLOS Y VECTORES Los Arreglos se utilizan para almacenar un conjunto de variables, que sean del mismo tipo de dato, y todas estas bajo un mismo nombre. Por ejemplo imaginemos que tenemos 4 variables de tipo String que almacenan nombres (nombre1, nombre2, etc.). Si yo ahora quisiera pasar todas estas cadenas a mayúsculas tendría que utilizar la función ToUpper con cada variable, así: nombre1 = nombre1.ToUpper(); nombre2 =nombre2.ToUpper(), etc. En cambio sí utilizara un arreglo solucionaría mi problema, de esta manera: Siguiendo el ejemplo anterior: en vez de escribir la sentencia ToUpper 4 veces para cada variable, hemos utilizado un arreglo llamado nombres con un número de índice 4, es decir que almacena 4 datos de tipo String. Por supuesto ese índice de 4 puede ser un número muchísimo mayor, según sea la necesidad. DECLARACIÓN DE LOS ARREGLOS EN EL CÓDIGO Para crear un arreglo se debe en primer lugar declararlo como cualquier otra variable, la única diferencia es que debemos indicar la cantidad de elementos que contendrá el arreglo, colocando el número de índice entre paréntesis. Observe los ejemplos: 1 Guía # 03: ARREGLOS EN C# Ejemplo 1: La instrucción siguiente crea un arreglo de 16 elementos o datos de tipo integer: Ejemplo 2: La sentencia a continuación crea un arreglo de 11 elementos o datos de tipo String: Como podemos ver en el primer ejemplo hemos declarado un arreglo llamado miArreglo y entre paréntesis hemos declarado el rango de capacidad del mismo, es decir la cantidad de datos que podrá contener El primer número, el número 15 indica el límite máximo del arreglo, conformando de esta manera un arreglo que podrá almacenar 16 datos de tipo int. En el segundo ejemplo, declaramos un arreglo de 11 elementos de tipo string. Como puedes ver, hemos indicado solo un número que representa el valor máximo del mismo. Cabe aclarar que hemos puesto de índice el número 10, pero en realidad el arreglo contiene 11 elementos ya que como NO indicamos el límite inferior, se asume que el mismo comienza desde el 0. Importante: los arreglos se dividen en 2 grupos, los vectores y las matrices. Los vectores son arreglos que contienen una sola dimensión y las matrices 2 o más dimensiones. ACCEDER A LOS DATOS DE UN ARREGLO Para acceder a los datos de un arreglo o vector, debemos hacerlo mediante el índice o número del elemento del mismo. Por ejemplo: Primero declaramos un arreglo llamado alumnos, de tipo string y que contendrá 4 elementos. Luego le asignamos un valor de cadena como a cualquier otra variable de tipo string, pero con la diferencia que para referirnos al elemento utilizamos el n° de índice del mismo. Otro ejemplo: En este último ejemplo, declaramos y creamos un vector de 3 elementos que contendrá el nombre de 3 países. Luego en un bucle For utilizamos la función MessageBox para mostrar los elementos del arreglo, pasándole como parámetro del índice la variable x del bucle For. LAS MATRICES Como se dijo anteriormente, las matrices son arreglos de más de 1 dimensión (2 o más), a diferencia de los vectores que poseen una sola dimensión. Podemos imaginar una matriz bidimensional (2 dimensiones), como una cuadrícula con filas y columnas, donde las filas representarían las coordenadas x y las columnas las coordenadas y. Desarrollo de Aplicaciones con Software Propietario 2 Guía # 03: ARREGLOS EN C# A una matriz de 3 dimensiones o tridimensional se la puede imaginar con las coordenadas x, y, z, y esta es ideal para representar figuras en el espacio por ejemplo. Las matrices se declaran en el código de manera igual que los vectores, con la diferencia que debemos indicar más subíndices de acuerdo a la cantidad de dimensiones que posea la matriz. Por lo general no se suele utilizar matrices de más de 3 dimensiones. EJEMPLO DE MATRIZ DE 2 DIMENSIONES Dada una Matriz bidimensional de 6 x 8 (de 2 dimensiones). Si luego quisiera acceder a los datos de la misma basta con referirnos a los subíndices. Por ejemplo: El total de índices posibles para almacenar datos o valores en el ejemplo anterior es de 48 datos, ya que si multiplicamos 6 x 8 nos da como total 48 valores posibles para utilizar en la matriz bidimensional. En este otro ejemplo creamos una matriz de 3 dimensiones de 3 x 3 x 3: Para acceder a los datos sería exactamente de la misma manera pero debemos utilizar un índice más. Algunos ejemplos de acceso a los elmenetos de matriz cubo serian: En el ejemplo anterior, que es un poco extenso, es para que veas todos los posibles valores que puedes almacenar en una matriz de 3 x 3 x 3, y que da como resultado un arreglo de 27 valores posibles. COLECCIONES Una matriz es simplemente una de las muchas opciones para almacenar conjuntos de datos utilizando C#. La opción que seleccione depende de varios factores, tales como la forma en que piensa manipular o tener acceso a los elementos. En el ejemplo siguiente se muestra cómo usar la clase List(OfT). Observe que a diferencia de la clase Array, los elementos se pueden insertar en medio de la lista. Este ejemplo restringe los elementos de la lista a fin de que sean cadenas. var salmons = new List<string>(); salmons.Add("chinook"); salmons.Add("coho"); salmons.Add("pink"); salmons.Add("sockeye"); foreach (var salmon in salmons) { Console.Write(salmon + " "); } Desarrollo de Aplicaciones con Software Propietario 3 Guía # 03: ARREGLOS EN C# La colección genérica Ditionary permite obtener acceso a los elementos en una colección utilizando la clave de cada elemento. Cada elemento que se agrega al diccionario está compuesto de un valor y su clave asociada. Recuperar un valor utilizando su clave es muy rápido debido a que la clase Dictionary se implementa como una tabla hash Dictionary<string, string> palabras = new Dictionary<string, string>(); palabras.Add("Saludo","Hola"); palabras.Add("Despedida", "Adios"); foreach(var item in palabras.Keys){ lstPalabras.Items.Add(item); } FUNCIÓN JOIN, SPLIT : Visual Basic en su sexta versión incorpora estas 3 funciones para trabajar solo con vectores. Estas funciones están relacionadas con el tratamiento de las cadenas de caracteres. FUNCIÓN JOIN Esta función se utiliza para unir en una sola variable el conjunto de subcadenas de un vector. Esta función tiene solo 2 parámetros y es muy fácil de usar. Ejemplo: Ahora ejecutando Join, la variable cadena pasaría a valer "Carlos-Pedro-Juan" Nota: En el primer parámetro debe indicar un delimitador de carácter para separar las cadenas. Si no especificamos ninguno, c# utilizará por defecto un espacio vacío o en blanco (" ") para separar cada subcadena. Y en el segundo parámetro de la función debemos indicar el vector en el cual trabajar. FUNCIÓN SPLIT Esta función hace el trabajo inverso de la función Join. Split se utiliza para rellenar un vector dinámico que contiene un número de subcadenas a partir de una cadena que le pasamos como parámetro a la función. Para aclarar un poco un ejemplo: Nota: una cosa importante es que en el vector anterior no se ha declarado un rango, ya que la función devuelve un vector cuya cantidad de elementos se ignora, es decir no se conoce. Desarrollo de Aplicaciones con Software Propietario 4 Guía # 03: ARREGLOS EN C# III. MATERIALES Y EQUIPO Para la realización de la guía de práctica se requerirá lo siguiente: No. Requerimiento Cantidad 1 Guía de Laboratorio #03 1 2 PC con Microsoft Visual Studio 2012 .NET instalado 1 3 Memoria USB 1 4 Computadora con acceso a Internet 1 IV. PROCEDIMIENTO Para esta práctica deberá crear una carpeta con el nombre de “Práctica3LP1”, en la cual va a guardar todos los archivos de esta práctica y de análisis de resultados. PARTE I: APLICACIÓN DE UN ARREGLO UNIDIMENCIONAL Problema a Solucionar: Realizar una aplicación de formularios Windows, que contenga un textbox en el cual se introduzcan 5 números, estos deberán ser almacenadas dentro de un vector y se mostraran en una ListBox, esta aplicación a su vez debe tener un botón que diga “Ordenar”, el cual deberá mostrar el vector ordenado en una segunda ListBox. 1. La Solución deberá ser similar a la siguiente pantalla en la Figura 1.1. Realice el cambio de propiedades de los controles utilizados según la tabla indicada ahí. N° 1 Elemento Label1 Name lblnumero 2 3 4 5 6 7 TextBox Button1 Button2 ListBox1 ListBox2 Form2 txtNum btAgregar btOrdenar lstdesorden lstOrdenada Text Ingresar Numero: Agregar Ordenar Ordenar Figura 1.1: Diseño de formulario y controles a utilizar 2. Declaramos el vector matriz global (a nivel de la clase Form2) para que almacene los números cada vez que le demos click al “btAgregar” //declaracion global de arreglo int[] matriz = new int[5]; Desarrollo de Aplicaciones con Software Propietario 5 Guía # 03: ARREGLOS EN C# 3. Digite el código detallado a continuación, en los evento y objetos especificados: Objeto btAgregar Evento Click if(i<=5){ matriz[i]=Convert.ToInt16(txtNum.Text); //agregamos los numeros en cada posicion del arreglo lstdesorden.Items.Add(matriz[i]);//agregamos los numeros a i+=1; txtNum.Clear();//limpiar txtnum txtNum.Select();//colocar cursos en txtnum la lista } else{ MessageBox.Show("No se puede ingresar mas datos","Advertencia",MessageBoxButtons.OK,MessageBoxIcon.Information); } Click btOrdenar int j, k, count; double valor; int Tam = 5; //---ordenamos el arreglo por le metodo de la burbuja for (j = 0; j < Tam;j++ ) { for (k = 0; k < (Tam - 1);k++ ) { if(matriz[k]>matriz[k+1]){ valor = matriz[k]; matriz[k] = matriz[k + 1]; matriz[k + 1] = Convert.ToInt16(valor);} } } //recorremos el arreglo e ingresamos los valores a la lista lstOrdenada.Items.Clear(); for (count = 0; count < Tam;count++ ) { lstOrdenada.Items.Add(matriz[count]); } PARTE II: USO DE UNA MATRIZ DE 3X3 Problema a Solucionar: Realizar una aplicación de formularios Windows, que permita almacenar el nombre, apellido y edad en una matriz de 3x3. Dicha aplicación debe ser capaz de mostrar y limpiar los datos de la matriz, calcular el promedio de edades. 1. La Solución deberá ser similar a la siguiente pantalla en la Figura 1.2. Realice el cambio de propiedades de los controles utilizados según la tabla indicada ahí. Desarrollo de Aplicaciones con Software Propietario 6 Guía # 03: ARREGLOS EN C# Figura 1.2: Diseño de formulario y controles a utilizar N° 1 2 3 4 5 6 7 8 Elemento Form3 GroupBox1 GroupBox2 GroupBox3 Label1 Label2 Label3 ComboBox1 9 10 11 12 13 14 15 16 TextBox1 TextBox2 Button1 Button2 Button3 Button4 Button5 DataGridView 2. Name Text Formulario Informacion Matriz Mantenimientos Tipo de información Digite la información Edad gbInformacon gbMatriz gbMantenimiento Lbtipo_info Lbdig_info lbedad cbtipoinfo Items Enable Nombre Apellido txtInfo txtEdad btAgregar btMostrar btLimpiar btPromedio &Agregar Mostrar Matriz Limpiar Matriz Promedio Salir dgdatos Declaramos la matriz global (a nivel de la clase Form2) para que almacene la información cada vez que le demos click al “btAgregar” //Declaración de matriz string[,] matriz = new string[3,3]; //variables para movernos dentro de las posiciones de la matriz public int fila1, colum1, fila2, colum2, fila3, colum3, countergen, i; Desarrollo de Aplicaciones con Software Propietario 7 Guía # 03: ARREGLOS EN C# 3. Digite el código detallado a continuación, en los evento y objetos especificados: Objeto Evento txtInfo KeyPress //validación de solo letras if (!(char.IsLetter(e.KeyChar)) && (e.KeyChar != (char)Keys.Back)) { MessageBox.Show("Solo se permiten letras", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); e.Handled = true; return; } txtEdad KeyPress //validacion solo numeros if (Char.IsDigit(e.KeyChar)){e.Handled = false;} else if (Char.IsControl(e.KeyChar)){e.Handled = false;} else if (Char.IsSeparator(e.KeyChar)){e.Handled = false;} else { e.Handled = true; MessageBox.Show("Solo se permiten Números", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } btAgregar //posiciones de la colum1 = colum2 = colum3 = Click columna de la matriz 0; 1; 2; //verificamos el combobox1 if (cbtipoinfo.SelectedIndex == 0) { if (txtInfo.Text == "") { txtInfo.BackColor = Color.Bisque; } else { if (fila1 < 3) { //agregamos el dato en la posicion [fila1,column1] de la matriz matriz[fila1, colum1] = txtInfo.Text; //pasamos a la siguiente fila de la matriz fila1 += 1; MessageBox.Show("Nombre ingresado exitosamente", "", MessageBoxButtons.OK); //limpiamos el texboxt1 txtInfo.Clear(); } else { MessageBox.Show("No se pueden agregar mas nombres", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } else { if (cbtipoinfo.SelectedIndex == 1) { if (txtInfo.Text == "") Desarrollo de Aplicaciones con Software Propietario 8 Guía # 03: ARREGLOS EN C# { txtInfo.BackColor = Color.Bisque; } else { if (fila2 < 3) { //Agregamos el dato en la posicion (fila2,colum2) de la matriz matriz[fila2, colum2] = txtInfo.Text; //pasamos a la siguiente fila de la matriz fila2 += 1; MessageBox.Show("Apellido ingresado exitosamente"); txtInfo.Clear(); } else { MessageBox.Show("No se pueden agregar mas apellidos"); } } } else { MessageBox.Show("Seleccione una opción"); } } if (IsNumeric(txtEdad.Text) == true) { if (fila3 < 3) { //Agregamo el dato en la posicion [fila3,colum3] de la matriz matriz[fila3, colum3] = txtEdad.Text; //pasamos a la siguiente fila de la matriz fila3 += 1; MessageBox.Show("Edad ingresada exitosamente"); //limpiamos el textbox1 txtEdad.Clear(); countergen += 1; } else { MessageBox.Show("No se pueden agregar mas edades"); } } else { txtEdad.BackColor = Color.Beige; } btMostrar Click //limpiando grilla dgdatos.Columns.Clear(); //creando columnas dgdatos.ColumnCount = 3; dgdatos.Columns[0].Name = "Nombre"; dgdatos.Columns[1].Name = "Apellido"; dgdatos.Columns[2].Name = "Edad"; dgdatos.Rows.Add(); dgdatos.Rows.Add(); //agregando datos a grilla Desarrollo de Aplicaciones con Software Propietario 9 Guía # 03: ARREGLOS EN C# //Mostrando nombres dgdatos.Rows[0].Cells[0].Value=matriz[0,0]; dgdatos.Rows[0].Cells[1].Value = matriz[0, 1]; dgdatos.Rows[0].Cells[2].Value = matriz[0, 2]; //Mostrando apellidos dgdatos.Rows[1].Cells[0].Value = matriz[1, 0]; dgdatos.Rows[1].Cells[1].Value = matriz[1, 1]; dgdatos.Rows[1].Cells[2].Value = matriz[1, 2]; //Mostrando edades dgdatos.Rows[2].Cells[0].Value = matriz[2, 0]; dgdatos.Rows[2].Cells[1].Value = matriz[2, 1]; dgdatos.Rows[2].Cells[2].Value = matriz[2, 2]; btLimpiar Recorrer la matriz para limpiar cada posición de ella Inicializar las variables filas y columnas a cero. Limpiar la grilla. btPromedio Click Click Sacar promedio de los datos de edad guardados en la matriz y mostrarlo en un messagebox. btPromedio Click Programe el botón Salir PARTE III: USO DE COLECCIONES Problema a Solucionar: Realizar una aplicación de formularios Windows, que muestre una lista de palabras, que al seleccionar una muestre su respectivo significado. 1. La Solución deberá ser similar a la siguiente pantalla en la Figura 1.3. Realice el cambio de propiedades de los controles utilizados según la tabla indicada ahí. Figura 1.3: Diseño de formulario y controles a utilizar Desarrollo de Aplicaciones con Software Propietario 10 Guía # 03: ARREGLOS EN C# N° 1 2 3 4 5 Elemento Form3 Label1 ListBox1 Textbox1 Button1 Name lblpalabra lstPalabras txtsignificado btnsalir Text Formulario Palabra Items Enable true false Salir 1. Declaramos la el directorio global (a nivel de la clase Form3) para que almacene la información //valida que el dato recibido es un numero public static Boolean IsNumeric(string valor) { int result; return int.TryParse(valor, out result); } Dictionary<string, string> palabras = new Dictionary<string, string>(); 2. Digite el código detallado a continuación, en los evento y objetos especificados: Objeto Form3 Evento Load //agregamos datos al diccionario palabras.Add("Manzana", "La manzana es una fruta pomácea comestible, fruto\n del manzano doméstico (Malus domestica)\n, otros manzanos (especies del género\n Malus)."); palabras.Add("Pera","La pera es una fruta comestible que procede del Pyrus communis, un árbol que se conoce coloquialmente como peral común. Existen, de todas maneras, muchas clases de peras, que son producidas por otros árboles del género Pyrus."); palabras.Add("Melocotón", "Fruto del melocotonero. Es una drupa de olor agradable, esférica, de seis a ocho centímetros de diámetro, con un surco profundo que ocupa media circunferencia, epicarpio delgado, velloso, de color amarillo con manchas encarnadas, mesocarpio amarillento, de sabor agradable y adherido a un hueso pardo, duro y rugoso, que encierra una almendra muy amarga."); //recorre el diccionario para llenar la lista con la llave foreach(var item in palabras.Keys){ lstPalabras.Items.Add(item); } lstPalabras SelectedIndexChanged string buscar; buscar=lstPalabras.Text; //buscamos dato de la lista dentro del diccionario for (int i = 0; i < palabras.Count;i++ ) { var item =palabras.ElementAt(i); if (buscar== item.Key){ lblPalabra.Text = item.Key; txtsignificado.Text = item.Value; break; } } btnsalir Agrege el código para salir del formulario Desarrollo de Aplicaciones con Software Propietario 11 Click Guía # 03: ARREGLOS EN C# V. DISCUSION DE RESULTADOS PROBLEMAS A RESOLVER: Para los siguientes ejercicios, realizar un solo proyecto de Aplicación Windows, con la resolución de los problemas en forms Distintos: 1. Cree un programa para manejar una lista de nombres. El programa permitirá al usuario añadir, eliminar y modificar los nombres de la lista, a través de los siguientes botones: Añadir Nombre, Borrar Nombre, Modificar Nombre, Salir. 2. Cree un programa que cree una matriz cuadrada cuyos elementos se generan aleatoriamente y cuya dimensión la determina el usuario. A partir de dicha matriz, el programa calculara su traspuesta, intercambiando en dicha matriz sus filas por sus columnas. 3. Las notas de un colegio se tienen en una matriz de 6 x 5 elementos (10, número de alumnos; 5, número de asignaturas). Se desea listar las notas de cada alumno y su media. Cada alumno tiene como mínimo 2 asignaturas y máximo 5, aunque los alumnos no necesariamente todos tienen que tener 5 materias. VII. BIBLIOGRAFÍA Título: Aprenda ya Microsoft Visual C#.NET. Autores: Sharp, John Jagger, Jon Coautor Publisher: Madrid, España: McGraw-Hill, 2002. Clasificación: Libro 005.362 S581 2002 Título: C # Manual de Programación. Autores: Luis Joyanes Aguilar y Matilde Fernández Azuela Publisher: Madrid, España: McGraw-Hill, 2002 Clasificación: Libro 005.362 J88 2002 Desarrollo de Aplicaciones con Software Propietario 12