Vous êtes sur la page 1sur 51

MIGUEL .

TOLEDO MARTNEZ
ANEXO 1
1 - 1
ANEXO 1

INTRODUCCIN A LA PROGRAMACIN
ESTRUCTURADA

La programacin estructurada es un conjunto de tcnicas para desarrollar algoritmos
fciles de escribir, verificar, leer y modificar. La programacin estructurada utiliza:

Diseo descendente. Consiste en disear los algoritmos en etapas, yendo de los conceptos
generales a los de detalle. El diseo descendente se ver completado y ampliado con el modular.

Programacin modular. El diseo descendente resuelve un problema efectuando
descomposiciones en otros problemas ms sencillos a travs de distintos niveles de refinamiento.
La programacin modular consiste en resolver de forma independiente los subproblemas
resultantes de una descomposicin. La programacin modular completa y amplia el diseo
descendente como mtodo de solucin de problemas y permite proteger la estructura de la
informacin asociada a un subproblema. Cuando se trata de este modo, existir un algoritmo
principal o conductor que transferir el control a los distintos mdulos o subalgoritmos, los
cuales, cuando terminen su tarea, devolvern el control al algoritmo que los llam. Los mdulos
o subalgoritmos debern ser pequeos, seguirn todas las reglas de la programacin
estructurada y podrn ser representados con las herramientas de programacin habituales. El
empleo de esta tcnica facilita notoriamente el diseo de los programas; por ejemplo:

o Cmo los mdulos son independientes, varios programadores podrn trabajar simultneamente
en la confeccin de un algoritmo, repartindose las distintas partes del mismo.
o Se podr modificar un mdulo sin afectar a los dems.
o Las tareas, subalgoritmos, slo se escribirn una vez, aunque se necesiten en distintas ocasiones
a lo largo del algoritmo.

Existen dos tipos de subalgoritmos: funciones y procedimientos.

FUNCIONES

Una funcin toma uno o ms valores, denominados argumentos o parmetros actuales o
reales y, segn el valor de estos, devuelve un resultado en el nombre de la funcin. Para invocar
o llamar a una funcin se utiliza su nombre seguido por los parmetros actuales o reales entre
parntesis en una expresin. Es decir que se podr colocar la llamada a una funcin en cualquier
instruccin donde se pueda usar una expresin. Por ejemplo escribir(raizCuadrada(16)) O si la
funcin se denomina f y sus parmetros son p1, p2 y p3: escribir(f(p1, p2, p3))

Cada lenguaje de programacin tiene sus propias funciones incorporadas, que se
denominan internas o intrnsecas o estndar. Se consideran como internas nicamente las ms
bsicas y comunes a casi todos los lenguajes y se irn comentando a lo largo de las lecciones
adecuadas, es decir cuando para explicar el tema se necesite una referencia a alguna de ellas.

Si las funciones estndar no permiten realizar el tipo de clculo deseado ser necesario
recurrir a las funciones externas o de usuario, que definiremos mediante una declaracin de la
funcin.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 2
DECLARACIN DE FUNCIONES

Las funciones, como subalgoritmos que son, tienen una constitucin simular a los
algoritmos. Por consiguiente, una funcin constar de:

Cabecera, con la definicin de la funcin
Cuerpo de la funcin

Dentro del cuerpo de la funcin estar el bloque de declaraciones y el bloque de
enunciados. Este debe incluir un enunciado mediante la cual la funcin tomar un valor para
devolverlo al algoritmo llamador.

Para que los enunciados descritos en una funcin sean ejecutados se necesita que sta sea
invocada, y se le proporciones los argumentos necesarios para realizar esos enunciados. En la
definicin de la funcin debern figurar una serie de parmetros, denominados formales, para
que, cuando se llame a la funcin se pueda establecer una correspondencia uno a uno y de
izquierda a derecha entre los parmetros actuales y los formales. En el cuerpo de la funcin se
utilizarn los parmetros formales cuando se quiera trabajar con informacin procedente del
programa llamador. El seudocdigo correspondiente a una funcin ser:

<claseDatos> funcin <nombreFuncion>(listaParmetrosFormales)
INICIO
[declaraciones locales].
enunciados.
devolver(<expresin>).
FIN.

La listaParmetrosFormales estar formada por una o ms sublistas de parmetros de la
siguiente forma:

{E|S|E/S} <claseDatos> nombreParmetroFormal ...

Las llaves quieren decir que se elija solo una entre las distintas opciones que aparecen
separadas por una barra. En las funciones habitualmente ser E. Ms adelante se explicarn el
significado de cada uno de dichas opciones. Los corchetes indican no-obligatoriedad. La
claseDatos debe ser estndar o haber sido definido de antemano. Podemos separar distintas
clases de parmetros utilizando punto y coma(;) entre cada declaracin.

PROCEDIMIENTOS

Un procedimiento es un subalgoritmo que realiza una tarea especfica y que puede ser
definido con 0, 1 n parmetros. Tanto la entrada de informacin al procedimiento como la
devolucin de resultados desde el procedimiento al programa llamador se realizarn a travs de
los parmetros. El nombre de un procedimiento no est asociado a ninguno de los resultados que
obtiene.

La invocacin a un procedimiento se realiza con una instruccin llamar_a o bien
directamente con el nombre del procedimiento. Es decir:

[llamar_a] <nombreProcedimiento> ([listaParametrosActuales])

Como se puede apreciar con respecto a la lista de parmetros no existe obligatoriedad.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 3
DECLARACIN DE PROCEDIMIENTOS

La declaracin de un procedimiento es similar a la de una funcin, las pequeas
diferencias son debidas a que el nombre del procedimiento no se encuentra asociado a ningn
resultado. La declaracin de un procedimiento expresada en seudocdigo sera:

Procedimiento <nombreProcedimiento> (listaParmetrosFormales)
INICIO
[declaraciones locales].
enunciados.
FIN.

La listaParmetrosFormales estar formada por una o ms sublistas de parmetros de la
siguiente forma:

{E|S|E/S} <claseDatos> nombreParmetroFormal>.

y seguir las mismas reglas que la declaracin de parmetros en las funciones.

En el algoritmo principal las declaraciones de procedimientos y funciones, se situarn al
final, con objeto de agilizar la escritura de algoritmos.

ESTRUCTURA GENERAL DE UN ALGORITMO

Algoritmo <nombreAlgoritmo()>
INICIO
const
<nombreConstante> = valor1.
..................................................
tipo
<clase> <nombreClase>.
var
<nombreClase> < nombreVariable1> [,<nombreVariable2>, ...].
.........................................................................................................
//Los datos han de ser declarados antes de poder ser utilizados.
<enunciado1>.
<enunciado2>.
........................
llamar_a <nombreProcedimiento> [(listaParametrosActuales)].

//La llamada a la funcin ha de realizarse en una expresin, por ejemplo:
escribir(<nombreFuncion> (listaParametrosActuales)).

//Se utilizar siempre la sangra en las estructuras selectivas y repetitivas.

...................................

<enunciadoN>.
FIN.

procedimiento <nombreProcedimiento> [(listaParametrosFormales)]
INICIO
[declaraciones locales].
enunciados.
FIN.

<claseDato> funcin <nombreFuncion> (listaParametrosFormales)
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 4
INICIO
//claseDato devuelto por la funcin es una clase estndar.
[declaraciones locales].
enunciados.
....................
devolver(<expresin>).
FIN.

PASO DE PARMETROS

Cuando un programa llama a un procedimiento o funcin se establece una
correspondencia entre los parmetros actuales y los formales. Existen dos formas para establecer
la correspondencia de parmetros.

Posicional. Emparejando los parmetros reales y formales segn su posicin en las listas. Esto
requiere que ambas listas tengan el mismo nmero de parmetros y que los que se van a
emparejar coincidan en su clase. En la definicin del subprograma deber reflejarse siempre de
que clase es cada uno de los parmetros formales.

(E <claseDato> <nombreParametroFormal> ... )

Laclase de dato debe ser estndar o haber sido definido de antemano. Si los parmetros formales
se separan por comas es necesario, aunque no suficiente, que tengan la misma clase. Si su clase
fuera distinto habra que escribir:

(E <claseDato1> <nombre1ParametroFormal>; E <claseDato2> <nombre2ParametroFormal>)

Correspondencia por el nombre explcito. En las llamadas se indica explcitamente la
correspondencia entre los parmetros reales y formales.

Al hablar de los procedimientos se deca que devuelven resultados al programa principal a travs
de los parmetros, pero que tambin pueden recibir informacin, desde el programa principal, a
travs de ellos. Esto nos lleva a una clasificacin de los parmetros en:

o Parmetros de entrada. Permiten nicamente la transmisin de informacin desde el
programa llamador al subprograma.
o Parmetros de salida. Slo devuelven resultados.
o Parmetros de entrada/salida. Actan en los dos sentidos, tanto mandando valores al
subprograma, como devolviendo resultados desde el subprograma al programa
llamador.

En los algoritmos, se debe especificar en la definicin del subprograma cmo se desea que se
comporte cada uno de los parmetros; para ello se emplear la siguiente terminologa.

o E equivale a parmetro de entrada.
o S querr decir parmetro de salida.
o E/S parmetro de entrada/salida.

En la lista de parmetros siguiente

(E <claseDato1><nombre1ParametroFormal>, S <claseDato1><nombre2ParametroFormal>)

<nombre1ParametroFormal> es parmetro de entrada y va a proporcionar datos al
subprograma. <nombre2ParametroFormal> es parmetro de salida y devolver resultados al
programa llamador. Aunque ambos son de la misma clase, <claseDato1>, habr que repetir la
clase para cada uno de ellos.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 5
Todo esto afectar tanto a procedimientos como a funciones. De lo que se deduce que una funcin
va a tener la posibilidad de devolver valores al programa principal de dos formas:

o Como valor de la funcin.
o A travs de los parmetros.

Un procedimiento slo podr devolver resultados a travs de los parmetros, de modo que al
codificar el algoritmo se ha de tener mucho cuidado con el paso de parmetros, siendo preciso
conocer los mtodos de transmisin que posee el lenguaje, para poder conseguir el
funcionamiento deseado. Los lenguajes suelen disponer de:

