lunes, 2 de octubre de 2017

Comprendiendo Vectores y Matrices

Uno de los temas más importantes en la informática y más especialmente en la programación es el que trata de las diferentes estructuras de datos.
Si bien, existen un gran número de estructuras de datos y cada una tiene características que las identifican, abordaremos a continuación los arreglos unidimensionales (vectores) y bidimensionales (matrices).

Iniciaremos recordando el concepto de la variable. Una variable es un espacio de memoria que tiene un nombre identificador, un tipo de dato que almacena y un valor. Haciendo una analogía con una hoja de cálculo, podríamos decir que una variable es como una celda la cual tiene un nombre (A1, B3, por ejemplo), almacena un valor y se puede definir un formato que equivaldría al tipo de dato.



Un arreglo unidimensional, conocido comúnmente como vector, vendría siendo en términos simples como un conjunto de variables, o espacios de almacenamiento, que poseen un mismo identificador y tipo de datos. Continuando con la analogía, serían como una fila o columna en la hoja de cálculos.




Para acceder a los diferentes espacios de memoria que contiene el vector se hace uso de un índice. Muchos de los lenguajes de programación modernos admiten valores de tipo cadena de caracteres como índices, pero lo más común es que se utilicen números enteros, iniciando la numeración en cero.

Todo arreglo por definición, requiere que se le asigne un tamaño fijo, es decir, que se indique cuántos elementos va a contener en cada una de sus dimensiones. Este tamaño no es recomendable que se modifique en tiempo de ejecución, de hecho muchos lenguajes de programación no soportan la redimensión de arreglos. Si se necesita utilizar una estructura de datos que sea flexible en su tamaño puede recurrirse al uso de listas en lugar de arreglos; pero ese es otro tema a abordar.

En C#, los arreglos se declaran agregando corchetes a continuación del tipo de datos; y se inicializa asignando el tamaño del arreglo.





Cuando se trata de un arreglo bidimensional la diferencia es que se cuenta tanto con filas como con columnas, es decir, es como una cuadrícula.



Podría parecer obvio, pero es importante mencionar que en este caso el arreglo posee dos índices, uno para las filas y otro para las columnas. La declaración es similar, solamente que se separa el tamaño de las dimensiones con una coma.




El número de dimensiones  de un arreglo depende de las necesidades de cada programador, es decir, es común utilizar arreglos unidimensionales (vectores) o bidimensionales (matrices), pero se pueden crear arreglos de tres o más dimensiones si es necesario.

miércoles, 15 de febrero de 2017

Ejercicio de Estructuras Selectivas


Introducción

Las estructuras selectivas son parte fundamental de todo lenguaje de programación, ya que es por medio de ellas que un programador puede indicarle al computador qué "decidir" dependiendo de una o más condiciones que se cumplen a partir de los datos recibidos.

Existen básicamente dos tipos de estructuras selectivas: SI (con todas sus variantes) y SEGÚN SEA. Asumiendo que se conoce el funcionamiento de ambas estructuras procederemos a desarrollar un ejercicio para demostrar su utilidad y su sintaxis en el lenguaje de programación C#.

Planteamiento

Se desea crear un programa que simule la compra de entradas para una función de cine. El programa debe mostrar un menú que muestre las películas en cartelera:

[1] El Impresor Asesino III (Terror, clasificación C)
[2] while(true){Hasta que este bucle termine} (Drama, clasificación B)
[3] ¿Dónde está mi ; ? (Comedia, clasificación TP)
[4] Canahuati: El Prodigio de la Informática (Histórica, clasificación TP)

Luego de seleccionar la película el usuario deberá ingresar la cantidad de entradas a comprar, indicando cuántas son para adultos y cuántas para niños. Las entradas para adultos tienen un valor de $3.50 y las de niños $2.00, sin embargo no puede comprar entradas para niños en las películas que no sean clasificación TP (Todo Público).

