29 jul 2010

Arreglos con N-dimensiones "Matrices"

Un arreglo de dos o mas dimensiones es denominado tambien MATRIZ o TABLA. En la practica no es comun trabajar con matrices de de mas de 3 dimensiones, aunque es posible crearlos.

Una matriz bidimensional, esta compuesto por FILAS y COLUMNAS, asi por ejemplo, en la imagen de abajo tenemos una matriz de 5 columnas por 5 filas, donde para hubicar un elemento de esa matriz, se debe especificar ambas dimensiones matriz(fila, columna).
DECLARACION DE UNA MATRIZ EN .NET
Una matriz se declara al igual que un arreglo unidimensional, pero especificando todas las dimensiones que se deseen, asi por ejemplo, para declarar una matriz HORARIO de tipo STRING, que tendra 7 columnas (dias de la semana) y 24 filas (horas) se tiene:


01 Dim HORARIO(23, 6) As String
Tambien puede declarase una matriz sin rango inicial,  esto se utiliza cuando no sabemos de antemano cuantas dimensiones podra tener una matriz, por ejemplo:


01 Dim matriz(,) As Byte
Se declara una matriz de tipo byte, esta está vacia y hasta que no se especifique el rango de las dimensiones, al tratar de utilizar un elemento de esa matriz, este causa una excepcion.
Para declarar las dimensiones una ves creada la matriz, se utiliza la instruccion REDIM:

01 ReDim matriz(fila, columna)
Ejemplo:
Escribir un programa que permita multiplicar dos matrices leidas por teclado y visualizar la matriz resultante.

Solucion: Si las matrices A,B y la matriz resultante es C, se pueden multiplicar si el numero de columnas de la matriz A es igual al numero de filas de la matriz B; entonces la matriz C tiene el numero de filas de la matriz A y el numero de columnas de la matriz B. Los elementos de la matriz C se obtienen a partir de la siguiente ecuacion:
donde:

Codigo fuente:


01 Module Module1
02     Const maximo As Byte = 19
03 
04     'se crea una estructura tipo matriz con sus propios procedimientos
05     Structure matriz
06 
07         Public m(,) As Single
08 
09         Public Sub New(ByVal f As Single, ByVal c As Single)
10             ReDim m(f, c)
11         End Sub
12 
13         Public Sub introducir(ByVal t As String, ByVal nf As Byte, ByVal nc As Byte)
14             Dim i, j As Byte
15             Console.WriteLine(t)
16             Console.WriteLine("------------------------------------")
17             For i = 0 To nf
18                 For j = 0 To nc
19                     Console.Write("Matriz[" & i & "," & j & "]= ")
20                     m(i, j) = Val(Console.ReadLine)
21                 Next
22             Next
23             Console.WriteLine("------------------------------------")
24         End Sub
25 
26         Public Sub imprimir(ByVal t As String, ByVal nf As Byte, ByVal nc As Byte)
27             Dim i, j As Byte
28             Console.WriteLine(t)
29             For i = 0 To nf
30                 For j = 0 To nc
31                     Console.Write(m(i, j) & "   ")
32                 Next
33                 Console.WriteLine()
34             Next
35             Console.WriteLine()
36         End Sub
37 
38     End Structure
39 
40     Dim A As matriz = New matriz(maximo, maximo)
41     Dim B As matriz = New matriz(maximo, maximo)
42     Dim C As matriz = New matriz(maximo, maximo)
43 
44     Sub Main()
45         Dim num As Byte
46         Console.Write("Filas y columnas [i,j] = ")
47         num = Val(Console.ReadLine) - 1
48 
49         If num > maximo Then
50             Console.WriteLine("el limite es un maximo de " & maximo & " filas y columnas")
51         Else
52             A.introducir("Matriz A", num, num)
53             B.introducir("Matriz B", num, num)
54             multiplicar(num)
55             Console.Clear()
56             A.imprimir("Matriz A", num, num)
57             B.imprimir("Matriz B", num, num)
58             C.imprimir("Matriz A * B", num, num)
59         End If
60         Console.WriteLine("presione una tecla para terminar...")
61         Console.ReadLine()
62     End Sub
63 
64     'procedimiento publico que calcula el producto de dos matrices
65     Public Sub multiplicar(ByVal num As Byte)
66         Dim i, j, k As Byte
67         For i = 0 To num
68             For j = 0 To num
69                 For k = 0 To num
70                     C.m(i, j) = C.m(i, j) + A.m(i, k) * B.m(k, j)
71                 Next
72             Next
73         Next
74     End Sub
75 End Module

