miércoles, 23 de enero de 2013

Sobrecarga De Funciones C++



Sobrecarga de funciones

La sobrecarga (overload) de funciones consiste en declarar y definir varias funciones distintas que
tienen un mismo nombre. Dichas funciones se definen de forma diferente. En el momento de la
ejecución se llama a una u otra función dependiendo del número y/o tipo de los argumentos actuales
de la llamada a la función. Por ejemplo, se pueden definir varias funciones para calcular el valor
absoluto de una variable, todas con el mismo nombre abs(), pero cada una aceptando un tipo de
argumento diferente y con un valor de retorno diferente.


La sobrecarga de funciones no admite funciones que difieran sólo en el tipo del valor de
retorno, pero con el mismo número y tipo de argumentos. De hecho, el valor de retorno no influye
en la determinación de la función que es llamada; sólo influyen el número y tipo de los argumentos.
Tampoco se admite que la diferencia sea el que en una función un argumento se pasa por valor y en
otra función ese argumento se pasa por referencia.


A continuación se presenta un ejemplo con dos funciones sobrecargadas, llamadas ambas

string_copy(), para copiar cadenas de caracteres. Una de ellas tiene dos argumentos y la otra tres.

Cada una de ellas llama a una de las funciones estándar del C: strcpy() que requiere dos
argumentos, y strncpy() que requiere tres.

 El número de argumentos en la llamada determinará la
función concreta que vaya a ser ejecutada:


// Ejemplo de función sobrecargada
#include <iostream.h>
#include <string.h>
inline void string_copy(char *copia, const char *original)
{
strcpy(copia, original);
}
inline void string_copy(char *copia, const *original, const int longitud)
{
strncpy(copia, original, longitud);
}
static char string_a[20], string_b[20];
void main(void)
{
string_copy(string_a, "Aquello");
string_copy(string_b, "Esto es una cadena", 4);
cout << string_b << " y " << string_a;
// La última sentencia es equivalente a un printf() de C

}

La máquina de Turing



Una máquina de Turing es un autómata que se mueve sobre una secuencia lineal de
datos. En cada instante, la máquina puede leer un único dato de la secuencia (generalmente
un carácter) y realizar ciertas acciones en base a una tabla que tiene en cuenta
su estado actual (interno) y el último dato leído. Entre las acciones que puede realizar,
está la posibilidad de escribir nuevos datos en la secuencia, recorrer la secuencia en ambos
sentidos y cambiar de estado dentro de un conjunto finito de estados posibles.







Un sistema Turing completo es aquel que puede simular el comportamiento de
una máquina de Turing. Dejando de lado las limitaciones impuestas por la capacidad
de almacenamiento o la memoria, las computadoras actuales y los lenguajes de
programación de propósito general definen sistemas Turing completos.
Independientemente de su forma concreta, cualquier dispositivo que se comporte
como un sistema Turing completo puede en principio ejecutar cualquier cálculo
que realice cualquier computadora; lógicamente, esta afirmación no considera la
posible dificultad de escribir el programa correspondiente o el tiempo que pueda requerir
realizar el cálculo en cuestión.

¿QUÉ SON LOS ALGORITMOS?



Un algoritmo es un conjunto finito de instrucciones precisas que realizan una tarea,
la cual, dado un estado inicial, culminará por arrojar un estado final reconocible.
Esta definición asume que la ejecución del algoritmo concluye en algún momento,
dejando fuera los procedimientos que ejecutan permanentemente sin detenerse. Para
incluir a éstos en la definición, algunos autores prefieren obviar la condición de que
la ejecución concluya, con lo cual basta con que un procedimiento sea una secuencia
de pasos que puede ser ejecutada por una entidad para que se lo considere algoritmo.
En el caso que no haya un estado final reconocible, el éxito del algoritmo no
puede definirse como la culminación del proceso con un resultado significativo.
En cambio, se requiere una definición de éxito que contemple secuencias ilimitadas
de resultados, por ejemplo, un sistema de compresión/descompresión de
datos en tiempo real (como los utilizados en el manejo de voz sobre IP); en este
caso, el algoritmo no define por sí mismo la finalización del proceso, debiendo
seguir su funcionamiento mientras haya datos para procesar. El éxito del algoritmo
estará dado por el hecho de que los datos, una vez descomprimidos, sean
iguales que antes de comprimirse.





