lunes, 22 de noviembre de 2010

Apuntadores

Los apuntadores  o punteros son unas de las características mas poderosas del lenguaje de programación ANSI C y a su vez podemos decir que una de las herramientas mas difíciles de dominar en el lenguaje.

Debemos mencionar que para tener un buen nivel en la programación o por lo menos pasar a un siguiente nivel es necesario tener un buen conocimiento sobre punteros, ya que con ellos podemos realizar infinidad de cosas como por ejemplo en los programas simular llamadas por referencias, crear y manipular estructuras de datos dinámicas (las que cambian su tamaño durante su ejecución), tales como listas enlazadas, colas, pilas y arboles.

Los apuntadores son variables que contienen direcciones de memoria como sus valores.Por lo regular una variable contiene directamente un valor especifico. Un apuntador, por otra parte, contiene la dirección de una variable que contienen un valor especifico. Un apuntador por otra parte, contiene la dirección de una variable que contiene un valor especifico. En este sentido, un nombre de variable se refiere directamente a un valor y un apuntador se refiere indirectamente a un valor.El referirse a un valor a través de un apuntador se le conoce como indirección.
Los apuntadores como cualquier otra variable, deben ser declarados antes de ser utilizados. La declaración

int *countPtr, count;

declara la variable countPtr siendo del tipo int, o bien “countPtr” apunta a un objeto del tipo entero”. También, la variable count se declara como un entero, no un apuntador a un entero. El símbolo * solo se aplica a countPtr en la declaración. Cuando el * se utiliza de esta forma en una declaración, indica que la variable que se esta declarando es apuntador. Los apuntadores pueden ser declarados para apuntar a cualquier tipo de datos.
La siguiente imagen muestra el ejemplo de una referenciacion directa o indirecta de una variable.
image 
Los apuntadores deben ser inicializados cuando son declarados o en un enunciado de asignación. Un apuntador puede ser inicializado a 0, Null o a una dirección. Un apuntador con el valor NULL no apunta a nada. Null es una constante simbólica, definida en el archivo cabecera de stdio.h Cabe mencionar que al inicializar un apuntador  con 0, es equivalente a inicializar un apuntador a NULL, pero es importante mencionar que para este caso es preferible utilizar Null. El valor 0 es el único valor entero que puede ser directamente asignado a una variable de apuntador.

Operadores de un puntero:
El & conocido como operador de dirección, es un operador unario que regresa la dirección de su operador. Por ejemplo, suponiendo las declaraciones
int y = 5;
int*yPtr
El enunciado yPtr = &y
asigna la dirección de la variable “y” a la variable de apuntador yPtr. La variable yPtr se dice entonces que “apunta a ”. La siguiente figura muestra una representación:donde podemos ver como un apuntador  “apunta ” a una variable entera.

image


Apuntadores a funciones:
Los apuntadores a funciones son quizá uno de los usos más confusos de los apuntadores en C. Los apuntadores a funciones no son tan comunes como otros usos que tienen los apuntadores. Sin embargo, un uso común es cuando se pasan apuntadores a funciones como parámetros en la llamada a una función.
El siguiente programa, muestra como calcular el cubo de cualquier numero mediante funciones, en la primera utiliza llamadas a funciones por valores, y la segunda utiliza llamadas a funciones por parámetros, estos últimos utilizan los apuntadores.
image

image

Los programas anteriores presentan dos formas de elevar un numero al cubo mediante funciones, en este caso las funciones cubeByValue y cubeByReference.
El primer programa pasa la variable number a la función cubeeByvalue, utilizando una llamada por valor. La función cubeByReference toma eleva al cubo su argumento y pasa su nuevo valor de regreso a main, utilizando el enunciado return. El nuevo valor se asigna a la variable number que se encuentra en main.

El segundo programa que hace exactamente lo mismo, pero en este caso este utiliza parameros por referencia, trabaja así: pasa la variable number utilizando una llamada por referencia(apuntador a la variable number) a la funcion cubeByReference. La funcion cubeByReference toma un apuntador a int conocido como nPtr como argumento. La funcion dereferencia el apuntador y eleva al cubo el valor hacia el cual apunta nPtr. Esto cambia el valor de number dentro de main.



Referencias:
http://www.fismat.umich.mx/mn1/manual/node11.html
Como programar en c/c++-Deitel-Deitel-Editorial PEARSON.

El esquema de programación Multiparadigma.

Bueno y que decir, se termino el semestre!, en todo este tiempo conocimos muchas cosas nuevas, por mencionar algunas que es la programación, y en si que es un paradigma de programación, entre muchas otras cosas.

