Fundamentos de programación/Texto completo

De Wikilibros, la colección de libros de texto de contenido libre.
Esta es la versión para imprimir de Fundamentos de programación.
  • Si imprimes esta página, o eliges la opción de Vista preliminar de impresión de tu navegador, verás que desaparecen este cuadro y los elementos de navegación de arriba y de la izquierda, pues no son útiles en una versión impresa.
  • Pulsando antes en Refrescar esta página te asegurarás de obtener los últimos cambios del libro antes de imprimirlo.
  • Para más información, puedes ver Wikilibros:Versión para imprimir.


Fundamentos de programación
por es.wikibooks.org


Introducción

Versión para imprimir esta pagina

¡Bienvenido a este libro!. Nuestro objetivo fundamental es proveer a los lectores de un manual que cubra los aspectos esenciales del maravilloso mundo de la programación de ordenadores. En este libro se estudiarán los fundamentos de la algoritmia: la ciencia y arte de diseñar algoritmos para la resolución sistemática de problemas de cualquier índole.

Aun cuando el lector no tenga una experiencia previa en la programación de ordenadores, es seguro que a lo largo de su vida ha ejecutado muchos algoritmos. Un algoritmo es la especificación detallada de los pasos necesarios para llevar a cabo una tarea específica. En la escuela, por ejemplo, aprendimos una serie de pasos para realizar sumas, restas, multiplicaciones y divisiones, estos son algoritmos (de hecho debemos la palabra 'algoritmo' al matemático musulmán Muhammad ibn Musa al-Jwarizmi). Una receta de cocina es uno de los ejemplos más claros de algoritmo. El conjunto de trámites que debe realizar en cualquier institución pública para la expedición de un documento, como por ejemplo, la licencia de conducir, también es un algoritmo. En este libro, vamos a enseñar los fundamentos básicos para crear programas. Un programa es un algoritmo hecho para ser ejecutado por un ordenador.

La algoritmia es una ciencia: está sustentada en un conjunto de modelos matemáticos. Existen una cantidad de técnicas que han sido ampliamente estudiadas por los científicos de la computación para resolver problemas que aparecen en diversas áreas de la ciencia. Por ejemplo, la traducción de lenguajes, la clasificación y ordenación de datos, los algoritmos para cifrado y el cálculo numérico, son algunas de las áreas donde aún en la actualidad, se mantiene muy activa la investigación de nuevas técnicas y el desarrollo de algoritmos y programas más eficientes.

La algoritmia también es un arte, pues la creación de un algoritmo requiere de grandes dosis de heurística y creatividad. La creación de un programa va a estar muy influida por factores externos al modelo matemático, como por ejemplo, el lenguaje de programación que se va a usar, las limitaciones físicas que imponen los ordenadores o incluso los plazos para la finalización de un proyecto. Por otro lado, muchos programadores buscan un aspecto estético en la realización de sus programas; para esas personas, escribir programas es un ejercicio semejante a hacer literatura.

Por los motivos expuestos anteriormente, pretendemos en este libro mostrar ambos aspectos de la algoritmia: por un lado, se presentarán técnicas que ya son clásicas en la programación, y por otro lado, se intentará mostrar los problemas que pueden surgir al convertir la especificación del algoritmo en un programa que se ejecute satisfactoriamente. Una analogía muy ilustrativa es la de comparar un algoritmo con una receta de cocina, mientras que el programa sería análogo al plato preparado siguiendo dicha receta. Si usted es un cocinero novato, aun cuando tenga la receta de cocina en su mano y siga metódicamente todos sus pasos, puede encontrar que al final el plato no es todo lo apetitoso que usted desea, es ahí donde entra en juego el arte, la capacidad de innovar y refinar la receta con un toque personal. Así como esa capacidad de integrar la parte científica y técnica con la parte artística hace la diferencia entre el cocinero novel y el chef más avezado; también la hace entre un programador principiante y un experto. Esperamos que las recetas que usted consiga en este libro le sean muy útiles como base para crear las suyas propias.

Hay que hacer una advertencia inicial al lector: este libro por sí solo no pretende, ni puede ser una obra completa para la enseñanza de la programación. El lector debe complementar el estudio de la algoritmia, con el estudio de uno o varios lenguajes de programación. Le recomendamos encarecidamente que realice todos los algoritmos presentados en este libro, usando su lenguaje de programación favorito. Para el aprendizaje de los lenguajes de programación más populares, le sugerimos consultar (y por qué no, también colaborar con) los otros wikilibros de programación.

Finalmente, invitamos al lector a practicar: la única forma de aprender a nadar, es lanzarse al agua y nadar. Se tratará de incluir, en medida de lo posible, ejercicios al final de cada sección. Al final de cada capítulo se sugerirán algunos proyectos de programación que puede realizar. La realización de estos proyectos es beneficiosa por varios motivos: primero, ayudará a afianzar los conocimientos adquiridos en cada sección; segundo permitirá aplicar las técnicas estudiadas en problemas prácticos, y tercero: la programación puede convertirse en un hobbie que brinda muchas satisfacciones.

En sus inicios, la programación de computadoras se basó exclusivamente en el modelo imperativo (también denominado procedimental), que semeja más la forma en que la máquina maneja las instrucciones u órdenes.

Conforme la programación de computadoras fue utilizándose para resolver nuevos tipos de problemas, se requirió la creación de nuevos modelos o paradigmas para el desarrollo de las aplicaciones.

La programación orientada a objetos es una forma de concebir un programa de computadora. Se puede pensar en un programa como una lista de instrucciones que le indica a la computadora qué hacer, o un paquete de pequeños programas que responden a eventos específicos indicados por la entrada del usuario.

La programación orientada a objetos ve a un programa como un conjunto de objetos que cooperan entre sí para resolver un problema.

El modelo orientado a objetos sirve para desarrollar sistemas de software con un alto grado de complejidad. Este modelo es tan importante que se creó el OMG (Object Management Group, Grupo de Administración de Objetos, una agrupación no lucrativa) para establecer las normas que rigen el desarrollo de software orientado a objetos.

En el resto de este libro se estudiarán los conceptos en que se basa el modelo orientado a objetos, así como las principales razones para utilizarlo en el desarrollo de software.

Algoritmos y programas

Versión para imprimir esta pagina