o Paso por valor. Los parmetros formales correspondientes reciben una copia de los
valores de los parmetros actuales; por lo tanto los cambios que se producen en ellos por
efecto del subprograma no podrn afectar a los parmetros actuales y no se devolver
informacin al programa llamador. Los parmetros resultaran de Entrada, E.
o Paso por valor resultado. Al finalizar la ejecucin del subprograma los valores de los
parmetros formales se transfieren o copian a los parmetros actuales.
o Paso por referencia. Lo que se pasa al procedimiento es la direccin de memoria del
parmetro actual. De esta forma, una variable pasada como parmetro actual es
compartida; es decir, se puede modificar directamente por el subprograma. Los
parmetros seran de Entrada/Salida, E/S.

Es posible pasar como parmetros datos y subprogramas.

VARIABLES GLOBALES Y LOCALES

Una variable es global cuando el mbito en el que dicha variable se conoce es el
programa completo. Consideraremos como variables globales las que hayan sido declaradas
fuera del programa principal y como locales las declaradas en el propio subprograma.

Toda variable que se utilice en un procedimiento debe haber sido declarada en l. De
esta forma todas las variables del procedimiento sern locales y la comunicacin con el
programa principal se realizar exclusivamente a travs de los parmetros. Al declarar una
variable en un procedimiento no importa que ya existiera otra con el mismo nombre en el
programa principal; ambas sern distintas y, cuando nos encontremos en el procedimiento, slo
tendr vigencia la declaracin que hayamos efectuado en l. Trabajando de esta forma
obtendremos la independencia de los mdulos.

RECURSIVIDAD

Un objeto es recursivo si forma parte de s mismo o interviene en su propia definicin. El
instrumento necesario para expresar los programas recursivamente es el subprograma. La
mayora de los lenguajes de programacin admiten que un procedimiento o funcin haga
referencia a s mismo dentro de su definicin, a lo que se le llama recursividad directa. Tambin
es posible que un procedimiento o funcin haga referencia a otro el cual contenga, a su vez, una
referencia directa o indirecta al primero, recursividad indirecta.

La recursin se puede considerar como una alternativa a la iteracin y, aunque las
soluciones iterativas estn ms cercanas a la estructura de la computadora, resulta muy til
cuando se trabaja con problemas o estructuras, como los rboles, definidos en modo recursivo.
Por ejemplo el factorial de un nmero n, que se define matemticamente como:

n! = n * (n 1)!

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 6
El problema general se resuelve en trminos de otro caso del mismo, hasta llegar a uno
que se resuelve de forma no recursiva. Existe un acercamiento paulatino al caso no recursivo.
Para comprender la recursividad hay que tener en cuenta que:

Cuando se llama a un procedimiento o funcin los parmetros y las variables locales toman
nuevos valores y el procedimiento o funcin trabaja con estos nuevos valores y no con los de las
anteriores llamadas.

Cada vez que se llama a un procedimiento o funcin los parmetros de entrada y variables
locales son almacenados en las siguientes posiciones libres de memoria y cuando termina la
ejecucin del procedimiento o funcin son accedidos en orden inverso a como se introdujeron.

El espacio necesitado para almacenar los valores crece conforme a los niveles de anidamiento
de las llamadas.

El cuerpo del procedimiento o funcin debe disponer de una o varias instrucciones selectivas
donde establecer la condicin o condiciones de salida.

Todo algoritmo recursivo puede ser implementado en forma iterativa utilizando una pila.

ALGORITMOS RECURSIVOS

El algoritmo de Ordenacin Rpida (Quick Sort) tiene una definicin recursiva. Ordena
un arreglo dividindolo en dos particiones ms pequeas del mismo, de forma que todos los
elementos de una de ellas son menores que cada uno de los de la segunda y todos los de la otra
mayores que cada uno de los de la primera. Estas particiones se subdividirn por separado hasta
obtener particiones de un solo elemento, terminacin del proceso recursivo.

El problema de la torre de Hanoi es un problema clsico de recursin. Se tienen 3 torres
y un conjunto de discos de diferentes tamaos. Cada disco tiene una perforacin en el centro que
le permite ensartarse en cualquiera de las torres. Los discos han de encontrarse siempre situados
en alguna de las torres. Inicialmente todos estn en la misma torre, ordenados de mayor a menor,
como se muestra en el dibujo. Se deben averiguar los movimientos necesarios para pasar todos
los discos a otra torre, utilizando la tercera como auxiliar y cumpliendo las siguientes reglas:

o En cada movimiento slo puede intervenir un disco.
o No puede quedar un disco sobre otro de menor tamao.

ORIGEN DESTINO AUXILIAR

1 2 3









Paran = 3 la solucin del problema implicara los siguientes movimientos:

1. De 1 a 2
2. De 1 a 3
3. De 2 a 3
4. De 1 a 2
5. De 3 a 1
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 7
6. De 3 a 2
7. de1 a 2

algoritmo hanoi
INICIO
var
entero n.