En mi primer articulo en el blog, si bien recuerdo el paradigma de programación  lo definíamos como un conjunto de técnicas de programación para poder escribir de la mejor manera posible nuestros programas.

En todo el curso conocimos que dichas técnicas de programación, nos facilitan realmente el problema a tratar de resolver.
Por ejemplo conocimos lo que eran los paradigmas imperativos, funcionales, lógicos y orientados a objetos.
Y la verdad es que cada uno de ellos es bueno para el determinado problema que se nos presente.

Ahora un punto interesante.¿Podemos utilizar las cualidades de todos esos paradigmas, para resolver un problema en especifico? Por supuesto que si!, la programación sigue creciendo a pasos agigantados y siempre será necesario que nosotros también estemos al día y no quedarnos como vagamente se diría “quedarnos obsoletos”.

Volviendo al tema, claro que si!. Nosotros podemos aplicar técnicas de  varios paradigmas de programación para resolver determinado problema, e incluso hoy en día existen lenguajes dedicados para ese propósito, como lo es el caso de Go y OZ por mencionar algunos.
Cabe mencionar que muchos lenguajes modernos, también incorporan elementos de varios paradigmas de programación. Es mas no vallamos muy lejos, si recordamos casi al principio del curso conocimos lo que eran los lenguajes Script o lenguajes interpretados. Estos lenguajes poseen características de varios paradigmas.

El principal propósito de este paradigma , es permitir  a los programadores utilizar las mejores herramientas de trabajo,  si lo vemos desde este punto de vista, ningún paradigma de programación nos  va resolver los problemas de la forma mas fácil y eficiente posible. Hay que saber utilizar todas las herramientas disponibles y saber en donde aplicarlas.
En cuestiones de herramientas disponibles, tenemos a nuestro alcance el lenguaje de programación Oz que como ya mencione anteriormente, este incorpora características de varios paradigmas.

El lenguaje Oz fue diseñado para hacer un avance moderno para las aplicaciones concurrentes , inteligentes , de redes , tiempo real , paralelismo , interactivas y reactivas de la misma forma para resolver aplicaciones complejas robusta y rápidamente. Sin mencionar que oz contiene una forma simple y bien hecha de la mayoría de los conceptos de los principales paradigmas de programación, mencionados anteriormente.
Como Oz trabaja con muchos de los conceptos de los paradigmas de programación, es importante señalar que en el lenguaje existe una jerarquía entre sus tipos de datos. El siguiente esquema lo muestra de una manera mas clara:

oz

Algunos de ellos ya los conocemos, porque los hemos utilizado antes, otros tantos son del lenguaje mismo..
Oz al ser un lenguaje tan completo,  también posee entre sus características esquemas de la programación concurrente, es decir a un conjunto de procesos o hilos de ejecución creados por un único programa, por ejemplo la característica principal de la programación concurrente es la simultaneidad en la ejecución de múltiples tareas interactivas.
Podemos mencionar que en oz la concurrencia es muy eficiente y económica. Es decir puede generar miles de procesos en muy poco tiempo de ejecución a comparación de otros lenguajes de programación.

Bueno estas son las principales cualidades que podemos apreciar en un lenguaje de este tipo de paradigma.
La verdad me hubiera gustado poner algún ejemplo en donde se viera aplicado el lenguaje, pero me resulto muy difícil ya fue poca la información que me encontré, pero como mencione anteriormente, este lenguaje lo podemos ver aplicado a la programación de sistemas distribuidos y paralelos.

Compañeros, espero les sea de agrado esta entrada, otra cosa importante que me gustaría expresar es que no porque ya se halla terminado el semestre y esta unidad de aprendizaje halla finalizado, dejemos en el olvido todos nuestros blogs personales. Si tienen la posibilidad de seguir publicando háganlo ;) si al estar practicando descubren algo nuevo o hagan algo interesante, compártanlo con todos nosotros ;) estoy seguro que una gran parte de nosotros mostrara un intereses a todo lo nuevo que hagan.
Muchos saludos =)

Practicando en C++.(extra)

Bueno me pareció interesante incluir algunos de los primeros programas que escribir en C++, si a alguien les puede servir de algo adelante ;)

Aclaro lo siguiente,  como fueron de los primeros programas que escribí en C++, este programa no sigue el esquema de la programación orientada a objetos, ya que utiliza C++ como si fuese C normal, salvo por algunas librerías, si les puede servir de referencia para comenzara a escribir en C++, adelante ;)