¿Qué es un algoritmo?

Por algoritmo, se entiende a un conjunto finito de instrucciones que se deben seguir para resolver un problema. No obstante, desde el punto de vista de la programación de ordenadores, la definición del algoritmo como la especificación de una serie de pasos, es incompleta. Debe observarse que los ordenadores son equipos que tienen limitaciones físicas en cuanto a capacidad de almacenamiento y procesamiento. Por consiguiente debemos refinar un poco más nuestra definición de algoritmo para hacerla aplicable de manera efectiva en el ámbito de la informática.

El algoritmo es un conjunto de pasos, instrucciones o acciones que se deben seguir para resolver un problema. Existen una gran cantidad de algoritmos, hay que escoger el más efectivo. Hay dos tipos de algoritmos que son los cualitativos y cuantitativos, cualitativos son todos aquellos pasos o instrucciones descritos por medio de palabras que sirven para llegar a la obtención de una respuesta o solución de un problema, y cuantitativos son todos aquellos pasos o instrucciones que involucran cálculos numéricos para llegar a un resultado satisfactorio.

Características:
  • Tiene que ser preciso.
  • Tiene que estar bien definido.
  • Tiene que ser finito.
  • La programación es adaptar el algoritmo al ordenador.
  • El algoritmo es independiente según donde lo implemente.


Definición: Un algoritmo se entiende como una sucesión finita de pasos que debe cumplir las siguientes especificaciones:

  • Cada paso del algoritmo debe estar bien definido: Esto significa que la definición de un paso debe ser suficientemente clara, para que una persona pueda entenderla y realizarla. Si bien no se puede dar un criterio determinístico para decidir si un paso está bien definido, debemos apelar al sentido común para decidir que un paso está especificado sin ambigüedades.
  • Un algoritmo debe tener un principio y un fin: Un programa es un algoritmo escrito con un objetivo: conseguir un resultado. No tiene sentido crear un programa que espere ~ segundos (infinitos segundos) y luego escriba en pantalla "Hola Mundo!", del mismo modo que un algoritmo debe tener un principio bien definido (tampoco tiene sentido el algoritmo "haz nada, y luego escribe Hola Mundo!")


Modelos computacionales 

Un modelo computacional, es un modelo matemático en las ciencias de la computación que requiere extensos recursos computacionales para estudiar el comportamiento de un sistema complejo por medio de la simulación por computadora. El sistema bajo estudio es a menudo un sistema complejo no lineal para el cual las soluciones analíticas simples e intuitivas no están fácilmente disponibles. En lugar de derivar una solución analítica matemática para el problema, la experimentación es hecha con el modelo cambiando los parámetros del sistema en la computadora, y se estudian las diferencias en el resultado de los experimentos. Las teorías de la operación del modelo se pueden derivar/deducir de estos experimentos de computacionales.

Ejemplos de modelos de computacionales comunes son modelos del pronóstico del tiempo, modelos del Earth Simulator, modelos de simulador de vuelo, modelos de plegamiento molecular de proteínas, y modelos de red neuronal.

Se considera a los algoritmos al conjunto de pasos ordenados, que permiten resolver un problema bajo una secuencia lógica, es decir, que tenga inicio y fin (sentido concreto).

Programas: Algoritmos para ser ejecutados por un ordenador

Un ordenador o computadora está, desde que se enciende hasta que se apaga totalmente, ejecutando un algoritmo. Por lo general, estos algoritmos, escritos para que los entienda una máquina, terminan siendo vagos y confusos para la mayoría de quienes no han estudiado programación. Una máquina no puede entender "escribe Hola Mundo!" porque no sabe lo que es "escribe" ni lo que es una letra o un espacio, ni lo que es una pantalla. En cambio, puede entender "mov eax, 0x23afb31" (escribir en el registro eax el número 0x23afb31), aunque nosotros no. Un ordenador es solo un circuito electrónico, no funciona a base de magia ni nada por el estilo.

Debido a lo difícil que es escribir en lenguaje máquina, e incluso en ensamblador, se crearon diferentes lenguajes de programación, más o menos parecidos al inglés actual y a cómo se redacta un algoritmo. Estos lenguajes proveen de cosas tan complejas para una máquina como los bucles for. Los compiladores se encargan de traducir esos ficheros al lenguaje ensamblador que corresponda, el ensamblador de traducirlos a lenguaje máquina y el enlazador de juntar todo ese código máquina en un solo archivo, el programa. Y el microprocesador, se encarga de ir encendiendo o apagando transistores según lo que le diga el código máquina.

Es fácil entender el lenguaje de alto nivel en comparación al lenguaje máquina pero de la evolución surgieron.

¿Qué instrucciones ejecuta un ordenador?

Lenguaje de máquina

Cada tipo de microprocesador contiene un conjunto de instrucciones que realizan ciertas operaciones sobre una o más palabras de bits; las instrucciones van también codificadas en bits. No queremos hacer aquí una discusión sobre arquitectura de ordenadores, por lo que con esto debe valer por ahora.

Se entiende que escribir sólo con dos teclas, el 0 y el 1, es incómodo. Históricamente, a la hora de diseñar un algoritmo para que el ordenador ejecutara, se escribía mediante unas etiquetas mnemotécnicas; éste fue el origen del lenguaje ensamblador.


Por ejemplo quizás en una cierta arquitectura la instrucción de borrado de memoria (Memory Clear, en inglés) corresponda al código 010. Pronto surgieron programas que leían, siguiendo el ejemplo, MC, y lo sustituían por 010.

Lenguaje ensamblador

El código máquina tenía dos grandes inconvenientes para los programadores:

  • las instrucciones eran difíciles de recordar, ya que no guardaban relación con la operación que se está realizando.
  • puede haber, y de hecho hay, diferencias entre las instrucciones de un procesador a otro.

Todo esto ha llevado a "poner nombre" a las instrucciones de código máquina de manera que a una secuencia concreta de bits que realiza una operación se le pone un nombre sencillo que identifique la operación. Esta traducción a un lenguaje más sencillo para las personas resulta en una mayor comodidad para el programador, además el proceso de traducción inverso de lenguaje ensamblador a código máquina puede ser realizado por un sencillo programa.

Programación para seres humanos

Lenguajes de alto nivel

