01 - Introduccion A La Programacion - Contenido Teorico
01 - Introduccion A La Programacion - Contenido Teorico
01 - Introduccion A La Programacion - Contenido Teorico
1. Introducción a la Programación
La evolución tecnológica llevó a una distinción más clara entre hardware y software. El
hardware avanzó hacia la miniaturización y eficiencia, con desarrollos clave como el
microprocesador en los años 70, que fueron fundamentales para la creación de las
computadoras personales. Este avance no solo democratizó el acceso a la computación,
sino que también fomentó la innovación en software. Paralelamente, el software se volvió
más complejo y capaz, expandiendo sus funcionalidades más allá de simples cálculos
numéricos a aplicaciones gráficas avanzadas, sistemas operativos y redes. Este crecimiento
destacó la necesidad de software que pudiera aprovechar plenamente el potencial del
hardware avanzado, conduciendo a una interdependencia cada vez mayor entre ambos.
La relación simbiótica entre hardware y software es fundamental para que las computadoras
modernas realicen una amplia variedad de tareas, desde el procesamiento de texto hasta
gráficos 3D y conectividad global. Para los programadores principiantes, es esencial
comprender esta dinámica. Esto no solo mejora su habilidad para escribir código más
eficiente y resolver problemas de manera efectiva, sino que también les ofrece una
perspectiva más completa sobre cómo sus desarrollos interactúan con el mundo físico. Este
entendimiento es crucial en una era donde la integración de hardware y software forma la
base de innovaciones como la inteligencia artificial, la realidad aumentada y la Internet de
las Cosas (IoT), subrayando la importancia de una comprensión holística de la informática.
C y C++: Estos lenguajes son conocidos por su eficiencia y control cercano al hardware.
Son comúnmente utilizados en el desarrollo de sistemas operativos, juegos y aplicaciones
que requieren un alto rendimiento. C y C++ permiten una gestión detallada de recursos del
sistema, lo cual es crucial en aplicaciones donde la eficiencia y la velocidad son esenciales.
Cada lenguaje de programación tiene sus propias fortalezas y es elegido por los
programadores en función de las necesidades específicas del proyecto que están
desarrollando. Aprender sobre estos lenguajes y su aplicación práctica no solo amplía las
habilidades de un programador, sino que también abre puertas a una variedad de campos y
oportunidades en el mundo de la tecnología. Conocer varios lenguajes de programación
permite a los programadores elegir la herramienta más adecuada para cada tarea,
asegurando la creación de soluciones óptimas y eficientes.
2. Algoritmia
¿Qué es un Algoritmo?
Un algoritmo es un término central en el mundo de la programación y la informática,
esencialmente una secuencia de instrucciones o reglas claramente definidas destinadas a
realizar una tarea específica o resolver un problema. Lo que distingue a un algoritmo es su
naturaleza estructurada y lógica, permitiendo su ejecución paso a paso. La eficacia de un
algoritmo no solo reside en su capacidad para lograr un objetivo, sino también en la
eficiencia y claridad con la que lleva a cabo la tarea. Los algoritmos son fundamentales en
la informática porque proporcionan la base lógica para que las computadoras procesen
datos y realicen cálculos. Su universalidad reside en que pueden ser aplicados en diversos
contextos y con diferentes tipos de datos, lo que les permite ser una herramienta poderosa
en una amplia gama de aplicaciones, desde la resolución de problemas matemáticos
simples hasta la conducción de investigaciones complejas y el desarrollo de software
avanzado.
Definición y características.
Un algoritmo efectivo es una herramienta vital en la programación y la informática,
distinguido por una serie de características clave. La primera y más importante es la
claridad y la precisión. Un algoritmo debe ser lo suficientemente detallado para evitar
cualquier ambigüedad, asegurando que cada paso sea comprensible y ejecutable sin dejar
espacio para interpretaciones erróneas. Otra característica crucial es que debe ser finito.
Esto significa que, después de un número específico de pasos, el algoritmo debe llegar a
una conclusión o solución, evitando bucles infinitos o procesos sin fin. Además, cada paso
del algoritmo y su secuencia deben estar claramente definidos y bien estructurados. El
orden de los pasos es fundamental, ya que dicta la manera en que se ejecutan las
instrucciones para alcanzar el resultado deseado de manera eficiente. Estas características
aseguran que los algoritmos sean precisos, confiables y efectivos en su aplicación.
Esta omnipresencia de los algoritmos muestra cómo son esenciales no solo en el campo de
la informática, sino en prácticamente todos los aspectos de la vida moderna. Su capacidad
para procesar y analizar grandes cantidades de datos y tomar decisiones basadas en esos
análisis los convierte en herramientas poderosas y transformadoras en nuestra sociedad.
Entrada: Se refiere a los datos que el algoritmo recibe. Estos pueden ser números, texto, o
cualquier otro tipo de información que será utilizada en el proceso de cálculo o toma de
decisiones.
Salida: Son los resultados que el algoritmo produce después de realizar sus procesos.
Estos resultados pueden variar dependiendo del tipo de algoritmo y de los datos de entrada
que se le proporcionen.
Finitud: La finitud implica que el algoritmo debe tener un final definido. Después de un
número determinado de pasos, el algoritmo debe concluir su ejecución. Esto evita bucles
infinitos y asegura que el algoritmo produzca un resultado en un tiempo razonable. La finitud
es crucial para la eficacia del algoritmo, garantizando que cumpla su propósito de manera
oportuna.
Definición: Cada paso del algoritmo debe estar claramente definido, sin dejar lugar a dudas
sobre lo que se debe hacer en cada momento. Una definición precisa de cada paso ayuda a
prevenir errores y malentendidos durante la ejecución del algoritmo, lo que es esencial para
su correcto funcionamiento y fiabilidad.
Orden: El orden en el que se ejecutan los pasos en un algoritmo es vital. La secuencia dicta
el funcionamiento del algoritmo y, por lo tanto, su resultado final. Un cambio en el orden de
los pasos puede alterar significativamente los resultados, lo que hace que el establecimiento
de un orden lógico y eficiente sea un aspecto crítico en el diseño del algoritmo.
Al seguir estos principios, los programadores pueden garantizar que sus algoritmos sean
robustos, confiables y eficientes. Estos fundamentos no solo aseguran que el algoritmo
funcione según lo previsto, sino que también lo hacen útil y práctico para la resolución de
problemas en una variedad de contextos. La adhesión a estos principios es lo que diferencia
a los algoritmos bien diseñados de aquellos que son propensos a errores y fallas, y es un
aspecto crucial en la creación de soluciones tecnológicas efectivas y fiables.
Representación de Algoritmos
La representación de algoritmos se puede realizar de diversas maneras, cada una
adecuada para diferentes etapas del desarrollo o para diferentes públicos. Las tres formas
más comunes son los diagramas de flujo, el pseudocódigo y el código fuente.
Óvalo: Representa el inicio o fin del algoritmo. Es el punto de partida o conclusión del
proceso.
Flechas: Dirigen el flujo del proceso, conectando los diferentes símbolos y mostrando la
dirección de la secuencia de pasos.
Veamos otro ejemplo de pseudocódigo, esta vez para un algoritmo que calcula la suma de
dos números:
En este pseudocódigo, el algoritmo comienza leyendo dos números, luego calcula su suma
y finalmente muestra el resultado. Este ejemplo ilustra cómo el pseudocódigo puede usarse
para representar de manera sencilla y clara los pasos lógicos de un algoritmo.
Cada lenguaje de programación tiene sus características y se elige según los requisitos del
proyecto. Por ejemplo, Python es conocido por su simplicidad y legibilidad, mientras que
C++ se utiliza para programas que requieren un manejo eficiente de los recursos del
sistema.
Un ejemplo simple en código fuente para el algoritmo de suma de dos números en Python
sería:
3. Diagramas de Flujo
Vimos que los diagramas de flujo son representaciones visuales que muestran los pasos de
un proceso o algoritmo mediante símbolos estándar para representar diferentes tipos de
acciones o decisiones.
● Definir el Problema: Antes de dibujar, es esencial tener una comprensión clara del
problema o proceso a diagramar.
● Identificar los Pasos Principales: Enumerar las principales acciones o decisiones
involucradas.
● Organizar los Símbolos: Colocar los símbolos en un orden lógico, utilizando
flechas para mostrar el flujo.
● Refinar y Revisar: Asegurarse de que el diagrama sea claro y represente con
precisión el proceso.
Ejemplos Prácticos y Ejercicios
Al algoritmo para un proceso de decisión de si un número es positivo o negativo que vimos
antes:
Análisis de Problemas
Diseño de Soluciones
Idear un Plan: Una vez que se entiende el problema, el siguiente paso es planificar cómo
abordarlo. Esto puede incluir decidir qué algoritmos o estructuras de datos utilizar.
Desarrollar un Algoritmo: Crear un algoritmo paso a paso para resolver el problema. Aquí
es útil usar herramientas como pseudocódigo o diagramas de flujo.
Probar con Ejemplos: Antes de escribir el código completo, es útil probar el algoritmo con
ejemplos o casos de prueba para asegurarse de que funciona como se espera.
Datos: Representan la información con la que trabaja el programa. Pueden ser números,
textos, o cualquier otro tipo de datos que el programa necesite procesar.
Operaciones: Son las acciones que se realizan sobre los datos. Incluyen cálculos
matemáticos, manipulación de texto, control de estructuras de datos y más.
Tipos de Datos
En programación, los tipos de datos son fundamentales para definir qué tipo de información
puede ser almacenada y manipulada dentro de un programa. Algunos de los tipos de datos
más comunes incluyen:
Cada tipo de dato tiene un propósito específico y su elección depende del tipo de
información que se desea manejar en el programa. Entender estos tipos de datos es crucial
para el manejo efectivo de la información y la lógica del programa.
Definición: Son más abstractos y se alejan del lenguaje de la máquina, lo que los hace más
fáciles de entender y usar para los humanos. Su sintaxis y estructuras se asemejan al
lenguaje humano o matemático.
Ventajas: Facilidad de aprendizaje, portabilidad entre diferentes sistemas y eficiencia en el
desarrollo.
Ejemplos:
Python: Famoso por su simplicidad y legibilidad, es ampliamente utilizado en ciencia de
datos y aprendizaje automático.
Definición: Están más cerca del lenguaje de máquina, lo que les permite un control más
detallado y eficiente del hardware.
Ventajas: Mayor control sobre los recursos del sistema, lo que puede traducirse en un
rendimiento más rápido y eficiente.
Ejemplos:
Ensamblador: Permite escribir programas que interactúan directamente con el hardware
del sistema.
La elección entre estos lenguajes depende del proyecto, los requisitos técnicos y las
preferencias o habilidades del programador.
Características: El código fuente se traduce una sola vez al lenguaje de máquina por un
compilador antes de su ejecución. Esta traducción resulta en un archivo ejecutable.
Lenguajes Interpretados
La elección entre uno y otro depende de factores como el rendimiento deseado, la facilidad
de desarrollo y depuración, y las necesidades específicas del proyecto.
6. Introducción a PSeInt
Para empezar con PSeInt, los principiantes deben familiarizarse primero con su entorno de
trabajo. Este entorno proporciona una ventana para escribir pseudocódigo y otra para ver el
flujo de ejecución del programa. Al escribir en pseudocódigo, PSeInt ayuda a entender
cómo estructurar un programa, cómo se procesan los datos, y cómo se ejecutan las
instrucciones paso a paso.
Uno de los principales beneficios de PSeInt para los principiantes es que les permite
experimentar con la lógica de programación y algoritmos básicos antes de sumergirse en
lenguajes de programación más complejos. Ofrece una forma interactiva y visual de
aprender los conceptos fundamentales, lo que puede ser muy motivador y esclarecedor
para los que están dando sus primeros pasos en programación.
Entorno de Escritura de Pseudocódigo: Una interfaz intuitiva donde los usuarios escriben
sus algoritmos en un formato que imita el lenguaje natural.
Ventana de Flujo de Ejecución: Permite a los usuarios ver cómo se ejecuta su algoritmo
paso a paso, facilitando la comprensión de la lógica de programación.
De eso trata la primera parte de este curso. En las clases siguientes aprenderemos lo
necesario para poder entender y escribir código como el que vemos a continuación.
Ejemplos en PSeInt
Cálculo de la Media de Tres Números
Este algoritmo solicita al usuario que ingrese tres números, luego calcula la media sumando
estos números y dividiendo el resultado entre tres, y finalmente muestra la media calculada.
Tipos de dato y PSeInt
Datos en programación
En programación, los datos son elementos fundamentales y forman la base sobre la cual
operan los algoritmos y las estructuras de datos. Por ejemplo, en un programa que calcula
el promedio de una serie de números, cada número es un "dato". Los datos se almacenan
en variables y constantes y pueden ser manipulados para realizar cálculos, tomar
decisiones y más.
Esta distinción es crucial para entender cómo los programas interactúan con la información
y cómo esta información es procesada y transformada para obtener resultados útiles.
Tipos de datos
En programación, los tipos de datos simples son las categorías básicas en las que se
pueden clasificar los datos. Estos tipos definen la naturaleza de los datos que una variable
puede contener y cómo se pueden manipular. Los tipos de datos simples más comunes son
los siguientes:
Datos numéricos:
Los datos numéricos son esenciales para representar y manipular números. Estos datos
pueden ser enteros (positivos o negativos, pero sin decimales) o reales (positivos o
negativos, con decimales), y cada uno tiene características únicas:
Reales: Usados para representar números con decimales. Son cruciales para
cálculos que requieren precisión como en ciencias o ingeniería.
Ejemplo: 3.14, -0.55.
El tipo de número elegido afecta la cantidad de memoria utilizada. Por ejemplo, los números
enteros suelen ocupar menos memoria que los números de punto flotante.
Variables: Son contenedores para almacenar datos que pueden cambiar durante la
ejecución de un programa. Por ejemplo, una variable puede almacenar el resultado de una
operación matemática, el input de un usuario o cualquier valor que necesite ser modificado
o consultado a lo largo del programa. Las variables son dinámicas, lo que significa que su
valor puede variar.
Cada variable tiene un identificador (nombre que las identifica), un tipo (clase de dato que
contiene) y un valor.
Más adelante veremos cómo crear y caracterizar variables.
Constantes: A diferencia de las variables, las constantes almacenan datos que no cambian
durante la vida del programa. Una vez que se asigna un valor a una constante, este no
puede ser modificado. Las constantes son útiles para almacenar valores que son
fundamentales para el funcionamiento del programa y que no deben ser alterados, como el
valor de pi (π), la tasa de interés en un cálculo financiero o la URL de una API.
Modo Flexible: En este modo, que es el que usamos a lo largo de este curso, no es
necesario declarar las variables antes de usarlas. PSeInt automáticamente asume el tipo de
dato basado en el contexto y el valor asignado a la variable. Esto hace que el código sea
más fácil de escribir para los principiantes, ya que pueden concentrarse en la lógica del
algoritmo sin preocuparse por los detalles de la declaración de tipos.
Ejemplo:
Modo Estricto: En el modo estricto, todas las variables deben declararse explícitamente
con su tipo antes de ser utilizadas. Esto significa usar la sintaxis "Definir... Como..." para
cada variable. Este modo es más riguroso y se asemeja más a la programación en
lenguajes fuertemente tipados, donde la declaración explícita del tipo de variable es
necesaria.
Ejemplo:
El modo estricto es útil para enseñar a los estudiantes la importancia del tipado en
programación y prepararlos para lenguajes más complejos, como JAVA o C, mientras que
el modo flexible es ideal para enfocarse en conceptos básicos de algoritmia y en el uso de
lenguajes más “amigables”, como Python.
Inicio con Letra: Los nombres de las variables deben comenzar con una letra. Esto ayuda
a diferenciar las variables de otros elementos como los números.
Brevedad y descriptividad: Ser conciso pero descriptivo. Evitar nombres demasiado largos
o crípticos.
Evitar palabras reservadas: No utilizar nombres que sean palabras reservadas en PSeInt
o que puedan confundirse con ellas, como Si, Entonces, FinSi.
Seguir estas prácticas ayuda a garantizar que el código sea accesible no solo para el
programador original, sino también para otros que puedan trabajar con el código en el
futuro.
Y esta muestra ejemplos de nombres de variables que cumplen y no cumplen con las
buenas prácticas en programación:
En la columna "Cumple", los nombres de variables son claros, descriptivos y siguen un
estilo consistente, lo que facilita la comprensión de su propósito. En la columna "No
Cumple", los nombres son ambiguos, demasiado breves o no descriptivos, lo que puede
llevar a confusión o dificultar la comprensión del código.
Fuertemente tipados: En estos lenguajes, las operaciones entre tipos de datos diferentes
están restringidas. Por ejemplo, intentar sumar un número y una cadena de texto resultaría
en un error. Esto asegura un mayor control sobre los tipos de datos y reduce los errores en
tiempo de ejecución. Ejemplos incluyen Java y C++.
Tipado estático: En estos lenguajes, el tipo de cada variable debe definirse explícitamente
y no cambia a lo largo del tiempo. Esto proporciona claridad y previene ciertos tipos de
errores, pero puede hacer el código más extenso. Ejemplos son Java y C++.
Cada estilo tiene sus ventajas y desventajas, y la elección depende de las necesidades
específicas del proyecto y las preferencias del programador.
Operador de asignación
En PSeInt, el "operador de asignación" se utiliza para asignar un valor a una variable. Este
operador es el signo igual (=).
Inicialización y reasignación
La inicialización y reasignación son conceptos fundamentales en programación, ya que
permiten que las variables almacenen y actualicen los datos a lo largo de un programa.
Inicializar una variable significa asignarle un valor por primera vez. Es el momento en que
se define qué información va a contener la variable. Por ejemplo, en numero = 5, si numero
no tenía un valor antes, estamos inicializándola con el valor 5.
Cuando se asigna un valor a una variable, PSeInt detecta automáticamente su tipo de dato,
ya que es un lenguaje de tipado dinámico.
Reasignar una variable implica cambiar su valor después de haber sido inicializado. Esto
significa que la variable ya tenía un valor, pero se le asigna uno nuevo. Por ejemplo, si más
adelante en el código escribimos numero = 10, estamos reasignando un nuevo valor (10) a
la variable numero que ya tenía asignado el valor 5.
Para descargar e instalar PSeInt en una PC con Windows, sigue estos pasos:
Acceder a la página oficial: Ve a la página web oficial de PSeInt para obtener la versión
más reciente.
https://pseint.sourceforge.net/
Finalizar la instalación: Una vez completados los pasos, PSeInt estará instalado en tu PC
y listo para usarse.
Siempre es recomendable descargar PSeInt desde su sitio web oficial para asegurarse de
obtener la versión más actual y segura del software.
PSeInt: Configuración
Ahora, necesitamos configurar el entorno de programación para que se ajuste a las
necesidades de este curso. Para ello, debemos ir al menú Configurar y luego a Opciones
del Lenguaje (perfiles). Hacer click.
Escribir “flexible” en el buscador, seleccionar “Flexible” en los resultados y hacer click en
Aceptar.
1) Abre PSeInt.
2) Escribe el siguiente pseudocódigo: