miércoles, abril 13, 2005

Pilas y Colas

Pilas y Colas

Estructuras de datos compuestas: Pilas, colas, liastas ligadas, arboles.

Listas lineales
Conjunto ordenado de elementos cuyo tamaño puede variar. Ususalmente las operaciones de creación y destrucción son validas en una lista.

Pilas
Es una lista de elemntos donde las operaciones de creación y destrucción se realicen en uno de sus extremos.
Al realizar la insercción de un elemento este ha de ser colocado inmediatamente despues del ultimo se inserto y cuando se elimine un elemento este sera el ultimo que se introdujo.

Los ultimos son los mas dificiles a eliminar.

A este mecanismo se le llama LIFO (Last in-First out) UEPS (ultimo en entrar-primero en salir)

Se tiene una cola de 5 numeros:

1
2
3
4
5

El 1 es el ultimo en entrar.. pero cuando se pida quitar un dato.. tiene que ser forzosamente el primero que entro..quedaria

2
3
4
5

Si queremos sacar otro numero seria el 2, entonces quedaria :

3
4
5

Si agregamos el numero 6 quedaria de la siguiente forma:

6
3
4
5

Al numero mas reciente o el ultimo en entrar (en este caso el 6) se le llama TOPE.
Al numero mas viejo, o de los primeros en ingresar (en este caso el 5) se le llama BASE.

Para representar el algoritmo de las operaciones la pila se almacena en un arreglo.
La pila llega hasta donde lleda el arreglo.

Ejemplo: Si tenemos un arreglo de 10 numeros... la pila solo podra contener 10 numeros.. si se le ingresa otro numero habria un desbordamiento, osea que ya no pondria ese numero en la pantalla.

1
2
3
4
5
6
7
8
9
0
2

Podemos ver que aqui hay un arreglo de 11 numeros... pero el arreglo que queremos es de 10... entonces el ultimo numero (aqui es el 2) no saldria en pantalla.

TOPE: Indicador al ultimo elemento insertado.
BASE: Indicador al inicio de la pila.

Algoritmo:

NOTA: En algunos algoritmos tope apunta a la siguiente localidad disponible en lugar del ultimo elemento insertado.
Ejemplo: tenemos un arreglo de 3 numeros...

-
2
3

En algunos porgramas el tope seria 2 ya que es el ultimo insertado, pero en otros el tope seria - (esto quiere decir que no hay numero, es un lugar vacio).

Regresando al tema:

Manejo

1: Si usan arreglos para implementar la pila esta no puede crecer mas alla del limite del arreglo si utilizan listas igadas el limite sera la cantidad de memoria disponible.

2: Cuando una pila no tiene elementos tope = 0, cuando se inseta un elemento TOPE crece, cuando se elimina TOPE disminuye.

3: Si en un momento dado la pila tiene el mismo tamaño de vector, y se desea insertar un elemento ocurrira un OVERFLOW (Desbordamiento). Es como se explicaba arriba, cuando ya no hay lugares.. hay un OVERFLOW o el desbordamiento.

4: Si en un momento dado se quiere eliminar un elemento y la pila esta vacia ocurre un UNDERFLOW (no existe)..supongamos que tenemos un vector de 3 numeros

-
-
-
como se puede ver no hemos metido ningun dato, entonces TOPE y BASE son iguales, y si queremos borrar un dato.. como no lo hay, no existe.

5: La soperaciones de insercción y eliminación se les conoce como PUSH (insercción) y POP(eliminación).


Ahora hagamos el algoritmo de una pila:

Variables a usar:
s=Vetor de n elementos
tope=indicador a ultimo elemento
x= dato a insertar

Procedimiento Push(s,tope,x)

1:[Verificar que no ocurra overflow]
Si tope=n entonces
escribir('Overflow en la pila')
alto
fin si

2:[Perdir dato]
leer x

3:[Incrementar tope]
tope=tope+1

4:[Insertar dato]
s[tope]=x

5: Alto



Procedimiento PUSH (s,tope)

1:[Verificar que no ocurra UNDERFLOW]
si tope=0 entonces
escribimos('UNDERFLOW en la pila')
fin si

