jueves, 25 de mayo de 2017

LOS ARREGLOS

Un arreglo es un conjunto de datos o una estructura de datos homogéneos que se encuentran ubicados en forma consecutiva en la memoria RAM (sirve para almacenar datos en forma temporal).
Al principio esta idea puede parecer correcta, pero manejar muchas variables de forma independiente, luego de un tiempo puede tornarse engorroso, y también podremos encontrar un caso en el que no sabemos cuántas variables necesitaremos. Sin embargo, esto nos puede dar una idea sobre lo que necesitamos.


Si observamos el nombre de las variables, vemos que todas llevan en su nombre calif, es decir que todas se refieren a la calificación. Podemos pensar que están conceptualmente agrupadas para la calificación. Otro punto que notamos es que las variables están numeradas, como si tuvieran un índice que nos sirve para identificarlas.

Declaración de los arreglos de una dimensión
Los arreglos pueden tener diferentes dimensiones, y si el arreglo se parece a una simple lista, como la lista de calificaciones que tenemos, entonces decimos que es de una dimensión. Estos arreglos también se conocen como monodimensionales o unidimensionales. Si el arreglo es como una tabla con varios renglones y varias columnas, entonces es un arreglo de dos dimensiones o bidimensional. Primero trabajaremos con los arreglos de una dimensión y luego pasaremos a arreglos de dos dimensiones o más.  Para poder trabajar un arreglo, primero es necesario declararlo.

ARREGLOS UNIDIMENSIONALES

Un arreglo unidimensional es un tipo de datos estructurado que está formado por una colección finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales. Los datos que se guarden en los arreglos todos deben ser del mismo tipo.

El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemos acceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores o posteriores, esto mediante el uso de un índice para cada elemento del arreglo que nos da su posición relativa.
Para implementar arreglos unidimensionales se debe reservar espacio en memoria.
Los arreglos nos permiten hacer un conjunto de operaciones para manipular los datos guardados en ellos, estas operaciones son: ordenar, buscar, insertar, eliminar, modificar entre otras.

Asignación y uso de valores
Ya hemos visto cómo declarar el arreglo. Ahora tenemos que aprender cómo poder colocar información en su interior y hacer uso de ésta.
Para poder asignarle un valor a alguno de los elementos del arreglo necesitamos hacer uso del índice del elemento que queremos utilizar, y como dijimos antes, no debemos olvidar que el primer elemento se encuentra en la posición 0. Supongamos que queremos asignarle la calificación 8.5 al tercer alumno.

Arreglos de dos dimensiones
Hasta aquí hemos visto que los arreglos nos ayudan a guardar información y a trabajar de una manera más cómoda con ella. Cuando tenemos mucha información que almacenar es más fácil manipular un arreglo que muchas variables. Los arreglos que vimos son similares a una lista, pero no todos los problemas se pueden resolver con este esquema, y veamos por qué. Supongamos que ahora debemos hacer un nuevo programa para una fábrica que produce automóviles y desea tener la información de las unidades producidas a diario. La información será procesada por semana, con el promedio semanal de vehículos producidos. Hasta el momento el problema sería muy similar al anterior. Podríamos crear un arreglo de elementos llamado semana y estaría resuelto, pero ahora también desean la información por mes. El mes tiene cuatro semanas, por lo que podemos pensar en tener cuatro arreglos, uno que se corresponda con cada semana, pero en realidad existe una forma mejor de solucionar este problema.
Al igual que con los arreglos de una sola dimensión, los índices están basados en 0.
Esto es tanto para los renglones como para las columnas.

Declaración de los arreglos de dos dimensiones
La declaración es similar al arreglo de una dimensión, pero indicamos la cantidad de elementos en cada dimensión.
float[,] tabla = new float[5,3];

En este caso, hemos creado una matriz de valores flotantes llamada tabla. Hay que notar que hemos colocado una coma entre los [ ] para indicar que serán dos dimensiones. En el lado derecho indicamos el tamaño de cada dimensión. Para este ejemplo tenemos cinco columnas y tres renglones.También es posible declarar la matriz por medio de variables. 