El programa lo que hace es convertir kilómetros a millas.

El código fuente es el siguiente:

Pantallazo

y la ejecución del mismo es la siguiente:

Pantallazo-1

Ojala y les sea útil ;)

domingo, 21 de noviembre de 2010

Paradigma de programacion Imperativo.

Me tarde un poco en subir este reporte pero aquí esta ;) bueno si recordamos las características  que resaltan de este paradigma, son los programas que se conforman principalmente de oraciones o conjunto de instrucciones que le indican a la computadora que instrucciones realizar. Los elementos más importantes de este paradigma son las variables, los tipos de dato, expresiones y estructuras de control. Los lenguajes que siguen este modelo de programación son: C, FORTRAN, ALGOL, Pascal y Cobol.

Para este reporte había que elegir algunos lenguajes de programación de dicho paradigma, en mi caso yo elegí los lenguajes C, PASCAL y FORTRAN.

Lenguaje de programación ANSI C.

El primer programa es en lenguaje C, es la solución de una ecuación de segundo grado.El código fuente es el siguiente:

codigo fuente1

A diferencia de otras implementaciones con las que me he topado, quise realizar este programa mediante funciones, en donde se declara varias funciones para el calculo de las raíces y el calculo del discriminante, posteriormente en el programa principal se llama a la función correspondiente según sea el caso.

Dándole valores específicos para probar las tres posibles soluciones, podemos ver la ejecución del programa:

0001

0002

00003

Lenguaje de programación PASCAL.

El siguiente programa es mas sencillo que el anterior, pero utiliza características resaltantes del paradigma, en este caso se enfoca mas a sentencias de selección.

El programa que realice en PASCAL se enfoca un poco al área del electromagnetismo, se trata de un programa que resuelve la Ley de OHM. Utiliza un Switch para elegir el tipo de calculo que queramos realizar, en este caso para calcular voltaje, corriente y resistencia.

pascal01

La ejecución del programa, probando las tres diferentes opciones:

pascal ejecucion ohm

Lenguaje de programación FORTRAN.

En este lenguaje quise hacer uso de un bucle repetitivo, algo parecido a lo que en ANSI C se conoce como bucle for. El programa se encarga de pedir 15 salarios de un trabajador, posteriormente este mostrara la suma de esos elementos, claro solo utilizando el bucle repetitivo.

En si el programa es muy sencillo, pero espero que sirva para quienes se adentren al estudio del lenguaje y comprendan como se implementa este bucle repetitivo en FORTRAN.

El código fuente es el siguiente:

FORTRAN1

La ejecución del programa es la siguiente:

FORTRAN2

Espero que esta entrada sea de su agradado =)

 

Referencias.

Manual de C.

Breve manual de FORTRAN

ttp://www.learn-programming.za.net/

5 grandes preguntas a 5 grandes programadores.

Hace un rato, buscando información para terminar unos artículos pendientes, caí en un interesante blog, en donde hacen una traducción de un articulo en ingles, en donde entrevistan a 5 programadores reconocidos.

Entrevistan a programadores como Linus Torvalds (autor de núcleo Linux), Guido Van Rossum (creador de Phytom), Bjarne Stroustrup (Creador de C++) James Gosling(creador de Java) y Peter Norvig (Director de desarrollo de Google.)

El articulo original en ingles se encuentra en la pagina:

http://www.stifflog.com/2006/10/16/stiff-asks-great-programmers-answer

La traducción en español se encuentra en el siguiente blog:

http://www.logadmin.net/2008/09/5-gran-preguntas-5-de-los-grandes.html

Es un blog el cual lleva por nombre "El blog de un administrador de Sistemas", tiene artículos muy interesantes acerca de muchas herramientas de software, artículos sobre como podría ser el campo laboral en la programación entre muchas otras cosas interesantes.

Retomando a la entrevista, están interesantes las respuestas que ellos nos dan, nos explican como llegaron al lugar en el que se encuentran, si realmente la Universidad les sirvió de algo, si las matemáticas y las físicas también tienen importancia en la programación entre otras cosas.

Les sugiero ampliamente que si lo pueden leer lo hagan ;)

Referencias:

http://www.stifflog.com/2006/10/16/stiff-asks-great-programmers-answer

"El blog de un administrador de Sistemas",

http://www.logadmin.net/2008/09/5-gran-preguntas-5-de-los-grandes.html

Problemas de compilación con Gfortran. (extra)

Hace un rato que estaba trabajando en el lenguaje de programación Fortran, me surgió un problema interesante el cual creo que vale la pena analizarlo, por si alguien mas le sucede lo mismo.