2:[Desplegar (mostrar) elemento a eliminar]
escribir('Se elimina:' s[tope]')

3:[Eliminar elemento]
tope=tope-1

4:alto



jueves, marzo 31, 2005

Estructuras lineales

*Arreglos
*Registros


Arreglos
Conjunto de elementos del mismo tipo.Se almacena de manera adyacente y oucpa los bits que sean necesarios.


Cadenas (strings)
Un arreglo de caracteres delimitado por comillas, indica el principio y fin. Cada caracter se almacena en una posición del arreglo.

Veamos como quedaria la estructura:

En C:

char texto[10];
texto="hola";



Si queremos sacar solo la L, quedaria lo siguiente:

printf("%c",texto[2];

Es el numero dos, ya que en c, se cuenta desde cero y otros programas, menos en pascal... eso quiere decir que:

H=0
O=1
L=2
A=3



En pascal:

texto:string[10];
texto:='hola';

Si queremos imprimir la L, quedaria lo siguiente:

writeln(texto[3]);

Es el numero tres, ya que Pascal inicia desde 1, esto quiere decir que:

H=1
O=2
L=3
A=4


La maquina saca estos resultados con las siguientes formulas:

En C:
loc(i)=Li+c(i)

En pascal:
loc(i)=Li+c(i-1)

Veamos un ejemplo que no se puede realizar:

char texto[10];
texto='hola';

texto[5]='a';
texto[10]='r';

Aqui imprimiria la a sin ningun problema, ya que el texto contiene 10 bits o espacios para almacenar una letra.
printf("%c",texto[5]);

Pero en este otro, hay un problema, ya que no llega a 10 sino a 0 caracteres (recordemos que C inicia desde 0),surgiria un error y encimaria, habria muchos problemas, hay compiladores que lo toman bien y otros te avisan del error, depende del tipo de compilador, pero lo mejor es evitar este tipo de errores.
printf("%c",texto[10]);

Supongo que ah de surgir la duda de porque pascal inicia con 1 y los demas programas o la mayoria inician con 0, bueno la explicacion es sencilla:

Tenemos la palabra : HOLA
Esta conformada por 4 caracteres

H=1
O=2
L=3
A=4

Lo que hace pascal en poner en el cero los caracteres que ocupo, esto quiere decir que HOLA quedaria en un compilador de pasacal asi:

4=0 <--- Es cuatro porque hola ocupa 4 bits
H=1
O=2
L=3
A=4

Si tuvieramos mauricio quedaria :

8=0 ***
m=1
a=2
u=3
r=4
i=5
c=6
i=7
o=8

***Ya que mi nombre ocupa 8 bits, se le pone el 8.

Sabemos que:
Char = 1byte
Entero = 2Bytes
Flotante = 4 Bytes
Double = 8 Bytes


Bueno todo lo que hemos estado haciendo, es de una manera "lenta" por asi decirlo, ya que la maquina cuando le decimos que nos muestre:

printf("%c",texto[3]); <- Busca la posición 3 y la imprime. H = texto[0] ___54375
O = texto[1] ___54376
L = texto[2] ___54377
A = texto[3] ___54378

Lo que viene en texto[x], es donde esta almacenado la letra.
Se preguntaran que son esos numeros (54375...) Es la memoria del caracter, en el caso de la A seria 54378

Entonces aqui inician los dichosos apuntadores.

Apuntadores

Un apuntador es una variable que almacena direcciones de memoria. El apuntador sirve mas que nada para darle una dirección directa (Es mas rapido para la computadora), quizas a simpel vista no se note la velocidad, pero a la larga cuando se necesiten mas de 10000 de caracteres... se hara lenta la maquina, y el apuntador hace que el programa corra mas rapido..

Realmente el arreglo es un apuntador al inicio del arreglo:
arreglo -> Texto -> Apuntador

En texto se almacena la direccion de memoria, y es una variable.

Para accesar a los elementos de una arreglo el procesador obtiene el primer byte de este elemento usando una función de direccionamiento (Addressing Fuction).

En el caso de un vector:

loc(i)=Li+c(i-1) <- Pascal loc(i)=Li+c(i-1) <- En C


i= Elemento que se quiere (Indice del arreglo)
Li= Direccion de memoria donde comienza almacenarser el arreglo
c= Tamaño en byte del elemento que se quiere obtener.

Tenemos el arreglo Texto, para representarlo en apuntador seria de la siguiente forma:

374 _
-------
54375
<- Sabemos que este es la memoria, en este caso es el inicio del arreglo El apuntador puede estar almacenado en cualquier numero... no necesariamente uno fijo.

Si queremos ver:
printf("%c",texto[2]);

Se usaria la formula de la siguiente manera:

Loc(2)=54375+1(2)=54377

2 = El lugar que queremos
54375 = Inica nuestro arreglo
1 = Aqui es uno porque es un caracter 1 byte de char, si fuera int ocuparia 2, float 4, ...
2= Lugar que se quiere.

374 _
-------
54377 <- Aqui es donde se encuentra el texto[2]


Para entenderlo mejor seria:
Sabemos que en C, inicamos desde 0 esto quiere decir que el inicio del arreglo es 54377, el 1 seria 54378...

54375 54376 54377
___H_______O_______L
___0_______1_______2

Cuando guardamos en C:
scanf("%d",&x);

Realmente el & lo que hace es que x la ponga como apuntador.

& = Direccion de...


Queremos saber como nos daria las famosas direcciones en C, que en los ejemplos de arriba es 374 (Porque es donde almaceno el arreglo texto).

printf("%u",&texto);

%u = Entero sin signo
&texto = lo que hara es mostrarnos 374, que es la direccion de la variable.

Y para que nos muestre el numero del contenido, en el caso de arriba es 54375 seria:

printf(%u",*texto);

* = Contenido de...

Esto que vimos anteriormente solo nos imprime los numeros donde se encuentra la direcion y el contenido.
Ahora para que nos imprima el texto con y sin apuntador quedaria de la siguiente forma:

-Sin apuntador (que es lo que comunmente hacemos):
printf("%s",texto); <- Nos imprimira HOLA
-Con apuntador (que seria lo mejor):
printf("%s",*texto);

Como podemos ver usamos * ya que es donde esta el contenido.

Si ponemos atencion veremos que si queremos la direccion y el contenido en numeros (donde esta almacenado) usamos %u y cuando queremos el contenido en texto se usa %s,%c.....

Ahora si queremos una sola letra es cuestión de lógica:

HOLA

-Sin apuntador:
printf("%c",texto[2]); <-- Nos imprimira la L
-Con apuntador:
printf("%c",*(texto)+2));




Registros
Es una estructura de datos que diferencia de un arreglo puede almacenar informacion de distinto tipo, llamados campos.

Los registros se almacenan en memoria colocando los campos uno despues del otro, si se quiere la posición del campo I, la funcion de direccionamiento:

Ri=S1+S2+S3....-1

S= es el tamaño del componente aterior a i


La estructura en pascal seria:

type empleados = Record
nombre:string[30];
direccion:string[50];
telefono:tring[10];
RFC:string[12];
edad:integer;
sueldo:real;
end;

var
persona: empleados;
.
.
persona.nombre:='fulanito';
persona.direccion:='Niño perdido';
persona.telefono:='0123456';
persona.RFC:='ABCD123456';
persona.edad:=50;
persona.sueldo:=200000;


Entonces para encontrar la posicion de direccionamiento seria:

R5=S1+S2+S3+S4
=30+50+10+12
=102

El R5 es persona.edad, entonces se suman los espacios que ocupan los anteriores, esto quiere decir que ubicara en memoria los elementos en el numero 102.

Para leer la persona seria:
writeln(persona.edad);

Para guardarla
readln(persona.edad);

Como se puede ver es algo molesto estar poniedo persona...., persona. .... , hay una manera de resumirla, que seria de la siguiente manera:

with palabra do
begin
registros
end;


Quedaria de la siguiente forma:

with persona do
Begin
nombre:='fulanito';
direccion:='Niño perdido';
telefono:='0123456';
RFC:='ABCD123456';
edad:=50;
sueldo:=200000;
end;


Veamos ahora en C como quedaria :

struct empleados
{
char nombre[30];
char direccion[50];
int edad;
float sueldo;
}persona;

persona.nombre="fulanito";
persona.direccion="Niño perdido";
persona.edad=50;
persona.sueldo=200000;



Para imprimir todo el nombre:
printf("%s",persona.nombre);

Una sola letra:
printf("%c",persona.nombre[2]); /* Imprime la tercera letra */

Para guardar:
scanf("%d",&persona.edad);



Registros anidados
Son cuando hay registros dentro de otro registro...

La estructura seria la siguiente:

type destino=record
ciudad=record
nombre:string[20];
pais:string[15];
end;
arribo=record
hora:0..24; {No acepta mas del numero establecido}
minutos:0..59; {y los guarda como int}
end;
end;

var
avion:destino;

with avion do
begin
whit ciudad do
begin
nombre:='New York';
pais:='Estados unidos';
end;
with arribo do
begin
hora:=20;
minutos:=30;
end;
end;


Ahora imaginemos que queremos un registro de 1000 aviones.. seria bastante aburrido estar poniendolos todos.. para eso necesitariamos un Arreglo con registros.

Arreglo con registros

Es la combinacion como lo dice su nombre un arreglo con un registro... quedaria de la siguiente manera la estructura:


type destino=record
ciudad=record
nombre:string[20];
pais:string[15];
end;
arribo=record
hora:0..24; {No acepta mas del numero establecido}
minutos:0..59; {y los guarda como int} end;end;

Var
avion:array[1..1000] of destino ;
x:integer;

Begin
for x:=1 to 1000 do
Begin
with avion[x] do
begin
printf(ciudad.nombre);
end;
end;


Nos preguntaria el nombre del 1000 aviones...

Multiplciación de Matrices

Matrices
URL: [Link]

1. Introducción
Este capítulo define el término matriz y describe algunas operaciones que se efectuan con ellas. El conocimiento de matrices y su álgebra es indispensable para entender las bases en las cuales descansa el análisis estadístico.

Una matriz es un arreglo de elementos:







Las matrices se denotan generalmente con mayúsculas (M). Cada elemento de una matriz se denota por mij, donde i corresponde a la hilera y j corresponde a la columna. En el ejemplo anterior, el elemento (2,2)= 8, el elemento (1,1) es 1, el elemento (1,2) es 4. Un vector es una matriz con una sola columna:





Una matriz que tiene una sola hilera se llama matriz hilera:




Una matriz constituída por un solo elemento se llama escalar:




Una matriz tiene dimension mXn, es decir el número de hileras y columnas. Por ejemplo, la dimension de M es 2X2, la dimension de V es 3X1, la dimension de H es 1X3 y la dimension de A es 1X1.

La matriz identidad es es una matriz de dimensión mXn con 1s en la diagonal principal y ceros en los otros elementos. Por ejemplo, la matriz identidad de M es:




La matriz identidad se define únicamente para matrices cuadradas. Es decir, matrices con el mismo número de columnas e hileras.

2. Operaciones con Matrices
2.1. Suma Algebraica
Para sumar dos matrices M, N, es necesario que sus dimensiones sean iguales. El resultado de la suma es otra matriz con las mismas dimensiones y cuyos elementos Xij corresponden a Mij + Nij. Por ejemplo:




2.2. Traspuesta
La traspuesta de una matriz M (mXn) es la matriz T= M'= (nXm), con cada elemento de la nueva matriz T, Tij= Mji:




2.3. Multiplicación
2.3.1. Producto Interno (Producto de Hilera por Columna)
Antes de describir la multiplicación de matrices, es necesario definir una operación preliminar: El producto interno, que corresponde a un valor escalar. El producto interno es la suma del producto de los elementos de una hilera por los elementos de una columna. Para multiplicar una hilera por una columna es necesario que el número de columnas en la hilera corresponda al número de hileras en la columna. El producto de hilera por columna es un escalar. Por ejemplo, la multiplicacion de A por B, denotado AB, es:


Ver ejemplo [link]

2.3.2. La multiplicación de Matrices
Para multiplicar dos matrices, es necesario que el número de hileras de la primera matriz Q corresponda al número de columnas de la segunda matriz W. Los elementos del producto P= QW corresponden al producto de hileras por columnas, como se menciona arriba:

Ver ejemplo [link]



En este ejemplo, el elemento (2,3)= 5 corresponde al producto de la hilera dos de Q y columna tres de W. En general, no es lo mismo AB que BA.

2.4. La inversa de una Matriz
Asi como se ha definido la multiplicación de matrices, existe una operacion similar a la división. La inversa de una matriz cuadrada (M-1) es la matriz que multiplicada por M da como resultado la matriz identidad (I):
M-1M=I=MM-1
Por ejemplo:




En general, encontrar encontrar la inversa de matrices involucra resolver una serie de ecuaciones simultáneas de primer grado, por ejemplo:


Ver ejemplo [link]



Existen varios métodos para encontrar la solución a este problema. El libro de Numerical Recipes contiene algunos algoritmos para encontrar la inversa de matrices. No todas las matrices cuadradas poseen inversa. Aquellas que no lo tienen se denominan singulares.

2.4.1. Dependencia Lineal y Rango
Una de las razones por las que una matriz cuadrada no tenga inversa es la ocurrencia de lo que se denomina dependencia lineal, por ejemplo, observe la siguiente matriz:




la columna uno es la suma de la columna dos + columna tres. La información contenida es redundante. Matrices de este tipo se denominan singulares y no tienen inversa. Sólo las matrices no singulares poseen inversa. Cuando todas las columnas (o hileras) son independientes, es decir, no son una combinación lineal unas de otras, entonces la matriz es de rango completo. Cuando la matriz no es de rango completo, para encontrar la inversa hay que eliminar una columna que no tenga coeficientes cero y examinar las columnas restantes por dependencia lineal, el proceso se detiene hasta que las columnas son independientes y entonces se puede encontrar la inversa de esta matriz reducida.




lunes, marzo 28, 2005

Resumen de tipos de datos

Programa: Visual Basic
Descargar ejercicio: [Link]
Url: Monografias [Link]

Veremos un tema especial.. . "Resumen de tipos de datos".

Nota Las matrices de cualquier tipo de datos requieren 20 bytes de memoria más cuatro bytes para cada dimensión de matriz, más el número de bytes que ocupan los propios datos. Puede calcular la memoria que ocupan los datos multiplicando el número de elementos de datos por el tamaño de cada elemento. Por ejemplo, los datos de una matriz unidimensional que consten de cuatro elementos de datos tipo Integer de dos bytes cada uno, ocupan ocho bytes. Los ocho bytes que requieren los datos más los 24 bytes necesarios para la matriz suman un requisito total de memoria de 32 bytes para dicha matriz.


Load (Instrucción)

Carga en memoria un formulario o un control.

Sintaxis

Load objeto

El marcador de posición objeto es el nombre de un objeto Form, un objeto MDIForm o un elemento de una matriz de controles para cargar.

Comentarios

No es necesario usar la instrucción Load con
formularios a menos que desee cargar un formulario sin presentarlo. Cualquier referencia a un formulario (excepto en una instrucción Set o If...TypeOf) lo carga automáticamente si no está ya cargado. Por ejemplo, el método Show carga los formularios antes de presentarlos. Una vez cargado el formulario, la aplicación puede alterar sus propiedades y controles, sea o no visible actualmente el formulario. En algunas circunstancia, puede que desee cargar todos los formularios en la inicialización y presentarlos después cuando sean necesarios.

Cuando Visual Basic carga un objeto Form, establece las propiedades del formulario a sus valores iniciales y después ejecuta el procedimiento de evento Load. Cuando se inicia una aplicación, Visual Basic carga y presenta automáticamente el formulario inicial de la aplicación.
Si carga un objeto Form cuya
propiedad MDIChild es True (es decir, el formulario secundario) antes de cargar el objeto MDIForm, el objeto MDIForm se carga automáticamente antes que el formulario secundario. Los formularios MDI secundarios no pueden estar ocultos y, por tanto, son visibles inmediatamente después de terminar el procedimiento de evento Form_Load.
No es necesario cargar, mostrar o descargar los cuadros de diálogo estándar producidos por
funciones de Visual Basic como MsgBox y InputBox; se pueden invocar directamente.

Hide (Método)

Oculta un objeto MDIForm o Form pero no lo descarga.

Sintaxis

objeto.Hide

El marcador de posición objeto representa una
expresión de objeto que da como resultado un objeto de la lista Se aplica a. Si se omite objeto, se supone que objeto es el formulario que tenga el enfoque.

Comentarios

Cuando se oculta un formulario, se quita de la pantalla y su propiedad Visible queda establecida a False. Los controles de un formulario oculto no son accesibles para el usuario, pero están disponibles para la aplicación de Visual Basic en ejecución y para otros
procesos que se estén comunicando con la aplicación mediante DDE, así como para los eventos del control Timer.

Cuando se oculta un formulario, el usuario no puede interactuar con la aplicación hasta que el código del procedimiento de evento que ha provocado la ocultación del formulario haya terminado de ejecutarse.
Si el formulario no está cargado cuando se llama al método Hide, el método Hide carga el formulario pero no lo presenta.

Nota Al cerrar un formulario modal que se ha abierto desde otro formulario modal, el siguiente código funcionaba en versiones anteriores de Visual Basic:
Me.Hide
Me.Hide ' Esto ahora provoca un error.
En versiones actuales de Visual Basic, este código falla en el segundo Me.Hide. Puede sustituir Me.Hide con Me.Visible = False como se muestra a continuación:
Me.Visible = False
Me.Visible = False ' No sucede ningún error.

Unload (Instrucción)

Descarga de memoria un formulario o un control.

Sintaxis

Unload objeto

El marcador de posición objeto es el nombre de un objeto Form o de un elemento de una
matriz de controles para descargar.

Comentarios

La descarga de un formulario o de un controle puede ser necesaria o conveniente en aquellos casos en los que la memoria utilizada sea necesaria para alguna otra tarea o cuando sea necesario restablecer las propiedades a sus valores originales.

Antes de descargar un formulario se produce el evento Query_Unload, seguido del procedimiento de evento Form_Unload. Si establece el argumento cancelar a True en alguno de estos eventos no se descargará el formulario. En los objetos MDIForm se produce el procedimiento de evento Query_Unload del objeto MDIForm, seguido del procedimiento de evento Query_Unload y del procedimiento de evento Form_Unload de cada formulario
secundario MDI; finalmente se produce el procedimiento de evento Form_Unload del objeto MDIForm.
Cuando se descarga un formulario, todos los controles colocados en el formulario en
tiempo de ejecución no son accesibles. Los controles colocados en el formulario en tiempo de diseño permanecen intactos; sin embargo, cualquier cambio en tiempo de ejecución sobre dichos controles y sus propiedades se pierden cuando se vuelve a cargar el formulario. También se pierden todos los cambios realizados en las propiedades del formulario. El acceso a algún control del formulario hace que éste se vuelva a cargar.
Nota Cuando se descarga un formulario, sólo se descarga el componente mostrado. El código asociado al módulo del formulario permanece en memoria.

Con la instrucción Unload sólo se pueden descargar los elementos de las matrices de controles agregados a un formulario en tiempo de ejecución. Las propiedades de los controles descargados se reinicializan cuando se cargan de nuevo los controles.

Show (Método)

Presenta un objeto MDIForm o Form. No acepta
argumentos con nombre.

Sintaxis

objeto.Show estilo, formularioPropietario

La sintaxis del método Show consta de las siguientes partes:Para ver el gráfico seleccione la opción ¨Descargar trabajo¨ del menú superior

Comentarios

Si el formulario especificado no está cargado cuando se invoca el método Show, Visual Basic lo carga automáticamente.
Cuando Show presenta un formulario no modal, continúa con la ejecución del código que haya a continuación. Cuando Show presenta un formulario modal, el código que hay a continuación no se ejecuta hasta que el formulario se oculta o se descarga.

Cuando Show presenta un formulario modal, no hay entradas (de
teclado o del mouse) excepto sobre los objetos del formulario modal. El programa debe ocultar o descargar los formularios modales (normalmente como respuesta a alguna acción del usuario) antes de que pueda producirse la entrada en otro formulario. Los formularios MDIForm no pueden ser modales.

Aunque los demás formularios de la aplicación están deshabilitados cuando se presenta un formulario modal, los de las demás aplicaciones no lo están.

El formulario inicial de una aplicación se muestra automáticamente después de invocar su evento Load.

He aquí un ejemplo de cómo se utiliza el argumento formularioPropietario con el método Show:
Private Sub cmdShowResults_Click()
' Muestra un formulario modal llamado frmResults.
frmResults.Show vbModal, Me

End Sub

S
etFocus (Método)

Mueve el
enfoque al control o formulario especificado.

Sintaxis

objeto.SetFocus

El marcador de posición objeto representa una
expresión de objeto que da como resultado un objeto de la lista Se aplica a.

Comentarios

El objeto debe ser un objeto Form, un objeto MDIForm o un control que pueda recibir el enfoque. Después de invocar el método SetFocus, cualquier entrada del usuario se dirige al formulario o al control especificado.

E
l enfoque sólo se puede mover a un formulario o un control visible. Como un formulario y los controles de un formulario no son visibles hasta que el evento Load del formulario ha terminado, no puede usar en su propio evento Load el método SetFocus para mover el enfoque al formulario que se está cargando a menos que use primero el método Show para mostrar el formulario antes de que el procedimiento de evento Form_Load haya terminado.

Tampoco puede mover el enfoque a un formulario o un control si su propiedad Enabled es False. Si la propiedad Enabled se ha establecido a False en
tiempo de diseño, primero debe establecerla a True antes de poder recibir el enfoque mediante el método SetFocus.

método

Una acción que un objeto es capaz de realizar. Por ejemplo, los cuadros de lista tienen
métodos llamados AddItem, RemoveItem y Clear para mantener el contenido de las listas. Vea también objeto.

propiedad

Un atributo con nombre de un objeto. Las propiedades definen las
características del objeto, como su tamaño y nombre, o el estado de un objeto, como habilitado o deshabilitado. Se pueden establecer propiedades para tablas, columnas, índices, restricciones, claves y relaciones.

evento

Una acción, reconocida por un objeto, para la cual puede escribir código de respuesta. Los eventos pueden estar generados por una acción del usuario, como hacer clic con el mouse o presionar una tecla, por código de programa o por el
sistema, como ocurre con los cronómetros.

Form (Objeto), Forms (Colección)

Un objeto Form es una ventana o un cuadro de diálogo que forma parte de la interfaz de usuario de una aplicación.
Forms es una
colección cuyos elementos representan cada formulario cargado en una aplicación. La colección incluye el formulario MDI, el formulario secundario MDI y formularios no MDI de la aplicación. La colección Forms tiene una única propiedad, Count, que especifica el número de elementos de la colección.
Sintaxis
Form
Forms(índice)
El marcador de posición índice representa un entero entre 0 y Forms.Count - 1.

Puede usar la colección Forms para iterar a través de todos los formularios cargados en una aplicación. Identifica una variable global intrínseca denominada Forms. Puede pasar Forms(índice) a una función cuyo argumento se especifica como una clase Forms.

Los formularios tienen propiedades que determinan aspectos de su apariencia (como posición, tamaño y
color) y aspectos de su comportamiento (como si puede ajustar o no su tamaño).

Los formularios también pueden responder a eventos iniciados por un usuario o desencadenados por el sistema. Por ejemplo, podría escribir código en el procedimiento de evento Click de un formulario que permitiera al usuario cambiar el color de un formulario haciendo clic en él.

Además de propiedades y eventos, puede emplear métodos para manipular formularios mediante código. Por ejemplo, puede usar el método Move para cambiar la ubicación y el tamaño de un formulario.

Un tipo especial de formulario, el formulario MDI, puede contener otros formularios llamados formularios secundarios MDI. Un formulario MDI se crea con el comando Agregar formulario MDI del menú
Proyecto; un formulario secundario MDI se crea eligiendo Nuevo formulario en el menú Archivo y, a continuación, estableciendo la propiedad MDIChild a True.

Puede crear múltiples instancias de formularios en código si utiliza la palabra clave New en instrucciones Dim, Set y Static.


Al diseñar formularios, establezca la propiedad BorderStyle para definir el borde del formulario y establezca la propiedad Caption para colocar texto en la barra de título. En el código puede usar los métodos Hide y Show para hacer que los formularios sean invisibles o visibles en
tiempo de ejecución.
Nota Si establece BorderStyle a 0 se eliminará el borde. Si desea que el formulario tenga borde sin barra de título, cuadro del menú Control, botón Maximizar y botón Minimizar, elimine texto de la propiedad Caption y establezca a False las propiedades ControlBox, MaxButton y MinButton.
Form es un
tipo de datos Object. Puede declarar variables como de tipo Form antes de establecerlas a una instancia de un tipo de formulario que se ha declarado en tiempo de diseño. Del mismo modo, puede pasar un argumento a un procedimiento como de tipo Form.

Los formularios pueden actuar como origen en una conversación DDE, con un control Label, PictureBox o TextBox proporcionando los datos.

Puede tener acceso a la colección de controles de un Form mediante la colección Controls. Por ejemplo, para ocultar todos los controles de un Form puede usar código similar al siguiente:
For Each Control in Form1.Controls
Control.Visible = False
Next Control


Crear
tipos de datos propios
Se pueden combinar variables de varios tipos diferentes para crear tipos definidos por el usuario (conocidos como structs en el
lenguaje de programación C).

Los tipos definidos por el usuario son útiles si se quiere crear una única variable que registre varias unidades de información relacionadas.

Puede crear un tipo definido por el usuario con la instrucción Type, que debe colocar en la sección Declaraciones del módulo. Los tipos definidos por el usuario pueden declararse como Private o como Public mediante la palabra clave apropiada. Por ejemplo:
Private Type MiTipoDeDatos
–o bien–
Public Type MiTipoDeDatos
Por ejemplo, podría crear un tipo definido por el usuario que registrara información acerca del sistema de un equipo:
' Declaraciones (de un módulo estándar).
Private Type SystemInfo
CPU As Variant
Memory As Long
VideoColors As Integer
Cost As Currency
PurchaseDate As Variant
End Type


Declarar variables de un tipo definido por el usuario

Para el mismo tipo definido por el usuario puede declarar variables locales, variables privadas de módulo o variables públicas de módulo:
Dim MiSistema As SystemInfo, SuSistema As SystemInfo

Nota Si realiza declaraciones de variables usando la palabra clave Dim, los tipos definidos por el usuario en módulo de clase o estándar serán Public de forma predeterminada. Si quiere que un tipo definido por el usuario sea privado, asegúrese de declararlo usando la palabra clave Private.


Asignar y recuperar valores

Asignar y recuperar los valores de los elementos de esta variable es similar a establecer y obtener propiedades:
MiSistema.
CPU = "486"
If MiSistema.PurchaseDate > #1/1/92# Then


También puede asignar una variable a otra si ambas son del mismo tipo definido por el usuario. En la línea de código siguiente se asignan todos los elementos de una variable a los mismos elementos de la otra variable.


SuSistema = MiSistema
Tipos definidos por el usuario que contienen matrices

Un tipo definido por el usuario puede contener una matriz normal (de tamaño fijo). Por ejemplo:
Type SystemInfo
CPU As Variant
Memory As Long
DiskDrives(25) As String ' Matriz de tamaño fijo.
VideoColors As Integer
Cost As Currency
PurchaseDate As Variant
End Type
También puede contener una matriz dinámica.
Type SystemInfo
CPU As Variant
Memory As Long
DiskDrives() As String ' Matriz dinámica.
VideoColors As Integer
Cost As Currency
PurchaseDate As Variant
End Type


Puede tener acceso a los valores de una matriz dentro de un tipo definido por el usuario de la misma manera en que tiene acceso a las propiedades de un objeto.


Dim MiSistema As SystemInfo

ReDim MiSistema.DiskDrives(3)
MiSistema.DiskDrives(0) = "1.44 MB"
También puede declarar una matriz de tipos definidos por el usuario:
Dim TodosSistemas(100) As SystemInfo
Siga las mismas reglas para tener acceso a los componentes de esta
estructura de datos.
TodosSistemas(5).CPU = "386SX"
TodosSistemas(5).DiskDrives(2) = "SCSI de 100 MB"
Pasar tipos definidos por el usuario a procedimientos
Puede pasar argumentos de procedimiento mediante un tipo definido por el usuario.
Sub FillSystem (UnSistema As SystemInfo)
UnSistema.CPU = lstCPU.Text
UnSistema.Memory = txtMemory.Text
UnSistema.Cost = txtCost.Text
UnSistema.PurchaseDate = Now
End Sub


Nota Si desea pasar un tipo definido por el usuario a un módulo de formulario, el procedimiento debe ser privado.
Puede devolver tipos definidos por el usuario desde funciones y puede pasar una variable de un tipo definido por el usuario a un procedimiento como un argumento. Los tipos definidos por el usuario siempre se pasan por referencia, de modo que el procedimiento puede modificar el argumento y devolverlo al procedimiento que lo ha llamado, como se muestra en el ejemplo anterior.


Nota Debido a que los tipos definidos por el usuario siempre se pasan por referencia, todos los datos contenidos en dichos tipos se pasarán y se devolverán desde el procedimiento. En el caso de tipos definidos por el usuario con matrices de gran tamaño, esto podría originar una reducción de las
prestaciones, especialmente en aplicaciones cliente/servidor, en las que el procedimiento se puede ejecutar desde un equipo remoto. En tal caso, es preferible extraer y pasar únicamente los datos necesarios del tipo definido por el usuario.
Para obtener más información Para obtener más detalles acerca del paso por referencia, vea "Pasar argumentos a procedimientos" en "Fundamentos de programación".
Tipos definidos por el usuario que contienen objetos
Los tipos definidos por el usuario también pueden contener objetos.
Private Type AccountPack
frmInput as Form
dbPayRollAccount as Database
End Type
Sugerencia Como el tipo de datos Variant puede almacenar muchos tipos de datos diferentes, puede usar una matriz Variant en muchas situaciones en las que usaría un tipo definido por el usuario. De hecho, una matriz Variant es más flexible que un tipo definido por el usuario, ya que puede modificar el tipo de los datos almacenados en cada elemento en cualquier momento y puede convertir la matriz en dinámica para modificar su tamaño cuando sea necesario. Sin embargo, una matriz Variant siempre utiliza más memoria que un tipo definido por el usuario equivalente.
Anidar
estructuras de datos
El anidamiento de estructuras de datos puede ser tan complejo como se quiera. De hecho, los tipos definidos por el usuario pueden contener otros tipos definidos por el usuario, como se muestra en el ejemplo siguiente. Para hacer que el código sea más legible y fácil de depurar, procure escribir en un único módulo todo el código de los tipos de datos definidos por el usuario.
Type DriveInfo
Type As String
Size As Long
End Type
Type SystemInfo
CPU As Variant
Memory As Long
DiskDrives(26) As DriveInfo
Cost As Currency
PurchaseDate As Variant
End Type
Dim AllSystems(100) As SystemInfo
AllSystems(1).DiskDrives(0).Type = "Floppy"

domingo, marzo 27, 2005

Bytes que ocupa un programa

El siguiente programa podemos ver cuantos bytes ocupa un numero (integer,float,double) :

Programa: Bytes enteros
Extensión: .pas (pascal)

program bytes_enteros;
uses crt;
var
a:integer;
begin
clrscr;
writeln('el numero de bytes que ocupa' , sizeof(a));
writeln('Indique el numero: ');
readln(a);
writeln('el numero es: ',a);
readln;
end.

Sabemos que un:
Entero tiene 2 bytes
Float tiene 4 bytes
Double tiene 8 bytes

sábado, marzo 26, 2005

Conversión Decimal a Binario

Primero necesitamos saber que es un numero binario.

¿Que es un numero Binario?

Un verdadero número binario es una secuencia de dígitos binarios, como 0001010 ó 1001001. Sólo se usan 0s y 1s. El valor de los números en sí (o y 1) no determina el valor del número binario; lo que suma es el valor de los lugares. Cada lugar tiene un valor determinado. El primer lugar de la derecha de un dígito vale 1, el segundo lugar vale 2, el tercer lugar vale 4 y así sucesivamente. El valor de cada lugar se duplica a medida que se avanza hacia la izquierda de los números del sistema decimal 1 a 20.


Existen dos formas comunes de conertir un decimal a binario :

a) Suma de potencia de 2

Hacemos una tabla como la de Estrcuturas Abstractas de Datos en binario.

2^n (Dos a la n potencia)

Siempre empezaremos con el 0 (cero) que sera el primero de derecha a izquierda, el siguiente sera dos, quedaria algo asi:

2 1

Si añadimos el siguiente numero que es 4 quedaria:

4 2 1

y asi sucesivamente hasta llegar a un numero x, que sepamos que supera nuestro numero, por ejemplo el 10.

2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8


8 4 2 1

Sabemos que si sumamos todos los resultados da mas de 50.
Entonces tenemos que hacer una combinacion de esto para que den 50 exactos, y esto seria:

8+2 = 10

Al convertirlo a un numero Binario, se dice esta formado por 0 y 1s, para hacerlo seria asi:

Sabemos que NO ocupa el 1 para que la suma sea 10 entonces le ponemos un 0
Sabemos que SI ocupa el 2 para que la suma sea 10 entonces le ponemos un 1
Sabemos que NO ocupa el 4 para que la suma sea 10 entonces le ponemos un 0
Sabemos que SI ocupa el 8 para que la suma sea 10 entonces le ponemos un 1


Si ponemos atención sabemos que ya hemos completado el 10, entonces para ordenarlos quedaria:

Primero el del numero 8 (que es 1), luego el del 4 (que es 0), luego 2 (que es 1) y por ultimo el 1 (que es 0), y queda asi :

1010

8+0+2+0 =10


Esto quedaria representado
10 = 1010


Si queremos el 50 :
Ya sabemos que tenemos que sacar los numeros de 2^n

32 16 8 4 2 1

Sabemos que pasan sumando 50, ahora buscamos la combinacion:

32+16+2 = 50

Ahora sustituimos 0 en los numeros que no ocupamos y 1s en los que si.

110010

32+16+0+0+2+0 = 50

Y queda representado :

50 = 110010



Con un poco de practica se pueden comer muchos pasos y hacerlo mas rapido.

b)Por división repetida entre dos