Sobre este lenguaje ensamblador inicial se fueron construyendo otros lenguajes de programación de más alto nivel; esto significa que ocultan ciertos aspectos de manera que el programador no se ha de preocupar sobre si en la máquina que quiere que se ejecute el algoritmo el MC corresponde a la instrucción 101 o 010. Se produce, por tanto, una abstracción de datos, muy deseable para poder utilizar el trabajo de otros para avanzar un paso más en vez de tener que "reinventar la rueda", como se suele decir. Estos textos en los que se codifican los algoritmos son los códigos fuente; siguen las reglas sintácticas de un determinado lenguaje de programación. Existen numerosos lenguajes de programación, y se utiliza uno u otro según sus características se adecúen más o menos a la resolución de nuestro problema.

Traductores e intérpretes

Tras la escritura del algoritmo, un compilador o un intérprete (otros programas) transformarán el texto en código máquina que el procesador es capaz de ejecutar.

Toda esta abstracción permite resolver problemas alejados de sumar números binarios, como pueden ser la consulta de esta misma enciclopedia o jugar a un videojuego en 3D.

Lenguajes interpretados vs. lenguajes compilados

Los lenguajes interpretados son como respuesta a la dificultad de manejo de los compilados. Un lenguaje compilado es sólo apto para un sistema operativo o formato de ejecutable (en GNU/Linux y Unix System V es ELF, en Windows o incluso en BSD es muy diferente), y es tedioso de manejar: para comprobar bugs o errores el computador debe:

  • Compilar cada uno de los ficheros de código.
  • Ensamblarlos en ficheros objeto.
  • Enlazar los ficheros objeto.
  • Volverlos a ensamblar.

Todo eso no es gran derroche de recursos para un ordenador medio actualmente, pero dura sus 10 o 15 segundos. En cambio, con un lenguaje interpretado, el programa intérprete analiza el fichero de código y lo va ejecutando en tiempo real, sin compilarlo ni ensamblarlo. Otra de las ventajas de los lenguajes interpretados es que son multiplataforma: un programa en Perl, por ejemplo, no debe ser compilado dos veces (una para Unix y otra para Windows). Con que haya diferentes versiones del intérprete en cada uno de esos ordenadores, específicamente compilados para ellos, basta.

Sus desventajas:

  • Consume muchos recursos de memoria, sobre todo RAM.
  • Se depende del intérprete: si no tienes instalado el intérprete que corresponda, no podrás ejecutar el programa.

Ejemplos de lenguajes interpretados son PHP, Perl, Python, Tcl/Tk, BASIC, LISP (en algunas de sus versiones)...

Técnicas básicas de programación

Versión para imprimir esta pagina

La programación estructurada sigue tres reglas: la secuencia, la iteración y la decisión. La primera de ellas indica que las instrucciones del código se leerán de principio a fin; la segunda indica que, según cierta condición, un número de instrucciones podrían repetirse un numero determinado de veces, y la tercera indica que según unas ciertas condiciones se ejecutarán o no un conjunto de instrucciones. En el siguiente algoritmo para limpiar platos se aprecian estas tres características. La indentación de las instrucciones indican cuáles son englobadas y cuáles no por sus predecesoras.

  mientras haya platos


     coger plato
     mientras haya suciedad
        echar jabon
        pasar el estropajo por el plato
     si plato es azulado
        ponerlo con los azules

En código no estructurado, quedaría algo más complejo.

  1 coger plato
  2 echar jabon
  3 pasar el estropajo por el plato
  4 si hay suciedad ir a la instrucción 2
  5 si el plato no es azul ir a la instrucción 7
  6 ponerlo con los azules
  7 si hay más platos ir a la instrucción 1


En programas más grandes, esto es muchísimo más complicado.

Ahora conocemos la ejecución de los algoritmos. Sin embargo, un programa se compone tanto de algoritmos como de una estructura de datos sobre los que operar.

Antes de empezar un programa

Estructura de un programa

En la programación estructurada hay un inicio y un fin perfectamente bien definido de acuerdo al diagrama de flujo que se planteó al concebir la idea del programa.

Un programa bien estructurado debería tener algún subprograma que capture cualquier error dentro del programa principal o de cualquier subprograma dentro de la aplicación de tal modo que el subprograma que captura los errores genere un registro de datos que describa el error generado y/o en qué subprograma se generó el error para posteriormente corregirlo. Para facilitar la corrección de estos errores se hace uso de los comentarios agregados en el código fuente.

Variables y constantes

Como hemos visto, el ordenador sigue una serie de instrucciones. Pero esas instrucciones tienen que operar sobre una serie de datos. El ordenador típico sólo procesa una instrucción a la vez, por lo que necesita 'espacios de memoria' donde guardar o depositar, a modo de cajones, por usar un símil conocido, los diversos datos con los que trabaja. Aquí es donde entran en juego las variables y constantes.

En los inicios, con el ensamblador, se podía decir al ordenador, por ejemplo: 'Ejecuta la instrucción de esa posición de memoria' o también 'En esa posición de memoria está guardada mi edad, imprímela por pantalla'. Todo esto se deriva del hecho de que los programas también son datos. Esta ambigüedad presenta numerosos inconvenientes cuando se producen errores, como el lector se imaginará fácilmente: de ahí que, a medida que los lenguajes evolucionan hacia niveles superiores, se impida el tratamiento indistinto de los datos. A partir de entonces, un programa tiene que decirle al sistema operativo los cajones que necesita y éste se los proporciona independientemente de cuáles sean.

Quizás suene más complicado de lo que es. Un ejemplo: Queremos sumar dos números. Nuestro programa tendrá que tener tres cajones: Uno para cada número y otro para el resultado. Cada cajón tiene un nombre en vez de una posición de memoria, de manera que sólo hay que nombrarlo:

  Necesito cajones A, B y Resultado
  Lee un número y guárdalo en A
  Lee un número y guárdalo en B
  Suma A y B y guárdalo en Resultado
  Imprime el contenido de Resultado

He aquí nuestro programa. Como cabe pensar, un procesador no tiene la instrucción "Imprime por pantalla"; esto es una llamada a otra porción de código que, gracias a la abstracción, nosotros no hemos escrito, o hemos escrito una sola vez; a partir de lo cual podemos imprimir todo el texto que queramos en la pantalla.