Bueno cuando según yo termine de escribir el código de mi programa, al querer compilarlo en la terminal utilizando el comando:

guillermo@guillermo-desktop:~$  gfortran  hola.f

Me aparecieron una lista de errores en el código, y siendo que el programa era bien sencillo (un típico “hola mundo” en Fortran). El error fue fue el siguiente:

Pantallazo

El código del programa contiene lo siguiente:

PROGRAM HOLA
   PRINT *, '¡Hola, mundo!'
END

En si al analizar el código, el programa anterior no recae en errores de sintaxis ni nada por el estilo. Esto también ocurría con cualquier otro código.

Al investigar acerca de este error, en los foros dedicados a Ubuntu, encontré que al parecer esto error se debe a las distintas versiones que existen de Fortran.

En este caso Fortran entre su muchas versiones, podemos encontrar las extensiones .f, .for, .f90, .f95. En Windows comúnmente es utilizada la extensión .for y en sistemas Unix es la extensión .f.

Volviendo al tema, se comentaba en los foros de Ubuntu, que un posible problema se debe a que el código aunque este bien escrito, muchas veces estemos utilizando una versión 90 o 95 de Fortran, lo que debemos hacer es  cambiar la extensión del archivo a .f90. Esto según ya que Fortran compila el código del archivo como código de fortran 77, que funciona un poco diferente a Fortran 90.

En dado caso que tampoco les llegue a funcionar lo anterior (como fue mi caso) hay que recurrir a las opciones de compilación de gfortran.

En este caso para compilar ese archivo debemos utilizar la siguiente instrucción :

–ffree-form

Añadiéndola a la instrucción para compilar nuestro código quedaría así:

guillermo@guillermo-desktop:~$  gfortran  –ffree-form  hola.f

y lo ejecutaríamos así:

guillermo@guillermo-desktop:~$ ./a.out

con esto se resolvería el problema de compilación , si es que les llega a ocurrir esto ;)

La siguiente captura muestra como si se resolvió el inconveniente ocurrido:

 

2

Ojala y les pueda servir de algo ;)

Referencias Recomendadas:

 http://ubuntuforums.org/showthread.php?t=1164769

http://gcc.gnu.org/wiki/GFortranUsage

http://www.file-extensions.org/

 

 

Primeros pasos en la Programación Orientada a Objetos. Comenzando a escribir Clases en C++

En mi entrada anterior publique una reseña acerca de la Programación Orientada a Objetos y observamos como de las Clases se derivan Objetos, o mejor dicho instancias de las clases.

En esta entrada daremos los primeros pasos a la programación orientada a objetos utilizando el lenguaje C++. Cabe destacar que esta entrada mostraremos ejemplos simples sobre como podemos comenzar a escribir programas usando la metodología de la programación orientada a objetos.

En esencia, una clase en C++ es una estructura , que en ANSI C se conoce como struct con algunas ventajas sencillas pero muy potentes.

Declaración de clases

Para declarar una clase, todo lo que se necesita es escribir una definición de estructura y sustituir la palabra reservada struct por class. Por ejemplo, en nuestro caso vamos a escribir una clase a la que llamaremos “Empleado” con los algunos campos como el nombre, departamento, posición y función para posteriormente nos imprima la información de este.Nos quedaría de la siguiente forma:

class Empleado{

char* m_nombre;
char* m_departamento;
char* m_posición;
long m_salario;
void Imprimir( Empleado infoEmpleado);

}

Un dato curioso es que cuando nosotros declaramos una clase en C++, no se reserva memoria para la clase hasta que nosotros creamos un objeto de la clase. Como comente anteriormente crear un objeto de una clase se le llama instancia de la clase.

Veamos un ejemplo utilizando la estructura anterior: Por ejemplo podemos crear una instancia o un objeto de la clase Empleado con el valor de m_nombre=Guillermo, m_departamento=Sistemas, m_posición=programador y m_salario=3000 por mencionar un ejemplo.

En la programación orientada a objetos con toparemos con lo que comúnmente se conocen como especificadores de acceso, pero ¿Que son los especificadores de acceso?

Los especificadores de acceso permiten acceder a algunos miembros de la clase y restringir el acceso a otros.

C++ utiliza especificadores de acceso para permitir controlar a una clase el acceso a las variables de datos de esa clase