escribir(Dame el nmero de discos: )
leer(n).
llamar_a moverTorre(n, 1, 2, 3.
FIN.

procedimiento moverTorre(E entero n; E entero origen, destino, auxiliar)
INICIO
si n = 1 entonces
escribir(Paso de , origen, a , destino).
regresar.
sino
Inicio
llamar_a moverTorre(n 1, origen, auxiliar, destino)
escribir(Paso de , origen, a , destino)
llamar_a moverTorre(n 1, auxiliar, destino, origen)
Fin.
FIN.

ALGORITMOS CON RETROCESO

Hay un gran nmero de problemas cuya solucin no puede obtenerse mediante una serie
de clculos ms o menos complejos y su solucin requiere la aplicacin de mtodos de tanteo de
forma sistemtica, es decir probando todas las opciones posibles. Existen dos posibilidades: que
la opcin escogida forme parte de la solucin buscada o que no, en cuyo caso se retroceder
para probar con otra posible opcin. En estos problemas resulta muy til la recursividad.

Un ejemplo de este tipo es el problema de las ocho reinas, que consiste en disponer ocho
reinas en un tablero de ajedrez de tal forma que no se amenacen entre s (recuerde que una reina
amenaza a las piezas situadas en su misma fila, columna o diagonal) La tarea ms importante a
realizar en este algoritmo, es seleccionar adecuadamente la estructura de datos para representar el
problema y los parmetros de los procedimientos recursivos.

Recursos abstractos. En cada descomposicin de una accin compleja se supone que todas las partes
resultantes estn ya resueltas, posponiendo su realizacin para el siguiente refinamiento.

Estructuras bsicas. Los algoritmos debern ser escritos utilizando nicamente tres tipos de
estructuras bsicas.

Herramientas de programacin. Un algoritmo puede ser escrito en castellano narrativo, pero esta
descripcin suele ser demasiado prolija y, adems, ambigua. Para representar un algoritmo se debe
utilizar algn mtodo que permita independizar dicho algoritmo de los lenguajes de programacin y, al
mismo tiempo, conseguir que sea fcilmente codificable.

Los mtodos ms usuales para la representacin de algoritmos son:

o Diagrama de flujo
o Diagrama N-S (Nassi-Schneiderman)
o seudocdigo

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 8
DIAGRAMA DE FLUJO

Los diagramas de flujo se utilizan tanto para la representacin grfica de las operaciones
ejecutadas sobre los datos a travs de todas las partes de un sistema de procesamiento de
informacin: diagrama de flujo del sistema, como para la representacin de la secuencia de pasos
necesarios para describir un procedimiento particular: diagrama de flujo de detalle.

En la actualidad se siguen usando los diagramas de flujo del sistema, pero ha decado el uso de
los diagramas de flujo de detalle al aparecer otros mtodos de diseo estructurado son ms eficaces
para la representacin y actualizacin de los algoritmos.

El diagrama de flujo utiliza unos smbolos normalizados, con los pasos del algoritmo escritos en
el smbolo adecuado y los smbolos unidos por flechas, denominadas lneas de flujo, que indican el
orden en que los pasos deben ser ejecutados. Los smbolos principales son:

Smbolo Funcin


Inicio y fin del algoritmo


Proceso




Entrada/Salida





Decisin




Comentario


Resulta necesario indicar dentro de los smbolos la operacin especfica concebida por el
programador. Como ejemplo veamos un diagrama de flujo bsico, que representa la secuencia de
pasos necesarios para que un programa lea una temperatura en grados Celsius y calcule y escriba
su valor en grados Kelvin.
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 9
























DIAGRAMA NASSI-SCHNEIDERMAN

Los diagramas Nassi-Schneiderman, denominados as por sus inventores, o tambin N-S
o de Chapin son una herramienta de programacin que favorece la programacin estructurada.
Rene caractersticas grficas propias de los diagramas de flujo y lingsticas propias de los
seudocdigos. Constan de una serie de cajas contiguas que se leern siempre de arriba-abajo con
documentacin de forma adecuada.

En los diagramas N-S las tres estructuras bsicas de la programacin estructurada:
secuenciales, selectivas y repetitivas, encuentran su representacin propia.

Inicio
Leer
(celsius)
kelvin = celsius +
273.15
Escribir
(kelvin)
Fin
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 10
Smbolo Tipo de estructura


Secuencial





Repetitiva de 0 a n veces


Smbolo Tipo de estructura



Repetitiva de 1 a n veces




Repetitiva n veces






Selectiva


El algoritmo que lee una temperatura en grados Celsius y calcula y escribe su valor en
grados Kelvin se puede representar mediante el siguiente diagrama N-S.









SEUDOCDIGO

El seudocdigo es un lenguaje de especificacin de algoritmos que utiliza palabras
reservadas y exige la identacin, o sea sangra en el margen izquierdo, de algunas lneas. En
nuestros seudocdigos usaremos determinadas palabras en espaol como palabras reservadas.

El seudocdigo se concibi para superar las dos principales desventajas del diagrama de
flujo: lento de crear y difcil de modificar sin un nuevo diagrama. Es una herramienta muy
buena para el seguimiento de la lgica de un algoritmo y para transformar con facilidad los
algoritmos a programas, escritos en un lenguaje de programacin especfico.
Enunciado 1
Enunciado 2
Enunciado n
Expresin lgica

enunciados




Expresin lgica

enunciados
para i = vI hasta vF
enunciados
Condicin

si no
Inicio
Leer(celsius)
kelvin = celsius + 273.15
Escribir(kelvin)
Fin
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 11
El seudocdigo comenzar siempre con la palabra INICIO y terminar con la palabra
FIN. Cuando se coloque un comentario de una sola lnea se escribir precedido de //. Si el
comentario es multilnea, lo pondremos entre { }. Para introducir un valor o serie de valores desde
el dispositivo estndar y almacenarlos en una o varias variables utilizaremos leer(listaVariables)

Con nombreVariable = expresin almacenaremos en una variable el resultado de evaluar
una expresin. Hay que tener en cuenta que una nica constante, variable o funcin, constituyen
una expresin.

Para imprimir en el dispositivo estndar de salida una o varias expresiones emplearemos
escribir(listaExpresiones)

Las distintas estructuras se representan de la siguiente forma:

Decisin simple: si condiciones entonces
enunciados.

Decisin doble: si condiciones entonces
enunciados.
sino
enunciados.

Decisin mltiple: segn sea expresinOrdinal hacer
ListaValoresOrdinales: enunciados.
...

sino
enunciados.

Repetitivas mientras expresionLogica hacer
enunciados.

hacer
enunciados.
mientras expresionLogica.

para instruccin de asignacin hasta valor final
hacer en paso de incremento
enunciados.

INICIO, FIN., leer, escribir y las palabras que aparecen en negrita en las distintas estructuras se
consideran palabras reservadas y no debern utilizarse en su lugar otras similares.

El ejemplo ya citado que transforma grados Celsius en Kelvin, escrito en seudocdigo ser de la
siguiente manera:

INICIO
leer(Celsius).
kelvin = celsius + 273.15.
escribir(kelvin).
FIN.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 12
TEOREMA DE BHM Y JACOPINI

Para que la programacin sea estructurada, los programas han de ser propios. Un
programa se define como propio si cumple las siguientes caractersticas:

Tiene un solo punto de entrada y uno de salida
Toda accin del algoritmo es accesible, es decir, existe al menos un camino que va desde el inicio
hasta el fin del algoritmo, se puede seguir y pasar a travs de dicha accin.
No posee ciclos infinitos.

El teorema de Bhm y Jacopini dice que: un programa propio puede ser escrito
utilizando nicamente tres tipos de estructuras: secuencial, selectiva y repetitiva.

De este teorema se deduce que se han de disear los algoritmos empleando
exclusivamente dichas estructuras, las cuales, como tienen un nico punto de entrada y un nico
punto de salida, harn que nuestros programas sean propios.

ESTRUCTURAS DE CONTROL

A las estructuras secuencial, selectiva y repetitiva se les denominan estructuras de
control debido a que controlan el modo de ejecucin del programa.

ESTRUCTURAS SECUENCIALES

Se caracterizan porque una accin se ejecuta detrs de otra. El flujo del programa
coincide con el orden fsico en el que se han ido poniendo las instrucciones.

Diagrama de flujo Diagrama N-S Seudocdigo

Enunciado 1.
Enunciado 2.
Enunciado n.





ESTRUCTURAS SELECTIVAS

Se ejecutan unos enunciados u otros segn se cumpla o no una determinada condicin;
pueden ser simples, dobles o mltiples.

Enunciado 1
Enunciado 2
Enunciado n
Enunciado 1
Enunciado 2
Enunciado 3
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 13
SIMPLES

Se evala la condicin y si sta da como resultado verdad se ejecuta una determinado
enunciado o grupo de enunciados, en caso contrario se saltan dicho grupo de enunciados.

Diagrama de flujo Diagrama N-S Seudocdigo

Si condicin entonces
no enunciados.


s








DOBLES

Cuando el resultado de evaluar la condicin es verdad se ejecutar un determinado
enunciado o grupo de enunciados y si el resultado es falso otro enunciado o grupo de
enunciados diferentes.

Diagrama de flujo Diagrama N-S Seudocdigo

si condicin entonces
Enunciado si.
si no sino
enunciados sino.






MLTIPLE

Se ejecutarn unos enunciados u otros segn el resultado que se obtenga al evaluar una
expresin. Se considera que dicho resultado ha de ser de tipo ordinal, es decir de un tipo de
datos en el que cada uno de los elementos que constituyen el tipo, excepto el primero y el ltimo,
tiene un nico predecesor y un nico sucesor.

Cada grupo de enunciados se encontrar ligado con: un valor, varios valores y separados
por comas, un rango expresado como valorInicial ... valorFinal o una mezcla de valores y
rangos.

condic
in
enunciados
Condicin
s no



enunciados
condici
n
Enunciado enunciados
Condicin
s no



Enunciados
Enunciados
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 14
Se ejecutarn nicamente los enunciados del primer grupo que, entre los valores a los
que est ligado, cuente con el obtenido al evaluar la expresin. Cuando el valor obtenido al
evaluar la expresin no est presente en ninguna lista de valores se ejecutaran los enunciados
establecidas en la clusula sino, si existiese dicha clusula.

Diagrama de flujo Diagrama N-S Seudocdigo

Segn sea expresin hacer
Lista 1: enunciados 1.
Lista 2: enunciados 2.
v1 v2 v3 ..................................
sino
enunciados n.






ESTRUCTURAS REPETITIVAS

Los enunciados del cuerpo del ciclo se repiten mientras o hasta que se cumpla una
determinada condicin. Es frecuente el uso de contadores o banderas para controlar un ciclo.
Tambin se utilizan con esa finalidad los centinelas.

Un centinela es un valor anmalo dado a una variable que permite detectar cundo se
desea terminar de repetir los enunciados que constituyen el cuerpo del ciclo. Por ejemplo, se
puede disear un ciclo que pida el nombre y la calificacin de una serie de alumnos y establecer
que termine cuando se le introduzca un * (asterisco) como nombre. Podemos considerar tres
tipos bsicos de estructuras repetitivas: mientras, hacer, para.

MIENTRAS

Lo que caracteriza este tipo de estructura es que los enunciados del cuerpo del ciclo se
realizan cuando la condicin es cierta. Adems, se pregunta por la condicin al principio, de
donde se deduce que dichos enunciados se podrn ejecutar de 0 a N veces.

condici
n
enunc
iados
1
enunc
iados
n
Condicin
v1 v2 v3 sino


enun enun enun enun
ciado ciado 2 ciado 3 cia
1 do n

Enuncia
dos
2
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 15
Diagrama de flujo Diagrama N-S Seudocdigo


mientras expresinLogica hacer
no enunciados.


s









HACER

Los enunciados del interior del ciclo se ejecutan una vez y continan repitindose
mientras que la condicin sea verdadera. Se interroga por la condicin al final del ciclo.

Diagrama de flujo Diagrama N-S Seudocdigo

hacer
enunciados.
mientras expresionLogica.



s



no

PARA

Se utiliza cuando se conoce, con anterioridad a que empiece a ejecutarse el ciclo, el
nmero de veces que se va a iterar.

La estructura para comienza con un valor inicial de la variable ndice y los enunciados
especificadas se ejecutan al menos que el valor inicial sea mayor que el valor final. La variable
ndice se incrementa en 1, o en el valor que especifiquemos, y si este nuevo valor no excede al
valor final se ejecutan de nuevo los enunciados.

Si establecemos que la variable ndice se decremente en cada iteracin el valor inicial
deber ser superior al final. Consideramos siempre la variable ndice de tipo entero.

condic
in
enunciados
Expresin lgica

enunciados
condici
n




Expresin lgica

enunciados
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 16
Es posible sustituir una estructura para por otra de tipo mientras controlada por un
contador.

Diagrama de flujo Diagrama N-S Seudocdigo

Para i = vI hasta vF
hacer en paso de
no [incremento \ decremento incr.]
enunciados.





s







ESTRUCTURAS ANIDADAS

Tanto las estructuras selectivas como las repetitivas pueden ser anidadas, esto es,
introducidas una en el anterior de otra.

La estructura selectiva mltiple es un caso especial de varias estructuras selectivas
dobles anidas en la rama sino.

si condicin1 entonces
enunciados1.
sino
si condicin2 entonces
enunciados2.
sino
si condicin3 entonces
enunciados3.
sino
enunciadosX.

Cuando se inserta un ciclo dentro de otro la estructura interna ha de estar totalmente
incluida dentro de la externa. Es posible anidar cualquier tipo de estructura repetitiva. Si se
anidan dos estructuras para, para cada valor de la variable ndice del ciclo externo se debe
ejecutar totalmente el ciclo interno.

para v1 = vI1 hasta vF1 hacer
para v2 = vI2 hasta vF2 hacer
enunciados.

i = vI



i > vF


i = i + inc.
enunciados
para i =vI hasta vF
enunciados
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 17
Los enunciados que componen el cuerpo del ciclo ms interno se ejecutarn el siguiente
nmero de veces:

(vF1 vI1 + 1) * (vF2 vI2 + 1)


EJERCICIOS RESUELTOS

A1.1. Dados tres nmeros, deducir cul es el central.

DEFINICIN DEL PROBLEMA

Salida: Mostrar el nmero central.

Entrada: Los nmeros que vamos a comparar: a, b, c.

Proceso: Se trata de ir comparando los tres nmeros entre s, utilizando selecciones de
una sola comparacin anidados entre s, ya que as se ahorran comparaciones
(slo utilizamos 5). Si se utilizan comparaciones con operadores lgicos del tipo
a < b and b < c, se necesitaran seis estructuras selectivas en las que se estaran
haciendo dos comparaciones por seleccin.

Diseo del algoritmo (con comparaciones dobles)

algoritmo numeroCentral
INICIO
var
entero a, b, c, central.

leer(a, b, c).

si (a < b) y (b < c) entonces
central = b.
si (a < c) y (c < b) entonces
central = c.
si (b < a) y (a < c) entonces
central = a.
si (b < c) y (c < a) entonces
central = c.
si (c < a) y (a < b) entonces
central = a.
si (c < b) y (b < a) entonces
central = b.

escribir(central).
FIN.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 18
Diseo del algoritmo (con comparaciones simples)

algoritmo numeroCentral
INICIO
var
enteros a, b, c, central.
leer(a, b, c).

si a < b entonces
si b < c entonces
central = b.
sino
si a < c entonces
central = c.
sino
central = a.
sino
si a < c entonces
central = a.
sino
si b < c entonces
central = c.
sino
central = b.

escribir(central).
FIN.

A.1.2. Calcular la raz cuadrada de un nmero y escribir su resultado. En caso de ser el
nmero negativo, enviar un mensaje que diga no hay solucin real.

DEFINICIN DEL PROBLEMA

Salida: Mostrar la raz cuadrada de un nmero.

Entrada: El nmero cuya raz cuadrada deseamos obtener.

Proceso: Lo nico que hay que hacer es asignar a raz la raz cuadrada del
nmero, siempre que ste no sea negativo, ya que en este caso no
tendra una solucin real. Se utilizar la funcin raizCuadrada() si se
considera implementada; en caso contrario deber utilizarse la
exponenciacin.

Diseo del algoritmo

algoritmo obtenerRaizCuadrada
INICIO
var
entero numero.
real raiz.
leer(numero).

si numero < 0 entonces
escribir(No hay solucin real)
sino
raiz = raizCuadrada(numero)

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 19
escribir(raiz).
FIN.

A.1.3 Escribir los diferentes mtodos para deducir si una variable o expresin numrica es
par.

La forma de deduccin se hace generalmente comprobando de alguna forma que el
nmero o expresin numrica es divisible por dos. La forma ms comn sera utilizando
el operador mod, el resto de la divisin entera. La variable a comprobar, var, ser par si
se cumple la condicin

var mod 2 = 0

En caso de no disponer del operador mod y sabiendo que el resto es:

resto = dividendo divisor * ent(dividendo / divisor)

se trata de ver si var es par si se cumple la expresin siguiente:

var 2 * ent(var / 2) = 0

Otra variante podra ser comprobar si la divisin real de var entre 2 es igual a la
divisin entera de var entre 2.

var / 2 = var div 2

o bien

var / 2 = ent(var / 2)

En algunos casos, estos ejemplos pueden llevar a error segn sea la precisin que la
computadora obtenga en el clculo de la expresin.

A.1.4 Determinar el precio de un boleto de ida y vuelta en ferrocarril, conociendo la distancia
a recorrer y sabiendo que si el nmero de das de estancia es superior a 7 y la distancia
superior a 800 kilmetros el boleto tiene un descuento del 30%. El precio por kilmetro
es de 2.5 pesos.

DEFINICIN DEL PROBLEMA

Salida: El precio del boleto.

Entrada: Distancia a recorrer, das de estancia

Proceso: Se lee la distancia y el nmero de das de estancia y se halla el precio
del boleto de ida y vuelta (precio = distancia * 2 * 2.5). Se comprueba si
la distancia es superior a 800 Km y los das de estancia a 7 y si es cierto
se aplica un descuento del 30%.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 20
Diseo del algoritmo

algoritmo viaje
INICIO
var
entero distancia, dias.
real precio.

leer(distancia, dias).

precio = distancia * 2 * 2.5.

si (dias > 7 y distancia > 800) entonces
precio = precio * 0.7.

escribir(precio).
FIN.

A.1.5 Disear un algoritmo en el que a partir de una fecha introducida por teclado con el
formato DIA, MES AO se obtenga la fecha del da siguiente. Se supone que la fecha
introducida es correcta.

DEFINICIN DEL PROBLEMA

Salida: dds, mms, aas (da, mes y ao del da siguiente)

Entrada: dd, mm, aa (da, mes y ao del da actual)

Proceso: En principio lo nico que habra que hacer es sumar una unidad al da.
Si el da actual es menor que 28 (nmero de das del mes que menos das
tiene) no sucede nada. Si por el contrario es mayor o igual a 28, se debe
comprobar si al sumar un da ha habido cambio de mes o de ao, para
lo que se comprueba los das que tiene el mes, teniendo tambin en
cuenta los aos bisiestos. Tambin se debe comprobar si es el ltimo da
del ao en cuyo caso se incrementa tambin el ao. Se supone que la
fecha introducida es correcta.

Diseo del algoritmo

algoritmo diaSiguiente
INICIO
var
entero dd, mm, aa.
entero dds, mms, aas.

leer(dd, mm aa).

dds = dd + 1.
mms = mm.
aas = aa.

si dd >= 28 entonces
Inicio
Segn sea mm hacer
Inicio
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 21
//Si el mes es febrero
2:
Si (dds > 29) y (aa mod 4 = 0) o (dds =29) y (aa mod 4 <> 0) entonces
Inicio
dds = 1.
mms = 3.
Fin.

//Si el mes tiene treinta das
4, 6, 9, 11 :
si dds > 30 entonces
Inicio
dds = 1.
mms = mm + 1.
Fin.

//Si el mes tiene 31 das y no es diciembre
1, 3, 5, 7, 8, 10 :
Si dds > 31 entonces
Inicio
dds = 1.
mms = mm + 1.
Fin.
Fin.

Sino
//Sabemos que el mes es diciembre
si dds > 31 entonces
Inicio
dds = 1.
mms = 1.
aas = aa + 1.
Fin.
Fin.

Escribir(dds, mms, aas).
FIN.

A.1.6 Se desea realizar una estadstica de los pesos de los alumnos de un colegio de acuerdo a
la siguiente tabla:

Alumnos de menos de 40 Kg
Alumnos entre 40 y 50 Kg
Alumnos de ms de 50 y menos de 60 Kg
Alumnos de ms o igual a 60 Kg

La entrada de los pesos de los alumnos se terminar cuando se introduzca el valor
centinela 99. Al final se desea obtener cuntos alumnos hay en cada uno de los rangos.

DEFINICIN DEL PROBLEMA

Salida: conta1, conta2, conta3, conta4 (contadores de cada uno de los rangos.

Entrada: peso (peso de cada uno de los alumnos)

Proceso: Se construye un ciclo que se ejecute hasta que el peso introducido sea
igual a 99. Dentro del ciclo se comprueba con una serie de estructuras
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 22
si anidadas a que lugar de la tabla corresponde el peso, incrementamos
los contadores correspondientes. Cuando se haya salido del ciclo se
escribirn los contadores.

Ntese que ha de leer el peso una vez antes de entrar en el ciclo y otra
vez como ltima instruccin de ste, pues de lo contrario se incluir el
centinela (-99) en la estadstica la ltima vez que se ejecute el ciclo.

Diseo del algoritmo

algoritmo estadisticaPesos
INICIO
var
entero conta1, conta2, conta3, conta4.
conta1 = 0.
conta2 = 0.
conta3 = 0.
conta4 = 0.

leer(peso).

mientras peso <> -99 hacer
Inicio
si peso >= 40 entonces
si peso >= 50 entonces
si peso >= 60 entonces
conta4 = conta4 + 1.
sino
conta3 = conta3 + 1.
sino
conta2 = conta2 + 1.
sino
Conta1 = conta1 + 1.
Fin.
FIN.

A.1.7 Realizar un algoritmo que averige si dados dos nmeros enteros introducidos por
teclado, uno es divisor del otro.

DEFINICIN DEL PROBLEMA

Salida: Mensaje que indica si uno es divisor del otro o bien si no lo es.

Entrada: numero1, numero2 (los nmeros enteros que introducimos por teclado)

Proceso: Se verifica si numero1 es divisor de numero2 (utilizando el operador
mod), si lo es se enva el mensaje correspondiente, sino se verifica si
numero2 es divisor de numero1, si lo es se enva el mensaje
correspondiente sino se enva mensaje que los nmeros no son divisor el
uno del otro.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 23
Diseo del algoritmo

algoritmo divisor
INICIO
var
entero numero1, numero2.

leer(numero1, numero2).

si (numero1 mod numero 2 = 0) entonces
escribir(numero1, es divisible entre , numero2)
sino
si (numero2 mod numero1 = 0) entonces
escribir(numero2, es divisible entre , numero1).
sino
escribir(Los nmeros no son divisibles el uno del otro).
FIN.

A.1.8 Analizar los distintos mtodos de realizar la suma de T nmeros introducidos por
teclado.

Para realizar la suma deT nmeros ser imprescindible realizar un ciclo que se ejecute T veces
y que incluya una operacin de lectura y un acumulador. Al conocer de antemano el nmero de
veces que se ejecuta el ciclo (T), lo ms adecuado ser utilizar un ciclo del tipo para.

para i = 1 hasta T hacer
Inicio
leer(numero).

suma = suma + numero.
Fin.

El mismo ciclo se puede realizar con una estructura mientras o hacer, en cuyo caso dentro del
ciclo se incluir tambin un contador.

Con una estructura mientras:

contador = 0.
mientras contador < T hacer
Inicio
leer(numero).

suma = suma + numero.
contador = contador + 1.
Fin.

Con una estructura hacer:

contador = 0.
hacer
Inicio
leer(numero).
suma = suma + numero.
contador = contador + 1.
Fin.
mientras contador <= T

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 24
A.1.9 Se desea un algoritmo que realice la operacin de suma o resta de dos nmeros enteros
ledos desde el teclado en funcin de la respuesta S o R (suma o resta) que se d a un
mensaje de peticin de datos.

DEFINICIN DEL PROBLEMA

Salida: resultado (resultado de la operacin suma o resta de los dos nmeros)

Entrada: a, b (los nmeros a operar), operacin (tipo de la operacin a efectuar.

Proceso: Despus de leer los nmeros a y b, un mensaje ha de solicitar que
pulsemos una S o una R para realizar una u otra operacin. Aqu se
incluye un ciclo que se repite hasta que la entrada sea S o R, para evitar
errores de entrada. En funcin de la respuesta se calcula el resultado
que ser a + b, en caso de que la respuesta sea S, o a b en caso que la
respuesta sea R.

Diseo del algoritmo

algoritmo sumaResta
INICIO
var
entero a, b, resultado.
carcter operacin.

leer(a, b).

escribir(pulse S para sumar, R para restar: ).
hacer
leer(operacin).
mientras (operacin != S) y (operacin != R).

si operacin = S entonces
resultado = a + b.
sino
resultado = a b.
escribir(resultado).
FIN.

A.1.10 Escribir un algoritmo que lea un nmero entero y deduzca si est entre 10 y 100, ambos
inclusive.

DEFINICIN DEL PROBLEMA

Salida: El mensaje que indica si el nmero est entre estos lmites.

Entrada: numero (el nmero que se desea comprobar)

Proceso: Mediante una comparacin mltiple se comprueba si el nmero est
entre esos lmites, en cuyo caso aparecer un mensaje.


Diseo del algoritmo

algoritmo limites
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 25
INICIO
var
entero numero.

leer(numero).
si(numero >=10) y (numero <= 100)
escribir(Est entre 10 y 100).
FIN.

A.1.11 Se dispone de las calificaciones de los alumnos de un curso de informtica
correspondiente a las asignaturas ACCES, VISUAL C++, PASCAL Disear un
algoritmo que calcule el promedio de calificaciones de cada alumno.

DEFINICIN DEL PROBLEMA

Salida: promedio (una por alumno)

Entrada: calificacin (tres por alumno) y numeroAlumnos (nmero de alumnos)

Proceso: Hay que leer el nmero de alumnos para conocer las iteraciones que
debe ejecutar el ciclo (si se utilizara un ciclo hacer o mientras se
debera establecer alguna otra condicin de salida) Dentro del ciclo
principal se anida otro ciclo que se repite tres veces por alumno (cada
alumno tiene tres calificaciones) en el que leemos la calificacin y la
cumulamos en la variable promedio. Al finalizar el ciclo interno se halla
y se escribe el promedio.

Diseo del algoritmo

algoritmo promedio
INICIO
var
entero numeroAlumnos, i, j.
real promedio, calificacin.

leer(numeroAlumnos).

para i = 1 hasta numeroAlumnos hacer
Inicio
promedio = 0.
para j = 1 hasta 3 hacer
Inicio
leer(calificacin).
promedio = promedio + calificacion.
Fin.
promedio = promedio / 3.
escribir(promedio).
Fin.
FIN.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 26
A.1.12 Escribir el seudocdigo que calcule la suma de los 50 primeros nmeros enteros.

DEFINICIN DEL PROBLEMA

Salida: suma (suma de los primeros 50 nmeros enteros)

Entrada: ninguna.

Proceso: Se trata de hacer un ciclo en el que se incremente un contador y que se
acumule el valor de ste en un acumulador (suma) El ciclo se ejecutar
hasta que el contador sea igual a 50.

Diseo del algoritmo

algoritmo suma50
INICIO
var
entero suma, contador.

suma = 0.
contador = 1.
hacer
Inicio
suma = suma + contador.
contador = contador + 1.
Fin.
mientras (contador <= 50)
FIN.

A.1.13 Calcular y escribir los cuadrados de una serie de nmeros enteros distintos de 0 ledos
desde el teclado. El valor centinela es el cero.

DEFINICIN DEL PROBLEMA

Salida: cuadrado (el cuadrado del nmero introducido)

Entrada: numero (el nmero cuyo cuadrado desea calcularse)

Proceso: Dado que se desconoce la cantidad de nmeros ledos, se debe utilizar
un ciclo mientras o hacer. Se construye un ciclo hasta que el nmero
sea cero. Dentro del ciclo se lee numero y se calcula el cuadrado. Para
no incluir el ltimo nmero (el cero), se ha de leer antes de entrar al
ciclo y otra vez al final de ste.

Diseo del algoritmo

algoritmo cuadrado
INICIO
var
entero numero, cuadrado.

leer(numero).

mientras numero <> 0 hacer
Inicio
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 27
cuadrado = numero * numero.
escribir(cuadrado)
leer(numero).
Fin.
FIN.

A.1.14 Un capital inicial (capitalInicial) est situado a un tipo de inters (tasaInteres) S
duplicar o superar el capital inicial al trmino de dos aos? Si es as enviar un
mensaje que as lo indique.

DEFINICIN DEL PROBLEMA

Salida: El mensaje que nos dice si el capital inicial se duplicar o superar el
doble o no.

Entrada: capitalInicial, tasaInteres.

Proceso: Despus de introducir el capital Inicial y la tasa de inters por teclado,
se calcula el capital que se producir en dos aos por la frmula del
inters compuesto:

capitalFinal = capitalInicial(1 + tasaInteres)
2

S capitalFinal >= capitalInicial * 2 aparecer el mensaje diciendo que
el capital se duplicar o superar el doble.

Diseo del algoritmo

algoritmo capital
INICIO
var
Real capitalInicial, capitalFinal, tasaInteres.

leer(capitalInicial, tasaInteres).

capitalFinal = capitalInicial(1 + tasaInteres)
2
.

si (capitalFinal >= capitalInicial * 2) entonces
escribir(El capital inicial se duplicar o superar el doble).
sino
escribir(El capital inicial no se duplicar).
FIN.

A.1.15 Leer una serie de nmeros enteros desde el teclado y calcular su media aritmtica. La
marca de fin de lectura ser el nmero 999.

DEFINICIN DEL PROBLEMA

Salida: promedio (media aritmtica de los nmeros)

Entrada: numero (cada uno de los nmeros)

Proceso: Se debe construir un ciclo que se repita hasta que el nmero introducido
sea 999. Como ya se vio antes se debe leer antes de comenzar el
nmero y al final del ciclo. Dentro del ciclo se incrementar un
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 28
contador, necesario para poder calcular la media aritmtica, y un
acumulador guardar la suma parcial de los nmeros introducidos. Una
vez fuera del ciclo se calcula e imprime la media aritmtica.

Diseo del algoritmo

algoritmo mediaAritmtica
INICIO
var
entero numero, contador, suma.
real promedio.

contador = 0.
suma = 0.

leer(numero).

mientras (numero <> -999) hacer
Inicio
contador = contador + 1.
suma = suma + numero.
leer(numero).
Fin.
promedio = suma / contador.
escribir(promedio).
FIN.

A.1.16 Se considera la serie definida por:

a
1
= 0, a
2
= 1, a
n
= 3 * a
n-1
+ 2 * a
n-2
(para n >= 3)

Se desea obtener el valor y el ndice del primer trmino que sea mayor o igual que 1000.


DEFINICIN DEL PROBLEMA

Salida: indice (indice del primer trmino de la serie mayor o igual a 1000)
ultimoTermino (valor de dicho trmino)

Entrada: nada.

Proceso: Se calcula el trmino por tanteo, es decir a partir del tercer trmino, se
ejecuta un ciclo que se realice mientras que el valor del trmino sea
menor que 1000)

Para ello se inicializa indice a 2, ultimoTermino a 1 y
penltimoTermino a 0. Dentro del ciclo se calcula el valorActual (3 *
ultimoTermino + 2 * penltimoTermino). Antes de finalizar el ciclo se
deben actualizar los valor de penltimoTermino (penltimoTermino =
ultimoTermino) y ultimoTermino (ultimoTermino = valorActual).
Tambin se ha de incrementar el contador indice en una unidad. Al
finalizar el ciclo, el primer valor mayor o igual a 1000 ser
ultimoTermino, y el trmino ser indice.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 29
Diseo del algoritmo

algoritmo serie
INICIO
var
enteros indice, ultimoTermino, penultimoTermino, valorActual.

indice = 2.
ultimoTermino = 1.
penultimoTermino = 0.

mientras ultimoTermino < 1000 hacer
Inicio
valorActual = 3 * ultimoTermino + 2 * penultimoTermino.
indice =indice + 1.
penultimoTermino = ultimoTermino.
ultimoTermino = valorActual.
Fin.
escribir(ultimoTermino, indice).
FIN.

A.1.17 Escribir un algoritmo que permita calcular X
n
, donde:

X Puede ser cualquier nmero real distinto de 0
n Puede ser cualquier entero positivo, negativo o nulo

Nota: Suponemos que no est implementado el operador de exponenciacin.

DEFINICIN DEL PROBLEMA

Salida: potencia (resultado de elevar X a la n)

Entrada: X (base de la exponenciacin), n (exponente)

Proceso: Despus de introducir X y n, se comprueba n. Si es 0, potencia valdr 1.
Si es positivo se ha de multiplicar X n veces, y ello se har mediante un
ciclo en el que se vayan guardando en la variable producto las sucesivas
multiplicaciones. En el ciclo un contador ir controlando las veces que
se ejecuta el ciclo, que finalizar cuando sea igual a n. Si n es negativo,
primero se comprueba que X sea distinto de cero, pues en este caso no
tendr solucin (se utilizar una bandera llamada solucin para indicar
si se tiene o no solucin) En caso contrario se proceder de la misma
forma que si es positivo, pero la potencia ser 1/potencia.
Diseo del algoritmo

algoritmo calcularPotencia
INICIO
var
entero n, contador.
real X, potencia.
lgico solucion.

leer(X,n).
solucion = verdadero.

si n = 0 entonces
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 30
potencia = 1.
sino
si n > 0 entonces
Inicio
potencia = 1.
contador = 0.

hacer
Inicio
potencia = potencia * X.
contador = contador + 1.
Fin.
mientras contador <= n.
Fin.
sino
si X = 0 entonces
Inicio
escribir(No hay solucin).
solucion = falso.
Fin.
sino
potencia = 1.
contador = 0.

hacer
Inicio
potencia = potencia * X.
contador = contador + 1.
Fin.
mientras contador <= n.
potencia = 1 / potencia.

si solucion entonces
escribir(potencia).
FIN.

A.1.18 Se desea leer desde el teclado una serie de nmeros enteros hasta que aparezca alguno
menor que 1000.

DEFINICIN DEL PROBLEMA

Salida: Nada.

Entrada: numero (los datos de entrada)

Proceso: No hay ms que ejecutar un ciclo hasta que el nmero ledo sea menor
de 1000.

Diseo del algoritmo

algoritmo lectura
INICIO
var
entero numero.

hacer
leer(numero).
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 31
mientras numero >= 1000
FIN.

A.1.19 Se desea obtener los cuadrados de todos los nmeros ledos desde un archivo hasta que
se encuentre el nmero 0.

DEFINICIN DEL PROBLEMA

Salida: cuadrado (el cuadrado del nmero introducido)

Entrada: El numero ledo desde un archivo (el nmero cuyo cuadrado desea
calcularse)

Proceso: Este ejercicio es muy similar al A.1.13, aunque se introduce la nocin de
archivo que ser visto con profundidad en otro curso. Por el momento no
vamos a tener en cuenta las operaciones de abrir y cerrar el archivo, as
como la marca de fin de archivo o la definicin de su estructura. Para
leer nmeros desde el archivo lo nico que vamos a hacer es una
operacin de lectura indicando que se lee desde un archivo:

leer(nombreArchivo, listaVariables).

Diseo del algoritmo

algoritmo leerArchivo
INICIO
var
real numero.

hacer
Inicio
leer(archivo, numero).
si numero <> 0 entonces
escribir(numero * numero).
Fin.
mientras numero <> 0
FIN.

A.1.20 Escribir un algoritmo que reciba una fecha por teclado dd, mm, aa -, as como el da
de la semana que fue el primero de enero de dicho ao, y muestre por pantalla el da de
la semana que corresponde a la fecha que le hemos dado. En su resolucin deben
considerarse los aos bisiestos. Debe validar que la fecha introducida sea correcta.

DEFINICIN DEL PROBLEMA

Salida: Da de la semana de la fecha que hemos dado: Lunes, Martes,
Mircoles, Jueves, Viernes, Sbado, Domingo.

Entrada: dd, mm, aaaa (dia, mes, ao que deseamos saber a que dia de la semana
corresponde). diaSemana (da de la semana correspondiente al primero
de enero del ao actual: l/m/x/j/v/s/d).

Proceso: Se comenzar realizando una depuracin en cuanto a la introduccin de
datos. Una vez aceptada una fecha como correcta, se inicializar a 0 la
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 32
variable totalDia y se acumulan en ella los das correspondientes a cada
uno de los meses transcurridos, desde enero hasta el mes anterior al que
indica la fecha, ambos inclusive. Por ltimo le aadiremos los das del
mes actual.

Si hacemos grupos de 7 con totalDia, se obtendr un cierto nmero de
semanas y un resto. Para averiguar el da de la semana en que cae la
fecha especificada, bastar con avanzar, a partir del da de la semana
que fue el primero de enero de dicho ao, el nmero de das que indica el
resto.

Se ha de tener en cuenta que, considerando que la semana comienza en
lunes, avanzar desde el domingo consiste en volver a situarse en el lunes.

Diseo del algoritmo

algoritmo diaFechaActual
INICIO
var
lgico bisiesto, correcto.
entero dd, mm, aaaa, totalDia, contadorDia.
carcter diaSemana.

// Obtener del usuario la fecha correcta.
hacer
Inicio
bisiesto = falso.
correcto = verdadero.

escribir(Dame la fecha (dd, mm, aaaa): ).
leer(dd, mm, aaaa).

Si ((aaaa mod 4 = 0) y (aaaa mod 100 <> 0) o (aaaa mod 400 = 0)) entonces
bisiesto = verdadero.
segn sea mm hacer
Inicio
//Mes de febrero
2:
si bisiesto entonces
si dd > 29 entonces
correcto = falso
sino
si dd > 28 entonces
correcto = falso

//Meses con 30 das
4, 7, 9, 11:
si dd > 30 entonces
Correcto = falso.

//Meses con 31 das
1, 3, 5, 6, 8, 10, 12:
si dd > 31 entonces
correcto = falso.

sino
correcto = falso.
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 33

Fin.
mientras !correcta

//Acumular el nmero de das que hay hasta al mes anterior a la fecha propuesta.
totalDia = 0.

para contadorDia =1 hasta mm 1hacer
Inicio
segn sea contadorDia hacer
Inicio
//Mes de febrero
2:
si bisiesto entonces
totalDia = totalDia + 29.
sino
totalDia = totalDia + 28.

//Meses con 30 dias
4, 7, 9, 11:
totalDia = totalDia + 30.

//Meses con 31 das
1, 3, 5, 6, 8, 10, 12:
totalDia = totalDia + 31.

Fin.
Fin.

totalDia = totalDia + dd.

//Obtener y validar el dia de la semana correspondiente al primero de enero.
hacer
Inicio
Escribir(Dame el da de la semana que fue el 1 de Enero (l/m/x/j/v/s/d):
leer(diaSemana).

segn sea diaSemana hacer
Inicio
l, L:
d1 = 0.
m, M:
d1 = 1.
x, X:
d1 = 2.
j, J:
d1 = 3.
v, V:
d1 = 4.
s, S:
d1 = 5.
d, D:
d1 = 6.
sino
d1 = -10
Fin.
Fin.
mientras (d1 <= 0) o (d1 >= 6)

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 34
totalDia = totalDia + d1.
//Determinar el dia de la semana de la fecha propuesta
segn sea totalDia mod 7 hacer
Inicio
1:
escribir(Lunes).
2:
escribir(Martes).
3:
escribir(Mircoles).
4:
escribir(Jueves).
5:
escribir(Viernes).
6:
escribir(Sbado).
0:
escribir(Domingo).
Fin.
FIN

A.1.21 Realizar un procedimiento que permita intercambiar el valor de dos variables.

Anlisis del problema

Para intercambiar el contenido de dos variables, es necesario una variable auxiliar, de la misma
clase de datos que las otras variables. Se pasan como parmetros de entrada las dos variables cuyo valor
se desea intercambiar. Ya que su valor ser modificado durante la ejecucin del subalgoritmo, sern
parmetro de entrada/salida y el subalgoritmo ser un procedimiento.

Diseo del algoritmo

procedimiento intercambio(E/S entero a, b)
INICIO
var
entero auxiliar.

auxiliar = a.
a = b.
b = auxiliar.
FIN.

A.1.22 Realizar una funcin no recursiva que permita obtener el trmino n de la serie de
Fibonacci.

Anlisis del problema

La serie de Fibonacci se define como:

Fibonacci
0
= 0, Fibonacci
1
= 1

Fibonacci
n
= Fibonacci
n-1
+ Fibonacci
n-2
para todo n > 1

Por lo tanto se deben sumar los elementos mediante un ciclo que debe ejecutarse desde 2 hasta n.
Cada iteracin debe guardar el ltimo y el penltimo trmino, para lo que se utilizan dos variables ultimo
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 35
y penltimo, a las que se irn cambiando sus valores. El subalgoritmo aceptar como entrada una variable
entera y devolver un valor tambin entero, por lo que deberemos utilizar una funcin.

Diseo del algoritmo

entero funcin fibonacci(E entero n)
INICIO
var
entero i, ultimo, penltimo, suma.

suma = 1.
Ultimo = 1.
Penltimo = 1

para i = 2 hasta n hacer
Inicio
Penltimo = ultimo.
Ultimo = suma.
Suma = ultimo + penltimo.
Fin.

devolver(suma).
FIN.

A.1.23 Implementar una funcin que permita devolver un valor entero, ledo desde el
teclado, comprendido entre dos lmites que introduciremos como parmetros.

Anlisis del problema

Esta funcin puede ser til para validar una entrada de datos de clase entero y se podr incluir en
otros algoritmos. Consistir simplemente en un ciclo hacer que ejecutar la lectura de un dato hasta que
est entre los valores que se han pasado como parmetros de entrada.

Diseo del algoritmo

entero funcin validarEntero(E entero inferior, superior)
INICIO
var
entero n.

hacer
leer(n).
mientras (n <= inferior) o (n >= superior)
devolver(n).
FIN.

A.1.24 Disear una funcin que permita obtener el valor absoluto de un nmero.

Anlisis del problema

El valor absoluto de un nmero positivo, es el mismo nmero; de un nmero negativo
es el mismo nmero sin el signo y de 0 es 0. Por lo tanto, esta funcin, nicamente
debera multiplicar por 1 el nmero pasado como parmetro de entrada en el caso que
ste fuera menos que 0.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 36
Diseo del algoritmo

entero funcion absoluto(E entero n)
INICIO
si n < 0 entonces
devolver(n).
sino
devolver(n).
FIN.

A.1.25 Realizar un procedimiento que obtenga la divisin entera y el resto de la misma
utilizando nicamente los operadores de suma y resta.

Anlisis del problema

La divisin se puede considerar como una sucesin de restas. El algoritmo trata de contar cuntas
veces se puede restar el divisor al dividendo y dicho contador sera el cociente. Cuando ya no se
pueda restar ms sin que salga un nmero positivo, se tendr el resto.

Por lo tanto se tienen dos parmetros de entrada, dividendo y divisor, y dos de salida, cociente y
resto. cociente ser un contador que se incrementar en 1 cada vez que se pueda restar el divisor
al dividendo. El ciclo a utilizar ser de tipo mientras, ya que puede darse el caso que no se
ejecuta ninguna vez, en cuyo caso el cociente ser 0 y el resto ser el dividendo.
Diseo del algoritmo

procedimiento divisionEntera(E entero dividendo, divisor; S entero cociente, resto)
INICIO
cociente = 0.

mientras dividendo >= divisor hacer
Inicio
dividendo = dividendo divisor.
cociente = cociente + 1.
Fin.
resto = dividendo.
FIN.

A.1.26 Disear un procedimiento que permita convertir coordenadas polares (radio, ngulo)
a cartesianas (x, y)

x = radio * cos(ngulo).
y = radio * sen(ngulo).

Anlisis del problema

La solucin requiere aplicar la frmula indicada ms arriba. Habr que tener en cuenta el tipo de
parmetro radio y angulo sern de entrada y x e y de salida.

Diseo del algoritmo

procedimiento polares(E real angulo, radio; S real x, y)
INICIO
x = radio * cos(angulo).
y = radio * sen(angulo).
FIN.
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 37
A.1.27 Disee una funcin que permita obtener el factorial de un nmero entero positivo.

Anlisis del problema

El factorial de n se puede definir para cualquier entero positivo como

factorial
n
= n * n-1 * n-2 * ... * 1

Por definicin, factorial
0
= 1

Por lo tanto para implementar una funcin factorial, se deber realizar un ciclo que se ejecute
entre 2 y n, acumulando en su cuerpo las sucesivas multiplicaciones.

Diseo del algoritmo

entero funcion factorial(E entero n)
INICIO
var
entero i, f.

f = 1.
Si n = 1 entonces
devolver f.
sino
para i = 2 hasta n hacer
f = f * i.
devolver(f).
FIN.

A.1.28 Disear una funcin que permita obtener el mximo comn divisor de dos nmeros
mediante el algoritmo de Euclides.

Anlisis del problema

Para obtener el mximo comn divisor de dos nmeros enteros positivos a y b segn el
algoritmo de Euclides, se debe ejecutar un ciclo que divida a entre b. Si el resto es 0, b ser el
divisor, en caso contrario, a tomar el valor de b y b el del resto de la divisin anterior. El ciclo
finalizar cuando el resto sea 0, es decir, cuando a sea divisible entre b.

Diseo del algoritmo

entero funcion mcd(E entero a, b)
INICIO
var
entero resto.

mientras a mod b <> 0 hacer
Inicio
resto = a mod b.
a = b.
b = resto.
Fin.
devolver(b).
FIN.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 38
A.1.29 Realizar una funcin que permita saber si una fecha es vlida.

Esta funcin es muy normal en cualquier aplicacin informtica. Se trata de ver si una
fecha, introducida como da, mes y ao es una fecha correcta; es decir, el da ha de estar
comprendida entre 1 y 31, el mes entre 1 y 12, y, si esto es correcto, ver si el nmero de
das para un mes concreto es vlido.

El tipo de la funcin ser un valor lgico: verdadero si la fecha es correcta o falso si es
errnea. Como ayuda, se utilizar una funcin esBisiesto() a la que se pasar el valor
entero correspondiente a un ao determinado y devolver un valor lgico verdadero si el
ao es bisiesto y falso en caso contrario. Un ao ser bisiesto si es divisible por 4,
excepto los que son divisibles por 100 pero no por 400, es decir, menos aquellos con los
que comienza el siglo. Un diseo modular de la funcin podra ser por lo tanto:


dd, mm, aa vlido (verdadero o falso)






aa bisiesto (verdadero o falso)







Diseo del algoritmo

lgico funcin fechaValida(E entero dd, mm, aa)
INICIO
var
lgico estadoFecha = verdadero.

si (mm < 1) o (mm > 12) entonces
Inicio
estadoFecha = falso.
devolver(estadoFecha).
Fin.

sino
Inicio
si (dd < 1) entonces
Inicio
estadoFecha = falso.
devolver(estadoFecha).
Fin.
sino
segn sea mm hacer
Inicio
//Mes de febrero
2:
si esBisiesto(aa) y (dd > 29) entonces

fechaValida()

esBisiesto()
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 39
Inicio
estadoFecha = falso.
devolver(estadoFecha).
Fin.
Sino
si !esBisiesto(aa) y (dd > 28) entonces
Inicio
estadoFecha = falso.
devolver(estadoFecha).
Fin.

//Meses de 30 das
4, 6, 9, 11:
si (dd > 30) entonces
Inicio
estadoFecha = falso.
devolver(estadoFecha).
Fin.

//Meses de 31 das
sino
si (dd > 31) entonces
Inicio
estadoFecha = falso.
devolver(estadoFecha).
Fin.
Fin.
Fin.
FIN.

lgico funcin esBisiesto(E entero aa)
INICIO
devolver((aa mod 4 = 0) y (aa mod 100 <> 0) o (aa mod 400 = 0)).
FIN.

A.1.30 Implementar una funcin que permita hallar el valor de X
y
, siendo X un nmero real e y
un entero.

Anlisis del problema

Se trata de una funcin similar a la del factorial, pues se trata de acumular multiplicaciones, pues
debemos multiplicar X por si mismo y veces. Si y es negativo, X
y
es igual a su inversa.

Diseo del algoritmo

real funcin potencia(E entero x, y)
INICIO
var
entero i, p.

p = 1.
si y = 0 entonces
devolver(p).
sino
para i = 1 hasta abs(y) hacer
p = p * x.

si (y> 0) entonces
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 40
devolver(p).
sino
devolver(1/p).
FIN.

A.1.31 Realizar tres funciones que permitan hallar el valor de mediante las series matemticas
siguientes:
a) =
( )

+ + =
+

=
!
7
1
5
1
3
1
1 4
1 2
1
4
0 i
i
i


b) =
( )
! + + + + + =

=
2 2 2 2
1
2
5
24
4
24
3
24
2
24
24
2
1 24
2
1
i i


c) = !
7
8
7
6
5
6
5
4
3
4
3
2
4
La precisin del clculo depender del nmero de elementos de la serie, n, que ser un
parmetro que se pasar a la funcin.