Las posiciones de memoria A y B son Variables. Si queremos leerlas o escribirlas, podemos hacerlo. Típicamente, existirán datos que no pensamos modificar; no querremos que el usuario tenga que introducirlos cada vez, pues son de naturaleza más constante que otros (como puede ser el valor Pi para calcular el perímetro o área de un círculo). Para evitar modificarlos por error, podemos pedir al sistema variables especiales, que no puedan ser reescritas. Son las Constantes. Un ejemplo:

  Comentario: Este programa calcula el área de un círculo
  Constante PI = 3'14159265
  Variable R
  Variable Resultado;
  Leer número y guardar en R
  Calcular PI * (R * R) y guardar en Resultado
  Imprimir Resultado;


El uso de variables y constantes se asemeja al uso que se les da en el álgebra o en otras ramas matemáticas.

Nótese también la clara separación entre estructuras de datos y algoritmos. Según los lenguajes, esto puede ser o no obligatorio, pero es recomendable en aras de una mayor claridad del trabajo.

Comentarios

El útil concepto del comentario: son líneas de texto que el compilador o el intérprete no consideran como parte del código, con lo cual no están sujetas a restricciones de sintaxis y sirven para aclarar partes de código en posteriores lecturas y, en general, para anotar cualquier cosa que el programador considere oportuno.

Uno como programador debe tener como prioridad documentar nuestro código fuente ya que al momento de depurar nos ahorrará mucho tiempo de analisis para su corrección o estudio.

Los programadores profesionales tienen la buena costumbre de documentar sus programas con encabezados de texto (encabezados de comentarios) en donde describen la función que va a realizar dicho programa, la fecha de creación, el nombre del autor y en algunos casos las fechas de revisión y el nombre del revisor.

Por lo general algunos programas requieren hacer uso de llamadas a subprogramas dentro de una misma aplicación por lo que cada subprograma debería estar documentado, describiendo la función que realizan cada uno de estos subprogramas dentro de la aplicación.

Estructuras de datos y de control

Estructuras de control

Las estructuras de control pueden dividirse en dos: Estructuras de control Condicional y Estructuras de control Repetitivo.

Las estructuras de control condicional son las que incluyen alternativas de seleccion con base al resultado de una operación booleana, como por ejemplo, una comparación (A==B). Según la expresión sea cierta o falsa, se ejecutará una sección de código u otro. Es el caso de la sentencia IF THEN ELSE de Pascal o Basic:

  IF A==0 THEN
       PRINT "A vale 0"
  ELSE
       PRINT "A no vale 0"

Otra sentencia de control son las de tipo SWITCH CASE. En este tipo de sentencias se especifica la variable a comparar y una lista de valores con los que comparar. Aquel que sea el verdadero, se ejecutará:

   SWITCH A
       CASE 0:
           PRINT "A vale 0"
       CASE 1:
           PRINT "A vale 1"

Otras herramientas imprescindibles del control de la ejecución de nuestro código son los BUCLES o CICLOS. Consisten en un método que permite repetir un trozo de código varias veces.

Hay básicamente dos tipos:

- Bucle FOR:

El bucle FOR consiste en una sentencia que engloba un grupo de instrucciones y tiene una variable cuyo valor se va modificando en cada vuelta. En general se utiliza cuando sabemos cuántas veces tenemos que repetir el código.

    FOR A=0 TO 9   Especificamos en este caso que A variará desde 0 hasta 9, con lo que repetiremos el bucle 10 veces. 
        PRINT "Estamos en el bucle"      
    NEXT A          Con esto cerramos el bucle e indicamos el final del bloque de instrucciones que se repiten

- Bucle WHILE:

El bucle WHILE consiste en un bucle en el que el código se repite mientras se cumpla alguna condición booleana (es decir, una expresión que dé como resultado verdadero o falso). Hay variaciones, como el REPEAT...UNTIL, que se diferencia en el momento de comprobar si se hace verdadera o no la condición.

    WHILE A<>(B*2) DO            Aquí especificamos la expresión que evaluamos y aquí se comprueba
        A=A+1                    Incrementamos el valor de A mientras sea distinto a B*2
    DONE                         Como en el FOR, necesitamos especificar donde acaba el bucle y el código.

Estructuras de datos

creo a como entero

creo b como entero

creo suma como entero

a=2

b=1

suma = a + b

imprimir suma


Estructura de una aplicación. Cualquier programa que se realice debe llevar una estructura para disminuir la tarea de depuración ya que esta labor lleva más tiempo del estimado.

Si eres principiante en el área de programación debes definir el programa a realizar, documentar cada uno de los pasos que realizas en tu programa, debes de considerar algún metodo de captura de errores, etc.

En este subcapítulo abarcaremos el cómo estructurar una aplicación para mejorar o disminuir el tiempo en depuración, así como localizar más rápidamente los errores.

Puedes buscar en Internet el concepto "pseudocódigo", que no es más que la escritura de un algoritmo en un lenguaje más cercano al natural. Es decir, la orden en lenguaje Javascript que repetiría el proceso de quitar suciedad añadiendo agua y jabón mientras se frota sería la siguiente:

function frotar(cuanto){
  var veces = 0;
  for (veces = 0; suciedad < 0 || veces < cuanto ; veces++){
    suciedad = suciedad - (agua + jabón);
  }
}

Mientras que el algoritmo o pseudocódigo quedaría así:

función frotar (cuantas veces lo hago)
  variable veces que llevo = 0
  repetir (desde que vecesquellevo = 0 mientras la suciedad < 0 ó vecesquellevo < cuantasveceslohago; aumentar vecesquellevo de una en una)
    suciedad = suciedad - (agua + jabón)
  fin repetir
fin función

En primer lugar, es muy recomendable hacer un esquema sobre el papel con toda clase de datos que se vayan a utilizar. Por ejemplo, si queremos hacer un programa para controlar una empresa dedicada al alquiler de coches, podríamos necesitar:

  • Matrícula del coche
  • Marca del coche
  • Modelo del coche
  • Color del coche
  • Estado del coche (si está alquilado, en reparación o disponible)
  • Situación del coche (en qué lugar del garaje o en qué localidad está)
  • Kilometraje del coche
  • Precio por hora del coche

por un lado, y:

  • Nombre del cliente
  • Apellidos del cliente
  • Dirección del cliente
  • DNI del cliente
  • Permiso de conducir del cliente
  • Número de cuenta del cliente

