Documentos de Académico
Documentos de Profesional
Documentos de Cultura
TEMAS
GTK
GTK#
WINDOWS FORMS
QT
LIBRERIAS DINAMICAS
PUNTEROS
CLASES
RECURSIVIDAD
LICENCIAS
COPYRIGHT
GPL
GNU
LGPL
VREATIVE CAMMONS
NIT
CAMPOS DE BIT
HILOS
SYSTEM OBJECT
SET (#)
GET (#)
VECTOR
LISTAS
PILAS
WX WIDGETS
CIN
COUT
TEMPLATES
2
Tópicos Selectos De Programación Actividades 2009
MATERIAL
TEMAS
GTK
GTK#
WINDOWS FORMS
QT
GTK
GTK#
3
Tópicos Selectos De Programación Actividades 2009
una variedad de GNOME (http://www.gnome.org/) las bibliotecas,
permitiendo plenamente nativas de desarrollo de GNOME gráfica de
aplicaciones utilizando el Mono y. Net marcos de desarrollo.
WINDOWS FORMS
QT
TEMAS:
LIBRERIAS DINAMICAS
PUNTEROS
CLASES
RECURSIVIDAD
LIBRERÍAS DINÁMICAS
PUNTEROS
Cada variable de un programa tiene una dirección en la memoria
del ordenador. Esta dirección indica la posición del primer byte que
la variable ocupa. En el caso de una estructura es la dirección del
primer campo. En los ordenadores actuales la dirección de inicio se
considera la dirección baja de memoria. Como en cualquier caso las
variables son almacenadas ordenadamente y de una forma
predecible, es posible acceder a estas y manipularlas mediante otra
5
Tópicos Selectos De Programación Actividades 2009
variables que contenga su dirección. A este tipo de variables se les
denomina punteros.
Los punteros C son el tipo más potente y seguramente la otra clave
del éxito del lenguaje. La primera ventaja que obtenemos de los
punteros es la posibilidad que nos dan de poder tratar con datos de
un tamaño arbitrario sin tener que moverlos por la memoria. Esto
puede ahorrar un tiempo de computación muy importante en
algunos tipos de aplicaciones. También permiten que una función
reciba y cambie el valor de una variable. Recordemos que todas las
funciones C únicamente aceptan parámetros por valor. Mediante un
puntero a una variable podemos modificarla indirectamente desde
una función cualquiera.
Un puntero se declara de la forma: tipo *nombre;
float *pf;
PLANETA *pp;
char *pc;
Para manipular un puntero, como variable que es, se utiliza su
nombre; pero para acceder a la variable a la que apunta se le debe
preceder de *. A este proceso se le llama indirección. Accedemos
indirectamente a una variable. Para trabajar con punteros existe un
operador, &, que indica 'dirección de'. Con él se puede asignar a un
puntero la dirección de una variable, o pasar como parámetro a una
función.
void prueba_puntero ( void ) {
long edad;
long *p;
p = &edad;
edad = 50;
printf("La edad es %ld\n", edad );
*p = *p / 2;
printf("La edad es %ld\n", edad );
}
void imprimir_string ( char string[] ) {
char *p;
for ( p = string; *p != '\0'; p++ )
6
Tópicos Selectos De Programación Actividades 2009
imprimir_char(*p);
}
Definimos un vector de N_PLA componentes de tipo PLANETA.
Este tipo está formado por un registro. Vemos que en la función de
inicialización del vector el puntero a la primera componente se
inicializa con el nombre del vector. Esto es una característica
importante de C. La dirección de la primera componente de un
vector se puede direccionar con el nombre del vector. Esto es
debido a que en la memoria del ordenador, los distintos elementos
están ordenados de forma ascendente. Así, SSolar se puede utilizar
como &SSolar[0]. A cada iteración llamamos a una función que nos
inicializará los datos de cada planeta. A esta función le pasamos
como argumento el puntero a la componente en curso para que,
utilizando la notación ->, pueda asignar los valores adecuados a
cada campo del registro. Debemos fijarnos en el incremento del
puntero de control de la iteración, p++. Con los punteros se pueden
realizar determinadas operaciones aritméticas aunque, a parte del
incremento y decremento, no son muy frecuentes. Cuando
incrementamos un puntero el compilador le suma la cantidad
necesaria para que apunte al siguiente elemento de la memoria.
Debemos fijarnos que esto es aplicable sólo siempre que haya
distintas variables o elementos situados consecutivamente en la
memoria, como ocurre con los vectores.
De forma similar se pueden utilizar funciones que tengan como
parámetros punteros, para cambiar el valor de una variable.
Veamos:
void intercambio ( void ) {
int a, b;
a = 1;
b = 2;
swap( &a, &b );
printf(" a = %d b = %d\n", a, b );
}
void swap ( int *x, int *y ) {
int tmp;
tmp = *x;
*x = *y;
7
Tópicos Selectos De Programación Actividades 2009
*y = tmp;
}
La sintaxis de C puede, a veces, provocar confusión. Se debe
distinguir lo que es un prototipo de una función de lo que es una
declaración de una variable. Así mismo, un puntero a un vector de
punteros, etc...
int f1(); función que devuelve un entero
int *p1; puntero a entero
int *f2(); función que devuelve un puntero a entero
int (*pf)(int); puntero a función que toma y devuelve un entero
int (*pf2)(int *pi); puntero a función que toma un puntero a
entero y devuelve un entero
int a[3]; vector de tres enteros
int *ap[3]; vector de tres punteros a entero
int *(ap[3]); vector de tres punteros a entero
int (*pa)[3]; puntero a vector de tres enteros
int (*apf[5])(int *pi); vector de 5 punteros a función que toman
un puntero a entero y devuelven un entero.
QUE ES UN PUNTERO
Un puntero es un tipo especial de variable, que almacena el valor
de una direccion de memoria, esta direccion puede ser la de una
variable individual, pero mas frecuentemente sera la de un elemento
de un array, una estructura u objeto de una clase. Los punteros, al
igual que una variable comun, pertenecen a un tipo (type), se dice
que un puntero 'apunta a' ese tipo al que pertenece. Ejemplos:
8
Tópicos Selectos De Programación Actividades 2009
int* pint; //Declara un puntero a entero
char* pchar; //Puntero a char
fecha* pfecha; //Puntero a objeto de clase 'fecha'
9
Tópicos Selectos De Programación Actividades 2009
p = &cad[0];
10
Tópicos Selectos De Programación Actividades 2009
miembro de clase, otro puntero, o un array de cada uno de estos
tipos de elementos, tambien puede contener un valor que indique
que no apunta actualmente a ningun objeto (puntero nulo).
CLASES
Una clase es basicamente un agregado de datos y funciones para
manipular esos datos. Las clases, y la programacion 'orientada a
objetos' en general, ha representado un gran avance para
produccion de software a gran escala, los recursos de herencia,
encapsulamiento, ocultacion de datos, clases virtuales, etc., estan
pensados con esa finalidad. Aqui solo nos detendremos en la
11
Tópicos Selectos De Programación Actividades 2009
nocion minima de 'clase' y el modo en que es almacenado un objeto
en memoria.
class gente
{
char nombre[10];
int edad;
public:
gente (char*cad, int a)
{
strcpy(nombre,cad);
edad = a;
}
};
Se trata de una clase cuyos miembros son dos datos y una sola
funcion. Una vez declarada la clase podemos definir objetos como
pertenecientes a ese tipo. Una clase no ocupa espacio, pero si un
objeto perteneciente a esa clase. El espacio ocupado en memoria
por tal objeto puede ser conocido a traves de 'sizeof'.
gente pp1;
cout<<sizeof(pp1); //saca en pantalla '12'
El valor podria ser ligeramente diferente segun el compilador, por
efecto de optimizacion. Lo importante es observar que el monto de
memoria del objeto (retornado por sizeof), esta determinado por la
suma del espacio ocupado por los datos, 'sizeof' no tiene en cuenta
a la funcion.
Cada objeto de tipo 'gente' ocupara 12 bytes, pues posee una copia
individual de los datos de clase, en cambio hay una sola copia del
miembro funcion (aqui el constructor) utilizado por todos los objetos.
12
Tópicos Selectos De Programación Actividades 2009
En un programa, que define la clase 'gente' y dos objetos (pp1 y
pp2) inicializados como muestran las lineas de codigo previas, se
puede observar lo siguiente:
13
Tópicos Selectos De Programación Actividades 2009
Podemos sintetizar lo visto respecto a clases del siguiente modo:
-Una clase no es un 'dato' (es un tipo), no tiene una localidad de
memoria asociada y por lo tanto no puede almacenar ningun valor.
-Un objeto de tal clase si define una region de memoria, un espacio
de almacenamiento de datos. Esta es la diferencia entre 'clase' y
'objeto'.
-Cada objeto de una misma clase posee una copia propia de cada
uno de los datos miembros de la clase, pero comparte una misma
copia de las funciones miembros.
14
Tópicos Selectos De Programación Actividades 2009
RECURSIÓN
15
Tópicos Selectos De Programación Actividades 2009
muy grande. Este procedimiento computacional no hace uso de
técnicas especiales empleadas para tratar números grandes.
16
Tópicos Selectos De Programación Actividades 2009
RECURSIÓN
17
Tópicos Selectos De Programación Actividades 2009
punteros que referencian a objetos del mismo tipo que la que se
está definiendo), como árboles y listas enlazadas (las hemos
denominado estructuras auto-referenciadas
...
if (busca(key, ptr) != NULL){
...
}
19
Tópicos Selectos De Programación Actividades 2009
}
return;
}
Recursividad
Por ejemplo:
1a Instancia
n=4
n>1
salida ← 4 * factorial(3) (Guarda el valor de n = 4)
2a Instancia
n>1
salida ← 3*factorial(2) (Guarda el valor de n = 3)
3a Instancia
n>1
salida ← 2*factorial(1) (Guarda el valor de n = 2)
4a Instancia
n == 1 → retorna 1
3a Instancia
(recupera n=2 de la pila) retorna 1*2=2
2a instancia
(recupera n=3 de la pila) retorna 2*3=6
1a instancia
(recupera n=4 de la pila) retorna 6*4=24
Valor de retorno → 24
21
Tópicos Selectos De Programación Actividades 2009
Las permutaciones de un conjunto son las diferentes maneras de
colocar sus elementos, usando todos ellos y sin repetir ninguno. Por
ejemplo para A, B, C, tenemos: ABC, ACB, BAC, BCA, CAB, CBA.
#include <iostream>
using namespace std;
/* Prototipo de función */
void Permutaciones(char *, int l=0);
Permutaciones(palabra);
cin.get();
return 0;
}
22
Tópicos Selectos De Programación Actividades 2009
Al principio todos los elementos de la lista pueden cambiar de
posición, es decir, pueden permutar su posición con otro. No se fija
ningún elemento de la lista, l = 0: Permutaciones(cad, 0)
0 1 2 3 4
A B C D /0
0 1 2 3 4
A B C D /0
0 1 2 3 4
A B C D /0
0 1 2 3 4
A B D C /0
0 1 2 3 4
A B /0 C D
0 1 2 3 4
A B C D /0
23
Tópicos Selectos De Programación Actividades 2009
En este punto abandonamos el último nivel de recursión, y
retomamos en el valor de l=1 e i = 0.
0 1 2 3 4
A B C D /0
0 1 2 3 4
A C B D /0
0 1 2 3 4
A C B D /0
0 1 2 3 4
A C D B /0
Y así sucesivamente.
24
Tópicos Selectos De Programación Actividades 2009
TEMAS:
Los estándares iniciales, a partir de la normativa indicada, eran los SPP (Standard
Parallel Port), que es el original, o al menos el compatible, con lo que se denominó
desde sus inicios el puerto Centronics. Uno de los motivos de que impresoras antiguas
no funcionen con BIOS nuevas es que por defecto este venga deshabilitado, con lo que
en la configuración del LPT correspondiente hay que indicar que debe de ser compatible
con estos. Este modo acepta hasta un máximo de 150 kb por segundo.
25
Tópicos Selectos De Programación Actividades 2009
"Low", y si no da tiempo a la impresión (prácticamente siempre será más rápido
el envío que la salida impresa) se irá almacenando en el buffer de memoria de
la impresora. En el caso de que éste se agote y siga recibiendo datos,
responderá con un "busy" y la cola de impresión del ordenador se detendrá a la
espera de recibir el nuevo "Low".
Una PC soporta hasta tres puertos paralelo separados, por tanto puede
haber hasta tres juegos de registros en un sistema en un momento dado.
Existen tres direcciones base para el puerto paralelo asociadas con tres
posibles puertos paralelo: 0x3BCh, 0x378h y 0x278h, nos referimos a éstas
como las direcciones base para el puerto LPT1, LPT2 y LPT3,
respectivamente. El registro de datos se localiza siempre en la dirección base
de un puerto paralelo, el registro de estado aparece en la dirección base + 1, y
el registro de control aparece en la dirección base + 2. Por ejemplo, para un
puerto LPT2 localizado en 0x378h, ésta es la dirección del registro de datos, al
registro de estado le corresponde la dirección 0x379h y su respectivo registro
de control está en la dirección 0x37Ah. Cuando la PC se enciende el BIOS
ejecuta una rutina para determinar el número de puertos presentes en el
sistema asignando la etiqueta LPT1 al primer puerto localizado, si existen más
puertos entonces se asignarán consecutivamente las etiquetas LPT2 y LPT3 de
acuerdo a la siguiente tabla:
LPT1 = 0x378.
LPT2 = 0x278
27
Tópicos Selectos De Programación Actividades 2009
El puerto serie RS-232 (también conocido como COM) es del tipo asincrónico,
utiliza cableado simple desde 3 hilos hasta 25 y que conecta computadoras o
microcontroladores a todo tipo de periféricos, desde terminales a impresoras y
módems pasando por mouses.
28
Tópicos Selectos De Programación Actividades 2009
reemplazados por nuevos puertos serie como el USB, el FireWire o el Serial
ATA.
Full Duplex
Puerto serial
Los puertos seriales (también llamados RS-232, por el nombre del estándar al
que hacen referencia) fueron las primeras interfaces que permitieron que los
equipos intercambien información con el "mundo exterior". El término serial se
refiere a los datos enviados mediante un solo hilo: los bits se envían uno detrás
del otro (consulte la sección sobre transmisión de datos para conocer los
modos de transmisión).
29
Tópicos Selectos De Programación Actividades 2009
Originalmente, los puertos seriales sólo podían enviar datos, no recibir, por lo
que se desarrollaron puertos bidireccionales (que son los que se encuentran en
los equipos actuales). Por lo tanto, los puertos seriales bidireccionales
necesitan dos hilos para que la comunicación pueda efectuarse.
La comunicación serial se lleva a cabo asincrónicamente, es decir que no es
necesaria una señal (o reloj) de sincronización: los datos pueden enviarse en
intervalos aleatorios. A su vez, el periférico debe poder distinguir los caracteres
(un carácter tiene 8 bits de longitud) entre la sucesión de bits que se está
enviando.
Ésta es la razón por la cual en este tipo de transmisión, cada carácter se
encuentra precedido por un bit de ARRANQUE y seguido por un bit de
PARADA. Estos bits de control, necesarios para la transmisión serial,
desperdician un 20% del ancho de banda (cada 10 bits enviados, 8 se utilizan
para cifrar el carácter y 2 para la recepción).
Los puertos seriales, por lo general, están integrados a la placa madre, motivo
por el cual los conectores que se hallan detrás de la carcasa y se encuentran
conectados a la placa madre mediante un cable, pueden utilizarse para
conectar un elemento exterior. Generalmente, los conectores seriales tienen 9
ó 25 clavijas y tienen la siguiente forma (conectores DB9 y DB25
respectivamente):
Puerto paralelo
30
Tópicos Selectos De Programación Actividades 2009
El nombre de “serie” viene por el hecho de que un puerto serie “serializa” los
datos. Esto significa que coge un byte de datos y transmite los 8 bits que
contiene el byte uno a la vez. La ventaja es que los puertos serie solo necesitan
un hilo para transmitir los 8 bits, mientras que los paralelo necesitan 8. La
desventaja es que lleva 8 veces más tiempo que si tuviera 8 hilos. Los puertos
serie bajan el coste de los cables y hacen que sean más pequeños.
USB.
31
Tópicos Selectos De Programación Actividades 2009
USB 2.0 es un bus externo que soporta hasta 480 Mbits/s de transferencia de
datos. Se trata de una extensión del USB 1.1, por lo tanto utiliza los mismos
cables y conectores, y es compatible con éste.
(SuperSpeed USB). USB 3.0 es una de las versiones del USB, sucesora de la
versión USB 2.0. Permite transferencias teóricas de hasta 4,8 Gbps.
USB 3.0 consume menos electricidad, es más rápida y sus puertos son
compatibles con los puertos USB 2.0.
32
Tópicos Selectos De Programación Actividades 2009
Firewire se denomina al tipo de puerto de comunicaciones de alta
velocidad desarrollado por la compañía Apple.
La denominación real de esta interfaz es la IEEE 1394. Se trata de
una tecnología para la entrada/salida de datos en serie a alta
velocidad y la conexión de dispositivos digitales.
Firewire
33
Tópicos Selectos De Programación Actividades 2009
Bus serial de Apple; es un solo enchufe, pero pueden conectarse
hasta 63 dispositivos. Transfiere información de hasta 400 MB por
segundos.
- Conexiones de enchufar y listo, conocidas como plug & play. No tenemos más
que enchufar un dispositivo para que funcione.
34
Tópicos Selectos De Programación Actividades 2009
Firewire
Connectores de 6 y 4 pins.
El IEEE 1394 (conocido como FireWire por Apple Inc. y como i.Link por Sony)
es un estándar multiplataforma para entrada/salida de datos en serie a gran
velocidad. Suele utilizarse para la interconexión de dispositivos digitales como
cámaras digitales y videocámaras a computadoras.
Historia
El Firewire fue desarrollado por Apple Computer a mediados de los 90, para
luego convertirse en el estándar multiplataforma IEEE 1394. A principios de
este siglo fue adoptado por los fabricantes de periféricos digitales hasta
convertirse en un estándar establecido. Sony utiliza el estándar IEEE 1394 bajo
la denominación i.Link, y Texas Instruments bajo la denominación Lynx.
Versiones
Su velocidad hace que sea la interfaz más utilizada para audio y vídeo digital.
Así, se usa mucho en cámaras de vídeo, discos duros, impresoras,
reproductores de vídeo digital, sistemas domésticos para el ocio, sintetizadores
de música y escáneres.
35
Tópicos Selectos De Programación Actividades 2009
Existen tres versiones:
36
Tópicos Selectos De Programación Actividades 2009
FireWire s800T (IEEE 1394c-2006)
Características generales
Aplicaciones de FireWire
37
Tópicos Selectos De Programación Actividades 2009
38
Tópicos Selectos De Programación Actividades 2009
TEMAS:
LICENCIAS
COPYRIGHT
GPL
GNU
LGPL
VREATIVE CAMMONS
NIT
Licencia copyright
El derecho de autor y copyright constituyen dos concepciones sobre
la propiedad literaria y artística. El primero proviene de la familia
delderecho continental, particularmente del derecho francés, mientras
que el segundo procede del derecho anglosajón (o common law).
Licencia GPL
40
Tópicos Selectos De Programación Actividades 2009
En el sitio web oficial de GNU hay una lista de licencias que cumplen
las condiciones impuestas por la GNU GPL y otras que no.4
41
Tópicos Selectos De Programación Actividades 2009
Licencia GNU
La Licencia Pública General de GNU o más conocida por su nombre
en inglés GNU General Public License o simplemente su acrónimo del
inglés GNU GPL, es una licencia creada por la Free Software
Foundation a mediados de los 80, y está orientada principalmente a
proteger la libre distribución, modificación y uso de software. Su
propósito es declarar que el software cubierto por esta licencia
essoftware libre y protegerlo de intentos de apropiación que
restrinjan esas libertades a los usuarios.
42
Tópicos Selectos De Programación Actividades 2009
Licencia LGPL
43
Tópicos Selectos De Programación Actividades 2009
44
Tópicos Selectos De Programación Actividades 2009
Hay razones que pueden hacer más apropiado el uso de la GPL para
bibliotecas en ciertos casos. El caso más común es cuando las
características de la biblioteca libre están ya disponibles para
software privativo a través de otras bibliotecas alternativas. En ese
caso, la biblioteca no puede dar al software libre ninguna ventaja en
particular, así que es mejor utilizar la GPL para bibliotecas para esa
biblioteca.
De hecho, Stallman y la FSF abogan por el uso de licencias incluso
menos restrictivas que la LGPL como estrategia (para maximizar la
libertad de los usuarios). Un ejemplo destacado es la aprobación de
Stallman para utilizar la licencia BSD en el proyecto Vorbis.2
45
Tópicos Selectos De Programación Actividades 2009
LICENCIA MIT
46
Tópicos Selectos De Programación Actividades 2009
47
Tópicos Selectos De Programación Actividades 2009
48
Tópicos Selectos De Programación Actividades 2009
49
Tópicos Selectos De Programación Actividades 2009
TEMAS:
CAMPOS DE BIT
HILOS
SYSTEM OBJECT
SET (#)
GET (#)
Campos de Bits
Entre otros usos, los campos de bits se han utilizado históricamente para
empaquetar variables en un espacio más pequeño, pero obligan al compilador
a generar código adicional para manejarlos, lo que resulta costoso en
términos de tamaño y velocidad del ejecutable. El resultado es que
frecuentemente, el código resulta mayor y más lento si se usan estos tipos,
por lo que generalmente se desaconseja su uso excepto para aplicaciones
muy específicas de bajo nivel, en las que la alineación exacta de los patrones
de bits a utilizar es un aspecto primordial. Por ejemplo, transmisiones de
datos
50
Tópicos Selectos De Programación Actividades 2009
Otra cuestión distinta, a veces decisiva para su utilización, es la
significativa reducción de espacio de almacenamiento externo (disco por
ejemplo) que puede conseguirse cuando en determinados casos, se almacena
gran número de registros que utilizan campos de bits en sustitución de tipos
básicos.
Declaración
Ejemplos:
int Uno : 8;
unsigned int Dos : 16;
int : 2;
Definición de Interfaz
51
Tópicos Selectos De Programación Actividades 2009
del tipo GUI, o línea de comandos, etc. También puede ser a partir de un
hardware, por ejemplo, el monitor, el teclado y el mouse, son interfaces
entre el usuario y el ordenador.
n C#, una clase es un tipo de datos muy eficaz. Como las estructuras, las
clases definen los datos y el comportamiento del tipo de datos. Los
programadores pueden crear objetos que son instancias de una clase. A
diferencia de las estructuras, las clases admiten herencia, que es una parte
fundamental de la programación orientada a objetos. Para obtener más
información, vea Herencia.
Declarar clases
C#
Crear objetos
52
Tópicos Selectos De Programación Actividades 2009
Los objetos se pueden crear con la palabra clave new seguida del nombre de
la clase en la que se basará el objeto, de la manera siguiente:
C#
C#
Customer object2;
C#
Este código crea dos referencias a objeto que se refieren al mismo objeto.
Por consiguiente, los cambios realizados en el objeto a través de object3 se
reflejarán en los usos posteriores de object4. El hecho de que las clases se
conozcan como tipos de referencia se debe a que se hace referencia a los
objetos basados en clases por referencia.
Herencia de clase
53
Tópicos Selectos De Programación Actividades 2009
nombre de la clase base a continuación del nombre de la clase derivada, del
modo siguiente:
C#
Cuando una clase declara una clase base, todos los miembros de clase
definidos para la clase base también pasan a formar parte de la nueva clase.
Dado que una clase base se puede heredar de otra clase, que a su vez se
heredó de otra clase y así sucesivamente, una clase puede provenir de
varias clases base.
C#
Casi todas las estructuras comparten la misma sintaxis que las clases,
aunque están más limitadas que éstas:
Las estructuras son tipos de valor; cuando un objeto se crea a partir de una
estructura y se asigna a una variable, la variable contiene el valor completo
54
Tópicos Selectos De Programación Actividades 2009
de la estructura. Cuando se copia una variable que contiene una estructura,
todos los datos se copian y cualquier modificación a la nueva copia no cambia
los datos de la copia antigua. Como las estructuras no utilizan referencias,
no tienen identidad; no existe ninguna forma de distinguir entre dos
instancias de un tipo de valor con los mismos datos. En C#, todos los tipos
de valor derivan inherentemente de ValueType, que hereda de Object.
Las estructuras son tipos de valor, mientras que las clases son tipos
de referencia.
A diferencia de las clases, se pueden crear instancias de las
estructuras sin utilizar un operador new.
Las estructuras pueden declarar constructores, pero deben utilizar
parámetros.
Una estructura no puede heredar de otra estructura o clase, ni puede
ser la base de una clase. Todas las estructuras heredan directamente
de System.ValueType, que hereda de System.Object.
Una estructura puede implementar interfaces.
HILOS
La creación de cada hilo se realiza mediante las líneas Thread th1 = new
Thread(new ThreadStart(msg.Mostrar1));. Esta línea indica que se crea una
instancia de la clase Thread, con nombre th1, a partir de un delegado de la
clase ThreadStart, que apunta al método Mostrar1 del objeto msg creado
anteriormente.
Una vez creados los dos hilos hay que activarlos, para lo que se llama al
método Start de cada uno de ellos. Tras este punto cada hilo se ejecuta en
paralelo entre si, y con el programa principal, por lo que utilizamos el
55
Tópicos Selectos De Programación Actividades 2009
método Join de ambos hilos para esperar a que terminen los hilos antes de
finalizar el programa.
Como esto puede parecer un poco lioso, vamos a ver otro ejemplo. En esta
ocasión disponemos de una clase de funciones matemáticas y queremos
llamar de forma paralela a una de ellas. Este método acepta un valor entero
en la entrada y devuelve otro entero.
using System;
using System.Threading;
using System.IO;
56
Tópicos Selectos De Programación Actividades 2009
public HiloParaMates(int n, MatesCallback callback){
this.n = n;
this.callback = callback;
}
public void CalculoComplejo()
{
int result = EjemploMates.CalculoComplejo(n);
if(callback != null)
callback(result);
}
}
th.Start();
th.Join();
57
Tópicos Selectos De Programación Actividades 2009
entrada. La idea es que tras realizar el cálculo se llame al método que se
indique proporcionándole el resultado.
Para hacer funcionar todo esto, en Main se crea una instancia de la clase
HiloParaMates indicándole que queremos utilizar el valor numérico 1000 y
que se llame al método (estático) ResultCallback cuando se obtenga el
resultado. Para crear el hilo es suficiente con indicar que se quiere hacer
sobre el método CalculoComplejo de la instancia hpm.
System. Object
Ahora que sabemos lo que es la herencia es el momento apropiado para
explicar que en .NET todos los tipos que se definan heredan implícitamente
de la clase System.Object predefinida en la BCL, por lo que dispondrán de
todos los miembros de ésta. Por esta razón se dice que System.Object es
la raíz de la jerarquía de objetos de .NET.
58
Tópicos Selectos De Programación Actividades 2009
si ambos objetos apuntan a la misma referencia en memoria dinámica,
y si los tipos a comparar son tipos por valor sólo se devuelve true si
todos los bits de ambos objetos son iguales, aunque se almacenen en
posiciones diferentes de memoria.
if (o==null)
return this==null;
else
Hay que tener en cuenta que es conveniente que toda redefinición del
método Equals() que hagamos cumpla con una serie de propiedades
que muchos de los métodos incluidos en las distintas clases de la BCL
esperan que se cumplan. Estas propiedades son:
Hay que recalcar que el hecho de que redefinir Equals() no implica que
el operador de igualdad (==) quede también redefinido. Ello habría
que hacerlo de independientemente como se indica en el Tema 11:
Redefinición de operadores.
60
Tópicos Selectos De Programación Actividades 2009
Ejemplo
// keyword_object.cs
using System;
class SampleClass
{
public int i = 10;
}
class MainClass
{
static void Main()
{
object a;
a = 1; // an example of boxing
Console.WriteLine(a);
Console.WriteLine(a.GetType());
Console.WriteLine(a.ToString());
a = new SampleClass();
SampleClass classRef;
classRef = (SampleClass)a;
Console.WriteLine(classRef.i);
}
}
61
Tópicos Selectos De Programación Actividades 2009
Hilo de Ejecución
Los hilos de ejecución que comparten los mismos recursos, sumados a estos
recursos, son en conjunto conocidos como un proceso. El hecho de que los
hilos de ejecución de un mismo proceso compartan los recursos hace que
cualquiera de estos hilos pueda modificar éstos. Cuando un hilo modifica un
dato en la memoria, los otros hilos acceden a ese dato modificado
inmediatamente.
62
Tópicos Selectos De Programación Actividades 2009
Al igual que los procesos, los hilos poseen un estado de ejecución y pueden
sincronizarse entre ellos para evitar problemas de compartimiento de recursos.
Generalmente, cada hilo tiene una tarea especifica y determinada, como forma
de aumentar la eficiencia del uso del procesador.
Informática
Diseño Web
Proyectos
Ocio
using System;
using System.IO;
using System.Threading;
th1.Start();
th2.Start();
th1.Join();
th2.Join();
}
La creación de cada hilo se realiza mediante las líneas Thread th1 = new
Thread(new ThreadStart(msg.Mostrar1));. Esta línea indica que se crea una instancia
de la clase Thread, con nombre th1, a partir de un delegado de la clase
ThreadStart, que apunta al método Mostrar1 del objeto msg creado
anteriormente.
Una vez creados los dos hilos hay que activarlos, para lo que se llama al
método Start de cada uno de ellos. Tras este punto cada hilo se ejecuta en
paralelo entre si, y con el programa principal, por lo que utilizamos el método
Join de ambos hilos para esperar a que terminen los hilos antes de finalizar el
programa.
64
Tópicos Selectos De Programación Actividades 2009
enviándole estos parámetros. A partir de aquí tendríamos que crear una
instancia de dicha clase con los parámetros que queremos enviar al método
original, y hacer que el hilo se ejecutase sobre el nuevo método de la clase. En
el caso de que quisiéramos obtener el resultado de la ejecución, deberíamos
crear una función que acepte como parámetro de entrada el tipo del valor
devuelto por el método original, y hacer que la nueva clase creada disponga
también de un delegado que indique la función a la que llamar tras la ejecución.
Como esto puede parecer un poco lioso, vamos a ver otro ejemplo. En esta
ocasión disponemos de una clase de funciones matemáticas y queremos
llamar de forma paralela a una de ellas. Este método acepta un valor entero en
la entrada y devuelve otro entero.
using System;
using System.Threading;
using System.IO;
65
Tópicos Selectos De Programación Actividades 2009
public static void Main()
{
HiloParaMates hpm = new HiloParaMates(1000, new
MatesCallback(ResultCallback));
th.Start();
th.Join();
Para hacer funcionar todo esto, en Main se crea una instancia de la clase
HiloParaMates indicándole que queremos utilizar el valor numérico 1000 y que
se llame al método (estático) ResultCallback cuando se obtenga el resultado.
Para crear el hilo es suficiente con indicar que se quiere hacer sobre el método
CalculoComplejo de la instancia hpm.
class TimePeriod
{
private double _seconds;
public double Seconds
66
Tópicos Selectos De Programación Actividades 2009
{
get { return _seconds; }
set { _seconds = value; }
}
}
Get (Referencia de C#)
class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set { _seconds = value; }
}
}
67
Tópicos Selectos De Programación Actividades 2009
TEMAS:
VECTOR
LISTAS
PILAS
WX WIDGETS
CIN
COUT
TEMPLATES
#include <cstdlib>
#include <iostream>
#include <vector>
68
Tópicos Selectos De Programación Actividades 2009
vector<double> v;
v.push_back(999.25);
v.push_back(888.50);
v.push_back(777.25);
suma = 0;
for(int i = 0; i < v.size(); i++)
{
suma += v[i];
sprintf(buffer, "%10.2f", v[i]);
cout << buffer << endl;
}
cin.get();
return EXIT_SUCCESS;
}
#include <cstdlib>
#include <iostream>
#include <vector>
69
Tópicos Selectos De Programación Actividades 2009
// despliegue de los elementos del vector v
// mediante el operador [].
for(int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cin.get();
return EXIT_SUCCESS;
}
Las Colas de doble fin son como los vectores, excepto que en éstas la inserción y
borrado de elementos es más rapida, además de permitir insertar y borrar elementos al
principio así como al final del contenedor. La mayoría de los métodos aplicables a la
clase vector son aplicables a la clase deque, pero la clase deque posee ademas los
métodos push_front y pop_front para insertar y borrar elementos al principio. En
orden de ver un ejemplo modificaremos el programa anterior, en el mismo usaremos
una clase deque.
#include <cstdlib>
#include <iostream>
#include <deque>
70
Tópicos Selectos De Programación Actividades 2009
// mediante el método push_front.
for (x = 0; x <= 9; x++) v.push_front(x);
cin.get();
return EXIT_SUCCESS;
Tabla de métodos
71
Tópicos Selectos De Programación Actividades 2009
Destructores y constructores
Cuando vimos clases, hemos visto que toda clase tiene una función especial
llamada constructor que posee la particularidad de tener el mismo nombre
que la clase.
En todos estos casos se ejecuta el destructor del objeto. Este también lleva el
nombre de la clase precedido por el símbolo ~.
Hasta el momento no nos hizo falta definir nuestros propios destructores, pero
como veremos más adelante resulta muy útil y necesario cuando los
programas administran memoria dinámica y no son clases tan triviales como
las que vimos.
72
Tópicos Selectos De Programación Actividades 2009
También poseera un dato miembro, que lo utilizaremos para diferenciar los
diferentes objetos (objeto 0, objeto 1, etc).
Presten especial atención en los dos objetos creados dentro del bloque (el 1 y
el 2). Se crea primero el objeto 1 y luego el objeto 2. Cuando se sale del
bloque, los destructores se ejecutan en el orden inverso al que fueron
creados, es decir primero el del objeto 2 y luego el del objeto 1.
Aquí va a el código:
#include <iostream>
using std::cout;
using std::endl;
#include <new>
class Prueba
{
public:
Prueba(int numero = 0); //constructor.
~Prueba(); //destructor
private:
int x;
};
{
x = numero;
cout << "Se ejecuta el constructor del objeto nro: " <<
(*this).x << endl;
}
Prueba::~Prueba()
{
cout << "Se ejecuta el DESTRUCTOR del objeto nro: " <<
(*this).x << endl;
int main()
73
Tópicos Selectos De Programación Actividades 2009
{
cout << "***Entramos a main" << endl;
Prueba objeto(0);
{
cout << "***Entramos al bloque" << endl;
Prueba objetoA(1);
Prueba objetoB(2);
delete ptr;
cout << "***Ahora estamos por salir de main(), al salir se
ejecutara el destructor" << endl << "del objeto 0 creado al
principio de main()" << endl;
return 0;
}
Para compilar:
Constructor
void __construct ( [mixed args [, ...]] )
PHP 5 permite a los desarrolladores declarar métodos constructores para las clases. Las
clases que tienen un método constructor llaman a este método cada vez que se crea un
74
Tópicos Selectos De Programación Actividades 2009
nuevo objeto, para cualquier inicialización que el objeto puede necesitar antes de ser
usado.
Nota: Los constructores padres no son llamados implicitamente si la clase hijo define
un constructor. Para poder ejecutar el constructor de la clase padre, se debe hacer una
llamada a parent::__construct() dentro del constructor de la clase hijo.
<?php
class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
Para tener compatibilidad con versiones anteriores, si PHP 5 no encuentra una función
__construct() para una clase dada, buscará la forma de la función del constructor que se
usaba anteriormente por el nombre de la clase. Efectivamente, esto significa que el
único caso que puede tener compatibilidad es si la clase tiene un método llamado
__construct() el cual fue usado para semánticas diferentes.
Destructores
void __destruct ( void )
<?php
75
Tópicos Selectos De Programación Actividades 2009
class MyDestructableClass {
function __construct() {
print "In constructor\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destroying " . $this->name . "\n";
}
}
Antes de empezar a cavar hondo en STL, es obligatorio que aprendemos acerca de las
clases de contenedores.
Una clase de contenedor se define como una clase que te da el poder para almacenar
cualquier tipo de datos. Existen dos tipos de clases de contenedores disponibles en
STL en C + +, es decir, "Clases de simple contenedor" y "Clases de contenedores
asociativos". Un asociados clase asociativa Container una clave para cada objeto de
reducir al mínimo el tiempo de acceso promedio.
vector <>
listas de <>
pila <>
cola <>
deque <>
Mapa <>
se <>
Multimap <>
multiconjunto <>
76
Tópicos Selectos De Programación Actividades 2009
Este artículo discutirá acerca de las clases simples contenedores en detalle. Esto le
mostrará cómo utilizar los diferentes métodos de estas clases para lograr su objetivo.
Vamos a empezar con vector <>
Si sólo desea especificar la capacidad, pero no queremos asignar valores para ellos
entonces puede usar el otro constructor que acepta un entero para establecer la
capacidad del vector, como
El último constructor le permite inicializar el vector con los datos de otros vectores o
matrices o de otras colecciones. Supongamos que desea copiar un vector a otro a
continuación, este constructor demuestra ser muy útil. Aquí está el fragmento de
código.
vector <int> nums; for (int i = 1; i <5; i + +) nums.push_back (i); vector <int> códigos
(nums);
He aquí los códigos es un vector. Hemos copiado el contenido de nums en los códigos
con el constructor.
_Destroy ()
_Eq ()
_Lt ()
_Ucopy ()
_Ufill ()
assign ()
at ()
begin ()
back ()
capacidad ()
clear ()
empty ()
77
Tópicos Selectos De Programación Actividades 2009
final ()
erase ()
front ()
get_allocator ()
max_size ()
insert ()
operador =
operador []
pop_back ()
push_back ()
rbegin ()
rend ()
reserva ()
cambiar el tamaño ()
size ()
intercambio ()
~ Vector ()
Aquí vamos a discutir acerca de cada método, le mostrará lo que hace y luego, al final
vamos a dar ejemplo en el que usted puede usar estos métodos a la vez ....
Los métodos que empiezan con un guión bajo protección de métodos y no se puede
acceder usando el objeto de la clase. Estos métodos son utilizados por otro método
internamente.
assign () y size ()
Este método se utiliza para asignar un tamaño inicial del vector. Este método tiene 2
versiones sobrecargadas. Aquí hemos utilizado el primer método sobrecargado. Este
método toma un argumento entero para inicializar el tamaño del vector.
# include <iostream>
# include <vector>
# include <conio.h>
int main ()
(
Vector <char> códigos;
codes.assign (10); / / Asignar el tamaño a 10.
cout <<codes.size ();// imprime el tamaño del vector
getch ();
78
Tópicos Selectos De Programación Actividades 2009
return 0;
)
# include <iostream>
# include <vector>
# include <conio.h>
using namespace std;
int main ()
(
char a [3] = ( 'a', 'b', 'c');
Vector <char> órdenes;
órdenes. asignar (a, a +3);
cout <<orders.size ();
getch ();
return 0;
)
Aquí el puntero utilizado no son sino el nombre de la matriz. Este concepto se debe al
nombre de C. Básicamente matriz es un puntero a la matriz.
at ()
# include <iostream>
# include <vector>
# include <conio.h>
int main ()
79
Tópicos Selectos De Programación Actividades 2009
(
vector <int> códigos;
for (int i = 0; i <10; i + +)
codes.push_back (i);
cout <<codes.at (9) <<endl;
getch ();
return 0;
)
En STL en los contenedores, los elementos son accesibles usando iteradores. Los
iteradores son algo así como punteros. begin () y final () devuelve el iterador al
principio y al final del contenedor. He aquí una cosa hay que señalar final () apunta a
una ubicación que es uno después del final físico del contenedor. Estos dos métodos
son los más utilizados en STL, porque para atravesar un contenedor, es necesario crear
un iterador. Y entonces para inicializar su valor al inicio del contenedor. Aquí está el
código para recorrer un vector <>. Este código de hacer uso de comenzar () y final ()
métodos.
# include <iostream>
# include <vector>
using namespace std;
int main ()
(
vector <int> números;
for (int i = 0; i <10; i + +)
numbers.push_back (i);
/ / Assiging al principio
<int> vector:: iterator k = Numbers.begin ();
/ / Tenga en cuenta que K es inferior al que
/ / numbers.end (), porque los puntos finales () en algún lugar que está más allá del final
físico.
for (; k <numbers.end (); k + +)
cout <<* k <<endl;
return 0;
)
80
Tópicos Selectos De Programación Actividades 2009
() frente método devuelve el elemento en la parte delantera del vector. Volver ()
devuelve el elemento en la parte posterior del vector. Aquí está el código para
comprender mejor sus operaciones.
# include <iostream>
# include <vector>
using namespace std;
int main ()
(
vector <int> m;
for (int i = 0; i <10; i + +)
m.push_back (i);
cout <<m.front () <<endl;
cout <<m.back () <<endl;
return 0;
)
() capacidad, el tamaño ()
# include <iostream>
# include <vector>
using namespace std;
int main ()
(
vector <int> m (100);
cout <<m.capacity () <<endl;
for (int i = 0; i <10; i + +)
m.push_back (i);
cout <<m.size () <<endl;
return 0;
)
81
Tópicos Selectos De Programación Actividades 2009
ITERADORES
Nota: el diseño de la STL permite que cualquier función genérica que acepte
un iterador funcione igualmente bien aceptando un puntero ordinario.
Nota: los iteradores no solo sirven para señalar elementos dentro de los
contenedores de la STL, también se utilizan para señalar elementos dentro de
otras estructuras: flujos ("Streams") y bufers de flujo ("Buffers streams") [4].
Además se han definido de modo que cuando los elementos de matriz están
definidos mediante subíndices son también iteradores. La consecuencia es que
ciertos algoritmos pueden aplicarse también sobre las matrices (recuerde las
matrices son un tipo de estructura de datos, y que el operador elemento de
matriz [] se define como la indirección de un puntero
...
...
...
82
Tópicos Selectos De Programación Actividades 2009
++iT1; // desplaza iT1 al segundo miembro
§2 La clase iterator
std::vector<int>::iterator iT1;
public:
class iterator;
};
class vector<T>::iterator {
};
§2 Características
La tabla siguiente muestra los modos en que son generadas las diversas
categorías de iteradores por los contenedores STL.
84
Tópicos Selectos De Programación Actividades 2009
List
Lista STL
Una lista es un contenedor secuencial optimizado para las inserciones y eliminaciones
de los elementos de datos en ubicaciones arbitrarias dentro de la colección.
Sin embargo, una lista no proporciona acceso basado en el índice a los elementos de la
colección. Lista STL se implementa como una lista doblemente vinculada. Una lista
doblemente vinculada es una estructura de datos en el que cada elemento tiene un
vínculo en el siguiente elemento y un vínculo al elemento anterior. Se debe usar una
lista cuando el orden de los elementos dentro de la lista y eficientes arbitrarias
inserciones y eliminaciones requeridos por la aplicación.
Los siguientes son algunos de los principales métodos de clase de lista de STL. Estos no
incluyen los métodos relacionados con iteradores, que se describen en la siguiente
sección.
Método Descripción
List() Crea una lista vacía.
lista (size_type n) Crea una lista de n elementos inicializada a su valor
predeterminado.
lista (size_type n, T const y Crea una lista de n elementos inicializada al valor.
valor)
T & back(void) Devuelve una referencia para el último elemento en la lista.
T & front(void) Devuelve una referencia al primer elemento en la lista.
anular push_back(const T& Inserta un valor al final de la lista.
value)
anular push_front(const T& Inserta un valor al principio a la lista.
value)
anular pop_back(void) Elimina el último elemento de la lista.
anular pop_front(void) Elimina el primer elemento de la lista.
void quitar (const T & valor) Elimina todos los elementos que coinciden con el valor.
Comparación se realiza mediante el operador ==.
anular reverse(void) Invierte el orden de los elementos en la lista.
85
Tópicos Selectos De Programación Actividades 2009
Método Descripción
size_type size(void) Devuelve el número de entradas de la lista.
anular sort(void) Ordena las entradas contenidas en la lista utilizando el < operador.
Stack
La pila de <>clase Container
En este artículo trataremos sobre unSencillo clase de contenedorPila.
Esto representa una pila de su tipo de datos. Pila de <>se modela utilizando un deque
(O un doble terminó cola). Todos los operadores <, > < =, > =,! =, == están
sobrecargados de la clase de contenedor de pila. Esto significa que puede comprobar
dos pilas al igual que dos enteros o dos tipos de datos integrada. Por ejemplo, hay dos
pilas s1 y s2 y desea comparar, puede escribir
Empty()
get_allocator()
pop()
Push()
Size()
Top()
operador ==
operador < =
operador > =
operador! =
operador <
operador >
86
Tópicos Selectos De Programación Actividades 2009
Aquí vamos a hablar acerca de cada método, le mostrará lo que hace y, a continuación,
al final nos dará ejemplo donde se puede utilizar estos métodos together….
Empty() y size()
El método empty() se utiliza para comprobar si una pila está vacía o no. Este método
devuelve un valor bool. El valor es true que si la pila está vacía, de lo contrario
devolverá false valor. Aquí es un código que lo hará entender mejor cómo se utiliza
empty()...
# include <iostream>
# include <stack>
# include <conio.h>
int main()
{
la pila de códigos de <char>;
codes.Push('a');
codes.Push('b');
cout << "tamaño de la pila is:"<<codes.size<<endl;
¿//Checking si la pila está vacía o no?
if(codes.Empty()==true)
cout << "La pila está vacía"; //prints el tamaño de la pila
getch();
devolver 0;
}
Push() y top()
Push() se utiliza para insertar un elemento en la parte superior de pila. Sólo necesitamos
pasar el argumento para empujar en la parte superior de la pila. El tipo de devolución de
este método es nulo. Por lo que no se devuelve sólo los valores se insertan en la parte
superior de pila.
Top(), como sugiere el nombre utilizado para el elemento MRA(Most Recently Added)
de la pila que se encuentra en la parte superior de pop. El código siguiente pone algunos
entero en una pila de entero y, a continuación, muestra el elemento ARM.
87
Tópicos Selectos De Programación Actividades 2009
# include <iostream>
# include <stack>
# include <conio.h>
int main()
{
la pila de códigos de <int>;
for(int i=0;i<10;i++)
//Pushing elementos en la parte superior de la pila.
codes.Push(i);
cout<<codes.Top() << endl; //Displaying el elemento de la parte superior
getch();
devolver 0;
}
LAS WXWIDGETS
88
Tópicos Selectos De Programación Actividades 2009
Las wxWidgets proporcionan una interfaz gráfica basada en las bibliotecas ya
existentes en el sistema (nativas), con lo que se integran de forma óptima y
resultan muy portables entre distintos sistemas operativos. Están disponibles para
Windows, MacOS, GTK+, Motif, OpenVMS y OS/2.
También pueden ser utilizadas desde otros lenguajes de programación, aparte del
C++: Java, Javascript, Perl, Python, Smalltalk, Ruby .
ImplementationAplicación
El uso
Todos los usos de los wxWidgets se derivan de wxApp, y necesitan simplemente
eliminar a un solo miembro, wxApp:: OnInit, y crea una ventana. Mientras la
ventana esté abierta, el uso está también.
Definición
Un Frame
es una ventana cuyo tamaño y posición pueden (usualmente) ser cambiados
por el usuario.Esta usualmente tiene unas fronteras gruesas y un titulo de
barra, y puede contener opcionalmente una barra de menú, una barra de
herramientas y una barra de estado. Un Frame puede contener cualquier
ventana que no sea un diálogo. Un Frame va a tener una barra de estado, que
es creada por la función CreateStatusBar y una barra de herramientas que es
creada por la función CreateToolBar que manejara la ventana.
89
Tópicos Selectos De Programación Actividades 2009
Métodos
Estos son algunos métodos del Frame:
Constructora
wxFrame( parent, id, const title, const wxPoin pos =
wxDefaultPosition, const size = 0, long style =
wxDEFAULT_FRAME_STYLE, name = "frame")
Parámetros de la constructora
Parent:
El padre de la ventana. Este puede ser NULL. si es non-NULL, el frame será
exhibido siempre encima de la ventana del padre en Windows.
Id: El identificador de la ventana. Puede tomar el valor de -1 para que se le
asigne un valor predeterinado.
Title: El subtitulo que se exhibirá en la barra del título del Frame.
Pos: La posición de la ventana. Un valor de (-1,-1) indica una posición del
defecto, elegida por el sistema o los wxWidgets del windowing, dependiendo
de la plataforma.
Size: El tamaño de la ventana. Un valor de (-1,-1) indica un tamaño
predeterminado, elegido por el sistema, dependiendo de la ventana.
Style: El estilo de la ventana.
90
Tópicos Selectos De Programación Actividades 2009
Name: El nombre de la ventana. Este parámetro se utiliza para asociar un
nombre a la ventana.
wxTextCtrl
Un control de texto permite que el texto que se mostrará y editado. Puede ser de
una sola línea o de varias líneas.
Derivado de
streambuf
wxControl
wxWindow
wxEvtHandler
wxObject
Incluir archivos
<wx/textctrl.h>
wxTextCtrl:: wxTextCtrl
wxTextCtrl ()
Default constructor.
wxTextCtrl (wxWindow padre *, wxWindowID id, wxString const & value = "",
wxPoint const & POS = wxDefaultPosition, wxSize const & size = wxDefaultSize,
long style = 0, wxValidator const & validador = wxDefaultValidator, wxString const
& name = wxTextCtrlNameStr)
wxTextCtrl:: ~ wxTextCtrl
~ wxTextCtrl ()
wxTextCtrl:: AppendText
wxTextCtrl:: CanCopy
wxTextCtrl:: CanCut
wxTextCtrl:: CanPaste
wxTextCtrl:: CanRedo
wxTextCtrl:: CanUndo
92
Tópicos Selectos De Programación Actividades 2009
Devuelve true si existe la posibilidad de deshacer disponible y la última operación
se puede deshacer.
wxTextCtrl:: Clear
wxTextCtrl:: Copiar
wxTextCtrl:: Create
bool Crear (* wxWindow padre, wxWindowID id, wxString const & value = "",
wxPoint const & POS = wxDefaultPosition, wxSize const & size = wxDefaultSize,
long style = 0, wxValidator const & validador = wxDefaultValidator, wxString const
& name = wxTextCtrlNameStr )
Crea el control de texto para la construcción de dos pasos. Las clases derivadas
deben llamar o sustituir esta función
wxTextCtrl:: Corte
wxTextCtrl:: DiscardEdits
DiscardEdits void ()
93
Tópicos Selectos De Programación Actividades 2009
Restablece el indicador interno "modificado" como si las ediciones actuales se
habían salvado.
wxTextCtrl:: EmulateKeyPress
Valor devuelto
wxTextCtrl:: GetDefaultStyle
Compatibilidad
94
Tópicos Selectos De Programación Actividades 2009
wxTextCtrl & operator <<(char c)
wxControl
Esta es la clase base para un control o widget''.
Derivado de
wxWindow
wxEvtHandler
wxObject
Incluir archivos
<wx/control.h>
Ver también
wxValidator
Miembros
wxControl:: Command
wxControl:: getLabel
wxControl:: SetLabel
wxControl:: Command
95
Tópicos Selectos De Programación Actividades 2009
wxControl:: getLabel
wxControl:: SetLabel
wxButton
Derivado de
wxControl
wxWindow
wxEvtHandler
wxObject
Incluir archivos
<wx/button.h>
Estilos de ventanas
96
Tópicos Selectos De Programación Actividades 2009
wxButton:: wxButton
wxButton ()
Default constructor.
wxButton:: ~ wxButton
~ wxButton ()
wxButton:: Create
bool Crear (* wxWindow padre, wxWindowID id, wxString const & label =
wxEmptyString, wxPoint const & POS = wxDefaultPosition, wxSize const & size =
97
Tópicos Selectos De Programación Actividades 2009
wxDefaultSize, long style = 0, wxValidator const y validador, wxString const &
name = "button")
wxButton:: getLabel
Valor devuelto
Ver también
wxButton:: SetLabel
wxButton:: GetDefaultSize
GetDefaultSize wxSize ()
Devuelve el tamaño por defecto de los botones. Se recomienda hacer todos los
botones de diálogo del mismo tamaño y esta función permite recuperar la
(plataforma y tamaño actual depende de fuentes) que debe ser el más adecuado
para ello.
Esto establece el botón para ser el tema por defecto para el grupo especial o
cuadro de diálogo.
wxButton:: SetLabel
98
Tópicos Selectos De Programación Actividades 2009
Establece la etiqueta de cadena para el botón
wxT
wxT () es una macro que puede ser utilizado con carácter y literales de cadena (en
otras palabras, "x" o "foo") para convertir automáticamente a Unicode en Unicode
configuración de generación. Por favor vea el resumen Unicode para más
información.
Esta macro es simplemente devuelve el valor que se le pasa sin cambios en ASCII
construir. De hecho, su definición es:
# ifdef UNICODE
# define wxT (x) L # # x
# else / /! Unicode
# define wxT (x) x
# endif
wxString
wxString es una clase que representa una cadena de caracteres. Por favor vea el
resumen wxString para obtener más información al respecto.
99
Tópicos Selectos De Programación Actividades 2009
Usted puede notar que wxString a veces tiene muchas funciones que hacer lo
mismo, como, por ejemplo, Longitud (), Len () y longitud (), que todos los devolverá
la longitud de cadena. En todos los casos de esa duplicación de la std:: cadena
método compatible (longitud () en este caso, siempre la versión en minúsculas) se
debe usar ya que asegurará un suave transición a std:: string wxWidgets cuando
comienza a utilizar en lugar de wxString.
Derivado de
Ninguno
Incluir archivos
<wx/string.h>
Objetos predefinidos
Objetos:
wxEmptyString
wxString:: wxString
wxString ()
Constructor de copia.
wxString:: IsWord
100
Tópicos Selectos De Programación Actividades 2009
wxString:: Última
wxChar y Last ()
wxString:: Izquierda
wxString:: Len
wxString:: Longitud
wxString:: Baja
101
Tópicos Selectos De Programación Actividades 2009
wxString:: Minúsculas
Minúsculas void ()
wxString:: MakeLower
wxString:: MakeUpper
COUT Y CIN
C++, al igual que C, no tiene operaciones de entrada/salida como parte del lenguaje en
sí, sino que define la librería stream para añadir estas funciones. La salida por pantalla
se hace a través de cout, pero es algo diferente a la función printf(), ya que no tenemos
102
Tópicos Selectos De Programación Actividades 2009
que indicarle el tipo de la variable que queremos imprimir. Así se escribe en C++ el
tradicional ejemplo "Hello, world":
#include <iostream.h>
main()
{
cout << "Hello, world";
}
cout saca por pantalla cualquier tipo de dato estándar que existe en C++, bien sea un
carácter, un número o movimientos especiales del cursor,como \n en el ejemplo
anterior. Veamos otro programa:
#include <iostream.h>
main()
{
int a;
float b;
a = 4;
b = 52.2;
Pero antes introduciremos, sin explicarlo en profundidad, dos elementos que nos
permitirán que nuestros programas se comuniquen con nosotros. Se trata de la salida
estándar, "cout" y de la entrada estándar "cin". Estos elementos nos permiten enviar a la
pantalla o leer desde el teclado cualquier variable o constante, incluidos literales. Lo
veremos más detalladamente en un capítulo dedicado a ellos, de momento sólo nos
interesa cómo usarlos para mostrar o leer cadenas de caracteres y variables.
103
Tópicos Selectos De Programación Actividades 2009
Nota: en realidad "cout" es un objeto de la clase "ostream", y "cin" un objeto de la clase
"istream" pero los conceptos de clase y objeto quedarán mucho más claros en capítulos
posteriores.
#include <iostream>
using namespace std;
Veamos un ejemplo:
#include <iostream>
using namespace std;
int main()
{
int a;
cin >> a;
cout << "la variable a vale " << a;
return 0;
}
Un método muy útil para "cout" es "endl", que hará que la siguiente salida se imprima
en una nueva línea.
Otro método, este para "cin" es get(), que sirve para leer un carácter, pero que nos puede
servir para detener la ejecución de un programa.
ASSIGN
104
Tópicos Selectos De Programación Actividades 2009
A: Número del parámetro de una transacción activa que recibe la información. El
operando debe ser número entero, nombre o SNA seguido por nulo + o - (requerido).
B: El valor que será asignado al parámetro indicado por el operando A. El operando
debe ser número entero, nombre o SNA (requerido).
C: El número de la función (modificador de la función). El operando debe ser nulo,
número entero, nombre o SNA (requerido).
assign () y size ()
Este método se utiliza para asignar un tamaño inicial del vector. Este método tiene 2
versiones sobrecargadas. Aquí hemos utilizado el primer método sobrecargado. Este
método toma un argumento entero para inicializar el tamaño del vector.
at ()
En STL en los contenedores, los elementos son accesibles usando iteradores. Los
iteradores son algo así como punteros. begin () y final () devuelve el iterador al
principio y al final del contenedor. He aquí una cosa hay que señalar final () apunta a
una ubicación que es uno después del final físico del contenedor. Estos dos métodos
son los más utilizados en STL, porque para atravesar un contenedor, es necesario crear
un iterador. Y entonces para inicializar su valor al inicio del contenedor.
105
Tópicos Selectos De Programación Actividades 2009
frente (), back ()
() capacidad, el tamaño ()
Plantillas de clase
clase de plantilla < clase T > pila {pública: Stack(int = 10); ~Stack() {delete []
stackPtr;} int inserción (const T &); int pop(T&); int isEmpty () const {arriba
devuelto ==-1;} int isFull() const {devuelto parte superior == tamaño - 1;} privada:
int tamaño; / / número de elementos de la pila.parte superior de int; T * stackPtr;};
106
Tópicos Selectos De Programación Actividades 2009
T es un parámetro de tipo y puede ser cualquier tipo. Por ejemplo, la pila T no tiene
que ser un tipo de clase como implícitas, por la clase de palabra clave.
/ / B.CPP # include
//B.H plantilla < clase t > //MAIN.CPP # include
"B.H" plantilla < clase t >
clase b {pública: b(); ~b();}; "B.H" void main() {b
b
//stack.h
#pragma once
template <class T>
class Stack
{
public:
Stack(int = 10) ;
~Stack() { delete [] stackPtr ; }
int push(const T&);
int pop(T&) ; // pop an element off the stack
int isEmpty()const { return top == -1 ; }
int isFull() const { return top == size - 1 ; }
private:
int size ; // Number of elements on Stack
int top ;
T* stackPtr ;
};
107
Tópicos Selectos De Programación Actividades 2009
top = -1 ; // initialize stack
stackPtr = new T[size] ;
}
// push an element onto the Stack
template <class T>
int Stack<T>::push(const T& item)
{
if (!isFull())
{
stackPtr[++top] = item ;
return 1 ; // push successful
}
return 0 ; // push unsuccessful
}
# include <iostream># include "stack.h" con espacio de nombres std; void main()
{typedef pila <float><int>FloatStack; typedef pila < int > IntStack; FloatStack fs(5);
flotar f = 1.1; cout << "Insertar elementos en fs" << endl; mientras que (fs.push(f))
{cout << f << ' '; f += 1.1;} cout << endl << "Pila completo." << endl << endl <<
"Elementos de fs emergen" << endl; mientras que (fs.pop(f)) cout << f << ' '; cout
<< endl << "Pila vacío" << endl; cout << endl; es IntStack; int I = 1.1; cout <<
"Insertar elementos en es" << endl; mientras que (is.push(i)) {cout << me << ' '; I
+= 1;} cout << endl << "Lleno de pila" << endl << endl << "Emergen elementos de
es" << endl; mientras que (is.pop(i)) cout << me << ' '; cout << endl << "Pila vacío"
<< endl;}
108
Tópicos Selectos De Programación Actividades 2009
Programa de salida
Insertar elementos en fs 1.1 2,2 3.3 4,4 5.5 pila completo.Haciendo estallar los
elementos de fs 5.5 4.4 3,3 2.2 1.1 pila vacío insertar elementos en es 1 2 3 4 5 6 y 7
8 9 10 elementos desde que emergen completa de pila es 10 9 8 7 6 5 4 3 2 1 pila
vacío
Una buena práctica de programación está utilizando typedef mientras crear una
instancia de clases de plantilla. A continuación, a lo largo de todo el programa, se
puede usar el nombre de typedef. Existen dos ventajas:
del typedef son muy útiles "plantillas de plantillas" entrado en uso. Por
ejemplo, al crear una instancia de un vector de STL del int, puede utilizar:
vector typedef
Plantillas de función
Para realizar operaciones idénticas para cada tipo de datos de forma compacta y
convenientemente, utilice plantillas de función. Puede escribir una definición única
función de la plantilla. Según los tipos de argumentos en llamadas a la función, el
compilador crea automáticamente las funciones de código objeto independiente
para controlar adecuadamente cada tipo de llamada. Los algoritmos STL se
implementan como plantillas de función.
109
Tópicos Selectos De Programación Actividades 2009
#include <iostream>
using namespace std ;
//max returns the maximum of the two elements
template <class T>
T max(T a, T b)
{
return a > b ? a : b ;
}
#include <iostream>
using namespace std ;
//max returns the maximum of the two elements
template <class T>
T max(T a, T b)
{
return a > b ? a : b ;
}
void main()
{
cout << "max(10, 15) = " << max(10, 15) << endl ;
cout << "max('k', 's') = " << max('k', 's') << endl ;
cout << "max(10.1, 15.2) = " << max(10.1, 15.2) << endl ;
}
Program Output
max(10, 15) = 15
max('k', 's') = s
max(10.1, 15.2) = 15.2
110
Tópicos Selectos De Programación Actividades 2009
# include plantilla < clase T > T max(T a, T b) {devolver un > b? un: b;} int main()
{cout << "max (10, 15) =" << max (10, 15) << endl; cout << "max('k', 's') =" <<
max('k', 's') << endl; cout << "max (10.1, 15.2) =" << max (10.1, 15.2) << endl; cout
<< "max(\"Aladdin\", \"Jasmine\") =" << max ("Aladdin", "Jazmín") << endl;
devolver 0;}
Programa de salida
Max (10, 15) = max('k', 's') 15 = s máx. (10.1, 15.2) = 15.2 máx. ("Aladdin",
"Jasmine") = Aladdin
Programa de salida
Max (10, 15) = max('k', 's') 15 = s máx. (10.1, 15.2) = 15.2 máx. ("Aladdin",
"Jasmine") = Jasmine
111
Tópicos Selectos De Programación Actividades 2009
Parámetros de plantilla
1. Las plantillas de C++ permiten uno implementar una cola genérica T se
puede sustituir por tipos reales, por ejemplo, Por ejemplo,
plantilla < clase T = float, int elementos = 100 > pila {...};
La pila de <>mostRecentSalesFigures;
sería una instancia (en tiempo de compilación) una plantilla de pila de 100
elemento clase denominada mostRecentSalesFigures de valores flotantes;
esta clase de plantilla sería de tipo Stack < float, 100 >.
{} de pila de clase de plantilla < clase T, int tamaño >; //error C2989: "Stack
clase de plantilla < clase T, int tamaño > pila {int T; //error-parámetro de
tipo re-defined.anular f() {char T; //error-parámetro de tipo re-defined.}};
{} de clase A; int main() {pila si
Nota: Visual c++ 5.0 o SP1 compila este ejemplo sin errores. No bandera la
redefinición del parámetro de tipo como un error.
112
Tópicos Selectos De Programación Actividades 2009
5. El valor de un no-parámetro de tipo no se puede asignar o su valor
cambiado. Por ejemplo,
clase de plantilla < clase T, int tamaño > pila {anular f() {//error C2105: ' ++
' l-valor de las necesidades de tamaño ++; cambio de //error de valor del
argumento de plantilla}}; int main() {pila si
clase T {}; int I; plantilla < clase T, T I > f void (T t) {t1 T = I; //template
argumentos T y:: t2 T =:: I; //globals T y} int main() {f('s'); //C2783 volver
aquí 0;}
clase T {}; int I; plantilla < clase T, T I > f void (T t) {t1 T = I; //template
argumentos T y:: t2 T =:: I; //globals T y} int main() {f < char, ' s'>('s');
//workaround devuelven 0;}
clase de plantilla < doble d > X; //error C2079: 'xd' utiliza //undefined clase
'X <1.e66>' //template < doble * pd > clase X; //ok //template < doble & rd
> clase X; //ok int main() {X <1.0> xd; return 0;}
113
Tópicos Selectos De Programación Actividades 2009
EXTRAS:
+ Suma
- Resta
* Multiplicación
/ División
^ Exponenciación
% Módulo
114
Tópicos Selectos De Programación Actividades 2009
Dado un número, se realiza una serie de comparaciones contra cada uno de los
valores correspondientes a los símbolos romanos enlistados una tabla que los
contenga ordenados de mayor a menor.
La clave es dicha tabla (que por facilidad puede ser también dos vectores
paralelos) que nos muestre los valores romanos ordenados desde el más alto y
hasta terminar en el más bajo (o sea el 1) así como su “Valor nominal”.
i Romanos[ ] Valores[ ]
1 M 1000
2 CM 900
3 D 500
4 CD 400
5 C 100
6 XC 90
7 L 50
8 XL 40
9 X 10
10 IX 9
11 V 5
12 IV 4
13 I 1
115
Tópicos Selectos De Programación Actividades 2009
Nótese que en la tabla se incluyeron los elementos que están formados por una
resta (4, 9, 40, 90, 400 y 900) de esta manera se simplifica bastante el proceso
porque a partir de aquí, ya solo concatenamos.
Pseudocódigo
1.Inicio
2.Dadas las tablas Romanos[] y Valores[]
3.Pedir: A
4.Hacer Resultado = ""
5. Ciclo en i para cada elemento de Romanos
6. Mientras Valores<i> <= A hacer
7. Resultado = Resultado + Romanos<i>
8. A = A - Valores<i>
9. Fin-Mientras
10. Fin-Ciclo
11.Mostrar Resultado
12.Fin
NOTA: El algoritmo se puede hacer más eficiente si se valida que cuando A llegue a
cero, se interrumpa el ciclo. De ese modo sería más óptimo, aunque funcionaría
igual.
116
Tópicos Selectos De Programación Actividades 2009
Diagrama de
Flujo
Si quieres convertir numeros con valores por arriba de los que se explican en la
tablita arriba mencionada, recuerda que la regla es que una rayita arriba del
número lo multiplica por mil. Si pones dos rallitas, entonces es 1,000 x 1,000
osea 1 millón, y así sucesivamente.
Por ejemplo:
_
X = 10000 (Diez con una rayita igual a diez mil)
=
X = 10000000 (Diez con dos rayitas igual a diez millones)
117
Tópicos Selectos De Programación Actividades 2009
La suma de los valores individuales de los caracteres que forman el Número Romano
I=1
II =1+1
III =1+1+1
IV = 1 + 4 ?
Pseudocódigo
Condiciones iniciales:
Como condición inicial consideraremos que contamos con una función llamada
118
Tópicos Selectos De Programación Actividades 2009
ValorRomano() que nos devuelve el valor numérico de caracteres individuales.
Ejemplo: ValorRomano("I")=1, ValorRomano("V")=5
1. Inicio
2. Previa definición de ValorRomano()
3. Obtener: R como número Romano
4. Resultado = 0
5. Max = Longitud de R
6. Ciclo en i hasta Max - 1
7. C = Caracter i de R
8. C2 = Caracter i+1 de R
9. si ValorRomano(C)< ValorRomano(C2) entonces
10. Resultado = Resultado - ValorRomano(C)
11. sino
12. Resultado = Resultado + ValorRomano(C)
13. Fin-si
14. Fin-Ciclo
15. C2 = Caracter Max de R
16. Resultado = Resultado + ValorRomano(C2)
17. Mostrar Resultado
18. Fin
Observaciones al Proceso:
Diagrama de flujo
119
Tópicos Selectos De Programación Actividades 2009
{
/* Se explican los 3 tipos de casos, los demas son análogos */
int z;
string respuesta = "";
120
Tópicos Selectos De Programación Actividades 2009
/* Si es divisible agrega las letras a la cadena de respuesta */
respuesta = respuesta + "CM";
/* Resta el valor de la letras ya agregadas */
n -= 900;
}
if ((z = n) > 0)
{
for (int x =0; x < z; x++)
respuesta = respuesta + "I";
n -= z;
}
return respuesta;
122
Tópicos Selectos De Programación Actividades 2009
#include <iostream>
#include <string>
#include <stack>
#include <sstream>
#include <cctype>
#include <cmath>
using std::cout;
using std::cin;
using std::stack;
using std::string;
using std::istringstream;
// Esta clase lo que realiza es la conversión de una cadena Infja -> Postfija
class Infija
private:
string strInfija;
public:
Infija(string i) : strInfija(i.c_str())
123
Tópicos Selectos De Programación Actividades 2009
string Postfija()
string strCadenaPostfija;
stack<char> Pila;
Pila.push('(');
while(!Pila.empty())
124
Tópicos Selectos De Programación Actividades 2009
char caracterActual = (char)strCadenaInfija.get();
if(isdigit(caracterActual))
strCadenaPostfija += caracterActual;
Pila.push(caracterActual);
if(isoperator(caracterActual))
Pila.pop();
125
Tópicos Selectos De Programación Actividades 2009
while(!Pila.empty() &&
Precedencia(caracterActual, topePila))
strCadenaPostfija += topePila;
topePila = Pila.top();
Pila.pop();
Pila.push(caracterActual);
if(caracterActual == ')')
strCadenaPostfija += Pila.top();
Pila.pop();
126
Tópicos Selectos De Programación Actividades 2009
// 3.4.2) Sacar (y descartar) el parentesis
izquierdo de la pila
Pila.pop();
bool isoperator(char o)
// funcional tu calculadora
return true;
return false;
// en la expresion: 3 * 4 + 1
127
Tópicos Selectos De Programación Actividades 2009
// el operador con mayor precedencia es * y despues el +
return 0;
};
class Evaluador
private:
string strPostfija;
public:
Evaluador(string p) : strPostfija(p.c_str())
double Ejecutar()
128
Tópicos Selectos De Programación Actividades 2009
{
// La ayuda es la siguiente:
/*
logaritmo, exponenciacion,
y las tradicionales +, -, *, /, %
Retornar el valor
129
Tópicos Selectos De Programación Actividades 2009
*/
};
int main()
string strCadenaInfija;
getline(cin, strCadenaInfija);
Infija MiInfija(strCadenaInfija);
Evaluador MiEvaluador(MiInfija.Postfija());
return 0;
130