La siguiente información es tomada del libro Introducción a la programación. (Juganaru, M, (2014), Introducción a la programación, México, Grupo Editorial Patria)
De acuerdo con la naturaleza del funcionamiento de las computadoras, se dice que estas siempre ejecutan órdenes en un formato que les resulta inteligible; dichas órdenes se agrupan en programas, conocidos como software, el cual, para su estudio, a su vez, se divide en dos partes: el formato de representación interno de los programas, que constituye el lenguaje máquina o código ejecutable, y el formato de presentación externa, que es un archivo o un conjunto de archivos, que puede o no estar en un formato que puede ser visto/leído por el usuario (es decir, en un formato que respeta las reglas).
Para ejecutar lo que el usuario desea hacer en su computadora, o bien para resolver un problema específico, este precisa buscar un software que realice o ejecute con exactitud la tarea que se ha planteado o elaborar y desarrollar (escribir) un programa que la realice. El trabajo de elaboración de un programa se denomina “programación”. Pero la programación no es solo el trabajo de escritura del código, sino todo un conjunto de tareas que se deben cumplir, a fin de que el código que se escribió resulte correcto y robusto, y cumpla con el objetivo o los objetivos para los que fue creado.
Las afirmaciones que se derivan de lo anterior son varias:
- Conocer las herramientas, los formalismos y los métodos para transformar un problema en un programa escrito en un lenguaje (que posiblemente no será el lenguaje máquina), y para que dicho programa pueda ser transformado en un código ejecutable.
- Saber transformar el problema inicial en un algoritmo y luego en un programa.
La primera afirmación es genérica y se considera para varias categorías de problemas para resolver. Por su parte, la segunda esespecífica de un problema determinado que se tiene que resolver, para lo cual existen diversas metodologías específicas de resolución para este tipo de problemas. Para los casos de problemas muy generales, en ocasiones existen métodos conocidos que solo se adaptan a un problema en particular. El método es, por lo general, un algoritmo o una técnica de programación.
Algoritmo
Constituye una lista bien definida, ordenada y finita de operaciones, que permite encontrar la solución a un problema determinado. Dado un estado inicial y una entrada, es a través de pasos sucesivos y bien definidos que se llega a un estado final, en el que se obtiene una solución (si hay varias) o la solución (si es única).
Ejemplo:
Problema: Gestionar la lista de compras que una empresa realiza durante un mes.
Solución: Para resolver este problema de gestión muy general, se cuenta con las herramientas que se utilizan en otros problemas que ya tienen una resolución en la empresa (por ejemplo, un programa en Java con los datos en una base de datos). Así, para la solución del problema planteado, se proponen dos opciones:
- Usar la base de datos de trabajo para guardar, también en esta, la lista de productos que se requiere comprar.
- Guardar una lista en entradas que se actualiza cada vez que se captura o se incluye un nuevo producto que la empresa necesita, y que se borra o elimina al momento que el producto ya está abastecido, y en salidas, cada vez que algún empleado necesite una impresión de dicha lista.
En este ejemplo, el algoritmo global de resolución se compone de diversos pasos sucesivos de diálogo con el usuario (un empleado de la empresa), para mantener actualizada la lista de productos necesarios; así mismo, en pasos siguientes se precisa hacer una inserción y/o una eliminación o borrado de los productos (elementos) de la lista o una impresión en una forma legible.
Expresar un algoritmo
Un algoritmo puede ser expresado en:
- Lenguaje natural (a veces, este no resulta muy claro, pero es muy útil para problemas simples)
- Pseudocódigo
- Diagramas de flujo
- Programas
Niveles de descripción de algoritmos
La descripción de un algoritmo usualmente se realiza en tres niveles:
-
Descripción de alto nivel: El primer caso consiste en la descripción del problema; luego, se selecciona un modelo matemático y se expresa el algoritmo de manera verbal, posiblemente con ilustraciones, pero omitiendo detalles.
-
Descripción formal: En este nivel se usa un pseudocódigo o diagrama de flujo para describir la secuencia de pasos que conducen a la solución.
-
Implementación: Por último, en este nivel se muestra el algoritmo expresado en un lenguaje de programación específico, o algún objeto capaz de llevar a cabo instrucciones.
Análisis y comprensión de un problema
Las etapas de desarrollo de un algoritmo, con base en la lógica, son las siguientes:
-
Definición: En esta etapa se especifica el propósito del algoritmo y se ofrece una definición clara del problema por resolver. Además, aquí también se establece lo que se pretende lograr con su solución.
-
Análisis: En este punto se analiza el problema y sus características, y se determinan las entradas y salidas del problema. De igual modo, también se realiza una investigación sobre si ya se conoce alguna o varias soluciones de este. En el caso de que ya se conozcan varias soluciones, entonces se determina cuál es la más conveniente para el problema que estamos tratando. Si no se conoce ninguna, o no nos satisfacen las soluciones existentes, se propone una nueva.
-
Diseño: Aquí es donde se plasma la solución del problema. Con ese fin, se emplea una herramienta de diseño, que consiste en el diagrama de flujo y el pseudocódigo.
-
Implementación: En este último paso es donde se realiza o se ve concretado el programa y, por ende, se hacen varias pruebas.
Programas y paradigmas de programación y lenguajes
Un programa informático se define como un conjunto de instrucciones que, una vez ejecutado, realiza una o varias tareas en una computadora. De esta forma, sin programas, una computadora no puede realizar las actividades para las que fue diseñada y creada.
El conjunto general de programas que posee una computadora se denomina software, término que se utiliza para definir al equipamiento o soporte lógico de una computadora.
Un programa se escribe con instrucciones en un lenguaje de programación, el cual, a su vez, está definido por su sintaxis, que establece e indica las reglas de escritura (la gramática), y por la semántica de los tipos de datos, instrucciones, definiciones, y todos los otros elementos que constituyen un programa.
Si un programa está escrito en un lenguaje de programación comprensible para el ser humano, se le llama código fuente. A su vez, el código fuente se puede convertir en un archivo ejecutable (código máquina) con la ayuda de un compilador, aunque también puede ser ejecutado de inmediato a través de un intérprete.
A su vez, un paradigma de programación provee (y determina) la visión y los métodos de un programador en la construcción de un programa o subprograma. Existen diferentes paradigmas que derivan en múltiples y variados estilos de programación y en diferentes formas de solución de problemas:
-
Paradigma imperativo: En este paradigma se impone que cualquier programa es una secuencia de instrucciones o comandos que se ejecutan siguiendo un orden de arriba hacia abajo; este único enlace del programa se interrumpe exclusivamente para ejecutar otros subprogramas o funciones, después de lo cual se regresa al punto de interrupción.
-
Paradigma estructurado: Este paradigma es un caso particular de paradigma imperativo, por lo que se imponen únicamente algunas estructuras
de código, prohibiendo una continuación del cálculo de manera caótica. Por ejemplo, se impone que las
instrucciones sean agrupadas en bloques (procedimientos y funciones) que comunican; por tanto, el código que
se repite tiene la forma de un ciclo (loop, en inglés), gobernado por una condición lógica.
-
Paradigma declarativo: Un programa describe el problema a solucionar y la manera de resolverlo, pero no indica el orden de las acciones u operaciones que se deben seguir. En este caso, hay dos paradigmas principales:
- Paradigma funcional: Conforme a este, todo se describe como una función.
- Paradigma lógico: De acuerdo con este, todo se describe como un predicado lógico.
-
Paradigma orientado a objetos: Existen tres principios fundamentales que gobiernan este tipo de programación:
-
Encapsulación: En este principio se encapsulan datos, estados, operaciones y, en ocasiones, también eventos, en objetos. El código sería ejecutado, entonces, según la ocurrencia de eventos o de creación/destrucción de instancia de objetos.
-
Prototipos, clases y herencias: El prototipo y la clase son las abstracciones del objeto; otros prototipos se definen de acuerdo con un prototipo existente.
-
Típificación y polimorfismo: Constituyen la comprobación del tipo con respecto a la jerarquía de las clases.
-
Paradigma de programación por eventos: Un programa se concibe como una iteración infinita con dos objetos: detectar los eventos y establecer el cálculo capaz de tratar el evento.
-
Paradigmas paralelo, distribuido y concurrente: Un programa no se realiza con una sola unidad de cómputo, sino que emplea varias unidades de cálculo (reales en caso
paralelo y distribuido), las cuales pueden ser procesadores o computadoras y/o unidades centrales del mismo procesador.
En el caso de este paradigma, el programa se corta en subprogramas o rutinas que se ejecutan de manera independiente
sobre otras unidades de cómputo, ya sea de modo síncrono o asíncrono, compartiendo o no la misma memoria.
Un lenguaje de programación puede verifi car uno o más paradigmas. Por ejemplo, el lenguaje Java comprueba el paradigma
orientado a objetos y el código que compone la parte de métodos de los objetos verifi ca el paradigma estructurado.
Por su parte, el lenguaje de programación de páginas de Internet, JavaScript, funciona/trabaja conjuntamente con las páginas
y el servidor del sitio; por tanto, es un lenguaje, inspirado por Java, que comprueba el paradigma de programación
orientado a objetos, al tiempo que también funciona según el paradigma de la programación por eventos.
Tarea en el cuaderno: Investiga por lo menos cinco lenguajes de programación de cada paradigma.
Historia de los lenguajes de programación
Históricamente, las primeras computadoras se programaban manualmente (de forma física), cambiando los dispositivos
físicos del equipo de cómputo; por ejemplo, la máquina analítica de Charles Babbage, programada por Ada Byron,
o la computadora ENIAC.
Al principio, en los albores de la computación, se introdujo el lenguaje ensamblador, que codifi ca, con códigos literales,
las operaciones del procesador, los registros y las direcciones de memoria. En la actualidad, algunas máquinas
virtuales aún se pueden programar en un lenguaje ensamblador adaptado. Otro dominio actual, por el cual se utiliza el
lenguaje ensamblador, es el desarrollo de interfaces específi cas con dispositivos de entrada/salida de los datos. La principal
ventaja del lenguaje ensamblador es un código efi caz, muy cercano al lenguaje máquina. En tanto, las principales
desventajas o defectos que presenta el lenguaje ensamblador son, en principio, su “verbosidad”, esto es, para escribir
cálculos, que parecen simples, se escriben páginas y páginas en el lenguaje ensamblador, y la difi cultad de corregir los
errores que pueden parecer errores de concepción del programa o errores de compilación.
Un gran avance en materia de programación fue la aparición de los lenguajes de programación de alto nivel, por
medio de los cuales se simplifi có la escritura de código.
Tarea en el cuaderno: Elabora una línea del tiempo de los lenguajes de programación.
- 1950 - Lenguaje ensamblador
- 1954 - FORTRAN
- 1958 - LISP, ALGOL
- 1959 - COBOL
- 1962 - APL
- 1964 - BASIC, PL/I
- 1968 - logo
- 1969 - SGPIL
- 1972 - PROLOG
- 1973 - C
- 1978 - SQL
- 1983 - Ada, C++, Objective C
- 1985 - Eiffel
- 1987 - PERL
- 1991 - HTTP, Python, Java
- 1993 - Ruby
- 1994 - Common Lisp
- 1995 - JavaScript, PHP
- 1997 - XML
- 2000 - C#
- 2001 - Kylix
Transformación de un programa
Un programa de usuario recorre el siguiente camino hasta su ejecución:
-
Edición: Con un editor de texto se escribe el programa en el lenguaje elegido.
-
Compilación: En lenguaje de alto nivel, el código fuente se transforma en instrucciones para la máquina (código objeto o código ejecutable).
-
Enlazado: Un ejecutable se construye con códigos objeto (uno o más) y librerías de funciones, entre otros.
El resultado de este proceso es un código ejecutable directo para la máquina.
La siguiente información es tomada del libro Algoritmos a fondo con implementaciones en C y Java. (Sznajdleder, P.A., (2012), Introducción a los algoritmos y a la programación de computadoras, México, Alfaomega)
Codificación de un algoritmo
Cuando escribimos las acciones de un algoritmo en algún lenguaje de programación decimos que lo estamos "codificando". Generalmente, cada acción se codifica en una línea de código. Al conjunto de líneas de código, que obtenemos luego de codificar el algoritmo, lo llamamos "código fuente".
El código fuente debe estar contenido en un archivo de texto cuyo nombre debe tener una extensión determinada que dependerá del lenguaje de programación que hayamos utilizado. Por ejemplo, si codificamos en Pascal entonces el nombre del archivo debe tener la extensión ".pas". Si codificamos en Java entonces la extensión del nombre del archivo deberá ser ".java" y si el algoritmo fue codificado en C entonces el nombre del archivo deberá tener la extensión ".c".
Bibliotecas de funciones
Los lenguajes de programación proveen bibliotecas o conjuntos de funciones a través de las cuales se ofrecen cierta funcionalidad básica que permite, por ejemplo, leer y escribir datos sobre cualquier dispositivo de entrada/salida como podría ser la consola.
Es decir, gracias a que los lenguajes proveen estos conjuntos de funciones los programadores estamos exentos de programarlas y simplemente nos limitaremos a utilizarlas.
Programando en C, por ejemplo, cuando necesitemos mostrar un mensjae en la pantalla utilizaremos la función printf y cuando queramos leer datos a través del teclado utilizaremos la función scanf. Ambas funciones forman parte de la biblioteca estándar de entrada/salida de C, también conocida como "stdio.h".
Consola
Llamamos "consola" al conjunto compuesto por el teclado y la pantalla de la computadora en modo texto. Cuando hablemos de ingreso de datos por consola nos estaremos refiriendo al teclado y cuando hablemos de mostrar datos por consola estaremos hablando de la pantalla, siempre en modo texto.
Entrada y salida de datos
Llamamos "entrada" al conjunto de datos externos que ingresan al algoritmo. Por ejemplo, el ingreso de datos por teclado, la información que se lee a través de algún dispositivo como podría ser un lector de código de barras, un scanner de huellas digitales, etcétera.
Llamamos "salida" a la información que el algoritmo emite sobre algún dispositivo como ser la consola, una impresora, un archivo, etcétera.
La consola es el dispositivo de entrada y salida por omisión. Es decir, si hablamos de ingreso de datos y no especificamos nada más será porque el ingreso de datos lo haremos a través del teclado. Análogamente, si hablamos de mostrar cierta información y no especificamos más detalles nos estaremos refiriendo a mostrarla por la pantalla de la computadora, en modo texto.
Actividad
Da clic sobre la imagen para descargar el archivo .docx de la actividad, respóndelo y súbelo en formato PDF al Moodle.
Representación gráfica de algoritmos
Los algoritmos pueden representarse de forma gráfica y no gráfica. La forma gráfica son los diagramas de flujo. La forma no gráfica son el pseudocódigo. Los diagramas de flujo se pueden representar de manera clásica o Nassi-Shneiderman (Chapín)
DESCRIPCIÓN |
PSEUDOCÓDIGO |
REPRESENTACIÓN CLÁSICA |
PSEUDOCÓDIGO PSEINT |
REPRESENTACIÓN PSEINT |
Inicio o Fin: Use esta forma para el primer y último paso de un proceso. |
INICIO |
 |
