miércoles, 9 de octubre de 2019

Programar

¿De qué modo programa la gente?
Muchos usuarios de computadoras dependen de aplicaciones programadas profesionalmente (hojas de cálculo, programas de edición de imágenes, navegadores web, etc.) como herramientas para la resolución de sus problemas. Pero, en ciertas ocasiones, es necesario o deseable escribir un programa en lugar de utilizar uno escrito por otra persona.
Como actividad humana, la programación de computadoras es algo relativamente nuevo. Pero la programación es una forma especializada del antiguo modelo de resolución de problemas.
Esta actividad suele implicar cuatro pasos:

Entender el problema. Definir el problema con claridad es, con frecuencia, el
paso más importante, y casi siempre más descuidado, que debe darse para la resolución
de ese problema.
Idear un plan para la resolución del problema. ¿Qué recursos, personas, información, computadoras, software y datos tenemos disponibles? ¿Cómo deben
ponerse estos recursos en funcionamiento para resolver el problema?
Llevar a cabo el plan. Esta fase suele estar solapada con el paso 2, ya que muchos esquemas de resolución de problemas suelen desarrollarse sobre la marcha.
Evaluar la solución. ¿Se ha resulto correctamente el problema? ¿Es una solución válida para otros problemas? El proceso de programación también suele estar dividido en cuatro fases, aunque casi siempre están solapadas unas con otras:

• Definición del problema.
• Creación, depuración y verificación del algoritmo.
• Escritura del programa
• Verificación y depuración del programa.
Casi todos los problemas de programación suelen ser tan complejos que no pueden resolverse de una sola vez. Para transformar un problema en un programa, el
programador suele crear una lista de problemas más pequeños, cada uno de los cuales puede subdividirse a su vez en subproblemas que también pueden subdividirse.
Este proceso, llamado refinamiento por pasos, es similar al que realiza un escritor para esbozar las líneas maestras de lo que será su obra. Los programadores suelen referirse a este tipo de proceso como un diseño de arriba a abajo, ya que el problema se aborda desde arriba, con las ideas principales, y se va desarrollando hacia abajo con los detalles concretos.
El resultado es un algoritmo, un conjunto de instrucciones paso a paso que, una vez completadas, resuelven el problema original. Los programadores suelen escribir algoritmos en un formato llamado pseudocódigo, un cruce entre lenguaje informático y lenguaje real. Cuando todos los detalles del algoritmo están en su sitio, el programador puede traducir todas las pseudoinstrucciones en un lenguaje informático.

De la idea al algoritmo
Vamos a desarrollar un sencillo algoritmo para ilustrar todo el proceso. Emperezaremos con el planteamiento del problema:

Un profesor de un colegio necesita un programa para jugar a «adivinar el número » que ayude a que sus estudiantes desarrollen su lógica y les permita practicar la aritmética.
En este juego, la computadora escoge un número comprendido entre 1 y 100 y ofrece al jugador varias oportunidades para adivinarlo. Tras cada intento fallido, la máquina responde diciendo si el número introducido es mayor o menor que el que debe adivinarse.
En resumen, el problema es escribir un programa que pueda:

jugar a “adivinar el número”

Refinamiento por pasos
Lo primero de todo es dividir el problema en tres partes: comienzo, mitad y finalización.
Cada una de estas tres partes es en sí misma un pequeño problema de programación por resolver.

inicio del juego
repetir el proceso hasta que se acierte el número o se alcance el número
máximo de intentos
fin del juego

Estos tres pasos son el esqueleto desnudo del algoritmo. Una vez completado, estas tres partes serán ejecutadas en secuencia. El siguiente refinamiento debe completar algunos detalles de cada parte:

inicio del juego
mostrar las instrucciones
escoger un número comprendido entre 1 y 100
repetir el proceso hasta que se acierte el número o se alcance el número
máximo de intentos
solicitar el número al usuario
responder a su solicitud
fin repetir
fin del juego
mostrar un mensaje de finalización 

La parte central de nuestras instrucciones incluyen una secuencia de operaciones que se repiten en cada turno: todo lo comprendido entre «repetir» y «fin repetir». Pero
estas instrucciones carecen de detalles cruciales. ¿Cómo, por ejemplo, debe responder la computadora a los valores introducidos por el usuario? Podemos sustituir la parte de «responder a su solicitud» con instrucciones que varíen dependiendo del número
introducido:

si valor_introducido = número, entonces mostrar acierto y terminar;
en caso contrario, si valor_introducido < número, entonces mostrar que
valor_introducido es menor;
en caso contrario, mostrar que valor_introducido es mayor

