Está en la página 1de 51

MIGUEL .

TOLEDO MARTNEZ

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
o
o

Cmo los mdulos son independientes, varios programadores podrn trabajar simultneamente
en la confeccin de un algoritmo, repartindose las distintas partes del mismo.
Se podr modificar un mdulo sin afectar a los dems.
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.

ANEXO 1

1-1

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1-2

MIGUEL . TOLEDO MARTNEZ

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)
ANEXO 1

1-3

MIGUEL . TOLEDO MARTNEZ

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> ... )

La clase 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
o
o

Parmetros de entrada. Permiten nicamente la transmisin de informacin desde el


programa llamador al subprograma.
Parmetros de salida. Slo devuelven resultados.
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
o
o

E equivale a parmetro de entrada.


S querr decir parmetro de salida.
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.

ANEXO 1

1-4

MIGUEL . TOLEDO MARTNEZ

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
o

Como valor de la funcin.


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

o
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.
Paso por valor resultado. Al finalizar la ejecucin del subprograma los valores de los
parmetros formales se transfieren o copian a los parmetros actuales.
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)!

ANEXO 1

1-5

MIGUEL . TOLEDO MARTNEZ

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
o

En cada movimiento slo puede intervenir un disco.


No puede quedar un disco sobre otro de menor tamao.
ORIGEN

DESTINO

AUXILIAR
3

Para n = 3 la solucin del problema implicara los siguientes movimientos:


1.
2.
3.
4.
5.
ANEXO 1

De 1 a 2
De 1 a 3
De 2 a 3
De 1 a 2
De 3 a 1
1-6

MIGUEL . TOLEDO MARTNEZ

6.
7.

De 3 a 2
de 1 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
o
o

ANEXO 1

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

1-7

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1-8

MIGUEL . TOLEDO MARTNEZ

Inicio

Leer
(celsius)

kelvin = celsius +
273.15

Escribir
(kelvin)

Fin

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.

ANEXO 1

1-9

MIGUEL . TOLEDO MARTNEZ

Smbolo

Tipo de estructura

Enunciado 1
Secuencial

Enunciado 2
Enunciado n

Expresin lgica

Repetitiva de 0 a n veces

enunciados

Smbolo

Tipo de estructura

enunciados

Repetitiva de 1 a n veces

Expresin lgica

para i = vI hasta vF

Repetitiva n veces
enunciados

Condicin
si

no

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.
Inicio
Leer(celsius)
kelvin = celsius + 273.15
Escribir(kelvin)
Fin

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.
ANEXO 1

1 - 10

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1 - 11

MIGUEL . TOLEDO MARTNEZ

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
Enunciado 1

Diagrama N-S

Seudocdigo

Enunciado 1

Enunciado 1.
Enunciado 2.
Enunciado n.

Enunciado 2
Enunciado 2

Enunciado 3

Enunciado n

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

ANEXO 1

1 - 12

MIGUEL . TOLEDO MARTNEZ

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

condic
in

Diagrama N-S

no

Seudocdigo

Condicin
s

no

Si condicin entonces
enunciados.

enunciados

enunciados

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

si

condici
n

Enunciado

Diagrama N-S

no
enunciados

Seudocdigo

Condicin
s

no

si condicin entonces
Enunciado si.
sino
enunciados sino.

Enunciados
Enunciados

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.

ANEXO 1

1 - 13

MIGUEL . TOLEDO MARTNEZ

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

condici
n

Seudocdigo

Condicin
v1

v1

v2

v3

enunc
iados
1

Enuncia
dos
2

enunc
iados
n

v2

enun
enun
ciado ciado 2
1

v3 sino

enun
enun
ciado 3 cia
do n

Segn sea expresin hacer


Lista 1: enunciados 1.
Lista 2: enunciados 2.
..................................
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.

ANEXO 1

1 - 14

MIGUEL . TOLEDO MARTNEZ

Diagrama de flujo

condic
in

no

Diagrama N-S

Expresin lgica

Seudocdigo

mientras expresinLogica hacer


enunciados.

enunciados

enunciados

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

enunciados

Seudocdigo
hacer
enunciados.
mientras expresionLogica.

Expresin lgica

condici
n

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.

ANEXO 1

1 - 15

MIGUEL . TOLEDO MARTNEZ

Es posible sustituir una estructura para por otra de tipo mientras controlada por un
contador.
Diagrama de flujo

Diagrama N-S
para i = vI hasta vF

i = vI

no

enunciados

i > vF

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

i = i + inc.

s
enunciados

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.

ANEXO 1

1 - 16

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1 - 17

MIGUEL . TOLEDO MARTNEZ

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)
ANEXO 1

1 - 18

MIGUEL . TOLEDO MARTNEZ

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%.

ANEXO 1

1 - 19

MIGUEL . TOLEDO MARTNEZ

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

ANEXO 1

1 - 20