Anlisis del problema

En cualquiera de los tres casos se debe implementar un ciclo que se ejecute n veces y en el que se
ir acumulando la suma de los trminos de la serie.

En el caso a), los trminos impares suman y los pares restan, por lo que ser preciso hacer una
distincin. El numerador siempre es 1, y el denominador son los n primeros nmeros impares. En
el caso b), el numerador es 24 y el denominador ser el cuadrado de la variable del ciclo. El
resultado final ser la raz cuadrada de la serie. En el caso c) lo que se debe acumular son los
productos, el numerador ser los nmeros pares y el denominador los impares.

Diseo del algoritmo

a)
real funcin pi(E entero n)
INICIO
var
real serie.
entero i, denominador.
lgico par.

denominador = 1.
serie = 0.
par = falso.

para i = 1 hasta n hacer
Inicio
si par entonces
serie = serie - 1/denominador.
sino
serie = serie + 1/denominador.
par = !par.
denominador = denominador + 2.
Fin.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 41
devolver(4 * serie).
FIN.

b)
real funcin pi(E entero n)
INICIO
var
real serie.
entero i.

serie = 0.

para i = 1 hasta n hacer
serie = serie + 24 / (i ^ 2).

devolver(raizCuadrada(serie) / 2).
FIN.

c)
real funcin pi(E entero n)
INICIO
var
real serie.
entero i.

