Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1997 Rpa
1997 Rpa
Prohibida su reproducci¶on sin autorizaci¶on del autor (Ley 11.723 de Propiedad Intelectual)
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
{iii{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
¶Indice General
1 A modo de introducci¶
on 1
2 Resoluci¶
on de problemas: ejercitaci¶
on 7
2.1 Motivaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Problemas varios (enunciados) . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Respuesta a los problemas planteados . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Problemas adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
no a programas en Pascal
5 De algoritmos en lenguaje de dise~ 67
5.1 Introducci¶on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.2 >Qu¶e es la sintaxis? La notaci¶on bnf . . . . . . . . . . . . . . . . . . . . . . 67
5.3 La sintaxis de Pascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.3.1 Declaraci¶on de constantes . . . . . . . . . . . . . . . . . . . . . . . . 69
5.3.2 Declaraci¶on de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.3.3 Declaraci¶on de variables . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.3.4 De¯nici¶on de procedimientos y funciones . . . . . . . . . . . . . . . . 70
{v{
¶INDICE GENERAL
on de dibujos en Pascal
6 Sugerencias para la impresi¶ 83
8 Ap¶
endice: el ingl¶
es en computaci¶
on y su incidencia en nuestro idioma 109
8.1 Palabras cuestionables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
8.2 Otros problemas comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
{vi{
Hombre que sangra
1 A modo de introducci¶
on Ä
Ubung macht den Meister
(\La pr¶a ctica hace al maestro"; refr¶an alem¶an)
Estructuraci¶
on
El texto est¶a estructurado en distintas secciones, independientes entre s¶³. Cada una de las
secciones involucra un tema espec¶³¯co, vinculado con ejercitaci¶on o bien con consideraciones
te¶oricas adicionales referidas a la resoluci¶on de ejercicios. La n¶omina de los temas tratados,
junto con una sucinta descripci¶on de ellas, es la siguiente:
{1{
¶
1 A MODO DE INTRODUCCION
2. Uso de condicionales
Aqu¶³ se hace un an¶alisis descriptivo del uso de las condiciones en el lenguaje de di-
se~
no presentado a nivel te¶orico. Se comentan, entre otros temas, el signi¯cado de las
condiciones compuestas, el uso de variables booleanas y las leyes de De Morgan.
4. De Algoritmos a Pascal
En esta secci¶on se hace una breve descripci¶on de la equivalencia entre distintos con-
ceptos presentados en lenguaje de dise~ no y su adecuaci¶on a la sintaxis del lenguaje
Pascal. Se mencionan entre otras cosas el uso de la notaci¶on bnf y las diferencias
esenciales entre procedimientos y funciones.
{2{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
{3{
¶
1 A MODO DE INTRODUCCION
Si el alumno se limita a leer pasivamente las respuestas dadas, sin encarar por s¶³ mis-
mo primero los ejercicios propuestos, las consecuencias de tal actitud son profundamente
negativas.
En primer lugar, estar¶a perdiendo la oportunidad de aprender de la manera m¶as efectiva:
haciendo. La programaci¶on, por ejemplo, es algo que se aprende esencialmente a trav¶es de
la pr¶actica; no es posible memorizar algoritmos hechos por otras personas, pues las variantes
son in¯nitas. La capacidad de programar bien es algo que se incorpora gradualmente; no es
algo mec¶anico, pues cada ejercicio demanda un enfoque diferente. La mera lectura o copia
de algoritmos ajenos no ense~na a programar. Es fundamental ser consciente que \entender"
un algoritmo no es lo mismo que saber hacerlo.
{4{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Es conveniente que se intente resolver cada uno de los ejercicios propuestos. Si no se llega
a una soluci¶on satisfactoria, pueden utilizarse las resoluciones dadas como un elemento de
ayuda. Debe tenerse presente que la resoluci¶on que se adjunta al enunciado del ejercicio es
una soluci¶on posible. Siempre es recomendable intentar ensayar soluciones alternativas a la
dada, si ¶estas existen.
Si se llega a una soluci¶on que se considera correcta, y la resoluci¶on que se adjunta no
resulta ¶util para confrontarla con ¶esta, se sugiere recurrir a los docentes de la C¶atedra y
consultarlos acerca del enfoque utilizado para resolver el problema. Debe tenerse presente
que un elemento fundamental en computaci¶on es la creatividad; si la soluci¶on a la que
se arrib¶o di¯ere de la resoluci¶on dada, esto no implica que dicha soluci¶on no es correcta; la
soluci¶on que se encuentre puede que sea correcta, pero quiz¶as sea m¶as larga, m¶as complicada,
basada en otras estrategias, o simplemente m¶as ingeniosa.
Agradecimientos
Cabe agradecer a los profesores Marcelo Zanconi y Silvia Castro la correcci¶on y revisi¶on de
distintos aspectos en la redacci¶on y estructuraci¶on del material presentado. Asimismo, mi
agradecimiento a la Prof. Sonia Rueda por varios comentarios, recomendaciones y sugeren-
cias aportados durante el tiempo en que me desempe~nara como ayudante en la asignatura
\Inform¶atica A".
Nota: este texto no constituye una publicaci¶o n o¯cial del Departamento de Ciencias de la Computaci¶o n de
la Universidad Nacional del Sur. Cualquier equ¶³voco u omisi¶on involuntaria es exclusiva responsabilidad del
autor.
{5{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
2 Resoluci¶
on de problemas: ejercitaci¶
on
2.1 Motivaciones
En esta secci¶on se presentan diferentes tipos de problemas, para cuya resoluci¶on deben
emplearse diferentes estrategias y metodolog¶³as.
Varios de los enunciados presentados (antecedidos con un asterisco) han sido reprodu-
cidos del Trabajo Pr¶actico N± 1 utilizado en la materia \Introducci¶on a la Inform¶atica"
durante los a~nos 1992, 1993 y 1994. 3 Otros enunciados fueron tomados y adaptados de los
libros \Matem¶aticas Recreativas" [10], \Acertijos Fant¶asticos" [9], y de diversas revistas de
pasatiempos y entretenimientos matem¶aticos.
En las respuestas desarrolladas se incluyen sugerencias que pretenden dilucidar ciertos
\puntos d¶ebiles" en la mayor¶³a de los alumnos ingresantes, tales como el planteo adecuado de
ecuaciones, formalizaci¶on de hip¶otesis asociadas a un problema dado, y la mec¶anica utilizada
para la obtenci¶on de conclusiones \por el absurdo". Se incluyen asimismo explicaciones
acerca de dos estrategias de resoluci¶on de problemas que permiten atacar una amplia gama
de situaciones: \b¶usqueda espacio-estado" (aplicable a problemas que involucran hallar \cu¶al
es el camino" que lleva a la soluci¶on del problema) y \an¶alisis de mundos posibles" (aplicable
a problemas de l¶ogica).
Algunas sugerencias. . .
Al desarrollar la resoluci¶on de un ejercicio, es conveniente tener en cuenta los siguientes
puntos:
² Expresar claramente toda suposici¶on que se realice acerca del enunciado. No dudar en
abundar en explicaciones cuando se lo estime necesario. Para analizar la claridad en el
desarrollo de un ejercicio, suele resultar ¶util situarse imaginariamente en la posici¶on
de aquella persona que analizar¶a o corregir¶a luego el desarrollo realizado.
² Veri¯car no haber hecho uso de justi¯caciones ambiguas o confusas para obtener con-
clusiones relevantes a la soluci¶on de un problema. Llegar a una conclusi¶on correcta
a partir de premisas equivocadas suele carecer de valor al momento de evaluar cu¶an
correctamente se resolvi¶o un ejercicio.
3
El autor del presente texto se remiti¶o a transcribir dichos enunciados, redactando las soluciones y acer-
camientos para los mismos que se muestran posteriormente.
{7{
¶ DE PROBLEMAS: EJERCITACION
2 RESOLUCI ON ¶
Ejercicio 2.2 (*) Una persona tiene 50 a~ nos, y su hijo 20. >Dentro de cu¶antos a~nos la edad
del padre ser¶a el doble que la de su hijo?
Ejercicio 2.3 (*) En un corral hay conejos y gallinas. Se cuentan 140 patas y 50 cabezas.
>Cu¶antos conejos hay?
Ejercicio 2.4 (*) >Cu¶anto tiempo tarda un tren de 200 metros de largo que marcha a una
velocidad de 15 m/s en atravesar un t¶
unel de 1600 metros de largo?
Ejercicio 2.5 (*) >Qu¶e edad tendr¶a Juan en el a~no 2000, sabiendo que esa edad ser¶a igual
a la suma de las cifras de su a~
no de nacimiento?
Ejercicio 2.6 (*) Se desea disponer los alumnos de una escuela en forma de cuadrado. En
el primer intento se forma un cuadrado de x alumnos de lado, y sobran 25 ni~nos. Se realiza
un nuevo ensayo, agregando un alumno m¶as por ¯la y por columna, y faltan 46. >Cu¶antos
alumnos tiene la escuela?
Ejercicio 2.7 (*) Un autom¶ovil pasa frente a un moj¶on que tiene la numeraci¶on AB km;
una hora m¶as tarde pasa por otro que tiene la numeraci¶on BA km; y una hora despu¶es
pasa por el moj¶on A0B km. >Qu¶e n¶ umeros tienen los mojones y cu¶al es la velocidad del
autom¶ovil?
Ejercicio 2.8 (*) 42 personas toman parte de un baile. Durante la ¯esta una dama bail¶o
con 7 caballeros, una segunda dama con 8, una tercera con 9, y as¶³ sucesivamente hasta que
la u¶ltima bail¶o con todos los hombres. >Cu¶antas damas hab¶³a en el baile?
Ejercicio 2.9 (*) Una canilla puede llenar un tanque en 15 minutos, otra lo puede llenar
en 20 minutos, y una tercera en 30 minutos. >Cu¶anto se tardar¶a en llenar el tanque si las
tres canillas funcionan simult¶aneamente?
Ejercicio 2.10 (*) Pipo y Nino son gemelos. Uno de ellos siempre dice la verdad, el otro
siempre miente. Le pregunto a uno: >Pipo es quien siempre miente?, y me responde que s¶³.
>Con cu¶al de los dos gemelos habl¶e?
Ejercicio 2.11 (*) Un campesino debe extraer 6 litros de agua de r¶³o, pero al hacerlo se
da cuenta de que solo tiene 2 recipientes de capacidad 9 y 4 litros. >Podr¶a llevar a cabo su
tarea? >C¶omo?
{8{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 2.12 (*) Una isla est¶a habitada por dos tribus. Los miembros de una tribu
siempre dicen la verdad, los de la otra mienten siempre. Un misionero encontr¶o a dos de
estos nativos: uno alto y el otro petiso. \Eres de los veraces" pregunt¶o al m¶as alto. \Upf",
respondi¶o el nativo. El misionero reconoci¶o que esta era una palabra tribal que correspond¶³a
a \s¶³" o \no", pero no recordaba exactamente a qu¶e. El nativo petiso hablaba espa~nol,
de modo que el misionero le pregunt¶o por lo que hab¶³a dicho su compa~nero. \El dijo s¶³",
contest¶o el petiso, \pero el ser un gran mentiroso", agreg¶o. >A qu¶e tribu perte nec¶³a cada
nativo?
Ejercicio 2.13 (*) En la orilla de un r¶³o se encuentran un lobo, un repollo, y una oveja al
cuidado de un pastor, quien debe trasladarlos a la otra orilla del r¶³o. Para esto dispone de
solamente un bote con capacidad para dos pasajeros, uno de los cuales deber¶a ser necesaria-
mente el propio pastor. El pasajero restante ser¶a el lobo, la oveja o el repollo. En ning¶
un
momento el pastor debe dejar solos (en alguna de las orillas) al lobo y la oveja
(pues el lobo se comer¶³a a la oveja), o a la oveja y el repollo (pues la oveja se
comer¶³a el repollo). Indique c¶omo debe el pastor realizar los traslados para cumplir su
objetivo exitosamente.
Ejercicio 2.14 Dos obreros, uno viejo y otro joven, viven en un mismo apartamento y
trabajan en la misma f¶abrica. El joven va desde casa a la f¶abrica en 20 minutos; el viejo, en
30 minutos. >En cu¶antos minutos alcanzar¶a el joven al viejo si ¶este sale de casa 5 minutos
antes que el joven?
Ejercicio 2.15 >Cu¶antos a~ nos ten¶es?, le preguntaron a Iv¶an. El respondi¶o: Tomad tres
veces los a~nos que tendr¶e dentro de tres a~nos, restadle tres veces los a~nos que ten¶³a hace tres
a~nos, y resultar¶a exactamente los a~nos que tengo ahora. >Cu¶antos a~ nos tiene Iv¶an?
Ejercicio 2.16 El hijo le dice al padre: \<Qu¶e extra~no! Los d¶³gitos de tu edad, puestos
al rev¶es, forman mi edad.". El padre le dice al hijo: \<Mir¶a vos! Y encima mana~na es mi
cumplea~ nos, y mi edad ser¶a el doble que la tuya. . . ". >Qu¶e edad tiene el padre? >qu¶e edad
tiene el hijo?
Ejercicio 2.18 En una f¶abrica, se utiliza jugo de naranja y soda para producir una gaseosa.
Para fabricar la gaseosa, se cuenta con un aparato que consta de dos canillas y un recipiente.
Una de las canillas vierte 10 litros por minuto de jugo de naranja, y la otra 7 litros por minuto
de soda. El l¶³quido vertido por las canillas cae en el recipiente, el cual tiene 1000 litros de
capacidad. Juan, estudiante de computaci¶on, es el encargado de manejar este aparato.
{9{
¶ DE PROBLEMAS: EJERCITACION
2 RESOLUCI ON ¶
Inicialmente, el recipiente est¶a vac¶³o. A las 10:00, Juan abre la canilla de donde sale jugo
de naranja, el cual comienza a caer en el recipiente. A las 10:10, Juan recuerda que tambi¶en
deb¶³a abrir la otra canilla, por lo que abre la canilla de donde sale la soda. Pasado cierto
tiempo, Juan cierra ambas canillas: en ese instante, el recipiente conten¶³a el doble de jugo
que de soda. >A qu¶e hora Juan cerr¶o ambas canillas?
Ejercicio 2.19 \>Cu¶antos a~nos tiene Jos¶e?", dijo Pedro con voz inquieta. "Hace 18 a~nos,
recuerdo que era exactamente tres veces m¶as viejo que su hijo", le contesto. \Seg¶un me
dijeron," a~
nade Julio, \Jos¶e es ahora dos veces m¶as viejo que su hijo". >Cu¶antos a~nos tiene
Jos¶e?
Ejercicio 2.20 \<Qu¶e curioso!" le dice Juan a Pedro. "Escrib¶³ un n¶ umero de tres cifras,
restale la suma de sus d¶³gitos, y el resultado ser¶a divisible por 9."Pedro hace dos ejemplos
para probar la a¯rmaci¶on de Juan:
Ejercicio 2.21 Me dirijo a una conocida casa de cambio ubicada en calle San Mart¶³n. El
cajero me atiende con una sonrisa displicente. \Quisiera cambiar 10 pesos en coronas suecas",
digo con tranquilidad. El cajero me contesta: "Bueno, yo ac¶a soy nuevo. Lo ¶unico que s¶e
es que un peso m¶as una corona sueca vale lo mismo que un marco alem¶an. Tambi¶en me
dijeron que el valor de un peso equivale al valor de una corona sueca m¶as el de un yen. Ah,
me olvidaba: dos marcos alemanes son equivalentes a tres yens". Tras escuchar esto u¶ltimo,
respiro aliviado. Ahora puedo decirle al cajero cu¶antas coronas suecas debo recibir a cambio
de mis 10 pesos. . . >Cu¶antas? 4
Ejercicio 2.22 Lul¶ u, mi vecina, busca marido, y no sabe como decidirse entre sus tres
pretendientes. Durante toda la semana escuch¶e sus suspiros y cavilaciones, mientras hablaba
en voz alta acerca de qui¶en podr¶³a ser su futuro esposo.
El lunes dijo: \>Con qui¶en me caso? >Con el que vive en Cnel.Pringles, con el empresario o
con el ganadero?".
El martes dijo: \>Con qui¶en me caso? >Con el que tiene un Alfa Romeo, el que tiene un
Mercedes o el viudo?".
El mi¶ercoles dijo: \>Con qui¶en me caso? >Con el estudiante de computaci¶on, el que vive en
Nueva York o el que tiene yate?".
El jueves dijo: \>Con qui¶en me caso? >Con el que vive en Cnel.Pringles, el viudo o el que
4
Las relaciones entre las distintas unidades monetarias son totalmente ¯cticias, y no se corresponden con
aquellas v¶alidas actualmente.
{10{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 2.1 Si x es el primero de los tres n¶umeros, los dos restantes son x + 1 y x + 2.
Puede entonces plantearse la siguiente ecuaci¶on de primer grado: x + (x + 1) + (x + 2) = 69.
Simpli¯cando, de ah¶³ se deduce que 3x + 3 = 69 ¡! 3x = 66 ¡! x = 22.
Obs.: cabe recordar que una ecuaci¶on de grado n, de la forma cn xn + cn¡1xn¡1 + ¢ ¢ ¢+c1x1 + c0
tiene n soluciones posibles. En el caso anterior, n = 1.
Ejercicio 2.2 Sea x la cantidad de a~nos que deben transcurrir para que la edad del hijo
sea el doble que la del padre. Dado que el tiempo transcurre igualmente para ambos, puede
plantearse la siguiente ecuaci¶on:
(50 + x) = 2(20 + x)
(esto es, en x a~nos a partir de ahora, la edad del hijo ser¶a 20 + x, y la del padre 50 +
x; la ecuaci¶on re°eja la condici¶on de que la edad del hijo sea el doble que la del padre).
Simpli¯cando la ecuaci¶on planteada, resulta 50 + x = 40 + 2x ¡! x = 10. Luego, dentro de
10 a~nos, la edad del hijo ser¶a el doble que la del padre.
Ejercicio 2.3 Se sabe que un conejo tiene 4 patas y 1 cabeza, y una gallina tiene 2 patas
y 1 cabeza. Sea x = nro. de conejos, e y = nro. de gallinas, entonces el valor de x e y
corresponde a la soluci¶on del par de ecuaciones 4x+2y = 140 y x+ y = 50. Aplicando alguno
de los m¶etodos conocidos para resoluci¶on de ecuaciones (ej: sustituci¶on), resulta x = 20 e
y = 30. Luego hay 20 conejos y 30 gallinas.
Ejercicio 2.4 Para que el tren atraviese totalmente el t¶unel, es necesario que lo recorra
de punta a punta, y que el u¶ltimo vag¶on del tren abandone el t¶unel. Luego la distancia a
recorrer es 1600 metros + 200 metros = 1800 metros. Aplicando la f¶ormula de velocidad =
distancia/tiempo, resulta:
distancia 1800m
Tiempo = velocidad
= 15m=s
= 120 segs. = 2 minutos
{11{
¶ DE PROBLEMAS: EJERCITACION
2 RESOLUCI ON ¶
Ejercicio 2.5 Puede asumirse que Juan naci¶o en el siglo XX, ya que de haber nacido en
el siglo XIX, para el a~no 2000 tendr¶³a m¶as de 100 a~nos, y es imposible que la suma de 4
d¶³gitos (esto es, 1 + 8 + x + y) sea mayor que 100.
no \19xy", donde x e y son d¶³gitos. 5
Luego, de aqu¶³ se deduce que Juan naci¶o en el a~
Deben determinarse ahora los valores de las decenas y las unidades. El a~
no \19xy" puede
expresarse por su descomposici¶on en base 10 como el n¶umero
Por lo tanto, seg¶un los datos del enunciado, se sabe que 1 + 9 + x + y = 2000¡ \19xy",
es decir 10 + x + y = 2000 ¡ (1900 + 10x + y). Simpli¯cando, resulta 11x + 2y = 90 (1) Esta
es una ecuaci¶on a dos variables, y tiene como tal in¯nitas soluciones en los n¶umeros reales.
Sin embargo, se sabe tambi¶en que x e y son d¶³gitos, es decir, 0 · x · 9, 0 · y · 9. Esto
restringe considerablemente la cantidad de casos a analizar.
No obstante, aun sabiendo que x e y son digitos, habr¶³a 100 combinaciones distintas de x
e y que deber¶³an ensayarse para averiguar qu¶e valores satisfacen la ecuaci¶on (1). Se emplear¶a
un mecanismo \por tanteo" para estimar que valores de x e y resultan ser aceptables.
Se sabe que 2y · 18, para cualquier d¶³gito y. Luego debe buscarse un valor de x que,
sumado a un n¶ umero que es menor o igual a 18, permita \llegar" a 90. Los ¶unicos valores
posibles son x = 7 y x = 8.
Luego x es 7, o bien x es 8. Si x = 7, entonces despejando resulta y = 6; 5 (absurdo,
pues y debe ser un d¶³gito). Luego necesariamente x = 8, y despejando resulta y = 1. Juan
naci¶o entonces en 1981.
Ejercicio 2.6 Sea T la cantidad total de ni~nos de la escuela, y sea x la cantidad de alumnos
que forman el lado del cuadrado que se hace inicialmente en el patio. Seg¶un el enunciado,
sobran 25 ni~nos para que el cuadrado de x ni~nos de lado quede formado. Esto es x2 = T ¡25.
Si se a~
nade un ni~
no al cuadrado, ¶este pasa a tener x+ 1 ni~nos de lado. En este caso, faltan 46
ni~nos. Puede plantearse la ecuaci¶on (x + 1)2 = T + 46. Despejando T en ambas ecuaciones,
resulta la igualdad
x2 + 25 = x2 + 2x + 1 ¡ 46
25 = 2x ¡ 45
x = 35
Luego el cuadrado formado inicialmente ten¶³a 35 ni~nos de lado, y la escuela tiene 352 + 25 =
1250 ni~
nos.
5
Las comillas en \19xy" fueron usadas para diferenciar el n¶umero de a~no formado por los d¶³gitos 1, 9, x
e y del producto 19:x:y
{12{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 2.7 Primeramente, es conveniente realizar una representaci¶on gr¶a¯ca del proble-
ma:
AB BA A0B
|---------|--------|
1 h 1 h
Puede asumirse que la velocidad del auto es constante. Luego la distancia entre \AB"
y \BA" es la misma que entre \BA" y \A0B". Esto es: distancia(\AB",\BA") = dis-
tancia(\BA",\A0B") (1) >C¶omo expresar la distancia entre mojones? El n¶umero que tiene
un moj¶on puede indicarse num¶ericamente como en el caso del problema 2.5. As¶³, el moj¶on
\AB" tiene asociado el n¶
umero 10A + B.
Luego, (1) puede expresarse como
Simpli¯cando, resulta:
¡9A + 9B = 99A ¡ 9B
0 = 108A ¡ 18B; donde 0 · A · 9; y 0 · B · 9
Puede hacerse luego un an¶alisis similar al ejercicio 2.5: es claro que A = 1, ya que
² si A > 1 (p.ej: A = 2), se obtiene la ecuaci¶on 0 = 216 ¡ 18:B, y es claro que no existe
ning¶un d¶³gito B que permita satisfacer esta ecuaci¶on (lo mismo vale para valores A =
3, 4, etc.)
{13{
¶ DE PROBLEMAS: EJERCITACION
2 RESOLUCI ON ¶
De aqu¶³ se deduce que n-¶esima dama bail¶o con n + 6 caballeros. Si la n-¶esima dama es
la ¶
ultima dama presente en el baile, esto quiere decir que ella bail¶o con todos los caballeros
(seg¶un lo expuesto en el enunciado). Se sabe asimismo que nro.damas + nro.caballeros = 42.
Pero precisamente, si la u¶ltima dama en bailar es la n¶
umero n, el valor n representa tambi¶en
la cantidad de damas presentes en el baile. La dama n-¶esima bail¶o con n + 6 caballeros.
Luego n + (n + 6) = 42 ¡! n=18. Resulta entonces que la cantidad de damas en el baile
era 18.
Ejercicio 2.9 Sea T la capacidad del tanque, y sean C1,C2 y C3 las tres canillas disponibles.
Calculemos ahora el n¶ umero de litros que vierte cada canilla en un minuto. As¶³, para C1
resulta por regla de tres simple:
15 min. |{ T litros
1 min. |{ x litros
De aqu¶³ resulta que x = T =15 litros. An¶alogamente, se tiene T=20 y T =30 litros para las
canillas C 2 y C3 respectivamente. Luego, si se abren las tres canillas simult¶aneamente, en
un minuto se vertir¶an (T =15) + (T =20) + (T =30) litros, es decir (T =15) + (T =20) + (T =30) =
(9=60)T . Aplicando regla de tres nuevamente, se tiene:
1 minuto |{ 9/60 T
x minutos |{ T
De aqu¶³ resulta x = 9TT = 609 = 6; 66 minutos = 6' 40". Este es el tiempo que demorar¶a
60
en llenarse el tanque abriendo las tres canillas simult¶aneamente.
Ejercicio 2.10 Un problema de este tipo puede resolverse \al tanteo", o bien empleando
alguna metodolog¶³a que ordene la informaci¶on con la que se cuenta. Una estrategia aplicable
para este tipo de enunciados es el denominado \an¶alisis de mundos posibles".
An¶alisis de mundos posibles
Se distingue por un lado la informaci¶on de la \realidad". Esta informaci¶on corresponde
a aquellos datos que indudablemente sabemos que son ciertos. En este caso, la \realidad"
est¶a dada por el hecho de que le pregunt¶e a un gemelo \>Pipo es el que miente?" y responde
\s¶³".
Por otro lado, se distinguen distintos \mundos posibles". Cada mundo posible es una
alternativa diferente a partir de los datos dados en el enunciado. En nuestro caso, tenemos
los siguientes cuatro mundos posibles (cuatro alternativas diferentes), excluyentes entre s¶³:
{14{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
El paso siguiente es analizar cada uno de los \mundos posibles", descartando aquellos
mundos que sean \absurdos" o \imposibles" (p.ej: un mundo en el que una persona veraz
dice \Yo soy mentiroso" es un mundo imposible). Los mundos \sobrantes" son posibles
soluciones para el problema a considerar. A continuaci¶on se muestra un an¶alisis de mundos
posibles para el caso anterior:
1. Imposible. Si Pipo es veraz, nunca va a responder que s¶³ a la pregunta \>Pipo miente?"
2. Imposible. Si Pipo miente, nunca va a responder que s¶³ a la pregunta \>Pipo miente?"
pues <estar¶³a diciendo la verdad!)
Ejercicio 2.11 Este problema puede resolverse bastante f¶acilmente por medio de una
t¶ecnica gr¶a¯ca llamada \b¶
usqueda espacio-estado".
B¶
usqueda espacio-estado
Un \estado" S es una situaci¶on posible de las cosas a partir de los datos del enunciado.
La idea consiste en pasar de un estado inicial S a otros alternativos S1, S2 , . . . Sn, a partir
de las restricciones dadas por el enunciado del problema. Para cada uno de esos estados
alternativos, puede pasarse a su vez a otros, y as¶³ sucesivamente, hasta llegar a un estado
meta M , el cual constituye la soluci¶on del problema. El camino de¯nido por la secuencia de
estados existente entre S y M es la secuencia de pasos que permite arribar a la soluci¶on.
Estos conceptos pueden verse m¶as claramente en el caso concreto del enunciado a resolver.
Primeramente, debe establecerse una representaci¶on adecuada para un estado posible. En
nuestro caso, se representar¶an los dos recipientes del campesino con un par de n¶umeros A; B,
donde A representa el contenido del recipiente de 9 litros de capacidad y B el de 4 litros de
capacidad. El estado inicial es 0; 0 (ambos recipientes vac¶³os). >Cu¶ales son todos los nuevos
estados a los cuales se puede acceder a partir del estado 0; 0? El campesino puede llenar el
recipiente de 4, llenar el recipiente de 9, o bien llenar los dos recipientes. Esto se expresar¶a
dicendo que a partir del estado 0; 0, puede pasarse al estado 0; 4, 9; 0 y 9; 4. Gr¶a¯camente:
0 0
/ | \
0 4 9 0 9 4
{15{
¶ DE PROBLEMAS: EJERCITACION
2 RESOLUCI ON ¶
Luego, a partir de cada nuevo estado obtenido, se intentar¶a pasar a su vez a nuevos estados
alternativos. Por ejemplo, a partir del estado 0; 4, se tienen las siguientes alternativas:
² Puede vaciarse el recipiente de 4 (no es una alternativa v¶alida, pues se vuelve al estado
inicial de donde se comenz¶o).
² Puede llenarse el recipiente de 9 (no sirve: es lo mismo que llenar ambos recipientes a
la vez, y <ese estado se lo puede alcanzar directamente a partir del estado inicial 0,0 !).
Por lo tanto, a partir de este an¶alisis puede asegurarse que si el campesino llena primero
el recipiente de 4 lts., <jam¶as llegar¶a a tener 6 lts!. Se marca entonces con una X al llegar
al estado 4,4, indicando con esto que por ese camino no puede encontrarse una soluci¶on.
Un an¶alisis similar vale para el estado 9,4. Luego, la ¶unica alternativa restante es 9,0.
Se ensayan entonces los estados posibles a partir de 9,0, hasta conseguir un estado x; y en el
que tenga 6 litros. El \camino" desde el estado 0,0 al 6,4 es una soluci¶on para el problema
planteado. A continuaci¶on se muestra el desarrollo completo del problema, utilizando esta
t¶ecnica:
0 0
/ | \
0 4 9 0 9 4
/ | X
4 0 5 4
| |
4 4 5 0
|
X 1 4
|
1 0
|
0 1
|
9 1
|
6 4 > solucion: se tiene un
recipiente con 6 lts.
Ejercicio 2.12 Puede plantearse la soluci¶on de manera an¶aloga al problema de Pipo y Nino.
En la \realidad", se tiene:
{16{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
² Le pregunt¶e a un 2do. nativo qu¶e hab¶³a dicho el 1er. nativo, y responde \Dijo que s¶³
y ¶el es un gran mentiroso".
1 Imposible. Si el 1er. y 2do. nativos son veraces, el 2do. nativo no podr¶³a nunca decir
\¶el es un mentiroso", pues estar¶³a mintiendo (absurdo).
2 Imposible. Si se asume que \Upf" signi¯ca \s¶³", dado que el 2do. nativo miente, nunca
podr¶³a decir \El dijo que s¶³" (pues el 2do. nativo estar¶³a diciendo la verdad).
3 Es posible.
5,6,7,8 Imposible. Ante la pregunta \Eres de los veraces?", un veraz dice \s¶³" (dice la verdad)
y un mentiroso dice \s¶³" (miente). Luego \Upf" signi¯ca necesariamente \s¶³". Luego
los mundos posibles 5,6,7 y 8 quedas descartados.
En consecuencia, el ¶unico mundo posible es 3. Luego, \Upf" signi¯ca \s¶³", el 1er. nativo
miente y el 2do. dice la verdad.
Ejercicio 2.13 Puede plantearse en forma an¶aloga al ejercicio del campesino. Los estados
posibles se representar¶an con A j B, queriendo decir con esto que A son aquellas cosas que
est¶an en la orilla izquierda y B las que est¶an en la orilla derecha.
Sea P = pastor; R = repollo; O = oveja; L = lobo. El estado inicial es P LRO j vac¶{o. Los
estados marcados con X representan caminos que no conducen a soluci¶on, ya que resulta
ser que \alguien se come a otro". Puede verse que hay dos soluciones, las cuales pueden
obtenerse a partir del gr¶a¯co de b¶usqueda que se detalla m¶as abajo.
{17{
¶ DE PROBLEMAS: EJERCITACION
2 RESOLUCI ON ¶
PLRO|nada
/ | \ \
LO|PR OR|PL LR|PO LRO|P
X X | X (*)
|
PLR|O
/ | \
/ | \
_____R|PLO L|PRO LR|PO
/ / | X
/ / |
POR|L PR|LO PLO|R
/ X |
/ |
O|PLR O|PLR
| |
PO|LR PO|LR
| |
vacio|PLOR vacio|PLOR
Ejercicio 2.14 Este problema puede resolverse por diversos procedimientos. Intuitivamen-
te, puede pensarse que, para recorrer todo el camino, el obrero viejo emplea 10 minutos m¶as
que el joven. Si el viejo saliera 10 minutos antes que el joven, ambos llegar¶³an a la f¶abrica
a la vez. Si el viejo ha salido s¶olo 5 minutos antes, el joven debe alcanzarle precisamente
a mitad de camino; es decir, 10 minutos despu¶es (el joven recorre todo el camino en 20
minutos).
Una soluci¶on m¶as formal ser¶³a la siguiente: se sabe que velocidad es igual a la distancia
recorrida dividido el tiempo empleado en recorrerla, esto es, v = d=t (1).
Sea dc la distancia del camino que recorren ambos obreros. La velocidad del obrero joven
ser¶a v1 = dc=20; la del obrero viejo, ser¶a v2 = dc=30.
Sea x el tiempo transcurrido desde que el obrero joven se pone en marcha hasta que
alcanza al obrero viejo. Se sabe que, en el momento del encuentro, las distancias recorridas
por ambos ser¶an las mismas. A partir de la ecuaci¶on (1), se sabe tambi¶en que d = vt. Luego
puede plantearse la igualdad:
{18{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 2.15 Sea x la edad actual de Iv¶an. Cuando ¶el dice tomad tres veces la edad que
tendr¶e dentro de tres a~nos, eso equivale a 3(x + 3). De igual manera, la edad que ten¶³a hace
tres a~
nos ser¶a 3(x ¡ 3). De la a¯rmaci¶on de Iv¶an, puede plantearse la ecuaci¶on:
3(x + 3) ¡ 3(x ¡ 3) = x
Ejercicio 2.16 Es claro que obteniendo la edad del padre, autom¶aticamente se tiene la del
hijo (invirtiendo los d¶³gitos de la edad del padre).
Asumamos que el hijo tiene \xy00 a~nos. Luego el padre tiene \yx00 a~nos. Para poder
manipular los d¶³gitos de dichas edades, deber¶an expresarse en su descomposici¶on decimal.
As¶³, \xy 00 es equivalente a 10x + y, con x e y d¶³gitos.
Cuando el padre cumpla a~ nos, pasa a tener \yx00 + 1 a~
nos, y en ese momento, su edad
00
ser¶a el doble que la del hijo, esto es, 2\xy . Puede plantearse entonces la siguiente ecuaci¶on:
\yx00 + 1 = 2\xy 00
10y + x + 1 = 20x + 2y
2. Hay un estudiante C, y los dem¶as son M : imposible, pues los estudiantes M estar¶³an
diciendo la verdad (\hay estudiantes de computaci¶on").
{19{
¶ DE PROBLEMAS: EJERCITACION
2 RESOLUCI ON ¶
5. Todos los estudiantes son C: imposible. Todos ellos siempre dicen la verdad, y ser¶³a
mentira decir que \. . . hay estudiantes de medicina".
El u¶nico caso posible es el primero: todos los estudiantes mienten. Luego todos los estu-
diantes sentados a la mesa son de medicina.
La canilla Cj est¶a abierta 10 minutos. En ese tiempo, vertir¶a 10 lit./min * 10 min = 100
litros. A partir de ese momento, se abre la canilla Cs , que vertir¶a 7 lit./min. A partir de
aqu¶³, transcurridos x minutos, se cierran ambas canillas, y en ese momento el volumen de
jugo es el doble que el de soda.
En x minutos, la canilla Cj vierte 100 + 10x litros. La canilla Cs vierte 7x litros. Seg¶
un
el enunciado, sabemos que transcurridos esos x minutos, se cumple que Cj arroj¶o el doble
que Cs , es decir:
Despejando, resulta
Luego Juan cerr¶o ambas canillas a los 25 minutos de que abriera Cs . Como Cs se abri¶o a las
10:10, las canillas fueron cerradas 25 minutos m¶as tarde, esto es, 10:35.
7
En la soluci¶o n de este ejercicio hab¶³a errores tipogr¶a ¯cos que fueron detectados por el alumno Pablo
Santiago en 1997.
{20{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 2.19 Este problema puede resolverse por medio de una ecuaci¶on de una inc¶ognita.
Supongamos que el hijo tiene ahora x a~nos. Seg¶un lo dicho por Julio, el padre tiene 2x a~nos.
Hace 18 a~nos, cada uno ten¶³a 18 a~
nos menos, y resultaba ser que Jos¶e era tres veces m¶as
viejo que su hijo. Puede entonces plantearse la igualdad
3(x ¡ 18) = 2x ¡ 18
Despejando la inc¶ognita, resulta que x = 36. Luego el hijo tiene 36 a~nos, y Jos¶e tiene 72.
Ejercicio 2.20 Sea \abc" el n¶umero de tres cifras que se ha escrito. Sea r el resultado
obtenido al hacer la resta. El n¶umero \abc" puede expresarse como:
100a + 10b + c
r = 100a + 10b + c ¡ (a + b + c)
r = 100a + 10b + c ¡ a ¡ b ¡ c
r = 99a + 9b
r = 9(11a + b)
Luego r es un producto donde 9 es un factor. Es claro entonces que r sea divisible por 9.
Ejercicio 2.21 Sea a = valor de un peso, b = valor de una corona sueca, c = valor de un
marco alem¶an y d = valor de un yen. A partir de las a¯rmaciones del cajero, se sabe que:
a+b = c
a = b+d
2c = 3d
Para saber cu¶antas b recibo a cambio de 10a, debo averiguar la relaci¶on existente entre a y
b. De lo anterior, puede deducirse
c = a +b
d = a¡b
2(a + b) = 3(a ¡ b)
2a + 2b = 3a ¡ 3b
5b = a
{21{
¶ DE PROBLEMAS: EJERCITACION
2 RESOLUCI ON ¶
{22{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
² El de la moto no es morocho.
Ejercicio 2.24 Nos enteramos de que, en la casa de Andrea (una vecina), se hizo una cena
familiar. Cuando le preguntamos a ella que tal hab¶³a sali do la reuni¶on, dijo:
"Mi abuelo se sent¶o a mi izquierda; entre ¶el y mi t¶³a, se sentaron dos hombres.
Mi mami no se sent¶o al lado de mi t¶³a porque est¶an peleadas. Entre mi t¶³o y mi
primo se sentaron dos mujeres. Mi primo se acomod¶o frente a mi papi, y entre
mi mami y la abuela."
1 2 3
\ | /
8___\|/___4
/|\
/ | \
7 6 5
Ejercicio 2.26 Un chico y una chica est¶an sentados en las escaleras de su escuela. \Yo soy
un chico" dice la persona morena. \Yo soy una chica" dice la persona pelirroja. Si al menos
uno de los hablantes a mentido, >qui¶en es pelirrojo y quien moreno?
{23{
¶ DE PROBLEMAS: EJERCITACION
2 RESOLUCI ON ¶
Ejercicio 2.27 La isla de Pampum est¶a en un rinc¶on remoto de la Polinesia. Sus habitantes
son brujos y zombies. Los brujos siempre dicen la verdad, y los zombies mienten siempre.
Tanto brujos como zombies entienden el castellano, pero se niegan a hablar en otro idioma
que no sea el suyo. Su idioma tiene s¶olo dos palabras: pum y pam. Una de estas palabras
signi¯ca \s¶³" y la otra \no", pero no necesariamente en ese orden. Le preguntamos a un
nativo de la isla:
{>Pum signi¯ca s¶³?
{Pum -contest¶o.
Ahora bien: ese nativo >es brujo o zombie?
Ejercicio 2.28 En una estaci¶on de trenes la familia Perez se despide de la familia Ruiz.
Cada uno de los Perez saluda a cada uno de los Ruiz, como corresponde. Al saludarse dos
varones se dan un apret¶on de manos, mientras que al saludarse un var¶on y una mujer, o
dos mujeres, se dan un beso. Por supuesto, cada una de las dos familias tiene m¶as de un
integrante. Un testigo circunstancial {que nunca falta en estos acertijos{ nos informa que el
saldo contable de la despedida fue de 21 apretones de mano y 34 besos. >Cu¶antos hombres
y cu¶antas mujeres estuvieron all¶³ despidi¶endose?
Ejercicio 2.29 El campe¶on del Tenis Club \Bolas y Raquetas" apareci¶o muerto en la cancha
central. La causa: un raquetazo. El inspector Fisgonetti, que conduce la investigaci¶on, llam¶o
a declarar a los trillizos Pachinott pues, seg¶un testigos, dos de ellos hab¶³an jugado esa ma~nana
con el infortunado campe¶on. A continuaci¶on se transcribe parte del interrogatorio:
{Fisgonetti (a los tres) : >Jugaron ustedes hoy con el occiso?
{Archibaldo: \Yo no"
{Belisario : \Pues yo s¶³"
{Celedonio : \Yo no"
{Fisgonetti (a los tres) : >Mat¶o alguno de ustedes al campe¶on?
{Archibaldo : \Yo no lo mat¶e!"
{Belisario : \Fue Celedonio!"
{Celedonio : \Fue Belisario!"
El inspector {enterado de que uno de los hermanos miente siempre, mientras que los otros
dos no lo hacen jam¶as{ detuvo inmediatamente a uno de ellos >A qui¶en?
Ejercicio 2.30 Guiso de Piedra: El astronauta Mark lleg¶o a la excavaci¶on, y recogi¶o mues-
tras de roca para llevar de regreso a los cient¶³¯cos terrestres. Meti¶o las rocas en tres bolsas
negras: una para las rocas ¶³gneas, otra para las sedimentarias y otra para las metam¶or¯cas.
En su mano ten¶³a tres etiquetas, una para cada bolsa. Pero estaba tan apurado para regresar
al cohete antes de que se le terminara la provisi¶on de ox¶³geno, que puso mal las etiquetas de
todas las bolsas. >Cu¶antas rocas tuvo que sacar de cu¶antas bolsas para averiguar que hab¶³a
en cada una?
Respuestas
Ejercicio 2.23 C¶esar rob¶o los tomates.
{24{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 2.28 Una familia tiene 5 miembros (3 hombres y 2 mujeres) y la otra tiene 11
miembros (7 hombres y 4 mujeres).
Ejercicio 2.29 El inspector detuvo a Celedonio. Si el mentiroso fuese Belisario, los otros
dos deber¶³an ser veraces, y entonces nadie hubiera jugado con el campe¶on. Pero se sabe que
jugaron dos. Por lo tanto, Belisario debe ser veraz, y es cierta la acusaci¶on que hace contra
Celedonio.
Ejercicio 2.30 Una roca de una bolsa. Si abriera la bolsa etiquetada \¶³gnea", por ejemplo,
y la roca que sacara fuera sedimentaria, entonces sabr¶³a que las otras dos bolsas no podr¶³an
contener rocas sedimentarias: tendr¶³an rocas ¶³gneas o metam¶or¯cas en su interior. Pero
como todas las bolsas tienen etiquetas err¶oneas, la que tiene la etiqueta \sedimentaria" tiene
que contener rocas metam¶or¯cas y la que dice \metam¶or¯ca" debe contener rocas ¶³gneas.
Este problema resalta la necesidad de prestar atenci¶on cuidadosa al lenguaje en el cual se
expresa un problema, intentando hacer uso de toda la informaci¶on dada en el enunciado.
{25{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
3.1 >Qu¶
e es una condici¶
on?
En los diferentes algoritmos considerados en clase, han aparecido a menudo acciones bajo la
forma:
Todas estas situaciones tienen un elemento com¶ un: hay asociada a ellas una condici¶on.
Las condiciones utilizadas en algoritmos son un tipo especial de proposiciones. En el lenguaje
de la l¶ogica, se llama \proposici¶on" a aquella enunciaci¶on o sentencia que solo puede ser
verdadera o falsa. Ejemplos de proposiciones son: \Juan tiene 20 a~nos", \3147 es primo",
\Bah¶³a Blanca es una ciudad ubicada en la Provincia de Buenos Aires", etc. Asimismo, la
pregunta \>Cu¶antos a~ nos ten¶es?" no es una proposici¶on, dado que no puede a¯rmarse nada
en particular acerca de su veracidad o falsedad. Los t¶erminos \verdadero" y \falso" (en ingl¶es
\true" y \false") constituyen el denominado valor de verdad asociado a una proposici¶on.
Ejemplo: el valor de verdad asociado a la proposici¶on \2 es menor que 3" es \verdadero".
Las condiciones constituyen proposiciones restringidas al uso de datos junto
con ciertas relaciones y operaciones matem¶ aticas. Una condici¶on puede ser \ver-
dadera" o \falsa". Cuando se determina el valor de verdad asociado a una condici¶on que
tiene ciertos datos, se dice que se eval¶ua esa condici¶on. Ejemplo: \A < 3",\B > 4",
\A + B ¡ (C ¤ D) > 0" son condiciones. Si el valor del dato A en un momento dado es 3, al
evaluar la condici¶on \A < 3" el resultado es \falso".
Para especi¯car una condici¶on en algoritmos que van a ser luego ejecutados por una
computadora, suelen utilizarse ¶unicamente las relaciones < (menor), > (mayor), <= (me-
nor o igual) >= (mayor o igual), = (igual) y 6= (distinto) 8 junto con distintas operaciones
aritm¶eticas, como + (suma), - (resta), * (producto), / (divisi¶on entera), y // (resto de la
divisi¶on entera). Los s¶³mbolos <, >, <=, >=, = y 6= se denominan operadores relacionales,
mientras que los s¶³mbolos +, -, * y / son llamados operadores aritm¶eticos, y corresponden a
las operaciones tradicionales del ¶algebra.
Del mismo modo en que contamos con acciones primitivas cuyo dato de salida es un
n¶umero, tambi¶en podremos de¯nir acciones primitivas que devuelvan un valor de verdad
(esto es, verdadero o falso). Estas primitivas podr¶an combinarse con los operadores
antes mencionados, para construir condiciones m¶as complejas.
Ejemplo: puede considerarse una primitiva EsBisiesto, la cual recibe como dato de en-
trada un n¶umero de a~no, y devuelve \verdadero" si ese a~
no es bisiesto, y \falso" si no lo es.
Esta primitiva puede ayudar en la elaboraci¶on de un algoritmo que cuente la cantidad de
d¶³as transcurridos entre dos fechas determinadas.
8
Al traba jar en la computadora en lenguaje Pascal, se utilizar¶a el s¶³mbolo <> en lugar de 6=.
{27{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
Ejemplo: La primitiva EsPar, que permite determinar si un n¶umero es par o no, puede
construirse como sigue:
Algoritmo EsPar
d.e.: N fnro. enterog
d.s.: verdadero si N es par; falso si N no es par.
Si (N // 2) = 0
entonces EsPar à verdadero
sino EsPar à falso
Esta primitiva puede usarse para construir una condici¶on en otro algoritmo (posiblemente
m¶as complejo) indicando simplemente su nombre:
...
Si EsPar(A*B)=verdadero
entonces mostrar `El n¶
umero ' A*B `es par'
...
Nota: Cuando se tiene que resolver un ejercicio y plantear un algoritmo, es usual indicar cu¶ales
son las primitivas b¶asicas de las que se dispone. Al resolver un ejercicio dado, puede resultar
conveniente contar con ciertas primitivas auxiliares, las que deber¶an ser de¯nidas a partir de las
primitivas b¶asicas disponibles.
Se mencion¶o anteriormente que, a ¯n de elaborar algoritmos que posteriormente van a co-
di¯carse en un lenguaje de programaci¶on, se utilizar¶an condiciones, y no proposiciones. Esto
es as¶³ en virtud de que los lenguajes de programaci¶on no tienen la su¯ciente \inteligencia"
como para poder expresar relaciones complejas en un nivel adecuado para ser ejecutado
por una computadora. Es por esto que ciertas veces aparecer¶a la necesidad de \reescribir"
una proposici¶on, expres¶andola como una condici¶on, en un lenguaje m¶as cercano al de la
computadora. Ejemplo:
Si el n¶
umero N es par ¡! Si EsPar(N)=verdadero
entonces .... entonces ....
Si A2 es igual a B ¡! Si A*A = B
entonces . . . entonces . . .
{28{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
sucesivo, se restringir¶
a al uso de condiciones formadas a partir de los operadores
relacionales y aritm¶eticos antes mencionados, combinados eventualmente con
primitivas que entreguen un valor \verdadero" o \falso".
3.2 Operadores l¶
ogicos
Las condiciones expresadas usando operadores relacionales, operadores aritm¶eticos y pri-
mitivas que devuelven \verdadero" o \falso", pueden combinarse utilizando los llamados
operadores l¶ogicos y, o, y no (tambi¶en identi¯cados comunmente por las palabras en ingl¶es
and, or y not, respectivamente). A continuaci¶on se detalla sucintamente cu¶al es el signi¯cado
de cada uno de ellos.
3.2.1 Operador l¶
ogico \y" (conjunci¶
on)
Dadas dos condiciones C1 y C2, el operador \y" permite construir una nueva condici¶on \C1
y C 2". El valor de verdad de esa condici¶on ser¶a verdadero solo si C1 es verdadero \y" C2 es
verdadero. 9
Para de¯nir el signi¯cado de un operador l¶ogico, suele recurrirse a las denominadas tablas
de verdad. En una tabla de verdad se indican, para cada combinaci¶on posible de los valores
de verdad de los operandos, cu¶al es el valor resultante de la operaci¶on.
En el caso de la operaci¶on \y", la tabla de verdad asociada es la siguiente:
C1 C2 C1 y C2
F F F
F V F
V F F
V V V
{29{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
3.2.2 Operador l¶
ogico \o" (disyunci¶
on)
Dadas dos condiciones C1 y C 2, el operador \o" permite construir una nueva condici¶on \C1 o
C2 ". El valor de esta condici¶on ser¶a \verdadero" solo si C1 es verdadero \o" C 2 es verdadero,
\o" tanto C1 como C2 son verdadero. Dicho en otras palabras: \C1 o C2" es falso solo si las
dos condiciones C 1 y C2 son falsas; caso contrario, es verdadero. La tabla de verdad asociada
al operador \o" es la siguiente:
C1 C2 C1 o C2
F F F
F V V
V F V
V V V
{30{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
C1 C2 C1 xor C2
F F F
F V V
V F V
V V F
3.2.3 Operador l¶
ogico \no" (negaci¶
on)
Dada una condici¶on C, el operador \no" permite construir una nueva condici¶on \no C ".
Esta condici¶on ser¶a \verdadero" solo si C es falsa, y ser¶a falsa solo si C es verdadero. Para
el operador \no", la tabla de verdad asociada es la siguiente:
C no(C)
F V
V F
El operador \no" permite expresar cierto tipo de condiciones en una manera alternativa.
Ejemplo: la condici¶on \A 6= B" es equivalente a \no (A = B)" la condici¶on \A > B" es
equivalente a \no (A <= B)"
Ejemplo: los siguientes trozos de c¶odigo son equivalentes:
Si A 6= B Si no(A = B) Si no(A 6= B)
entonces Bloque I entonces Bloque I entonces Bloque I
sino Bloque II sino Bloque II sino Bloque II
Nota: por convenci¶on, las expresiones que usan operadores relacionales suelen escribirse
entre par¶entesis cuando aparezcan asociadas a un operador l¶ogico dentro de un algoritmo.
As¶³, en lugar de escribir \Si a > b y c > d entonces...", ¶o "repetir...hasta c = 3 o b =
4\, suele escribe "Si (a > b) y (c < d) entonces..."y \repetir...hasta (c = 3) o (b = 4)",
respectivamente.
Nota hist ¶ orica: Los operadores l¶ogicos y, o, y no se denominan tambi¶en \booleanos", en
honor al matem¶atico y l¶ogico ingl¶es George Boole (1815-1864), quien los introdujera por
primera vez en su libro \Las leyes del pensamiento". Boole estudi¶o las propiedades de estos
operadores como una tem¶atica del ¶algebra y de la l¶ogica matem¶atica, sin sospechar que su
aplicaci¶on pasar¶³a a ser, un siglo m¶as tarde, un concepto fundamental dentro de las Ciencias
de la Computaci¶on.
{31{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
3.3 Condiciones m¶
as complejas
Por medio de los operadores l¶ogicos \y", \o" y \no", pueden construirse condiciones com-
plejas a partir de otras m¶as sencillas.
Ejemplo: Si los datos x, y, y z valen 1,2 y 3 respectivamente, se tiene que:
Los par¶entesis ayudan a expresar el orden en que se evaluar¶an las distintas condiciones.
As¶³, no es lo mismo escribir \( (A > 3) y (B < 4) ) o (C = 3))" que \(A > 3) y ( (B < 4) )
o (C = 3) )". Si A vale 2, B vale 1 y C vale 3, el valor de verdad de la primera condici¶on es
verdadero, mientras que el de la segunda es falso.
Nota importante: En matem¶atica es frecuente escribir \Si a = 3 ¶o 4 ¶o 5 entonces....", \Si
a > b > 1 entonces...", o \Si 8 <=promedio<= 10 entonces...". Algunas veces, esta notaci¶on
puede dar lugar a dudas en su interpretaci¶on. Es com¶un entonces que, al escribir algoritmos,
lo anterior se exprese como \Si (a = 3) o (a = 4) o (a = 5) entonces...", \Si (a > b) y (b > 1)
entonces...", y \Si (8<=promedio) y (promedio<=10) entonces...", respectivamente.
{32{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Sin embargo, ser¶³a conveniente que el ciclo repetir-mientras se cortase tan pronto
como se encontrara que D est¶a en N >C¶omo expresar ese tan pronto como? Los datos
booleanos brindan una soluci¶on para esto. La condici¶on \haya d¶³gitos en N para analizar"
podr¶³a expresarse, en este caso, como \mientras N sea mayor que 0". El resto del algoritmo
podr¶³a reescribirse como sigue:
Algoritmo EstaDigitoPresente
d.e.: D, N fD es un d¶³gito, N es un n¶umero naturalg
d.s.: verdadero si D est¶a en N; falso en caso contrario.
AunNoEncontreDigito à verdadero
Repetir mientras N > 0 y AunNoEncontreDigito = verdadero
Resto à N // 10
Si D=Resto
entonces
AunNoEncontreDigito à falso fEncontr¶e que D est¶a en Ng
sino
N Ã N/10
Si AunNoEncontreDigito=verdadero
entonces EstaDigitoPresente à falso
sino EstaDigitoPresente à verdadero
{33{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
Sin embargo, a¶un incluyendo esta modi¯caci¶on, el algoritmo tiene un defecto en cuanto
a su e¯ciencia, ya que trabaja \en exceso". No se pretende saber cu¶antos divisores tiene
N, sino que se desea conocer tan solo si existe al menos uno. De cumplirse esto ¶ultimo, ya
puede asegurarse que N no es primo. Puede mejorarse este algoritmo reescribiendo la parte
repetir mientras de la siguiente manera:
Repetir mientras (div considerado < N) y (Cant de divs hallados = 0)
Si (N // div considerado = 0
entonces Cant de divs hallados à Cant de divs hallados + 1
div considerado à div considerado + 1
De esta forma, tan pronto como el algoritmo encuentre un divisor para N, se incremen-
tar¶a el valor de \Cant de divs hallados", y en consecuencia se detendr¶a el ciclo Repetir
mientras.
Los datos booleanos brindan una alternativa elegante para resolver el problema anterior.
Se introducir¶a un dato \ElNroEsPrimo", que inicialmente ser¶a \verdadero". Se ensayar¶an
{34{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
todos los divisores posibles, y si alguno de ellos divide a N , el dato \ElNroEsPrimo" tomar¶a
valor \falso".
{35{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
booleanos utilizadas de esta manera se denominan \banderas" (en ingl¶es \°ags"). Un dato
\bandera" permite expresar ciertas condiciones de manera m¶as sint¶etica y clara al escribir un
algoritmo. Los datos \bandera" no siempre son necesarios; la conveniencia de su utilizaci¶on
es algo que fundamentalmente se aprende con la pr¶actica.
Nota: Al elaborar algoritmos, es usual omitir las palabras \verdadero" y \falso" dentro
de una condici¶ on. Ej: en lugar de escribir \Si DeboSeguir=verdadero entonces...", suele
escribirse simplemente \Si DeboSeguir entonces...". An¶alogamente, en lugar de escribir \Si
DeboSeguir=falso entonces...", suele escribirse \Si no(DeboSeguir) entonces....". Lo mismo
puede aplicarse a la condici¶on asociada a una estructura repetir-mientras. Esta forma de
expresar las condiciones permite muchas veces una lectura m¶as \¶agil" de los pasos asociados
a un algoritmo.
Supongamos que se quiere escribir un algoritmo que reconozca si una fecha expresada me-
diante tres datos d¶³a, mes y a~
no es una fecha v¶alida. As¶³, por ejemplo, la fecha 20-7-1969
10
(correspondiente a dia=20, mes=7 y a~ no =1969) es una fecha v¶alida. No ser¶an fechas
v¶alidas 31-11-1987 (pues noviembre tiene 30 d¶³as) ni tampoco 14-13-1980 (ya que el n¶umero
del mes debe ser menor o igual a 12).
Nota: los meses con 30 dias son el mes 4, 6, 9 y 11. Los dem¶as tienen 31 d¶³as, excepto
el mes 2 que tiene 28 d¶³as. Se asume que el a~
no a considerar es un a~no v¶alido y que no es
bisiesto.
Para resolver el problema anterior, puede escribirse el siguiente algoritmo:
Algoritmo EsFechaValida
d.e.: dia, mes
d.s.: verdadero si dia y mes corresponden a una fecha valida; falso en caso contrario fObs:
no se consideran a~nos bisiestos; incluir dicha consideraci¶on queda como ejercicio adicional
para el lector.g
Si (dia>=1) y (((dia<=31) y ( (mes=1) o (mes=3) o (mes=5) o
(mes=6) o (mes=8) o (mes=11) o (mes=12) )) o ((dia<=30) y ( (mes=4) o
(mes=7) o (mes=9) o (mes=10)) ) o ((dia<=28) y (mes=2)))
entonces
EsFechaValida à verdadero
sino
EsFechaValida à falso
No cabe duda que lo anterior resulta engorroso, ya que es dif¶³cil determinar si la condi-
ci¶on asociada a la estructura si - entonces est¶a expresada correctamente. Por otro lado,
10
Este es el d¶³a en que el hombre lleg¶o por primera vez a la Luna.
{36{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
si alguien quisiera interpretar qu¶e signi¯ca la condici¶on anterior, deber¶a analizar cuidado-
samente todas las expresiones en las que aparecen operadores \y" y \o"; es evidente que el
signi¯cado de la condici¶on no salta a simple vista.
A ¯n de expresar esta condici¶on de una manera m¶as clara y sencilla, podemos introducir
datos booleanos (tambi¶en llamadas datos condicionales). Un dato booleano es aquel que
puede almacenar el \resultado" de una condici¶on (esto es, verdadero o falso). As¶³, por
ejemplo, puede escribirse la asignaci¶on:
EsUnDiaValido à (dia>=1) y (dia<=31)
Esto debe interpretarse de la siguiente manera: evaluar la condici¶on \(dia>=1) y
(dia<=31)" y almacenar posteriormente el resultado de dicha evaluaci¶on en el dato
EsUnDiaValido. En este caso, el dato EsUnDiaValido almacenar¶a el valor \verdadero"
si la condici¶on \(dia>=1) y (dia<=31)" es verdadero; EsUnDiaValido almacenar¶a el valor
falso si la condici¶on es falsa (es decir, en caso que el valor de \dia" sea menor que 1 o mayor
que 31). Ahora se analizar¶a c¶omo puede reescribirse la condici¶on del algoritmo anterior con
auxilio de datos booleanos.
EsDiaValido à (dia>=1) y (dia<=31)
EsMesDe31Dias à (mes=1) o (mes=3) o (mes=5) o (mes=7) o (mes=8) o (mes=11) o
(mes=12)
EsMesDe30Dias à (mes=4) o (mes=6) o (mes=9) o (mes=10)
EsMesDe28Dias à (mes=2)
EsFechaAceptable à EsDiaValido y
( ((dia<=31) y (EsMesDe31Dias)) o
((dia<=30) y (EsMesDe30Dias)) o
((dia<=28) y (EsMesDe28Dias)) )
EsFechaValida à EsFechaAceptable
Se mencion¶o anteriormente que una dato booleano puede almacenar el resultado de eva-
luar una condici¶on. En particular, al escribir algoritmos, puede asign¶arsele directamente a
un dato booleano los valores \verdadero" o \falso". Estos valores pueden pensarse como
si fueran condiciones \constantes". Ejemplo: \AÃ verdadero", \BÃ falso". Esto puede
pensarse como algo equivalente a realizar asignaciones tales como \AÃ (2=2)" y \BÃ 16=1",
respectivamente. La utilidad de realizar asignaciones del tipo \AÃ verdadero" se ver¶a m¶as
adelante, en el inciso que trata el uso de datos booleanos como banderas.
{37{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
Si C () Si no(C)
entonces S1 entonces S2
sino S2 sino S1
Repetir mientras C () Si C
S entonces
Repetir
S
Hasta no(C)
Repetir () S
S Repetir mientras no(C)
Hasta C S
Los ejemplos que siguen ilustran las equivalencias antes enunciadas. En cada caso, el
trozo de algoritmo que ¯gura en el lado izquierdo es equivalente a al que ¯gura en el lado
derecho.
{38{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Si A=3 Si no(A=3)
entonces entonces
mostrar \A vale 3" mostrar \A no vale 3"
sino sino
mostrar \A no vale 3" mostrar \A vale 3"
CÃ1 CÃ1
Repetir mientras C< 10 Si C< 10
mostrar C entonces
CÃC+1 Repetir
mostrar C
CÃC+1
Hasta no(C<10)
CÃ1 CÃ1
Repetir mostrar C
mostrar C CÃC+1
CÃC+1 Repetir mientras no(C=10)
Hasta C=10 mostrar C
CÃC+1
A continuaci¶on se analizar¶a una serie de propiedades de los operadores l¶ogicos, que pueden
resultar de ayuda en el momento de veri¯car el comportamiento correcto de un algoritmo.
Consid¶erese los siguientes trozos de c¶odigo:
(a) (b)
Si (2=3) y C2 y C3 y C4 Si (2=2) o C2 o C3 o C4
entonces entonces
Acci¶on A Acci¶on B
{39{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
Debe tenerse precauci¶on con aquellas condiciones que, independientemente de los valores de
los datos que intervienen en ellas, tienen siempre un valor predeterminado (\verdadero" o
\falso"). Este tipo de condiciones debe evitarse.
Si bien resulta obvio que \2=2" siempre es verdadero, y que \2=3" es falso, hay casos
m¶as sutiles y no tan f¶acilmente detectables. Ejemplo: en el siguiente trozo de algoritmo,
la parte entonces... nunca se ejecutar¶a, ya que es imposible que un n¶umero sea primo y
sea par (asumiendo que el n¶ umero es mayor que 2).
Seg¶un lo enunciado anteriormente, es claro que esto resulta ser independiente de si las
condiciones C3,C4 , . . . Cn son verdaderas o falsas.
{40{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 4.1 Realice una traza para los siguientes bloques de acciones. Indique claramente
cu¶ales ser¶³an los valores ¯nales para cada uno de los datos en cada caso.
Ejercicio a Ejercicio b Ejercicio c Ejercicio d
aÃ0 aÃ0 a à b+1 aà 2
bÃ1 a à a+1 bÃ0 a à a*2
a à a+1 a à a+1 a à a*2
bÃa a à a+1 a à a*a
Ejercicio e Ejercicio f Ejercicio g Ejercicio h
aÃ1 aÃ0 aÃ1 Si a à 0
a à a*a b à a+1 Si a 6=0 entonces
Si a>0 Si a>b entonces bÃ1
entonces b à a+1 entonces b à a bÃ1 bÃ3
b à b*b sino Si b=1+2
bÃ2 entonces
Si b=2 aÃ1
entonces
cÃ1
sino
cÃ0
{41{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
Ejercicio 4.2 Realice una traza para los siguientes bloques de acciones. Indique claramente
cu¶ales ser¶³an los valores ¯nales para cada uno de los datos en cada caso.
Ejercicio a Ejercicio b
aÃ0 aÃ0
bÃ1 bÃ1
Repetir mientras (a <3) y (b=0) Repetir a*a veces
a à a+1 a à a-1
b à b*b b à b+1
a à a+1
Ejercicio c Ejercicio d
aÃ0 aÃ0
bÃ0 bÃ0
Repetir mientras (a < 3) o (b=0) Repetir
a à a+1 a à a*a
b à b*b Hasta (a>3) y (b>5)
Ejercicio 4.3 Utilizando como primitivas las operaciones *, +, - y /, escriba algoritmos que
implementen las siguientes primitivas:
{42{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Obs.: el operador \/" representa la divisi¶on. Cuando se lo aplica a dos enteros Z1 y Z2, Z1
/ Z2 corresponde a la divisi¶on entera entre Z1 y Z2. Cuando se los aplica a reales R1 y R2,
la divisi¶on R1 / R2 corresponde a la divisi¶on real.
Ejercicio 4.4 Escriba un algoritmo para hallar y mostrar todos los numeros de la forma
aabb, donde a y b son d¶³gitos, tal que aabb sea cuadrado perfecto. Obs.: a debe ser distinto
de b.
Ejercicio 4.5 Escriba un algoritmo que reciba como entrada un n¶umero natural N y diga
si es o no capic¶ua. Un n¶umero N formado por los d¶³gitos d1d2 : : : dk es capic¶
ua si el n¶
umero
dk dk¡1 : : : d2d 1 es igual a N . Ejemplo: 1,7, 131, 212, 5005 son capic¶
uas.
Ejercicio 4.6 Escriba un algoritmo que muestre todos los capic¶uas entre 0 y 1000.
Ejercicio 4.7 Escriba un algoritmo que muestre todas las palabras de cuatro letras que se
pueden armar con las letras c, e, p, y a. Obs.: se asume que una \palabra" es una secuencia
cualquiera de las cuatro letras dadas, posiblemente repetidas. Ej: ecpa, ppca y eeee son
algunas de las palabras que deben mostrarse.
Ejercicio 4.8 Escriba un algoritmo que indique si dos n¶ umeros a y b son \parientes". Se
dice que a es \pariente" de b si la suma de los d¶³gitos de a2 es igual a b, y la suma de los
d¶³gitos de b2 es igual a a. Ejemplo: 13 y 16 son parientes, ya que 132 = 169, y 1 +6 +9 = 16
y rec¶³procamente 162 = 256, y 2 + 5 + 6 = 13.
Ejercicio 4.9 Escriba algoritmos que permitan sumar los n primeros t¶erminos de las si-
guientes series:
a) 1 + 3 + 5 + 7 + : : : + 2k + 1 + : : :
b) 1 ¡ 3 + 5 ¡ 7 + : : : + (¡1)k2k + 1 + : : :
Ejercicio 4.10 Escriba un algoritmo para que dadas dos fechas expresadas como d1; m1; a1
y d2; m2; a 2, se obtenga como dato de salida la cantidad de d¶³as transcurridos entre ambas
fechas.
Ejemplo:
{43{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
Puede asumirse que las fechas dadas son posteriores al 1/1/1900, que la fecha d2 =m2=a2
es posterior a d1=m1=a1 , y que se dispone de la primitiva EsBisiesto, que indica si un a~
no
es bisiesto o no.
1 x2 x3 x4 x5
1 ¡ x1! + 2! ¡ 3! + 4! ¡ 5! ¢¢¢
para un valor de x cualquiera, con una \aproximaci¶on" de 0.001 en el resultado (es decir, si
Sk es la suma de los primeros k t¶erminos, y Sk+1 es la suma de los primeros k + 1 t¶erminos,
la diferencia en valor absoluto entre Sk y Sk+1 debe ser menor que 0.001).
Ejercicio 4.12 Escriba un algoritmo que calcule el primer n¶umero primo de forma abc,
donde a < b < c. Si no existe ningun primo de esa forma, el algoritmo deber¶a devolver 0
como dato de salida.
Ejercicio 4.13 Dado un n¶ umero N, indique el primer M > N tal que M sea m¶
ultiplo de 3
o bien M sea m¶ultiplo de 5.
Ejercicio 4.14 Escriba un algoritmo que permita hallar la suma S de todos los numeros
primos p comprendidos entre dos enteros N y M , tales que N < p < M . Ejemplo: si
N = 10 y M = 20, S = 11 + 13 + 17 + 19:
Ejercicio 4.16 El Tercer Teorema de Fermat enuncia que no existen n¶umeros enteros x,y,z,
tales que para un n¶umero natural n, n > 2, se veri¯que que xn + y n = z n . Sin embargo, el
matem¶atico franc¶es Pierre Fermat (1601-1665) tan s¶olo enunci¶³o el teorema anterior, pero
no pudo demostrarlo . . . (seg¶
un ¶el, porque la hoja que ten¶³a en ese momento no le alcanzaba).
Quiz¶as el teorema sea falso. Para asegurar eso habr¶³a que encontrar un contraejemplo, esto
{44{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 4.17 Escriba un algoritmo que indique si dos n¶umeros naturales N y M est¶an
formados por los mismos d¶³gitos. Ejemplo: 321 y 213; 599 y 995; 45 y 554 est¶an formados
por los mismos d¶³gitos.
Ejercicio 4.18 Escriba un algoritmo que encuentre la mayor potencia de 2 que divide exac-
tamente a 100!. Es decir, debe hallar el valor k m¶as grande posible tal que 100! es divisible
por 2k. Pista: piense que 100! est¶a compuesto por factores que van desde 1 a 100, y cada
factor a su vez puede \factorearse". . .
Generalice el ejercicio anterior escribiendo un algoritmo que encuentre la mayor potencia
de un n¶umero N que divida exactamente a un valor M !.
Ejercicio 4.19 Escriba un algoritmo que dado un n¶ umero natural N, devuelva un nuevo
n¶umero natural M , tal que M est¶e formado por los d¶³gitos de N ordenados de menor a
mayor. Ejemplo: si N = 7124, entonces M ser¶a 1247; si N = 2231, entonces M ser¶a 1223.
Ejercicio 4.20 Escriba un algoritmo que dados dos n¶umeros naturales N y M , diga si M
est¶a contenido en N. Un n¶
umero M se dice contenido en otro N si la secuencia de los d¶³gitos
de M aparece consecutivamente dentro de la secuencia de los d¶³gitos de N. Ejemplo: 12
est¶a contenido en 2123 ; 12 no est¶a contenido en 2132; 103 est¶a contenido en 93103 ; 31
est¶a contenido en 93103. Atenci¶on: Aseg¶ urese que el algoritmo que haya escrito funcione
correctamente en casos como los siguientes: N = 321421 y M = 321; N = 32321 y M = 321.
Ejercicio 4.21 La conjetura de Goldbach expresa que todo n¶umero natural par puede ex-
presarse como la suma de dos naturales primos. Ejemplo: 18 = 11 + 7, 20 = 17 + 3,
30 = 11 + 19. Por ser una \conjetura" y no un \teorema", el enunciado anterior podr¶³a lle-
gar a ser falso. Es decir, nadie ha demostrado que lo anterior siempre se cumple, pero nadie
tampoco ha encontrado un contraejemplo. Escriba un algoritmo que devuelva verdadero
en caso de que la conjetura de Goldbach se veri¯que para todos los n¶umeros pares entre 100
y 1000, y falso en caso contrario.
{45{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
Ejercicio 4.1
a) a b b) a c) a b d) a
0 ? 0 ? ? 2
0 1 1 ? 0 4
1 1 2 8
1 1 3 64
e) a b f) a b g) a b c h) a b
1 ? 0 ? 1 ? ? 0 ?
1 ? 0 1 1 1 ? 0 1
1 2 1 1 0 0 1
1 4 0 3
1 3
i) a b j) a k) a i l) i
0 ? ? 3 ? 0
1 2 ? 3 1
2 4 ? 9 1
3 6 9 2
4 8 81 2
81 3
6561 3
6561 4
m) a n) b i o) i p) i j
1 ? 0 0 1 1
2 0 0 1 1 2
3 1 0 2 2 2
2 0 3 2 2
2 1 ... 2 1
0 1 2 2
1 1 3 2
2 1
2 2
{46{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 4.2
a) a b b) a b c) a b d) a b
0 ? 0 ? 0 ? 0 ?
0 1 0 1 0 0 0 0
1 1 1 0 1 0
1 0 2 0
2 0 ... ...
2 0
3 0
3 0
4 0
... ...
N¶otese que en los casos a) y b), el ciclo repetitivo no se realiza en absoluto; los casos c) y d)
el bloque de acciones se ejecuta un n¶ umero in¯nito de veces.
Ejercicio 4.3
Nota: para muchos nombres de variables se utiliz¶o el caracter \ " (denominado \underscore"
en ingl¶es). Este caracter se utiliza usualmente en computaci¶on para armar nombres de varia-
bles con varias palabras (Ejemplo: numero inicial, cant primos). Dado que dicho carac-
ter se confunde en ciertos casos con el subrayado que aparece en el texto, en algunos casos se
lo sustituy¶o por un gui¶on \-". (As¶³, en lugar de escribir por ejemplo Iesimo digito, aparece
Iesimo-Digito). Otra alternativa utilizada fue crear un nombre de variable concatenando
(esto es, ubicando consecutivamente) distintas palabras. Ejemplo: CantPrimosHallados,
NumeroHallado, etc. En tales casos, se utilizaron letras may¶usculas en el comienzo de cada
palabra para facilitar distinguirlas unas de otras.
Algoritmo EsDivisiblePor
d.e.: Nro, DivisorPosible
d.s.: verdadero si Nro es divisible por DivisorPosible; falso en caso
contrario
Si DivisorPosible = 0
entonces
ERROR ``Division por cero no esta definida''
sino
Si (Nro / DivisorPosible)*DivisorPosible = Nro
entonces
EsDivisiblePor à VERDADERO
sino
EsDivisiblePor à FALSO
{47{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
Algoritmo ValorAbsoluto
d.e.: Nro fcorresponde a un valor enterog
d.s.: V fel valor absoluto de Nrog
Si Nro>=0
entonces
V Ã Nro
sino
V Ã -Nro
Algoritmo RaizCuadradaEntera
d.e.: Nro fNro es un n¶u mero naturalg
d.s.: Raiz fcorresponde a la ra¶ ³z cuadrada entera de Nrog
i à 0
Repetir mientras i*i<Nro
i à i + 1
Raiz à i-1
Algoritmo EsCuadradoPerfecto
d.e.: Nro fes un n¶umero naturalg
d.s.: Verdadero si Nro es un cuadrado perfecto; falso en caso contrario.
RaizDeNro à RaizCuadradaEntera(Nro)
Si RaizDeNro*RaizDeNro = Nro
entonces
EsCuadradoPerfecto à VERDADERO
sino
EsCuadradoPerfecto à FALSO
Algoritmo Resto
d.e.: Dividendo,Divisor
d.s.: Resto fes el resto de la division Dividendo / Divisorg
Si Divisor = 0
entonces
ERROR ``Division por cero no est¶
a definida''
sino
Resto à Dividendo - (Dividendo / Divisor)*Divisor
Algoritmo Potencia
d.e.: Base, Exponente fBase es entera; Exponente es naturalg
{48{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Algoritmo CantidadDeCifras
d.e.: N fn¶u mero natural mayor que 0g
d.s.: Cant fcantidad de digitos de Ng
i à 0
Nro à N
Repetir mientras (Nro>0)
Nro à Nro / 10
i à i + 1
Cant à i
Algoritmo Iesimo-Digito
d.e.: i, N
d.s.: Digito fel d¶³gito que ocupa la posicion i-esima en N, contando desde
la izquierda. Ej: para i=2, N=3478, Digito es 7g
Divisor à Potencia(10,i-1)
NroAuxiliar à N / Divisor
Digito à Resto(NroAuxiliar, 10)
Ejercicio 4.4
Algoritmo HallarAABB
d.e.: ninguno
d.s.: muestra todos los numeros de la forma aabb que son cuadrados perfectos
{49{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
a à 1 fa var¶ ³a entre 1 y 9g
Repetir Mientras a<=9
b à 0
Repetir Mientras b<=9 fb var¶ ³a entre 0 y 9g
Si a<>b
entonces
Numero à ArmarNumero(a,b)
Si CuadradoPerfecto(Numero)=VERDADERO
entonces
mostrar Numero
b à b + 1
a à a + 1
Algoritmo ArmarNumero
d.e.: a y b fvalores enterosg
d.s.: nro fde la forma aabbg
Nro = a*1000 + a*100 + b*10 + b
fObservacion:el algoritmo para CuadradoPerfecto figura en un ejercicio
anteriorg
Ejercicio 4.5
Una estrategia a aplicar puede ser la siguiente: dado un n¶umero d k : : : d1, se asume primero
que el n¶umero es capic¶ua, usando una variable EsCapicua a la que le asigna verdadero.
Se calcula luego la posici¶on del primer y el ¶ultimo d¶³gito, y se las almacena en variables
Izquierda y Derecha respectivamente. Se comparan los d¶³gitos que est¶an en esas posiciones.
Si son iguales, se incrementa Derecha y se decrementa Izquierda, y se sigue comparando.
Si son distintos, a EsCapicua se le asigna el valor falso. El proceso de comparar d¶³gitos
se repite hasta que las variables Izquierda y Derecha se \crucen", o EsCapicua llegue a
tener valor falso.
Algoritmo EsCapicua
d.e.: N fn¶
u mero naturalg
d.s.: verdadero si N es capic¶
u a; falso en caso contrario.
{50{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
CantDigitos à CantidadDeCifras(N)
Derecha à 1
Izquierda à CantDigitos
EsNroCapicua à verdadero
Repetir Mientras (Derecha>Izquierda) y (EsNroCapicua=verdadero)
DigDer à Iesimo-Digito(Derecha,N)
DigIzq à Iesimo-Digito(Izquierda,N)
EsNroCapicua à (DigDer = DigIzq)
Derecha à Derecha + 1
Izquierda à Izquierda -1
Si EsNroCapicua=verdadero
entonces
EsCapicua à VERDADERO
sino
EsCapicua à FALSO
Ejercicio 4.6
Algoritmo Capicuas
d.e.: ninguno
d.s.: muestra todos los capic¶
u as entre 0 y 1000
NumeroEnCurso à 1
Repetir mientras (NumeroEnCurso<1000)
Si EsCapicua(NumeroEnCurso)=verdadero
entonces
mostrar NumeroEnCurso
NumeroEnCurso à NumeroEnCurso + 1
Ejercicio 4.7
Este ejercicio es an¶alogo a generar todos los n¶umeros posibles que pueden obtenerse a partir
de 4 d¶³gitos distintos (p.ej: 1,2,3 y 4), considerando la posibilidad de que haya d¶³gitos
repetidos. Habiendo hecho esto, necesitar¶³amos hacer corresponder cada d¶³gito con una de
las letras dadas (c,e,p,a). Un algoritmo para generar los n¶ umeros anteriores ser¶³a:
Algoritmo GenerarNumeros
d.e.: ninguno
d.s.: muestra todos los n¶
umeros de 4 d¶
³gitos que pueden formarse a partir de
1,2,3 y 4.
a à 1
Repetir mientras (a<=4)
{51{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
b à 1
Repetir mientras (b<=4)
c à 1
Repetir mientras (c<=4)
d à 1
Repetir mientras (d<=4)
Numero à ArmarNumero(a,b,c,d) (*)
mostrar Numero (*)
d à d+1
c à c + 1
b à b + 1
a à a + 1
Algoritmo ArmarNumero
d.e.: a,b,c,d fdigitosg
d.s.: Numero fformado por los digitos a,b,c,d,g
Numero à a*1000 + b*100 + c*10 + d
Para generar todas las palabras posibles con las letras dadas, simplemente debemos reem-
plazar la parte marcada con (*) por la llamada a primitiva MostrarPalabra(a,b,c,d). La
primitiva MostrarPalabra puede escribirse como sigue:
Algoritmo MostrarPalabra
d.e.: a,b,c,d fvariables que contienen valores num¶ ericosg
d.s.: muestra en pantalla una palabra de cuatro letras
MostrarLetra(a)
MostrarLetra(b)
MostrarLetra(c)
MostrarLetra(d)
Algoritmo MostrarLetra
d.e.: N
d.s.: muestra la letra 'c', 'e','p' o 'a', seg¶
un el valor de N
Si N = 1
entonces
mostrar 'c'
sino
{52{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Si N=2
entonces
mostrar 'e'
sino
Si N=3
entonces
mostrar 'p'
sino
Si N=4
entonces
mostrar 'a'
Ejercicio 4.8
Algoritmo NrosParientes
d.e.: A,B fA,B 2 Naturales, inclu¶³do el 0g
d.s.: verdadero si A es ``pariente'' de B; falso en caso contrario
A2 Ã A*A
B2 Ã B*B
CantDigiA2 Ã CantidadDeCifras(A2)
CantDigiB2 Ã CantidadDeCifras(B2)
n1 Ã 1
SumaDigitosA2 Ã 0
Repetir mientras (n1<=CantDigiA2)
Digitoi à Iesimo-Digito(A2,n1)
SumaDigitosA2 Ã SumaDigitosA2 + Digitoi
n1 Ã n1 + 1
n2 Ã 1
SumaDigitosB2 Ã 0
Repetir mientras (n2<=CantDigiB2)
Digitoi à Iesimo-Digito(B2,n2)
SumaDigitosB2 Ã SumaDigitosB2 + Digitoi
n2 Ã n2 + 1
NrosParientes à (SumaDigitosA2 = SumaDigitosB2)
Ejercicio 4.9
Inciso a:
Algoritmo Serie
{53{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
d.e.: n fcantidad de t¶
erminos a sumarg
d.s.: Suma fsuma de los n primeros t¶
erminosg
Suma à 0
i à 1
Repetir mientras (i<=n)
TerminoIesimo à Termino(i)
Suma à Suma + TerminoIesimo
i à i + 1
Algoritmo Termino
d.e.: i
d.s.: T fvalor del t¶
e rmino i-esimo de la serieg
T Ã 2*i+1
Inciso b:
Puede utilizarse el algoritmo Serie antes de¯nido. El algoritmo Termino deber¶a rede¯nirse
como sigue:
Algoritmo Termino
d.e.: i
d.s.: T ft¶
ermino i-esimo de la serieg
Signo à Potencia(-1,i)
factor à 2*i+1
T Ã signo*factor
Moraleja: para sumar los n primeros t¶erminos de una serie, puede usarse por lo general un
algoritmo b¶asico Serie, adaptando {seg¶un el caso{ la de¯nici¶on del algoritmo Termino.
Ejercicio 4.10
Para calcular los d¶³as transcurridos entre d1/m1/a1 y d2/m2/a2, se va a hacer lo siguiente:
primero, se calculan los d¶³as transcurridos entre d2/m2/a2 y 1/1/1900 (se llama a esto Cant2).
Luego se calculan los d¶³as transcurridos entre d1/m1/a1 y 1/1/1900 (se llama a esto Cant1).
Luego se calcula CantDias como el valor absoluto de Cant2 - Cant1.
La fecha \base" (en este caso 1/1/1900) puede ser cualquiera. En este caso, el algoritmo
sirve para cualquier fecha del siglo xx en adelante (lo que a ¯nes pr¶acticos es su¯ciente).
Alternativamente, podr¶³a haberse elegido como fecha \base" cualquier primero de enero de
un a~no dado.
Se de¯nir¶an los siguientes algoritmos auxiliares
Algoritmo DiasDeA~
no
d.e.: a~
no fnro. de a~
nog
{54{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
d.s.: DiasA~
no fla cantidad de d¶
³ as que tiene el a~
nog
Si EsBisiesto(a~
no)=verdadero
entonces
no à 366
DiasA~
sino
no à 365
DiasA~
Algoritmo DiasDeMes
d.e.: mes, a~
no fnro. del mesg
d.s.: DiasMes fcantidad de d¶³ as que tiene el mes en ese a~
nog
Si Mes=2
entonces
Si EsBisiesto(a~
no)=verdadero
entonces DiasMes à 29 ffebrero tiene 29 d¶ ³asg
sino DiasMes à 28
Si Mes=1 o Mes=3 o Mes=5 o Mes=7 o Mes=8 o Mes=10 o Mes=12
entonces DiasMes à 31 fes mes de 31 d¶ ³asg
sino DiasMes à 30 fes mes de 30 d¶ ³asg
Algoritmo DiasEnSigloXX
fcalcula la cantidad de d¶³as entre una fecha y 1/1/1900g
d.e.: d, m, a fd¶
³a mes y a~n og
d.s.: CantDias fd¶
³ as entre d,m,a y 1/1/1900g
d1 Ã d fse almacena primero todo en variables auxiliaresg
m1 Ã m
a1 Ã a
CantDias à 0; fse inicializa CantDias en 0g
Repetir Mientras a1>1900
a1 Ã a1-1 fse cuentan d¶ ³ as de los a~
nos desde a1-1 hasta 1900g
CantDias à CantDias + DiasDelAno(a1) fidem con los mesesg
Repetir Mientras m1>1
m1 Ã m1-1
CantDias à CantDias + DiasDelMes(a1,m1) fidem con d¶ ³asg
Repetir Mientras d1>1
d1 Ã d1-1
CantDias à CantDias + 1
Algoritmo DiasEntreFechas
fCalcula la cantidad de d¶³as entre dos fechas dadas d1/m1/a1 y d2/m2/a2 g
d.e.: d1,m1,a1 d2,m2,a2 flas dos fechasg
d.s.: CantDias fcantidad de d¶³as transcurridosg
{55{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
Ejercicio 4.11
Se de¯nen primeramente los siguientes algoritmos auxiliares
Algoritmo Factorial
d.e.: n fn¶
u mero enterog
d.s.: Fac fEl valor n!g
Fac à 1
Naux à n
Repetir Mientras Naux>1
Fac à Fac * Naux
Naux à Naux - 1
Algoritmo Termino
d.e.: Num,Den fnumerador,denominadorg
d.s.: Cociente fel cociente entre numerador y denominadorg
f...El cuerpo del algoritmo queda a cargo del lector ...g
Algoritmo SumaSerie
d.e.: x fvalor de x a utilizarg
d.s.: Aprox fresultado de la serie para xg
AproxActual à 1 fla primer aproximaci¶ on es 1g
signo à -1 fel signo empieza siendo negativog
i à 1 fi es el ¶ ³ndice para cada t¶
erminog
EncontreAproximacion à falso fse asume que 1 no es la aprox. buscadag
Repetir
Numerador à Potencia(x,i)
Denominador à Factorial(x,i)
NuevoTermino à Termino(Numerador,Denominador)
AproxNueva à AproxActual + Signo*NuevoTermino
Signo à Signo * (-1) fSe cambia el signog
i à i + 1
Epsilon à ValorAbsoluto(AproxNueva-AproxActual)
Si Epsilon<0.001
entonces EncontreAproximacion à verdadero
Hasta EncontreAproximacion=verdadero
Aprox à AproxNueva
{56{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Ejercicio 4.12
La estrategia ser¶a la siguiente: se va a suponer que no hay ning¶ un primo N de la forma
pedida, es decir, N = 0. Se van a armar todos los numeros posibles entre 100 y 999, y si
alguno de ellos es primo de la forma que se pide, ese ser¶a el valor de N . Los numeros entre
100 y 999 se ir¶an armando siempre y cuando N sea 0 (es decir, si todav¶³a no se encontr¶o
el primo que se busca). Si se llega a encontrar el primo N, entonces debe detenerse la
b¶usqueda.
Algoritmo PrimoABC
d.e.: ninguno
d.s.: N fnro. primo de la forma abc seg¶ u n el enunciado, o 0 si no hay
ning¶un primo como el que se pideg
N Ã 0 fse asume en principio que no existe un primo como el pedidog
a à 1 fa son las centenasg
Repetir
b à a+1 fb son las decenas, que van de a + 1 hasta 9 g
Repetir
c à b+1 f c las unidades, que van de b + 1 hasta 9g
Repetir
Naux à a*100 + b*10 + c
Si EsPrimo(Naux)=verdadero
entonces fqueda como ejercicio escribir EsPrimog
N Ã Naux
sino
c à c + 1
Hasta (c>9) o (EsPrimo(N)=verdadero)
b à b + 1
Hasta (b>9) o (EsPrimo(N)=verdadero)
a à a + 1
Hasta (a>9) o EsPrimo(N)=verdadero
Obs.: la primitiva EsPrimo(N) deber¶³a devolver falso para N = 0, para que el algoritmo
anterior funcione correctamente. Por razones de e¯ciencia (que se ver¶an m¶as adelante),
resulta conveniente sustituir dicha condici¶on por N > 0 en el texto del algoritmo. Esta
¶ultima condici¶on es equivalente a EsPrimo(N) a los ¯nes del funcionamiento correcto del
algoritmo.
Ejercicio 4.13
Algoritmo PrimerM
d.e.: n
d.s.: m
Maux à n
{57{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
Ejercicio 4.14
Se de¯ne primero el siguiente algoritmo auxiliar:
Algoritmo ProximoPrimo
fdevuelve el pr¶o ximo primo mayor que ng
d.e.: n fnro enterog
d.s.: ProxPri f1er nro primo p > ng
EncontrePrimo à falso
Naux à n + 1
Repetir
Si EsPrimo(Naux)=verdadero
entonces
ProxPri à Naux
EncontrePrimo à verdadero
sino
Naux à Naux + 1
Hasta (EncontrePrimo = verdadero)
Algoritmo SumaPrimos
d.e.: n, m flos valores N y M del enunciadog
d.s.: Suma fla suma de primos p tales que N < p < M g
Suma à 0
Indice à n + 1
Repetir Mientras Indice<M
NroPrimo à ProximoPrimo(Indice) fse busca el proximo primog
Suma à Suma + NroPrimo fy se sigue buscando, a partirg
Indice à NroPrimo fdel pr¶ og
oximo primo que se encontr¶
Ejercicio 4.15
Los s¶³mbolos romanos a usar ser¶an I, V, X, L, C, D, y M. Puede establecerse la siguiente
{58{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Algoritmo DigitoRomano
d.e.: Dig, Simbolo1, Simbolo2, Simbolo3
d.s.: muestra Digito en nros. romanos usando los Simbolos anteriores
Si (Dig>=5) y (Dig<9)
entonces
mostrar Simbolo2
Dig à Dig-5
Si (Dig>0) y (Dig<4)
entonces
ià 1
Repetir mientras (i<=Dig)
Mostrar Simbolo1
Digà Dig-1
Si (Dig=4)
entonces Mostrar Simbolo1,Simbolo2
Si (Dig=9)
entonces Mostrar Simbolo1,Simbolo3
Algoritmo DescomponerNro
d.e.: N fn¶u mero naturalg
d.s.: Centena, Decena, Unidad fdescomposici¶
o n en digitos de Ng
Centena à n / 100
Decena à (n-Centena*100) / 10
Unidad à (n-Centena*100-Decena*10)
Algoritmo ArmarNroRomano
d.e.: N fn¶u mero naturalg
d.s.: muestra n¶umero romano correspondiente a N
DescomponerNro(N,Cen,Dec,Uni)
{59{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
DigitoRomano(Cen,'C','D','M')
DigitoRomano(Dec,'X','L','C')
DigitoRomano(Uni,'I','V','X')
Ejercicio 4.16
Algoritmo Fermat
d.e.: ninguno
d.s.: VERDADERO si el teorema se cumple para los valores probados, FALSO en
caso contrario.
SeCumple à verdadero
n à 3
Repetir mientras (N<5) y (SeCumple=verdadero)
x à 0
Repetir mientras (x<20) y (SeCumple=verdadero)
y à 0
Repetir mientras (y<20) y (SeCumple=verdadero)
z à 0
Repetir mientras (z<20) y (SeCumple=verdadero)
x-elev-n à Potencia(x,n)
y-elev-n à Potencia(y,n)
z-elev-n à Potencia(z,n)
SeCumple à (x-elev-n + y-elev-n) <> (z-elev-n)
z à z + 1
y à y + 1
x à x + 1
n à n + 1
Si SeCumple = FALSO
entonces
Fermat à FALSO
sino
Fermat à VERDADERO
Ejercicio 4.17
Dados N y M , dos n¶ umeros naturales, se veri¯car¶a por doble inclusi¶on que los d¶³gitos de
N son los mismos que los de M . Esto es: se ver¶a que los d¶³gitos de N est¶an contenidos
en los d¶³gitos de M , y viceversa. La estrategia ser¶a la siguiente: Se supone al principio
que N y M tienen los mismos d¶³gitos. Esto se lo representa con una variable booleana
TienenLosMismosDigitos a la cual le asigna valor verdadero. Se toma N, y se veri¯ca
que cada d¶³gito de N aparezca en M . Luego se toma M , y se veri¯ca que cada d¶³gito de M
aparezca en N. Si en alg¶un punto llega a darse el caso que hay un d¶³gito de un n¶umero que
no aparece en el otro n¶umero, entonces a TienenLosMismosDigitos se le asigna falso.
Algoritmo NumerosConDigitosIguales
{60{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
d.e.: N, M
d.s.: VERDADERO si d¶
³gitos de N son los mismos que d¶
³gitos de M FALSO en caso
contrario
TienenLosMismosDigitosà verdadero
CantN Ã CantidadDeCifras(N)
CantM Ã CantidadDeCifras(M)
i à 1
Repetir mientras (i<=CantN) y (TienenLosMismosDigitos=verdadero)
d à Iesimo Digito(N,i)
Si (DigitoEnNumero(d,M)=falso)
entonces TienenLosMismosDigitos=falso
i à i + 1
i à 1
Repetir mientras (i<=CantM) y (TienenLosMismosDigitos=verdadero)
dà Iesimo Digito(M,i)
Si (DigitoEnNumero(d,N)=falso)
entonces TienenLosMismosDigitos=falso
i à i + 1
Si TienenLosMismosDigitos=verdadero
entonces
NumerosConDigitosIguales à VERDADERO
sino
NumerosConDigitosIguales à FALSO
El algoritmo auxiliar DigitoEnNumero de¯ne una primitiva que permite veri¯car si dado un
d¶³gito D y un n¶umero N, el d¶³gito D est¶a presente entre los d¶³gitos de N.
Algoritmo DigitoEnNumero
d.e.: Digito, Numero
d.s.: VERDADERO si Digito est¶
a en Numero; FALSO en caso contrario.
DigitoPresente à falso fse supone primero que el d¶ ³ gito no est¶
a presente
en el n¶umerog
Repetir
Cociente à Numero / 10
Resto à Numero - Cociente*10
Si Resto = Digito
entonces DigitoPresente à verdadero
Hasta (Cociente=0) o (DigitoPresente=verdadero)
Si DigitoPresente=verdadero
entonces
DigitoEnNumero à VERDADERO
sino
DigitoEnNumero à FALSO
{61{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
Ejercicio 4.18
Recordemos que 100! es equivalente al producto de todos los naturales consecutivos desde
1 hasta 100, esto es 1:2:3:4: : : : 98:99:100. Para encontrar la mayor potencia de 2 que divide
a 100!, debemos contar la cantidad de veces que el 2 aparece como factor en 100!. Para
esto, debemos contar la cantidad de veces que 2 aparece como factor en la descomposici¶on
de todos los naturales entre 1 y 100. Escribimos el siguiente algoritmo:
Algoritmo MayorPotenciaDe2
d.e.: ninguno
d.s.: exponente fexponente de la m¶
a xima potencia de 2 que divide a 100! g
nro à 2 fse empieza de 2 en adelanteg
exponente à 0
Repetir mientras (nro<=100)
CantApariciones à ContarAparicionDos(nro)
exponente à exponente + CantApariciones
Algoritmo ContarAparicionDos
d.e.: Nro
d.s.: Cant fcantidad de veces que 2 aparece como factor en Nrog
Aux à Nro
Cant à 0
Repetir mientras (EsDivisible(Aux,2)=verdadero) y (Aux>0)
Cant à Cant + 1
Aux à Aux / 2
La generalizaci¶on del algoritmo anterior es directa, y queda como ejercicio para el lector.
Ejercicio 4.19
La estrategia que podemos emplear es la siguiente: buscamos las apariciones de cada d¶³gito
posible, desde el 9 hasta el 1 (el cero no lo consideramos pues no agrega nada al nuevo
n¶umero a formar).
Para cada d¶³gito D, contamos la cantidad K de veces que aparece en N, y D se agrega K veces
a un nuevo n¶ umero Resultado en la posici¶on correspondiente. Ejemplo: si N = 13491,
hacemos lo siguiente
13491 {buscamos d¶³gito 9, y contamos 1 aparici¶on ¡! Resultado=9
13491 {buscamos d¶³gito 8, y contamos 0 aparici¶on ¡! Resultado=9
...
13491 {buscamos d¶³gito 4, y contamos 1 aparici¶on ¡! Resultado=49
13491 {buscamos d¶³gito 3, y contamos 1 aparici¶on ¡! Resultado=349
...
13491 {buscamos d¶³gito 1, y contamos 2 apariciones ¡! Resultado=11349
La posici¶on correspondiente para el nuevo n¶umero la llevamos en una variable
Desplazamiento.
{62{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Algoritmo ObtenerNuevoNumero
d.e.: N
d.s.: M fn¶umero formado a partir de los d¶³ gitos de N ordenados de menor a
mayorg
DigitoEnCurso à 9
Desplazamiento à 0
Resultado à 0
Repetir mientras (DigitoEnCurso>=1)
VecesQueAparece à ContarAparicion(N,DigitoEnCurso)
ià 1
Repetir mientras (i<=VecesQueAparece)
Resultado à Resultado + DigitoEnCurso*Potencia(10,Desplazamiento)
i à i+1
Desplazamiento à Desplazamiento + 1
DigitoEnCurso à DigitoEnCurso + 1
M Ã Resultado
Usamos el algoritmo auxiliar ContarAparicion, el cual recibe como entrada un n¶umero N
y un d¶³gito D, y devuelve la cantidad de veces que el d¶³gito D aparece en N.
Algoritmo ContarAparicion
d.e.: Digito, Numero
d.s.: Veces fcantidad veces Digito aparece en Numerog
Cociente à Numero
Veces à 0
Repetir
Resto à Cociente // 10
Cociente à Cociente / 10
Si Resto = Digito
entonces Veces à Veces + 1
Hasta (Cociente=0)
Ejercicio 4.20
Algoritmo TerminaEnNumero
d.e.: N, M
d.s.: VERDADERO si el n¶
umero N ``termina'' en M; FALSO en caso contrario (ej:
devuelve verdadero para 31234 y 234; 1431 y 31; 93413 y 3413, etc.)
AuxN Ã N
AuxM Ã M
Termina à verdadero
Repetir mientras (AuxM>0) y (Termina=verdadero)
{63{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
DigN Ã Resto(AuxN,10)
DigM Ã Resto(AuxM,10)
Termina à (DigN = DigM)
AuxN Ã AuxN / 10
AuxM Ã AuxM / 10
Si Termina=verdadero
entonces
TerminaEnNumeroà VERDADERO
sino
TerminaEnNumeroà FALSO
Algoritmo EstaContenidoMenN
d.e.: N, M
d.s.: VERDADERO si M est¶
a contenido en N; FALSO en caso contrario
AuxN Ã N
EstaContenido à falso
Repetir mientras (AuxN > M) y (EstaContenido=falso)
Si TerminaEnNumero(AuxN,M)=verdadero
entonces EstaContenido à verdadero
AuxN Ã AuxN / 10
Si EstaContenido
entonces
EstaContenidoMenNÃ VERDADERO
sino
EstaContenidoMenNÃ FALSO
Ejercicio 4.21
Algoritmo ConjeturaGoldbach
d.e.: ninguno
d.s.: VERDADERO si la conjetura de Goldbach se cumple para todos los n¶
umeros
pares entre 100 y 1000; FALSO en caso contrario.
Conjetura à Verdadero
NroPar à 100
Repetir mientras (Conjetura=verdadero) y (NroPar<=1000)
Conjetura à AplicarGoldbach(NroPar, Primo1 , Primo2)
Si (Conjetura = verdadero)
entonces
mostrar `el numero' NroPar `puede escribirse
como la suma de' Primo1 ` y ' Primo2
sino
mostrar `La Conjetura de Goldbach es FALSA..!!!'
NroPar à NroPar + 2
Si Conjetura=verdadero
{64{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
entonces
ConjeturaGoldbach à VERDADERO
sino
ConjeturaGoldbach à FALSO
El algoritmo AplicarGoldbach prueba todas las sumas posibles entre dos primos i y j, tal
que i+ j < NroP ar. Si en alg¶ un momento resulta que i +j = N roP ar, se han encontrado los
dos primos buscados, y el \resultado" de la conjetura es verdadero. Si en ning¶un momento se
encuentran los n¶umeros i y j en las condiciones pedidas, el \resultado" devuelto es falso. para
probar todas las sumas posibles entre primos, se usar¶an dos estructuras repetir mientras
anidadas de la siguiente manera:
i à primer primo
j à primer primo
Repetir mientras (i+j)<NroPar y no encontr¶e los primos buscados
j à primer primo
Repetir mientras (i+j)<NroPar y no encontr¶e los primos buscados
Si i+j=NroPar entonces <ENCONTRE LOS PRIMOS BUSCADOS>
j à pr¶oximo primo siguiente a j
i à pr¶ oximo primo siguiente a i
Algoritmo AplicarGoldbach
d.e.: NroPar
d.s.: Primo1, Primo2 fnros. primos que sumados dan NroParg
Resultado fVERDADERO si se pudo encontrar dos primos que sumen NroPar;
FALSO en caso contrariog
i à 2
j à 2
Encontre à falso
Repetir mientras ((i+j)<NroPar) y (Encontre=falso)
j à 2
Repetir mientras ((i+j)<NroPar) y (Encontre=falso)
Si i+j = NroPar
entonces
Encontre à verdadero
Primo1 Ã i
Primo2 Ã j
NuevoPrimo à ProximoPrimo(j) fver ejercicio 12g
j à NuevoPrimo
NuevoPrimo à ProximoPrimo(i)
i à NuevoPrimo
Si Encontre
entonces
AplicarGoldbach à VERDADERO
{65{
~ - EJERCICIOS
4 ALGORITMOS EN LENGUAJE DE DISENO
sino
AplicarGoldbach à FALSO
Cabe se~nalar que la primitiva ProximoPrimo es an¶aloga a la primitiva \Incrementar en
1", con excepci¶on de que cada incremento pasa al pr¶oximo natural primo, y no al pr¶oximo
natural (como suced¶³a en el caso de \Incrementar en 1").
{66{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
5.1 Introducci¶
on
Ya se ha visto c¶omo resolver problemas mediante algoritmos, los cuales fueron expresados
en un lenguaje de dise~no. Ahora nos abocaremos a la tarea de trasladar dichos algoritmos
en programas, utilizando el lenguaje de programaci¶on Pascal. La estructura general de los
algoritmos permanecer¶a inalterada, exceptuando muchas de las palabras clave empleadas,
las que deber¶an escribirse ahora en ingl¶es (ej: repetir mientras a>0 ser¶a escrito while
a>0 do).
En la elaboraci¶on de programas existe menos libertad que al trabajar con algoritmos,
dado que los programas deben ser ejecutados sobre una computadora. La computadora es
simplemente una m¶aquina capaz de ejecutar programas a gran velocidad. Sin embargo, debe
indic¶arsele exactamente que se desea hacer mediante instrucciones dadas en un lenguaje de
programaci¶on.
{67{
~ A PROGRAMAS EN PASCAL
5 DE ALGORITMOS EN LENGUAJE DE DISENO
S¶³mbolo Signi¯cado
j Se utiliza para separar varias alternativas.
fg Se utilizan para encerrar algo que se repite 0 o m¶a s veces.
[] Se utilizan para indicar que algo es opcional.
::= Se utiliza para indicar que lo que aparece a la izquierda
de este s¶³mbolo est¶a de¯nido por lo que aparece a la derecha.
<t¶ermino> los corchetes angulares se utilizan para indicar que
t¶ermino est¶a de¯nido a partir de otros elementos.
termino se utiliza para indicar que t¶ermino consiste
exactamente de la secuencia de letras t, e, r, m, i, n y o.
Ejemplo: supongamos que queremos de¯nir un identi¯cador (esto es, el nombre asociado
a un dato o una variable dentro de un programa) como una secuencia de letras y/o d¶³gitos,
que debe comenzar necesariamente con una letra. Ejemplos de identi¯cadores v¶alidos ser¶³an
Pepe, P1, Eje01, ab00cd. Veamos primeramente c¶omo de¯nir qu¶e es un d¶³gito. Un d¶³gito es
simplemente:
Esto es, un d¶³gito es o bien el caracter 0, o bien el caracter 1, o bien el caracter 2, etc.
Un n¶
u mero natural est¶a formado por uno o m¶as d¶³gitos. Podemos de¯nirlo entonces como:
Un identi¯cador (ej: el nombre de una variable, o el nombre del programa) debe comenzar
con una letra, y estar seguido luego de letras o d¶³gitos. Esto puede escribirse como:
Esto es: un identi¯cador est¶a formado por una letra, seguido por 0 o m¶as s¶³mbolos, cada uno
de los cuales puede ser una letra o un d¶³gito. Esta de¯nici¶on de identi¯cador es pr¶acticamente
id¶entica a la que utiliza el lenguaje Pascal. 11
11
En los identi¯cadores de Pascal tambi¶en es posible utilizar como caracter intermedio el \ ", denominado
en ingl¶es underscore. Ejemplo: en Pascal, son identi¯cadores v¶a lidos Es Nro Primo, Cantidad Digitos,
etc.
{68{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
5.3.1 Declaraci¶
on de constantes
Esta parte es opcional. A trav¶es de la misma, puede asociarse un valor constante a deter-
minados identi¯cadores. La de¯nici¶on de <declaraci¶on-constantes> es:
5.3.2 Declaraci¶
on de tipos
Esta parte tambi¶en es opcional. En este punto, el programador tiene la alternativa de de¯nir
nuevos tipos de dato, a partir de los tipos b¶asicos ya existentes provistos por Pascal. La
de¯nici¶on de <declaraci¶on-tipos> en notaci¶on bnf es:
{69{
~ A PROGRAMAS EN PASCAL
5 DE ALGORITMOS EN LENGUAJE DE DISENO
5.3.3 Declaraci¶
on de variables
Esta parte tambi¶en es opcional. En este punto, el programador debe declarar todas las
variables que se utilizar¶an posteriormente en <bloque de sentencias>. Para declarar una
variable, debe indicarse su nombre y su tipo. Si existe m¶as de una variable del mismo tipo,
puede declar¶arselas separ¶andolas por una coma, e indicando luego el tipo asociado. M¶as
formalmente, la declaraci¶on de variables puede de¯nirse de la siguiente manera:
<declaracion-variables>::=
Var <ident>f,<ident>g: <ident-de-tipo> f;<ident>f,<ident>g: <ident-de-tipo>g;
Ejemplo: las siguientes son declaraciones v¶alidas de variables.
Var
indice,n,i,k: integer;
DeboSeguir,EncontreUnNumeroPrimo: boolean;
RaizCuadradaDeN,RaizCubicaDeN: Real;
5.3.4 De¯nici¶
on de procedimientos y funciones
En este punto, el programador debe de¯nir los \cuerpos" de los procedimientos y funciones
asociados al programa. Pueden de¯nirse tantos procedimientos y funciones como se desee;
{70{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
El bloque de programa est¶a formado por una o m¶as sentencias. Las sentencias est¶an sepa-
radas entre s¶³ por un punto y coma (;).
<sentencia-1>;
<sentencia-2>;
...
<sentencia-n-1>;
<sentencia-n>
{71{
~ A PROGRAMAS EN PASCAL
5 DE ALGORITMOS EN LENGUAJE DE DISENO
Sentencia Repeat-Until:
Su sintaxis es la siguiente:
{72{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
En lenguaje de dise~ no, sol¶³amos escribir bloques de acciones utilizando un corchete sobre el
lado izquierdo del algoritmo, que abarcaba todas las sentencias involucradas en una sentencia
compuesta. Consid¶erese el siguiente ejemplo:
While i>3 do
Repetir mientras i>0 begin
mostrar i writeln(i);
mostrar i*i writeln(i*i);
i à i-1 i:=i-1
End
{73{
~ A PROGRAMAS EN PASCAL
5 DE ALGORITMOS EN LENGUAJE DE DISENO
cu¶ales han sido las teclas pulsadas). Otros dispositivos son solamente dispositivos de salida
(ej: impresora, o pantalla de una terminal). Otros pueden ser dispositivos tanto de entrada
como de salida (ej: diskette), ya que puede leerse o escribirse informaci¶on en ellos.
El lenguaje Pascal brinda dos tipos de \sentencias", write y read, que permiten eje-
cutar operaciones de salida y de entrada de datos, respectivamente. En Pascal no suele
usarse el t¶ermino \sentencias de entrada y salida", pues la entrada y salida de datos est¶a
provista a partir de procedimientos est¶andar provistos por el lenguaje. En t¶erminos rigurosos
deber¶iamos referirnos entonces a \procedimiento est¶andar read" y \procedimiento est¶andar
write". Abandonaremos de momento esta restricci¶on, para simpli¯car nuestra explicaci¶on.
Adem¶as, debemos se~nalar que para los objetivos de esta materia la sentencia write se res-
tringir¶a a \salida por pantalla", y la sentencia read se restringir¶a a \lectura desde el teclado".
Posteriormente se ver¶a que ambas sentencias pueden utilizarse para operaciones de entrada
y salida de datos a¶ un m¶as complejas.
Sentencia Write:
La sentencia Write permite mostrar informaci¶on por pantalla. Tiene la forma
write (<expresion-write>f,<expresion-write>g)
writeln('Hola');
writeln('Que tal');
Imprimir¶a en pantalla
Hola
Que tal
¶n: write(e 1,e2 ,...e n); es equivalente a escribir
Observacio
{74{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
write(e1);
write(e2);
...
write(en);
Asimismo, writeln(e1,e 2,...en ); es equivalente a escribir
write(e1,e2 ,...en);
writeln;
Sentencia Read:
La sentencia read permite leer informaci¶on desde el teclado. Tiene la siguiente forma:
read(<identi¯cador>f,<identi¯cador>g)
Cuando la computadora debe ejecutar una sentencia read, se realiza la secuencia de acciones
siguiente:
2. Cuando pulse Enter, los valores ingresados por el teclado se almacenan en las variables
asociadas a la sentencia read.
3. Si hay alg¶un error en los datos ingresados (ej: el read era para leer un n¶umero entero,
y se ingres¶o una letra), el programa se abortar¶a autom¶aticamente, y aparecer¶a en
pantalla un mensaje de error (en ingl¶es).
read(a,b);
Al ejecutarse esta sentencia, Pascal espera a que el usuario ingrese los valores corres-
pondientes a dichas variables. Ejemplo: supongamos que el usuario ingresa
3 5 <Enter>
Al pulsar Enter, Pascal asociar¶a el 3 con la variable a, y el 5 como valor de la variable
b. Si, por el contrario, se ingresara
4 xxdj <Enter>
se obtendr¶a un mensaje de error (por ejemplo, Data type mismatch, esto es, inconsistencia
de tipo de dato), y el programa se abortar¶a. Esto es debido a que Pascal intent¶o asociar
la secuencia xxdj a un n¶ umero entero. La sentencia Readln es similar a Read, excepto que
tambi¶en se lee la tecla Enter ingresada por el usuario. Ejemplo: si se escribe
{75{
~ A PROGRAMAS EN PASCAL
5 DE ALGORITMOS EN LENGUAJE DE DISENO
readln(a);
readln(b);
para ingresar los valores asociados a estas variables, debe escribirse
5 <Enter>
3 <Enter>
Recomendacio ¶n: es conveniente combinar Write y Readln cuando se pretende ingresar
valores de variables en un programa, a ¯n de clari¯car a qu¶e variable se est¶a haciendo
referencia. Siempre es recomendable que, al ingresar un valor, aparezca un cartel indicando
cu¶al es la variable que est¶a siendo ingresada. Ejemplo:
write('Ingrese el valor de a:');
readln(a);
write('Ingrese el valor de b:');
readln(b);
Este trozo de c¶odigo, al ejecutarse, generar¶a la siguiente interacci¶on con el usuario:
Ingrese el valor de a: 3 <Enter>
Ingrese el valor de b: 5 <Enter>
¶n: read(var1 ,var2 ,...varn) es equivalente a escribir
Observacio
read(var1 );
read(var2 );
...
read(varn );
Asimismo, readln(var1 ,var2,...varn) es equivalente a escribir
read(var1 ,var2,...varn);
readln;
Sentencia de llamada a procedimiento:
La forma de esta sentencia es la siguiente:
<nombre del procedimiento>[(<lista-de-parametros-reales>)]
La <lista-de-parametros-reales> est¶a formada por uno o m¶as par¶ametros reales, sepa-
rados por comas. Cada par¶ametro real se corresponder¶a con un par¶ametro formal en la
de¯nici¶on del procedimiento. Ejemplos de llamadas a procedimientos (se supone que los
mismos fueron de¯nidos en alguna parte del programa):
ImprimirDivisores(10); fMuestra en pantalla los divisores de 10g
BorrarPantalla; fBorra la pantallag
{76{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
² Una funci¶on tiene asociado un u ¶nico dato de salida; un procedimiento puede tener
asociados m¶ as de un dato de salida, o ning¶ un dato de salida en especial (ej:
puede escribirse un procedimiento para hacer que la computadora emita un sonido, o
borre la pantalla). El hecho de si \emitir un sonido" es o no un dato de salida podr¶³a
ser cuestionable, pero esta es una pregunta de ¶³ndole ¯los¶o¯ca. . .
5.4.2 Procedimientos
{77{
~ A PROGRAMAS EN PASCAL
5 DE ALGORITMOS EN LENGUAJE DE DISENO
Procedure ImprimirDivisores(n:integer);
fmuestra en pantalla todos los divisores de ng
Var
Divisor:integer;
Begin
Divisor:=2;
While Divisor <= n div 2 do
Begin
If n mod Divisor = 0
then writeln(Divisor);
Divisor:=Divisor + 1;
End
End; fprocedimientog
Procedure ObtenerCocienteYResto(n,d:integer; VAR Cociente,Resto:integer);
fdado un n¶
umero n, y un divisor d, devuelve cociente y resto de dividir n por dg
Begin
Cociente:=n div d;
Resto:=n mod d;
End;
Procedure ImprimirSaludo;
Begin
writeln('Hola, que tal, como te va!');
End;
Procedure ObtenerCuadrado(n:integer; VAR Cuadrado:integer);
Begin
Cuadrado:=n * n;
End;
El algoritmo asociado a este ¶ultimo procedimiento puede expresarse m¶as claramente
utilizando una funci¶on, dado que existe un ¶unico dato de salida. M¶as abajo se indica una
versi¶on equivalente de este procedimiento, expresado como funci¶on.
Invocaci¶
on de procedimientos
Un procedimiento P puede ser invocado desde el programa principal; tambi¶en puede
invoc¶arselo desde otro procedimiento (o funci¶on) ubicado al mismo nivel que P . 13 Para
invocar a un procedimiento, se indica su nombre y sus par¶ametros reales,14 los que se co-
rresponder¶an uno a uno con los par¶ametros formales. Veamos un ejemplo: supongamos un
programa en el que X e Y son variables de tipo integer. Puede entonces incluirse en alg¶
un
punto la invocaci¶on
...
ObtenerCocienteYResto(7,2,X,Y);
...
13
Este concepto se puede analizar en detalle en un libro sobre lengua je Pascal.
14
Llamados actual parameters en ingl¶es. La palabra actual en ingl¶es signi¯ca real o efectivo en castellano.
{78{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
5.4.3 Funciones
{79{
~ A PROGRAMAS EN PASCAL
5 DE ALGORITMOS EN LENGUAJE DE DISENO
La funci¶on Pi no tiene ning¶un dato de entrada, y devuelve el valor constante Pi. A los
¯nes de un uso posterior, la funci¶on Pi se comporta exactamente igual a una de¯nici¶on de
constante.
Function Potencia(n,i:integer):integer;
fDados dos naturales n e i, calcula n elevado a la ig
Var p:integer;
Begin
p:=1;
While i>0 do
begin
p:=p*n;
i:=i-1;
end;
Potencia:=p;
End;
La funci¶on Potencia tiene dos datos de entrada de tipo integer, y el dato de salida
(nombre de la funci¶on) es de tipo integer.
Muy importante 1: en toda funci¶on F, debe asign¶arsele en alg¶ un punto un valor
al nombre de la funci¶on, el que se comporta como una variable convencional, de tipo
<tipo-dato-salida>. Si no se realiza ninguna asignaci¶on, el valor devuelto por la funci¶on
F ser¶a inde¯nido.
Muy importante 2: en toda funci¶on de nombre F, el nombre de la funci¶on podr¶a aparecer
como una variable m¶as ¶unicamente del lado izquierdo de una asignaci¶on. >Por qu¶e? Consi-
deremos el ejemplo anterior, en el cual podr¶³a aparentemente ahorrarse el uso de la variable
p escribiendo lo siguiente:
Function Potencia(n,i:integer):integer;
fDados dos naturales n e i, calcula n elevado a la ig
Begin
Potencia:=1;
While i>0 do
Begin
Potencia:=Potencia*n;
i:=i-1;
end;
End;
Esta funci¶on no est¶a correctamente de¯nida; el compilador detectar¶a un error en la
asignaci¶on, ya que asumir¶a que Potencia en el lado derecho corresponde a una invocaci¶on
a la funci¶on Potencia, y no a una referencia a una variable. Es necesario en consecuencia
utilizar una variable auxiliar p, como en el ejemplo anterior, para obtener el resultado de
elevar n a la i, y luego asignar a Potencia el valor de dicha variable p.
Invocaci¶
on de funciones
{80{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
{81{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
6 on de dibujos en Pascal
Sugerencias para la impresi¶
La impresi¶on de distintos dibujos en pantalla constituye una interesante motivaci¶on para
ejercitar la programaci¶on en Pascal. A t¶³tulo de ejemplo, puede considerarse el siguiente
enunciado:
Escribir un programa en Pascal para realizar el siguiente dibujo:
1
121
12321
1234321
123454321
1234321
12321
121
1
1. Analizar primeramente c¶omo est¶a compuesta cada l¶³nea del dibujo que se quiere reali-
zar. Debe tenerse presente que una l¶³nea termina necesariamente con el caracter cr
(¯n de l¶³nea), el cual puede imprimirse usando la sentencia Writeln. Analizar tam-
bi¶en los caracteres correspondientes a espacios en blanco (' '), que aparecen entre el
comienzo y el ¯nal de cada l¶³nea.
A ¯n de poder visualizar todos los caracteres impresos en pantalla, se representar¶an
los espacios en blanco como *, y el ¯n de l¶³nea con cr . El dibujo anterior podr¶³a
conceptualizarse como se muestra a continuaci¶on:
2. Luego puede analizarse qu¶e relaci¶on existe entre los caracteres que componen cada
l¶³nea (el n¶umero marcado en it¶alica corresponde a la columna central del dibujo)
{83{
¶ DE DIBUJOS EN PASCAL
6 SUGERENCIAS PARA LA IMPRESION
1: 4 blancos, 1, cr
2: 3 blancos, 1 2 1 cr
3: 2 blancos, 1 2 3 2 1 cr
4: 1 blanco, 1 2 3 4 3 2 1 cr
5: 0 blanco, 1 2 3 4 5 4 3 2 1 cr
6: 1 blanco, 1 2 3 4 3 2 1 cr
7: etc.
² Para las primeras 5 l¶³neas, el n¶umero de columna central es un valor que se va in-
crementando en uno (1,2,3,4,5), y la cantidad de blancos se va decrementando en uno
(4,3,2,1,0). Dicho en otros t¶erminos: cuando la columna central tiene asociado el d¶³gito
i, hay 5 ¡ i blancos al principio de esa l¶³nea.
Luego, puede concluirse que dado un valor i, todo el contenido de la l¶³nea estar¶a en
funci¶on de ¶el. Para la l¶³nea con columna central i, debe hacerse lo siguiente:
² Imprimir 5 ¡ i blancos;
² imprimir los n¶umeros desde 1 hasta i;
² imprimir los n¶umeros desde i ¡ 1 hasta 1;
² imprimir cr
Esto vale para las l¶³neas que van de la 1 a la 5. Expresando esto en Pascal, resulta
write('':5-i); (*1*)
For k:=1 to i do
write(k:1);
For k:=i-1 downto 1 do
write(k:1);
writeln;
{84{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶oricas { Carlos I. Ches~
n evar
Procedure Linea(i:integer);
Var k:integer;
Begin
write('':5-i);
For k:=1 to i do
write(k:1);
For k:=i-1 downto 1 do
write(k:1);
writeln;
End;
Pero esto vale para cada una de las 5 primeras l¶³neas de texto, y el n¶umero de la columna
central es el mismo que el n¶umero de l¶³nea. Luego, para hacer las primeras 5 l¶³neas del
dibujo puede escribirse
For j := 1 to 5
do Linea(j);
Program Dibujo(input,output);
Var j:integer;
Procedure Linea(i:integer);
Var k:
Begin
write('':5-i);
For k:=1 to i do
write(k:1);
For k:=i-1 downto 1 do
write(k:1);
writeln;
{85{
¶ DE DIBUJOS EN PASCAL
6 SUGERENCIAS PARA LA IMPRESION
End; {Linea}
Begin {ppal}
For j := 1 to 5 {primer mitad}
do Linea(j);
For j := 4 downto 1 {segunda mitad}
do Linea(j);
End. {ppal}
1
2 2
3 3
4 4
5 5
6 6
5 5
4 4
3 3
2 2
1
Se analizar¶a primeramente c¶omo est¶an compuestas las l¶³neas del dibujo, en t¶erminos
similares a los usados antes.
Es claro que, aplicando un criterio an¶alogo al anterior, la soluci¶on ideal consistir¶³a en poder
de¯nir una l¶³nea gen¶erica del dibujo en funci¶on de alg¶un valor, y luego hacer el dibujo en
dos partes, de la siguiente manera:
{86{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
For j:=1 to 6
do Linea(...);
For j:=5 downto 1
do Linea(...);
Veamos c¶omo caracterizar la l¶³nea i¡¶esima. Puede decirse que cuando se genera la l¶³nea
k, hay 6¡k espacios en blanco al comienzo de la misma. Considerando a partir de la segunda
l¶³nea (pues la primer l¶³nea es un caso especial, ya que tiene un solo d¶³gito), la l¶³nea que tiene
asociado el n¶ umero k tendr¶a la forma:
2 1
3 3
4 5
5 7
6 9
>Cu¶al es la relaci¶on entre el valor del n¶umero asociado a la l¶³nea y la cantidad de blancos
intermedios? Puede apreciarse que la cantidad de blancos son impares consecutivos, pero ...
>c¶omo asociarlos a un n¶umero dado? Si se considera que en cada una de las l¶³neas (desde la
segunda en adelante) siempre aparece una columna central con un blanco, e igual cantidad
de blancos a izquierda y derecha de dicha columna, lo anterior puede escribirse como:
{87{
¶ DE DIBUJOS EN PASCAL
6 SUGERENCIAS PARA LA IMPRESION
Procedure Linea(k:integer);
Begin
If k=1 {si se trata de la linea con numero 1}
then
Begin
Write('':6-k);
write(1);
end
else
begin
write('':6-k); {blancos al comienzo}
write(k); {digito a la izq}
write('':2*k-3); {blancos intermedios}
write(k); {digito a la derecha}
end;
writeln; {pasar a la proxima linea}
end; {procedure linea}
Program Dibujo2(ouput);
Var j:integer;
Procedure Linea
...(aqui aparece el texto del linea)...
Begin
For j:=1 to 6
do Linea(j);
For j:=5 downto 1
do Linea(j);
End.
Este ejemplo muestra que no siempre es sencillo encontrar la relaci¶on existente entre
los distintos caracteres que componen una l¶³nea. En el caso de los blancos intermedios, la
{88{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
relaci¶on entre la cantidad de blancos y el n¶umero no salta a la vista. Haber distinguido entre
columna izquierda, central y derecha ayud¶o a visualizar esta relaci¶on.
Obs.: no siempre hay una relaci¶on entre los caracteres que componen las l¶³neas. Ejemplo:
en el dibujo
1
253
342
no hay una relaci¶on particular entre los blancos y los n¶umeros. (Sin embargo, normalmente
las ¯guras que deber¶an representarse en los ejercicios propuestos tienen alguna relaci¶on entre
sus caracteres, de modo que se puedan aplicar los conceptos antes vistos)
Por u¶ltimo, se analizar¶a un tercer ejemplo. El ejercicio consiste ahora en escribir un
procedimiento DibujarFigura, que reciba como par¶ametro un valor K, y que dibuje un
\¶arbol" compuesto por K tri¶angulos, de la siguiente manera:
1
121
1
121
12321
.......
1
121
12321
1234321
... ...
123..K..321
1
121
1
121
12321
{89{
¶ DE DIBUJOS EN PASCAL
6 SUGERENCIAS PARA LA IMPRESION
Procedure DibujarFigura(K:integer);
Var NroTri:integer;
Begin
For NroTri := 1 to K do
DibujarTriangulo(NroTri+1);
End;
Procedure DibujarTriangulo(CantLineas:integer);
Var i,j:integer;
Begin
For i:=1 to CantLineas do
Begin
write('':9-i);
For j:=1 to CantLineas do
write(j);
For j:=CantLineas-1 downto 1 do
write(j);
writeln;
End; {For}
End; {DibujarTriangulo}
Obs.: cuando se dibuja la primer l¶³nea, el segundo bucle es equivalente a ejecutar For j:=0
downto 1, y por lo tanto la sentencia write asociada a ¶el no se lleva a cabo.
Sugerencias varias
La siguiente es una enumeraci¶on de las pautas m¶as relevantes a tener en cuenta cuando
se resuelven ejercicios asociados a dibujar ¯guras en pantalla.
² Observar con atenci¶on qu¶e regla de formaci¶on sigue cada l¶³nea del dibujo. Determinar
que elementos var¶³an de una l¶³nea a la otra.
² Determinar que elementos est¶an en funci¶on de otros. Ejemplo: en el primer ejemplo,
si el n¶umero de la columna central era i, la cantidad de blancos era 5 ¡ i. Analizar
cu¶antas variables entran en juego para de¯nir una l¶³nea (en el ejemplo, con una sola
variable se de¯n¶³a toda la estructura de la l¶³nea).
{90{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
² Determinar cuando un valor crece desde un valor inicial hasta un tope dado, y cuando
decrece. El primer caso corresponde a un bucle for..to (en el ejemplo, la primer
mitad del dibujo). En el segundo caso, corresponde a un bucle for..downto.
² Analizar si el dibujo tiene partes sim¶etricas. En tal caso, generalmente puede hacerse
la primer mitad con un bucle, y la segunda mitad con el mismo bucle pero \en sentido
inverso". Tener en cuenta que algunos dibujos poseen una parte \central" (la l¶³nea del
medio) que se imprime una sola vez. Ejemplo: en la primer mitad del primer ejemplo,
el bucle va de 1 a 5; la segunda mitad es de 4 a 1 (si por el contrario la segunda mitad
fuese tambi¶en de 5 a 1, el segundo bucle imprimir¶³a 2 veces la l¶³nea central).
/----\
1 1 1 / xx \
12 21 2 2 / xx \
123321 3 3 / xxx xxx \
12 21 2 2 \ xxx xxx /
1 1 1 \ xx /
\ xx /
\----/
1 5 5
12 4 4 1
123 3 3 212
1234 2 2 32 23
123 1 43 34
12 2 2 32 23
1 3 3 212
4 4 1
5 5
{91{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
7.1 Introducci¶
on
Turbo Pascal 15 es un entorno de programaci¶on para lenguaje Pascal desarrollado para
trabajar en cualquier computadora personal (pc) compatible con una IBM Pc.16 El hecho
de que Turbo Pascal sea un entorno de programaci¶on signi¯ca que incluye una serie de
facilidades que hacen m¶as f¶acil la elaboraci¶on, compilaci¶on y ejecuci¶on de programas en
Pascal.
En la actualidad, Turbo Pascal es una de los softwares m¶as difundidos para progra-
maci¶on en lenguaje Pascal. Entre las caracter¶³sticas del entorno Turbo Pascal, podemos
mencionar las siguientes:
{93{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
en la pantalla aparecer¶a una \ventana" (la ventana de edici¶on) con distintos comandos en
la parte superior. La primer letra de cada comando estar¶a en video intenso, 17 si se tiene un
monitor monocromo; en un monitor color, la primer letra de cada comando aparecer¶a en un
color distinto al de las letras restantes.
Pulsando la tecla esc, el cursor aparecer¶a autom¶aticamente en la pantalla. En ese
momento, puede comenzar a usarse Turbo Pascal como un editor de textos para escribir
programas en Pascal. Con la tecla F10, puede pasarse del editor de textos al men¶u de
opciones. principal, y retornarse al editor pulsando nuevamente esc.
Estando en el editor, puede procederse a escribir un programa en Pascal. Para editar
programas en Pascal, Turbo Pascal ofrece adem¶as una serie de comandos para manipular
el texto del programa. Los comandos m¶as usados se detallan al ¯nal de este apunte.
7.3 El men¶
u de opciones
Seguidamente se analizar¶an las opciones m¶as importantes que brinda el men¶u de opciones
de Turbo Pascal. Se dar¶a especial ¶enfasis a aquellas opciones que son necesarias para
desarrollar programas en Pascal, dentro de los requerimientos de la materia \Resoluci¶on
de Problemas y Algoritmos".
Al lado de cada opci¶on, se detalla su signi¯cado en castellano, as¶³ como la secuencia de
teclas que constituye un \atajo" para llegar a dicha opci¶on (si es que dicha secuencia existe).
Para acceder a esta opci¶on, debe pulsarse Alt+F 18 desde el editor. Esta opci¶on hace
aparecer en pantalla un peque~no men¶u de opciones, en el que se ofrecen distintas alternativas
para manipular archivos, tales como cargar archivos ya existentes, crear nuevos archivos, y
grabar archivos. Cuando se carga un archivo, ¶este es editado autom¶aticamente. Cuando
se termina de escribir un archivo, puede grab¶arselo en cualquier directorio y con cualquier
nombre.
Algunas opciones del men¶u \File" (y lo mismo vale para otros men¶ues), tienen a su lado
el nombre de una tecla. Ej: load tiene asociado F3. Esta tecla constituye un \atajo" para
dicho comando (ver glosario). Las principales opciones del menu \File" son:
{94{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
se visualizar¶an todos los programas con extensi¶on PAS. Usando las teclas del cursor,
puede seleccionarse un programa cualquiera en particular, y pulsando Enter, puede
cargarse dicho programa, edit¶andose autom¶aticamente.
² New (nuevo)
Esta opci¶on borra todo archivo preexistente en el editor de Turbo Pascal, y permite
comenzar a escribir un archivo nuevo que a¶un no tiene nombre. Turbo Pascal asigna
por defecto el nombre NONAME.PAS al archivo asociado al texto. Cuando se desee
grabar el archivo (opci¶on \Save"), Turbo Pascal permitir¶a que el usuario le de al
archivo el nombre que desee.
² Print (imprimir)
Lista por impresora el texto correspondiente al archivo que est¶a siendo editado.
Para acceder a esta opci¶on, debe pulsarse Alt+E. Las principales alternativas que se pre-
sentan son:
{95{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
² Redo (rehacer):
Rehace la operaci¶on previamente deshecha usando \undo".
{96{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
7.3.4 Run
{97{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
Para acceder a esta opci¶on, pulsar Alt+C desde la ventana de edici¶on. Esta opci¶on hace
aparecer en pantalla un men¶u con las siguientes opciones.
² Build
El uso de esta opci¶on va m¶as all¶a del alcance del curso.
² Primary File
El uso de esta opci¶on va m¶as all¶a del alcance del curso.
² Information (informaci¶on)
Brinda distintas informaciones sobre el archivo que est¶a en la ventana de edici¶on.
Esta opci¶on tiene asociadas varias opciones adicionales, todas ellas para facilitar la depura-
ci¶on de programas. Para acceder, debe pulsarse Alt+D desde la ventana de edici¶on. Esta
opci¶on hace aparecer en pantalla un men¶ u con distintas opciones.
{98{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
{99{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
7.3.7 Options
Esta opci¶on incluye distintas caracter¶³sticas de Turbo Pascal que pueden ser de¯nidas
por el usuario. Para acceder, pulsar Alt+O desde la ventana de edici¶on. Las principales
opciones que aparecen son:
² Compiler (compilador)
Permite de¯nir caracter¶³sticas del compilador. Ej: Chequeo de rangos, evaluaci¶on
booleana con corto circuito,etc.
² Environment (entorno)
Permite de¯nir caracter¶³sticas del entorno de trabajo Turbo Pascal. Ej: si hay
archivos de resguardo (back-up ¯les), cu¶al es el tama~no del tabulador, etc.
² Directories (directorios)
Permite de¯nir directorios por separado para casos particulares. Ej: cu¶al es el directorio
donde se guardar¶an los archivos .EXE generados a partir de la compilaci¶on,etc.
Todos los conceptos que se han mencionado anteriormente tienen un elemento com¶un: se
he hecho referencia a la ventana de edici¶on, ventana del usuario, ventana de watches, etc.
El hecho de que Turbo Pascal 7.0 sea un entorno basado en ventanas facilita mucho su
manejo, ya que este concepto uni¯ca muchos aspectos de trabajo. B¶asicamente, la opci¶on
{100{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Window brinda al usuario distintos comandos para manipular ventanas: abrir, cerrar o mover
ventanas, pasar a otra ventana, listar las ventanas abiertas, etc. Dos teclas particularmente
importantes son F6 (pasa a la pr¶oxima ventana), y Alt+F3 (cierra la ventana en curso).
² Tile (azulejar):
Muestra todas las ventanas abiertas en pantalla, en estilo \tile" (azulejo). Las ventanas
se muestran como si fuesen azulejos colocados sobre una pared.
² Cascade (cascada):
Idem Tile, pero utilizando el estilo \cascade" (cascada). Las ventanas se muestran de
manera tal que se ve la parte superior de todas las ventanas, mostr¶andose ¶unicamente
en su totalidad la ¶ultima ventana activa.
² List (listar):
Lista todas las ventanas abiertas.
7.3.9 Help
Esta opci¶on brinda ayuda sobre distintos t¶opicos de Turbo Pascal. Cabe destacar
que, al escribir un programa, puede solicitarse ayuda sobre el lenguaje Pascal, pulsan-
do Ctrl+F1. Ej: posicion¶andose sobre la palabra IF, y pulsando Ctrl+F1, aparecer¶a
en pantalla una explicaci¶on de la sentencia If-Then-Else. El texto de ayuda aparece en
idioma ingl¶es.
{101{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
² ESC: permite cancelar cualquier opci¶on de un men¶u. Pulsando esta tecla se abandona
el men¶
u principal, y se pasa al editor de textos.
² SHIFT: (identi¯cada a veces con una °echa hacia arriba). Hay dos teclas SHIFT, una
a cada lado del teclado. Esta tecla es similar a la tecla de may¶
usculas en una m¶aquina
de escribir. Permite obtener letras may¶ usuclas. Combinada con otras teclas especiales
(ej: F1, Delete, etc.), produce distintos resultados.
² CAPS LOCK: Pulsando esta tecla, todo texto que se escriba de ah¶³ en adelante apa-
recer¶a en may¶usculas. Para desactivar las may¶usuclas, basta pulsar CAPS LOCK
nuevamente.
² CTRL: Hay dos teclas CTRL, una a cada lado del teclado. Esta tecla no cumple
ninguna funci¶on en s¶³ misma, sino que es de utilidad cuando se la combina con otras
teclas especiales.
² ENTER: (tambi¶en llamada RETURN) Esta tecla est¶a situada sobre la derecha del
teclado, y suele ser la de mayor tama~no. Se utiliza para pasar a la pr¶oxima l¶³nea, al
escribir un texto, o tambi¶en para con¯rmar la ejecuci¶on de una opci¶on de un men¶u.
² BACKSPACE: (caracterizada con una °echa hacia la izquierda). Esta tecla desplaza
el cursor un lugar a la izquierda, borrando el caracter sobre el cual se hallaba ubicado
el cursor.
{102{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
² END (o ¯n): Dentro del editor de textos, desplaza al cursor al ¯nal de la l¶³nea en
curso.
² PAGE UP (o ReP¶ag): Dentro del editor de textos, desplaza el texto que se muestra
en pantalla cierto n¶umero de l¶³neas hacia \arriba", permitiendo desplazarse hacia el
principio del texto.
² PAGE DOWN (o AvP¶ag): Idem PAGE UP, pero permitiendo desplazarse hacia el ¯nal
del texto.
7.4.2 Teclas m¶
as utilizadas dentro del editor
A continuaci¶on se describen las combinaciones de teclas m¶as usadas para trabajar con el
editor incorporado a Turbo Pascal. Se recomienda a los alumnos familiarizarse con el uso
de dichas teclas, para facilitar la elaboraci¶on de programas en la computadora.
Comandos de inserci¶on/borrado
Modo Insert on/o® Ctrl+V o Insert
Insertar nueva l¶³nea Ctrl+N
Borrar l¶³nea en la que se halla el cursor Ctrl+Y
Borrar hasta ¯n l¶³nea Ctrl+Q Y
Borrar caracter a izquierda del cursor Ctrl+H o Backspace
Borrar caracter en posici¶on cursor Ctrl+G o Delete
Borrar palabra a derecha del cursor Ctrl+T
Borrar bloque de texto Ctrl+K Y
{103{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
Hallar Ctrl+Q F
Hallar y reemplazar Ctrl+Q A
Repetir hallar o reemplazar Ctrl+L
7.5 Glosario
{104{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
² Cortar y Pegar (ingl¶es \cut" y \paste"): estos t¶erminos son usuales en computaci¶on
para describir operaciones sobre archivos de texto. Al \cortar" un bloque (o trozo) de
texto, el bloque en cuesti¶on desaparece del archivo de texto que est¶a siendo editado,
y se almacena en un ¶area especial llamada \portapapeles" (clipboard). Al \pegar" un
bloque de texto, el editor toma el contenido del portapapeles, y lo agrega al archivo
de texto, en el lugar en que se encuentre posicionado el cursor.
Borrar (en ingl¶es \delete"): Borrar un archivo del diskette (o disco r¶³gido). Un archivo que
ha sido borrado desaparece del medio de almacenamiento que lo conten¶³a, y no podr¶a ser
cargado en el futuro.
Cadena (ingl¶es \string"): secuencia de caracteres.
Caja de di¶alogo (ingl¶es \dialog box"): se llama as¶³ a un peque~no recuadro que aparece
en pantalla, que permite seleccionar par¶ametros adicionales para una opci¶on determinada.
{105{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
Ej: al usar la opci¶on Edit/Find, aparece una caja de di¶alogo, en la que puede indicarse
par¶ametros tales como direcci¶on de la b¶usqueda (hacia atr¶as o hacia adelante), punto de
comienzo de la b¶usqueda, etc. Las cajas de di¶alogo son comunes en los programas que tienen
sistema de ventanas.
Cancelar (ingl¶es \cancel"): decidir que no quiere ejecutarse una opci¶on particular de un
men¶u. Ej: si en un programa aparece la pregunta \>Quiere seguir? (s/n)", pulsando la tecla
\n" se cancela dicha opci¶on.
Cargar (en ingl¶es \load"): Recuperar un archivo del diskette (o disco r¶³gido), y pasarlo a
la memoria principal de la computadora.
C¶odigo ejecutable: secuencia de sentencias que pueden ser entendidas directamente por
la computadora. El c¶odigo ejectuable es el resultado de la compilaci¶on de un programa.
Compilador (ingl¶es \compiler"): programa que recibe como dato de entrada un programa
escrito en un lenguaje de programaci¶on (ej: Pascal o Fortran), y devuelve un c¶odigo
ejecutable, que puede ser ejecutado por una computadora.
Cuenta: los sistemas multiusuarios constan de una computadora central y varias terminales.
Para que un usuario pueda utilizar el sistema, debe disponer de una cuenta. Este concepto
es similar en cierto sentido al concepto de cuenta bancaria. Una cuenta consiste simplemente
en un espacio reservado por la computadora para el usuario, a ¯n de que ¶este pueda utilizar
el sistema, almacenar y ejecutar sus propios programas, etc. Las cuentas son administradas
(creadas, destruidas, etc) por personal especializado del C¶entro de C¶omputos. Un usuario
puede acceder a su cuenta desde cualquier terminal. Para acceder a una cuenta, el usuario
debe indicar el nombre de su cuenta (o login), y una palabra clave (password), que solamente
¶el conoce. Esto ¶ultimo impide que cualquiera pueda acceder a los datos de una cuenta
particular, a excepci¶on del usuario mismo.
Directorio (ingl¶es \directory"): Un medio de almacenamiento como el diskette o disco
r¶³gido puede organizarse en directorios, para llevar un mejor control de d¶onde se encuentra
cada archivo. Si se piensa a un diskette como un armario (que guarda informaci¶on a trav¶es
de archivos), un directorio constituye un caj¶on dentro de ese armario. La idea es que un
directorio es una \divisi¶on", en la que se agrupan varios archivos que tienen alg¶un elemento
en com¶ un. Ej: si en un diskette hay varios cientos de archivos, y algunos de ellos son cartas,
otros programas en Pascal y otros juegos, ser¶³a conveniente contar con tres directorios:
CARTAS, PROGPAS y JUEGOS.
editar (ingl¶es \edit"): este verbo se utiliza con el signi¯cado de "cargar un archivo de
texto mediante un editor de textos". Cuando se edita un archivo, se est¶a en condiciones de
modi¯carlo desde el editor de textos, a trav¶es del teclado.
Editor de textos: nombre gen¶erico que se da a un programa utilitario que permite escribir
textos en la computadora, y grabarlos como archivos de texto. Asimismo, un editor permite
cargar archivos de texto ya existentes, modi¯carlos y grabarlos nuevamente. Un editor de
textos es indispensable para poder escribir adecuadamente programas en Pascal, ya que
¶estos u¶ltimos se almacenan como archivos de texto.
Grabar (o Salvar) (en ingl¶es \save"): Almacenar un archivo en diskette o disco r¶³gido.
{106{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Login: nombre de la cuenta que corresponde a un usuario. Ver Cuenta. Tambi¶en se llama
as¶³ a la acci¶on de acceder a una cuenta.
Logout: acci¶on de abandonar la cuenta. Normalmente, un usuario puede hacer un \logout"
utilizando la palabra exit.
Memoria: la memoria de la computadora es el lugar donde se almacena informaci¶on. La
memoria principal (o memoria RAM) es aquella en la que la computadora almacena los
programas que est¶an siendo ejecutados. La memoria secundaria corresponde a medios de
almacenamiento como diskettes o disco r¶³gido.
Men¶ u: conjunto de opciones que aparecen en un programa, y entre las que el usuario puede
optar.
MS-DOS: acr¶onimo de \Microsoft Disk Operating System". Uno de los sistemas operativos
monousuarios m¶as difundidos para uso en computadoras personales (PCs).
Nombre de archivo (ingl¶es \¯lename"): el nombre completo de un archivo suele estar
formado por dos partes: una secuencia de hasta 8 letras (tambi¶en llamado simplemente
\nombre") y otra secuencia de hasta 3 letras (o \extensi¶on"), separadas entre s¶³ por un
punto (\."). La extensi¶on suele caracterizar el tipo o clase de archivo al cual est¶a asociado
el \nombre". Ej: PAS corresponde a archivos en Pascal; BAS corresponde a archivos en
lenguaje Basic. Ej: nombres de archivo v¶alidos son EJEM.PAS, RULETA.BAS, etc.
Por defecto (ingl¶es \by default"): Esta expresi¶on signi¯ca ante la falta de mayor informa-
ci¶on". Muchas opciones de Turbo Pascal requieren que el usuario brinde cierta informa-
ci¶on (ej: al grabar un programa, ser¶³a natural que se indique que nombre se quiere dar a
dicho programa). Sin embargo, la ausencia de dicha informaci¶on hace que Turbo Pascal
asuma que el nombre con que se grabar¶a el programa es NONAME.PAS. Decimos entonces
que, por defecto, el nombre de un programa es NONAME.PAS (es decir, el nombre ser¶a
NONAME.PAS a menos que el usuario indique lo contrario).
Password: palabra clave, conocida u¶nicamente por un usuario particular, que le permite
acceder al uso de una cuenta (en un sistema multiusuario).
\Salir" de un programa (ingl¶es \exit"): est¶a acci¶on consiste en abandonar el programa
que ha sido cargado en la memoria principal de la computadora, y retornar el control al
sistema operativo.
Sistema monousuario: se llama as¶³ a todo equipo de c¶omputos que permite ¶unicamente
el trabajo de una persona por vez. El concepto opuesto es sistema multiusuario. Una
computadora personal (PC) es un ejemplo t¶³pico de un sistema monousuario.
Sistema multiusuario: se llama as¶³ a todo equipo de c¶omputos que permite trabajar
simult¶aneamente a varias personas, mediante terminales.
Sistema Operativo (ingl¶es \operating system"): conjunto de programas encargados de
controlar y administrar las funciones b¶asicas de la computadora, tales como: detectar que
teclas est¶an siendo pulsadas, cargar programas desde diskettera o disco r¶³gido, etc. Una
de las principales acciones que puede ejecutar el sistema operativo es cargar un programa
cualquiera en la memoria principal de la computadora, y proceder a ejecutarlo. Para esto,
{107{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
suele ser su¯ciente indicar el nombre del programa que se desea ejecutar. Ej: al encender
una PC, el sistema operativo tiene el control. Al escribir TURBO, el sistema operativo est¶a
recibiendo la instrucci¶on de cargar Turbo Pascal, y ejecutarlo.
Subcadena: parte de una cadena, que constituye una cadena en s¶³ misma. Ej: \as" es una
subcadena de \casa".
Terminal: conjunto de teclado y monitor, que puede conectarse a una computadora central.
A diferencia de una PC, una terminal no es una computadora en s¶³ misma. Simplemente,
permite acceder a una computadora central, la cual permanece invisible al usuario.
UNIX20: nombre de un sistema operativo multiusuario, de uso ampliamente difundido.
Usuario (ingl¶es \user"): persona que trabaja con la computadora.
Ventana (ingl¶es \window"): se llama as¶³ a un recuadro en la pantalla de la computadora,
que cumple la funci¶on de una mini-pantalla. Las ventanas se popularizaron a trav¶es del
sistema operativo Windows,21 el cual se basa totalmente en uso de ventanas. Cuando se
\abre" una ventana, pasa a existir una peque~na pantalla virtual dentro del monitor. De esta
manera, teniendo a su disposici¶on varias ventanas, el usuario puede trabajar con distintos
programas o archivos simult¶aneamente con un ¶unico monitor. Las ventanas que no desean
utilizarse pueden \cerrarse". Las ventanas tienen una longitud y altura que pueden ser
modi¯cadas por el usuario.
Windows 95: sistema operativo para computadoras personales, que actualmente prevalece
por sobre el sistema operativo MS-DOS. Surgido en 1995, este sistema operativo constituye
una evoluci¶on de su predecesor Windows 3.1.
20
UNIX es marca reservada de Bell Laboratories, Inc.
21
Windows es una marca reservada de Microsoft Corporation
{108{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
8 Ap¶endice: el ingl¶
es en computaci¶
on y su incidencia
en nuestro idioma
Es indudable que el idioma ingl¶es juega hoy en d¶³a un rol fundamental en diversos ¶ambitos,
y quiz¶as las ciencias de la computaci¶on sean el ¶area en la cual se hace evidente su supremac¶³a
como veh¶³culo com¶un de comunicaci¶on. El ingl¶es est¶a presente en pr¶acticamente todos los
lenguajes de programaci¶on, en gran cantidad de t¶erminos t¶ecnicos, en libros de texto y
revistas especializadas, y en la terminolog¶³a cient¶³¯ca de vanguardia utilizada en ¶areas tales
como inteligencia arti¯cial, redes y teleprocesamiento, etc.
Sin embargo, tambi¶en es innegable que, en calidad de hispanohablantes, los profesionales
argentinos del ¶area de ciencias de la computaci¶on debemos comunicarnos mayormente con
distintos tipos de usuarios, muchos de ellos con conocimiento escaso o nulo acerca de t¶erminos
t¶ecnicos o de programaci¶on, pero con un denominador com¶un: la capacidad de comprender
el idioma castellano.
En tal sentido, el manejo de literatura t¶ecnica casi exclusivamente en ingl¶es provoca una
suerte de \deformaci¶on profesional": muchos t¶erminos en ingl¶es se adaptan literalmente al
castellano, en una versi¶on supuestamente equivalente. Por desgracia, esa equivalencia a me-
nudo no existe; ciertas palabras en ingl¶es se escriben de manera id¶entica en castellano, pero
con distinto signi¯cado (ej.: los adjetivos en ingl¶es actual y eventual). En consecuencia, mu-
chas veces llegan a elaborarse frases en castellano utilizando palabras que resultan equ¶³vocas
o ambiguas, ya que para interpretarlas correctamente debe conocerse su signi¯cado en ingl¶es.
Lo dicho anteriormente no pretende constituir un argumento para sustituir cada t¶ermino
en ingl¶es por uno equivalente en castellano, suprimiendo la jerga t¶ecnica utilizada comun-
mente. No obstante, es preocupante observar la pereza con la que se trata ciertas veces el
uso correcto del castellano, como si acaso todos aquellos errores idiom¶aticos que se semejan
a pautas de redacci¶on en ingl¶es constituyesen una mera \cuesti¶on de estilo", o resultasen
m¶as \tolerables". A modo de ejemplo, puede mencionarse el gran n¶ umero de veces en que
se obvian acentos, o no se utilizan los dos s¶³mbolos de interrogaci¶on o de admiraci¶on.
Sin intenci¶on de ponti¯car al respecto, ni adoptar una postura xen¶ofoba, entendemos
que el idioma castellano debe preservarse y cultivarse como tal, ya que constituye nuestra
herramienta b¶asica de comunicaci¶on. Es imprescindible educar y desarrollar la capacidad de
redacci¶on de textos en castellano; el estilo utilizado podr¶a adaptarse seg¶un las circunstancias,
pero no debe deformarse al punto que se torne ininteligible \a menos que se lo interprete en
ingl¶es".
A trav¶es de estas p¶aginas se intenta dar una modesta contribuci¶on al problema antes
mencionado. En primer lugar, se menciona una serie de palabras cuestionables, utilizadas
muchas veces en libros de texto o a nivel coloquial como traducci¶on de ciertos t¶erminos
en ingl¶es, pero cuyo signi¯cado es ambiguo, incorrecto estil¶³sticamente o equivocado. En
cada caso se menciona la palabra cuestionable en castellano, el t¶ermino en ingl¶es a partir
del cual fue traducida o derivada dicha palabra, el problema asociado a la traducci¶on, sugi-
ri¶endose ¯nalmente algunas traducciones posibles. Se mencionan tambi¶en ciertas cuestiones
{109{
¶
8 APENDICE: ¶ EN COMPUTACION
EL INGLES ¶ Y SU INCIDENCIA EN NUESTRO
IDIOMA
estil¶³sticas y referentes a la tipograf¶³a en castellano, que suelen ser muchas veces confundidas
con aquellas empleadas en textos en ingl¶es. En el texto que sigue, en aquellos casos en que
se considere necesario destacarlo, las palabras en ingl¶es estar¶an en tipograf¶³a it¶alica, y las
palabras en castellano aparecer¶an en tipograf¶³a sans-serif.
{110{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
{111{
¶
8 APENDICE: ¶ EN COMPUTACION
EL INGLES ¶ Y SU INCIDENCIA EN NUESTRO
IDIOMA
² Es com¶u n leer t¶³tulos tales como \Evitando ciclos en la programaci¶on en Pascal", como
traducci¶on de Avoiding Loops in Pascal Programming. Debe se~nalarse que el gerundio en
{112{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
ingl¶es tiene un uso mucho m¶as frecuente que en castellano. En particular, en ingl¶es es
com¶un especi¯car t¶³tulos o encabezamientos utilizando verbos en gerundio. Ej: \Preparing
to Take the TOEFL Test", \Getting started", \Changing the Margins", etc. Para comprobar
esta a¯rmaci¶on, basta tomar el ¶³ndice de un libro en ingl¶es, y analizar el gran n¶ u mero de
cap¶³tulos y secciones, cuyo encabezamiento tiene un verbo en gerundio. En castellano, por
el contrario, el uso del gerundio es m¶as restringido. El gerundio que aparece en t¶³tulos
en ingl¶es puede sustituirse por preguntas indirectas o por verbos sustantivados. As¶³, los
t¶³tulos anteriores podr¶³an escribirse como \C¶omo evitar ciclos en la programaci¶o n en Pascal",
\C¶omo prepararse para rendir el examen TOEFL", \C¶omo empezar", y \C¶omo cambiar los
m¶argenes".
² En ingl¶es es obligatorio utilizar letras may¶usculas en muchas situaciones especiales, como por
ejemplo:
En castellano, como regla general, no se utilizan may¶ usculas en ninguno de estos casos. As¶³,
por ejemplo, el t¶³tulo de un libro o art¶³culo se escribe con su primer letra en may¶
uscula (y las
dem¶as en min¶ uscula), o bien todas en may¶uscula. Ej: \C¶omo programar en Pascal", o \COMO
PROGRAMAR EN PASCAL". Los adjetivos asociados a nombres de personas, as¶³ como los
gentilicios, se escriben en min¶uscula. Ej: leyes newtonianas, regla bayesiana.
{113{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
{115{
9 NIKLAUS WIRTH: EL CREADOR DE PASCAL
Del dise~
n o de un lenguaje de programaci¶o n
a la construcci¶on de una computadora
[...] Por cierto, cuando ingres¶e al campo de la computaci¶on en 1960, ¶esta no era el centro
de la atenci¶on p¶ ublica, ni en lo comercial ni en lo acad¶emico, como lo es hoy. Durante mis
estudios en el Instituto Federal Suizo de Tecnolog¶³a (ETH), la ¶unica mencion que escuch¶e
acerca de computadoras fue en un curso optativo dado por Ambros P.Speiser (quien m¶as
tarde resultara ser electo presidente del IFIP). Speiser hab¶³a desarrollado una computadora
llamada ERMETH, la cual era de dif¶³cil acceso para los estudiantes de computaci¶on, raz¶on
por la cual mi iniciaci¶on en la computaci¶on fue postergada hasta que tom¶e un curso de an¶alisis
num¶erico en la Universidad de Laval, en Canad¶a. Pero la m¶aquina con que contabamos all¶³
era una Alvac III E, la cual ten¶³a problemas la mayor parte del tiempo, por lo que nuestros
ejercicios de programaci¶on sol¶³an quedar en papel, en la forma de meras secuencias de d¶³gitos
hexadecimales...
Mi siguiente intento fue ya m¶as exitoso: en Berkeley (California), me pusieron ante
la \m¶aquina mascota" de Harry Huskey: la Bendix G-15. Aunque la Bendix G-15 prove¶³a
cierta sensaci¶on de ¶exito (pues produc¶³a resultados), la esencia del arte de programar parec¶³a
radicar en c¶omo ordenar inteligentemente las instrucciones de los programas en el \tambor"
(drum) de almacenamiento de la m¶aquina. Si uno ignoraba ese arte, los programas pod¶³an
llegar a correr cien veces m¶as lentos. Pero hab¶³a una ventaja educacional: uno no pod¶³a
dejar de lado ni siquiera el menor detalle. No hab¶³a forma de resolver errores de dise~no con
simplemente \poner m¶as memoria". Vi¶endolo desde la ¶optica de hoy en d¶³a, el aspecto m¶as
atractivo de esta m¶aquina era que cada detalle era visible, y pod¶³a ser comprendido. No
hab¶³a nada escondido en una circuiter¶³a compleja, o en un sistema operativo m¶agico.
Por otra parte, era obvio que las computadoras del futuro ten¶³an que ser programables
m¶as efectivamente. Por esa raz¶on, abandon¶e la idea de estudiar c¶omo dise~nar hardware, y
me dediqu¶e a estudiar c¶omo usar el que hab¶³a disponible m¶as elegantemente. Fui afortunado
en unirme a un equipo de investigaci¶on que estaba trabajando en el desarrollo (o m¶as bien,
una mejora) de un compilador para correr en la IBM 704. El lenguaje se llamaba NELIAC,
y era un dialecto de ALGOL 58. Los bene¯cios de este \lenguaje" eran bastante obvios, y
la tarea de traducir autom¶aticamente programas en c¶odigo m¶aquina planteaba problemas
considerables. Esto es precisamente lo que uno quiere encontrar cuando est¶a buscando un
doctorado. El compilador para NELIAC, que estaba escrito tambi¶en en NELIAC, era un l¶³o
bastante intrincado. El tema parec¶³a consistir de un uno por ciento de ciencia, y noventa
y nueve por ciento de magia, y esto hab¶³a que cambiarlo. Evidentemente, los programas
ten¶³an que dise~
narse siguiendo los mismos principios que los circuitos electr¶onicos, es decir,
dividirlos claramente en subpartes con solamente unos pocos cables saliendo de cada una de
ellas. Solamente si uno era capaz de entender cada parte por separado, exist¶³a la esperanza
de entender ¯nalmente el todo.
Este intento recibi¶o un impulso vigoroso con la aparici¶on del informe t¶ecnico sobre Algol
60. Algol 60 era el primer lenguaje dise~nado con claridad; su sintaxis estaba especi¯cada in-
{116{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
cluso en un formalismo riguroso. La lecci¶on era que una especi¯caci¶on clara es una condici¶on
su¯ciente, pero no necesaria, para lograr una implementaci¶on efectiva y con¯able. El con-
tacto con Aadrian van Wijngaarden, uno de los codise~nadores de Algol, dio como resultado
un tema que resultar¶³a central: >Ser¶³a posible condensar y cristalizar m¶as a¶
un los principios
del Algol?
As¶³ empezaron mis aventuras con los lenguajes de programaci¶on. Mi primer experimento
llev¶o a un trabajo de tesis y al desarrollo del lenguaje Euler (un viaje con un machete dentro
de la jungla de lenguajes existentes). El resultado fue de elegancia acad¶emica, pero no de
mucha utilidad pr¶actica (casi la ant¶³tesis de los lenguajes de programaci¶on estructurados y
basados en tipo de dato). Pero Euler cre¶o una base para el dise~no sistem¶atico de compi-
ladores que (esa era la idea), pod¶³a extenderse sin perder claridad, a ¯n de incluir nuevas
caracter¶³sticas.
Euler atrajo la atenci¶on del Grupo de Trabajo IFIP, que estaba involucrado en el desa-
rrollo de un nuevo Algol. El lenguaje Algol 60, dise~nado por y para matem¶aticos num¶ericos,
ten¶³a una estructura sistem¶atica y una de¯nici¶on concisa, que fueron apreciados por gen-
te entrenada matem¶aticamente; sin embargo, Algol carec¶³a de compiladores y apoyo en la
industria. Para ganar aceptaci¶on, deb¶³a ampliarse su rango de aplicaciones. El Grupo de
Trabajo IFIP asumi¶o la tarea de desarrollar un sucesor, y pronto este trabajo se dividi¶o en
dos campos: en uno estaban los \ambiciosos", los que quer¶³an sentar un monolito dentro
del dise~no de lenguajes; en el otro estaban los que sent¶³an que el tiempo apremiaba, y que
ampliar Algol 60 adecuadamente ser¶³a una tarea productiva. Yo estaba en este segundo
grupo, y enviamos una propuesta que perdi¶o en la votaci¶on. A partir de ah¶³, la propuesta
fue mejorada con contribuciones de Tony Hoare (miembro del mismo grupo) e implementada
en la primer IBM 360 de la Univ. de Stanford. El lenguaje resultante lleg¶o a ser conocido
como Algol W, y fue usado en varias universidades para ense~ nanza.
Vale la pena mencionar un peque~ no interludio en todos estos esfuerzos de implementa-
ci¶on. La nueva IBM 360 s¶olo ofrec¶³a c¶odigo ensamblador, y, por supuesto, lenguaje Fortran.
Ninguna de estas alternativas eran miradas con cari~no (ni por m¶³ ni por mis estudiantes)
como una herramienta para construir un compilador. Fue as¶³ que encontr¶e el coraje su-
¯ciente para de¯nir \otro lenguaje m¶as" para poder describir el compilador Algol: deb¶³a
ser un compromiso entre Algol, y las facilidades ofrecidas por lenguaje ensamblador; deb¶³a
ser un lenguaje m¶aquina pero con estructuras de sentencias y declaraciones tipo Algol. In-
cre¶³blemente, de¯nir este lenguaje llev¶o un par de semanas. Despu¶es escrib¶³ el compilador en
una Burroughs B-5000 en cuatro meses, y un \estudiante aplicado" se encarg¶o de adaptarlo
para la IBM 360 en otros cuatro meses. Este interludio preparativo ayud¶o a acelerar los tra-
bajos en Algol en gran medida. El lenguaje \intermedio" dise~nado (PL360) estaba pensado
para servir a nuestros prop¶ositos, y luego para descartarlo. No obstante, r¶apidamente ad-
quiri¶o \su propio lugar": PL360 se convirti¶o en una herramienta efectiva en muchos lugares,
e inspir¶o el desarrollo de aplicaciones similares para otras m¶aquinas.
Ir¶onicamente, el ¶exito de PL360 fue tambi¶en un indicador del fracaso de Algol W. El rango
de aplicaciones de Algol hab¶³a aumentado, pero como herramienta para la programaci¶on de
sistemas, segu¶³a teniendo sus de¯ciencias. Hab¶³a surgido la di¯cultad de resolver muchas
demandas con un u¶nico lenguaje: la meta de desarrollar \un ¶unico lenguaje" pas¶o a ser
{117{
9 NIKLAUS WIRTH: EL CREADOR DE PASCAL
cuestionable. PL/1, un lenguaje lanzado hacia esos a~nos, parec¶³a apoyar m¶as a¶un esta
suposici¶on. PL/1 segu¶³a la idea de \Swiss army knife", la navaja multiuso, que serv¶³a para
todo prop¶osito; esto ten¶³a sus m¶eritos, pero tambi¶en sus desventajas. El compilador de Algol
W, por su parte, creci¶o m¶as all¶a de los l¶³mites en los que uno pod¶³a descansar tranquilo,
sabiendo que ten¶³a una \idea", una visi¶on de todo el programa. El deseo de lograr un
formalismo m¶as conciso y m¶as apropiado para programaci¶on de sistemas a¶ un no se hab¶³a
visto concretado. La programaci¶on de sistemas requiere un compilador e¯ciente, que genere
c¶odigo e¯ciente, y que opera sin una gran cantidad de rutinas run-time (que deb¶³an estar
residentes). Este objetivo no hab¶³a sido alcanzado ni por Algol W ni por PL/1; en ambos
casos, el problema era que los lenguajes eran demasiados complejos, y las m¶aquinas en las
que corr¶³an eran inadecuadas.
En el oto~no de 1967, volv¶³ a Suiza. Un a~no m¶as tarde, pude establecer un equipo con
tres asistentes, para implementar un lenguaje que m¶as adelante se denomin¶o Pascal. Ya
estaba liberado de las presiones y restricciones de un comit¶e (como el que rigi¶o el desarrollo
de Algol), y pude concentrarme en incluir aquellas cosas que ve¶³a esenciales, y sacar aquellas
que a la larga no traer¶³an bene¯cio. Muchas veces, tambi¶en suele ser una ventaja contar con
una cantidad limitada de colaboradores para desarrollar un lenguaje (como era mi caso).
Ocasionalmente se ha dicho que Pascal fue dise~ nado como un lenguaje para ense~ nanza.
Esto es correcto, pero su uso en la ense~ nanza no era su ¶unico ¯n. De hecho, no creo en
eso de usar herramientas y formalmismos en la ense~nanza que en realidad son inadecuados
para las tareas pr¶acticas. Con los est¶andares de hoy, Pascal tiene de¯ciencias obvias con los
grandes sistemas de programaci¶on, pero hace 15 a~nos, represent¶o un compromiso adecuado
entre lo que era deseable y lo que era efectivo. En el ETH, comenzamos a introducir Pascal
en las clases de programaci¶on en 1972, luchando contra una oposici¶on considerable. Al ¯nal,
Pascal result¶o ser un ¶exito, porque le permit¶³a al profesor concentrarse m¶as en las estructuras
y conceptos que en los rasgos secundarios de un programa; es decir, pod¶³a concentrarse m¶as
en los principios que en las t¶ecnicas.
Nuestro primer compilador Pascal fue implementado para la familia de computadoras
CDC 6000, y estaba escrito en Pascal. No hizo falta el PL360, y yo vi a esto como un
paso sustancial. Sin embargo, el c¶odigo generado era muy inferior al que generaban los
compiladores Fortran, para programas equivalentes. La velocidad es un criterio esencial, y
f¶acilmente medible, y cre¶³amos que la validez del concepto de \lenguaje de alto nivel" s¶olo
ser¶³a aceptada en la industria si el costo a pagar en perfomance pod¶³a desaparecer, o al
menos disminuir. Con esta idea en mente, nos lanzamos a producir un compilador de alta
calidad, si bien el resultado alcanzado fue b¶asicamente la tarea de un u¶nico profesional. En
1974, Urs Ammann desarroll¶o un compilador que fuera distribuido ampliamente, y que a¶ un
hoy se usa en muchas universidades e industrias. El precio fue alto; el esfuerzo por generar
buen c¶odigo es proporcional a las diferencias que existen entre la m¶aquina y el lenguaje, y
la CDC 6000 no estaba dise~nada para correr sobre ella lenguajes de alto nivel...
Una vez m¶as, ir¶onicamente, el principal bene¯cio apareci¶o por donde menos se lo es-
peraba. Despu¶es de que la existencia de Pascal se hizo conocida, mucha gente comenz¶o
a pedirnos que la asistieramos en implementar Pascal en otras m¶aquinas, enfatizando que
pensaban usarlo para ense~nanza, y que la velocidad no era tan importante. Con esto fue que
{118{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
nos decidimos a escribir un compilador que generar¶³a c¶odigo para una m¶aquina de nuestro
propio dise~no. Este c¶odigo ser¶³a conocido luego como c¶odigo-P. El la versi¶on de c¶odigo-P
era f¶acil de construir, porque el nuevo compilador estaba dise~nado como un gran ejercicio
de programaci¶on estructurada, donde hab¶³a que usar re¯namiento paso a paso. Pascal-P re-
sult¶o ser tremendamente exitoso, extendiendo el uso del lenguaje entre muchos usuarios. Si
hubiesemos tenido la visi¶on su¯ciente como para poder preveer los alcances de este lenguaje,
hubiesemos puesto mayor cuidado en el desarrollo, dise~no y documentaci¶on del c¶odigo-P. Sin
embargo, as¶³ como qued¶o, fue algo que vali¶o la pena. Esto muestra que a¶un con las mejores
intenciones en mente, uno puede elegir sus propias metas equivocadamente.
Pero Pascal reci¶en gan¶o un reconocimiento verdadero cuando Ken Bowles, en San Diego,
reconoci¶o que el sistema Pascal-P pod¶³a implementarse en las microcomputadoras, que aca-
baban de aparecer. Sus esfuerzos en lograr un entorno adecuado, con un compilador, editor
y depurador integrados, causaron sensaci¶on: Pascal pas¶o a estar disponible a miles de nuevos
usuarios, que ya no ten¶³an sobre sus espaldas el peso de h¶abitos adquiridos de programaci¶on,
y no estaban urgidos por mantener compatibilidad con el software del pasado.
Mientras tanto, termin¶e de trabajar con Pascal, y me decid¶³ a investigar un ¶area nueva:
multiprogramaci¶on. Aqu¶³, Hoare ya hab¶³a sentado bases s¶olidas, y Brinch Hansen hab¶³a
marcado el camino con su Pascal concurrente. El intento de \destilar" reglas concretas para
una disciplina de multiprogramaci¶on me llev¶o r¶apidamente a formularlas en t¶erminos de
un peque~no conjunto de facilidades para programar. A ¯n de someter estas reglas a alg¶ un
tipo de test, las puse en un lenguaje semicompleto, al que le puse un nombre que re°ejara
mi meta principal: modularidad en programaci¶on. El m¶odulo result¶o ser m¶as adelante la
principal caracter¶³stica de este lenguaje. A trav¶es de este concepto, el concepto abstracto de
ocultamiento de la informaci¶on (necesario en programaci¶on de sistemas) tomaba una forma
concreta, e incorporaba un m¶etodo que resultaba signi¯cativo tanto para multiprogramaci¶on
como para la programaci¶on tradicional. El lenguaje, llamado Modula, ten¶³a facilidades para
expresar procesos concurrentes y su sincronizaci¶on.
Hacia 1976, ya me hab¶³a cansado un poco de los lenguajes de programaci¶on, y de la
tarea frustrante de construir buenos compiladores para las computadoras existentes, las que
estaban dise~nadas para ser codi¯cadas \a mano", a la usanza antigua. Por fortuna, tuve la
posibilidad de pasar un a~no sab¶atico en el laboratorio de investigaci¶on de Xerox Corp, en
Palo Alto (California), donde se hab¶³a originado y puesto en pr¶actica el concepto de una
\workstation" personal y poderosa. En lugar de compartir una computadora monol¶³tica,
gigantesca, con varios usuarios, peleando por recibir atenci¶on de un sistema con 3KHz de
ancho de banda, ahora yo contaba con mi propio sistema, debajo de mi escritorio, con un
canal de m¶as de 15KHz. La capacidad de trabajo se hab¶³a incrementado 5000 veces. La
sensaci¶on m¶as particular fue que despu¶es de estar 16 a~nos trabajando con computadoras,
reci¶en ah¶³ la computadora parec¶³a estar trabajando para m¶³. Por primera vez empec¶e a usar
una computadora para escirbir reportes y manejar mi correspondencia, en lugar de ponerme
a plani¯car nuevos lenguajes, compiladores y cosas por el estilo. Otra revelaci¶on para m¶³ fue
la posibilidad de fabricar un compilador para el lenguaje Mesa, cuya complejidad era mucho
mayor que la de uno para Pascal; un compilador para Mesa pod¶³a implementarse en una
workstation como la que pose¶³a. Estas nuevas condiciones de trabajo ten¶³an tantos ¶ordenes
{119{
9 NIKLAUS WIRTH: EL CREADOR DE PASCAL
{120{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
{121{
9 NIKLAUS WIRTH: EL CREADOR DE PASCAL
su claridad y efectividad. Las soluciones simples, elegantes, son m¶as efectivas, pero son
m¶as dif¶³ciles de hallar que las complejas, y requieren m¶as tiempo, cosa que a menudo la
consideramos insoportable.
Antes de terminar, quisiera rescatar algunas de las caracter¶³sticas comunes de los pro-
yectos que se han mencionado. Una t¶ecnica muy importante, y que rara vez se usa tan
efectivamente como en ciencias de la computaci¶on, es el bootstrap. Nosotros lo usamos casi
en todos nuestros proyectos. Al desarrollar una herramienta, sea un lenguaje de programa-
ci¶on, un compilador, o una computadora, los dise~ n¶e de tal manera que resultara bene¯cioso
para el paso siguiente: PL360 fue desarrollado para implementar Algol W; Pascal fue de-
sarrollado para implementar Pascal; Modula-2, para implementar todo el software de una
workstation; y Lilith, para proveer un entorno adecuado para todo nuestr trabajo futuro,
desde la programaci¶on al desarrollo y documentaci¶on de circuitos, desde la preparaci¶on de
reportes al dise~
no de tipos de letra (fonts). El bootstraping es la forma m¶as efectiva de
sacar provecho de los esfuerzos de uno, as¶³ como tambi¶en de sufrir los errores que uno mismo
comete.
Esto hace que sea importante distinguir a tiempo entre lo que es esencial, y lo que es
ef¶³mero. Siempre intent¶e identi¯car y puntualizar lo que es esencial, y da bene¯cios incues-
tionables. Por ejemplo, la inclusi¶on de un esquema consistente y coherente de declaraciones
de tipo de dato en un lenguaje de programaci¶on es, para m¶³, un aspecto esencial, mientras
que los detalles de qu¶e tipo de sentencias FOR van a estar disponibles, o si el compilador
va a distinguir entre may¶ usculas y min¶usculas, son cuestiones ef¶³meras. En dise~no de com-
putadoras, considero que la elecci¶on de los modos de direccionamiento, y la provisi¶on de un
conjunto consistente y completo de instrucciones aritm¶eticas (incluyendo llamadas al siste-
ma, manejo de over°ow, etc) son esenciales; en contraste, los detalles de un mecanismo de
interrupci¶on prioritizada son m¶as bien perif¶ericos. A¶
un m¶as importante es asegurarse que lo
ef¶³mero nunca se impregne en el dise~no estructurado y sistem¶atico de las facilidades centrales
de un sistema; es mejor que aquello que es ef¶³mero sea a~ nadido posteriormente a un marco
preexistene, perfectamente bien estructurado.
A veces, es dif¶³cil rechazar las presiones de incluir todas aquellas facilidades que \ser¶³a
lindo tener". El peligro es que los deseos de complacer tales pedidos chocan contra el ob-
jetivo ¯nal de lograr un dise~no consistente. Yo siempre he intentado pesar las ganancias
versus los costos. Por ejemplo, al considerar la inclusi¶on de alguna caracter¶³stica especial a
un lenguaje, o alg¶ un tratamiento especial a alguna construcci¶on o sentencia por parte del
compilador, uno debe ponderar los bene¯cios frente a los costos agregados de su implemen-
taci¶on y su mera presencia, que van a ocasionar que el sistema sea mucho m¶as grande. Los
que dise~nan lenguajes a menudo fallan en este sentido. Yo admito con cierto placer que
ciertas caracter¶³sticas de Ada que no est¶an en Modula-2 ser¶³an \lindas de tener", pero, al
mismo tiempo, me pregunto si tenerlas valdr¶³a la pena por el costo que implican. Y este
costo es considerable. Pensemos que, aunque el dise~ no de ambos lenguajes comenz¶o en 1977,
los compiladores de Ada s¶olo comenzaron a aparecer hacia 1985, mientras que hemos estado
usando Modula-2 desde 1979. En segundo lugar, se rumorea que los compiladores de Ada son
programas gigantescos, que consisten de varios cientos de miles de l¶³neas de c¶odigo, mientras
que nuestro ¶ultimo compilador de Modula tiene s¶olo unas cinco mil l¶³neas de c¶odigo. Yo
{122{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
con¯eso que este compilador de Modula est¶a ya en los l¶³mites de una complejidad compren-
sible, y que yo mismo me sentir¶³a incapaz de construir un buen compilador para Ada. Pero
a¶un si se ignora el esfuerzo de construir sistemas innecesariamente grandes, y el costo en
memoria para contener su c¶odigo, el costo real est¶a oculto en los esfuerzos (que nadie ve) de
los inumerables programadoses que intentan desesperadamente entender estos compiladores
para usarlos efectivamente.
Otra caracter¶³stica com¶
un de los proyectos presentados anteriormente fue la elecci¶on de
herramientas. Creo que una herramienta debe estar a tono con el producto; debe ser tan
simple como sea posible, pero no m¶as simple que eso. Una herramienta es de hecho contra-
producente cuando lograr una gran parte de un proyecto est¶a sujeto a ser un experto en usar
dicha herramienta. En los proyectos Euler, Algol-W y PL360, muchas de las consideraciones
estuvieron puestas en el desarrollo de t¶ecnicas de an¶alisis sint¶actico bottom-up, guiadas por
tablas. M¶as adelante, volv¶³ al m¶etodo top-down recursivo descendente, que es f¶acilmente
comprensible y sin lugar a dudas su¯cientemente poderoso, si la sintaxis del lenguaje est¶a
elegida de una manera inteligente. En el desarrollo del hardware de Lilith, nos restringimos
a un buen osciloscopio; solo una que otra vez necesitamos un analizador de estados l¶ogicos.
Esto fue posible debido a conceptos sistem¶aticos y sin trucos utilizados en el procesador.
Cada proyecto en s¶³ mismo fue, principalmente, una experiencia de aprendizaje. Uno
aprende m¶as cuando inventa. Solamente haciendo un proyecto de desarrollo uno puede ganar
su¯ciente familiaridad con las di¯cultades intr¶³nsecas, y su¯ciente con¯anza para dominar
los detalles inherentes al mismo. Yo nunca pude separar el dise~ no de un lenguaje de su
implementaci¶on, ya que una de¯nci¶on r¶³gida sin la retroalimentaci¶on de la construcci¶on de
su compilador, me parecer¶³a algo presuntuoso y poco profesional. De esta manera, particip¶e
en la construcci¶on de compiladores, dise~no de circuitos, e incluso en la conexi¶on de cableado.
Esto puede parecer extra~no, pero simplemente me gusta la experiencia real, \hands-on",
mucho m¶as que el manejo de un equipo. Tambi¶en he aprendido que los investigadores
aceptan el liderazgo de un miembro del equipo que \se ensucie las manos", mucho m¶as
f¶acilmente que de un experto de organizaci¶on, sea ¶este un manager de la industria, o un
profesor universitario. Yo intento tener en mente que el ense~ nar dando un buen ejemplo es
uno de los m¶etodos m¶as efectivos, y a veces, el u¶nico disponible.
Finalmente, cada uno de estos proyectos fue llevado a cabo con el entusiasmo y el deseo
de triunfar, sabiendo que el desaf¶³o val¶³a la pena. Esto quiz¶as sea el prerequisito esencial,
pero tambi¶en el m¶as sutil y dif¶³cil de explicar. Tuve la suerte de tener miembros en mi equipo
que se dejaron \infectar" con entusiasmo, y en esta conferencia tengo la oportunidad de dar
gracias a todos elllos por su valiosa contribuci¶on. Mi sincero agradecimiento va tambi¶en a
todos aquellos que participaron, en forma directa, trabajando en el equipo, o bien indirecta,
testeando nuestros resultados y contribuyendo con ideas a trav¶es de cr¶³ticas y palabras de
aliento, as¶³ como tambi¶en aquellos que formaron sociedades de usuarios. Sin ellos, ni Algol
W, ni Pascal, ni Modula-2, ni Lilith habr¶³an llegado a ser lo que son. Este premio Turing
tambi¶en honra sus contribuciones.
Niklaus Wirth
{123{
Resoluci¶o n de Problemas y Algoritmos { Ejercitac. y algunas consideraciones te¶o ricas { Carlos I. Ches~
n evar
Referencias
[1] Diccionario Enciclop¶edico Abreviado Espasa-Calpe. Ed.Espasa-Calpe, Madrid, Espa~na,
1972.
[6] Jenkins-Murphy, A. Grammar Review for the TOEFL. HBJ Publishers, New York,
1982.
[7] Jensen, K. y Wirth, N. PASCAL. User Manual and Report (2nd.Ed.) Springer-
Verlag, New York, 1975.
[9] Mandell, M. Acertijos Fant¶asticos. Ed. Juegos & Co. { Zugarto Ediciones, 1995.
[10] Perelman, Y.I. Matem¶aticas Recreativas. Ed. en Lenguas Extranjeras, URSS, 1959.
{125{
¶Indice de Materias
Pascal Compilador, 106
Wirth: El creador de, 114 Condici¶on
Turbo Pascal Qu¶e es una, 30
Opci¶on de Archivo (File), 94 Condiciones
Opci¶on de Ayuda (Help), 101 Aspectos avanzados, 39
Opci¶on de B¶usqueda (Search), 96 Bloques de acciones y su relaci¶on con,
Opci¶on de Compilaci¶on (Compile), 98 41
Opci¶on de Depuraci¶on (Debug), 98 Situaciones redundantes en, 42
Opci¶on de Edici¶on (Edit), 95 Conjunci¶on
Opci¶on de Ejecuci¶on de programas Operador l¶ogico de, 32
(Run), 97 Constantes
Opci¶on de Ventana (Window), 100 Declaraci¶on de, 71
Opciones varias (Options), 100 Cortar y Pegar, 105
Teclas utilizadas en, 102
Teclas utilizadas en editor, 103 Datos booleanos, 35
Consideraciones para manejo, 93 Aplicaci¶on de, 36
Men¶u de opciones de, 94 De Morgan, Leyes de, 41
Unix, 108 Directorio, 106
Disyunci¶on
Abortar, 104 Operador l¶ogico de, 33
Algorimtos
con fechas, 46 Editar, 106
Algoritmo Editor de Textos, 106
para conjetura de Goldbach, 48 Ejercicios
para n¶umeros romanos, 47 de trazas, 44
Teorema de Fermat, 47 sobre algoritmos sencillos, 45
Algoritmos Estado
para series, 46 inicial, 19
Archivo, 104 meta, 19
Archivo de texto, 105 Estados, 19
B¶
usqueda espacio-estado, 19 Funciones, 81
Bloque de texto, 105 De¯nici¶on de, 72
Boole, George, 34 Invocaci¶on de, 82
Breakpoint Glosario de t¶erminos de computaci¶on, 104
en Turbo Pascal, 99 Grabar, 106
C¶odigo ejecutable, 106 Identi¯cador, 70
Cadena, 105 Invocaci¶on a procedimientos, 78
Camino, 19
Cancelar, 106 Lenguaje de programaci¶on, 69
Cargar, 106 Login, 106
127
¶INDICE DE MATERIAS
Recomendaciones
sobre clases pr¶acticas, 8
sobre ejercicios resueltos, 8
Sem¶antica, 69
Sentencia compuesta, 75
Sentencia de asignaci¶on, 74
Sentencia vac¶³a, 75
Sentencia If-Then-Else, 74
Sentencia Read, 77
{128{