Diferencia entre revisiones de «Fundamentos de programación»

Contenido eliminado Contenido añadido
Oskarcah (discusión | contribs.)
Sin resumen de edición
Oskarcah (discusión | contribs.)
Sin resumen de edición
Línea 1:
= Fundamentos de programación =
== Introducción ==
 
¡Bienvenido a este libro! Nuestro objetivo fundamental es proveer a los lectores de un manual que cubra los aspectos escenciales 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 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. 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 la comparar un algoritmo con 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 nóvel 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 prácticar: 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.
 
 
== Algoritmos y programas ==
=== ¿Qué es un algoritmo? ===
 
Si se consulta en la Wikipedia la definición de [[es:algoritmo]], se entiende que éste es un conjunto finito de instrucciones a seguir para resolver un problema. Desde el punto de vista de la programación de ordenadores, sin embargo, decir que el algoritmo es meramente la especificación de un conjunto de pasos, es una definición 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.
 
'''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á específicado sin ambigüedades.
* ''Cada paso del algoritmo debe poder realizarse en un tiempo finito y deben requerir un esfuerzo finito:'' Es natural pedir que si debemos seguir una receta para realizar algo, cada paso podamos terminarlo y además tenga un costo finito. No tendría sentido una especificación como esperar en la fila hasta que se acabe el universo y luego avanzar un paso, pues dicha especificación no deja clara cuál es la cantidad de tiempo necesaria para avanzar un paso. ¿El universo se terminará mañana o dentro de 1000 millones de años? Por otro lado, si uno de los pasos del algoritmo requierese un tiempo indeterminado para ser ejecutado, tampoco podríamos determinar si el algoritmo terminará en algún momento.
* ''Un algoritmo debe finalizar en un número finito de pasos:'' Es una condición algo más general a la anterior. Generalmente cuando ejecutamos un algoritmo deseamos un resultado. Si el proceso de ejecutar al algoritmo nunca termina, ciertamente, nunca llegaremos a un resultado.
 
=== Modelos computacionales ===
=== Programas: algoritmos para ser ejecutados en el ordenador===
=== ¿Qué instrucciones es capaz de ejecutar el computador?===
 
Cada tipo de microprocesador contiene un conjunto de instrucciones que realizan ciertas operaciones sobre una o más palabras de bits; las intrucciones 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 [[w:lenguaje ensamblador|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.
 
=== Lenguajes de programación ===
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 són 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 otros según sus características se adecúen más o menos a la resolución de nuestro problema.
 
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.
 
 
 
== Técnicas básicas de programación ==
 
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 azul
ponerlo con los azules
 
En código no estructurado, quedaría algo más lioso.
 
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 lioso.
 
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 [[:w:es:Diagrama de flujo|diagrama de flujo]] que se planteó al concebir la idea del programa.
 
Un programa bien estructurado debería tener algun 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 comentario 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 solo 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 promocionan 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 o no hemos escrito, o hemos escrito una sóla 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 hacerlas. 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 recomedable 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 [[:w:es:Depurador|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 se va ha 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 en 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á un trozo 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 lo 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.
 
FOR A=0 TO 10 ''Especificamos en este caso que A variará desde 0 hasta 10, con lo que repetiremos el bucle
PRINT "Estamos en el bucle" ''10 veces.
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 hasta que se cumpla alguna condición booleana (es decir, una expresión que de 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 hasta que sea igual a B*2
DONE '' Como en el FOR, necesitamos especificar donde acaba el bucle y el codigo.
 
===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 de 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.
 
Es este subcapitulo abarcaremos el como estructurar una aplicación para eficientar o disminuir el tiempo en depuración, así como localizar más rapidamente 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:
<pre>
function frotar(cuanto){
var veces = 0;
for (veces = 0; suciedad = 0, veces = cuanto ; veces++){
suciedad = suciedad - (agua + jabón);
}
}
</pre>
Mientras que el algoritmo o pseudocódigo quedaría así:
<pre>
función frotar (cuantasveceslohago)
variable vecesquellevo = 0
repetir (desde que vecesquellevo = 0 hasta que la suciedad = 0 ó vecesquellevo = cuantasveceslohago; aumentar vecesquellevo de una en una)
suciedad = suciedad - (agua + jabón)
fin repetir
fin función
</pre>
 
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
 
==Historia==
=== Evolución de la programación ===
Inicialmente los programas seguían una ejecución similar a la del código ensamblador, es decir, existía un control sobre qué línea de instrucción se ejecutaría a continuación, que se podía cambiar mediante ciertas redirecciones (GOTO y GOSUB en BASIC, por ejemplo). Sin embargo, poco a poco se tendió hacia lo que se llama la programación estructurada.
 
== Tabla de contenidos ==
* [[Fundamentos de programación/Introducción]]
* [[Fundamentos de programación/Algoritmos y Programas]]
* [[Fundamentos de programación/Técnicas básicas de programación]]
* [[Fundamentos de programación/Introducción a la programación estructurada]]
* [[Fundamentos de programación/Introducción a las estructuras de datos y tipos de datos]]
* [[Fundamentos de programación/Aplicaciones de los tipos de datos estructurados]]
* [[Fundamentos de programación/Archivos]]
* [[Fundamentos de programación/Algoritmos de Ordenación y Búsqueda]]
* [[Fundamentos de programación/Algunas Técnicas de programación]]
* [[Fundamentos de programación/Introducción a la programación orientada a objetos]]
* [[Fundamentos de programación/Temas Avanzados]]
 
==Ver también==