domingo, 24 de enero de 2016

PILAS Y COLAS

PILA O STACKS

Una PILA es una estructuras en donde cada elemento es insertado y retirado
del tope de la  misma, y debido a esto el comportamiento de un una pila se
conoce como LIFO (último enentrar, primero en salir ).


Un ejemplo de pila o stack se puede observar en el mismo procesador, es decir, cada vez que en los programas aparece una llamada a una función el microprocesador guarda el estado de ciertos registros en un segmento de memoria conocido como Stack Segment, mismos que serán recuperados al regreso de la función.

Pila en arreglo estático

En el programa que se verá en seguida, se simula el comportamiento de una estructura de pila. Aunque en el mismo se usa un arreglo estático de tamaño fijo se debe mencionar que normalmente las implementaciones hechas por fabricantes y/o terceras personas se basan en listas dinámicas o enlazadas.
Para la implementación de la clase Stack se han elegido los métodos:

put(),   poner un elemento en la pila
get(),   retirar un elemento de la pila
empty(), regresa 1 (TRUE) si la pila esta vacia
size(),  número de elementos en la pila

El atributo SP de la clase Stack es el puntero de lectura/escritura, es decir, el SP
indica la posición dentro de la pila en donde la función put() insertará el siguiente
dato, y la posición dentro de la pila de donde la función get() leerá el siguiente dato.

Cada vez que put() inserta un elemento el SP se decrementa.
Cada vez que get() retira un elemento el SP se incrementa.

En el siguente ejemplo se analiza lo que sucede con el SP (puntero de pila) cuando se guardan en la pila uno por uno los caracteres 'A', 'B', 'C' y 'D'. Observe que al principio el SP es igual al tamaño de la pila.

Llenando la pila.

                  SP
                  |
+---+---+---+---+---+
|   |   |   |   |   |    al principio (lista vacia)
+---+---+---+---+---+
              SP
              |
+---+---+---+---+---+    push('A');
|   |   |   |   | A |    después de haber agregado el primer elemento
+---+---+---+---+---+
...

  SP
  |
+---+---+---+---+---+
|   | D | C | B | A |    después de haber agregado cuatro elementos
+---+---+---+---+---+

Vaciando la pila.

      SP
      |
+---+---+---+---+---+    pop();
|   | D | C | B | A |    después de haber retirado un elemento
+---+---+---+---+---+
...

                  SP
                  |
+---+---+---+---+---+
|   | D | C | B | A |    después de haber retirado todos los elementos
+---+---+---+---+---+
Nota: observe que al final la lista está vacia, y que dicho estado se debe a que
el puntero  está al final de la pila y no al hecho de borrar físicamente cada elemento
de la pila.

Ejemplo: Pila basada en un arreglo estático

#include <iostream>
using namespace std;

#define STACK_SIZE 256 /* capacidad máxima */
typedef char arreglo[STACK_SIZE];

class Stack {
 
int sp; /* puntero de lectura/escritura */
int items; /* número de elementos en lista */
int itemsize; /* tamaño del elemento */
arreglo pila;  /* el arreglo */
 
public:
// constructor
Stack() {
sp = STACK_SIZE-1;
items = 0;
itemsize = 1;
 }
 
// destructor
~Stack() {};
 
/* regresa el número de elementos en lista */
int size() { return items; }
 
/* regresa 1 si no hay elementos en la lista, o sea, si la lista está vacia */
int empty() { return items == 0; }
 
/* insertar elemento a la lista */
int put(char d)
{
if ( sp >= 0) {
pila[sp] = d;
sp --;
items ++;
}
return d;
}
 
/* retirar elemento de la lista */
int get()
{
if ( ! empty() ) {
sp ++;
items --;
}
return pila[sp];
}
 
}; // fin de clase Stack


// probando la pila. 
// Nota: obseve cómo los elementos se ingresan en orden desde la A hasta la Z,
// y como los mismos se recuperán en orden inverso.
int main()
{
    int d;
    Stack s;  // s es un objeto (instancia) de la clase Stack

    // llenando la pila
    for (d='A'; d<='Z'; d++) s.put(d);

    cout << "Items =" << s.size() << endl;

    // vaciando la pila
    while ( s.size() ) cout << (char)s.get() << " ";

    cout << "\nPara terminar oprima <Enter>...";
    cin.get();
    return 0;
}
}