Hay tres especificadores de acceso en C++, los cuales son: public, private y protected

  • Un miembro público significa que el acceso al mismo puede darse dentro del interior de la clase, dentro de una subclase, y desde un objeto instanciado de cualquiera de estas.
  • Un miembro privado significa que el acceso al mismo puede darse solamente dentro del interior de la clase que lo posee. Normalmente, el programador creador de una clase declara a los atributos de la clase como privados y a los métodos como públicos, esto con la idea de que el usuario de la clase no pueda tener acceso a los atributos sino es atreves de los métodos definidos para el caso.
  • Un miembro protegido se comporta de manera parecida a un miembro privado, salvo que estos son accesibles dentro de la clase que lo posee y desde las clases derivadas, pero no desde los objetos instanciados a raíz de dichas clases.

Veamos un ejemplo utilizando la clase anterior:

 

class Empleado {
    private:
        char* m_nombre;
        char* m_departamento;
        char* m_posicion;
        long m_salario;
    public:
        void ImprimirInfo();
        void SetNombre( char* nombre ) { m_nombre = nombre }
        void SetDepartamento( char * departamento) { m_departamento = departamento }
        void SetPosicion ( char* posicion ) { m_posicion = posicion }
        void SetSalario ( long salario ) { m_salario = salario }
        const char* GetNombre( ){ return m_nombre }
        const char* GetDepartamento( ){ return m_departamento }
        const char* GetPosicion( ){ return m_posicion }
        const char* GetSalario( ){ return m_salario }
};

Las funciones SetNombre, SetDepartamento, setPosicion, setSalario, GetNombre, GetDepartamento, GetPosicion y GetSalario  se denominan funciones intercaladas, que son funciones que se declaran en una sola línea.
Las variables de miembro son declaradas privadas para que funciones de miembro de otras funciones no tengan acceso a ellas sino a través de la correspondiente función Get o Set. Las funciones de miembro si son declaradas públicas de tal modo que se pueda acceder a ellas desde otras funciones.
La definición de la función PrintInfo puede quedar así:

void Empleado::ImprimirInfo( )
{
   cout << "Nombre: " << m_nombre << '\n';
   cout << "Departamento: " << m_departamento << '\n';
   cout << "Puesto: " << m_posición << '\n';
   cout << "Salario: " << m_salario << '\n';
}

Los dos dos puntos ( :: ) se denomina operador de resolución de ámbito. Nos indica que la función que estamos definiendo que en este caso es ImprimirInfo, pertenece a la clase Empleado.
La tercera parte es la función main. Veamos como podría ser:

void main()
{
    //creacion de un objeto de la clase Empleado
    Empleado empleado12;
    //asignacion de valores a las variables miembro
    empleado12.SetNombre("Guillermo");
    empleado12.SetDepartamento("Sistemas");
    empleado12.SetPosicion("Programador");
    empleado12.SetSalario(3000);
    //impresión de los datos
    empleado12.ImprimirInfo();
}

Entonces, primero en : Empleado empleado12;
Se instancia un objeto de la clase Empleado con nombre empleado12. Entonces empleado12 tiene la estructura de la clase Empleado.
Luego, en las líneas siguientes a la instanciación del objeto, se le asignan los valores iniciales a sus variables:


    //asignacion de valores a las variables miembro
    empleado12.SetNombre("Guillermo");
    empleado12.SetDepartamento("Sistemas");
    empleado12.SetPosicion("Programador");
    empleado12.SetSalario(3000);


Finalmente se llama ImprimirInfo para imprimir el contenido de las variables:
        //impresion de los datos
    empleado12.ImprimirInfo();

que lo que hará es imprimir el valor de las variables en la pantalla.
Permitir el acceso a las variables solo a través de funciones, que en la mayoría de los casos se llaman SetXxx y GetXxx, se llama encapsulación de datos. Las funciones que necesitan valores de otra clase, llaman a las funciones que les dan acceso y obtienen estos datos sin conocimiento de detalles específicos de como se manipulan los datos.

Hasta este punto podemos comenzar a definir las clases en nuestros programas, un dato importante es que la forma de comenzar a escribir programas en el paradigma orientado a objetos se basa principalmente en escribir las definiciones de las clases.

Espero sea de su agrado esta entrada =)

Referencias recomendadas:

Como programar en C/C++ y Java-Harvey M. Deitel Editorial PEARSON, 4a Edición.

http://dis.unal.edu.co/~fgonza/courses/2003/poo/c++.htm

http://dis.unal.edu.co/~fgonza/courses/2003/poo/c++.htm

http://www.dcp.com.ar/poo/poop1.htm

http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C%2B%2B/Objetos_y_Clases