float[,] tabla = new float[n, m]; 


Arreglos de tipo jagged
En el ejemplo anterior todas las columnas tienen la misma cantidad de renglones, es decir, que todos los salones tendrían la misma cantidad de alumnos, sin embargo, en la práctica esto no sucederá. Tendremos salones con diferentes cantidades de alumnos, y los arreglos que hemos visto hasta el momento no permiten tener columnas con diferente cantidad de renglones. Esto puede ser una limitación, y puede significar que tengamos renglones sin utilizar en varias columnas. Esto nos lleva a desperdiciar memoria. Una solución podría ser tener un arreglo que nos permita lograr esto. Para hacerlo tenemos que crear un arreglo de arreglos. Esto se conoce como arreglo jagged. En lugar de usar una matriz, lo que haremos es crear un arreglo, pero cada elemento de este arreglo será a su vez otro arreglo. Así podemos controlar de forma independiente la cantidad de renglones en cada arreglo. Estos arreglos son más flexibles que los tradicionales, pero requieren que seamos más cuidadosos con ellos.


Declaración de un arreglo jagged
La declaración de los arreglos jagged es ligeramente más complicada que la de los tradicionales. Cuando los declaramos debemos declarar en primer lugar el arreglo contendor y luego cada uno de los arreglos independientes que tiene.


Acceder a un arreglo jagged
Para acceder a los elementos guardados adentro de un arreglo jagged también necesitamos utilizar índices. Un índice será aplicado para indicar cuál elemento del arreglo contenedor utilizaremos, es decir el número de columna. El otro índice entonces nos indicará el elemento del arreglo interno que queremos acceder.
Por ejemplo, para asignar un valor realizamos lo siguiente:
En este ejemplo vemos que se selecciona el elemento del arreglo contenedor, o si lo preferimos la columna 6. Adentro de esa columna seleccionamos el elemento y ahí es dónde se coloca el valor 5.7. Si lo que necesitamos es mostrar el contenido de un elemento, el esquema es similar a lo que ya conocemos.
Console.WriteLine(“El valor es {0}”, productos[5][n]);

Ahora modificaremos algunas partes del programa de la escuela para usar el arreglo de tipo jagged. Lo que haremos es tener salones con diferente cantidad de alumnos y luego simplemente mostraremos las calificaciones de cada salón

Los arreglos como parámetros a funciones
Aprendimos a usar los arreglos. Hasta el momento han sido utilizados adentro de la función Main(). A medida que nuestros programas sean más grandes y especializados, tendremos que usar funciones y éstas necesitarán procesar la información contenida en los arreglos. Al igual que con las variables, es posible pasar un arreglo como parámetro



EL CICLO FOR

Los ciclos For le permiten evaluar una secuencia de expresiones varias veces. Esto es diferente a los enunciados If y Select, donde el programa pasa por cada expresión máximo una vez durante la evaluación de la fórmula.
Los ciclos For funcionan mejor cuando conoce de antemano la cantidad de veces que es necesario evaluar una expresión.
Local StringVar str := "";
Local NumberVar strLen :=
Length ({Customer.Customer Name});
Local NumberVar i; For i := 1 To strLen Do (
str := str + {Customer.Customer Name}[charPos]
Local NumberVar charPos := strLen - i + 1; );
str

El primer ciclo que aprenderemos en este capítulo se llama
ciclo for, pero para poder
entenderlo mejor necesitamos ver un problema donde sea necesario utilizarlo.
Imaginemos que tenemos que crear un programa para una escuela, y este programa
debe sacar el promedio de las
calificaciones para tres alumnos. Si recordamos, el promedio se calcula al
sumar todas las cantidades y el resultado de la suma se divide por la cantidad
de cantidades que hemos sumado. El programa es sencillo, debido a que en el
salón de clases solamente hay tres alumnos.
límite de conteo del ciclo
También podemos tener un control de hasta qué número contar. Veamos nuestro código para realizar el conteo del 1 al 10.
for (n = 1; n <= 10; n = n + 1)
Console.WriteLine(“{0}”,
n);
En este ejemplo pudimos ver que
el límite de conteo está siendo controlado en la condición y que no hay una
única forma de escribirla. Podemos ver que la siguiente condición n <= 10 también podría ser escrita como n < 11 sin que se afecte en lo màs mínimo la
ejecución del ciclo.