Se divide el número repetidamente entre 2 y conservando los residuos hasta que se obtenga un cociente 0, el primer residuo es el LSB (Bit menos significante) y el último es el MSB (Bit mas significante).

Ejemplo:

10


10/2 = 05 con residuo 0 <--- LSB
05/2 = 02 con residuo 1
02/2 = 01 con residuo 0
01/2 = 00 con residuo 1 <--- MSB

Al momento de ordenarlo sera primero el MSB, que en este caso es 1, despues el anterior que es 0, y asi hasta llegar al LSB que este caso es 0. Quedaria asi:

1010


Ahora veamos con otro numero:

50/2 = 25 residuo 0 <--- LSB
25/2 = 12 residuo 1
12/2 = 06 residuo 0
06/2 = 03 residuo 0
03/2 = 01 residuo 1
01/2 = 00 residuo 1 <--- MSB

Los ordenamos del MSB al LSB y quedaria de la siguiente forma :

110010

El siguiente programa transforma de Binario a Decimal :

Nombre: Binario a Decimal
Extensión : .C

/* Programa sacado del rincondelc */
#include
#include
#define VAL_MIN 0
#define VAL_MAX 1111
int es_binario(int num);
int main(void){
int numero = 0;
printf("Introduce un numero binario:");
scanf("%d", &numero);
if (es_binario(numero))
printf("\nEl numero %d es binario\n", numero);
else
printf("\nEl numero %d no es binario\n", numero);
return EXIT_SUCCESS; } int es_binario(int num){
if ((num <> VAL_MAX)) return 0;
do {
if ((num%10 != 0) && (num%10 != 1))
return 0; }
while ((num /= 10) > 0);
return 1;
}


