LOS REYES DE LA PROGRAMACION

lunes, 28 de marzo de 2011

Arreglos unidimensionales.

1.1.1.- Conceptos básicos.
Un arreglo unidimensional tiene una sola dimensión. En C#, la dimensión se maneja por medio de un par de corchetes.
A los arreglos de una dimensión también se les llama listas.

1.1.2.- Operaciones.
Para manejar un arreglo, las operaciones a efectuarse son:
·         Declaración del arreglo,
·         Creación del arreglo,
·         Inicialización de de los elementos del arreglo, y
·         Acceso a los elementos del arreglo.
A continuación describiremos cada una de estas operaciones, en C#.
Declaración.
La declaración de un arreglo unidimensional consiste en establecer las características del arreglo y sus elementos, por medio de la siguiente sintaxis:
<tipo> [ ] < identificador > ;
Donde:
tipo indica el tipo correspondiente a los elementos del arreglo ,
identificador es el nombre del arreglo, y
el par de corchetes, [ ], representa la dimensión del arreglo y encierra un número entero que corresponde al número de elementos del arreglo.
Ejemplos:
int [ ] a ;
float [ ] distancia ;
Artículo [ ] art = new Artículo[ 3];
Observe que, en la declaración, el espacio entre los corchetes está vacío. Esto se debe a que, durante dicha operación, no se reserva espacio en la memoria.
Creación.
La creación de un arreglo unidimensional consiste en reservar espacio de memoria para todos sus elementos, utilizando la siguiente sintaxis:
< identificador > = new <tipo> [ tamaño ] ;
Donde:
new es el operador para gestionar espacio de memoria, en tiempo de ejecución,
tamaño es un número entero que representa el número de elementos del arreglo.
Ejemplos:
a = new int [10] ; // Se crea el arreglo a , con 10 elementos de tipo entero.
distancia = new float[ 5] ; // Se crea el arreglo distancia , con 5 elementos de punto flotante y precisión sencilla .Artículo [] art = new Artículo[3];
Artículo [ ] art = new Artículo[ 3]; // Se crean 3 referencias a objetos de la clase Artículo
art[0]= new Artículo(); // Se crea el primer objeto del arreglo art
art[1]= new Artículo(); // Se crea el segundo objeto del arreglo art
art[2]= new Artículo(); // Se crea el tercer objeto del arreglo art

Las dos primeras operaciones de declaración y creación anteriores se pueden agrupar en una sola instrucción, como se muestra enseguida:
int [ ] a = new int [10] ;
float [ ] distancia = new float[5] ;

Inicialización.
Un arreglo es un objeto que,cuando es creado por el compilador, se le asignan automáticamente valores iniciales predeterminados a cada uno de sus elementos, de acuerdo a los siguientes criterios:
·         Si el tipo del arreglo es numérico, a sus elementos se les asigna el valor cero.
·         Si el tipo del arreglo es char, a sus elementos se les asigna el valor '\u0000'.
·         Si el tipo del arreglo es bool, a sus elementos se les asigna el valor false.
·         Si el tipo del arreglo es una clase, a sus elementos se les asigna el valor null.
Cuando se requiere asignar valores iniciales diferentes de los predeterminados, es posible agrupar las operaciones de declaración, creación e inicialización en una sola instrucción, por ejemplo:
int [ ] a = { 1, 0,4,-6, 2,9, 23,455, 90,35 };
float [ ] distancia = { 2.50F, 286.45F, 46.75F, 30.62F, 93.00F };
string [ ] pato = { "Hugo", "Paco", "Luís" };

Acceso.
Se puede acceder a los valores de los elementos de un arreglo a través del nombre del arreglo y un subíndice. El subíndice debe escribirse entre corchetes y representa la posición del elemento en el arreglo. Así, podemos referirnos a un elemento del arreglo escribiendo el nombre del arreglo y el subíndice del elemento entre corchetes. Los valores de los subíndices empiezan en cero para el primer elemento, hasta el tamaño del arreglo menos uno.
Ejemplo:
float [ ] distancia = new float[5] ; // Crea el arreglo distancia con 5 elementos.
float x = 25F, y = 10F ; // Crea dos variables de punto flotante y precisión sencilla.
distancia[0] = x + y ; // El valor asignado al primer elemento es 35.
distancia[1] = ++distancia[0] ; // Asigna 36 al segundo elemento.
distancia[2] = distancia[1] - distancia[0] + 4 ; // Asigna 5 al tercer elemento.
distancia[3] = distancia[2]-- ; // Asigna 5 al cuarto elemento
// y disminuye en 1 el valor del tercero.