Al final se deberá mostrar el título de la película, la clasificación de la misma y su género, también la cantidad de entradas de adultos y de niños y el total a cancelar.

Solución

Para este caso utilizaremos una estructura según sea para la selección de la película y otras estructuras si para las validaciones correspondientes.


Nótese que la estructura "según sea" es útil cuando se debe comparar una misma variable contra distintos valores puntuales, en cambio "si" se utilizará cuando se evalúen rangos de valores, condiciones que deben cumplir diferentes variables o condiciones combinadas por medio de operadores lógicos (no, y, o).

martes, 7 de febrero de 2017

Números Primos en un Rango

Enunciado

Leer un valor inicial y un valor final y validar que el inicial sea menor que el final. Mostrar todos los números primos que se encuentren en el rango dado por ambos valores.

Solución

Introducción

Este ejercicio es uno de los ejemplos más comunes que se plantean para la utilización de estructuras de control, ya que implica estructuras condicionales y repetitivas.

Lo primero que se requiere para resolverlo es tener una definición clara de lo que es un número primo: "En matemáticas, un número primo es un número natural mayor que 1 que tiene únicamente dos divisores distintos: él mismo y el 1." (https://es.wikipedia.org/wiki/Número_primo)

Es decir que si el número que se está evaluando es divisible entre cualquier otro número que no sea 1 o sí mismo, dicho número no es primo.

Paso 1: Verificar si un número es primo

Cuando se comienza a programar y se tiene un problema en que se debe ejecutar una acción n veces es recomendable definir cómo se resuelve una vez y luego adaptar esa solución a las n veces (dentro de un bucle). Así pues, tenemos que iniciar encontrando la forma de verificar si un número es o no primo.
Tomaremos como ejemplo el 7. Si realizáramos manualmente el procedimiento de verificación, iniciaríamos dividiendo el 7 entre 2 (el primer entero después del 1), y verificando si alguno de los números anteriores a él lo divide de manera exacta (residuo 0).
7 / 2 = 3 (residuo 1)
7 / 3 = 2 (residuo 1)
7 / 4 = 1 (residuo 3)
7 / 5 = 1 (residuo 2)
7 / 6 = 1 (residuo 1)
De esta forma se demuestra que 7 no es divisible sino solamente entre sí mismo y el 1.
En un bucle podríamos definir entonces:
Booleano bandera
Desde i=2 hasta i>7, 1
    bandera = verdadero
    Si 7 % i == 0 entonces
        bandera = falso
    Fin_si
    Si bandera == verdadero
         Imprimir “Es Primo”
     Fin_si
Fin_desde

Nótese la utilización de una variable booleana bandera que servirá para indicar si el número es primo o no, ya que el divisor de un número, en caso de que exista, puede encontrarse al principio, al final o en el medio del rango de números menores del mismo. Este seudo-código puede optimizarse, pero para efectos de explicación lo dejaremos así.

Paso 2: Validar los valores límites

Iniciaremos el algoritmo, puesto que, en comparación al proceso anterior, un condicional no representa un obstáculo.
Inicio
Entero ini=0, fin=0, i=0, j=0
Booleano bandera

Leer(ini)
Leer(fin)

Si ini > fin entonces
Imprimir “Error! El valor inicial debe ser menor al final”
Sino
Desde i=ini hasta i==fin, 1
Desde j=2 hasta j>i, 1
bandera = verdadero
     Si i % j == 0 entonces
         bandera = falso
     Fin_si
     Si i <> 1 ^ bandera == verdadero
          Imprimir i + “, ”
     Fin_si
Fin_desde
Fin_desde
Fin_si

Fin

Código

Si bien, una habilidad que todo programador debe desarrollar es la de "correr" su propio código, mentalmente o en papel, no está de más ver la ejecución del programa en el lenguaje que estamos aprendiendo: C#.

Este pequeño programa puede mejorarse en cuanto a validaciones y optimizarse para que sea más eficiente, así que las sugerencias de mejora son bienvenidas.