Elementos de programación

Anuncio
UNIVERSIDAD DE MALAGA
DPTO. DE LENGUAJES Y C. DE LA COMPUTACION
E.T.S. DE INGENIERIA INFORMATICA
INGENIERIA INFORMATICA
ELEMENTOS DE PROGRAMACION I
(CURSO 2000-2001)
CRITERIOS GENERALES
DE ESTILO
EN PROGRAMACIÓN
&5,7(5,26*(1(5$/(662%5(
(/(67,/2(1352*5$0$&,Ï1
Para obtener buenos programas no basta con escribir un determinado código y comprobar que
funciona. Es muy probable que, por muy diversas razones, dichos programas deban ser modificados en el
futuro. Por ello, un buen programador no se debe conformar con que un programa aparentemente funcione,
sino que debe preocuparse de que cumpla una serie de requisitos que faciliten futuras modificaciones y/o la
búsqueda y corrección de errores. Dichos requisitos podrían ser divididos en dos categorías. En una estarían
aquellos requisitos provenientes de la necesidad de aplicar correctamente los principios básicos de la
programación (modularización, diseño descendente, etc), a lo que podríamos denominar HVWLORGHGLVHxR. En
la otra estarían aquellos requisitos necesarios para conseguir que la presentación del programa favorezca su
legibilidad (documentación, sangrado, etc), a lo que podríamos denominar HVWLORGHSUHVHQWDFLyQ.
Este documento se ha elaborado con la intención de resaltar la importancia de tener en cuenta
DPERV DVSHFWRV a la hora de desarrollar un programa. Para ello, en primer lugar se resumirán aquellos
aspectos básicos que podrían configurar lo que hemos denominado estilo de diseño, y posteriormente se hará
hincapié en los principales puntos que conducen a disponer de programas con un adecuado estilo de
presentación.
Es imprescindible que el alumno aplique correctamente todos los principios básicos de
programación que contribuyen a un buen diseño de programas. Sin embargo, no se exigirá que el alumno
aplique exactamente el estilo de presentación que se propondrá más adelante, aunque sí se exigirá que el
estilo aplicado a los programas cumpla unas normas básicas que doten al texto obtenido de una mínima
coherencia y legibilidad.
Se recomienda, no obstante, que el alumno utilice el estilo de presentación que se detallará más
adelante, ya que ello contribuirá a homogeneizar la presentación de los programas de los diferentes
programadores, facilitando la lectura de los programas de unos por otros.
1250$6 '( (67,/2 $ 7(1(5 (1 &8(17$ (1 (/ ',6(f2 '(/
352*5$0$
En este apartado se repasarán aquellos principios básicos que son generalmente considerados como
buenas pautas a seguir de cara a conseguir programas con unos requisitos mínimos de calidad. Además, se
exponen una serie de recomendaciones que, sin ser principios básicos, contribuyen a mejorar el diseño de los
programas.
No se pretende explicar ni justificar la conveniencia de la aplicación de tales principios, sino tan
solo hacer hincapié en la necesidad de que el alumno los tenga en cuenta a la hora de elaborar sus programas,
y no piense que se trata de cuestiones teóricas que después no necesita aplicar a los programas que desarrolla.
Para ello, se han redactado como un documento recopilatorio que pueda ser consultado de forma rápida por
el alumno hasta que la forma de razonar y programar que llevan implícitos resulte natural en el alumno. Si el
alumno no es capaz de discutir y valorar la conveniencia de tener en cuenta alguno de estos principios, se
recomienda que repase los aspectos básicos de la teoría de la programación que atañen a dicho punto.
_______________________________________________________________________________________
CRITERIOS GENERALES SOBRE EL ESTILO EN PROGRAMACIÓN
Pág 2
Dpto. Lenguajes y Ciencias de la Computación ( Universidad de Málaga )
1RUPDVEiVLFDV
Se deben aplicar siempre porque forman parte de la teoría básica
• $SOLTXHODPHWRGRORJtDGHGLVHxRGHVFHQGHQWH
• 3LHQVHHQODVHVWUXFWXUDVGHGDWRVDXWLOL]DUDQWHVGHFRQVLGHUDUODVHVWUXFWXUDVGHFRQWURO
• 6HDFXLGDGRVRDOHOHJLUODUHSUHVHQWDFLyQDGHFXDGDSDUDVXVGDWRV. Ello puede afectar en gran medida a
su programa.
• 0RGXODULFH8VHVXESURJUDPDV
• (YLWHP~WLSOHVVDOLGDVGHORVVXESURJUDPDV. Cada subprograma debe tener un único punto de entrada y
un único punto de salida.
• +X\DGHORVHIHFWRVODWHUDOHV. Haga visible el acoplamiento entre los subprogramas.
• 8Q VXESURJUDPD GHEH VHU HO UHVXOWDGR GH OD DEVWUDFFLyQ GH XQD ~QLFD RSHUDFLyQ. Si se combinan
diversas funcionalidades en el mismo subprograma éste será dificilmente reutilizable.
• 1RXWLOLFHH[FHVLYRVQLYHOHVGHDQLGDPLHQWRHQVXVHVWUXFWXUDVGHFRQWURO
• 6LSURFHGHXVHSURFHGLPLHQWRVUHFXUVLYRVSDUDWUDWDUODVHVWUXFWXUDVGHGDWRVGHILQLGDVUHFXUVLYDPHQWH.
• /LEHUHORVUHFXUVRVHQHOPLVPRVXESURJUDPDTXHORVDGTXLHUH. (Abrir - Usar - Cerrar).
• (YLWHXVDUEXFOHV/223
5HFRPHQGDFLRQHVDWHQHUHQFXHQWD Se deben intentar aplicar
• (VFULED SULPHUR HQ XQ SVHXGROHQJXDMH IiFLO GH FRPSUHQGHU \ OXHJR WUDGX]FD DO OHQJXDMH TXH HVWp
XWLOL]DQGR
• (VFULEDGHIRUPDFODUDQRLQWHQWHVHUGHPDVLDGRLQJHQLRVR. Es más importante obtener un código legible
y con baja probabilidad de errores que hacer alarde de virtuosismo.
• 1RVDFULILTXHFODULGDGSRUHILFLHQFLD
• 1RSDUFKHHHOFyGLJRVLHVQHFHVDULRUHHVFUtEDOR
• 1RVHGHWHQJDHQVXSULPHUERUUDGRUGHOSURJUDPD
• $VHJ~UHVHGHTXHGDYDORUHVLQLFLDOHVDWRGDVODVYDULDEOHVDQWHVGHVXXVR
• (YLWHHOXVRDEXVLYRGHYDULDEOHVWHPSRUDOHV
• 'HMHTXHODPiTXLQDKDJDHOWUDEDMRVXFLR
Por ejemplo, si se desea declarar constantes que representen el número de filas, columnas y elementos de
una tabla, es preferible:
NumFilas = 13;
NumCol
= 7;
NumElem = NumFilas * NumCol;
antes que:
NumFilas = 13;
NumCol
= 7;
NumElem = 91;
porque la primera versión es más clara y menos propensa a errores, y además, no es menos eficiente (los
compiladores hacen dichos cálculos en tiempo de compilación).
• 8WLOLFH,)7+(1(/6((1'SDUDHQIDWL]DUTXHVyORXQDGHGRVDFFLRQHVGHEHVHUHMHFXWDGDEllo suele
ser más claro para expresar la exclusión entre dos alternativas que si en su lugar se utilizan dos
instrucciones IF-THEN-END consecutivas.
• (YLWH ODV H[SUHVLRQHV FRPSOHMDV HQ VXV SURJUDPDV 6L XQD H[SUHVLyQ OyJLFD HV GLItFLO GH FRPSUHQGHU
TXL]iVVHDFRQYHQLHQWHDEVWUDHUODGHILQLHQGRXQRRYDULRVVXESURJUDPDV
• 8WLOLFHDUUD\VSDUDHYLWDUUHSHWLFLRQHV
_______________________________________________________________________________________
CRITERIOS GENERALES SOBRE EL ESTILO EN PROGRAMACIÓN
Pág 3
Dpto. Lenguajes y Ciencias de la Computación ( Universidad de Málaga )
Por ejemplo, compare:
(* ‘Valor’ contiene el valor en pesetas de diversas monedas *)
(* ‘Nombre’ contiene el nombre de cada moneda *)
Ind := NumMonedas;
WHILE (Ind > 0) AND (Importe > 0) DO
Unidades := Importe DIV Valor[Ind];
IF Unidades > 0 THEN
WrCard(Num,0); WrStr(Nombre[Ind]);
END;
Importe :=Importe MOD Valor[Ind];
Ind := Ind - 1
END
Respecto a un ejemplo que use multiples IF para comparar de qué moneda se trata a la hora de escribir y
para saber por qué cantidad dividir.
• (OFXHUSRGHXQEXFOHGHEHVHUXQSURFHVRUHSHWLWLYRPor lo tanto, si alguna acción no repetitiva (que
sólo se ejecuta una vez inmediatamente antes de salir del bucle) aparece dentro de un bucle, plantéese la
posibilidad de rediseñar el código del bucle para que la acción repetitiva no forme parte del cuerpo del
bucle.
• (YLWHUHSHWLUODVPLVPDVDFFLRQHVHQDPEDVDOWHUQDWLYDVGHXQDLQVWUXFFLyQ,)7+(1(/6((1'En la
mayoría de los casos el programa quedaría más claro si se saca factor común de dicha acción y se sitúa
antes o después de la instrucción de selección (además, !ese código se ejecutaría siempre!).
• 1RXWLOLFHHVWUXFWXUDVGHWLSRIF (Cond = TRUE) THEN
• /RVVXESURJUDPDVQRGHEHQVHUH[FHVLYDPHQWHJUDQGHV6LORVRQPRGXODULFHDXQPiV
• &XDQGRPXHVWUHFXDOTXLHUPHQVDMHSRUSDQWDOODHYLWHKDFHUUHIHUHQFLDDOFRQWHQLGRGHOSURJUDPD. Un
mensaje como ERROR 103 EN PROCEDIMIENTO PX11 TRAS ACUMULAR AUX no ayuda nada al
usuario de la aplicación.
• &XDQGRGHVDUUROOHOLEUHUtDVGHFyGLJROLPLWHDOPtQLPRSRVLEOHORVPHQVDMHVSRUSDQWDOOD. Úselos sólo
para informar sobre algún error durante la ejecución. Es el usuario de la biblioteca el que debe dar los
mensajes pertinentes según la aplicación que desarrolle. Evidentemente esto no significa que no pueda
escribirse nada en pantalla desde los procedimientos de una biblioteca pues, por ejemplo, sería entonces
imposible diseñar un módulo para manejar un TAD_MENU que automatice el manejo de menúes. Sólo nos
referimos a operaciones de entrada/salida no directamente relacionadas con el objetivo de la biblioteca.
Por ejemplo, si desarrollamos el TAD COMPLEJO, al codificar la función Leer_Cmp() no incluya
WrStr(“Teclee el número complejo (R,I):”).
1250$6'((67,/2'(35(6(17$&,Ï1
En este apartado se van a comentar algunas sugerencias referentes a las normas de estilo de
presentación que se pueden aplicar a los programas escritos en Modula-2, aunque las recomendaciones son
extensibles a cualquier lenguaje. Se pretende que el lector sea capaz de establecer por sí mismo unas normas
adecuadas que definan su propio estilo de programación y que las aplique a todos los programas que
codifique.
Denominaremos HVWLORGHSUHVHQWDFLyQGHXQSURJUDPD a un conjunto de convenciones y reglas
que se aplican a los programas con el objetivo de facilitar la lectura, depuración y comprensión de los
mismos.
Un estilo de programación debe ser, como mínimo, FRQVLVWHQWH y VLPSOH. Consistente significa, por
ejemplo, que si todos los identificadores de constantes se escriben en mayúsculas, no puede existir una
constante cuyo identificador sea dimension. Simple quiere decir, por ejemplo, que (aunque es
conveniente que los identificadores den idea de aquello a que describen), no tiene utilidad una norma que
establezca que los identificadores de las variables tengan que indicar exactamente el uso de las mismas en el
programa, como VariableQueSeUsaComoVariableDeControlDeBucles.
No existe un criterio unificado sobre las normas que definen un buen estilo de programación y, en la
mayoría de los casos, las normas suelen ser bastante flexibles. En general, se suelen dar recomendaciones
_______________________________________________________________________________________
CRITERIOS GENERALES SOBRE EL ESTILO EN PROGRAMACIÓN
Pág 4
Dpto. Lenguajes y Ciencias de la Computación ( Universidad de Málaga )
sobre los siguientes aspectos: programa, identificadores, comentarios, ruptura de sentencias y expresiones, y
los criterios que utilizar para resaltar adecuadamente las declaraciones y estructuras de control anidadas.
El hecho de que cada programador tenga unas reglas de estilo adecuadas no sólo permite facilitar la
lectura y compresión de los programas por él mismo o por otros programadores, sino que, durante la fase de
desarrollo, los errores son más fáciles de detectar. Por tanto, las normas de estilo se deben aplicar mientras
se codifican los programas. No tiene sentido escribir en primer lugar las líneas de código para después
aplicar las normas de estilo.
,GHQWLILFDGRUHV
• Deben ser representativos de su contenido, aunque se pueden establecer convenciones en casos concretos,
como el caso de las variables que se usan para el control en bucles.
&2167
9$5
DIMENSION = 10;
(* Cte. que indica el tamaño de un array *)
opcion : &+$5;
(* Variable de control de un menú
suma
: &$5',1$/;(* Suma de los elementos de una array
*)
*)
• No extender una declaración de múltiples variables más allá de una línea. Por ejemplo, es preferible
9$5
suma, saldo : ,17(*(5 ó
9$5
suma : ,17(*(5;
saldo : ,17(*(5
En lugar de:
9$5
suma,
saldo : ,17(*(5
• No utilizar la misma variable local para diferentes tipos de operaciones en el mismo subprograma. Por
ejemplo, no es adecuado definir una variable “contador”, que despues tenga diferentes usos dentro del
mismo procedimiento. Utilizar diferentes variables locales para diferentes tipos de operaciones aumenta
la claridad del código escrito, así mismo en algunos compiladores permite generar un código ejecutable
optimizado.
• Si el identificador combina varias palabras (o abreviaturas de palabras), cada una de ellas puede
comenzar con mayúscula, o bien, se pueden separar por el carácter '_' (o ambas cosas).
AcumuladorResultados
suma_total
Inc_Saldo
: ,17(*(5;
: 5($/;
: %22/($1;
• Como nombre de módulo elija el término más general y preciso que defina su contenido. Por ejemplo, si
un módulo contiene la definición de un tipo pila de caracteres y los procedimientos y funciones que
operan sobre ese tipo, el nombre del módulo podría ser PILA o PILA_CH, pero si únicamente contiene
la definición del tipo abstracto de datos pila de caracteres debería de llamarse TIPO_PILA o algo similar
(TAD_PILA, por ejemplo).
• El nombre de un tipo abstracto de datos no debe informar acerca de cómo está implementado. Por
ejemplo, no llame a un tipo Ptr_Nodo sino Lista cuando desee definir una lista de elementos
enlazados.
_______________________________________________________________________________________
CRITERIOS GENERALES SOBRE EL ESTILO EN PROGRAMACIÓN
Pág 5
Dpto. Lenguajes y Ciencias de la Computación ( Universidad de Málaga )
&RPHQWDULRV
Los comentarios deben ayudar a mejorar la legibilidad del código del programa, por tanto, no basta con que
un programa tenga comentarios, sino que éstos deben ser coherentes. Por tanto, tenga en cuenta que:
• no debe escribir comentarios que prácticamente sean una copia del código de programa, sin aportar
nada.
• no debe comentar en exceso, hasta tal punto que resulte difícil la localización y lectura del código de
programa.
• no debe intentar comentar un mal programa para hacerlo más claro, en su lugar, probablemente sea
más conveniente reescribirlo.
Asegúrese que los comentarios son realmente correctos. Los comentarios que no se corresponden con lo que
realmente hace un determinado trozo de código dificulta en gran medida la localización de errores.
Si el programa está destinado a usuarios españoles los comentarios y mensajes por pantalla deben estar
redactados en correcto español.
Se pueden distinguir varios tipos de comentarios dentro de un programa:
• De cabecera de módulos: Deben escribirse al comienzo de cada módulo, delimitados por líneas en blanco
o rellenas de un determinado carácter (asteriscos, guiones, etc.), incluyendo la identificación del módulo,
autor, fecha, versión y una breve descripción del contenido del módulo. Las modificaciones deben
enumerarse indicando fecha, autor y modificación realizada.
(*--------------------------------------------------------------*)
(*
Módulo CALCULADORA
*)
(*
Autor: José López Gutiérrez
*)
(*
Fecha: 17-10-99
Versión: 1.0
*)
(*--------------------------------------------------------------*)
(*
Programa que implementa una calculadora simple
*)
(*--------------------------------------------------------------*)
(*
*)
• De cabecera de procedimientos: Se escriben justo antes o al principio de los procedimientos y en ellos se
comenta brevemente toda aquella información que sea importante como, por ejemplo, función que
realiza, algoritmo empleado, precondiciones, postcondiciones, argumentos, etc.
(****************************************************************)
(* PROCEDURE
:ordenar_vector
*)
(* OBJETIVO
:ordena un array de enteros en orden ascendente *)
(* ALGORITMO
:se emplea el algoritmo de ordenación quicksort *)
(* PRECONDICIÓN :el parámetro es un vector de enteros que debe *)
(*
estar lleno
*)
(* POSTCONDICIÓN:el parámetro vector contiene los números
*)
(*
ordenados ascendentemente
*)
(****************************************************************)
352&('85( ordenar_vector(9$5 vector: VECTOR);
• Para explicar el funcionamiento de un subprograma es conveniente apoyarse en el nombre de las variables
parámetro que dicho subprograma recibe. Así, por ejemplo, diríamos
(*Esta función busca el nodo NUM_NODO en el árbol binario BARBOL*)
352&('85( buscar_nodo(num_nodo:tnodo; barbol:tarbol);
en lugar de
(*Esta función busca un nodo en un árbol binario*)
352&('85( buscar_nodo(num_nodo:tnodo; barbol:tarbol);
_______________________________________________________________________________________
CRITERIOS GENERALES SOBRE EL ESTILO EN PROGRAMACIÓN
Pág 6
Dpto. Lenguajes y Ciencias de la Computación ( Universidad de Málaga )
• De definición: Deben incluirse en las declaraciones de tipos, variables y parámetros de procedimientos
cuando los identificadores de los mismos no sean lo suficientemente aclaratorios.
9$5
contador: ,17(*(5;(*Cuenta los caracteres leídos del teclado*)
• De ruptura de párrafos: Cuando dentro del código aparecen párrafos excesivamente largos, se suelen
utilizar comentarios para romperlos en fragmentos más compresibles.
• De control: Es aconsejable comentar los END de estructuras de control anidadas indicando qué estructura
cierran.
(* Posiblemente aquí debiera aparecer un comentario *)
:+,/( condición '2
)25 i := 1 72 N '2
,) (NumElem > 0) 7+(1
...
(1'; (* IF quedan elementos*)
(1'; (* FOR i*)
(1'; (* WHILE condición*)
)RUPDWRGH6HQWHQFLDV\([SUHVLRQHV
En esta sección se presentan algunos consejos relacionados con la disposición en el programa de las
sentencias y las expresiones.
• No escribir más de una sentencia por línea, con la excepción de sentencias muy cortas y relacionadas
entre sí, como, por ejemplo, la asignación de valores iniciales a las variables. De cualquier forma, la
presencia de más de una sentencia por línea dificulta la depuración de los programas cuando se usan
herramientas de depuración de errores.
i := 0; j := 1; k := 0;
• Procurar no escribir líneas de código que superen el ancho de la pantalla del editor.
• Si una sentencia o declaración no cabe entera en una línea, romperla en algún punto lógico.
352&('85( ConcatenarCadena(cadena1: CADENA;
cadena2: CADENA;
9$5 cadena3: CADENA);
• Se puede mejorar la legibilidad de las expresiones rodeando con un espacio en blanco los símbolos de
operación y asignación.
,) ((i < 5) $1' (FIN)) 7+(1
j := 5 ;
(1' (* IF *)
• Utilizar paréntesis en las expresiones, aunque no sean necesarios, si ello ayuda a mejorar su comprensión.
(A + B) > (7 * X / 2)
• Si una expresión ocupa más de una línea, rompa la línea de forma coherente. Se podrá hacer antes ó
después de un operador, pero siempre se deberá seguir el mismo criterio. Además, si es posible, procure
romper la línea en un operador de baja precedencia. Por ejemplo, si se mantiene el criterio de romper la
línea después de un operador, tendríamos:
,) (((valor > 25) $1' (127 FIN))
25
((suma = 0)
$1' (CONTINUAR)))
• Añadir espacios a la izquierda de las líneas de continuación de sentencias o expresiones, de modo que las
partes relacionadas queden alineadas verticalmente (vea el ejemplo anterior).
_______________________________________________________________________________________
CRITERIOS GENERALES SOBRE EL ESTILO EN PROGRAMACIÓN
Pág 7
Dpto. Lenguajes y Ciencias de la Computación ( Universidad de Málaga )
6DQJUDGR
Se usa para hacer patente la profundidad de los anidamientos en declaraciones y estructuras de
control. El cuerpo de programa principal y de los distintos subprogramas ha de llevar un sangrado adecuado
con respecto al comienzo y final del mismo (véase el ejemplo al final).
Cada nivel debe empezar varios espacios a la derecha del anterior. Hay que tener en cuenta que si
se usan pocos espacios (uno o dos), el sangrado tiene poca utilidad porque es difícil de distinguir los
diferentes niveles. Por el contrario, si se usan muchos espacios, en cuanto que existan más de tres o cuatro
niveles las líneas se vuelven muy cortas y hay que romperlas con frecuencia, de forma que los beneficios del
sangrado se pierden.
(* Ejemplo de sangrado a dos espacios. Poco útil *)
i := 1;
:+,/( (i < 10)'2
,) (persona[i].edad >= 18) 7+(1
WrStr("Mayor de edad");
(/6(
WrStr("Menor de edad");
(1'; (* IF comprobación de edad *)
(1'; (* WHILE i < 10 *)
(* Ejemplo de sangrado a diez espacios. Exagerado *)
i := 1;
:+,/( (i < 10)'2
,) (persona[i].edad >= 18) 7+(1
WrStr("Mayor de edad");
(/6(
WrStr("Menor de edad");
(1'; (* IF comprobación de edad *)
(1'; (* WHILE i < 10 *)
(* Ejemplo de sangrado a cuatro espacios. Útil *)
i := 1;
:+,/( (i < 10)'2
,) (persona[i].edad >= 18) 7+(1
WrStr("Mayor de edad");
(/6(
WrStr("Menor de edad");
(1'; (* IF comprobación de edad *)
(1'; (* WHILE i < 10 *)
• 'HFODUDFLRQHV
− Para constantes, variables y tipos, empezar en la línea siguiente a la de su correspondiente palabra
reservada, dejando algunos espacios en blanco.
&2167
PI =
N =
7<3(
EDAD
9$5
edad
i, j
3.1416;
16;
= &$5',1$/;
:EDAD;
(* Almacena la edad de un individuo *)
:&$5',1$/; (* Variables de control de bucles
*)
− Los comentarios de declaración conviene que estén alineados verticalmente.
− Alinear, siempre que sea posible, los tipos de las variables.
persona = 5(&25'
nombre
edad
sexo
(1';
: CADENA;
: &$5',1$/;
: SEXO;
_______________________________________________________________________________________
CRITERIOS GENERALES SOBRE EL ESTILO EN PROGRAMACIÓN
Pág 8
Dpto. Lenguajes y Ciencias de la Computación ( Universidad de Málaga )
• (VWUXFWXUDVGH&RQWURO
− Sentencia ,)
,) condición 7+(1
sentencias
(/6,) condición 7+(1
sentencias
...
(/6(
sentencias
(1' (* IF condición*)
− Sentencia &$6(
&$6( selector 2)
caso-1
| ...
| caso-n
(1' (* CASE selector *)
− Sentencia :+,/(
:+,/( condición '2
sentencias
(1' (* WHILE condición*)
− Sentencia 5(3($7
5(3($7 (* Hasta condición *)
sentencias
817,/ condición
− Sentencia )25
)25 indice := valor_inicial 72 valor_final %< incremento '2
sentencias
(1' (* FOR *)
− Sentencia :,7+
:,7+ registro '2
sentencias
(1' (* WITH *)
'LVWULEXFLyQGH6XESURJUDPDV
Distribuya adecuadamente los procedimientos dentro de un programa. Si el lenguaje aporta la posibilidad de
anidar subprogramas, dicha característica debe ser utilizada para anidar los subprogramas en aquellos para
los que han sido definidos, contribuyendo de esta forma a permitir que se pueda interpretar el código del
programa siguiendo el enfoque descendente empleado para su planeamiento.
3URJUDPD(MHPSOR
A continuación se muestra, como ejemplo que ilustra algunas de las recomendaciones de estilo comentadas,
un programa que calcula el Q-ésimo término de la sucesión de Fibonacci.
x =1

y = f ( x) x = 2
x > 2

1
1
f ( x − 1) + f ( x − 2 )
_______________________________________________________________________________________
CRITERIOS GENERALES SOBRE EL ESTILO EN PROGRAMACIÓN
Pág 9
Dpto. Lenguajes y Ciencias de la Computación ( Universidad de Málaga )
(*----------------------------------------------------------------------------*)
(*
MODULO FIBONACCI
*)
(*
AUTOR: Juan López
*)
(*
FECHA: 30-10-99
*)
(*
VERSION: 1.0
*)
(*----------------------------------------------------------------------------*)
(*
Programa que calcula el n-ésimo elemento de la sucesión de
*)
(*
Fibonacci (1 1 2 3 5 8 ...)
*)
(*----------------------------------------------------------------------------*)
(*
*)
02'8/( fibonacci;
)520 IO ,03257 WrStr, WrCard, WrLn, RdCard, OK;
(*------------------------------------------------------------------------*)
(* PROCEDURE:
LeerPos
*)
(* OBJETIVO:
Devuelve un número que representa una posición en la
*)
(*
serie de Fibonacci.
*)
(* PRECONDICIÓN: Ninguna
*)
(* POSTCONDICIÓN: El número devuelto es mayor que cero.
*)
(*------------------------------------------------------------------------*)
352&('85( LeerPos():&$5',1$/;
(*--------------------------------------------------------------------*)
(* PROCEDURE: PosValida
*)
(* OBJETIVO: Devuelve TRUE si el parámetro pos contiene una posición *)
(*
válida para un número de Fibonacci y FALSE en otro caso *)
(* PRECOND:
Ninguna
*)
(*--------------------------------------------------------------------*)
352&('85( PosValida(pos:&$5',1$/):%22/($1;
%(*,1
5(7851 (pos > 0);
(1' PosValida;
9$5
pos : &$5',1$/;
(* Para recibir la posición leída de teclado *)
%(*,1 (* De LeerPos() *)
5(3(7,5
pos := RdCard();
817,/(OK$1'PosValida(pos));
5(7851 pos;
(1' LeerPos;
(*------------------------------------------------------------------------*)
(* PROCEDURE:
fibo
*)
(* MISIÓN:
Calcula el elemento de la serie de Fibonacci que ocupa la*)
(*
posición indicada por el parámetro “n”
*)
(* PRECONDICIÓN: El parámetro “n” debe contener un número mayor que cero *)
(*------------------------------------------------------------------------*)
352&('85( fibo(n:&$5',1$/):&$5',1$/;
9$5
%(*,1
result : &$5',1$/;
(* Valor de Fibonacci calculado hasta el momento *)
pos
: &$5',1$/;
(* Posicion del valor de Fibonacci calculado en result*)
actual, anterior : &$5',1$/;
(* Los dos ultimos valores calculados *)
result
:= 1;
anterior := 1;
actual
:= 1;
)25 pos := 3 72 n '2
result
:= anterior + actual;
anterior := actual;
actual
:= result;
(1';
5(7851 result;
(1' fibo;
9$5
pos :&$5',1$/;
(* Posición del número a calcular *)
%(*,1(* Cuerpo principal del módulo *)
(* Petición de datos. No se valida el dato introducido. *)
WrStr("Introduzca el elemento de la sucesión de Fibonacci a calcular: " );
pos := LeerPos();
WrStr("El ");
WrCard(pos, 0);
WrStr("-ésimo término de la sucesión de Fibonacci es: ");
WrCard(fibo(pos), 0);
(1' fibonacci. (* MODULE *)
_______________________________________________________________________________________
CRITERIOS GENERALES SOBRE EL ESTILO EN PROGRAMACIÓN
Pág 10
Descargar