Y este orto es para Convertir de Decimal a Binario: [Link]
Es un .zip donde esta en varios lenguajes la conversión. (Página donde explica el autor [link])

Estructuras Abstractas de datos

Clasificación :
Primitivas: Enteros, Reales, Caracteres (boléanos)
Simples: Arreglos, Registros
Compuestas: Pilas, Colas, Árboles, Listas ligadas


Enteros
10^n 10^2 10^1 10^0 10^-1 10^-2 10^-n -> Decimales
2^n 2^2 2^1 2^0 2^-1 2^-2 2^-n -> Binarios


Con n dígitos se tienen b^n numeros diferentes donde (b^n)-1 es el mayor.

Ejemplo:
3 digitos

*Decimales
10^3 = 1 000 numeros diferentes
(10^3)-1 = 1 000-1 = 999 es el mayor

_ _ _ 0 al 999

*Binarios
2^3 = 8 numeros diferentes
(2^3)-1 = 7 Es el mayor

_ _ _ 0 al 7

Comprobemos esto:

000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7

Podemos ver que son 8 combinaciones o numeros diferentes 0 al 7, y que el numero mayor es el 7 (111), y son 3 digitos (^3)


16 Dígitos
Binario> 2^16 = 65 536 numeros diferentes
(2^16)-1 = 65 535 el numero mayor