VOZ IP: La tecnología de voz sobre IP se utiliza para realizar comunicaciones telefónicas sobre redes
IP (Internet Protocol). En esta tecnología son cruciales los algoritmos de compresión de datos,
ya que, cuanto más se compriman los datos que representan la voz digitalizada, mejor será la
calidad de comunicación.        :

El concepto de algoritmo se ilustra frecuentemente comparándolo con una receta:
al igual que las recetas, los algoritmos habitualmente están formados por secuencias
de instrucciones que probablemente se repiten (iteran) o que requieren decisiones
(comparaciones lógicas) hasta que completan su tarea. Un algoritmo puede no ser
correcto, con lo cual, por más que sus pasos se lleven a cabo correctamente, el estado
final no será el esperado.
Normalmente, cuando un algoritmo está asociado con el procesamiento de información,
se leen datos de una fuente o dispositivo de entrada, se procesan y se emiten por
un dispositivo de salida, o bien se almacenan para su uso posterior. Los datos almacenados
se consideran parte del estado interno de la entidad que ejecuta el algoritmo


Dado que un algoritmo es una lista precisa de pasos, el orden de ejecución será casi
siempre crítico para su funcionamiento. En general, se asume que las instrucciones
se enumeran explícitamente, y deben ejecutarse “desde arriba hacia abajo”, lo
cual se establece más formalmente según el concepto de flujo de control.
Esta forma de “pensar” el algoritmo asume las premisas del paradigma de programación
imperativa. Dicho paradigma es el más común, e intenta describir las tareas
en términos “mecánicos” y discretos. Los paradigmas de la programación funcional
y de la programación lógica describen el concepto de algoritmo en una forma ligeramente
diferente.