Por último, necesitamos indicarle a la computadora cuando han finalizado las siete oportunidades que el usuario tiene para acertar. Para ello, establecemos un contador a 0 al comienzo y lo incrementamos en una unidad en cada turno. Cuando el contador alcance 7, el bucle se detiene, y la computadora muestra un mensaje. El algoritmo final tiene este aspecto:

inicio del juego
mostrar las instrucciones
escoger un número comprendido entre 1 y 100
establecer contador a 0
repetir el proceso hasta que se acierte el número o contador = 7
solicitar el número al usuario
si valor_introducido = número, entonces mostrar acierto y terminar;
en caso contrario, si valor_introducido < número, entonces mostrar
que valor_introducido es menor;
en caso contrario, mostrar que valor_introducido es mayor
incrementar contador en una unidad
fin repetir
fin del juego
mostrar un mensaje de finalización

Estructuras de control
Una computadora no es capaz de comprender este algoritmo, pero el pseudocódigo está claro para cualquier persona familiarizada con las estructuras de control, estructuras lógicas que controlan el orden en el que se ejecutan las instrucciones.
Este algoritmo usa tres de estas estructuras: secuencia, selección y repetición.
Una secuencia es un grupo de instrucciones que se ejecutan por orden desde la primera hasta la última. En nuestro algoritmo de ejemplo, como en la mayoría de los lenguajes de programación, la secuencia es la estructura por defecto, es decir, se ejecuta a menos que otra sentencia diga lo contrario:

mostrar las instrucciones
escoger un número comprendido entre 1 y 100
establecer contador a 0

Una estructura de selección (o de decisión) se utiliza para tomar decisiones lógicas (escoger entre dos líneas de acción diferentes en función de ciertas condiciones).
Habitualmente toma la forma de «si (if) una condición es verdadera, entonces (then) haz algo y si no lo es (else) haz otra cosa diferente»:

si valor_introducido < número, entonces mostrar que valor_introducido
es menor;
en caso contrario, mostrar que valor_introducido es mayor

Una estructura de repetición es un mecanismo para construir bucles. Permite que una secuencia de pasos se repitan varias veces, normalmente hasta que se satisfaga una determina condición. Es nuestro algoritmo, las sentencias indentadas tras «repetir» y «fin repetir» se ejecutan continuamente hasta acertar el número o que el contador llegue a 7:

repetir el proceso hasta que se acierte el número o contador = 7
solicitar el número al usuario
...
incrementar contador en una unidad
fin repetir

Tal y como ilustra nuestro ejemplo, estas estructuras de control simples pueden combinarse para producir algoritmos más complejos. De hecho, cualquier programa informático puede construirse a partir de estas tres estructuras básicas.

Comprobación del algoritmo
El siguiente paso es comprobar el algoritmo. La verificación del programa completo vendrá más tarde; por ahora, esta fase está pensada para verificar la lógica del algoritmo.
Podemos seguir la serie de instrucciones probando con varios números. Podríamos, por ejemplo, utilizar como número objetivo el 35 y probar con el 15, 72, 52 y 35. Estos números comprueban las tres posibles condiciones de la estructura si-entonces- en caso contrario (if-then-else), y muestran lo que ocurre cuando el jugador escoge el número correcto. También es preciso verificar el algoritmo cuando se alcanzan los siete intentos que el jugador tiene para acertar el número y ver que el juego termina de forma satisfactoria.

Del algoritmo al programa
Una vez terminada la fase de comprobación, el algoritmo está preparado para convertirse en programa. Como ya disponemos de la estructura lógica del mismo, el proceso de codificación (escribir un programa a partir del algoritmo) es simple. Las sentencias del mismo se transforman directamente en líneas de código en el lenguaje de programación que mejor satisfaga las necesidades del programador.

Un programa simple
Echemos un vistazo a nuestro algoritmo escrito en C++, una popular variación del lenguaje C (el nombre de C no viene de ningún antojo de su creador; es una mejora de
otro que se llamaba B). Este programa, al igual que cualquier otro escrito en C++ que esté bien estructurado, dispone de tres partes, de forma análoga a las recetas de un libro de cocina:

1. La cabecera del programa, que contienen el nombre del mismo y los ficheros de datos (el equivalente al nombre y la descripción del plato a cocinar).
2. Las declaraciones y definiciones de las variables y cualquier otro elemento definido por el programador (los ingredientes utilizados en la receta).
3. El cuerpo del programa, que contiene las instrucciones del mismo encerradas
entre llaves, {} (el equivalente a los pasos de del problema a resolver).