Control
del incremento

Ahora que ya sabemos cómo colocar el rango del ciclo for desde su valor de inicio hasta el valor al
que contará, podemos empezar a aprender cómo hacer uso del incremento. Nuestro
incremento ha sido de uno en uno. Sin embargo, podemos hacer que el conteo sea
de dos en dos, de tres en tres o de cualquier otro valor.

Para lograr esto, simplemente
tenemos que modificar el incremento e indicar cómo se incrementaría nuestra
variable de control. El valor del incremento puede ser un valor colocado
ejemplo, hagamos que nuestro ciclo avance de dos en dos.
explícitamente o el valor que se encuentra adentro de una variable. Por

El ciclo while
Hemos visto que el ciclo for
es muy útil para repetir algo cuando sabemos el número de
repeticiones previamente. Sin embargo, algunas veces no es posible saber el
número de repeticiones que tendremos. Pensemos que una carpintería nos ha
centímetros, ya que ellos lo usan para calcular el tamaño de las tablas. El
contratado para hacer un programa que transforme de pies y pulgadas a
para ellos ejecutar el programa cada vez que necesitan hacer un corte.
programa es muy sencillo, pero no podemos dejarlo así ya que sería muy incómodo
Pensamos que esto se puede resolver con un ciclo for.
¿De cuántas vueltas el ciclo? Si colocamos 10 vueltas podemos pensar que es suficiente. Pero
hay días que necesitan 15 conversiones y es necesario ejecutar el programa dos veces.
Y los días que sólo necesitan 5 conversiones tienen que escribir 5 más tan sólo para finalizar el programa. Podemos
deducir del problema que efectivamente necesitamos un ciclo. Sin embargo, no
sabemos el número de repeticiones previamente, por lo que el ciclo for no
es adecuado. Necesitamos un ciclo que pueda ser controlado por una condición, y
la evaluación de esta condición dependerá del estado del programa en un momento
dado. El ciclo do
while nos permite hacer esto. Permite que cierto

igo se repita mientras una condición se evalúe como
verdadera. El valor de la evaluación dependerá del estatus del programa en un
momento dado.
do  {
Código
}(condición);

PROGRAMACIÓN ORIENTADA A OBJETOS

La programación orientada a objetos o POO es un paradigma de programación que usa los objetos en sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamiento. 

La POO es una forma de programar que trata de encontrar una solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:
Clase
Definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ella.
Herencia
Por ejemplo, herencia de la clase C a la clase D, es la facilidad mediante la cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos métodos y variables registrados como "públicos" (public) en C. Los componentes registrados como "privados" (private) también se heredan pero se mantienen escondidos al programador y sólo pueden ser accedidos a través de otros métodos públicos. Para poder acceder a un atributo u operación de una clase en cualquiera de sus subclases pero mantenerla oculta para otras clases es necesario registrar los componentes como "protegidos" (protected), de esta manera serán visibles en C y en D pero no en otras clases.
Objeto
Instancia de una clase. Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos), los mismos que consecuentemente reaccionan a eventos. Se corresponden con los objetos reales del mundo que nos rodea, o con objetos internos del sistema (del programa).
Método
Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.
Evento
Es un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento la reacción que puede desencadenar un objeto; es decir, la acción que genera.
Atributos
Características que tiene la clase.