... etc. por otro.

Enlaces externos

Introducción a la programación estructurada

Versión para imprimir esta pagina

Introducción

La programación estructurada nació como solución a los problemas que presentaba la programación no estructurada, la cual se empleó durante mucho tiempo antes de la invención de la programación estructurada.

Un programa no estructurado es un programa procedimental: las instrucciones se ejecutan en el mismo orden en que han sido escritas. Sin embargo, este tipo de programación emplea la instrucción "goto". Una instrucción "goto" permite pasar el control a cualquier otra parte del programa. Cuando se ejecuta una instrucción "goto" la secuencia de ejecución del programa continúa a partir de la instrucción indicada por "goto". De esta forma, para comprender como funciona un programa es necesario simular su ejecución. Esto quiere decir que en la mayoría de los casos es muy difícil comprender la lógica de un programa de este tipo. Algunos compiladores crean referencias cruzadas a las instrucciones apuntadas por los "goto", posibilitando una navegación rápida a través del código fuente. Sin embargo, es algo común en muchos lenguajes de programación el empleo de una variable en asociación con el destino del "goto", no permitiendo la creación automática de tablas de referencias cruzadas. Existen problemas similares en algunos lenguajes de programación estructurada, por ejemplo cómo implementar las vistas en diferentes idiomas, de forma que varias personas puedan visualizar la misma información, pero cada una en su idioma.

Esto se opone a la idea de utilizar algún tipo de abstracción que permita comprender cómo funciona realmente un programa, que es lo que hace la programación estructurada.

Por este motivo, Dijkstra propuso la eliminación de la sentencia "goto".

Introducción a las estructuras de datos y tipos de datos

La estructura y tipos de datos varia con cada lenguaje de programacion. Estos se pueden definir como la forma y modo de programar que corresponde a una acción y le define una funcion especifica.

La estructura no es mas que la forma que sigue ese lenguaje, por ejemplo:

abrir
ejecutar acción 1.
ejecutar acción 2.
cerrar.

(esta puede ser una estructura simple, pero cada lenguaje dice cuales y como se usaran esas estructuras).

Por ejemplo:

En C, para poder crear una variable se necesita especificar el tipo de ella. (la estructura quedaria mas o menos asi)

<abrir>

variable tipo carácter a = hola mundo.
variable tipo numero entero b = 123
variable tipo numero decimal c = 1.25
imprimir a,b,c

<cerrar> Esta claro que cada lenguaje usa sus propios terminos para definir sus tipos de datos. (En C quedaria así)

#include <stdio.h> //cabezera estandar de entrada y salida (aqui estan los ficheros necesarios).

void main() //parte de la estructura de C, en dependencia del compilador se debe usar int main()
{
Char a[12] = Hola Mundo.;
int b = 123;
float c = 1.25;

printf ("%s %d %f",a,b,c);
} // define el fin del programa.(fin de la estructura)

Pueden ver estas secciones para observar la estructura y tipo de datos en C: puedes consultar en el Wikibook de C enlace a Wikipedia: Tipos de datos enlace a busqueda de google "tipo+dato+programacion"

Aplicaciones de los tipos de datos estructurados

Versión para imprimir esta pagina

Los tipos de datos se utilizan para asignar una variable o una constante con un nombre fijo que tome una porción de memoria y que almacene una información en memoria, si el tipo de dato es numérico solo almacenará datos numéricos y si el tipo de dato es una cadena de caracteres almacenará texto.

Y dependiendo el tipo de datos numérico se podrá almacenar una cantidad de dato dependiendo la precisión que tenga la variable.

En programacion los tipos de datos son (o pueden ser) distintos entre si, cada tipo corresponde a como se va a jugar con la memoria, es decir un dato numerico puede usar entre 2 y 4 byte (depende del compilador), mientras que un dato carácter usara un byte por cada carácter, es por eso que se especifica que es lo que se necesita.

En C, algunos tipos de datos son:

INT : Para numero enteros.

Ej:
Int a=5;

CHAR : Para caracteres. Se usa [] con un valor para hacer una cadena de caracteres, por ejemplo una palabra.

Ej:
Char [4] a=Hola;

FLOAT : Para numeros decimales.

Ej:
Float a=1.25;

En Visual Basic / Visual.Net, algunos tipos de datos son (cabe resaltar que en este lenguaje de programación se anticipa la instrucción "DIM" que declara y asigna espacio para almacenar una o más variables).

Integer : Para números enteros

Ej:
Dim a as integer
a= 4

String: Para cadena de caracteres

Ej:
Dim cadena as string
cadena="Visual Basic"

Double: Para número decimales.

Ej:
Dim b as doublé
b=4.12

-

Hay muchos mas, pero estos son mas comunes y son usados en otros lenguajes (son como un estandar, pero no son regla).

Archivos

Versión para imprimir esta pagina

Un archivo es un fichero (dato) almacenado en algún recurso de memoria, generalmente en Disco Duro, pero dependiendo del uso (en ciertos casos) son almacenados en RAM.