Colas o Queues

Una cola sencilla es una estructura en donde cada elemento es insertado
inmediatamente después del último elemento insertado; y donde los elementos
se retiran siempre por el frente de la misma, debido a esto el comportamiento
de un una cola se conoce como FIFO (primero en entrar, primero en salir).


Un ejemplo a citar de cola es el comportamiento del buffer del teclado.
Cuando en el teclado se oprime una tecla, el código del carácter ingresado es trasladado y depositado en una área de memoria intermedia conocida como "el buffer del teclado", para esto el microprocedador llama a una rutina específica. Luego, para leer el carácter depositado en el buffer existe otra función, es decir, hay una rutina para escribir y otra para leer los caracteres del buffer cada una de las cuales posee un puntero; uno para saber en donde dentro del buffer se escribirá el siguiente código y otro para saber de donde dentro del buffer se leerá el siguiente código.

Cola en un arreglo estático

En el programa que se ve en seguida, se simula el comportamiento de una estructura de cola simple. Aunque en el mismo se usa un arreglo estático de tamañoo fijo se debe mencionar que normalmente las implementaciones hechas por fabricantes y/o terceras personas se basan en listas dinámicas o dinamicamente enlazadas.
Para la implementación de la clase Queue se han elegido los métodos:

    put(),   poner un elemento en la cola
    get(),   retirar un elemento de la cola
    empty(), regresa 1 (TRUE) si la cola est  vacia
    size(),  número de elementos en la cola

   El atributo cabeza de la clase Queue es el puntero de lectura.
   El atributo cola de la clase Queue es el puntero de escritura.

Es decir, la cola indica la posición dentro de la lista en donde la función put() insertará el siguiente dato, y la cabeza indica la posición dentro de la lista de donde la función get() leerá el siguiente dato.

  Cada vez que put() inserta un elemento la cola se incrementa.
  Cada vez que get() retira un elemento la cabeza se incrementa.
En el siguente ejemplo se analiza lo que sucede con la cola y la cabeza (punteros de escritura y de lectura de la Lista) cuando se guardan en la cola uno por uno los caracteres 'A', 'B', 'C' y 'D'. Observe que al principio: cola = cabeza = cero.

Llenando la cola.

  cola
  |
+---+---+---+---+---+
|   |   |   |   |   |    al principio
+---+---+---+---+---+
  |
  cabeza
      cola
      |
+---+---+---+---+---+    put('A');
| A |   |   |   |   |    después de haber agregado el primer elemento
+---+---+---+---+---+
  |
  cabeza
...

                  cola
                  |
+---+---+---+---+---+
| A | B | C | D |   |    después de haber agregado cuatro elementos
+---+---+---+---+---+
  |
  cabeza
Vaciando la cola.

  cabeza
  |
+---+---+---+---+---+
| A | B | C | D |   |    antes de haber retirado elementos
+---+---+---+---+---+
      cabeza
      |
+---+---+---+---+---+    get();
| A | B | C | D |   |    después de haber retirado un elemento
+---+---+---+---+---+
...

                  cabeza
                  |
+---+---+---+---+---+    al final
| A | B | C | D |   |    después de haber retirado todos los elementos
+---+---+---+---+---+
                  |
                  cola
Observese que al final el cabeza apunta hacia el mismo elemento que la cola, es decir, la cola vuelve a estar vacia. Puesto que la cola que estamos proyectando reside en un arreglo estático los componentes del arreglo aún están dentro de la misma, salvo que para su recuperación se debería escribir otro método. En una cola dinámica (como se demostrará más adelante) los elementos retirados de la misma se eliminan de la memoria y podría no ser posible su recuperación posterior.

Nota: En el programa que aparece en seguida, al tipo de lista implementado por la clase Queue se le conoce como "lista circular" debido al comportamiento de sus punteros. Es decir si los métodos para escribir o leer detectan que el puntero correspondiente ha sobrepasado el tamaño máximo de elementos permitidos dentro de la cola, éste es puesto a cero.