serie = 2.

para i = 1 hasta n hacer
si i mod 2 = 0 entonces
serie = serie * i / (i+1).
sino
serie = serie * (i + 1) / i.

devolver(serie).
FIN.

A.1.32 Realizar un subprograma que calcule la suma de los divisores de un nmero entero n.

Anlisis del problema

Para obtener los divisores del nmero entero n ser preciso hacer un ciclo en el que un contador
se ir decrementando des n-1 hasta 1. Por cada iteracin, se comprobar si el contador es divisor
de n. Como el primer divisor que podamos encontrar ser n/2, el valor inicial del contador podr
ser n div 2.

El tipo de subprograma deber ser una funcin, a la que pasaramos como parmetro de entrada
el nmero n.

Diseo del algoritmo

entero funcin sumaDivisor(E entero n)
INICIO
var
entero suma, i.

suma = 0.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 42
para i = (n div 2) hasta 1 incremento 1 hacer
si n mod i = 0 entonces
suma = suma + i.

devolver(suma).
FIN.

A.1.33 Dos nmeros son amigos, si cada uno de ellos es igual a la suma de los divisores del otro.
Por ejemplo, 220 y 284 son amigos ya que:

Suma de divisores de284: 1 + 2 + 4 + 71 + 142 = 220
Suma de divisores de220: 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284.