En la solucion de este problema, se hace uso de una STRUCTURE (visto en un post anterior) donde se declara la matriz y sus metodos. tambien se especifica como una constante el valor maximo que podra tener una matriz (columnas y filas).

Resultado:

Arreglos en VB.NET

Un array es un conjunto finito y ordenado de elementos homogeneos. Ordenado porque los elementos n-esimo de un array puede ser identificado, y homogeneo porque todos los elementos del array son del mismo tipo de datos.

El arreglo mas simple es el unidimensional (matriz de una dimension). A diferencia de Visual Basic clasico que nos permitia especificar los limites de un arreglo, en .NET un arreglo siempre empieca en 0 (cero), por tanto el arreglo tendra un elemento mas del valor indicado como indice superior.

En el ejemplo siguiente, se tiene un vector X de 5 elementos de tipo real. se nota que empieza en cero, por tanto su indice superior es 4 y no 5
DECLARACION DE UN ARREGLO EN VB.NET


01 DIMENSION Arreglo(indice_superior) TIPO_DE_DATOS

donde DIMENSION puede ser DIM, PUBLIC, PRIVATE, y TIPO DE DATOS, es el tipo de datos que tendra el arreglo, por ejemplo


01 'declara un arreglo con 12 elementos de tipo string
02 Dim meses(11) As String
03 'declara un arreglo con 7 elementos de tipo entero
04 Private dia_semana(6) As Byte
05 'declara un arreglo con 24 elementos de tipo real
06 Public hora(23) As Double
Ejemplo:
Se desea construir una aplicación que lea una lista de calificaciones de una clase y calcule su media e imprima la lista de calificaciones mayores a la media.


01 Module Module1
02     'constante que sirve para poner un limite al array
03     Const limite = 15
04     'se crea un array de tipo real
05     Dim lista_notas(limite) As Single
06 
07     Sub Main()
08         'declaraciones de variables
09         Dim numero As Integer
10         Dim suma As Single
11         Dim media As Single
12 
13         Console.Write("Introduzca numero de calificaciones: ")
14         numero = Val(Console.ReadLine)
15         If numero > limite Then
16             Console.WriteLine("No se procesan mas de " & limite & " calificaciones")
17         Else
18             suma = 0
19             Console.WriteLine("Introduzca calificaciones")
20             'a medida que el usuario introduce las calificaciones
21             'estas se colocan en el array
22             For i = 0 To numero - 1
23                 Console.Write("   Nota[" & (i + 1) & "]= ")
24                 lista_notas(i) = Val(Console.ReadLine)
25                 suma = suma + lista_notas(i)
26                 Console.WriteLine()
27             Next
28             'se obtiene la media
29             media = suma / numero
30             Console.WriteLine("La media es: " & media)
31             Console.WriteLine("-------------------------------------------------")
32             Console.WriteLine("Lista de Calificaciones mayores a la media es")
33             ' se recore el array buscando calificaiones mayores a la media
34             For i = 0 To numero - 1
35                 If lista_notas(i) > media Then
36                     Console.WriteLine("       " & lista_notas(i))
37                 End If
38             Next
39             Console.WriteLine("-------------------------------------------------")
40         End If
41         Console.WriteLine("presione una tecla para terminar...")
42         Console.ReadLine()
43     End Sub
44 
45 End Module

Resultado:

28 jul 2010

Tipos de usuario : Structure (2da parte)


Como vimos en la primera parte de Structures, los nuevos tipos en .NET, no solo permiten la declaraciones de diferentes datos, sino que ahora, tambien permiten la declaracion funciones y procedimientos que actuan como metodos a modo de clases sencillas.

Algo nuevo que tambien tiene el tipo Structure, es que a diferencia de visual basic clasico, ahora los datos declarados tambien necesitan que se especifique hasta donde podran ser usados esas variables, esto se hace antecediento al tipo de dato la etiqueta PUBLIC/PRIVATE/FRIENDS, con el primero los datos declarados podran ser usados en cualquier parte del programa, con el segundo, solo pueden ser usados dentro de Structure, con el tercero es una combinacion de public y private.

Se utlizará el mismo problema visto en la primera parte de este tutorial Structures

Ejemplo: 
se desea construir una aplicacion de consola, que dado el radio, la generatriz y la altura de un cono; calcule e imprima el area de la base , el area lateral, el area total y su volumen. Esta aplicación debe ser construida utilizando tipos de usario (Structure) para gestionar los datos.

Consideraciones:
El area de la base se calcula como:
AREA DE LA BASE = PI * RADIO^2

El area lateral se calcula:
AREA LATERAL = PI * RADIO * GENERATRIZ

El area toral se calcula como:
AREA TOTAL = AREA BASE + AREA LATERAL

El volumen se calcula:
VOLUMEN = (1/3) * AREA BASE * ALTURA

Codigo


01 Module Module1
02     'declaracion del tipo de usario "cono"
03     Structure cono
04         ' se declaran las variables como PRIVATE
05         Private radio As Single
06         Private altura As Single
07         Private generatriz As Single
08         Private area_base As Double
09         Private area_lateral As Double
10         Private area_total As Double
11         Private volumen As Single
12         'tambien se declara una constante PI
13         Private Const PI = 3.141592
14 
15         'se declara un constructor 
16         Public Sub New(ByVal r As Double, ByVal h As Double, ByVal g As Double)
17             radio = r
18             altura = h
19             generatriz = g
20         End Sub
21         'se declaran los metodos
22         Public Sub Leer() 'para leer y asignar datos
23             Console.Write("Radio= ")
24             radio = Val(Console.ReadLine)
25             Console.Write("Altura= ")
26             altura = Val(Console.ReadLine)
27             Console.Write("Generatriz= ")
28             generatriz = Val(Console.ReadLine)
29         End Sub
30 
31         Public Sub Imprimir() 'para imprimir los resultados en pantalla
32             Console.WriteLine("Area Base: " & area_base)
33             Console.WriteLine("Area Lateral: " & area_lateral)
34             Console.WriteLine("Area Total: " & area_total)
35             Console.WriteLine("Volumen: " & volumen)
36             Console.ReadLine()
37         End Sub
38 
39         Public Sub Calcular() 'para realizar las operaciones
40             area_base = PI * radio ^ 2
41             area_lateral = PI * radio * generatriz
42             area_total = area_base + area_lateral
43             volumen = (1 / 3) * area_base * altura
44         End Sub
45     End Structure
46 
47     'programa principal
48     Sub Main()
49         '-------------------------
50         Dim mi_cono As cono
51         mi_cono.Leer()
52         mi_cono.Calcular()
53         mi_cono.Imprimir()
54         '--------------------------
55         'tambien se puede declarar el tipo como si fuera una clase
56         Dim otro_cono As cono = New cono(1.61, 1.2, 2.05)
57         otro_cono.Calcular()
58         otro_cono.Imprimir()
59     End Sub
60 
61 End Module

RESULTADOS

Tipos de usuario : Structure

Los tipos propios de usuarios (Structure), son tipos compuestos de uno o mas miembros, cada uno de ellos pudiendo ser de cualquier tipo. Estas estructuras se utilizan cuando la informacion que se quiere manejar no es muy compleja y por tanto no se justifica el diseño de toda una clase para gestionarla.
En Visual basic 6 la declaracion de tipos propios de usario se realizaba utilizando las etiquetas TYPE y END TYPE, ahora en .NET estas etiquetas fueron reeemplazadas por STRUCTURE y END STRUCTURE.

ANTES


01 type mitipo
02  valor1 as Integer
03  valor2 as Integer
04 end type

AHORA


01 Structure mitipo
02  public valor1 as Integer
03  public valor2 as Integer
04 end Structure
Ejemplo: 
se desea construir una aplicacion de consola, que dado el radio, la generatriz y la altura de un cono; calcule e imprima el area de la base , el area lateral, el area total y su volumen. Esta aplicación debe ser construida utilizando tipos de usario (Structure) para gestionar los datos.
Consideraciones:
El area de la base se calcula como:
AREA DE LA BASE = PI * RADIO^2

El area lateral se calcula:
AREA LATERAL = PI * RADIO * GENERATRIZ

El area toral se calcula como:
AREA TOTAL = AREA BASE + AREA LATERAL