Ejemplo: cola en un arreglo estático

/*---------------------------------------------------------------+
+ ejemplo de una cola (QUEUE) basada en un arreglo estático +
+ +
+ Autor: Oscar E. Palacios +
+ email: oscarpalacios1@yahoo.com.mx +
+ +
+ Manifiesto: +
+ Este programa puede distribuirse, copiarse y modificarse de +
+ forma libre. +
+---------------------------------------------------------------*/
#include <iostream.h>

#define MAX_SIZE 256 /* capacidad máxima */
typedef char almacen[MAX_SIZE];

class Queue {

int cabeza; /* puntero de lectura */
int cola; /* puntero de escritura */
int ITEMS; /* número de elementos en la lista */
int ITEMSIZE; /* tamaño de cada elemento */
almacen alma; /* el almacen */

public:
    // constructor
    Queue() {
cabeza = 0;
cola = 0;
ITEMS = 0;
ITEMSIZE = 1;
    }

    // destructor
    ~Queue() {}

// regresa 1 (true) si la lista está vacia
int empty() { return ITEMS == 0; }

// insertar elemento a la lista
int put(int d)
{
    if ( ITEMS == MAX_SIZE) return -1;
    if ( cola >= MAX_SIZE) { cola = 0; }
    alma[cola] = d;
    cola ++;
    ITEMS ++;
    return d;
}

// retirar elemento de la lista
int get()
{
    char d;
    if ( empty() ) return -1;
    if ( cabeza >= MAX_SIZE ) { cabeza = 0; }
    d = alma[cabeza];
    cabeza ++;
    ITEMS --;
    return d;
}

// regresa el n£mero de elementos en lista
int size() { return ITEMS; }

}; // fin de la clase Queue


// probando la cola
int main()
{
    int d;
    Queue q;

    for (d='A'; d<='Z'; d++) q.put(d);

    cout << "Items = " << q.size() << endl;

    while ( q.size() ) {
cout << (char)q.get() << " ";
    }

    cout << "\nPara terminar oprima <Enter> ...";
    cin .get();
    return 0;
}

PUNTEROS

Un puntero es una variable que contiene la dirección de memoria de un dato o de otra variable que contiene al dato en un arreglo, el puntero apunta al espacio físico donde está el dato o la variable. Un puntero puede apuntar a un objeto de cualquier tipo, como por ejemplo, a una estructura o una función. Los punteros se pueden utilizar para referencia y manipular estructuras de datos, para diferenciar bloques de memoria asignados dinámica mente y para proveer el paso de argumentos por referencias en las llamadas a funciones.

DECLARACIÓN

Se declara igual que cualquier otra variable, pero anteponiendo un * (asterisco) antes del nombre de la variable.

Su sintaxis seria:

Tipo *Nombre Puntero;
Donde tipo es el tipo de dato al que diferenciará este puntero.

#include <stdio.h>
int main ()
{
int a=0;                                                   //Declaración de variable entera de tipo entero
int *puntero;                                           //Declaración de variable puntero de tipo entero
puntero = &a;                                         //Asignación de la dirección memoria de a

printf ("El valor de a es: %d. \n El valor de *puntero es: %d. \n",a,*puntero);
printf ("La direccion de memoria de *puntero es: %p", puntero);
return 0;
}

LOS OPERADORES

Existen dos operadores especiales de punteros: * y &. 

• El operador & (operador dirección), aplicado sobre el nombre de una variable, devuelve su dirección de memoria.

 • El operador * (operador in dirección) aplicado sobre una variable de tipo puntero permite acceder al dato al que apunta, es decir, al valor de la variable situada en esa dirección de memoria. 

 ASIGNACIÓN DE PUNTEROS

Respecto a la comparación y a la asignación, los punteros se ajustan a las mismas reglas que cualquier otra variable en C: • Un puntero puede utilizarse a la derecha de una declaración de asignación para asignar su valor a otro puntero. • Podemos comparar dos punteros en una expresión relacional. 


INICIALIZACION DE PUNTEROS