Los métodos
Los métodos son las funciones que llevan a cabo el proceso o la lógica de la clase, y crear un método dentro de la clase es muy parecido a la forma que hemos utilizado anteriormente. Los métodos también tendrán un tipo de acceso, al igual que los datos. Trabajarán sobre los datos de la clase. No hay que olvidar que todos los métodos conocen todos los datos definidos dentro de la clase, y pueden recibir parámetros y regresar valores. A un dato definido dentro de la clase no necesitamos pasarlo como parámetro ya que el método lo conoce. Solamente los métodos que necesiten ser invocados desde el exterior deben tener acceso público. Si el método sólo se invoca desde el mismo interior de la clase su acceso debe ser privado. Esto lo hacemos con fines de seguridad y para mantener el encapsulamiento correctamente.
Cómo declarar la clase y los datos
La declaración de la clase es un proceso sencillo. Las clases se declaran dentro de un namespace y cualquiera que tenga acceso a ese namespace puede crear objetos de la clase. No olvidemos que la clase es como el plano y los objetos son realmente los que usamos para llevar a cabo el trabajo.

Para declarar una clase, todo lo que se necesita es escribir una definición de estructura y sustituir la palabra reservada struct por class. Por ejemplo, una clase empleado con campos como el nombre, el departamento, la posición, el una función que nos imprima la información de este quedaría así:
class Empleado {
char* m_nombre;
char* m_departamento;
char* m_posicion;
long m_salario;
void Imprimir( Empleado infoEmpleado);
}

Cómo asignarles valores a datos publicos
Como ya tenemos la instancia, ya podemos comenzar a trabajar con ella. Lo primero que haremos será asignarle un valor al dato lado. Haremos la asignación por medio del operador de asignación = (igual), pero también deberemos indicar a cuál de todos los datos de la clase vamos a acceder. Esto lo hacemos con el
operador punto. Por ejemplo, asignemos el valor de 5 al lado, realizando esto como vemos en el código a continuación:
miCubo.lado = 5;

LOS FLUJOS

Los flujos también son conocidos como streams por su nombre en inglés. Se los llama de esta forma porque nos recuerdan como fluye el agua, pero en este caso se tratará de flujos de información. El stream es utilizado para poder mover información de un lugar a otro. A veces, moveremos la información de la memoria a otra parte de la memoria, pero generalmente lo que haremos será mover la información de la memoria a un dispositivo de almacenamiento como el disco duro o del dispositivo nuevamente a la memoria.
Cuando hacemos uso de los flujos, la información no es enviada en un solo movimiento, sino que se envía byte por byte de forma ordenada. 

es un diagrama de actividades que representa los flujos de trabajo paso a paso de negocio y operacionales de los componentes en un sistema. Un diagrama de actividades muestra el flujo de control general.
En SysML el diagrama ha sido extendido para indicar flujos entre pasos que mueven elementos físicos (p. ej., gasolina) o energía (p. ej., presión). Los cambios adicionales permiten al diagrama soportar mejor flujos de comportamiento y datos continuos.
Estos diagramas utilizan símbolos con significados definidos que representan los pasos del algoritmo, y representan el flujo de ejecución mediante flechas que conectan los puntos de inicio y de fin del proceso.

CÓMO EMPEZAR A DEPURAR UN PROGRAMA

Para depurar un programa nosotros tenemos varias herramientas, pero es importante en primer lugar conocer los posibles errores que podemos tener. Básicamente podemos tener dos clases de errores bien diferenciados: por un lado los errores de compilación y por otro los errores en tiempo de ejecución.
Los errores de compilación son aquellos que impiden que el programa logre compilarse y generalmente son más fáciles de resolver. Muchos de estos errores se deben a problemas de sintaxis, es decir, son responsabilidad del usuario.
Los errores en tiempo de ejecución son aquellos que suceden cuando el programa se está ejecutando. Estos errores pueden deberse a problemas de lógica, es decir, que el algoritmo no fue diseñado correctamente. Pero también pueden ocurrir debido a un mal control de la información, por ejemplo, podemos tratar de leer más allá de los límites correspondientes a un arreglo determinado.
Para corregir los errores de compilación
La mejor forma de poder aprender a depurar programas es con la práctica. Para esto crearemos un pequeño programa de ejemplo. El siguiente programa tiene varios errores para poder identificar y corregir. 

using System;
using System.Collections.Generic;
using System.Text;
namespace Cap12_1
{
class Program 
static void Main(string[] args)