Académique Documents
Professionnel Documents
Culture Documents
ESTRUCTURA DE DATOS
Primera Parte
Enero 2011
comentan que es ordenada y explica muy bien, adems que desarrolla una gran variedad
de ejercicios y problemas.
Sin nimo de ofender, los tres profesores que siguen tienen algunas deficiencias. El profesor
Acosta es ordenado, es puntual en la revisin de los exmenes, es muy estricto en su
calificacin, avanza bastante, pero no explica muy bien y tiene la costumbre de realizar
problemas con un nivel muy complejo cuando debera empezar con ejercicios simples,
adems que es arrogante. De la profesora Grimanesa puedo rescatar que es bien ordenada
y organizada, deja tareas y aumenta puntos a los que lo resuelven, pero avanza despacio y
se retrasa mucho en las clases. Generalmente, los que se matriculan con ella son los
repitentes que ya tienen la base y solo desean aprobar el curso. Si es que llevan el curso por
primera vez, no sera muy recomendable. El profesor Crdova es un ingeniero con mucha
experiencia, domina su materia pero sus clases no son ordenadas (me refiero a la pizarra),
adems que hay que hacer un esfuerzo para entenderle. Recalco que no pretendo ofender a
los profesores, solo darle unas sugerencias. (Ya que yo llev el curso tres veces con los tres
ltimos profesores mencionados)
Una ltima sugerencia es la siguiente: Cada profesor hace su clase diferente, segn la
seccin en donde se encuentren el formato de la resolucin de los problemas cambia. Por
qu? Porque para la escritura de algoritmos no existe un estndar (en otras universidades
tambin usan diferentes estilos) pero la idea y la lgica es lo que importa.
En este texto usar el formato del profesor Acosta, por costumbre y por ser entendible.
Aunque estn en otras secciones, esta primera parte del curso, les va a servir a todos, ya
que los algoritmos no difieren mucho. La diferencia se va haciendo mayor en los ltimos
temas.
A mi parecer, los ejercicios de este compendio son la base del curso. Los temas que siguen, y
que no estn aqu, incorporan nuevas cosas pero se sigue utilizando la teora de la primera
parte. Ms adelante procurar subir a Internet los temas que faltan.
Una vez ledo el libro (incluso antes), si es que les lleg a ser de gran ayuda, no duden en
recomendrselo a otros que tambin lo pueden estar necesitando. Para mejorar este texto,
pueden mandarme cualquier sugerencia al correo electrnico theoliztik@gmail.com y
tambin aquellos que quisieran aportar con problemas resueltos de prcticas y exmenes.
Su amigo: The Oliztik
UNIDAD I
ALGORITMOS Y ESTRUCTURA DE DATOS
Cuando llevamos algoritmos, lo ideal sera que ya conociramos los siguientes cursos:
Clculo Diferencial. Geometra Analtica, Clculo Integral, lgebra Lineal adems de poseer una
gran capacidad de abstraccin. Esa es la razn por la que se el profesor Acosta opina que sera
mejor llevar este curso en el tercer ciclo y ya no en el segundo. En este curso nos van a dar la
base y los cimientos para que ms adelante seamos unos excelentes programadores.
CONCEPTOS BSICOS:
DATO:
Es un MENSAJE (segn la IBM), posee la caracterstica de ser OBJETIVO, es decir, es
independiente de quien lo emite pues un MENSAJE es nico.
Es la representacin de un hecho real. Un dato es aquel que puede ser registrado por un
computador. Ejemplo: El peso de una persona, la temperatura, el nombre de una persona, etc.
Es la expresin general que describe los objetos con los cuales opera una computadora.
INFORMACIN:
Es la INTERPRETACIN de un DATO o MENSAJE. La informacin posee la caracterstica de ser
SUBJETIVO ya que cada persona interpreta un mensaje de diferente forma.
CLASIFICACIN DE LOS DATOS
Los datos se clasifican en datos simples y datos compuestos (tambin llamados estructurados).
La clasificacin general es la siguiente:
DATOS
Simples o Primitivos
Compuestos o Estructurados
ESTTICOS
DINMICOS
NUMRICO
Entero
Arreglos
Punteros
Real
Cadenas
Listas
LGICO
Registros
rboles
Archivos
Grafos
Verdadero
Falso
CARACTER
Alfabtico
Numrico
Especial
Por ahora nos centraremos en los datos simples, en la tercera unidad se ver con ms detalle los
datos estructurados.
DATOS SIMPLES
) y constan de un solo
, ,
, , ,...
,...
Numrico: No confundir con los datos numricos anteriores. Los datos de tipo caracter
numrico van entre comillas simples. Son solo 10 datos de tipo caracter numrico, adems
con estos no se pueden realizar operaciones aritmticas
1, 2, 3, 4, 5, 6, 7, 8, 9, 0
Especial: Corresponden a ciertos caracteres como: ,
* ,
{ ,
@ , etc.
3. LGICO: Son solo dos, Verdadero y Falso, y se va a utilizar cuando se evalen condiciones. En
este curso vamos a utilizar las letras V y F cuando hagamos referencia a algn dato lgico.
B. SEGUNDA FORMA DE CLASIFICACIN: Ordinales y no Ordinales
OBSERVACIONES:
CODIGO ASCII: Los caracteres tienen un cdigo que entre otras cosas, nos permite
ordenarlos. Por ejemplo:
<
<
<
El hecho de que a los datos reales se les considere no ordinales, no quiere decir que no
puedan ser comparados. (La proposicin 5.2 < 6.6 es verdadera), sino, son considerados no
ordinales pues, dado un dato real, no se sabe que nmero es el que le sigue, en cambio, dado
un dato ordinal, podemos saber que datos le anteceden y que datos le siguen. Ejemplo:
Dado el dato entero: 5 , sabemos que le precede el 4 y le sigue el 6.
Dado el dato caracter:
y le sigue
Pero, dado el dato real: 5.2 , no podemos determinar quin le antecede y quin le sigue. Y
aunque sepamos cules son los nmeros mayores o menores que ste, es considerado
no ordinal.
Existe adems una operacin que nos permite obtener el residuo o resto de la divisin entera,
para eso utilizamos el operador denotado por la palabra mod .
Ejemplo:
5 mod 2 = 1
OBS:
Algunos utilizan otros smbolos para el resto de la divisin entera, por ejemplo otros
usan % en vez de mod. Nosotros usaremos nicamente mod.
Los operadores div y mod son exclusivamente para datos enteros, por tal motivo la
operacin 5.6 mod
OPERADORES LGICOS
Negacin: o sino ~
Conjuncin: (se lee:
OBS:
Con mucha ms frecuencia usaremos el smbolo de negacin en ves de ~
es un operador unario, ya que nicamente afecta a una expresin.
expresin_lgica
Sern usados para establecer comparaciones entre 2 valores del mismo tipo de datos.
Mayor que
>
Menor que
<
>= o sino
<= o sino
Igual
Diferente
o sino <>
OBS:
Con mucha ms frecuencia usaremos el smbolo de no igualdad
De acuerdo a los tipos de datos que se comparan se tienen los siguiente tipos de
comparaciones:
o Comparaciones de datos de tipo caracter: Se comparan sus cdigos. Por tanto tenemos:
<
<
IDENTIFICADORES
Un identificador es solo el nombre de algo. Pero de manera ms formal es un conjunto de
caracteres que permite identificar a los elementos de un algoritmo. Los identificadores son
llamados vlidos cuando poseen las siguientes caractersticas:
1. Deben empezar con una letra (no pueden empezar con un nmero o con otro smbolo) y no
deben contener el caracter espacio en blanco
Ejemplo:
Son identificadores vlidos:
A1
X1
A123 ,
A2B3C
X 1
(Son invlidos porque el primer identificador por comienza con un nmero, y la segunda por
contener al caracter espacio en blanco.)
2. Solo pueden contener a los caracteres alfabticos (letras maysculas o minsculas),
caracteres numricos (dgitos) y al nico caracter especial Subguin o Guin bajo
Ejemplo:
Son identificadores vlidos:
X_1
The_Oliztik
Estructura_de_datos
Estructura-de-datos
The-Oliztik
10
CONSTANTES Y VARIABLES
CONSTANTES: Son aquellos DATOS que van a tener un valor fijo. Las constantes al ser DATOS,
se clasifican en: Constantes numricas (constantes enteras y constantes reales), constantes
caracter (constantes alfabticas, numricas, especiales) y constantes lgicas: verdadero y falso.
Las constantes tienen un nombre o identificador. Generalmente el identificador para la
constante debe contener caracteres alfabticos en mayscula (aunque esto no es obligatorio en
este curso pero sera mucho ms esttico).
Ejemplo:
PI = 3.14
(Constante real)
N = 10
(Constante entera)
LETRA =
(Constante caracter)
VARIABLES: Son aquellos DATOS que no van a tener un valor fijo, sino que van a ser
modificados. De forma anloga a las constantes, las variables al ser DATOS, se clasifican en:
Variables numricas (variables enteras y variables reales), variables caracter (variables
alfabticas, numricas, especiales); variables lgicas: verdadero y falso.
Las variables tambin tienen un nombre o identificador vlido. Generalmente el identificador
para la variable debe contener caracteres alfabticos en minscula (aunque esto tampoco es
obligatorio)
Ejemplo:
Sueldo ,
edad
fecha ,
Ganancia,
suma1 ,
suma_2
i ,n
OBS:
No hay que confundir el identificador o nombre de un dato (ya sea este una constante o una
variable) con su valor o contenido.
En los dos ltimos ejemplos, se tienen tres constantes de diferente tipo, el identificador de la
primera constante es PI y tiene como valor al nmero real 3.14. El identificador de la
segunda constante es N y tiene como valor al nmero entero 10, el identificador de la tercera
constante es LETRA y tiene como valor al caracter
11
En el otro ejemplo, se tiene las variables cuyos identificadores son: sueldo, edad, fecha,
ganancia, suma1, suma_2, i, n. Debido a que el contenido de las variables puede cambiar,
todava no les hemos asignado algn valor determinado. Despus se ver como funciona el
uso de las variables.
Depender de cada persona en la forma cmo quiera identificar a una variable o constante,
pero se sugiere que el nombre o identificador que se use deba tener relacin con el objeto
que representa. Ejemplo: Si una variable almacenar edad o edad(es) es obvio que su
identificador sera edad.
12
LA OPERACIN DE ASIGNACIN
La operacin de asignacin es aquella que permite almacenar valores a una variable. Para
realizar la operacin de asignacin se utiliza el operador (flechita hacia la izquierda). Para
realizar la operacin de asignacin se tiene el siguiente formato:
Formato:
Nomb_var valor
Donde:
Nomb_var: viene a ser el identificador vlido o nombre de la variable
Valor: es el valor que se le quiera asignar o almacenar
Ejemplos:
L 25
, Significa que el valor que toma la variable L sera el resultado de sumar 5 + 10,
13
B 20
C A +B
Tambin es posible utilizar el mismo nombre o identificador en ambos lados del operador de
asignacin. Por ejemplo:
D 35
D D+10
sera: Primero, se calcula el resultado de la derecha, es decir la suma de la variable D (la cual vale
35) con 10. Segundo, el resultado (que sale 45) se le asigna a la variable D, por lo que D se queda
con ese valor. Desde el punto de vista matemtico esto no tendra sentido, pero s en este curso.
NOTA: De ahora en adelante para ya no estar indicando: la variable de nombre x o la variable
cuyo identificador es x ; expresar: la variable x , solo por comodidad.
14
S S + num
CONTADOR: Son variables numricas de tipo entero solamente. Son tiles al momento de
contar eventos o sucesos, su valor se incrementa o decrementa en un valor constante.
Usaremos la siguiente asignacin:
contador contador + 1
El nombre que generalmente se le da a esta variable es cont, pero cada quien tiene la libertad de
decidir identificador vlido ponerle.
Ejemplo: Consideremos la variable cont entera
cont 0
(Cuando se le asigna un valor a un contador por primera vez, se dice entonces que se est
inicializando al contador)
15
cont cont + 1,
decir, 1)
cont cont + 1,
decir, 2)
16
ALGORITMOS
Un algoritmo es un conjunto de pasos lgicos que permiten resolver un problema.
CARACTERSTICAS
1. Debe ser finito, es decir, en algn momento debe terminar.
2. Debe estar ordenado (debe tener una secuencia lgica)
3. Debe de estar bien definido, de tal forma que si se sigue dos veces, se obtendra el mismo
resultado cada vez.
Ejemplo: Escriba un algoritmo para prender el televisor
1. Ponerse de pie
2. Caminar y dirigirse hacia el televisor
3. Levantar la mano e introducir el dedo en el botn de encendido
4. Regresar a su lugar
Como ven, esto es un algoritmo, as como la una receta de cocina, los procedimientos para ir a
votar, para amarrarse los zapatos, para calcular el mximo comn divisor, etc. La palabra
algoritmo es muy general, por eso, es necesario precisar que en este curso lo que nos va a
interesar es desarrollar algoritmos que permitan solucionar problemas a travs de una
computadora.
Para la creacin de algoritmos debemos tener presente:
1. Con qu informacin contamos? que es lo mismo a Cules son los datos de entrada?
2. Qu nos piden como resultado? que es lo mismo a Cules son los datos de salida?
3. Cules son los procesos que transforman los datos de entrada en la informacin requerida?
DATOS
DE
ENTRADA
PROCESO
DATOS
DE
SALIDA
17
18
PSEUDOCDIGO
Es la representacin escrita en un lenguaje parecido al habla humano (espaol/ingls).
PARTES DE UN PSEUDOCDIGO
Vamos a distinguir 2 partes.
1. El encabezado o cabecera: Aqu va a ir la palabra reservada Pseudocdigo seguida de un
identificador vlido para el algoritmo, es decir el nombre del algoritmo. (o nombre del
programa), el cual, se sugiere que sea un nombre que describa al programa.
Formato:
Pseudocdigo Identificador_Algoritmo
Ejemplo:
Pseudocdigo Promedio
Pseudocdigo Prom_2
Algunos profesores, en vez de utilizar la palabra Pseudocdigo prefieren usar la palabra
Algoritmo, como es el caso de la profesora Grimanesa.
2. El bloque algortmico: Se podra dividir en tres partes.
2.1 Seccin de declaracin de constantes y variables: En esta parte se van a definir o
declarar todos los datos a utilizar (constantes y variables) tanto simples como compuestos.
Para este curso, definir o declarar un dato (variable o constante) se puede entender como
crear un dato para que pueda ser utilizado.
En realidad, ms adelante, aparte de declarar Variables Y Constantes, tendremos que
recurrir a la creacin de Tipos, pero por ahora solo vamos a interesarnos en las variables y
constantes. Lo relacionado a los Tipos se ver en la Unidad III.
Formato:
Const
const1 = valor1
const2 = valor2
...
constN = valorN
Var
var1 : tipo_dato1
var2 : tipo_dato2
...
varN : tipo_datoN
19
PI = 3.1416
IGV = 0.19
Var
edad: entero
sueldo: real
sexo: caracter
La edad se declara generalmente como variable entera pues se considera cantidades enteras
de aos. El sueldo se declara como variable real pues presentar punto decimal y el sexo al
ser masculino o femenino, deber ser caracter para asumir dos posibles valores: o
20
Pseudocdigo Identificador_Algoritmo
Tipo
Const
Var
SUBPROGRAMAS
Inicio
Fin
Ejemplo: Realice un algoritmo que permita hallar el promedio de 3 notas y luego represntelo
mediante pseudocdigo.
Pseudocdigo Ejemplo
Var
Inicio
Leer (n1, n2, n3)
prom (n1+n2+n3)/3
Escribir (prom)
Fin
21
variable C sera la suma de los valores que estn almacenados en las tres variables n1, n2 y n3.
Por tal motivo el valor de la variable C sera 5 + 8 + 9 = 22
INTRUCCIN DE SALIDA (ESCRITURA DE DATOS)
La instruccin de salida permite mostrar los valores que han sido almacenados en determinadas
variables. A esta instruccin tambin se le conoce como instruccin de escritura. El valor que
est almacenado en una variable se puede visualizar a travs de dispositivos de salida como el
monitor y la impresora.
El formato para realizar esta instruccin es el siguiente:
Escribir (variable)
Para el caso en el que se tengan muchas variables se realiza:
Escribir (variable1, variable2,..., variableN)
22
Ejemplo: En el ejemplo realizado para calcular el promedio de tres notas, la instruccin de salida
que se realiz fue:
Escribir (prom)
Lo cual, significa que por el monitor se pudo visualizar el valor que almacenada la variable prom.
C n1+n2+n3
Significara que en la pantalla del monitor se puede visualizar el valor de la variable C, o sea 22.
22
OBSERVACIN:
Cuando queramos escribir un mensaje que aparezca en la pantalla de la computadora,
haremos uso de la palabra Escribir seguida de un parntesis y comillas. El mensaje ir
dentro de las comillas.
Escribir (aqu va el mensaje )
Ejemplo:
Escribir Voy a aprobar el curso de Algoritmos )
Voy a aprobar el
curso de
Algoritmos
23
28
La mxima
edad es 28
24
OBSERVACIONES:
En ocasiones podemos hacer uso de comentarios. Estos permiten explicar a los que
vayan a revisar nuestro algoritmo el porqu se realizan ciertas acciones. Ejemplo:
Pseudocdigo Ejemplo
Var
Inicio
Leer (n1, n2, n3)
prom (n1+n2+n3)/3 ( * Media aritmtica de las 3 notas * )
Escribir (prom)
Fin
Los comentarios que hagamos debern ir entre parntesis y asteriscos. ( *
* ).
El uso de los comentarios es opcional, aunque a veces sirven para que nuestro
algoritmo sea ms entendible.
Los comentarios no van a aparecer en la pantalla ni tampoco van a interferir con las
instrucciones, solo son ayudas visuales.
25
UNIDAD II
ESTRUCTURAS DE CONTROL
En mayo de 1966 Botin y Jacopeni demostraron de que cualquier algoritmo, sin importar su
complejidad, poda ser construido utilizando combinaciones de tres estructuras de control de
flujo estandarizados (secuencial, selectivas o de seleccin y repetitivas o iterativas). El flujo de
control se refiere al orden en que se ejecutan las sentencias del programa.
Sinnimos: control de flujo, secuenciacin
Const
Var
Inicio
Accin 2
Accin 1
Accin 2
Accin 3
Accin 3
Fin
26
a partir de la ecuacin
Datos de salida?
Proceso:
y 3 * x * x + 7 * x 15
Pseudocdigo Ejemplo_1
Var
x, y: real
Inicio
Leer (x)
y 3 * x * x + 7 * x 15
Escribir (y)
Fin
Presentamos
el valor de la
variable
Inicio
Leer (horas_trab, precio_hora)
sue_bru horas_trab * precio_hora
sue_net 0.8 * sue_bru
Escribir (sue_ne)
Fin
27
Ejemplo 3: Disear un algoritmo para calcular el monto que debe pagar un cliente que
desea comprar los productos A, B y C. Los precios de venta se dan como dato. Existe un
descuento del 10% para los productos A y B antes del I.G.V. Solucin:
Pseudocdigo Ejemplo_3
Var
PA, PB, PC, CA, CB, CC, PTA, PTB, PTC, IGV, PP: real
Inicio
Escribir ( Ingrese los precios de los productos A, B y C )
Leer (PA, PB, PC)
PTA 0.9 * (PA * CA)
PTB 0.9 * (PB * CB)
PTC PC * CC
IGV 0.19 * (PTA+PTB+PTC)
PP PTA+PTB+PTC+IGV
Escribir ( Total a pagar: , PP)
Fin
28
N = 123
R1 N mod 10
(R1 = 3)
2. Ahora debemos quedarnos con el nmero que queda a la izquierda del 3, es decir, con 12. Para
eso dividimos 123 entre 10 y nos quedamos con el cociente el cual lo almacenamos en una
variable llamada N1. (Utilizamos el operador div)
N1
N div 10
(N=12)
As, tenemos:
29
3. Volvemos a repetir los pasos anteriores, tomaremos la primera cifra de la derecha de 12 el cual
es 2, por eso dividimos 12 entre 10 y nos quedamos con el residuo el cual lo almacenamos en
una variable llamada R2. (Utilizamos el operador mod)
R2 N1 mod 10
(R2 = 2)
4. Ahora debemos quedarnos con el nmero que queda a la izquierda de 2, es decir, con 1. Para eso
dividimos 12 entre 10 y nos quedamos con el cociente el cual lo almacenamos en una variable
llamada N2. (Utilizamos el operador div)
N2
N1 div 10
(N2=1)
As tenemos:
30
Ahora que ya tenemos los dgitos del nmero inicial N = 123 almacenados en distintas variables,
ya podremos formar el nmero invertido.
Inicio
Leer (N)
R1 N mod 10
N1 N div 10
R2 N1 mod 10
N2 N1 div 10
R3 N2 mod 10
N3 N2 div 10
NI R1 * 1000 + R2 * 100 + R3 * 10 + N3
Escribir El nmero invertido es: NI)
Fin
31
then, else)
EN DIAGRAMA DE FLUJOS: Se usa una figura geomtrica con forma de rombo llamada DECISIN.
CLASIFICACIN:
A. ESTRUCTURA SELECTIVA SIMPLE: (Si
entonces / If
alternativa simple.
Se evala una condicin y:
- Si es verdadera
- Si es falsa
Condicin
V
Si (condicin) entonces
Accin 1
Accin 2
Accin 3
Accin 2
fin_si
32
sueldo: entero
Inicio
Escribir ( Ingrese su sueldo actual )
Leer (sueldo)
Si (sueldo > 1000) entonces
sueldo 1.15 * sueldo
fin_si
Escribir (sueldo)
Fin
Ejemplo 6: Disear un algoritmo para calcular el promedio de 4 notas de prcticas
calificadas eliminando la menor nota.
Solucin:
Datos de entrada? Las 4 notas de las prcticas
Datos de salida? El promedio de las 3 notas ms altas.
Proceso? Encontrar la menor nota mediante comparaciones.
Pseudocdigo Promedio_prctica
Var
Inicio
Escribir ( Ingrese las notas de prcticas )
Leer (pc1, pc2, pc3, pc4)
mn pc1
Inicializamos la
Si (pc2 < mn) entonces
variable mn con el
mn pc2
valor de cualquiera
fin_si
de las prcticas: pc1,
Si (pc3 < mn) entonces
pc2, pc3, pc4, en este
mn pc3
caso con pc1
fin_si
Si (pc4 < mn) entonces
mn pc4
fin_si
prom (pc1+pc2+pc3+pc4-mn) / 3
Escribir El promedio de prcticas es: , prom)
Fin
33
Inicio
Leer (n1, n2, n3)
mx n1
mn n1
Si (n2 > mx) entonces
mx n2
fin_si
Inicializamos las
variables max y mn
con el valor de
cualquiera de las
notas: n1, n2, n3; en
este caso con n1
34
entonces; Sino / If
- Si es la condicin es falsa
Si (condicin) entonces
V
Condicin
Acciones1
Sino
Accin 1
Accin 2
Acciones2
fin_si
Ejemplo 8: Una universidad aplica dos exmenes E1 y E2 a sus postulantes. Los postulantes
son admitidos si tienen una calificacin mayor que 80 en al menos uno de los exmenes, en
caso contrario, ser rechazado. Disee un algoritmo que soluciones el problema y diga si un
alumno est aprobado o desaprobado.
Solucin:
Pseudocdigo Examen_Admisin
Var
Inicio
Leer (E1, E2)
Si (E1 > 80 E1 > 80) entonces
Escribir admitido )
sino
Escribir rechazado )
fin_si
Fin
35
a, b, x: real
Inicio
Leer (a, b)
Si (a 0) entonces
x b/a
Escribir solucin nica: , x)
sino
Si (b=0) entonces
Escribir ( Ecuacin consistente indeterminada, infinitas soluciones )
Sino
fin_si
fin_si
Fin
ao: entero
Inicio
Leer (ao)
36
a, b, c, mx: entero
Inicio
Leer (a, b, c)
Si (a > b) entonces
mx a
sino
mx b
fin_si
Si (c > mx) entonces
mx c
fin_si
Escribir (mx)
Fin
Ejemplo 12: Disee un algoritmo que calcule el nuevo sueldo de un empleado conociendo su
sueldo actual bajo el siguiente criterio. Aumente en 12% su sueldo si este es superior a
s/.100 y un 20% en caso contrario. Solucin
Pseudocdigo Sueldo
Var
Inicio
Leer (sueldo)
Si (sueldo > 100) entonces
nsueldo 1.12 * sueldo
sino
nsueldo 1.2 * sueldo
fin_si
Escribir (nsueldo)
Fin
37
Ejemplo 13: Dado 3 nmeros, determinar si la suma de cualquier pareja de ellas es igual al
tercero. Si se cumple la condicin, escribir iguales y en caso contrario distintos .
Solucin: Vamos a resolverlo de dos formas:
Primera Forma:
Pseudocdigo Ejemplo_13
Var
a, b, c: entero
Inicio
Leer (a, b, c)
Si (a+b=c) entonces
Escribir ( Iguales )
sino
Si (b+c=a) entonces
Escribir Iguales )
sino
Si (a+c=b) entonces
Escribir Iguales )
sino
Escribir Distintos )
fin_si
fin_si
fin_si
Fin
Segunda Forma: Observen cmo el uso del operador lgico disminuye considerablemente el
nmero de instrucciones selectivas dobles.
Pseudocdigo Ejemplo_13
Var
a, b, c: entero
Inicio
Leer (a, b, c)
Si (a+b=c a+c=b b+c=a) entonces
Escribir ( Iguales )
sino
Escribir Distintos )
fin_si
Fin
38
Ejemplo 14: Una empresa qumica paga a sus vendedores un sueldo bsico quincenal de s/.
250 ms un % del total de las ventas efectuadas segn la siguiente tabla.
Monto total de ventas
% de pago
MV S/. 2000
15%
12%
10%
Por otro lado si el sueldo del vendedor supera los S/. 800, ste se somete a un impuesto del
10% sobre su sueldo total. Desarrolle un algoritmo que permita conocer el monto del
descuento por impuesto, el sueldo neto y el sueldo total.
Solucin
Voy a utilizar las siguientes variables: sb: sueldo bsico, mtv: monto total de las ventas, desc:
descuento, sn: sueldo neto.
Pseudocdigo Sueldo
Var
Inicio
sb 250.0
Leer (mtv)
Si (mtv 2000) entonces
st sb + 0.15 * mtv
sino
Si (mtv 1500) entonces
st sb + 0.12 * mtv
sino
st sb + 0.1 * mtv
fin_si
fin_si
Si (st > 8000) entonces
desc 0.1 * st
sn st - desc
sino
desc 0
sn st
fin_si
Escribir (st, desc, sn)
Fin
39
Este problema puede ser resuelto cambiando la ltima parte de la siguiente forma:
Pseudocdigo Sueldo
Var
Inicio
sb 250.0
Leer (mtv)
Si (mtv 2000) entonces
st sb + 0.15 * mtv
sino
Si (mtv 1500) entonces
st sb + 0.12 * mtv
sino
st sb + 0.1 * mtv
fin_si
fin_si
Si (st > 8000) entonces
desc 0.1 * st
sino
desc 0
fin_si
sn st - desc
Escribir (st, desc, sn)
Fin
40
a, b, c: entero
Inicio
Leer (a, b, c)
Si (a > b) entonces
Si (b>c) entonces
Escribir (a, b, c)
sino
(* c
b *)
Si (a>c) entonces
Escribir (a, c, b)
sino
(* c
a *)
Escribir (c, a, b)
fin_si
fin_si
Sino
(* b
a *)
Si (a>c) entonces
Escribir (b, a, c)
sino
(* c
a *)
Si (b>c) entonces
Escribir (b, c, a)
sino
(* c
b *)
Escribir (c, b, a)
fin_si
fin_si
fin_si
Fin
41
Ejemplo 16: Dado 4 nmeros enteros diferentes, presentar el segundo mayor. Solucin
Para resolver este problema, vamos a tratar de ordenar los nmeros de mayor a menor, y para
eso realizaremos comparaciones de la siguiente forma:
max1
a
b
c
max3
max2
min3
max5
min2
max4
min5
min1
min4
Los nmeros que van a ser ingresados, van a ser almacenados en las variables a, b, c y d. Luego
comparamos
almacenamos en
y tratamos de almacenar en
Si (a < d) entonces
aux a
ad
d aux
fin_si
Lo mismo haremos con b y c.
Si (b < c) entonces
aux b
bc
c aux
fin_si
Entonces obtendremos dos mximos y dos mnimos parciales: max1, max2, min2, min1, los
cuales estarn almacenados en ese orden en las variables a, b, c, d.
Luego compararemos los dos mximos parciales (max1 y max2 que estn almacenados en a y b)
de tal forma que tratemos de almacenar el mayor de entre estos dos en
estos dos en
y el menor de entre
. De manera anloga se comparar los dos mnimos parciales (min2 y min1 que
estn almacenados en c y d) de tal forma que tratemos de almacenar el menor de entre estos dos
en
encuentre almacenado en
tratemos de almacenar en
En conclusin, la finalidad de este mtodo fue el de ordenar los nmeros ingresados de mayor a
42
menor pues de esta forma se sabe quin es el segundo mayor, tercero mayor, segundo menor,
etc. (a > b > c > d)
Pseudocdigo Segundo_Mayor
Var
a, b, c, d, aux: entero
Inicio
Leer (a, b, c, d)
Si (a < d) entonces
aux a
ad
d aux
fin_si
Si (b < c) entonces
aux b
b c
c aux
fin_si
Si (a < b) entonces
aux a
ab
b aux
fin_si
Si (c < d) entonces
aux c
cd
d aux
fin_si
Si (b < c) entonces
aux b
b c
c aux
fin_si
Escribir ( El segundo mayor es: b)
Fin
43
o acciones.
SELECTOR
Caso
Caso 2
Sentencia1
Sentencia2
Caso n
Sentencian
En_caso (SELECTOR)
Caso1: Sentencia 1
Caso2: Sentencia 2
.
.
.
CasoN: Sentencia N
Sino
Sentencia X
fin_caso
Donde:
SELECTOR: Es una variable del tipo ordinal, es decir, puede ser:
Variable del tipo caracter (excepto los especiales)
Variable del tipo numrico entero
Variable del tipo lgico
No puede ser numrico real ni cadena de caracteres
CASO: Los casos son constantes del tipo ordinal (no pueden haber expresiones), vendran a
representar las alternativas y podran tener las siguientes formas:
5
5, 6, 7
,
44
1. . 5 (es equivalente a 1, 2 , 3, 4, 5)
..
(es equivalente a B, C, D, E, F)
OBSERVACIONES:
Como se puede apreciar, los casos o alternativas pueden estar conformados por un valor o
por una lista de valores.
Los valores que toman los casos no tienen porqu ser necesariamente consecutivos.
Ejemplo:
1, 3, 7, 12
Adems se puede apreciar que los casos pueden ser rangos de constantes numricas o de
caracteres. En general, para indicar un rango de constantes del tipo ordinal (caracteres,
nmeros enteros,) se tiene el siguiente formato:
Dos puntos
Lm_inf . . Lm_sup
45
Pago x Hora
30.5
27.9
36.5
Solucin:
Pseudocdigo Salario
Var
horas_trab: entero
turno: caracter
salario: real
Inicio
Leer (horas_trab, turno)
En_caso (turno)
M:
T:
N:
fin_caso
Escribir (salario)
Fin
Como se observa, no se utiliz el SINO.
46
Ejemplo 18: Disee un algoritmo que escriba los nombres de los das de la semana en
funcin del valor de una variable da introducida por el teclado. Solucin:
Pseudocdigo Das
Var
da: entero
Inicio
Leer (da)
En_caso (da)
1:
2:
3:
4:
5:
6:
7:
Escribir
Escribir
Escribir
Escribir
Escribir
Escribir
Escribir
Lunes )
Martes )
Mircoles )
Jueves )
Viernes )
Sbado )
Domingo )
fin_caso
Fin
Ejemplo 19: Solo empleando la instruccin selectiva mltiple, halle el mayor de 3 nmeros
reales. Solucin:
Pseudocdigo Mayor
Var
a, b, c, mx: entero
Inicio
Leer (a, b, c)
En_caso (a > b)
V:
F:
mx a
mx b
fin_caso
En_caso (c > mx)
V: mx c
fin_caso
Fin
47
Ejemplo 20: Disear un algoritmo para determinar el costo del servicio de una ca
fumigadora de terrenos hacia un agricultor que tiene una determinada extensin de
terreno. La tarifa depende del tipo de fumigacin:
Tipo
1
S/. 10 Ha
S/ 20 Ha
S/. 30 Ha
S/. 50 Ha
Si el rea a fumigar es mayor a 500 Ha, tiene un descuento del 5%; adems, si el total a
pagar por el servicio es mayor a S/. 1500 , tiene un descuento del 10% sobre el exceso.
Solucin:
Pseudocdigo Fumigacin
Var
Inicio
Leer (tipo, Ha)
En_caso (tipo)
1:
2:
3:
4:
costo
costo
costo
costo
Ha * 10
Ha * 20
Ha * 30
Ha * 50
fin_caso
Si (Ha >500) entonces
costo 0.95 * costo
fin_si
Si (costo >1500) entonces
costo 0.9 * costo
fin_si
Escribir (costo)
Fin
48
Ejemplo 21: En una olimpiada de tiro al blanco se llega a un acuerdo para que el puntaje
final obtenido sea calculado en base al puntaje original alcanzado en el tiro (del 1 al 10)
multiplicado por un factor, segn la siguiente tabla:
Puntaje Original
Factor
1 3
4 6
7 - 10
10
Inicio
Leer (punt)
En_caso (punt)
0:
1 . . 3:
4 . . 6:
7 . . 10:
punt_final
punt_final
punt_final
punt_final
punt * 0
punt * 3
punt * 8
punt * 10
fin_caso
Escribir (punt_final)
Fin
Ejemplo 22: Se desea leer por teclado un nmero comprendido desde 1 al 10 y se desea visualizar
un mensaje en la pantalla indicando su el nmero ingresado es par o impar (Use la instruccin
selectiva mltiple) Solucin:
Pseudocdigo Nmero
Var
num: entero
Inicio
Leer (num)
En_caso (num)
1, 3 , 5, 7, 9: Escribir ( impar )
2, 4, 6, 8, 10: Escribir ( par )
fin_caso
Escribir (punt_final)
Fin
49
Sentencia
fin_desde
Sentencia
cont
Donde:
Vi: Valor inicial (no necesariamente empieza en uno)
Vf: Valor final
Vi, Vf, cont: son del tipo ORDINAL
Funcionamiento: La sentencia se repite desde que cont toma el valor inicial Vi hasta que
alcanza en forma secuencial el valor final Vf.
Por ejemplo:
desde i 1 hasta 4
1
2
3
4
Escribir ( i )
fin_desde
50
X
Y
Z
Pseudocdigo Factorial
Var
Inicio
Leer (num)
fac 1
desde i 1 hasta num
fac fac * i
fin_desde
Escribir (fac)
Fin
Ejemplo 24: Se pide sumar los n primeros nmeros naturales.
Solucin: Vamos a utilizar un acumulador
y un contador
acumulador, en primer lugar hay que inicializarlo, es decir, asignarle un valor inicial.
Generalmente los acumuladores se inicializan en cero.
Pseudocdigo Suma
Var
i, S, n: entero
Inicio
Leer (n)
S 0
desde i 1 hasta n
S S + i
fin_desde
Escribir (S)
Fin
51
, uno
Inicio
Leer (n)
desde i 1 hasta n
Leer (num)
fac 1
desde j 1 hasta num
fac fac * j
fin_desde
Escribir (fac)
fin_desde
Fin
Ejemplo 26: Disee un algoritmo tal que, dado un nmero entero positivo, presente la
cantidad de divisores.
Solucin: Aqu vamos a usar el operador mod, debido a que si un nmero es divisible por otro,
entonces la divisin de ambos debe ser exacto y el residuo debe ser cero. Usaremos una
instruccin repetitiva dentro de la que se encontrar una instruccin selectiva, en donde la
condicin ser: si la divisin de un nmero entre otro arroja como residuo cero, es decir, num1
mod num2 = 0 entonces se contabiliza, lo cual se realiza a partir de un contador que representa
la cantidad de divisores, cont cont+1 (sin olvidar de inicializar el contador con el valor de
cero).
52
Pseudocdigo Cantidad_Divisores
Var
Inicio
cont 0
Leer (num)
desde i 1 hasta num
Si (num mod i = 0) entonces
cont cont +1
fin_si
fin_desde
Escribir (cont)
Fin
Ejemplo 27: Disee un algoritmo tal que, dado un nmero entero positivo, presente todos
sus divisores y la cantidad de estos.
Solucin: Similar al ejercicio anterior.
Pseudocdigo Divisores
Var
Inicio
cont 0
Leer (num)
desde i 1 hasta num
Si (num mod i = 0) entonces
Escribir ( i )
cont cont +1
fin_si
fin_desde
Escribir (cont)
Fin
53
Ejemplo 28: Disee un algoritmo tal que, para un grupo de n nmeros enteros positivos,
presente todos sus divisores y la cantidad de estos.
Solucin: Al ejercicio anterior se le agrega una instruccin repetitiva.
Pseudocdigo Divisores
Var
Inicio
Leer (n)
desde i 1 hasta n
cont 0
Leer (num)
desde j 1 hasta num
Si (num mod j = 0) entonces
Escribir ( j )
cont cont +1
fin_si
fin_desde
Escribir (cont)
fin_desde
Fin
54
Ejemplo 29: Disee un algoritmo tal que dado un nmero entero positivo, identifique si es
primo.
Solucin: Un nmero es primo cuando tiene como divisores nicamente a s mismo y a la
unidad. Para identificar si un nmero es primo, lo que se hace es contar todos sus divisores, y
solo cuando el nmero de divisores es dos, ser primo.
Pseudocdigo Primo
Var
Inicio
cont 0
Leer (num)
desde i 1 hasta num
Si (num mod i = 0) entonces
cont cont +1
fin_si
fin_desde
Si (cont=2) entonces
Escribir ( Es primo )
sino
Escribir No es primo )
fin_si
Fin
Ejemplo 30: Para un conjunto de
55
Pseudocdigo Ejemplo_30
Var
Inicio
cont_p 0
cont_c 0
Leer (n)
desde i 1 hasta n
Leer (num)
Si (num = 1) entonces
Escribir no es primo ni compuesto, es un nmero simple )
sino
cont_d 0
desde j 1 hasta num
Si (num mod j = 0) entonces
Escribir ( j )
cont_d cont_d + 1
fin_si
fin_desde
Si (cont = 2 ) entonces
Escribir es primo )
cont_p cont_p + 1
sino
Escribir Es compuesto )
Escribir Nmero de divisores: , cont_d)
cont_c cont_c + 1
fin_si
fin_si
fin_desde
Escribir Cantidad de nmeros primos: , cont_p)
Escribir Cantidad de nmeros compuestos: , cont_c)
Fin
56
Ejemplo 31: La ASJ est interesada en promover la natacin y para ello desea conocer
jvenes con las siguientes condiciones: edad (menor de 18 aos), estatura (mnimo 1.70
cm.) y peso (mximo 70 Kg.). Disear un algoritmo en el cual se lean la edad, estatura, peso
de un grupo de n deportistas y verifique cuantos de ellos cumplen las condiciones
impuestos. Presentar la edad, peso, estatura el nmero de jvenes que cumplen y el peso
promedio de estos.
Solucin:
Pseudocdigo ASJ
Var
Inicio
cont 0
suma_p 0
Leer (n)
desde i 1 hasta n
Leer (edad, talla, peso)
Si (edad < 18 talla 1.7 peso
70) entonces
cont cont + 1
suma_p suma_p + peso
Escribir (edad, talla, peso)
fin_si
fin_desde
Si (cont 0 ) entonces
peso_prom suma_p / cont
Escribir (peso_prom)
sino
Escribir Ninguno cumple las condiciones )
fin_si
Fin
57
MXIMOS Y MNIMOS
Ejemplo 32: Para n estudiantes se desea leer las notas (desde 0 hasta 20) y se pide
averiguar la mayor nota.
Solucin: Cuando se conoce el rango de valores que puede asumir una variable que represente a
un valor mximo, debemos inicializarlo con el menor de los valores del rango. Por ejemplo,
para este problema se van a leer notas los cuales se encuentran en el rango de 0 a 20, luego
mediante una serie de instrucciones vamos tratar de hallar cual fue la mayor de todas las notas
ingresadas la cual deber ser almacenada en una variable que llamaremos maxnota, pero antes
de todo, debemos inicializar a nuestra variable maxnota con el valor cero (que es el menor del
rango 0 20).
Pseudocdigo Ejemplo30
Var
Inicio
Leer (n)
maxnota 0
desde i 1 hasta n
Leer (nota)
Si (maxnota < nota) entonces
maxnota nota
fin_si
fin_desde
Escribir (maxnota)
Fin
58
Ejemplo 33: Para n estudiantes se desea leer las notas (Desde 0 hasta 20 y se pide
averiguar la menor nota.
Solucin: De forma anloga al ejercicio anterior. Cuando se conoce el rango de valores que
puede asumir una variable que represente a un valor mnimo, debemos inicializarlo con el
mayor de los valores del rango. Por ejemplo, para este problema se van a leer notas los cuales se
encuentran en el rango de 0 a 20, luego mediante una serie de instrucciones vamos tratar de
hallar cual fue la menor de todas las notas ingresadas la cual deber ser almacenada en una
variable que llamaremos minnota, pero antes de todo, debemos inicializar a nuestra variable
minnota con el valor 20 (que es el mayor del rango 0 20).
Pseudocdigo Ejemplo33
Var
Inicio
Leer (n)
minnota 20
desde i 1 hasta n
Leer (nota)
Si (minnota > nota) entonces
minnota nota
fin_si
fin_desde
Escribir (minnota)
Fin
59
Ejemplo 34: Para n estudiantes se desea leer los cdigos y se pide averiguar el mayor
cdigo ingresado.
Solucin: Cuando no se conoce el rango de valores que puede asumir una variable que
represente a un valor mximo, debemos inicializarlo con el primero de los datos ingresados.
Por ejemplo, para este problema se van leer (ingresar) cdigos de los que no sabemos en que
rango se encuentran, y mediante una serie de instrucciones vamos tratar de hallar cual fue el
mayor de todos los cdigos ingresados el cual deber ser almacenado en una variable que
llamaremos maxcod, pero antes de todo, debemos inicializar a nuestra variable maxcod con el
primero de los datos ingresados. (En el supuesto caso en el que nos hubieran dicho que los
cdigos se encuentran en el rango 100
Inicio
Leer (n)
desde i 1 hasta n
Leer (cod)
Si (i = 1) entonces
maxcod cod
sino
Si (maxcod < cod) entonces
maxcod cod
fin_si
fin_si
fin_desde
Escribir (maxcod)
Fin
60
Pseudocdigo Ejemplo34
Var
Inicio
Leer (n)
Leer (cod)
maxcod cod
desde i 2 hasta n
Leer (cod)
Si (maxcod < cod) entonces
maxcod cod
fin_si
fin_desde
Escribir (maxcod)
Fin
61
Ejemplo 35: Para n estudiantes se desea leer las notas (desde 0 hasta 20) y se pide
averiguar la mayor nota y cuntos lo obtuvieron. Solucin:
Pseudocdigo Ejemplo35
Var
Inicio
Leer (n)
cont 0
maxnota 0
desde i 1 hasta n
Leer (nota)
Si (maxnota < nota) entonces
maxnota nota
cont 1
Sino
Si (maxnota = nota) entonces
cont cont + 1
fin_si
fin_si
fin_desde
Escribir (maxnota, cont)
Fin
Para probar si funciona este algoritmo, supongamos que las notas que se debieron ingresar fueron:
05, 10, 15, 15, 12, 17, 17, 05. El proceso sera el siguiente:
Debemos ingresar la cantidad de notas que vamos a almacenar, en este caso n debe ser 8.
Leer (n)
n=8
Inicializamos el contador con el valor de cero y a la variable maxnota tambin con cero.
cont 0
maxnota 0
Comenzamos con la instruccin repetitiva DESDE
desde i 1 hasta n
62
* CUANDO i = 1 :
Ingresamos la primera nota (la cual ser leda por la computadora)
Leer (nota)
nota = 05
Comparamos la variable maxnota que almacena el valor de 0 con la nota ahora ingresada que
almacena el valor de 05
Si (maxnota < nota) entonces
Debido a que s se cumple la condicin (00 < 05) almacenamos en la variable maxnota, el valor
de nota (05)
maxnota nota
maxnota = 05
Y el contador lo inicializamos en 1 para indicar que encontramos una mayor nota.
cont 1
* CUANDO i = 2 :
Ingresamos la segunda nota
Leer (nota)
nota = 10
Comparamos la variable maxnota que almacena el valor de 05 con la nota ahora ingresada que
almacena el valor de 10
Si (maxnota < nota) entonces
Debido a que s se cumple la condicin (05 < 10) almacenamos en la variable maxnota, el valor
de nota (10)
maxnota nota
maxnota = 10
Y el contador lo inicializamos en 1 (lo actualizamos a 1) para indicar que encontramos una
mayor nota (mayor que la anterior)
cont 1
* CUANDO i = 3:
Ingresamos la tercera nota
Leer (nota)
nota = 15
Comparamos la variable maxnota que almacena el valor de 10 con la nota ahora ingresada que
almacena el valor de 15
Si (maxnota < nota) entonces
63
Debido a que s se cumple la condicin (10 < 15) almacenamos en la variable maxnota, el valor
de nota (15)
maxnota nota
maxnota = 15
Y el contador lo inicializamos en 1 (lo actualizamos a 1) para indicar que encontramos una
mayor nota (mayor que la anterior)
cont 1
* CUANDO i = 4:
Ingresamos la cuarta nota
Leer (nota)
nota = 15
Comparamos la variable maxnota que almacena el valor de 10 con la nota ahora ingresada que
almacena el valor de 15
Si (maxnota < nota) entonces
Debido a que no se cumple la condicin (15 < 15), nos vamos hacia el Sino
Sino
Evaluamos la condicin que se encuentra dentro del Sino
Si (maxnota = nota) entonces
Debido a que s se cumple esta condicin (15 = 15), ejecutamos lo que sigue a continuacin
cont cont + 1
Contabilizamos las coincidencias con esta supuesta mayor nota (por lo menos hasta ahora)
cont = 1 + 1 = 2
* CUANDO i = 5:
Ingresamos la quinta nota
Leer (nota)
nota = 12
Comparamos la variable maxnota que almacena el valor de 15 con la nota ahora ingresada que
almacena el valor de 12
Si (maxnota < nota) entonces
Debido a que no se cumple la condicin (15< 12), nos vamos hacia el Sino
Sino
Evaluamos la condicin que se encuentra dentro del Sino
Si (maxnota = nota) entonces
64
Debido a que tampoco se cumple esta condicin (15 = 12), nos salimos de la instruccin
condicional y pasamos a la siguiente repeticin.
* CUANDO i = 6:
Ingresamos la sexta nota
Leer (nota)
nota = 17
Comparamos la variable maxnota que almacena el valor de 15 con la nota ahora ingresada que
almacena el valor de 17
Si (maxnota < nota) entonces
Debido a que s se cumple la condicin (15 < 17) almacenamos en la variable maxnota, el valor
de nota (17)
maxnota nota
maxnota = 17
Y el contador lo inicializamos en 1 (lo actualizamos a 1) para indicar que encontramos una
mayor nota (mayor que la anterior)
cont 1
cont = 1
* CUANDO i = 7:
Ingresamos la sptima nota
Leer (nota)
nota = 17
Comparamos la variable maxnota que almacena el valor de 17 con la nota ahora ingresada que
almacena el valor de 17
Si (maxnota < nota) entonces
Debido a que no se cumple la condicin (17 < 15), nos vamos hacia el Sino
Sino
Evaluamos la condicin que se encuentra dentro del Sino
Si (maxnota = nota) entonces
Debido a que s se cumple esta condicin (17 = 17), ejecutamos lo que sigue a continuacin
cont cont + 1
Contabilizamos las coincidencias con esta supuesta mayor nota (por lo menos hasta ahora)
cont = 1 + 1 = 2
65
* CUANDO i = 8:
Ingresamos la octava nota
Leer (nota)
nota = 05
Comparamos la variable maxnota que almacena el valor de 17 con la nota ahora ingresada que
almacena el valor de 05
Si (maxnota < nota) entonces
Debido a que no se cumple la condicin (17< 05), nos vamos hacia el Sino
Sino
Evaluamos la condicin que se encuentra dentro del Sino
Si (maxnota = nota) entonces
Debido a que tampoco se cumple esta condicin (17 = 05), nos salimos de la instruccin
condicional.
Ahora que ya se termin nmero de notas a ingresar, maxnota almacena la mayor de todas las
notas ingresadas que fue 17. Solo nos queda mostrarlo por la pantalla y la cantidad de veces que
se ingres
Escribir (maxnota, cont)
En la pantalla deber mostrarse 17 y
66
Ejemplo 36: Para n estudiantes se desea leer las notas (desde 0 hasta 20) y se pide
averiguar la menor nota y cuntos lo obtuvieron. Solucin:
Pseudocdigo Ejemplo36
Var
Inicio
Leer (n)
cont 0
minnota 20
desde i 1 hasta n
Leer (nota)
Si (minnota > nota) entonces
minnota nota
cont 1
Sino
Si (minnota = nota) entonces
cont cont + 1
fin_si
fin_si
fin_desde
Escribir (minnota, cont)
Fin
Este algoritmo se puede comprobar de la misma forma que en el ejercicio anterior.
67
Ejemplo 37: Para un grupo de n alumnos se desea leer el cdigo (entero de 3 dgitos), nota
(de 0 a 20) y sexo (M o F), luego se pide lo siguiente:
a) Presentar la menor nota en los hombres y el mayor de los cdigos que la tiene.
b) Presentar el nmero de alumnos hombres que tiene la menor nota.
Solucin:
Pseudocdigo Ejemplo37
Var
Inicio
Leer (n)
maxcod 100
minnota 20
cont 0
desde i 1 hasta n
Leer (cod, nota, sexo)
Si (sexo =
) entonces
68
Ejemplo 38: Para un conjunto de n personas se desea averiguar la edad promedio por sexo
y cul es la edad mayor en cada caso (la mxima edad en cada sexo). Desarrolla un
algoritmos que reciba las edades de las n personas y entregue la informacin pedida.
Pseudocdigo Ejemplo_38
Var
Inicio
Leer (n)
contM 0
contF 0
sumaM 0
sumaF 0
maxM 0
maxF 0
desde i 1 hasta n
Leer (edad, sexo)
En_caso (sexo)
M, m:
F, f:
fin_caso
fin_desde
Escribir (maxM, maxF)
Si (contM = 0) entonces
Escribir no hay promedio )
Sino
Escribir (sumaM div contM)
fin_si
69
Si (contF = 0) entonces
Escribir no hay promedio )
sino
Escribir (sumaM div contF)
fin_si
Fin
70
Ejemplo 39: SEGUNDA MAYOR EDAD. Para un conjunto de n personas, se desea leer sus
edades y luego se desea presentar la segunda mayor edad. Solucin;
Pseudocdigo Segunda_mayor_edad
Var
Inicio
Leer (n)
max1 0
max2 0
desde i 1 hasta n
Leer (edad)
Si (i = 1) entonces
Si (max1 < edad) entonces
max1 edad
fin_si
Sino
( * cuando i = 2, 3, 4, , n * )
71
Ejemplo 40: SEGUNDA MENOR EDAD. Para un conjunto de n personas, se desea leer sus
edades y luego se desea presentar la segunda menor edad.
Solucin: A diferencia del ejercicio anterior, no vamos a inicializar las variables min1 y min2 en
cero, sino con la primera edad leda.
Pseudocdigo Segunda_menor_edad
Var
Inicio
Leer (n)
desde i 1 hasta n
Leer (edad)
Si (i = 1) entonces
min1 edad
min2 edad
Sino
( * i = 2, 3, 4, , n * )
72
Ejemplo 41: Para un conjunto de n datos reales se desea determinar el mayor de los datos
negativos y cuntas veces aparece. Por ejemplo: para n=7, datos: 4, -7, 6, -3, 5, -3, 1
Solucin
Pseudocdigo Mayor_negativo
Var
n, i, cont: entero
num: real
encont: lgico
Inicio
encont F
Leer (n)
desde i 1 hasta n
Leer (num)
Si (num < 0) entonces
Si ( encont) entonces
maxneg num
cont 1
encont V
sino
Si (maxneg < num) entonces
maxneg num
cont 1
sino
Si (maxneg = num) entonces
cont cont + 1
fin_si
fin_si
fin_si
fin_si
fin_desde
Escribir (maxneg, cont)
Fin
73
Explicacin del ejemplo 41: Vamos a crear una variable llamada maxneg y esta la tenemos que
inicializar con el primer dato negativo ingresado. Pero puede darse el caso que el primer dato
ingresado no sea negativo, sino cero o positivo, cmo sabremos en qu momento vamos a tener
un dato negativo con el cual debemos inicializar nuestra variable maxneg? Para esto, vamos a
utilizar una variable adicional, algunos lo conocen como switch, el identificador para este switch
ser encont, ser de tipo lgico y servir para poder saber en qu momento se ingresar un dato
negativo, de esta forma podremos inicializar la variable maxneg y podremos compararlo con los
datos negativos siguientes (Si es que se ingresa algn dato no negativo, no se les tomar en
cuenta)
74
condicin
Sentencia
fin_mientras
Sentencia
Cuerpo del bucle
Cuerpo del bucle
OBS:
Esta instruccin tiene desde cero hasta ms repeticiones
La condicin debe modificarse dentro del bucle para evitar que se genere un bucle infinito.
Ejemplo: Un bucle finito.
x2
Mientras (x > 0) hacer
Escribir (x)
x x-1
fin_mientras
En la pantalla se ver
nicamente los valores
positivos de x: 2 y 1(segn
la condicin), pues cuando
x a toma un valor no
positivo, la instruccin
repetitiva Mientras
termina
2
1
75
En la pantalla se vern
los valores de x: 2, 3, 4,
., etc. Y esto
continuar hasta que la
computadora se
cuelgue , ya que la
instruccin Mientras
no terminar mientras
x no tome un valor
negativo lo cual nunca
pasar pues x va en
aumento
x2
Mientras (x > 0) hacer
Escribir (x)
x x+1
fin_mientras
2,3,4,5,6,7,8,9
10,11,12,13,14,1
5,16,17,18
Ejemplo 42: Imprimir todos los nmeros primos entre 2 y 100 (incluye a 2 y a 100), usando
la instruccin mientras.
Solucin. Ya sabemos el algoritmo para identificar a un nmero primo. Ahora le agregaremos
algo ms.
Pseudocdigo Primos
Var
Inicio
num 2
Mientras (num
100) hacer
Fin
76
El ejemplo tambin pudo haberse resuelto con el uso de dos estructuras repetitivas desde de la
siguiente forma:
Pseudocdigo Primos
Var
Inicio
desde num 2 hasta 100
desde i 1 hasta num
Si (num mod i = 0) entonces
cont_div cont_div+1
fin_si
fin_desde
Si (cont_div = 2) entonces
Escribir (num)
fin_si
fin_desde
Fin
77
Ejemplo 43: Dado un nmero entero positivo, indicar cuantos dgitos tiene.
Solucin: Vamos a realizar divisiones sucesivas entre 10 y al nmero se le va ir asignando su
cociente. Ejemplo: Si tuviramos el nmero num = 4512 hacemos:
cont 0
num num div 10 , es decir
num 4512 div 10 lo cual quedara
num 451 ; num = 451 y seguidamente contabilizamos cont cont+1; cont = 1
num num div 10 , es decir
num 451 div 10 lo cual quedara
num 45 ; num = 45 y seguidamente contabilizamos cont cont+1; cont = 1+1=2
num num div 10 , es decir
num 45 div 10 lo cual quedara
num 4 ; num = 4 y seguidamente contabilizamos cont cont+1; cont = 2+1=3
num num div 10 , es decir
num 4 div 10 lo cual quedara
num 0 ; num = 0 y seguidamente contabilizamos cont cont+1; cont = 3+1=4
Aqu debemos parar, pues el contador ya contabiliz la cantidad de cifras que tena el nmero
inicial, por tanto, la condicin debera ser: Mientras (num 0) hacer
Pseudocdigo Ejemplo_43
Var
Inicio
Leer (num)
cont 0
Mientras (num
0) hacer
fin_mientras
Escribir (cont)
Fin
78
Ejemplo 44: Disee un algoritmo para invertir un nmero entero (de cualquier cantidad de
cifras). Una vez invertido, presentarlo.
Solucin: Ya se hizo el algoritmo para invertir un nmero, pero se deba conocer la cantidad de
cifras que tena el nmero. Ahora nos piden invertir un nmero, no importando la cantidad de
cifras que tenga. Este ejercicio se resuelve con el uso de una estructura mientras.
Pseudocdigo Invertir
Var
Inicio
Leer (num)
inv 0
79
Ejemplo 45: Disee un algoritmo para invertir un conjunto de nmeros enteros. (de
cualquier cantidad de cifras). Una vez invertidos, presentarlos. Solucin:
Pseudocdigo Invertir_varios_nmeros
Var
Inicio
Leer (n)
desde i 1 hasta n
Leer (num)
inv 0
Mientras (num 0) hacer
r num mod 10
num num div 10
inv inv *10 + r
fin_mientras
Escribir (num, inv)
fin_desde
Fin
80
Ejemplo 46: Disear un algoritmo para identificar si un nmero entero positivo es capica.
Solucin: Un numeral es capica si es igual a su forma invertida. Lo que haremos ser invertir al
nmero y compararlo con su forma inicial. Pero, recuerde que el valor de num se pierde y llega
ser igual a cero. Debido a que necesitamos el valor de num intacto, utilizaremos una variable
auxiliar, y va a ser a esta variable a la cual la vamos a invertir.
Pseudocdigo Capica
Var
Inicio
Leer (num)
aux num
inv 0
sino
Escribir No es capica )
fin_si
Fin
81
Inicio
Leer (n)
desde i 1 hasta n
Leer (num)
aux num
inv 0
sino
Escribir No es capica )
fin_si
fin_desde
Fin
82
que
identifique a aquellos que son capicas, mostrando un mensaje: s es capica . Al final, que
muestre cuntos de los nmeros ingresados fueron capicas.
Solucin:
Pseudocdigo Capicas
Var
Inicio
Leer (n)
cont 0
desde i 1 hasta n
Leer (num)
aux num
inv 0
cont cont +1
sino
Escribir No es capica )
fin_si
fin_desde
Escribir cantidad total de capicas: , cont)
Fin
83
Ejemplo 49: Para un conjunto de n nmeros enteros positivos, se desea saber Cuntos de
ellos son capicas con el nmero de cifras impares?
Solucin:
Pseudocdigo Ejemplo49
Var
Inicio
Leer (n)
cont 0
desde i 1 hasta n
cf 0
Leer (num)
inv 0
aux num
Mientras (aux 0) hacer
r aux mod 10
aux aux div 10
inv inv *10 + r
cf cf + 1
fin_mientras
Si (inv = num cf mod 2 0) entonces
cont cont + 1
fin_si
fin_desde
Escribir (cont)
Fin
84
32 ,
, N.
N , para obtener 2 2 ,
Pseudocdigo Ejemplo_50
Var
num, d: entero
primo: lgico
Inicio
Leer (num)
d2
primo V
Mientras (d*d < num primo) hacer
Si(num mod d = 0) entonces
primo F
sino
dd + 1
fin_si
fin_mientras
Si (primo) entonces
Escribir ( El nmero es primo )
sino
Escribir El nmero no es primo )
fin_si
Fin
85
Ejemplo 51: A un conjunto de 100 alumnos se le asigna un cdigo que oscila entre 500 y
600, luego de rendir un examen se obtiene la nota (0 a 20). Se desea averiguar la mayor
nota, cuantas veces aparece y los cdigos de los alumnos que lo obtuvieron.
Solucin:
Pseudocdigo Ejemplo51
Var cod, nota, max, i, cont, lista: entero
Inicio
desde i 1 hasta n
Leer (cod, nota)
Si (i = 1) entonces
cont 1
max nota
lista cod
sino
Si (max < nota ) entonces
max nota
cont 1
lista cod
sino
Si (nota = max) entonces
cont cont + 1
lista lista*1000 + cod
fin_si
fin_si
fin_si
fin_desde
Escribir (max, cont)
Mientras (lista 0) hacer
cod lista mod 1000
Escribir (cod)
lista lista div 1000
fin_mientras
Fin
86
que
Inicio
Repetir
Leer (n)
Hasta_que (n > 0)
cont_prim 0
cont_cap 0
desde i 1 hasta n
Repetir
Leer (num)
Hasta_que (num > 0)
cont_cif 0
inv 0
aux num
Repetir
r aux mod 10
aux aux div 10
cont_cif cont_cif + 1
inv inv * 10 + r
Hasta_que (aux = 0)
Si (num = inv) entonces
Escribir ( Es capica )
cont_cap cont_cap+1
87
sino
Escribir ( No es capica )
fin_si
Escribir ( Cantidad de cifras: , cont_cif)
cont_div 0
desde i 1 hasta num
Si (num mod i = 0) entonces
Escribir (i, es divisor de , num)
cont_div cont_div + 1
fin_si
fin_desde
Escribir ( Cantidad de divisores , cont_div)
Si (cont = 2) entonces
Escribir (num, es primo )
cont_prim cont_prim + 1
Sino
Escribir (num, no es primo )
fin_si
fin_desde
Escribir ( Cantidad de capicas: , cont_cap)
Escribir ( Cantidad de no capicas , n cont_cap)
Escribir ( Cantidad de primos , cant_prim)
Fin
88
Repetir
Sentencia
Sentencia
Hasta_que (condicin)
condicin
OBS:
Debemos modificar la condicin en el cuerpo del bucle para evitar que sea infinito.
USOS DE LA ESTRUCTURA REPETIR
a) Validacin de la entrada de datos:
Ejemplos:
Validar que un dato sea positivo:
Repetir
Leer (dato)
Hasta_que (dato > 0)
89
Sea: n1 = 3 y n2 = 5
1. Sumar )
Escribir
2. Multiplicar )
Escribir
3. Salir )
Men de opciones
1. Sumar
2. Multiplicar
3. Salir
Opcin:
Repetir
Escribir opcin: )
Leer (opc)
Hasta_que (opc = 1 opc = 2 opc = 3)
En_caso (opc)
1: Escribir (n1+n2)
2: Escribir (n1 * n2)
opcin 1:
opcin 2:
15
fin_caso
Hasta_que (opc = 3)
90
Este proceso se repite hasta que se obtiene resto = 0. Luego el MCD ser el ltimo divisor.
OBS: El algoritmo de euclides permite calcular el MCD de dos nmeros sin importar quin es
mayor o quin es menor. Funciona en cualquier orden.
Pseudocdigo MCD
Var
a, b, r: entero
Inicio
Leer (a, b)
Repetir
r a mod b
a b
b r
Hasta_que (r = 0)
Escribir (a)
La variable
nmeros
Fin
91
Ejemplo 54: Dados nos nmeros enteros positivos, determine el mnimo comn mltiplo de
dichos nmeros.
Solucin: No vamos a calcular directamente el mnimo comn mltiplo (MCM) de los nmeros,
sino que usaremos la siguiente propiedad. A partir del clculo del MCD se podr calcular el MCM.
MCD (a, b) x MCM (a, b) = a x b
Pseudocdigo MCM
Var
Inicio
Leer (a, b)
prod a * b
Repetir
r a mod b
a b
b r
Hasta_que (r = 0)
mcm prod div a
Escribir (mcm)
Fin
92
10
mcd = 4
mcd = 2
mcd = 2
El procedimiento general ser:
n1
n2
n3
..
mcd1
Pseudocdigo MCD
Var
Inicio
mcd2
mcd3
Repetir
Leer (n)
Hasta_que (n 2)
desde i 1 hasta n
Repetir
Leer (num)
Hasta_que (num > 0)
Si (i = 1) entonces
mcd num
sino
Repetir
r mcd mod num
mcd num
num r
Hasta_que (r = 0)
fin_si
fin_desde
Escribir (mcd)
Fin
93
mcd = 6
mcm = 360
n1
n2
n3
..
mcm1
Inicio
mcm2
Repetir
Leer (n)
Hasta_que (n 2)
mcm3
desde i 1 hasta n
Repetir
Leer (num)
Hasta_que (num > 0)
Si (i = 1) entonces
mcd num
mcm num
sino
mcm mcm * num
Repetir
r mcd mod num
mcd num
num r
Hasta_que (r = 0)
mcm mcm div mcd
fin_si
fin_desde
Escribir (mcm)
Fin
94
S=
x2 x4 x6
x 2n
+
+
+ ... + (1) n+1
2! 4! 6!
(2n)!
Pseudocdigo Suma
Var
x, S, term: real
n, i: entero
Inicio
Leer ( x )
Repetir
Leer (n)
Hasta_que (n>0)
S0
term -1
desde i 1 hasta n
term -1 * term * x * x / ((2 * i 1) * (2 * i))
S S + term
fin_desde
Escribir (S)
Fin
95
Ejemplo 58: (Primera prctica califica, ciclo 97-I, 26-04-97) Dado las ubicaciones (puntos
no colineales en el plano) de tres clientes A, B, y C; se requiere determinar la ubicacin de un
centro comercial que equidiste de estas tres ciudades.
Solucin: Solo vamos a dejar planteado la solucin. La ubicacin del centro comercial viene a ser
el circuncentro del tringulo de vrtices A, B, y C. Para determinar las coordenadas del
circuncentro vamos a recurrir a la geometra analtica. Unimos mediante 3 segmentos a los 3
puntos no colineales (A, B y C) formando de esta manera un tringulo. (de cualquier tipo:
rectngulo u oblicungulo.
El punto de interseccin de estas dos rectas mediatrices vendra a ser el Circuncentro del
tringulo, y es adems el punto que equidita de los tres vrtices.
Sean las coordenadas de los vrtices:
A = (Xa, Ya)
B = (Xb, Yc)
C = (Xc, Yc)
96
(Xb, Yb)
C (Xc, Yc)
(Xa, Ya)
M=
A+C
Xa + Xc Ya + Yc
=(
;
)
2
2
2
N=
B+C
Xb + Xc Yb + Yc
=(
;
)
2
2
2
y sus ortogonales
P=N + t
LM:
P=M + r
)
)
LN
(Xb, Yb)
B
N
P
A
(Xa, Ya)
C (Xc, Yc)
LM
97
98
10000).
Inicio
Repetir
Leer (n)
Hasta_que (n 30)
cont 0
desde i 1 hasta n
Repetir
Leer (cod)
Hasta_que (cod 10000)
j1
sec V
Mientras (j 3 sec) hacer
En_caso (j)
1: d 7
2: d 3
3: d 2
fin_caso
Repetir
r cod mod 10
cod cod div 10
Hasta_que (cod = 0 r = d)
Si (cod = 0) entonces
sec F
fin_si
jj + 1
fin_mientras
99
Si (sec) entonces
cont cont + 1
fin_si
fin_desde
Escribir (cont)
Fin
Ejemplo 60: Algoritmo para pasar un numeral de una base 2 a base 10. Solucin:
Pseudocdigo Binario_Decimal
Var
C, d, S, num: entero
Inicio
Repetir
Leer (num )
Hasta_que (num > 0)
S 0
C 1
Repetir
d num mod 10
num num div 10
S d *C + S
C C * 2
Hasta_que (num = 0)
Escribir (num, S)
Fin
100
Ejemplo 61: Algoritmo para transformar un numeral de una base n menor que 10 a la base
10.
Solucin:
Pseudocdigo Numeracin
Var
C, d, S, num, n: entero
Inicio
Repetir
Leer (n, num)
Hasta_que (2
S 0
C 1
Repetir
d num mod 10
num num div 10
S d * C + S
C C * n
Hasta_que (num = 0)
Escribir (num, S)
Fin
101
Solucin:
Pseudocdigo Tercero_Mayor
Var
a, b, c, d, e, aux: entero
Inicio
Leer (a, b, c, d, e)
Si (a < e) entonces
aux a
ae
e aux
fin_si
Si (b < d) entonces
aux b
bd
d aux
fin_si
Si (a < b) entonces
aux a
ab
b aux
fin_si
Si (d < e) entonces
aux d
de
e aux
fin_si
Si (b < d) entonces
aux b
bd
d aux
fin_si
102
Si ( c > a) entonces
Escribir (b, es el tercero mayor )
sino
(*c
a *)
Si ( c > b) entonces
Escribir ( b, es el tercero mayor )
sino
(*c b *)
Si (c > d) entonces
Escribir (c, es el tercero mayor )
sino
(*c
d *)
103
PROBLEMA 2
Disee un algoritmo que reciba una cantidad no determinada de nmeros enteros positivos
de 4 a ms cifras (el ingreso de datos termina cuando se ingresa el nmero -1), luego
muestre:
a) La cantidad de nmeros capicas ingresados (NOTA: un nmero es capica si se lee igual
de izquierda a derecha como de derecha a izquierda. Ejemplo: 131 es capica)
b) Los nmeros primos ingresados y el promedio de los mismos.
Pseudocdigo Problema_2
Var
Inicio
cont_cap 0
cont_p 0
suma_p 0
Repetir
Repetir
Leer (num)
Hasta_que (num
Si (num
-1) entonces
aux num
NI 0
Mientras (aux 0) hacer
r aux mod 10
aux aux div 10
NI NI * 10 + r
fin_mientras
Si (NI = num) entonces
cont_cap cont_cap + 1
fin_si
d 0
r1 0
104
105
PROBLEMA 3
En el mundial Sudfrica 2010 participaron 32 equipos por diferentes pases. Cada equipo
tiene un cuadro de 40 jugadores. Por cada jugador se tienen los siguientes datos: cdigo
(entero de 4 cifras), edad y el nmero de goles anotados en este mundial.
Se pide disear un algoritmo que lea los datos de los jugadores y muestre:
a) Edad promedio de los jugadores por cada equipo y la edad promedio de todos los
jugadores.
b) El nmero de jugadores con la mayor cantidad de goles anotados en el mundial.
Solucin:
Datos de entrada: Nmero de equipos (32). Nmero de jugadores (40). Por cada jugador: cdigo
(de 4 cifras), edad, nmero de goles anotados.
Datos de salida: Edad promedio por equipo, edad promedio de todos los jugadores; nmero de
jugadores con la mayor cantidad de goles anotados en el mundial.
Proceso:
- Leer el cdigo, edad, nmero de goles
- Sumar las edades de los jugadores en un equipo y dividir el resultado entre 40, luego mostrar
dicho resultado que sera el promedio.
- Sumar las sumas de edades de los jugadores de cada equipo, as tendra la suma de todos, luego
muestro el resultado de haberlo dividido entre 32x40
- Contabilizar la cantidad de jugadores con el mayor nmero de goles en el mundial, primero en
cada equipo y luego entre todos los equipos.
106
Pseudocdigo Mundial
Var
Inicio
suma_edad_total 0
cont2 0
desde i 1 hasta 32
cont1 0
suma_edad 0
desde i 1 hasta 40
Repetir
Leer (edad, cdigo, num_gol)
Hasta_que (edad > 0 edad < 100 num_gol 0 cdigo 1000 cdigo 9999)
sumad_edad suma_edad + edad
Si (j = 1) entonces
max_num_gol num_gol
cont1 1
sino
Si (max_num_gol < num_gol) entonces
max_num_gol num_gol
cont1 1
sino
Si (max_num_gol = num_gol) entonces
cont1 cont1 + 1
fin_si
fin_si
fin_si
fin_desde
edad_pe suma_edad mod 40
Escribir ( la edad promedio del equipo nmero , i, es , edad_pe)
suma_edad_total suma_edad_total + suma_edad
Si (i = 1) entonces
max_num_gol_mund max_num_gol
cont2 cont1
sino
Si (max_num_gol_mund < max_num_gol) entonces
max_num_gol_mund max_num_gol
cont2 cont1
107
sino
si (max_num_gol_mund = max_num_gol) entonces
max_num_gol_mund max_num_gol
cont2 cont2 + 1
fin_si
fin_si
fin_si
fin_desde
edad_pt suma_edad_total div 1280
Escribir ( el promedio de las edades de los 1280 jugadores es: , edad_pt)
Escribir ( el nmero de jugadores con la mayor cantidad de goles anotados en el mundial es: ,
cont2, y el nmero mximo de goles fue , max_num_gol_mund)
Fin
108
PROBLEMAS ADICIONALES
Ejercicio1: Dado un nmero natural positivo, indique si es un nmero perfecto. (NOTA: un
nmero es perfecto si la suma de sus divisores (sin incluir al mismo nmero) resulta igual a
s mismo. Ejemplo: 6 es perfecto pues 6 = 1+2+3. Solucin:
Pseudocdigo Perfecto
Var
n, S, i: entero
Inicio
Repetir
Leer (n)
Hasta_que (n > 0)
S 0
desde i 1 hasta n-1
Si (n mod i = 0) entonces
S S+ i
fin_si
fin_desde
Si (S = n) entonces
Escribir ( S es perfecto )
sino
Escribir ( No es perfecto )
fin_si
Fin
109
Inicio
F0 1
F1 1
Repetir
Leer (n)
Hasta_que (n
0)
Si (n = 0 n = 1) entonces
F 1
sino
desde i 2 hasta n
F F1+F0
F0 F1
F1 F
fin_desde
fin_si
Escribir (F)
Fin
110
Inicio
Repetir
Leer (n)
Hasta_que (n > 0)
maxnotH 0
minnotaM 20
mincodH 999
maxcodM 100
contH 0
contM 0
desde i 1 hasta n
Repetir
Leer (cod)
Hasta_que (100 cod cod 999)
Repetir
Leer (nota)
Hasta_que (0 nota nota 20)
Leer (sexo)
Si (sexo =
) entonces
fin_si
fin_si
fin_si
sino
Si (sexo =
) entonces
112
113