Un Fichero tiene muchas funciones, en programación, estos almacenan códigos o parte de ellos (en ocasiones se divide el código en varios archivos). También es posible que se necesita almacenar datos que el usuario introduce ("Como sus datos, nombre de usuario y contraseña, etc.), estos se empaquetan en un archivo y podrán ser usados luego por el programa por ejemplo, cuando el usuario desee loguearse de nuevo.

En el lenguaje C++ y otros lenguajes orientados a objetos, se suele decir, "Todo es un archivo", debido a como trabajan estos.

Archivos, en ocasiones puede referirse a las librerías, pero creo prudente hacer diferencias, una librería es una utilidad para el lenguaje en que programamos, mientras que un archivo es una utilidad mas cercana a nosotros (en lo posible, desarrollado por nosotros).

Herramientas de desarrollo

Las herramientas de desarrollo son aquellos programas o aplicaciones que tengan cierta importancia en el desarrollo de un programa (programación). Pueden ser de importancia vital (como un ensamblador, un compilador o un editor) o de importancia secundaria, como una IDE (Integrated Development Environment - Entorno de Desarrollo Integrado).

Compiladores

Los compiladores son programas que «traducen» un fichero de código fuente de cualquier lenguaje al lenguaje ensamblador y lo llama, cuando sea necesario, igual que al enlazador (o linker). Los más importantes son GCC (GNU Compiler Colector) para C, G++ para C++, G77 para Fortran 77 y Microsoft Visual C++, entre otros

Ensambladores

Los ensambladores son aquellos programas que se encargan de desestructurar el código en lenguaje ensamblador y traducirlo a lenguaje binario. Los archivos en lenguaje binario se enlazan posteriormente en un único fichero, el ejecutable.

Los más importantes son tas, gas, nasm...

Enlazadores (Linkers)

Son los programas que enlazan varios ficheros objeto en lenguaje binario para crear un único fichero, el ejecutable del programa.

El más importante es ld. y también es una de las más usadas.

Depuradores (Debuggers)

Como su nombre lo indica, sirven para corregir los errores o fallas de la programación (bugs). Se encargan de ejecutar, paso a paso un programa, alertando sobre los errores presentados y los valores de las variables, entre otros. Son particularmente útiles cuando el programa parece estar bien, pero no se obtiene el resultado esperado (se cuelga, da resultados erróneos...).

El más importante es GDB. Actualmente casi todas las IDEs incluyen uno, o deberían.

Editores de texto

Son tan importantes como un compilador pues es el editor de la programación; actualmente incluyen funciones específicamente dedicadas a la programación, como resaltado de sintaxis, y autoindentación, entre otras

Grandes editores de texto son GNU Emacs, Vim, Scite, Notepad++...

Otras herramientas

No son tan importantes como las anteriores, pero también tienen su importancia:

  • IDEs (Interfaz de Desarrollo Estructurada): juntan en un sólo programa editor de texto, compilador, enlazador, ensamblador, depurador... Ejemplos de ellas son Anjuta, Dev-Cpp, Codeblocks...
  • Programas de indentación: sirven para aclarar el código escrito confusamente. El único que conozco es indent. De todas formas, un editor de texto medianamente decente suele incluir sus propias funciones de indentado.

Hola mundo

ABAP/IV

REPORT HOLAMUNDO.
WRITE '¡Hola, mundo!'.

ABC

WRITE "¡Hola mundo!"

ActionScript

trace("¡Hola, mundo!");

ADA

with Ada.Text_IO;

 procedure Hola_Mundo is
 begin
    Ada.Text_IO.Put_Line("¡Hola, mundo!");
 end Hola_Mundo;

ASP

<%

Response.Write("Hola Mundo")

%>

ASSEMBLY

.model small
.stack
.data
  saludo   db "Hola mundo!!!", "$"
.code
main  proc             ;Init process
  mov   ax,seg saludo
  mov   ds,ax          ;ds = ax = saludo
  mov   ah,09          ;Function(print string)
  lea   dx,saludo      ;DX = String terminated by "$"
  int   21h            ;Interruptions DOS Functions
  mov   ax,4c00h       ;Function (Quit with exit code (EXIT))
  int   21h            ;Interruption DOS Functions
main  endp             ;End process
end main

AWK

#!/bin/awk -f
BEGIN{
  print "¡Hola, mundo!";
}

Bash

#!/bin/bash
echo "Hola mundo"

Basic

PRINT "Hola Mundo"

C

#include <stdio.h>

int main(void)
{
   printf("Hola, mundo!\n");
   return 0;
}

C++

 #include <iostream>
 
 using namespace std;
 
 int main() {
 	
 
 	cout << "¡Hola, mundo!" << endl;
 }

C++/CLI

int main()
{
   System::Console::WriteLine("Hola, mundo!");
   return 0;
}

C#

using System;
 
class MainClass
{
    public static void Main()
    {
        Console.WriteLine("¡Hola Mundo!");
    }
}

COBOL

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
MAIN SECTION.
DISPLAY "Hola mundo"
STOP RUN.

ColdFusion

<cfset variable="Hola Mundo">
<cfoutput>#variable#</cfoutput>

MS-DOS

En sistemas operativos de la familia DOS como MS-DOS o PC-DOS que usan el Intérprete de comandos COMMAND.COM o sistemas que usan como intérprete de comandos CMD.EXE (OS/2 y Windows de la rama NT) se pueden crear archivos de proceso por lotes con extensiones BAT y CMD respectivamente con el siguiente contenido:

@echo ¡Hola, Mundo!

Eiffel

class HOLA_MUNDO
create
    make
feature
    make is
        do
            io.put_string("%nHola mundo%N")
        end
end  -- HOLA_MUNDO

Erlang

-module(hola).
-export([hola_mundo/0]).

hola_mundo() -> io:fwrite("Hola mundo!\n").

Fortran

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

Haskell

holaMundo :: IO ()
holaMundo = do putStrLn ("Hola mundo!")

HTML/JavaScript

<html>
<head>
   <title>Hola Mundo</title>
   <script type="text/javascript">
      alert("¡Hola mundo!");
   </script>
</head>
<body>
</body>
</html>

INTERCAL

 PLEASE DO ,1 <- #13
 DO ,1 SUB #1 <- #238
 DO ,1 SUB #2 <- #112
 DO ,1 SUB #3 <- #112
 DO ,1 SUB #4 <- #0
 DO ,1 SUB #5 <- #64
 DO ,1 SUB #6 <- #238
 DO ,1 SUB #7 <- #26
 PLEASE DO ,1 SUB #8 <- #22
 DO ,1 SUB #8 <- #248
 DO ,1 SUB #9 <- #168
 DO ,1 SUB #10 <- #24
 DO ,1 SUB #11 <- #16
 DO ,1 SUB #12 <- #158
 DO ,1 SUB #13 <- #52
 PLEASE READ OUT ,1
 PLEASE GIVE UP

Java

public class HolaMundo
{  
       public static void main(String[] args)
       {
          System.out.println("¡Hola, mundo!");
       }
}

Programación en Lexico (POO en castellano)

Aplicación con un solo algoritmo:

tarea muestre "Hola mundo"

Aplicación con solo clases:

clase tarea
publicos:
mensajes:
Principal muestre "Hola Mundo"

Aplicación con interfaz gráfica:

clase ventana derivada_de "System.Windows.Forms.Form"
publicos
métodos
ventana copie "Hola mundo" en ventana.Text

LISP

(format t "¡Hola, mundo!")

Liberty BASIC

print "¡Hola, mundo!"

MATLAB

 close all;                % cierra todas las ventanas que pueda haber
 clear all;                % borra todas las variables
 clc;                      % limpia la pantalla
 
 disp('hola mundo');       % muestra el mensaje


NATURAL

WRITE '¡Hola, mundo!'.


Object REXX

Utilizando los métodos de REXX clásico:

say "Hola Mundo"
call lineout , 'Hola, mundo.'
call charout , 'Hola, mundo.'||eol /* eol definido previamente */

Utilizando objetos:

.output~say('Hola, mundo.')
.output~lineout('Hola, mundo.')
.output~charout('Hola, mundo.'||eol) -- eol definido previamente

Pascal

Program HolaMundo;
begin
    Writeln('¡Hola, mundo!');
end.

NetREXX

Utilizando la instrucción say que proviene de REXX clásico:

say "Hola Mundo"

o directamente utilizando clases y métodos Java:

System.out.println("¡Hola mundo!");

OpenInventor

 #Inventor V2.1 ascii
 Text3 {
   string "Hola mundo"
 }

Perl

#!/usr/bin/perl
print "Hola, mundo.\n";

PHP

<?php
 echo "Hola Mundo";
?>

Python

print "Hola mundo"

QBasic

PRINT "Hola mundo"

REXX

say "Hola Mundo"

Ruby

puts "Hola Mundo"

SAPScript

MAIN
P1    Hola Mundo
/

Seed7

$ include "seed7_05.s7i";

const proc: main is func
  begin
    writeln("Hola Mundo");
  end func;

Smalltalk

Transcript show: '¡Hola, mundo!'

SQL

Variante de Oracle:

SELECT 'HOLA MUNDO'
FROM DUAL;

Unlambda

```s``sii`ki
``s``s`ks
    ``s``s`ks``s`k`s`kr
              ``s`k`si``s`k`s`k
                              `d````````````.H.o.l.a. .m.u.n.d.o
                       k
     k
 `k``s``s`ksk`k.*

Visual Basic

Sub Main()
  MsgBox "¡Hola, mundo!"
End Sub

X3

SubProg HOLAMUNDO()
   Infbox "Hola Mundo"
End

xBase

? "Hola Mundo"

La Abstracción y el Encapsulamiento

Abstracción

La abstracción, un principio por el cual se aísla toda aquella información que no resulta relevante a un determinado nivel de conocimiento.

Abstracción: Es una descripción de especificación que enfatiza algunos de los detalles o propiedades de algo. La abstracción consiste en captar las características esenciales de un objeto, así como su comportamiento. Es un método por el cual abstraemos valga la redundancia, una determinada entidad de la realidad de sus características y funciones que desempeñan, estos son representados en clases por medio de atributos y métodos de dicha clase.

Ejemplos de abstracción

Ejemplo 1: ¿Qué características podemos abstraer de los automóviles? o ¿Qué características semejantes tienen todos los automóviles?

Características: Marca, Modelo, Número de chasis, Peso llantas o cauchos, Puertas, Ventanas... Comportamiento: Acelerar, Frenar, Retroceder...

Ejemplo 2: La gerencia de un taller mecánico necesita un sistema para controlar los vehículos que ingresan a sus instalaciones. En este caso, las características esenciales de la clase vehículo son: Marca, Modelo, Color, Falla detectada, Nombre del Propietario, Dirección del Propietario, Teléfono del Propietario...

A esto se le llama abstracción. En general un programa no es más que una descripción abstracta de un procedimiento o fenómeno que existe o sucede en el mundo real.

  • La abstracción es crucial para comprender este complejo mundo.
  • La abstracción es esencial para el funcionamiento de una mente humana normal y es una herramienta muy potente para tratar la complejidad.
  • La abstracción es clave para diseñar un buen software.

Procedimientos

Modulos

Es una técnica que proporciona la posibilidad de dividir sus datos y procedimientos en una parte privada y una parte pública. Proporcionan un método efectivo de ocultación de la información, pero no permiten realizar instanciación, que es la capacidad de hacer múltiples copias de las zonas de datos.

Tipo abstracto de dato

Un tipo abstracto de dato (TAD) es un tipo de dato definido por el programador que se puede manipular similarmente a los tipos de datos definidos por el sistema. Un tipo abstracto de dato corresponde a un conjunto (puede ser de tamaño indefinido) de valores legales de datos y un número de operaciones primitivas que se pueden realizar sobre esos valores. Para construir un tipo abstracto de dato se debe:

1. Exponer una definición del tipo.

2. Hacer disponible un conjunto de operaciones.

3. Proteger los datos asociados con el tipo.

4. Permitir instancias múltiples del tipo.

Encapsulamiento

Consiste en unir en la Clase las características y comportamientos, esto es, las variables y métodos. Es tener todo esto en una sola entidad.

En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se logra gracias a la abstracción. La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas rojas donde sólo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos interesará conocer que hace la Clase pero no será necesario saber cómo lo hace.

Ejemplos

Ejemplo 1: De un televisor, el usuario conoce su apariencia y parte de su funcionamiento. Sólo le importa que funcionen el selector de canales, el video y el audio; no le interesa saber cómo funciona cada una de las partes internas del aparato, ese detalle sólo le interesan al fabricante y al técnico de servicio.


Ejemplo 2: De un animal no sólo es necesario conocer su apariencia; también se requiere conocer qué sabe hacer y cómo reacciona ante determinadas situaciones.


Caja Negra: Un objeto en el que su comportamiento y atributos son conocidos pero no así su trabajo interno, el cual continua siendo un misterio.

Reconocimiento de Objetos y Clases

Reconocimiento de Objetos y Clases


Objetos: Los principios de la definición de objetos ayudan a los programadores a hacer un código más robusto, mantenible y seguro; porque se pueden aislar a cada uno de esos objetos y tratarlos como un ente único, con su propia personalidad, sin que haya cientos de características que tengamos que tener presentes, tal como se hacía en la programación orientada a procedimiento. Lo cual, desde el punto de vista económico, que nunca hay que dejar de tener presente, si resulta viable, ya que los objetos bien diseñados pueden ser utilizados en diversas aplicaciones, con lo cual el tiempo de desarrollo total se reduce.


En Java, un objeto se define como una estructura que encapsula atributos (datos de configuración, propiedades) y comportamientos (procedimientos) de una entidad con un papel bien definido en una aplicación. Cada objeto tiene:

- Estado: Se compone de atributos (propiedades estáticas) y valor actual (valores dinámicos)

- Comportamiento: Representa cómo un objeto actúa y reacciona.

- Identidad: Cada objeto es único, ningún objeto es igual a otro.


A continuación se muestran algunas de las propiedades que se pueden aplicar a los objetos, tal como se han definido:

- Los objetos son cosas.

- Los objetos pueden ser simples o complejos.

- Los objetos pueden ser reales o imaginarios.


Casi todo puede ser considerado un objeto. El dinero, el helicóptero, una bicicleta, los perros, el coche. Los objetos representan cosas, simples o complejas, reales o imaginarias. Algunas cosas no son objetos, sino atributos, valores o características de un objeto. Es decir, no todas las cosas son objetos, ni son consideradas normalmente como objetos. Algunas de ellas son simplemente atributos de los objetos como el color, el tamaño y la velocidad. Los atributos reflejan el estado de un objeto, la velocidad del objeto “avión”, o el tamaño de un objeto edificio.

Entender que es un objeto es la clave para entender cualquier lenguaje orientado a objetos.


Los objetos pueden tener partes públicas y privadas, a menudo llamadas miembros.

1.- Miembros Públicos: Los miembros públicos (interfaz o métodos) de una clase describen qué es lo que pueden hacer los objetos de esa clase.

2.- Miembros Privados: Describen la implementación, el cómo lo hace.


- Interacciones entre Objetos: Los objetos contribuyen al comportamiento del sistema colaborando con otros objetos. El modelado de objetos no sólo modela los objetos en un sistema, sino también sus interrelaciones. Para realizar su tarea, un objeto puede delegar trabajos en otro. Este otro puede ser parte integrante de él o ser cualquier objeto del sistema.

- Intercambio de Mensajes: Los objetos interaccionan enviándose mensajes unos a otros. El método de envío de mensajes depende de la naturaleza de los objetos modelados.

1.- Los objetos interaccionan por paso de mensajes.

2.- Un objeto envía un mensaje a otro.

3.- El otro puede contestar, cambiar su estado, o reaccionar de la manera apropiada.

4.- Los objetos sólo pueden interaccionar a través de su interfaz público.


Los Objetos de Software, al igual que los objetos del mundo real, también tienen características y comportamientos. Un objeto de Software mantiene sus características en una o más “variables”, e implementa su comportamiento con “métodos”. Un método es una función o subrutina asociada a un objeto.


Clases: En el mundo real, normalmente se tiene muchos objetos del mismo tipo. Por ejemplo: Un teléfono celular es sólo uno de los miles que hay en el mundo. Si se habla en términos de la programación orientada a objetos, se puede decir que el objeto celular de cualquier tipo es una instancia de una clase conocida como “celular”. Los celulares tienen características (marca, modelo, sistema operativo, pantalla, teclado, etc.) y comportamientos (hacer y recibir llamadas, enviar mensajes multimedia, transmisión de datos, etc.). Cuando se fabrican los celulares, los fabricantes aprovechan el hecho de que los celulares comparten características comunes y construyen modelos o plantillas comunes, para que a partir de esas se puedan crear muchos equipos celulares del mismo modelo. A ese modelo o plantilla se le llama Clase, y a los equipos que se sacan a partir de esta se le llaman objetos.

Esto mismo se aplica a los objetos de Software, se puede tener muchos objetos del mismo tipo y mismas características. Por otro lado, una instancia de una clase es otra forma de llamar a un objeto. No existe diferencia entre un objeto y una instancia. Sólo que el objeto es un término más general, pero los objetos y las instancias son ambas representación de una clase.


Instancia: Es un objeto de una clase en particular.

Reconocimiento de Objetos y Clases en el mundo real

Objetos

En Java, un objeto se define como una estructura que encapsula atributos (características) y comportamientos (procedimientos) de una entidad con un papel bien definido en una aplicación.


Características de los Objetos

- Estado: Conjunto de valores de los atributos en un instante de tiempo dado. El comportamiento de un objeto puede modificar el estado de este.


- Comportamiento: Relacionado con su funcionalidad y determina las operaciones que este puede realizar o a las que puede responder ante mensajes enviados por otros objetos.


- Identidad: Es la propiedad que permite a un objeto diferenciarse de otros. Generalmente esta propiedad es tal, que da nombre al objeto.


Los objetos, concretos y abstractos, están a nuestro alrededor, forman nuestro entorno. Podemos distinguir cada objeto en base a sus características y comportamientos.


Ejemplos

En un aula de clases observamos los siguientes objetos:


• Alumno

• Profesor

• Mesa

• Silla

• Mesa banco

• Pizarrón


Interacción entre objetos: Los objetos no sólo tienen atributos relacionados con su forma física sino que, además, exhiben comportamientos específicos de su clase.

• Alumno: Estudia, aprende.

• Profesor: Enseña, evalúa.

• Mesa: Ordenada, desordenada.

• Silla: Ocupada, desocupada.

• Mesa banco: Ocupado, desocupado.

• Pizarrón: Pintado, borrado


Observamos que en el aula hay varios objetos alumno, por lo que pensamos en el grupo de alumnos, al que denominaremos como la clase alumno. De igual manera, cada materia es impartida por un profesor; el conjunto de profesores forman la clase Profesor. Pudiéramos extender nuestro análisis al pizarrón, la mesa, la silla,, al conjunto de mesa bancos, etc.


Clases:

Es la definición de un objeto. Cuando se programa un objeto y se definen sus características y funcionalidades, realmente se programa una clase. Una clase es la descripción de un conjunto de objetos; consta de datos que resumen características comunes de un conjunto de objetos. Se pueden definir muchos objetos de la misma clase. Dicho de otro modo, una clase es la declaración de un tipo objeto. Las clases son similares a los tipos de datos y equivalen a métodos y plantillas que describen como se construyen ciertos tipos de objetos. Cada vez que se construye un objeto a partir de una clase estamos creando lo que se llama una instancia de esa clase. Por consiguiente, los objetos no son más que instancias de una clase, una instancia es una variable de tipo objeto. En general instancia de una clase y objeto son términos intercambiables.