Al igual que otras variables, C no inicializa los punteros cuando se declaran y es preciso inicializarlos antes de su uso. TODO PUNTERO DEBE INICIALIZARSE, ya que en caso contrario tras ser declarado apuntaría a cualquier sitio (PELIGROSO) Æ al usarlo puede p.ej. modificar una parte de la memoria reservada a otra variable Si aún no sabemos dónde debe apuntar, se le asignará el valor NULL (nulo) Î No apunta a ningún sitio en especial. Ejemplo: int *p = NULL; 

Punteros y vectores

Los vectores son punteros constantes. Un vector sin subindice es un puntero al primer elemento del vector. Una matriz es un vector de vectores. (Ej: int M[3][3];) de manera que en cada elemento del primer vector "se cuelga" otro vector, pudiendo hacer así referencia a filas y columnas.
int X[15];
int *ptrX;
ptrX = X; // ptrX recibe la dirección del primer elemento ( 0 ) de X
Así como también podría escribirse
int X[15];
int *ptrX;
ptrX = &X[0]; // ptrX es igual a la dirección del primer elemento de X
Se pueden utilizar distintos elementos del vector teniendo en cuenta la sintaxis de punteros.
int X[15], Y, *ptrX;
ptrX = X;

Y = *( ptrX + 7 );
En este caso puede verse que Y toma el valor del elemento 7 del vector X, siendo 7 el desplazamiento dentro del vector. El operador de indirección queda fuera del paréntesis porque tiene una prioridad superior a la del operador +. De no existir los paréntesis, se sumaria 7 al elemento X[0]. Teniendo en cuenta que los vectoresson punteros constantes, el nombre del vector puede tratarse como un puntero:
Y = *( X + 7 );

Matrices de punteros

Para realizar una estructura de datos dinámica, se puede utilizar una matriz donde sus elementos sean punteros. Suponiendo que queramos hacer un calendario y lo dividamos por semanas. Podríamos utilizar una matriz con los días de la semana.
const char *dias[7] = { "Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado" }
Cada día de la semana, no es un elemento de la matriz, sino que la expresión dias[7] crea una matriz de siete elementos como punteros a char.

KODU

Kodu, originalmente llamado Boku, es una programacion entorno de desarrollo integrado (IDE) de Microsoft 's FUSE Labs de. Se ejecuta enXbox 360 y Microsoft Windows XP, Windows Vista, Windows 7, Windows 8 y Windows 10. Fue lanzado en el Bazar de Xbox Live el 30 de junio de 2009. Una versión de Windows está disponible para el público en general para su descarga desde el portal FUSE web de Microsoft.


DESCRIPCION

Kodu es una programación visual herramienta que se basa en las ideas iniciadas con Logo en los años 1960 y otros proyectos actuales como AgentSheets, Squeak y Alice. Está diseñado para ser accesible por los niños y agradable por cualquier persona.
Kodu está disponible para descarga como una Xbox 360 Indie Game. También hay una versión para PC en una beta abierta que está disponible para cualquier persona en su página web.
Kodu es diferente de los otros proyectos en varios aspectos clave:
  • Evita código a escribir haciendo que los usuarios construyen los programas que utilizan elementos visuales a través de un dispositivo de juego
  • En lugar de una pantalla de mapa de bits o 2D, los programas se ejecutan en un entorno de simulación 3D, similar a Alice


Kodu Game Lab también ha sido utilizado como una herramienta de aprendizaje de la educación en las escuelas seleccionadas y centros de aprendizaje.

Aqui abajo esta el link para que puedan descargar kodu
es la pagina ofiacial solo deben presionar en  "GET KODU" y se empezara a descargar la aplicacion.

ESTRUCTURAS EN C

Una estructura contiene varios datos. La forma de definir una estructura es haciendo uso de la palabra clave struct.
qui hay ejemplo de la declaracion de una estructura:


  struct mystruct
  {
      int int_member;
      double double_member;
      char string_member[25];
  } variable;


"variable" es una instancia de "mystruct" y no es necesario ponerla aquí. Se podria omitir de la declaracion de "mystruct" y más tarde declararla usando:
  struct mystruct variable;