El volumen se calcula:
VOLUMEN = (1/3) * AREA BASE * ALTURA

Solucion:

01 Module Module1
02     'declaracion de tipo propio de usuario
03     Structure cono
04         Public radio As Single
05         Public altura As Single
06         Public generatriz As Single
07         Public area_base As Double
08         Public area_lateral As Double
09         Public area_total As Double
10         Public volumen As Single
11     End Structure
12 
13     Sub Main()
14         'se crea una variable del tipo creado por el usuario
15         Dim mi_cono As cono
16         'introduccion de datos
17         Console.Write("Radio= ")
18         mi_cono.radio = Val(Console.ReadLine)
19         Console.Write("Altura= ")
20         mi_cono.altura = Val(Console.ReadLine)
21         Console.Write("Generatriz= ")
22         mi_cono.generatriz = Val(Console.ReadLine)
23         'operaciones de calculo
24         mi_cono.area_base = 3.141592 * mi_cono.radio ^ 2
25         mi_cono.area_lateral = 3.141592 * mi_cono.radio * mi_cono.generatriz
26         mi_cono.area_total = mi_cono.area_base + mi_cono.area_lateral
27         mi_cono.volumen = (1 / 3) * mi_cono.area_base * mi_cono.altura
28         'salida en pantalla
29         Console.WriteLine("Area Base: " & mi_cono.area_base)
30         Console.WriteLine("Area Lateral: " & mi_cono.area_lateral)
31         Console.WriteLine("Area Total: " & mi_cono.area_total)
32         Console.WriteLine("Volumen: " & mi_cono.volumen)
33         Console.ReadLine()
34     End Sub
35 
36 End Module

RESULTADOS
Para:
RADIO = 7.56, GENERATRIZ=9.10, ALTURA= 5.20
resultados:
AREA BASE= 179.55, AREA LATERAL=216.12, AREA TOTAL=395.68, VOLUMEN=311.2

27 jul 2010

Ejercicio VB.NET: ecuacion de 2do grado

PROBLEMA: Realizar programa para la solucion de ecuaciones del tipo ax^2 + bx + c = 0 utilizando procedimientos y funciones.

SOLUCION: La ecuación completa de segundo grado tiene siempre dos soluciones, no necesariamente distintas, llamadas raíces, que pueden ser reales o complejas, el discriminante esta dado por la expresion b^2-4ac y mediante este discriminante podremos saber el número y naturaleza de las soluciones:

  1. Dos soluciones reales y diferentes si el discriminante es mayor a cero(la parábola cruza dos veces el eje x);
  2. Una solución real doble, dicho de otro modo, de multiplicidad dos, si el discriminante es igual a cero (la parábola sólo toca en un punto al eje x);
  3. Dos números complejos conjugados si el discriminante es negativo, menor a cero (la parábola y el eje x no se cruzan).
Codigo fuente:


01 Module Module1
02     Dim aa, bb, cc, x1, x2, xaa, xbb, d As Double
03     Sub Main()
04         Do
05             Leer()
06             d = ecuacion_cuadratica()
07             Imprime(d)
08             Console.WriteLine("Para salir presione [s], para continuar presione ENTER")
09         Loop Until Console.ReadLine() = "s"
10     End Sub
11 
12     'procedimiento para leer tres valores numericos y asignarlos a las variables globales
13     ' aa,bb,cc
14     Private Sub Leer()
15         Console.Write("Ingresa A = ")
16         aa = Val(Console.ReadLine)
17         Console.Write("Ingresa B = ")
18         bb = Val(Console.ReadLine)
19         Console.Write("Ingresa C = ")
20         cc = Val(Console.ReadLine)
21     End Sub
22 
23     'funcion que calcula los valores para x1 y x2, tambien calcula el valor
24     'para el discriminante (d) que puede ser 0, > 0 ó < 0 y retorna este valor
25     Private Function ecuacion_cuadratica() As Double
26         d = (bb ^ 2) - (4 * aa * cc)
27         If d = 0 Then
28             x1 = bb / (2 * aa)
29             x2 = x1
30         End If
31         If d > 0 Then
32             x1 = (-bb + Math.Sqrt(d)) / (2 * aa)
33             x2 = (-bb - Math.Sqrt(d)) / (2 * aa)
34         End If
35         If d < 0 Then
36             x1 = -bb / (2 * aa)
37             x2 = x1
38             xaa = Math.Sqrt(-d) / (2 * aa)
39             xaa = xbb
40         End If
41         Return d
42     End Function
43 
44     'procedimiento que dado el valor del discriminante, imprime los valores
45     'para las raices x1 y x2
46     Private Sub Imprime(ByVal dd As Double)
47         If dd = 0 Then
48             Console.WriteLine("Las soluciones son iguales X1=X2=" & x1)
49         End If
50         If dd > 0 Then
51             Console.WriteLine("Las soluciones no son iguales")
52             Console.WriteLine("X1 = " & x1)
53             Console.WriteLine("X2 = " & x2)
54         End If
55         If dd < 0 Then
56             Console.WriteLine("Las soluciones son imaginarias")
57             Console.WriteLine("X1 =" & x1 & " + " & xaa & " i")
58             Console.WriteLine("X2 =" & x2 & " + " & xbb & " i")
59         End If
60     End Sub
61 End Module

