Introducción
Objetivos
- Comprender los conceptos básicos de programación: algoritmo y programa.
- Conocer las etapas básicas de desarrollo de un programa.
- Entender la diferencia entre diseño e implementación y comprender la importancia que el diseño de algoritmos tiene en la programación.
Introducción
En esta asignatura aprenderéis los conceptos y las herramientas necesarias para poder crear programas que resuelvan problemas. El objetivo es que a partir de una descripción no formal de una necesidad o problema (como por ejemplo la que podría hacer un cliente no informático que quiere un programa para su negocio) sepáis resolverlo implementado un programa en lenguaje C.
Con tal fin, trabajaremos en paralelo dos tipos de lenguaje:
- Lenguaje algorítmico, notación algorítmica o pseudocódigo: es una convención adoptada para definir los problemas de una manera más sencilla y comprensible. En la bibliografía se puede encontrar diversas formulaciones o convenciones de lenguaje algorítmico, pero, dado que todas tienen las mismas estructuras, resulta sencillo comprender los algoritmos independientemente de la convención que se utilice.
En esta asignatura utilizaremos el lenguaje algorítmico resumido en la siguiente notación: guía de notación algorítmica o Nomenclator.
Podríamos decir que ser trata de un lenguaje de programación genérico que nos ayuda a pasar de un enunciado no formal a su formalización precisa independientemente del lenguaje de programación que se utilizará para escribir el programa. Al ser un lenguaje que no es ejecutable directamente por un ordenador, permite cierta flexibilidad.
Está formado por las mismas estructuras que un lenguaje de programación, pero es importante no confundirlos.
- Lenguaje de programación: es un lenguaje formal capaz de ser comprendido por un ordenador. Su definición incluye diferentes estructuras e instrucciones que, combinadas convenientemente, permiten resolver problemas mediante la ejecución de los programas. Existen diversos tipos de lenguajes de programación.
Finalmente, potenciaremos la capacidad de buscar información en internet. Saber cómo encontrar e interpretar la información que hay en internet es una competencia fundamental para poder desarrollarse como programador, ya que la programación es un campo muy dinámico y constantemente aparecen nuevos lenguajes o funcionalidades que pueden ayudarnos a hacer programas de forma más ágil y segura. Además, es un muy buen lugar para encontrar programas ya hechos por otros programadores y que a menudo los podemos utilizar directamente (licencias abiertas).
1. Introducción a la programación
Leed el siguiente documento, en el cual se introducen los conceptos básicos de la asignatura. Atención: este documento no sigue la misma anotación algorítmica que utilizaremos durante el curso. En breve actualizaremos la notación. El contenido que se explica, sin embargo, es plenamente válido y vigente.
2. Ejemplos
A continuación, ilustraremos con dos ejemplos los conceptos de algoritmo y de pruebas de un programa.
2.1. Ejemplo 1: algoritmo Tortilla de patatas
Un ejemplo de algoritmo podría ser cualquier receta de cocina. Por ejemplo, el algoritmo "Hacer una tortilla de patatas" se podría especificar de la siguiente forma:
Ingredientes (variables):
- Bol.
- Sartén.
- Fogón.
- Patatas.
- 4 huevos.
- Aceite.
- Sal.
- Cebolla.
Pasos a seguir (algoritmo):
- Cascar los huevos y ponerlos en el bol.
- Batir los huevos en el bol hasta que queden uniformes.
- Pelar las patatas.
- Cortar las patatas en trozos no demasiado grandes.
- Pelar la cebolla.
- Cortar la cebolla en trozos no demasiado grandes.
- Encender el fogón.
- Poner la sartén en el fogón.
- Poner el aceite en la sartén.
- Cuando el aceite esté caliente, poner el contenido del bol en la sartén, junto con las patatas y la cebolla.
- Mientras no tenga una forma consistente, batir la mezcla.
- Cuando la tortilla esté hecha, apagar el fogón y poner en un plato.
2.2. Ejemplo 2: pruebas de un programa calculadora
Imaginad que queremos hacer un programa que sea una calculadora muy simple, que permite hacer solo una operación matemática (suma, resta, multiplicación y división) de dos enteros positivos y como mucho 3 cifras. Como datos del programa tenemos 3 valores:
- Operación,
- Operando1,
- Operando2,
y el programa generará un resultado:
- Resultado.
Para simplificar la notación de las pruebas, las podemos escribir así:
(Operación, Operando1, Operando2) -->; Resultado
Antes de empezar, y sin ni siquiera saber cómo haremos este programa, podemos definir una serie de casos que nos permitirán comprobar que, una vez hecho, nuestro programa funciona correctamente. Podemos probar muchos aspectos del programa, pero en general siempre se deberían comprobar como mínimo los siguientes:
- Datos de entrada al programa: los datos de entrada no dependen de nuestro programa, generalmente vienen dados por otro programa o por un usuario. Por lo tanto, se debe asumir que pueden contener errores y nuestro programa debe reaccionar correctamente a estos errores, por ejemplo, mostrando un mensaje de error.
- (%,3,5) -->; Error. (Dado que la operación no es ninguna de las cuatro indicadas, el programa debería mostrar un error).
- (+,a,6) -->; Error. (Dado que el Operando1 no es un número, el programa debería mostrar un error).
- (-,3,1000) -->; Error. (Dado que el Operando2 tiene más de 3 cifras, el programa debería mostrar un error).
- Casos especiales: si los datos de entrada tienen rangos definidos, se debe comprobar qué pasa en los puntos extremos. En este caso, nos dicen que los operandos son enteros positivos de como máximo 3 cifras, o sea, que deben estar entre 0 y 999. Deberemos comprobar los casos extremos:
- (*, 999, 999) -->; 998001. (En este caso comprobaremos que realmente nuestro programa es capaz de trabajar con valores máximos del rango y, por lo tanto, que hemos tenido en cuenta que los resultados pueden tener más de 3 cifras).
- (*, 0, 0) -->; 0
- (+, 0, 0) -->; 0
- (-, 0, 0) -->; 0
- (/, 0, 0) -->; Error. (Dividir por cero puede ser un problema. Por lo tanto, debemos tenerlo presente y decidir cuál es el resultado esperado. En este caso, podríamos decidir que queremos que se muestre un error).
- (-,0,999) -->; -999. (Aunque los operandos de entrada deban ser positivos, el resultado puede ser negativo. Esta prueba nos asegura que lo tenemos en cuenta).
- (/,4,3) -->; 1. (En el caso de la división, puede pasar que el resultado no sea un valor entero. Se deberá decidir qué haremos en estos casos si el resultado puede no es entero o si hacemos la división entera como hemos hecho en este ejemplo).
- Casos normales: se debe probar el resultado esperado en un conjunto de datos conocidos, a poder ser lo más representativos posible.
- (+,2,3) -->; 5
- (*,2,3) -->; 6
- (/,4,2) -->; 2
Definir las pruebas antes de empezar a hacer un programa es una forma de diseño de programas conocida como 'test-driven development,' y permite medir la evolución de nuestro programa mientras la estamos haciendo, o sea, inicialmente todas las pruebas fallarán, pero a medida que vamos avanzando en su implementación, las pruebas irán funcionando. También tiene la ventaja de que si tenemos que hacer modificaciones a nuestro programa posteriormente, las pruebas nos aseguran que este continúa funcionando correctamente.
3. Ejercicios
Aquí planteamos dos ejercicios similares a los ejemplos anteriores. Os recomendamos que intentéis hacerlos y si queréis podéis compartirlos en el foro del aula para comentarlos con el profesor y con vuestros compañeros.
3.1. Ejercicio 1 (algoritmos)
Escribid el algoritmo "Cambiar rueda" que explique los pasos a seguir para cambiar una rueda de un coche
Variables:
Ruedas.
Tuercas.
Gato hidraulico.
Llave pare pernos de rueda.
Rueda de recambio.
Algoritmo:
Seleccionar una de las 4 ruedas.
Poner gato hidraulico.
Levantar el coche con el gato hidráulico.
Coger llave de pernos.
Aflojar las tuercas, quitarlas, repetir proceso tantas veces sea necesario hasta quitar todas las tuercas.
Retirar rueda.
Poner rueda nueva.
Poner las tuercas y apretarlas hasta que queden bien apretadas.
Bajar el coche con gato hidraulico.
Retirar gato hidraulico
3.2. Ejercicio 2 (pruebas)
Queremos hacer un programa para contar las letras de una palabra. La entrada al programa será una palabra, y queremos que la salida sea el número de letras que contiene. Define un conjunto de pruebas para este programa.
Resumen
En esta unidad hemos visto los conceptos básicos de programación. Estos conceptos se pueden resumir en:
- Qué es un programa y un algoritmo.
- Pasos a seguir para hacer un programa.
- Qué quiere decir probar un programa.
Trabajaremos estos conceptos durante el curso en las distintas unidades teóricas y prácticas.