El listado del programa parece una versión más detallada del algoritmo original, pero tiene una importante diferencia: como es un programa informático, cada palabra, símbolo y signo de puntuación tiene un significado exacto y sin ambigüedad.
El texto destacado en negrita son palabras clave que tienen un significado predeterminado en C++. Estas palabras clave, junto con los símbolos especiales como 1 y 5, forman parte del vocabulario estándar del lenguaje. El programador define las palabras number, guess y counter de modo que formen parte del vocabulario del programa cuando éste se ejecute. Cada una de estas palabras representa una variable (una
parte de la memoria de la computadora a la que se le da un nombre y cuyo contenido puede examinar y cambiar el programa).
Este programa C++ es fácil de entender. Pero C++ no es inglés, por lo que algunas de sus partes pueden necesitar ocasionalmente algún tipo de aclaración o documentación.
Por ello, la mayoría de los programas incluyen comentarios (los Post-it del programador).
En C++, cualquier línea precedida por dobles barras (//) se considera un comentario.
La computadora ignora estas líneas, que sólo se incluyen para que las personas que lean esos programas puedan comprender (o recordar) algo acerca del mismo.

Dentro de la computadora
Antes de que pueda ser ejecutado, es necesario introducir el programa en la memoria de la computadora, guardarlo en un fichero en el disco y convertirlo al lenguaje máquina nativo de la computadora. Para introducir y guardar el programa, podemos utilizar un editor de textos. Un editor de textos es parecido a una procesador de textos pero sin características de formateo. Algunos editores de texto, diseñados especialmente para la programación, ofrecen indentación automática del programa y una comprobación limitada de errores mientras se está escribiendo.
Para convertir un programa en lenguaje máquina, necesitamos un software de traducción.
Dicho programa puede ser un intérprete (un programa que traduce y transmite cada sentencia de forma individual, del mismo modo que en las Naciones Unidas
se traduce un discurso del ruso al español), o un compilador (un programa que traduce el programa completo antes de pasarlo a la computadora, del mismo modo que un estudiante puede traducir la novela Guerra y Paz del ruso al español). La mayoría de los traductores de C++ son compiladores, ya que los programas compilados tienden a ejecutarse más deprisa que los interpretados.
Cualquier software de compilación actual es mucho más que un simple compilador.
Es un entorno de programación integrado que incluye un editor de textos, un compilador, un depurador (debugger) para simplificar el proceso de localización y corrección de errores, y otras utilidades de programación. Los errores sintácticos (violaciones
de las reglas gramaticales del lenguaje de programación) suelen mostrarse automáticamente tan pronto como se teclean en el editor. Los errores lógicos (problemas con la estructura lógica que provocan diferencias entre lo que se supone que el
programa debe hacer y lo que realmente hace) no siempre son sencillos de detectar.
Ésta es la razón por la que la depuración y la verificación son fases que se pueden llevar una gran parte del tiempo de desarrollo de un programa.

Lenguajes de programación
y metodologías
C++ es uno de los cientos de lenguajes de programación utilizados hoy en día. Algunos son herramientas para los programadores profesionales que se encargan de desarrollar el software que el resto de mortales utilizamos. Otros están orientados a ayudar a los estudiantes a aprender los fundamentos de la programación. Un tercer grupo permite que los usuarios de las computadoras automaticen tareas repetitivas y optimicen aplicaciones software. Desde los primeros días de la informática, los lenguajes de programación
han evolucionado hacia una forma más simple de comunicación entre las personas y las máquinas.

Lenguaje máquina y lenguaje
ensamblador
Cada computadora tiene un lenguaje nativo, un lenguaje máquina. Existen similitudes entre las distintas clases de lenguajes máquina: todos ellos tienen instrucciones para efectuar las cuatro operaciones aritméticas básicas, para comparar pares de números, instrucciones para formar bucles, etc. Pero, al igual que el español y el francés, cada uno de estos lenguajes máquina son lenguajes diferentes, y las máquinas basadas en uno de ellos no pueden entender los programas escritos en otro.
Desde el punto de vista de las máquinas, el lenguaje máquina es binario. Las instrucciones, las localizaciones de memoria, los números y los caracteres están representados por cadenas de ceros y unos. Como los números binarios son complicados de leer, los programas en lenguaje máquina suelen mostrarse convertidos a decimal (base 10), hexadecimal (base 16) o cualquier otro sistema de numeración. Aun así, estos programas siempre han sido difíciles de escribir, leer y depurar.

Para más información les dejo link:

Fundamentos de la programación
https://www.fdi.ucm.es/profesor/luis/fp/FP.pdf

¿Cómo formarse en Computación y a la vez aprender herramientas prácticas para dar en el aula?
http://program.ar/especializaciones-de-nivel-superior-en-ensenanza-de-las-ciencias-de-la-computacion/

No hay comentarios:

Publicar un comentario