Disee un algoritmo que muestre todas las parejas de nmeros amigos menores o
iguales que m, siendo m un nmero introducido por el teclado.

Anlisis del problema

Este algoritmo se puede descomponer en tres partes diferenciadas. Por una parte un programa
principal que debe ir sacando todas las parejas de nmeros menores o iguales a un nmero m que
previamente habremos introducido por teclado. Desde ah se llamar a una funcin lgica
sonAmigos() que dir si la pareja de nmeros son amigos. Para hacer esto, se calcula la suma de
los divisores, para lo que llamaremos a la funcin sumaDivisor(), desarrollada ms arriba. Por lo
tanto un diseo modular del programa podra ser como sigue:





i, j amigos





n suma




El programa principal leer el nmero m, e implementar dos ciclos anidados para sacar las
parejas menores o iguales que m. Para ello, un primer ciclo realizar las iteraciones dei entre 1 y
m, mientras que el ciclo interno ir tomando valores entrei+1 y m. Dentro del ciclo habr una
llamada a la funcin sonAmigos(), y si sta devuelve un valor verdadero escribiremos la pareja.
La funcin sonAmigos() se encarga de comprobar si una pareja de nmeros son amigos. Recibe
dos parmetros de entrada y guarda en dos variables la suma de sus divisores mediante la funcin
sumaDivisor(). Si ambas suman son iguales, devolver un valor verdadero, en caso contrario,
falso.