Algoritmo titulo
...
FinAlgoritmo
|
|
Proceso: Esta forma representa un paso típico del proceso. Es la forma más usada en casi todos los procesos. |
x=y++; |
 |
variable<-expresion; |
 |
Decisión: Esta forma indica un punto en el que el resultado de una decisión indica el siguiente paso. Puede haber varios resultados, pero con frecuencia solo hay dos: sí y no.
|
SI condición ENTONCES esto SINO esto; |
 |
Si expresion_logica Entonces
acciones_por_verdadero
SiNo
acciones_por_falso
Fin Si
|
 |
Subproceso: Use esta forma para un conjunto de pasos que se combinan para crear un subproceso que está definido en otro lugar, a menudo en otra página del mismo documento.
|
Funcion tipo nombre() ... FinFuncion |
 |
Funcion variable_de_retorno <- Nombre ( Argumentos )
Fin Funcion |
 |
Documento: Esta forma representa un paso que da como resultado un documento.
|
Mostrar ""; |
 |
Escribir ""; |
 |
Datos: Esta forma indica que hay información que está entrando desde afuera en el proceso o saliendo de él. Esta forma también se puede usar para representar los materiales y a veces se denomina forma de entrada y salida.
|
Leer expresion; |
 |
Leer expresion; |
 |