distancia[4] = distancia[3] * distancia[2] ; // Asigna 20 al quinto elemento.
y = distancia[4] ; // Asigna a y el valor almacenado en el quinto elemento.

1.1.3.- Aplicaciones.
Listas.
Resolvamos el problema de manejar dos listas: una con los nombres de un grupo de alumnos y otra con una calificación para cada uno de los alumnos.
Primero se deberán leer los nombres de los alumnos y la calificación que corresponde a cada uno de ellos y después habrá que desplegar dos columnas: una con los nombres de los alumnos y la otra con sus respectivas calificaciones.
La lectura debe lucir de manera similar a la siguiente:
Número de alumnos: 30
Nombre [0] :
Calificación[0] :
Nombre [1] :
Calificación[1] :
Nombre [2] :
Calificación[2] :
...
...
Nombre [29] :
Calificación[29] :
El despliegue en el monitor luciría así:

No.
Nombre
Calif.
1
Hugo
100
2
Paco
90
3
Luís
95
...

...
30
Donald
70

El siguiente código corresponde a un programa que resuelve el problema.
// Lista.cs : Lee una lista de nombres y calificaciones correspondientes a un grupo de
// alumnos de una materia.
using System;
using C = System.Console;
public class Lista
{
public static void Main()
{
int nAlumnos;
C.Write("Número de alumnos: ");
nAlumnos = Convert.ToInt32(C.ReadLine());
string [ ] alumnos = new string[nAlumnos]; //Crea el arreglo de
//alumnos.
int [ ] calif = new int [nAlumnos]; // Crea el arreglo de calificaciones.
// Lee los elementos de los dos arreglos.
for(int i = 0; i < nAlumnos ; i++)
{
C.Write("Nombre del alumno [" + i + "] : ");
alumnos[i] = C.ReadLine( );
C.Write("Calificación [" + i + "] : ");
calif[i] = Convert.ToInt32(C.ReadLine( ));
}
// Despliega los valores de los dos arreglos.
C.WriteLine("No. Nombre Calif.");
for(int i = 0 ; i < nAlumnos ; i++)
{
C.Write(" " + (i+1) + ".- " + alumnos[ i] );
C.WriteLine(" " + calif[i] );
}
}
}

Vectores.
Otra de las aplicaciones de los arreglos es el manejo de vectores. En Física, los vectores sirven para representar velocidades, aceleraciones, etc.
Podemos representar a un vector como un segmento de recta dirigida que tiene magnitud, orientación y sentido.
En un espacio tridimensional, un vector puede expresarse por medio de tres componentes sobre los ejes cartesianos. Cada componente puede, a su vez, expresarse en función de los vectores unitarios i, j, k ,que se ubican en los ejes x, y, z, respectivamente.
Por ejemplo , un vector v1 puede representarse en función de sus componentes como:
v1 = 20i + 15j + 35k
Si tenemos otro vector,
v2 = -5i + 40j + 25k
La suma de los dos vectores sería:
s = v1+v2 = (20-5)i +(15+40)j+(35+25)k
s = 15i + 55j + 60k
Un segmento del programa para este ejemplo sería:
double v1[ ] = new double[3];
double v2[ ] = new double[3];
double s[ ] = new double[3];
v1[0] = 20;
v1[1] = 15;
v1[2] = 35;
v2[0] = -5;
v2[1] = 40;
v2[2] = 25;
for(int i=0; i < 3 ; i++)
{
s[ i ] = v1[ i ] + v2[ i ] ;
}