MIGUEL . TOLEDO MARTNEZ

//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

ANEXO 1

1 - 21

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1 - 22

MIGUEL . TOLEDO MARTNEZ

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 de T 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

ANEXO 1

1 - 23

MIGUEL . TOLEDO MARTNEZ

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
ANEXO 1

1 - 24

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1 - 25

MIGUEL . TOLEDO MARTNEZ

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
ANEXO 1

1 - 26

MIGUEL . TOLEDO MARTNEZ

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

ANEXO 1

1 - 27

MIGUEL . TOLEDO MARTNEZ

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:


a1 = 0, a2 = 1, an = 3 * an-1 + 2 * an-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.

ANEXO 1

1 - 28

MIGUEL . TOLEDO MARTNEZ

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 Xn, donde:


X
n

Puede ser cualquier nmero real distinto de 0


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
ANEXO 1

1 - 29

MIGUEL . TOLEDO MARTNEZ

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).
ANEXO 1

1 - 30

MIGUEL . TOLEDO MARTNEZ

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

ANEXO 1

1 - 31

MIGUEL . TOLEDO MARTNEZ

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.
ANEXO 1

1 - 32

MIGUEL . TOLEDO MARTNEZ

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)

ANEXO 1

1 - 33

MIGUEL . TOLEDO MARTNEZ

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
ANEXO 1

1 - 34

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1 - 35

MIGUEL . TOLEDO MARTNEZ

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.
ANEXO 1

1 - 36

MIGUEL . TOLEDO MARTNEZ

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
factorialn = n * n-1 * n-2 * ... * 1
Por definicin, factorial0 = 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.

ANEXO 1

1 - 37

MIGUEL . TOLEDO MARTNEZ

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)

fechaValida()

aa

bisiesto (verdadero o falso)

esBisiesto()

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
ANEXO 1

1 - 38

MIGUEL . TOLEDO MARTNEZ

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 Xy, 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, Xy 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
ANEXO 1

1 - 39

MIGUEL . TOLEDO MARTNEZ

devolver(p).
sino
devolver(1/p).
FIN.

A.1.31 Realizar tres funciones que permitan hallar el valor de mediante las series matemticas
siguientes:
i

(
1)

1 1 1
= 41 + + !
= 4
a)

3 5 7
i = 0 2i + 1

b)

1
2

24

(i )
i =1

24 24 24 24
1
24 + 2 + 2 + 2 + 2 + !
2
2
3
4
5

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

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.
ANEXO 1

1 - 40

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1 - 41

MIGUEL . TOLEDO MARTNEZ

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 de 284: 1 + 2 + 4 + 71 + 142 = 220
Suma de divisores de 220: 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:

programaPrincipal()
i, j

amigos
sonAmigos()

suma
sumaDivisor()

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 de i entre 1 y
m, mientras que el ciclo interno ir tomando valores entre i+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.
ANEXO 1

1 - 42

MIGUEL . TOLEDO MARTNEZ

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:

m!
m
=
n n! (m n )!
m
Disear una funcin que permita calcular el nmero combinatorio
n
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 ex, cos(x) y sen(x) a
partir de las series siguientes:
n

ex =
i= 0

x2 x3
xi
= 1+ x +
+
+!
2! 3!
i!

x 2i
x2 x4 x6
= 1
+

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

sen( x) = (1)
i =1

x3 x5 x7
x 2i +1
= x
+

+!
(2i + 1)!
3! 5! 7!

El nmero de trminos de la serie ser el suficiente para que la diferencia absoluta


entre dos valores sucesivos sea menor a 10-3.

ANEXO 1

1 - 43

MIGUEL . TOLEDO MARTNEZ

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 e x , 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

ex
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.
ANEXO 1

1 - 44

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1 - 45

MIGUEL . TOLEDO MARTNEZ

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 10b y
dividir el resultado por 10b. 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
p1 seguido de p2
p2 seguido por, de 0 a 3 veces, p1
p1 seguido de p3

de 5 a 8
9

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

Unidades
Decenas
Centenas
Miles

ANEXO 1

Parmetro 1 (p1)

Parmetro 2 (p2)

Parmetro 3 (p3)

I
X
C
M

V
L
D

X
C
M

1 - 46

MIGUEL . TOLEDO MARTNEZ

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.
ANEXO 1

1 - 47

MIGUEL . TOLEDO MARTNEZ

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 que 1! = 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.

ANEXO 1

1 - 48

MIGUEL . TOLEDO MARTNEZ

Anlisis del problema


Una definicin recursiva de xy para dos nmeros enteros positivos es la siguiente:
xy = x * xy-1
( 0

x 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.

ANEXO 1

1 - 49

MIGUEL . TOLEDO MARTNEZ

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 entre 2 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 de n 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.

ANEXO 1

1 - 50

MIGUEL . TOLEDO MARTNEZ

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.

ANEXO 1

1 - 51

También podría gustarte