# Fundamentos de programación

Los ordenadores o computadoras han revolucionado todos los aspectos de la vida en los últimos 40 años. En la actualidad los encontramos en todos lados: escritorios de oficinas, aviones, microondas, teléfonos celulares, entre otros. Pero el equipo físico que podemos ver es solo la mitad de la historia. Cada una de estas computadoras también necesita un soporte lógico que le indique cómo realizar las tareas que esperamos que ejecute. Estas instrucciones se codifican en una gran variedad de lenguajes de programación. Cada uno tiene sus características específicas, sintaxis y mecanismos diferentes para llevar a cabo diversas tareas. Sin embargo, todos comparten un conjunto fundamental de características y conceptos que todas las personas interesadas en crear soluciones para resolver problemas mediante la programación deben dominar para poder desarrollar sus programas creando y comprendiendo su lógica.
En este proyecto de aprendizaje, nos familiarizaremos con los conceptos comunes a la mayoría de lenguajes de programación para que posteriormente podamos aprender con mayor facilidad uno o varios lenguajes específicos, teniendo en cuenta que las técnicas básicas para construir programas y desarrollar algoritmos para resolver problemas serán las mismas. De esta forma, al aprender un lenguaje nuevo, solo deberemos preocuparnos por conocer los aspectos que los diferencian de otros lenguajes.
En este proyecto de aprendizaje no se usará ningún lenguaje de programación en particular. Se usará un pseudocódigo genérico para explicar los conceptos de forma independiente a los diversos lenguaje de programación.

## Objetivo general

* Proporcionar familiaridad con los conceptos básicos de construcción de programas para computadores que son comunes a la mayoría de los lenguajes de programación.

## Objetivos específicos

* Describir la estructura general de un programa que implementa un algoritmo y el proceso para implementarlo en un ordenador.
* Construir expresiones para manipular datos primitivos y almacenar los resultados en memoria.
* Aplicar estructuras de control para organizar programas y realizar tareas complejas.
* Reconocer los conceptos relacionados al manejo de entrada y salida de datos primitivos y complejos.

## Lecciones
### Bloque 1
#### Lección 1

Los algoritmos como expresión abstracta de procedimientos para resolver problemas o ejecutar tareas son el tema de esta lección.
* Lectura 1: Algoritmos
* Evaluación de la lección 1

#### Lección 2

En esta lección estudiaremos la estructura básica de los programas y su ciclo de vida.
* Lectura 2: Programas
* Evaluación de la lección 2

#### Lección 3

Los lenguajes de programación como mecanismos para desarrollar programas para los ordenadores y sus entornos de desarrollo asociados serán el tema de estudio de esta lección.
* Lectura 3: Lenguajes de programación
* Evaluación de la lección 3

#### Evaluación Parcial

* Primera evaluación parcial

### Bloque 2
#### Lección 4

En esta lección estudiaremos los tipos de datos primitivos presentes en la mayoría de los lenguajes de programación.
* Lectura 4: Tipos de datos primitivos
* Evaluación de la lección 4

#### Lección 5

Las variables como almacenes de información y resultados de expresiones así como los cambios a sus valores serán el tema de estudio de esta lección.
* Lectura 5: Variables y asignaciones
* Evaluación de la lección 5

#### Lección 6

En esta lección estudiaremos los mecanismos para representar operaciones matemáticas y lógicas sobre los tipos de datos primitivos de los lenguajes de programación.
* Lectura 6: Expresiones
* Evaluación de la lección 6

#### Evaluación Parcial

* Segunda evaluación parcial

### Bloque 3
#### Lección 7

En esta lección estudiaremos diversos mecanismos para controlar la secuencia de ejecución de los pasos que componen un algoritmo.
* Lectura 7: Control de flujo
* Evaluación de la lección 7

#### Lección 8

Las subrutinas (funciones y procedimientos) como mecanismos para realizar tareas específicas como parte de un programa más grande y los mecanismos para transmitir información entre el código encapsulado y el programa principal serán los temas que estudiaremos en esta lección.
* Lectura 8: Funciones y procedimientos
* Evaluación de la lección 8

#### Lección 9

En esta lección estudiaremos el concepto de recursión o recursividad como mecanismo para implementar algoritmos.
* Lectura 9: Recursión
* Evaluación de la lección 9

#### Evaluación Parcial

* Tercera evaluación parcial

### Bloque 4
#### Lección 10

Los tipos de datos complejos más comunes serán el tema de estudio de esta lección.
* Lectura 10: Tipos de datos estructurados
* Evaluación de la lección 10

#### Lección 11

En esta lección estudiaremos las herramientas básicas para el manejo de la entrada y salida de datos.
* Lectura 11: Entrada y salida de datos
* Evaluación de la lección 11

#### Lección 12

En esta lección estudiaremos los mecanismos más comunes para el manejo de errores que se pueden dar durante la ejecución de un programa.
* Lectura 12: Manejo de errores
* Evaluación de la lección 12

#### Evaluación Parcial

* Cuarta evaluación parcial

### Evaluación Final

* Evaluación final

## Actividades

| Actividad propuesta | Descripción |
| Simulador de un cajero automático | Construir un programa que simule algunas funciones básicas de un cajero automático. |

## Material adicional
### Proyectos de aprendizaje relacionados

* Lógica proposicional
* Programación en C
* Programación en Pascal

### Recursos en otros proyectos de Wikimedia

    Fundamentos de programación en Wikilibros.

### Recursos externos

* Khan Academy > Español > Programación de computadoras
* Universidad Politécnica de Madrid > OCW > Fundamentos de programación
* Programación ATS > Canal > YouTube > Programación > Español