También es una práctica muy común asignarle un alias o sinónimo al nombre de la estructura, para evitar el tener que poner "struct mystruct" cada vez. C nos permite la posibilidad de hacer esto usando la palabra clave typedef, lo que crea un alias a un tipo:
  typedef struct
  {
     ...
  } Mystruct;
La estructura misma no tiene nombre (por la ausencia de nombre en la primera linea), pero tiene de alias "Mystruct". Entonces se puede usar así:
  Mystruct variable;
Note que es una convención, y una buena costumbre usar mayúscula en la primera letra de un sinónimo de tipo. De todos modos lo importante es darle algún identificador para poder hacer referencia a la estructura: podríamos tener una estructura de datos recursiva de algún tipo.

Estructuras Anidadas

Una estructura puede estar dentro de otra estructura a esto se le conoce como anidamiento o estructuras anidadas. Ya que se trabajan con datos en estructuras si definimos un tipo de dato en una estructura y necesitamos definir ese dato dentro de otra estructura solamente se llama el dato de la estructura anterior.

un ejemplo aquí de estructuras

ejercicio:
realizar un programa que solicite los datos personales de una persona donde y despliegue los datos con sus respectiva dirección de memoria

1. creación del programa

PROGRAMA DATOS PERSONALES


2. corrida de escritorio

el programa pide los datos informativos de la persona.





3. despliega los datos pedidos e ingresados por el usuario con su respectivo espacio de memoria.

GRAFICAS EN C

  • En el modo gráfico existe una enorme cantidad de funciones que realizan desde la tarea mas sencilla como es pintar un píxel, hasta la tarea mas compleja como pudiera ser dibujar un carácter por medio de trazos.
  • Para trabajar el modo gráfico es necesario incluir la librería graphics.h como hacer uso de la BGI (Borlan Graphics Interphase)
  • Para usar cualquier función es necesario colocar el adaptador de video en modo grafico y esto se logra a través de la función initgraph(); y al terminares necesario regresar al modo original a través de la función closegraph();
  • Para iniciar un programa en ambiente gráfico es recomendable correr una subrutina de inicialización de gráficos y detección de errores.
  • Algunos ejemplos de las funciones que se pueden encontrar en la librería de gráphics.h son: Line(); circle(); arc(); elipse();rectangle(); ottextxy(); putpixel()

Para realizar gráficos en C++ necesitamos poner el sistema en modo gráfico. Para ello debemos incluir a nuestro programa la biblioteca de gráficos GRAPHICS.H 
#include <graphics.h> 
Función
Tarea
voidcircle (int x, int y, int radius);
Dibuja un circulo en x,y de radio radius
voidcleardevice (void);
Borra la pantalla
void line (int x1, int y1, int x2, int y2);
Traza una línea desde x1,y1 hasta x2,y2
void lineto (int x, int y)
Traza una línea desde la posición actual de cursor hasta  x,y
void putpixel (int x, int y, int color);
Dibuja un pixel en x,y de color color
void rectangle (int left, int top, int right, int bottom);
Dibuja un rectangulo de esquenas top,left y right,bottom
voidsetcolor (int color);
Establece el color actual.
intmousex(void)
Retorna la coordenada x del Mouse relativa a la esquina superior izquierda
intmousey(void)
Retorna la coordenada y del Mouse relativa a la esquina superior izquierda

TU PROPIA LIBRERIA


COMO CREAR TU PROPIA LIBRERIA 

 
 

PRIMER PASO

 Genera las funciones que te interesan y escribelas todas juntas (código y cabeceras) en un mismo archivo de texto.



SEGUNDO PASO


El fichero creado anteriormente, guárdalo con extensión .h  por ejemplo milibreria.h (importante no ejecutarlo para que no le pueda cambiar sola la extensión).

 






 





Sedeberá guardar en la carpeta include del compilador. Esta carpeta se puede encontrar facilmente en la misma carpeta del compilador, accediendo a Mi PC (Equipo) y en la carpeta donde se guardan todos los programas.

TERCER PASO


Llamar a la biblioteca en el programa. Deberemos colocar en la cabecera del programa, junto a los llamamiento de otras bibliotecas:


 

CUARTO PASO


mandamos a correr el programa y listo eso es todo.