Escolar Documentos
Profissional Documentos
Cultura Documentos
DATOS Y ALGORITMOS
NDICE
1.
1.1. Variables
Una variable es una posicin de memoria con nombre (identificador) que se usa para
mantener valores que pueden ser modificados durante el programa.
1.2. Declaracin
Las variables deben estar previamente declaradas antes de poder hacer referencia a
las mismas.
La declaracin de las variables ser de la forma:
tipo nombre_variable;
Forma 2:
int edad = 12;
y bool.
1.4. Identificadores
Son nombre_variable que se utilizan para representar variables, constantes, tipos y
funciones de un programa.
Se construyen con secuencias de una o ms letras, dgitos o smbolos de subrayado.
Los identificadores segn el estndar ANSI deben:
Si en un bloque se declara una variable local con el mismo nombre que una variable
global, cuando se use el identificador dentro del bloque se har referencia a la
variable local.
Sern variables distintas almacenadas en distintas posiciones de memoria.
Slo se deben declarar las variables globales necesarias, ya que en programas
grandes puede provocar efectos laterales como modificaciones no deseadas.
En el siguiente ejemplo, en la funcion_1la variable temporaltendr el valor de la
variable global edad(12) mientras que en la funcion_2la variable temporal, tendr el
valor de la variable local edad(200)
static int edad;
static void Main(string[] args)
{
edad = 12;
funcion_1();
}
static void funcion_1()
{
int temporal = edad;
function_2();
}
static void function_2()
{
int edad = 200;
int temporal = edad;
}
1.7. Constantes
Una constante es una variable cuyo valor no puede alterarse por el programa; como
variables, tendr un identificador o nombre que se asocia al valor de la constante.
Se pueden definir constantes de cualquiera de los tipos de datos.
Una constante no podr aparecer a la izquierda del signo de asignacin igual (=),
salvo en su inicializacin.
Para declarar e inicializar constantes se har con la palabra CONST seguido del tipo
de dato y el nombre identificativos de la variable, preferiblemente con todas las
letras en maysculas.
Por ejemplo:
const double PI = 3.14;
readonly
struct
base
class
catch
while
internal
new
int
parcial
override
finally
foreach
static
void
interface
abstract
virtual
throw
public
goto
this
delegate
sealed
using
for
private
Accin
Resta
Suma
Multiplicacin
Divisin
Resto de divisin
Decremento
Incremento
Cuando el operador de divisin (/) se aplica a dos operandos de tipo int, el resto se
desprecia (los decimales no se guardan) y se denomina divisin entera. En caso
contrario es una divisin real.
El operador del resto de la divisin (%) no se puede aplicar a los tipos de coma
flotante
(slo para divisiones enteras).
Los operadores de incremento y decremento (++ y --) se pueden usar antes de las
variables o despus, con significados diferentes:
++variable variable++
--variable variable-Si el operador (++ --) precede a la variable (se pone antes), se realiza primero el
incremento o el decremento y despus usa el valor de la variable.
Si el operador (++ --) sigue a la variable (se pone despus), se usa primero el valor
de la variable y despus realiza el incremento o el decremento.
Accin
Mayor que
Menor que
Mayor o igual que
Menor o igual que
Igual a
Distinto de
Accin
AND
OR
NOT
// segunda forma..
if (expresin-1)
variable = expresin-2;
else
variable = expresin-3;
10
11
12
Se ejecuta la inicializacin.
Se comprueba la condicin.
Si es cierta, se ejecutan las sentencias.
Se ejecuta la progresin y se vuelve al paso 2.
1.17 Arrays
Los arrays son estructuras de datos complejas (en el sentido de que no son atmicas)
que agrupan datos de un mismo tipo en particular, llamado el tipo base del array. El
tipo base de un array puede ser cualquiera de los tipos bsicos de C#, o incluso algunos
tipos complejos como las clases.
Un array es tambin ejemplo de un modelo. Un array puede considerarse como ejemplo
de una variable compuesta capaz de almacenar uno o ms datos al mismo tiempo.
La sintaxis del lenguaje permite referirse a cada uno de los elementos que constituyen
13
el array empleando ndices. Esto es posible pues los elementos del array estn
numerados en forma jerrquica y consecutiva, empezando en 0 en cada dimensin.
El siguiente grfico ilustra un ejemplo de un array llamado numeros, cuya posicin 0
almacena el valor 10, la posicin 1 el valor de 21, etc. Este array en total almacena n+1
elementos. El valor de n, depende de la memoria que pueda tener el computador y el
tipo de elementos que se almacenen en el array.
Los arrays, al igual que el resto de las variables se identifican con un nombre. Al
emplear ese nombre, se hace referencia a la estructura de datos como un todo, es decir,
con todos sus elementos. El lenguaje interpreta dicho nombre como un puntero.
Cuando se utiliza el nombre del array en forma indexada, es decir, combinado con
ndices, se hace referencia a un elemento particular, del tipo base, dentro de la
estructura compleja.
Importante: El lenguaje C# no controla la validez de los ndices que se emplean para
referenciar un array. Esto quiere decir que es posible cometer errores graves y
difciles de detectar en este sentido. Ms adelante se presenta un ejemplo en este
sentido.
1.17.1 Declaracin de Arrays Unidimensionales
Los arrays, al igual que las dems variables deben declararse antes de poder utilizarlas,
y cumplen con las mismas reglas de alcance y vida.
Los arrays de una sola dimensin reciben tambin el nombre de vectores. La sintaxis
de la declaracin de un array unidimensional es la siguiente:
<tipo-base>[] <identificador>;
Observaciones:
El <tipo-base>puede ser cualquiera de los tipos bsicos del lenguaje, o incluso
algunos complejos como estructuras.
14
Con los valores indicados entre llaves {} se inicializarn los elementos del array.
Los valores deben ser del <tipo-base> del array
Tambin es factible declarar, dimensionar, e inicializar un array con todos sus
elementos, en una sola declaracin, pero slo indicando un subconjunto de los
valores que el array puede guardar:
15
Por ejemplo, la siguiente porcin de cdigo compila sin problemas (es decir, sin
errores sintcticos), pero probablemente produzca un error en tiempo de ejecucin
al referenciarse posiciones inexistentes del array.
// Las posiciones con ndices del 10 al 19 son invlidas.
int[] array = { 1,1,1,1,1,1,1,1,1,1 }; // 10 elementos int i;
for (i=0; i<20; i++)
array[i] = 0; // Error para i >= 10
Tambin es comn cometer estos errores olvidando que las posiciones de los arrays
estn numeradas a partir del ndice cero. Es decir, en un array de tamao N
las posiciones estn numeradas de 0 a N-1.
16
depende de la definicin previa de un array de elementos del mismo tipo, los cuales
puede recorrer individualmente sin conocer el tamao explcitamente (como se requiere
en otras instrucciones, por ejemplo en el for).
La sintaxis de uso es:
foreach ( <tipo> <variable> in <array> )
{
<instrucciones>
}
Donde:
17
18
El <tipo-base> puede ser cualquiera de los tipos bsicos del lenguaje, o incluso
algunos complejos como estructuras. Cada elemento de la matriz ser del tipo definido
aqu.
19
20
21
22
2.1 Introduccin
Los computadores se emplean frecuentemente para almacenar y recuperar grandes
volmenes de datos. Con su velocidad y facilidad de acceso, los computadores
aventajan a otros medios de almacenamiento como el papel y las microfichas.
Es importante estudiar la forma en que los computadores pueden almacenar los datos,
de modo que su recuperacin (bsqueda) sea rpida. Para lograr esto, y puesto que
usualmente los usuarios requieren que los datos recuperados cuenten con algn orden
particular, tambin es importante estudiar algoritmos para ordenar los datos
almacenados.
En todos los ejemplos se supondr que existe un vector que contiene N datos.
Para el caso de la bsqueda, el problema consiste en averiguar si un determinado
dato est o no en el vector, y si es as, queremos saber su posicin.
Para el caso del ordenamiento, el problema consiste en ordenar el vector en forma
ascendente (de menor a mayor). Si se quisiera trabajar con ordenamiento descendente
los cambios seran mnimos.
En este captulo se presentan varios algoritmos de bsqueda y ordenamiento que
difieren entre s en cuanto a su complejidad y eficiencia.
23
{
/* Inicializar el indice para recorrer el vector de numeros */
int i = 0;
/* Recorrer el vector mientras no se llegue a su fin y no se encuentre el numero
buscado */
while ((i < N) && (NumeroBuscado != Numeros[i]))
i++;
/* Retornar la posicion del numero o la cantidad de elementos */
return(i);
}
2.1.1 Ejemplo: Bsqueda lineal en vector de enteros
/********************************************************************
* Ejemplo: Busqueda lineal en un vector de enteros.
********************************************************************/
using System;
using System.IO;
public class CSort
{
public int[] mLeerVector(string archivo)
{
StreamReader sr;
int [] numeros;
Console.WriteLine("Leyendo datos de entrada");
// Abrir el archivo
try
{
sr = new StreamReader(archivo);
numeros = new int[Int32.Parse(sr.ReadLine())];
string str;
for(int i = 0; (str = sr.ReadLine()) != null; i++)
numeros[i] = Int32.Parse(str);
sr.Close();
return(numeros);
}
catch (Exception e)
{
Console.WriteLine("Problema con apertura de I/O: ");
Console.WriteLine(e.Message);
Environment.Exit(1);
}
24
return null;
}
public void mMostrarVector(int[] vector)
{
Console.WriteLine("Los contenidos del vector son...");
foreach(int i in vector)
Console.WriteLine("{0}",i);
}
public int mBusquedaLineal(int[] Numeros, int NumeroBuscado)
{
for(int i = 0; i < Numeros.Length; i++)
if(Numeros[i] == NumeroBuscado)
return i;
return -1;
}
}
public class CMain
{
public static void Main(string [] args)
{
CSort cs = new CSort();
Console.Write("Ingrese Nombre archivo: ");
string archivo = Console.ReadLine();
int[] vector = cs.mLeerVector(archivo);
cs.mMostrarVector(vector);
Console.Write("Ingrese el nmero que desea buscar: ");
int search = Int32.Parse(Console.ReadLine());
int pos = cs.mBusquedaLineal(vector,search);
if(pos == -1)
Console.WriteLine("No se encontr el nmero {0}",search);
else
Console.WriteLine("El numero {0} se encuentra en la
posicin {1}", search,pos);
}
}
25
26
27
Array de entrada:
Ejemplo de ejecucin
C:\>ordsel entrada.txt
Leyendo datos de entrada
Antes de Ordenar
El vector de 10 enteros es:
3 -5 20 0 11 4 2 9 -1 90
Despues de Ordenar
El vector de 10 enteros es:
-5 -1 0 2 3 4 9 11 20 90
28
using System;
using System.IO;
public class CSelSort
{
public int [] mLeerVector(string archivo)
{
StreamReader sr;
int [] numeros;
Console.WriteLine("Leyendo datos de entrada");
Try
{
sr = new StreamReader(archivo);
numeros = new int[Int32.Parse(sr.ReadLine())];
string str;
for(int i = 0; (str = sr.ReadLine()) != null; i++)
numeros[i] = Int32.Parse(str);
sr.Close();
return(numeros);
}
catch (Exception e)
{
Console.WriteLine("Problema con apertura de I/O: ");
Console.WriteLine(e.Message);
Environment.Exit(1);
}
return null;
}
public void mMostrarVector(int [] vector)
{
Console.WriteLine("Los contenidos del vector son...");
foreach(int i in vector)
Console.WriteLine("{0}",i);
}
29
30
31
log n
n log n
n2
n2 log
n
0,00
0,0
0,0
0,69
1,4
2,8
1,61
8,0
25
40,2
10
2,30
23,0
100
230,3
20
3,00
59,9
400
1198,3
50
3,91
195,6
2500
9780,1
100
4,61
460,5
10000
46051,7
200
5,30
1059,7
40000
211932,7
500
6,21
3107,3
250000
1553652,0
1000
6,91
6907,8
1000000
6907755,3
2000
7,60
15201,8
4000000
30403609,8
5000
8,52
42586,0
25000000
212929829,8
10000
9,21
92103,4
100000000
921034037,2
20000
9,90
198069,8
400000000
3961395021,0
50000
10,82
540988,9
2500000000
27049445711,0
100000
11,51
1151292,5
10000000000
115129254649,7
200000
12,21
2441214,5
40000000000
488242905821,2
500000
13,12
6561181,7
250000000000
3280590844351,1
1000000
13,82
13815510,6
1000000000000
13815510557964,3
2000000
14,51
29017315,5
4000000000000
58034630954096,9
5000000
15,42
77124742,4
25000000000000
385623711759959,0
32
33
34
35
La funcin que lleva a cabo la seleccin del pivote y el particionamiento del vector
sera:
/***************************************************************
* Funcin para particionar un vector en dos subvectores, intercambiando
* elementos de modo que todos los menores que el pivote estn a la
* izquierda y los mayores a la derecha.
* Se reciben como parmetros el vector y el ndice inicial y final.
* Se retorna el ndice para particionar el vector (posicin del pivote).
***************************************************************/
int ParticionarVector(int[] Numeros, int Inicio, int Fin) {
int pivote = Numeros[(Inicio + Fin) / 2];
int izq = Inicio - 1;
int der = Fin + 1;
int aux;
while (izq < der)
{
// Busca el 1er. elemento de la derecha que haya que intercambiar
do {
izq++;
} while (Numeros[izq] < pivote);
// Busca el 1er. elemento de la izq. que haya que intercambiar
do {
der--;
} while (Numeros[der] > pivote);
if (izq < der) {
// Lleva a cabo el intercambio
aux = Numeros[izq];
Numeros[izq] = Numeros[der];
Numeros[der] = aux;
}
}
return(der);
}
36
Como se ve en la figura anterior, para agregar elementos a una pila se debe utilizar el
mtodo Push que recibe como parmetro un Object. Mientras que en la cola se debe
utilizar el mtodo Enqueue (encolar). Ambos mtodos, incrementan automticamente la
capacidad de la coleccin.
Para obtener un elemento de la coleccin, contamos con dos opciones diferentes:
1. Obtener el elemento indicado segn el comportamiento de la coleccin sin quitarlo de
la coleccin. Esto se logra mediante el mtodo Peek de cada coleccin.
2. Obtener un elemento de la coleccin, quitndolo de la misma. Esto se logra mediante
el mtodo Pop de la pila (Stack) o el mtodo Dequeue de la cola (Queue).
37
Resultado:
Este par de colecciones deben ser usadas cuando nos interesa tener control sobre el
orden en que los elementos son obtenidos de las mismas. La pila se debe usar cuando
queremos obtener los elementos en el orden inverso al cual fueron ingresados. Mientras
que la cola debe ser utilizada cuando queremos obtener los elementos en el mismo
orden que fueron ingresados.
38