Prueba: Para datos de entrada

A = -2, B = 12, C = -16  resultado; x1=2, x2=4
A = -4, B = -12, C = -8 resultado: x1=-2 , x2=-1
A = -4, B = -8, C = -4 resultado: x1=-1 , x2=-1

Ejercicio VB.NET: Divisores

PROBLEMA: Desarrole un programa para encontrar e imprimir todos los divisores de todos los numeros comprendidos entre 1 y 100. Para ello desarrolle un procedimiento que genere cada uno de los numeros y otro procedimiento que determine los divisores que pueda tener un numero cualquiera.


01 Module Module1
02     ' programa principal
03     Sub Main()
04         Generar_numero()
05     End Sub
06 
07     ' procedimiento que imprime los divisores de un numero
08     Private Sub imprimir_divisores(ByVal numero As Integer)
09         Dim divisor, cociente, producto As Integer
10         For divisor = 2 To numero
11             cociente = numero \ divisor
12             producto = cociente * divisor
13             If producto = numero Then
14                 Console.WriteLine(divisor & " es un divisor de " & numero)
15             End If
16         Next
17         Console.WriteLine("presione una tecla para continuar")
18         Console.ReadLine()
19     End Sub
20 
21     ' procedimiento que genera los numeros de 1 a 100
22     Private Sub Generar_numero()
23         Dim numero As Integer
24         For numero = 1 To 100
25             imprimir_divisores(numero)
26         Next
27     End Sub
28 End Module
Resultado:

25 jul 2010

Ejemplo: Funciones y Procedimientos

En un ejemplo anterior "Funciones y Procedimientos", vimos la teoria de lo que son los Procedimientos y Funciones en programacion, ahora veremos un ejemplo completo.

Ejercicio. se desea calcular el factorial de un numero utilizando funciones y procedimientos

Factorial: Para todo número natural n, se llama n factorial o factorial de n al producto de todos los naturales desde 1 hasta n:



01 Module Module1
02 
03     Sub Main()
04         ' se declara una variable
05         Dim numero As Integer
06         ' se lee un numero entero utilizando la funcion Leer_Numero()
07         numero = Leer_Numero()
08         ' se llama a un procedimiento
09         Mostrar_resultado(numero)
10     End Sub
11 
12     ' procedimiento encargado de imprimir el resultado
13     Private Sub Mostrar_resultado(ByVal i As Integer)
14         Console.WriteLine("El factorial de " & i & " es " & Factorial(i))
15         Console.WriteLine()
16         Console.WriteLine("presione cualquier tecla para terminar...")
17         Console.ReadLine()
18     End Sub
19 
20     ' funcion que lee un numero entero
21     Private Function Leer_Numero() As Integer
22         Dim n As Integer
23         Do
24             Console.WriteLine("Por favor ingrese un numero de 1 a 10")
25             Console.Write("Numero: ")
26             n = Val(Console.ReadLine)
27         Loop While n > 10 Or n <= 0
28         Return n
29     End Function
30 
31     ' funcion que calcula el factorial de un numero pasado como parametro
32     Private Function Factorial(ByVal n As Integer) As Long
33         Dim i As Integer
34         Dim fac As Long
35         fac = 1
36         For i = 1 To n
37             fac = fac * i
38         Next
39         Return fac
40     End Function
41 End Module

El resultado

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | cna certification