Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Anexo 1
Anexo 1
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.
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.
ANEXO 1
1-1
DECLARACIN DE FUNCIONES
Las funciones, como subalgoritmos que son, tienen una constitucin simular a los
algoritmos. Por consiguiente, una funcin constar de:
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])
ANEXO 1
1-2
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.
1-3
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>)
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
ANEXO 1
1-4
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
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.
ANEXO 1
1-5
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
DESTINO
AUXILIAR
3
De 1 a 2
De 1 a 3
De 2 a 3
De 1 a 2
De 3 a 1
1-6
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.
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.
ANEXO 1
Diagrama de flujo
Diagrama N-S (Nassi-Schneiderman)
seudocdigo
1-7
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
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
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
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
si condiciones entonces
enunciados.
Decisin doble:
si condiciones entonces
enunciados.
sino
enunciados.
Decisin mltiple:
Repetitivas
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
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
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
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
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
Diagrama de flujo
condic
in
no
Diagrama N-S
Expresin lgica
Seudocdigo
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
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.
ANEXO 1
1 - 16
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:
Entrada:
Proceso:
ANEXO 1
1 - 17
Entrada:
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.
1 - 18
escribir(raiz).
FIN.
A.1.3 Escribir los diferentes mtodos para deducir si una variable o expresin numrica es
par.
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.
Entrada:
Proceso:
ANEXO 1
1 - 19
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:
Entrada:
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.
ANEXO 1
1 - 20
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
Entrada:
Proceso:
ANEXO 1
1 - 21
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:
Entrada:
Proceso:
ANEXO 1
1 - 22
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
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:
Entrada:
Proceso:
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:
Entrada:
Proceso:
1 - 24
INICIO
var
entero numero.
leer(numero).
si(numero >=10) y (numero <= 100)
escribir(Est entre 10 y 100).
FIN.
Entrada:
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.
ANEXO 1
1 - 25
A.1.12 Escribir el seudocdigo que calcule la suma de los 50 primeros nmeros enteros.
DEFINICIN DEL PROBLEMA
Salida:
Entrada:
ninguna.
Proceso:
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:
Entrada:
Proceso:
1 - 26
Entrada:
capitalInicial, tasaInteres.
Proceso:
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:
Entrada:
Proceso:
ANEXO 1
1 - 27
Entrada:
nada.
Proceso:
ANEXO 1
1 - 28
Entrada:
Proceso:
1 - 29
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:
Proceso:
No hay ms que ejecutar un ciclo hasta que el nmero ledo sea menor
de 1000.
1 - 30
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:
Entrada:
Proceso:
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:
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:
ANEXO 1
1 - 31
1 - 32
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
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
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
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
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
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
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
fechaValida()
aa
esBisiesto()
1 - 38
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
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)
1 - 40
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
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
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.
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!
ANEXO 1
1 - 43
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
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
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
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
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
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
fibonacci(n-2)).
FIN.
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
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.
ANEXO 1
1 - 50
ANEXO 1
1 - 51