Estructuras de datos y arreglos. Arrays.

 
Introducción
Todas las variables que se han considerado hasta ahora son de tipo simple. Una variable de tipo simple consiste de una sola caja de memoria y sólo puede contener un valor cada vez. Una variable de tipo estructurado consiste en toda una colección de casillas de memoria. Los tipos de datos estudiados: entero, real, alfabético son considerados como datos de tipo simple, puesto que una variable que se define con alguno de estos tipos sólo puede almacenar un valor a la vez, es decir, existe una relación de uno a uno entre la variable y el número de elementos (valores) que es capaz de almacenar. En cambio un dato de tipo estructurado, como el arreglo, puede almacenar más de un elemento (valor) a la vez, con la condición de que todos los elementos deben ser del mismo tipo, es decir, que se puede tener un conjunto de datos enteros, reales, etc.
Datos estructurados:
Estructura de Datos es una colección de datos que se caracterizan por su organización y las operaciones que se definen en ella. Los datos de tipo estándar pueden ser organizados en diferentes estructuras de datos: estáticas y dinámicas.
Estructura de Datos estáticas:
Son aquellas en las que el espacio ocupado en memoria se define en tiempo de compilación y no puede ser modificado durante la ejecución del programa. Corresponden a este tipo los arrays y registros
Estructuras de Datos Dinámicas:
Son aquellas en las que el espacio ocupado en memoria puede ser modificado en tiempo de ejecución. Corresponden a este tipo las listas, árboles y grafos . Estas estructuras no son soportadas en todos los lenguajes. La elección de la estructura de datos idónea dependerá de la naturaleza del problema a resolver y, en menor medida, del lenguaje. Las estructuras de datos tienen en común que un identificador, nombre, puede representar a múltiples datos individuales.
Arrays:
Un arreglo (array) es una colección de datos del mismo tipo, que se almacenan en posiciones consecutivas de memoria y reciben un nombre común. Para referirse a un determinado elemento de un array se deberá utilizar un índice, que especifique su posición relativa en el array. Un arreglo es una colección finita, homogénea y ordenada de elementos. Finita:Todo arreglo tiene un límite; es decir,debe determinarse cuál será el número máximo de elementos que podrán formar parte del arreglo. Homogénea: Todos los elementos del arreglo deben ser del mismo tipo. Ordenada: Se puede determinar cuál es el primer elemento, el segundo, el tercero,.... y el n-ésimo elmento.
Los arreglos se clasifican de acuerdo con el número de dimensiones que tienen. Así se tienen los:
- Unidimensionales (vectores)
- Bidimensionales (tablas o matrices)
- Multidimensionales (tres o más dimensiones)


PROBLEMA.
Suponga que se desea desarrollar un programa para:
1.Leer una lista de calificaciones de un examen
2.Encontrar su media
3.Escribir una lista de las calificaciones mayores que la media
4.Ordenar la lista de las calificaciones en orden ascendente.
Supongamos también que hay 100 calificaciones. Debemos utilizar 100 variables diferentes nota1, nota2, ...., nota100, de ese modo son 100 direcciones diferentes de memoria para almacenar las calificaciones del examen. Se imagina declarar las 100 variables, ¿cuántas instrucciones involucra?
Var Nota1,nota2,nota3,.........nota100: entero
(En la declaración real de un programa no pueden usarse puntos suspensivos, por lo tanto serán 100 veces) . En la fase de lectura de datos, serán también 100 veces las instrucciones para ir leyendo cada valor. Leer (nota1, nota2,nota3,........., nota100)
Para calcular la media:
Media ¬(nota1+nota2+.......+nota100)/100
Para la lista de calificaciones mayores que la media, deberá también irse comparando una por una:
Si nota1 > media entonces
escribir (nota1)
Fin_si
Si nota2 > media entonces
escribir (nota2)
Fin_si
Si nota100 > media entonces
escribir (nota100)
Fin_si
Y después de más de 450 líneas de código..... ¡Falta ordenar la lista de calificaciones en orden ascendente!
Después que aprendas a usar arreglos verás cómo se ahorra instrucciones porque es fácil recorrer toda la lista de notas con unas pocas instrucciones. En el caso anterior, cuando el acceso a la información es secuencial, sólo se puede acceder a un elemento buscando desde el principio de la lista, y esto es algo lento. Lo que se necesita es una estructura de acceso directo que permita almacenar y recuperar los datos directamente especificando su posición en la estructura, de esa manera se requerirá el mismo tiempo para acceder al elemento de la posición 100 que el de la posición 5.
También preferiremos que esta estructura se almacene en memoria principal para que su almacenaje y recuperación sea más rápida. Es por ello que existen los arreglos, que están organizados en una secuencia de elementos, todos del mismo tipo y se puede acceder a cada elemento directamente especificando su posición en esta secuencia.
Arreglos Unidimensionales:
Están formados por un conjunto de elementos de un mismo tipo de datos que se almacenan bajo un mismo nombre, y se diferencian por la posición que tiene cada elemento dentro del arreglo de datos. Al declarar un arreglo, se debe inicializar sus elementos antes de utilizarlos. Para declarar un arreglo tiene que indicar su tipo, un nombre único y la cantidad de elementos que va a contener. Por ejemplo, las siguientes instrucciones declaran tres arreglos distintos:
Float costo_partes[50];