Hasta aquí hemos dado una definición ciertamente informal del concepto de algoritmo.
Para definirlo en forma matemáticamente precisa, Alan Mathison Turing
–famoso matemático inglés (1912-1954), cuyas contribuciones en el campo de la
matemática y de la teoría de la computación le han valido ser considerado uno de
los padres de la computación digital– ideó un dispositivo imaginario al que denominó
máquina de computación lógica (LCM, Logical Computing Machine), pero
que ha recibido en su honor el nombre de máquina de Turing. Lo que confiere a
este supuesto dispositivo su extraordinaria importancia es que es capaz de resolver
cualquier problema matemático, a condición de que el mismo haya sido reducido
a un algoritmo. Por este motivo, se considera que algoritmo es cualquier conjunto
de operaciones que pueda ser ejecutado por la máquina de Turing (o, lo que es lo
mismo, por un sistema Turing completo.




APRENDER WPF




Con la versión 3.0 de .NET se introdujo WPF. Las herramientas
tradicionales funcionan muy bien si únicamente deseamos construir
aplicaciones que usan una forma con varios controles, pero que no
proveen funcionalidades extra al usuario. Si queremos construir una
interfaz de usuario avanzada, con muchos elementos interactivos, es
necesario recurrir a diferentes tecnologías, como GDI+ y DirectX. El
problema reside en que estas no se encuentran
directamente relacionadas entre sí, lo que complica
el desarrollo de la interfaz.







Microsoft estaba consciente de las limitaciones
del modelo anterior para la creación de interfaces
y de la problemática para poder crear el tipo de
interfaz que requieren las nuevas aplicaciones. Por
esta razón, decidió crear WPF, sigla de Windows
Presentation Foundation. Se trata del framework
que Microsoft está recomendando para las nuevas
aplicaciones tanto de escritorio, Silverlight o para
dispositivos móviles. Con WPF, todo lo que necesitamos para construir
interfaces de usuario avanzadas queda unifi cado dentro de un solo
framework. Con él mismo podemos trabajar con controles, gráfi cas 2D y
3D, video, etc. Una de las ventajas que ofrece WPF es el uso de estilos y
templates en los controles, con lo cual podemos cambiar el aspecto de la
aplicación de modo muy rápido y sencillo.





En WPF se busca llevar a cabo una separación entre la forma en que
luce la aplicación y la lógica empleada para controlar dicha aplicación.
Para lograrlo, se hace uso de XAML. XAML nos permite defi nir la interfaz
de usuario; los programadores que trabajan con aplicaciones web lo
encontrarán muy fácil de utilizar. La interfaz defi nida con XAML es,
entonces, controlada con el framework de WPF mediante cualquiera de
los lenguajes .NET; en nuestro caso, C#.
XAML está basado en XML y es un lenguaje declarativo. Con él
podemos defi nir y especifi car características para clases con una
sintaxis basada en XML. Este nos permite hacer cosas como declarar
variables o defi nir propiedades. No es posible defi nir la lógica del
programa con XAML, pero al poder establecer las características
de las clases, lo usamos para defi nir la interfaz de usuario y los
elementos gráfi cos de nuestra aplicación. La lógica se colocará en C#,
y esto es lo que se conoce como code behind.
WPF puede utilizarse para crear diferentes tipos de aplicaciones.
La forma más usual es la creación de aplicaciones para escritorio.
Todas las aplicaciones para desktop que hemos creado con las
herramientas habituales pueden hacerse con WPF, adicionando las
grandes capacidades interactivas de este.



Otro tipo de aplicación es la conocida como XBAP, que corre en
un navegador de Internet. Cuando damos el URI de la aplicación, esta
se descarga en la máquina y se instala. Estas aplicaciones son mucho
más robustas y con mejores interfaces que las páginas tradicionales
de Internet. El navegador funciona, simplemente, como un contenedor,
y lo que se ejecuta es una aplicación WPF dentro de él. El sistema de
navegación del navegador es adoptado por la aplicación.
También es posible crear aplicaciones que se conocen como basadas
en navegación. Son similares a las de desktop, pero corren dentro de
un navegador web y toman sus funcionalidades de navegación. En ellas
creamos varias páginas, dentro de cada una de las cuales tenemos una
sección de la interfaz de la aplicación. Aunque estas aplicaciones lucen
similares a las de la Web, se ejecutan en forma local.






Arquitectura de WPF
Debemos saber que la arquitectura que corresponde a WPF
es sencilla, ya que está constituida por diferentes assemblies.
Estos assemblies pueden ser clasifi cados en tres grupos: la capa
administrada, la capa no administrada y las APIs centrales.
La función de la capa administrada es dar sustento al framework de
WPF y llevar a cabo la comunicación con la capa no administrada. El
assembly más importante de esta capa es PresentationFramework.dll, cuya
función es crear los elementos de alto nivel que usaremos para defi nir
la interfaz de usuario. Estos elementos son los paneles, los controles,
las ventanas, etc. Otro assembly importante es PresentationCore.dll, que
contiene los tipos base más importantes a partir de los cuales se crean
los controles y las fi guras en PresentationFramework.dll; uno de estos tipos
es UIElement. Un tercer assembly que debemos conocer es WindowsBase.
dll, que también contiene elementos importantes, cuya característica es
poder ser utilizados por afuera del ambiente de WPF.

La capa no administrada también es conocida como milcore,
acrónimo para Media Integration Library code. Esta capa se encuentra,
principalmente, en el assembly milcore.dll. WPF utiliza Direct3D para llevar
a cabo todas las funciones de dibujo. Esto lo hace mucho más rápido y
efi ciente en el dibujo de las interfaces que la metodología tradicional.
La capa no administrada se dedica a traducir los objetos de alto nivel
a objetos que puede utilizar directamente. Es el lugar donde se realiza
todo el proceso de renderizado de la interfaz. WindowsCodecs.dll contiene
diversos códecs que son empleados en la parte gráfica ca, especialmente,
aquellos relacionados con gráfica cas vectoriales.
En las APIs centrales tenemos una colección que provee a WPF de
las funcionalidades necesarias para efectuar su trabajo. WPF se apoya
en estas APIs, y eso nos facilita el trabajo. Dentro de ellas tenemos a
Direct3D, usado para la parte baja y de renderizado en WPF; también
es aprovechado gracias a la aceleración por hardware que ofrece. Para
la parte de administración de memoria y de los diversos procesos que
componen la aplicación, se usa User32..








LENGUAJES DE PROGRAMACIÓN



La base del entendimiento entre dos o más individuos está dada por la normalización
de sus expresiones y actitudes: para que un hombre comprenda lo que otro le
está diciendo debe compartir un mismo código gestual y verbal, debe compartir un
mismo idioma. Al incursionarnos en el universo de las computadoras, observamos
que el único lenguaje que éstas realmente comprenden es el binario. Cuando se comunican
entre sí, se entienden perfectamente; ambas comprenden lo que significan
aquellas cadenas de ceros y unos prácticamente indescifrables para el hombre. El
problema surge en el momento que una persona intenta darle una instrucción.
Veamos el caso de un programador que está desarrollando una consola de sonido.
Él precisa que se reproduzca una determinada canción robotech_sdf1.mp3 cuando
el usuario presione en un área determinada, lo que significa asignarle un código similar
a éste para que la tarea se desencadene:



0111 0010 1010 0111 0001 1111 1110 1001 0001 0100
0010 1010 0111 0001 1111 0111 0010 1010 0111 0101






Si la manera de indicarles a las computadoras cómo comportarse estuviera basada
únicamente en este lenguaje binario, podríamos contar con los dedos quiénes serían
los individuos capaces de “hablar” efectivamente con ellas. El hombre no se comunica
con ceros y unos, no los comprende... y jamás lo hará. Es por ello que desde
los inicios de la era digital surgió la necesidad de generar nuevos idiomas que actúen
más cerca del territorio lingüístico conocido por el programador. Ellos son los
famosos lenguajes de programación.
Estos lenguajes consisten en verdaderos “traductores” que traspasan un idioma amigable
para el individuo en aquellos tediosos ceros y unos necesarios para que la computadora
opere. Este proceso de traducción puede hacerse mediante un compilador,
un intérprete o con una combinación de los dos. Existen cientos de lenguajes de
programación que, según su cercanía al lenguaje binario, se dividen en cuatro grandes
grupos, que veremos en detalle a continuación:



• Lenguaje de máquina o binario: es aquel que la computadora comprende sin
necesidad de realizar conversión alguna. Su escritura resulta extremadamente difícil
para el mayor porcentaje de programadores, y prácticamente ya nadie lo utiliza.
Por otro lado, cada tipo de procesador tiene su propio lenguaje máquina (su
propio juego de instrucciones), de manera que un programa ejecutable que corre
en una computadora equipada con un procesador Pentium no podría correr, por
ejemplo, en un Apple Power Macintosh.




• Lenguaje de bajo nivel: también conocido como ensamblador, representa un
paso hacia la humanización de los lenguajes de programación. Consta de un complejo
repertorio de palabras nemotécnicas (tales como add para la suma o sub para
la resta) que simplifican parcialmente la comunicación entre el programador y
la computadora. Se trata de un lenguaje realmente robusto que actúa prácticamente
a la par del lenguaje binario.

MOV AX, A
ADD AX, B
MOV C, AX







• Lenguaje de medio nivel: posee un diccionario de comportamientos/instrucciones
que consta de palabras similares a aquellas conocidas por los hombres (include,
define, if). Goza del equilibrio ideal entre simpleza y potencia: una variada gama
de posibilidades para trabajar directamente con la computadora y una escritura capaz
de ser comprendida por el hombre. En este grupo se destaca el lenguaje C.







• Lenguaje de alto nivel: es el de mayor entendimiento para el hombre. Escribir una
aplicación con este lenguaje resulta mucho más ágil y sencillo que con los de niveles
anteriores. La mayoría de ellos forjaron sus cimientos en base al lenguaje C, si
bien no logran la “directa comunicación” que posee este último con la computadora.
Destacados: C++, Java, Pascal, Eiffel, Clipper, Ada, Smalltalk, Visual
Basic, Delphi, FoxPro, JAVA y Actionscript.