Diseo del algoritmo

algoritmo parejasAmigos
INICIO
var
entero i, j, m.

programaPrincipal()

sonAmigos()

sumaDivisor()
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 43

leer(m).

para i = 1 hasta m-1 hacer
para j = i+1 hasta m hacer
si sonAmigos(i, j) entonces
escribir(i, j).

lgico funcin sonAmigos(E entero n, m)
INICIO
devolver(sumaDivisor(n) = m) y (sumaDivisor(m) = n)
FIN.

A.1.34 El nmero de combinaciones de m elementos tomados de n en n es:

( )! !
!
n m n
m
n
m



Disear una funcin que permita calcular el nmero combinatorio

n
m

Anlisis del problema

La funcin se reduce a una simple asignacin, siempre que se tenga resuelto el problema de
hallar el factorial, cuya funcin ya se ha diseado antes. Por lo tanto se limitar a codificar la
expresin del nmero combinatorio.

Diseo del algoritmo

entero funcin combinatorio(E entero m, n)
INICIO
devolver(factorial(m) div (factorial(n) * factorial(m-n)).
FIN.

A.1.35 Implementar tres funciones que permitan averiguar los valores de e
x
, cos(x) y sen(x) a
partir de las series siguientes:

! + + + + = =

=
! 3 ! 2
1
!
3 2
0
x x
x
i
x
e
n
i
i
x

( )
( )
! + + = + =

=
! 6 ! 4 ! 2
1
! 2
1 1 ) cos(
6 4 2 2
0
x x x
i
x
x
i n
i

! + + =
+
=

=
+
! 7 ! 5 ! 3 )! 1 2 (
) 1 ( ) (
7 5 3
1
1 2
x x x
x
i
x
x sen
n
i
i


El nmero de trminos de la serie ser el suficiente para que la diferencia absoluta
entre dos valores sucesivos sea menor a 10
-3
.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 44
Anlisis del problema

En los tres casos se trata de hacer un ciclo que se ejecute hasta que el valor absoluto de la
diferencia entre el ltimo y el penltimo trmino sea menor que 0.001. Dentro del ciclo habr
un acumulador que sume cada uno de los trminos.

Para el caso de
x
e , en cada trmino el numerador ser x elevado al nmero de orden del trmino,
mientras que el denominador ser el factorial del nmero de orden del trmino. El contador del
ciclo por lo tanto ir tomando valores entre 1 y n.

Para cos(x), el numerador ir elevando a las potencias pares, mientras que el denominador ser el
factorial de los nmeros pares. Por lo tanto el contador del ciclo ir sacando los nmeros pares.
Adems, en l los trminos de orden par restan, mientras que los de orden impar suman.

Por ltimo, para sen(x), la diferencia estriba en que la potencia y el factorial sern de los nmeros
impares, por lo que el contador del ciclo sacar los nmeros impares.

En los tres casos, como se ha dicho ms arriba, tendremos que utilizar una variable suma que
acumular el valor de la serie, un contador, con las caractersticas que se han indicado y dos
variables reales para guardar el ltimo y el penltimo trmino, para ver si la diferencia entre
ambos es menor que 0.001.

Diseo del algoritmo

x
e

real funcin exponente (E entero x)
INICIO
var
entero i.
real suma, ultimo, termino.

suma = 1 + x.
i = 1.
termino = x.

hacer
Inicio
i = i +1.
ultimo = termino.
termino = (x ^ i) / factorial(i),
suma = suma + termino.
Fin.
mientras (abs(termino ultimo) >= 0.001)

devolver(suma).
FIN.

cos(x)

real funcin coseno(E entero x)
INICIO
var
entero i.
real suma, ultimo, termino.
lgico par.
MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 45

suma = 1.
termino = 1.
i = 0.
par = verdadero.

hacer
Inicio
i = i + 2.
ultimo = termino.
termino = (x ^ i) / factorial(i).

si par entonces
suma = suma termino.
sino
suma = suma + termino.

par = !par.
Fin.
mientras (abs(termino ultimo) >= 0.001)

devolver(suma)
FIN.

sen(x)

real funcin seno(E entero x)
INICIO
var
entero i.
real suma, ultimo, termino.
lgico par.

suma = x.
termino = x.
i = 1.
par = verdad

hacer
Inicio
i = i +2.
ultimo = termino.
termino = (x ^ i) / factorial(i).
si par entonces
suma = suma termino.
sino
suma = suma + termino.
par = !par.
Fin.
mientras(abs(termino ultimo) >= 0.001)
devolver(suma).
FIN.

A.1.36 Implementar una funcin llamada redondeo(a,b), que devuelva el nmero real a
redondeado a b decimales.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 46
Anlisis del problema

Para redondear un nmero real a a b decimales siendo b un nmero entero positivo -, hay que
recurrir a la funcin estndar ent que elimina los decimales de un nmero real. Si se quiere dejar
una serie de decimales, hay que obtener el entero de la multiplicacin del nmero a por 10
b
y
dividir el resultado por 10
b
. De esta forma, el resultado, siendo a = 3.546 y b = 2 , sera:

ent(3.546 * 100) / 100 = ent(354.6) / 100 = 354 / 100 = 3.54
Con esto se consigue truncar, no redondear. Para redondear, de forma que hasta 0.5 redondee por
defecto y a partir de ah por exceso, se debe sumar a la multiplicacin 0.5:

ent(3.546 * 100 + 0.5) / 100 = ent(354.6 + 0.5) / 100 = ent(355.1) / 100 =355 / 100 = 3.55

Para realizar esta funcin, nicamente se ha de aplicar la expresin anterior.

Diseo del algoritmo

entero funcin redondeo(E real a; E entero b)
INICIO
devolver(ent(a * 10 ^ b + 0.5) / 10 ^ b.
FIN.

A.1.37 Algoritmo que transforma un nmero introducido por teclado en notacin decimal o
romana. El nmero ser entero y positivo y no exceder de 3000.

Anlisis del problema

Para pasar un nmero desde notacin decimal a romana se transformar individualmente cada
uno de sus dgitos. El procedimiento para transformar un dgito es siempre el mismo:


Dgito Escribir

De 1 a 3 de 1 a 3 veces p1
4 p1 seguido de p2
de 5 a 8 p2 seguido por, de 0 a 3 veces, p1
9 p1 seguido de p3

Tenga en cuenta que, en las distintas llamadas que se realizan al procedimiento, se pasarn
diferentes parmetros:

Parmetro 1 (p1) Parmetro 2 (p2) Parmetro 3 (p3)

Unidades I V X
Decenas X L C
Centenas C D M
Miles M

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 47
Diseo del algoritmo

algoritmo romanos
INICIO
var
entero numero, r, dgito.

hacer
Inicio
escribir(Deme un nmero: ).
leer(numero).
Fin.
mientras((numero < 0) o (numero > 3000)

r = numero.

digito = r div 1000.
r = r mod 1000.
calcularCifraRomana(digito, M, , ).

digito = r div 100.
r = r mod 100.
calcularCifraRomana(digito, C, D, M).

digito = r div 10.
r = r mod 10.
calcularCifraRomana(digito, X, L, C).

digito = r.
calcularCifraRomana(digito, I, V, X).
FIN.

procedimiento calcularCifraRomana(E entero digito; E carcter p1, p2, p3)
INICIO
var
entero j.

si digito = 9 entonces
escribir(p1, p3).
sino
si digito > 4 entonces
Inicio
escribir(p2).
para j = 1 hasta digito 5 hacer
escribir(p1).
Fin.
sino
si digito = 4 entonces
escribir(p1,p2)
sino
para j = 1 hasta digito hacer
escribir(p1).
FIN.

A.1.38 Escribir una funcin, integral, que devuelva el rea del recinto formado por el eje de las
x, las rectas x = a y x = b y el arco de curva correspondiente a una funcin continua,
recibida como parmetro, con valores positivos en el intervalo considerado.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 48
Anlisis del problema

La funcin integral dividir el intervalo [a, b] en n subintervalos y considerar n rectngulos con
esas bases y cuyas alturas sern el valor de la funcin recibida como parmetro, f(x), en el punto
medio de los subintervalos. La suma de las reas de todos estos rectngulos constituir el valor
devuelto por integral.

// tipo real funcin (E real x) func.
real funcin integral(E func f; E real a, b; E entero n)
INICIO
var
real baseRectangulo, altura, x,s.
entero i.

baseRectangulo = (b a) / n.
x = a + baseRectangulo / 2.
s = 0.

para i = 1 hasta n hacer
Inicio
altura = f(x).
s = s + baseRectangulo * altura.
x = x + baseRectangulo.
Fin.

devolver(s).
FIN.

A.1.39 Escribir una funcin recursiva que calcule el factorial de un nmero entero positivo.

Anlisis del problema

El factorial de un nmero entero positivo n se puede definir como:

n! = n(n-1)!

Para cualquier nmero mayor que uno, ya que1! = 1 y 0! = 1. Por lo tanto la condicin de salida
de la llamada recursiva ser cuando n sea menor o igual que 1.

Diseo del algoritmo

entero funcin factorial(E entero numero)
INICIO
si (numero = 0) o (numero = 1) entonces
devolver (1).
sino
devolver(n * factorial(n-1)).
FIN.

A.1.40 Escriba una funcin recursiva que calcule la potencia de un nmero entero positivo.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 49
Anlisis del problema

Una definicin recursiva de x
y
para dos nmeros enteros positivos es la siguiente:

x
y
= x * x
y-1

(
x
0
es 1. Esa ser la condicin de salida de las llamadas recursivas)

Diseo del algoritmo

entero funcin potencia(E entero x, y)
INICIO
si y = 0 entonces
devolver(1).
sino
devolver(x * potencia(x, y-1)).
FIN.

A.1.41 Escribir una funcin recursiva que calcule el trmino n de la serie de Fibonacci.

Anlisis del problema

La serie de Fibonacci es la siguiente:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

es decir, cada nmero es la suma de los dos anteriores, con excepcin de los dos primeros, que
siempre son 1. Por lo tanto tambin podemos hacer una definicin recursiva para averiguar el
trmino n de la serie, puesto que:

fibonacci
n
= fibonacci
n-1 +
fibonacci
n-2

para cualquier n mayor que 2.

Diseo del algoritmo

entero funcin fibonacci(E entero n)
INICIO
si ((n = 0) o (n = 1))
devolver(1).
sino
devolver(fibonacci (n-1)
+
fibonacci(n-2)).
FIN.

A.1.42 Escribir un procedimiento recursivo que escriba un nmero en base 10 convertido a
otra base entre 2 y 9.

Anlisis del problema

Para convertir un nmero decimal a otra base se debe dividir el nmero entre la base y repetir el
proceso, haciendo que el dividendo sea el cociente de la siguiente divisin hasta que ste sea
menor que la base. En ese momento, se recogen todos los restos y el ltimo cociente en orden
inverso a como han salido.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 50
Este ejemplo es una muestra de cmo puede ser til la recursividad cuando se trata de un proceso
que debe recoger los resultados en orden inverso a como han salido. Para simplificar el ejercicio
se ha limitado la base a entre2 y 9, de forma que se evite tener que convertir los restos en letras.

Diseo del algoritmo

procedimiento convertir(E entero numero, base)
INICIO
si n>= b entonces
convertir(numero div base, base).

escribir(n mod b).
FIN.

A.1.43 Disear un algoritmo que resuelva el problema de las ocho reinas.

Anlisis del problema

El problema consiste en colocar las 8 damas dentro del tablero de ajedrez sin que se coman unas
a otras, en general, se tratar de poner n damas en un tablero den x n.

En vez de colocar las damas en un arreglo (se ver en la tercera parte de los apuntes) de n x n
elementos, se utiliza un vector de n elementos. Cada elemento del vector representa la fila donde
est la reina. El contenido representa la columna.

El vector damas se inicializa a 0. Para buscar la siguiente solucin se comienza situando en
damas[1] un 1 (la primera dama est en la primera fila, columna 1) La siguiente dama estar en
la fila 2 y empezamos a buscar en la posicin 1. No ser una posicin vlida si damas[1] =
damas[2] (estn en la misma columna); damas[1] + 1 = damas[2] + 2 (estn en una diagonal) y
damas[1] 1 = damas[2] 2 (estn en la otra diagonal). Si esto ocurre, incrementamos la
columna de la nueva dama y se volver a comprobar.

Diseo del algoritmo

algoritmo reinas
INICIO
const
n = 8.
tipo arreglo entero[1..n] listaDamas.

var
listaDamas damas.
entero i.
lgico solucion.

//Inicializar el arreglo
para i = 1 hasta n hacer
damas[i] = 0.

ensaya(damas, 1, solucion).
si !solucion entonces
escribir(No hay solucin).
sino
//Se deja al lector hacer la presentacin del resultado.
FIN.

MIGUEL . TOLEDO MARTNEZ
ANEXO 1
1 - 51
lgico funcin posicionValida(E listaDamas damas; E entero i)
INICIO
var
entero j.
lgico valida.

valida = verdadero.

para j = 1 hasta i-1 hacer
Inicio
//No se ataca en la columna
valida = valida y (damas[i] <> damas[j)].

//No se ataca en una diagonal
valida = valida y (damas[i] + i <> damas[j] + j).
//No se ataca en la otra diagonal
valida = valida y (damas[i] i <> damas[j] - j).
Fin.

devolver(valida).
FIN.

procedimiento ensayar(E/S listaDamas damas; E entero i; S lgico solucion)
INICIO
si (i = n + 1) entonces
solucion = verdadero.
sino
Inicio
solucion = falso.
hacer
Inicio
damas[i] = damas[i] + 1.
si posicionValida(damas, i) entonces
ensayar(damas, i+1, solucion)
Fin.
mientras (solucion y (damas[i] = n)).

si !solucion entonces
damas[i] = 0.

Fin.
FIN.

Vous aimerez peut-être aussi