Para acceder a valores específicos del arreglo, use un valor de índice que apunte al elemento deseado. Por ejemplo, para acceder al primer elemento del arreglo calificaciones debe utilizar el valor de índice 0 (calificaciones[0]). Los programas en C++ siempre indizan el primer elemento de un arreglo con 0 y el último con un valor menor en una unidad al tamaño del arreglo.
Inicialización y asignación de valores
Como se decía anteriormente, antes de utilizar un arreglo es necesario inicializarlo:
Calificaciones[0];
·         Diseño de páginas web. Obtenga 3 meses de hosting gratis y consultoría de Microsoft.Microsoft.comEnlaces patrocinados
Para inicializar todos los elementos de una vez, se colocan dentro de una estructura for que va del primer elemento al último que contiene el arreglo. Para asignar un valor a un elemento del arreglo se hace por ejemplo:
Calificaciones[0] ¬100;
Cuando se usan arreglos, una operación común es usar una variable índice para acceder a los elementos de un arreglo. Suponiendo que la variable índice I contiene el valor 3, la siguiente instrucción asigna el valor 400 a valores[3]:
valores[I] ¬ 400;
Partes de un arreglo:
Los componentes. Hacen referencia a los elementos que forman el arreglo, es decir, a los valores que se almacenan en cada una de las casillas del mismo. Los índices. Permiten hacer referencia a los componentes del arreglo en forma individual, especifican cuántos elementos tendrá el arreglo y además, de qué modo podrán accesarse esos componentes
.

Definición de Arreglos:
ident_arreglo = arreglo[liminf .. Limsup] de tipo Operaciones con Vectores:
Las operaciones que se pueden realizar con vectores durante el proceso de resolución de un problema son:
    · Lectura/ escritura
    · Asignación
    · Actualización(inserción, eliminación, modificación)
    · Recorrido (acceso secuencial)
    · Ordenación
    · Búsqueda
Ejemplos:
Sea arre un arreglo de 70 elementos enteros con índices enteros. Su representación nos queda:

Ejemplos:
Sea bool un arreglo de 26 elementos booleanos con índices de tipo caracter. Su representación nos queda:
                Bool = arreglo["a".."z"] de booleanos

Número total de elementos:
NTE= (ord("z")-ord("a")) + 1 = 122-97+1 = 26 elementos
Lectura
El proceso de lectura de un arreglo consiste en leer y asignar un valor a cada uno de sus elementos. Normalmente se realizan con estructuras repetitivas, aunque pueden usarse estructuras selectivas. Usamos los índices para recorrer los elementos del arreglo:
desde i = 1 hasta 70 hacer
leer ( arre[i])
fin_desde
Escritura:
Es similar al caso de lectura, sólo que en vez de leer el componente del arreglo, lo escribimos.
             leer (N)
             desde i = 1 hasta N hacer
               escribir (arre[i])
             fin_desde
Asignación:
No es posible asignar directamente un valor a todo el arreglo; sino que se debe asignar el valor deseado en cada componente. Con una estructura repetitiva se puede asignar un valor a todos los elementos del vector.
Por ejemplo:
         arre[1]  ¬120 (asignación de un valor constante único a una casilla del vector)
         arre[3] ¬arre[1] / 4 (asignar una operación)
Se puede asignar un valor constante a todos los elementos del vector:desde i = 1 hasta 5 hacer
          arre[i] ¬3
          fin_desde
O bien
           arre  ¬3 (con arre del tipo arreglo)
Inicialización
Para inicializar con cero todos los elementos del arreglo:
            desde i = 1 hasta 70 hacer
                arre[i] ¬ 0
             fin_desde

Acceso Secuencial.
(Recorrido)
El acceso a los elementos de un vector puede ser para leer en él o para escribir (visualizar su contenido). Recorrido del vector es la acción de efectuar una acción general sobre todos los elementos de ese vector.
Actualización.
Incluye añadir (insertar), borrar o modificar algunos de los ya existentes. Se debe tener en cuenta si el arreglo está o no ordenado. Añadir datos a un vector consiste en agregar un nuevo elemento al final del vector, siempre que haya espacio en memoria.
Investigue cómo insertar o eliminar elementos en un arreglo:
a) Ordenado
b) No ordenado