Referencia en página: Este pequeño círculo indica que el paso siguiente (o anterior) se encuentra en otra parte del dibujo. Resulta particularmente útil para diagramas de flujo grandes en los que, de lo contrario, se debería usar un conector largo, que puede ser difícil de seguir.
|
|
 |
|
|
Referencia a otra página: Cuando se coloca esta forma en la página de dibujo, se abre un cuadro de diálogo en el que se puede crear un conjunto de hipervínculos entre dos páginas de un diagrama de flujo o entre una forma de subproceso y una página de diagrama de flujo independiente que muestra los pasos en dicho subproceso.
|
|
 |
|
|
Selección multiple: La secuencia de instrucciones ejecutada por una instrucción Segun depende del valor de una variable numérica.
|
Segun variable Hacer
caso1: instruccion;
caso2,caso3: instruccion;
De Otro Modo: instruccion;
FinSegun |
 |
Segun variable Hacer
caso1: instruccion;
caso2,caso3: instruccion;
De Otro Modo: instruccion;
FinSegun
|
 |
Lazos mientras: La instrucción Mientras ejecuta una secuencia de instrucciones mientras una condición sea verdadera.
|
Mientras condición Hacer instrucciones FinMientras |
 |
Mientras condición Hacer instrucciones FinMientras |
 |
Lazos Repetir: La instrucción Repetir-Hasta Que ejecuta una secuencia de instrucciones hasta que la condición sea verdadera
|
Repetir instrucciones; Hasta Que condición; |
 |
Repetir instrucciones; Hasta Que condición; |
 |
Lazos Para: La instrucción Para ejecuta una secuencia de instrucciones un número determinado de veces.
|
Para variable< - inicial Hasta final (Con Paso paso) Hacer instrucciones FinPara |
 |
Para variable< - inicial Hasta final (Con Paso paso) Hacer instrucciones FinPara |
 |