Publicado el 13 de Junio del 2019
796 visualizaciones desde el 13 de Junio del 2019
1,7 MB
15 paginas
Desarrollo de programas
Desarrollo de programas
Dos ideas previas sencillas:
� El objetivo de un programa es resolver un problema.
� El ordenador no piensa, solo ejecuta un programa dado.
Un programa tiene que estar bien escrito de acuerdo con la
sintaxis del lenguaje, para que pueda ser ejecutado.
Pero además debe ser correcto
¿Qué significa que un programa sea correcto?
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Programas correctos (I)
Un programa es correcto si hace exactamente la tarea para la
que ha sido diseñado.
Formalmente: es correcto si se comporta exactamente según
una especificación dada. La especificación define o describe lo
que debe hacer hacer el programa.
A su vez la especificación puede ser:
� Formal (utilizando lenguajes formales de especificación, que
utilizan la lógica matemática). Por ejemplo, con el modelo
de precondición y postcondición y la lógica de Hoare.
� Menos formal, utilizando lenguaje natural.
En cualquier caso la especificación debe ser absolutamente
precisa a la hora de describir qué debe hacer el programa.
Programas correctos (II)
En particular, un programa correcto:
� Debe funcionar para todos los casos previstos, dando el
resultado esperado según la especificación
� Debe estar completamente libre de errores.
� Debe terminar adecuadamente
Además, la buena metodología de programación busca que los
programas:
� Estén bien estructurados (bloques de código bien
organizados)
� Sean eficientes en tiempo de ejecución y en consumo de
memoria (en general, en consumo de recursos).
� Estén escritos de forma clara y bien documentados. Con
ello se consigue que sean más fáciles de entender, reutilizar
y mantener.
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Desarrollo de programas. Metodología.
1. Análisis y Especificación del problema (¿QUÉ?):
� extraer información relevante, eliminar ambig¨uedades del
planteamiento
� identificar los datos de entrada o input y los datos de salida o output y
qué hay que hacer
2. Diseño de un algoritmo (¿C ÓMO?): precisar los pasos para obtener la
solución requerida (output) a partir de la entrada (input).
� Partir de planteamiento general prescindiendo de detalles (dejar pendientes
subproblemas más pequeños). Después abordar estos subproblemas con la
misma técnica � Diseño descendente o divide y vencerás o aproximación
por refinamientos sucesivos.
3. Implementar el algoritmo en un lenguaje concreto (como C#, en nuestro
caso). Compilarlo, corregir posibles errores de sintáxis, ...
4. Probar y depurar (test): comprobar el funcionamiento del programa con
una batería de ejemplos intentando cubrir toda la casuística posible.
� Otra alternativa verificación formal de la corrección del algoritmo �
demostración formal (matemática) utilizando la lógica de Hoare,
verificadores (semi)-automáticos de programas...
Desarrollo de programas (II)
Es habitual completar las 4 fases anteriores e iterar, es decir,
volver a la fase 1, repasar la especificación (a veces el diseño del
algoritmo o la propia implementación requieren modificar la
especificación), adaptar la implementación, etc....
En en el ciclo de vida de un programa, puede incluirse la fase 5:
� Mantenimiento: modificaciones y actualizaciones de
programa para satisfacer nuevos requisitos o aumentar
prestaciones (o corregir errores no detectados).
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Ejemplo (I)
Problema:
averiguar el más pequeño entre dos números dados en cualquier orden
Primer paso, Análisis y especificación:
� Información irrelevante?: “dados en cualquier orden”
� Ambig¨uedad?: ¿cuál es el más pequeño entre 6 y 6?...
� suponemos que el usuario (cliente) desea 6 como respuesta
(o se lo preguntamos para aclararlo)
� Imprecisión?: los números dados, ¿son naturales, enteros,
reales, complejos?...
� supondremos que son enteros (o preguntamos al cliente)
Ejemplo (II)
Especificación (distintas formas de hacerla):
� en lenguaje natural (español), pero precisa:
determinar el mínimo entre dos enteros dados
� más formal, apoyada en lenguaje lógico/matemático:
y
si x ≤ y
en otro caso
� completamente formal, p.e., en estilo funcional:
dados x, y ∈ Z determinar z = min(x, y) siendo
min(x, y) =� x
se nos pide una función f : (Z, Z) → Z que verifique:
f (x, y) =� x
si x ≤ y
en otro caso
y
Identificamos entrada y salida (input/output):
� input: dos números enteros, x, y
� output: el más pequeño de ellos, mínimo entre x y y.
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Ejemplo (III)
Segundo paso, diseño del algoritmo: secuencia de acciones a
realizar.
� Aproximación I:
solicitar de teclado los números de entrada x e y
calcular en z el mínimo de x e y
escribir z en pantalla
� Aproximación II (refinamiento de I):
solicitar de teclado los números de entrada x e y
si x ≤ y hacer z = x
en caso contrario hacer z = y
escribir z en pantalla
Ejemplo (III)
� Aproximación III (refinamiento de II):
escribir ’x? ’ en pantalla
leer el valor de x de teclado
escribir ‘y? ‘ en pantalla
leer el valor de y de teclado
si x ≤ y hacer z = x
en caso contrario hacer z = y
escribir ’z =’ en pantalla
escribir el valor de z en pantalla
En este nivel de refinamiento se ha detallado suficientemente el
algoritmo, si no, se continuaría.
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Diagramas de flujo para algoritmos: otra forma de presentar los
algoritmos (no la utilizaremos habitualmente):
Ejemplo (IV)
Ahora habría que hacer la implementación en un lenguaje
concreto. Por ejemplo, en Python se podría hacer como (ahora
no nos importan los detalles del lenguaje):
print "Primer entero: ",
x = int(input())
print "Segundo entero: ",
y = int(input())
if x <= y:
z = x
else:
z = y
print "El menor es: ", z
✞
✝
☎
✆
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Ejemplo (V)
Quinto paso, test.
Primer entero:
Segundo entero:
El menor es:
-17
8
-17
Esto es simplemente un test, no un prueba de corrección.
Verificación formal:
{P0 ≡ x, y, z ∈ Z}
precondición
programa
−→
postcondición
if (x<=y) then z:=x
else z:=y
{P1 ≡ z = min(x, y)}
La lógica de Hoare define el comportamiento de cada instrucción.
Ejemplo (VI)
Mantenimiento. El usuario pide solicita cambios:
� Cambio en la especificación: los números en vez de enteros
que sean reales (ampliación de la funcionalidad).
� Cambios de petición y presentación de datos: que pida los
dos números a la vez, que escriba en salida también los
números de entrada.
En general, en grandes programas a veces hay pequeños (o
grandes) errores. Una parte del mantenimiento también
consiste en corregir estos errores.
Esta secuencia es lo que habitualmente se denomina ciclo de
vida del Software.
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Otro ejemplo
Problema:
calcular la suma de los n primeros naturales
� Análisis y especificación:
dado n ∈ N evaluar 1 + 2 + . . . + n (en términos
matemáticos Σn
input: n ∈ N; output: 1 + 2 + . . . + n
i=1i)
� Algoritmo: (sin aplicar la fórmula conocida)
Aproximación I:
solicitar de teclado el valor n
calcular Suma = 1 + 2 + . . . + n
escribir Suma en pantalla
Refinamiento
Refinamiento I (sólo del cálculo en sí):
inicializar Suma = 0
repetir desde i = 1 hasta n
Suma = Suma + i
Implementación (ahora en Pascal):
{Este programa calcula la suma...}
program sumatorio;
var i,n,suma: integer;
begin
write(’valor de n: ’); readln(n);
suma:=0;
for i:=1 to n do
{inicialización del acumulador}
{se va incrementando el acumulador}
{sumando los valores de i}
suma:=suma+i;
writeln(’la suma es: ’, suma);
end.
Luego depuración, mantenimiento...
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Compiladores
Nuestro primer programa en C#: “hola mundo!”
✞
using System;
class HolaMundo
{
static void Main()
{
Console.WriteLine ("Hola mundo!!");
}
}✝
No es necesario entender este programa por ahora...
☎
✆
� Lo escribimos en nuestro editor de texto favorito (emacs,
gedit, notepad, ...)
� Lo guardamos en un archivo holaMundo.cs
� Cómo lo ejecutamos?
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Compilando desde línea de comandos (I)
La línea de comandos todavía existe! (en Linux, Windows,
Mac...)
Compilando desde línea de comandos (II)
� Compilación desde línea de comandos (desde un terminal):
> mcs holaMundo.cs
� Esto produce un ejecutable holaMundo.exe
� Para ejecutar el programa, desde línea de comandos:
> holaMundo.exe
� Y produce el resultado esperado... acabamos de escribir, compilar y
ejecutar nuestro primer programa!
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Pero...
� ¿Qué significa exactamente compilar un programa?
� ¿Qué es un compilador?
� ¿Qué significa ejecutar un programa?
� ¿Quién compila?
� ¿Quién ejecuta?
¿Qué significa exactamente compilar un programa?
Compilar es traducir: se traduce el código fuente escrito en un
lenguaje de programación (como C#) código objeto. Este
código objeto:
� puede ser código binario para una máquina real (CPU)
directamente ejecutable por la misma (ceros y unos que
“entiende” el ordenador, i.e., instrucciones para el
microprocesador)
� o puede ser código para una máquina virtual (bytecode),
que puede ser fácilmente convertible en código ejecutable
de manera eficien
Comentarios de: Desarrollo de programas (0)
No hay comentarios