32 dígitos
Binario> 2^32 = 4 294 967 296 numeros diferentes
(2^32)-1 = 4 294 967 295 el numero mayor





jueves, marzo 17, 2005

Numeros flotantes y un exponente 'x'

Bueno veamos un programa sencillo pero muy interesante….

#include
main()
{
float a,b;
clrscr();
b=2.0e20+1.0;
a=b-2.0e20;
printf("\n Valor de a: %f",a);
getch();
}


El saber porque cuando un lo compila no da 1.0, si se hace en una calculadora eso sale… y porque el programa no lo hace?, bueno una explicación a esto podría ser que :

La estructura de la memoria del computador
Los números se almacenan en las variables. Una variable representa un trozo de la memoria del computador. La memoria está formada por una gran cantidad de bytes y cada byte está constituido por 8 bits. Un bit puede almacenar un 1 o un 0.

Los reales
Una variable real (float) está formada por 4 bytes, es decir el doble de un entero. En ella se almacenan números reales en formato binario.
Representación en punto flotante
Un número real se almacena en una variable especificando 3 componentes: el signo (+ o -), la mantisa y el exponente. Por ejemplo, el número 11 se representa como:

el signo: +
mantisa: 10110000...
exponente: 4

La mantisa es una secuencia de bits que siempre comienza en 1. El exponente indica en donde colocar el punto que separa la parte entera de la fraccionaria. Un valor 0 indica que el punto se coloca justo antes del primer bit. Un valor 4 indica que se coloca después del cuarto bit. Un valor -3 indica que hay que imaginar que el número va precedido por 0.000 y luego viene la mantisa.

¿Qué número es el siguiente?

el signo: -
mantisa: 110010000...
exponente: 7
Solución: -1100100.00... , que es -(4+32+64)= -100

En una variable de tipo real se destina 1 bit para el signo, 7 bits para el exponente y 24 bits para la mantisa.
Precisión y error de representación

La desventaja es que los números se almacenan con una precisión limitada. Esto significa que un número que requiera 100 bits de mantisa será aproximado a uno que solo ocupa 24, introduciéndose entonces un error de representación.
El error que se comente se puede visualizar mejor en base 10. El error que comete es como cuando el siguiente número:

1234567890123456789012345678901234567890

Se aproxima al siguiente valor:

1234567*10^33

Es decir, solo se representan 7 dígitos de los 40 iniciales. El error absoluto que se comete es:
890123456789012345678901234567890

Que parece enorme, pero lo que importa es el error relativo que es ~10^(-7) que es bajísimo y para la mayoría de las aplicaciones numéricas es insignificante. Pero es un error que conviene tener presente.