Está en la página 1de 0

Resolucion de problemas y algoritmos

Ejercitacion y algunas consideraciones teoricas


Mg. Carlos Ivan Ches~nevar
Baha Blanca, febrero de 1997 (2da. Edicion)
Prohibida su reproduccion sin autorizacion del autor (Ley 11.723 de Propiedad Intelectual)
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Prefacio de la Segunda Edicion
El presente texto constituye la segunda version del presentado originariamente en febrero de
1995. Las principales modicaciones incluidas en esta segunda edicion son las siguientes:
Se corrigieron distintos ejercicios en los cuales aparecan errores tipogracos, princi-
palmente en los captulos 1, 2 y 3.
Se incluyo un ndice analtico para facilitar la busqueda de un concepto determinado
dentro del texto.
Se agregaron ejercicios referidos a la traza de bloques de acciones.
Mi agradecimiento para aquellos alumnos que me han comunicado errores tipogracos a
corregir, y me han hecho llegar comentarios y opiniones sobre distintos aspectos que parecan
suceptibles de ser mejorados. Naturalmente, este proceso de correccion y depuracion de un
texto es constante, por lo que son bienvenidos los comentarios, crticas y sugerencias que
permitan mejorar esta segunda edicion.
Mg. Carlos Ivan Ches~nevar
Baha Blanca, febrero de 1997
{iii{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar

Indice General
1 A modo de introduccion 1
2 Resolucion de problemas: ejercitacion 7
2.1 Motivaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Problemas varios (enunciados) . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Respuesta a los problemas planteados . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Problemas adicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3 Uso de condiciones en algoritmos: generalidades 27
3.1 >Que es una condicion? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2 Operadores logicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.1 Operador logico \y" (conjuncion) . . . . . . . . . . . . . . . . . . . . 29
3.2.2 Operador logico \o" (disyuncion) . . . . . . . . . . . . . . . . . . . . 30
3.2.3 Operador logico \no" (negacion) . . . . . . . . . . . . . . . . . . . . . 31
3.3 Condiciones mas complejas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.4 Datos booleanos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.5 Uso de condiciones: aspectos mas avanzados . . . . . . . . . . . . . . . . . . 36
3.5.1 Datos booleanos y la resolucion de problemas complejos . . . . . . . . 36
3.5.2 Propiedades de los operadores logicos . . . . . . . . . . . . . . . . . . 37
3.5.3 Bloques de acciones y condiciones . . . . . . . . . . . . . . . . . . . . 38
3.5.4 Otras propiedades interesantes . . . . . . . . . . . . . . . . . . . . . . 39
4 Algoritmos en Lenguaje de Dise~no - Ejercicios 41
5 De algoritmos en lenguaje de dise~ no a programas en Pascal 67
5.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.2 >Que es la sintaxis? La notacion bnf . . . . . . . . . . . . . . . . . . . . . . 67
5.3 La sintaxis de Pascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.3.1 Declaracion de constantes . . . . . . . . . . . . . . . . . . . . . . . . 69
5.3.2 Declaracion de tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.3.3 Declaracion de variables . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.3.4 Denicion de procedimientos y funciones . . . . . . . . . . . . . . . . 70
{v{

INDICE GENERAL
5.3.5 Bloque de sentencias . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
5.4 Procedimientos y Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.4.1 Principales diferencias entre procedimientos y funciones . . . . . . . . 77
5.4.2 Procedimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.4.3 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6 Sugerencias para la impresion de dibujos en Pascal 83
7 Consideraciones para manejo de Turbo Pascal 7.0 93
7.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
7.2 Como empezar a trabajar en Turbo Pascal . . . . . . . . . . . . . . . . . 93
7.3 El men u de opciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.3.1 File (Archivo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
7.3.2 Edit (editar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
7.3.3 Search (busqueda) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
7.3.4 Run . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
7.3.5 Compile (compilar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.3.6 Debug (depurar) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
7.3.7 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
7.3.8 Window (Ventana) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
7.3.9 Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
7.4 Teclas utilizadas en Turbo Pascal . . . . . . . . . . . . . . . . . . . . . . 102
7.4.1 Teclas fundamentales . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
7.4.2 Teclas mas utilizadas dentro del editor . . . . . . . . . . . . . . . . . 103
7.5 Glosario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
8 Apendice: el ingles en computacion y su incidencia en nuestro idioma 109
8.1 Palabras cuestionables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
8.2 Otros problemas comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
9 Niklaus Wirth: el creador de Pascal 115
Indice de materias 127
{vi{
Hombre que sangra
Sangro sangre de letras y papeles
en la entrega total de cada da,
lloro llanto de paginas y frases,
muero muertes de espacios y de lneas.
Conmover el gran muro de silencio
e incomunicacion que nos aisla,
es la ambicion que pongo en cada gota
de sangre blanca y lagrima de tinta.
Transmitir es crear en largo y ancho,
un mensaje de amor que abrace y llegue
a un despues de expirar el propio canto.
Cumplire en esa ley todas las leyes,
sin saber hasta cuando ire sangrando
con mi sangre de letras y papeles.
Julio Nicolas de Vedia
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
1 A modo de introduccion

Ubung macht den Meister
(\La practica hace al maestro"; refran aleman)
El presente texto constituye una compilacion de distintos apuntes y material comple-
mentario de ejercitacion elaborados para el dictado de la materia \Introduccion a la In-
formatica",
1
, en la cual me he desempe~nado como asistente de docencia en el perodo 1993{
1995, y como profesor desde 1996. El objetivo perseguido a traves de este material es
simplemente potenciar el aprovechamiento de las clases practicas, que resultan indispensa-
bles para una formacion acabada en cualquier disciplina, y muy en especial en las Ciencias
de la Computacion.
Como es sabido, al asistente de docencia le cabe la responsabilidad de guiar las clases
practicas, coordinando el trabajo de los ayudantes, y conforme las pautas asignadas por el
profesor de la materia. La preparacion de ejercicios y presentacion de temas complementarios
a las clases teoricas dio como resultado la elaboracion de los distintos textos y apuntes
complementarios aqu presentados, a nes de apuntalar muchos de los conceptos vertidos
originalmente a traves de explicaciones en el pizarron.
Es importante resaltar que la contribucion que pretende aportar gran parte del material
presentado se enmarca dentro de una metodologa elaborada conjuntamente por los profeso-
res Ing. Silvia Castro, Lic. Sonia Rueda y Lic. Marcelo Zanconi, y utilizada para el dictado
de la primer materia especca de la carrera de Lic. en Ciencias de la Computacion en la
Universidad Nacional del Sur. Dicha metodologa comprende un desarrollo integral de dis-
tintos temas tratados puntual o separadamente en textos sobre programacion y resolucion de
problemas, y ha sido volcada en un texto elaborado por los docentes antes mencionados [11].
Estructuracion
El texto esta estructurado en distintas secciones, independientes entre s. Cada una de las
secciones involucra un tema especco, vinculado con ejercitacion o bien con consideraciones
teoricas adicionales referidas a la resolucion de ejercicios. La nomina de los temas tratados,
junto con una sucinta descripcion de ellas, es la siguiente:
1. Resolucion de Problemas: ejercitacion
Esta seccion comprende la presentacion de distintos ejercicios resueltos, detallandose
brevemente el enfoque aplicado en cada caso, el cual ya ha sido presentado formalmente
en las clases teoricas. Se incluyen asimismo algunos conceptos utiles para resolucion de
problemas, tales como espacio de busqueda y analisis de mundos posibles. Este ultimo
enfoque {cuyos fundamentos provienen del ambito de la Inteligencia Articial{ permite
modelar adecuadamente distintos problemas de logica, haciendo que su resolucion sea
mas sencilla y ordenada.
1
Actualmente sus contenidos corresponden a la asignatura \Resolucion de problemas y algoritmos".
{1{
1 A MODO DE INTRODUCCI

ON
2. Uso de condicionales
Aqu se hace un analisis descriptivo del uso de las condiciones en el lenguaje de di-
se~ no presentado a nivel teorico. Se comentan, entre otros temas, el signicado de las
condiciones compuestas, el uso de variables booleanas y las leyes de De Morgan.
3. Algoritmos en lenguaje de dise~no: ejercicios resueltos
Se incluyen aqu diferentes tipos de ejercicios que involucran plantear algoritmos en
lenguaje de dise~ no. Se incluye la resolucion de dichos ejercicios, detallandose en al-
gunos casos la estrategia de resolucion empleada. Se intento escoger ejercicios que
evidencien situaciones caractersticas al momento de plantear un algoritmo, tales como
uso de banderas, condiciones booleanas compuestas, ventajas de una modularizacion
adecuada, creacion de primitivas ad hoc para resolver un problema dado, etc.
4. De Algoritmos a Pascal
En esta seccion se hace una breve descripcion de la equivalencia entre distintos con-
ceptos presentados en lenguaje de dise~ no y su adecuacion a la sintaxis del lenguaje
Pascal. Se mencionan entre otras cosas el uso de la notacion bnf y las diferencias
esenciales entre procedimientos y funciones.
5. Sugerencias para realizar guras en pantalla
La realizacion de guras en la pantalla utilizando dgitos o caracteres especiales permite
lograr una rapida familiarizacion con conceptos tales como modularizacion, anidamien-
to de bucles y denicion de variables en funcion de otras. Esta seccion incluye distintas
sugerencias y ejercicios resueltos que involucran guras en pantalla.
6. Consideraciones sobre manejo de TURBO PASCAL 7.0.
Aqu se presenta una gua sucinta de las principales caractersticas de Turbo Pascal
7.0.
2
La inclusion de la misma obedece a que esta es una de las versiones de Pascal
mas difundidas en el ambito de las computadoras personales, a las cuales suelen tener
acceso los alumnos. Se incluye asimismo un breve glosario de terminos informaticos
{cuyo signicado es obviamente nuevo para la gran mayora de los ingresantes{ a n
de facilitar un aprendizaje gradual de los mismos.
7. El ingles en computacion y su incidencia en nuestro idioma
Se analizan distintos giros, terminos y convenciones tipogracas derivados del ingles
que se usan a menudo en computacion, y cuyo signicado puede ser confuso o ambiguo.
8. Niklaus Wirth: el creador de Pascal
Se incluye un breve apendice con datos sobre el creador del lenguaje Pascal, Niklaus
Wirth. Se presenta el texto de la conferencia que ofrecio cuando le fue concedida la
Turing Award Lecture 1984.
2
Turbo Pascal es una marca registrada por Borland Inc.
{2{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Recomendaciones generales sobre las clases practicas
La nalidad de las clases practicas es permitir que el alumno internalice los conceptos dados
en las clases teoricas, a traves de la resolucion de ejercicios. Para cada tema teorico se
proponen distintos ejercicios, enunciados en uno o varios Trabajos Practicos.
Los docentes en las clases practicas cumplen esencialmente una funcion orientadora.
El asistente y los ayudantes brindan sugerencias y consejos acerca de como encarar las
distintas clases de ejercicios. Ocasionalmente, se desarrollaran en el pizarron ejercicios que
caracterizan una \clase" de problemas, as como aquellos ejercicios en los que una gran parte
de los alumnos haya tenido dicultades.
Si bien no existe una unica metodologa de trabajo que resulte en un aprendizaje ecaz,
debe tenerse en cuenta que el esfuerzo propio y la ejercitacion realizada por el alumno
son los ingredientes esenciales para aprobar los examenes parciales. Debe evitarse
la tentacion de recurrir a los docentes para que estos desarrollen para el alumno la solucion
de los \ejercicios difciles". Es preferible acudir a ellos con preguntas concretas acerca de
como superar las dicultades que impiden resolver dichos ejercicios.
Encontrar obstaculos y adquirir la capacidad de superaralos es parte esencial del proceso
de aprendizaje. No es lo mismo entender el desarrollo de un problema realizado por otra
persona que ser uno mismo quien resuelve dicho problema.
Recomendaciones acerca del uso de ejercicios resueltos
Advertencia importante: Las soluciones para los distintos ejercicios que se incluyen
en todo material auxiliar utilizado para las clases practicas son de caracter tentativo. Las
soluciones presentadas en este texto pretenden brindar una referencia para el alumno en lo
que respecta a vocabulario tecnico, secuencia logica y ordenamiento de los pasos a seguir. En
muchos casos, junto con la solucion tentativa de un ejercicio, se explica un metodo o tecnica
que permite resolver toda una \clase" de ejercicios similares. El alumno debe determinar
cuando es conveniente aplicar dichos metodos y tecnicas para resolver un ejercicio dado.
Algunas de las razones que motivaron la inclusion de ejercicios resueltos como material
auxiliar para las clases practicas son las siguientes:
Agilizar el funcionamiento de las clases practicas:
Por diversas razones, es frecuente que muchos alumnos concurran a las clases practicas
con el unico n de constatar si se explicara el desarrollo de algun ejercicio difcil del
practico; otros desean solamente vericar si la solucion encontrada para un ejercicio
particular fue la correcta. Dado que el n umero de ayudantes suele ser escaso para
la proporcion de alumnos de la materia, el ritmo con que se atienden las dudas de
los alumnos tiende a ser bajo; en ciertos casos, hay alumnos que deben esperar a
que el ayudante se \desocupe" para poder resolver una pregunta simple. Disponer de
la solucion para los ejercicios puede ayudar a resolver dudas y preguntas sencillas, y
brinda un mecanismo de control para las respuestas obtenidas.
{3{
1 A MODO DE INTRODUCCI

ON
Estimular la capacidad de autoaprendizaje:
Contar con un enunciado para un problema y disponer de una respuesta tentativa
para el mismo en otra hoja brinda un estmulo adicional para atacar ese ejercicio,
pues se tiene la posibilidad de corroborar si el resultado alcanzado es correcto, o si
el metodo de resolucion empleado es el adecuado. Por otro lado, trabajar de esta
manera incentiva la madurez del alumno, ya que no se trata de resolver el ejercicio
con el mero n de \tenerlo hecho"; la motivacion para encarar el ejercicio es descubrir
como resolverlo, y constatar que la solucion obtenida es correcta.
Brindar un elemento de referencia:
El aprendizaje \por analoga" consiste en analizar e imitar los metodos y estrategias
utilizados por personas experimentadas para resolver problemas en cierto ambito, para
aplicarlos luego a la solucion de problemas nuevos.
As, por ejemplo, al aprender a programar, suele ser conveniente ver programas hechos
por otras personas. Un programa bien escrito puede ense~ nar un truco o una tecnica
novedosa para encarar un problema, y esa tecnica puede generalizarse luego a otros
problemas.
Optimizar tiempo en las clases practicas:
Es corriente que, durante las clases practicas, se desarrollen ejercicios en el pizarron, a
n de orientar a los alumnos acerca de su solucion.
Disponer de las respuestas tentativas para los ejercicios no reemplaza el papel del
ayudante o asistente, pero si evita desaprovechar tiempo en preguntas o dudas cuya
respuesta pueden estar dadas por escrito de antemano. . . Asimismo, contar con una
resolucion modelo de ciertos ejercicios alienta a los alumnos a plantear preguntas y
dudas mas complejas acerca de la resolucion de dichos ejercicios (ej: otras formas de
resolver un mismo problema; uso de estrategias alternativas, etc.)
Lo que no hay que hacer. . .
\El que no sabe lo que busca, no entiende lo que encuentra"
(Alberto Salamanco)
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, estara perdiendo la oportunidad de aprender de la manera mas efectiva:
haciendo. La programacion, por ejemplo, es algo que se aprende esencialmente a traves de
la practica; no es posible memorizar algoritmos hechos por otras personas, pues las variantes
son innitas. La capacidad de programar bien es algo que se incorpora gradualmente; no es
algo mecanico, 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{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
El intentar resolver un ejercicio, aun cuando no se llegue a su solucion, ense~na algo.
Muestra aquellos aspectos del problema que uno fue capaz de develar, y {lo mas importante{
que aspectos no pudieron ser resueltos. La experiencia obtenida en la resolucion de
un ejercicio es intransferible. Aqu {como en la mayora de los procesos de aprendizaje-,
la experiencia es el mejor maestro, pero tambien el mas caro. . . Es normal que se deban
invertir varios das de estudio para adquirir habilidades de resolucion de problemas y de
desarrollo de algoritmos.
Uso de las resoluciones tentativas como herramienta de aprendizaje
Es conveniente que se intente resolver cada uno de los ejercicios propuestos. Si no se llega
a una solucion satisfactoria, pueden utilizarse las resoluciones dadas como un elemento de
ayuda. Debe tenerse presente que la resolucion que se adjunta al enunciado del ejercicio es
una solucion posible. Siempre es recomendable intentar ensayar soluciones alternativas a la
dada, si estas existen.
Si se llega a una solucion que se considera correcta, y la resolucion que se adjunta no
resulta util para confrontarla con esta, se sugiere recurrir a los docentes de la Catedra y
consultarlos acerca del enfoque utilizado para resolver el problema. Debe tenerse presente
que un elemento fundamental en computacion es la creatividad; si la solucion a la que
se arribo diere de la resolucion dada, esto no implica que dicha solucion no es correcta; la
solucion que se encuentre puede que sea correcta, pero quizas sea mas larga, mas complicada,
basada en otras estrategias, o simplemente mas ingeniosa.
Agradecimientos
Cabe agradecer a los profesores Marcelo Zanconi y Silvia Castro la correccion y revision de
distintos aspectos en la redaccion y estructuracion 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
\Informatica A".
Mg. Carlos Ivan Ches~nevar
Baha Blanca, febrero de 1997
Nota: este texto no constituye una publicacion ocial del Departamento de Ciencias de la Computacion de
la Universidad Nacional del Sur. Cualquier equvoco u omision involuntaria es exclusiva responsabilidad del
autor.
{5{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
2 Resolucion de problemas: ejercitacion
2.1 Motivaciones
En esta seccion se presentan diferentes tipos de problemas, para cuya resolucion deben
emplearse diferentes estrategias y metodologas.
Varios de los enunciados presentados (antecedidos con un asterisco) han sido reprodu-
cidos del Trabajo Practico N

1 utilizado en la materia \Introduccion a la Informatica"


durante los a~nos 1992, 1993 y 1994.
3
Otros enunciados fueron tomados y adaptados de los
libros \Matematicas Recreativas" [10], \Acertijos Fantasticos" [9], y de diversas revistas de
pasatiempos y entretenimientos matematicos.
En las respuestas desarrolladas se incluyen sugerencias que pretenden dilucidar ciertos
\puntos debiles" en la mayora de los alumnos ingresantes, tales como el planteo adecuado de
ecuaciones, formalizacion de hipotesis asociadas a un problema dado, y la mecanica utilizada
para la obtencion de conclusiones \por el absurdo". Se incluyen asimismo explicaciones
acerca de dos estrategias de resolucion de problemas que permiten atacar una amplia gama
de situaciones: \b usqueda espacio-estado" (aplicable a problemas que involucran hallar \cual
es el camino" que lleva a la solucion del problema) y \analisis de mundos posibles" (aplicable
a problemas de logica).
Algunas sugerencias. . .
Al desarrollar la resolucion de un ejercicio, es conveniente tener en cuenta los siguientes
puntos:
Expresar claramente toda suposicion 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 posicion
de aquella persona que analizara o corregira luego el desarrollo realizado.
Identicar claramente los elementos que ayudaron a resolver el problema, expresandolos
en un lenguaje preciso. Despojar dichos elementos de toda caracterstica adicional que
no contribuya a solucionar el problema en s.
Vericar no haber hecho uso de justicaciones ambiguas o confusas para obtener con-
clusiones relevantes a la solucion de un problema. Llegar a una conclusion correcta
a partir de premisas equivocadas suele carecer de valor al momento de evaluar cuan
correctamente se resolvio un ejercicio.
3
El autor del presente texto se remitio a transcribir dichos enunciados, redactando las soluciones y acer-
camientos para los mismos que se muestran posteriormente.
{7{
2 RESOLUCI

ON DE PROBLEMAS: EJERCITACI

ON
2.2 Problemas varios (enunciados)
Ejercicio 2.1 (*) Hallar tres numeros consecutivos cuya suma sea 69.
Ejercicio 2.2 (*) Una persona tiene 50 a~ nos, y su hijo 20. >Dentro de cuantos a~nos la edad
del padre sera el doble que la de su hijo?
Ejercicio 2.3 (*) En un corral hay conejos y gallinas. Se cuentan 140 patas y 50 cabezas.
>Cuantos conejos hay?
Ejercicio 2.4 (*) >Cuanto 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 (*) >Que edad tendra Juan en el a~no 2000, sabiendo que esa edad sera 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 mas por la y por columna, y faltan 46. >Cuantos
alumnos tiene la escuela?
Ejercicio 2.7 (*) Un automovil pasa frente a un mojon que tiene la numeracion AB km;
una hora mas tarde pasa por otro que tiene la numeracion BA km; y una hora despues
pasa por el mojon A0B km. >Que n umeros tienen los mojones y cual es la velocidad del
automovil?
Ejercicio 2.8 (*) 42 personas toman parte de un baile. Durante la esta una dama bailo
con 7 caballeros, una segunda dama con 8, una tercera con 9, y as sucesivamente hasta que
la ultima bailo con todos los hombres. >Cuantas damas haba 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. >Cuanto se tardara en llenar el tanque si las
tres canillas funcionan simultaneamente?
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 cual de los dos gemelos hable?
Ejercicio 2.11 (*) Un campesino debe extraer 6 litros de agua de ro, pero al hacerlo se
da cuenta de que solo tiene 2 recipientes de capacidad 9 y 4 litros. >Podra llevar a cabo su
tarea? >Como?
{8{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Ejercicio 2.12 (*) Una isla esta habitada por dos tribus. Los miembros de una tribu
siempre dicen la verdad, los de la otra mienten siempre. Un misionero encontro a dos de
estos nativos: uno alto y el otro petiso. \Eres de los veraces" pregunto al mas alto. \Upf",
respondio el nativo. El misionero reconocio que esta era una palabra tribal que corresponda
a \s" o \no", pero no recordaba exactamente a que. El nativo petiso hablaba espa~nol,
de modo que el misionero le pregunto por lo que haba dicho su compa~nero. \El dijo s",
contesto el petiso, \pero el ser un gran mentiroso", agrego. >A que tribu perte neca cada
nativo?
Ejercicio 2.13 (*) En la orilla de un ro se encuentran un lobo, un repollo, y una oveja al
cuidado de un pastor, quien debe trasladarlos a la otra orilla del ro. Para esto dispone de
solamente un bote con capacidad para dos pasajeros, uno de los cuales debera ser necesaria-
mente el propio pastor. El pasajero restante sera el lobo, la oveja o el repollo. En ningun
momento el pastor debe dejar solos (en alguna de las orillas) al lobo y la oveja
(pues el lobo se comera a la oveja), o a la oveja y el repollo (pues la oveja se
comera el repollo). Indique como 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 fabrica. El joven va desde casa a la fabrica en 20 minutos; el viejo, en
30 minutos. >En cuantos minutos alcanzara el joven al viejo si este sale de casa 5 minutos
antes que el joven?
Ejercicio 2.15 >Cuantos a~ nos tenes?, le preguntaron a Ivan. El respondio: Tomad tres
veces los a~nos que tendre dentro de tres a~nos, restadle tres veces los a~nos que tena hace tres
a~nos, y resultara exactamente los a~nos que tengo ahora. >Cuantos a~ nos tiene Ivan?
Ejercicio 2.16 El hijo le dice al padre: \<Que extra~no! Los dgitos de tu edad, puestos
al reves, forman mi edad.". El padre le dice al hijo: \<Mira vos! Y encima mana~na es mi
cumplea~ nos, y mi edad sera el doble que la tuya. . . ". >Que edad tiene el padre? >que edad
tiene el hijo?
Ejercicio 2.17 En una esta hay estudiantes de computacion y estudiantes de medicina.
Los estudiantes de computacion siempre dicen la verdad, y los de medicina siempre mienten.
En una mesa hay cuatro estudiantes sentados. Al acercarnos, nos dicen al unsono: \Aqu, en
esta mesa, hay estudiantes de medicina y hay estudiantes de computacion". >A que carrera
pertenecen esos cuatro estudiantes?
Ejercicio 2.18 En una fabrica, 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 lquido vertido por las canillas cae en el recipiente, el cual tiene 1000 litros de
capacidad. Juan, estudiante de computacion, es el encargado de manejar este aparato.
{9{
2 RESOLUCI

ON DE PROBLEMAS: EJERCITACI

ON
Inicialmente, el recipiente esta vaco. 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 tambien
deba 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 contena el doble de jugo
que de soda. >A que hora Juan cerro ambas canillas?
Ejercicio 2.19 \>Cuantos a~nos tiene Jose?", dijo Pedro con voz inquieta. "Hace 18 a~nos,
recuerdo que era exactamente tres veces mas viejo que su hijo", le contesto. \Segun me
dijeron," a~ nade Julio, \Jose es ahora dos veces mas viejo que su hijo". >Cuantos a~nos tiene
Jose?
Ejercicio 2.20 \<Que curioso!" le dice Juan a Pedro. "Escrib un n umero de tres cifras,
restale la suma de sus dgitos, y el resultado sera divisible por 9."Pedro hace dos ejemplos
para probar la armacion de Juan:
831 - (8+3+1) = 819 (que es divisible por 9)
500 - (5+0+0) = 495 (que es divisible por 9)
Explique por que lo anterior se cumple, para cualquier n umero de tres cifras. Pista: piense
en la descomposicion decimal de un n umero de tres cifras cualquiera.
Ejercicio 2.21 Me dirijo a una conocida casa de cambio ubicada en calle San Martn. El
cajero me atiende con una sonrisa displicente. \Quisiera cambiar 10 pesos en coronas suecas",
digo con tranquilidad. El cajero me contesta: "Bueno, yo aca soy nuevo. Lo unico que se
es que un peso mas una corona sueca vale lo mismo que un marco aleman. Tambien me
dijeron que el valor de un peso equivale al valor de una corona sueca mas el de un yen. Ah,
me olvidaba: dos marcos alemanes son equivalentes a tres yens". Tras escuchar esto ultimo,
respiro aliviado. Ahora puedo decirle al cajero cuantas coronas suecas debo recibir a cambio
de mis 10 pesos. . . >Cuantas?
4
Ejercicio 2.22 Lul u, mi vecina, busca marido, y no sabe como decidirse entre sus tres
pretendientes. Durante toda la semana escuche sus suspiros y cavilaciones, mientras hablaba
en voz alta acerca de quien podra ser su futuro esposo.
El lunes dijo: \>Con quien me caso? >Con el que vive en Cnel.Pringles, con el empresario o
con el ganadero?".
El martes dijo: \>Con quien me caso? >Con el que tiene un Alfa Romeo, el que tiene un
Mercedes o el viudo?".
El miercoles dijo: \>Con quien me caso? >Con el estudiante de computacion, el que vive en
Nueva York o el que tiene yate?".
El jueves dijo: \>Con quien 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 validas actualmente.
{10{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
vive en Nueva York?".
El viernes dijo: \>Con quien me caso? >Con el ganadero, el que tiene un Mercedes o el
estudiante de computacion?".
El sabado ya haba elegido. Tras una llamada telefonica, el estudiante de computacion
vino a buscarla en su Alfa Romeo. Indique cuales todas las caractersticas de cada uno de
los tres pretendientes de Lul u.
2.3 Respuesta a los problemas planteados
Ejercicio 2.1 Si x es el primero de los tres numeros, los dos restantes son x + 1 y x + 2.
Puede entonces plantearse la siguiente ecuacion de primer grado: x +(x+1) +(x+2) = 69.
Simplicando, de ah se deduce que 3x + 3 = 69 ! 3x = 66 ! x = 22.
Obs.: cabe recordar que una ecuacion de grado n, de la forma c
n
x
n
+c
n1
x
n1
+ +c
1
x
1
+c
0
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 ecuacion:
(50 +x) = 2(20 + x)
(esto es, en x a~ nos a partir de ahora, la edad del hijo sera 20 + x, y la del padre 50 +
x; la ecuacion reeja la condicion de que la edad del hijo sea el doble que la del padre).
Simplicando la ecuacion planteada, resulta 50 +x = 40+2x ! x = 10. Luego, dentro de
10 a~nos, la edad del hijo sera 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 solucion del par de ecuaciones 4x+2y = 140 y x+y = 50. Aplicando alguno
de los metodos conocidos para resolucion de ecuaciones (ej: sustitucion), resulta x = 20 e
y = 30. Luego hay 20 conejos y 30 gallinas.
Ejercicio 2.4 Para que el tren atraviese totalmente el tunel, es necesario que lo recorra
de punta a punta, y que el ultimo vagon del tren abandone el tunel. Luego la distancia a
recorrer es 1600 metros + 200 metros = 1800 metros. Aplicando la formula de velocidad =
distancia/tiempo, resulta:
Tiempo =
distancia
velocidad
=
1800m
15m=s
= 120 segs. = 2 minutos
{11{
2 RESOLUCI

ON DE PROBLEMAS: EJERCITACI

ON
Ejercicio 2.5 Puede asumirse que Juan nacio en el siglo XX, ya que de haber nacido en
el siglo XIX, para el a~no 2000 tendra mas de 100 a~nos, y es imposible que la suma de 4
dgitos (esto es, 1 +8 +x +y) sea mayor que 100.
Luego, de aqu se deduce que Juan nacio en el a~ no \19xy", donde x e y son dgitos.
5
Deben determinarse ahora los valores de las decenas y las unidades. El a~ no \19xy" puede
expresarse por su descomposicion en base 10 como el numero
1:10
3
+ 9:10
2
+ x:10
1
+y:10
0
= 1900 +10x + y
Por lo tanto, segun los datos del enunciado, se sabe que 1 +9 + x + y = 2000 \19xy",
es decir 10+x +y = 2000 (1900 +10x+y). Simplicando, resulta 11x +2y = 90 (1) Esta
es una ecuacion a dos variables, y tiene como tal innitas soluciones en los numeros reales.
Sin embargo, se sabe tambien que x e y son dgitos, 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, habra 100 combinaciones distintas de x
e y que deberan ensayarse para averiguar que valores satisfacen la ecuacion (1). Se empleara
un mecanismo \por tanteo" para estimar que valores de x e y resultan ser aceptables.
Se sabe que 2y 18, para cualquier dgito 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 dgito). Luego necesariamente x = 8, y despejando resulta y = 1. Juan
nacio 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. Segun el enunciado,
sobran 25 ni~ nos para que el cuadrado de x ni~ nos de lado quede formado. Esto es x
2
= 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 ecuacion (x + 1)
2
= T + 46. Despejando T en ambas ecuaciones,
resulta la igualdad
x
2
+25 = x
2
+ 2x + 1 46
25 = 2x 45
x = 35
Luego el cuadrado formado inicialmente tena 35 ni~nos de lado, y la escuela tiene 35
2
+25 =
1250 ni~ nos.
5
Las comillas en \19xy" fueron usadas para diferenciar el numero de a~no formado por los dgitos 1, 9, x
e y del producto 19:x:y
{12{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Ejercicio 2.7 Primeramente, es conveniente realizar una representacion graca 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) >Como expresar la distancia entre mojones? El numero que tiene
un mojon puede indicarse numericamente como en el caso del problema 2.5. As, el mojon
\AB" tiene asociado el n umero 10A+ B.
Luego, (1) puede expresarse como
(10B + A) (10A+ B) = (100A+ B) (10B +A)
Simplicando, resulta:
9A+ 9B = 99A 9B
0 = 108A 18B; donde 0 A 9; y 0 B 9
Puede hacerse luego un analisis similar al ejercicio 2.5: es claro que A = 1, ya que
si A = 0, entonces B = 0, y los tres mojones en cuestion seran 00, 00 y 000, lo que no
tiene sentido.
6
si A > 1 (p.ej: A = 2), se obtiene la ecuacion 0 = 216 18:B, y es claro que no existe
ningun dgito B que permita satisfacer esta ecuacion (lo mismo vale para valores A =
3, 4, etc.)
Luego necesariamente A = 1. Resulta entonces 0 = 10818:B ! B = 108=18 = 6. Los
numeros de los tres mojones eran entonces 16, 61 y 106. La velocidad del automovil puede
calcularse a partir de la diferencia de distancia entre dos mojones consecutivos cualesquiera,
p.ej. (61-16) = 45 km/h.
Ejercicio 2.8 Se sabe que cada dama bailo con un n umero distinto de caballeros, es decir:
1ra. dama bailo con 7 caballeros.
2da. dama bailo con 8 caballeros.
3ra. dama bailo con 9 caballeros.
6
Esto de hecho sera una solucion valida, asumiendo que el automovil se quedo parado todo el tiempo
frente al mismo mojon. En tal caso, su velocidad sera cero.
{13{
2 RESOLUCI

ON DE PROBLEMAS: EJERCITACI

ON
De aqu se deduce que n-esima dama bailo con n + 6 caballeros. Si la n-esima dama es
la ultima dama presente en el baile, esto quiere decir que ella bailo con todos los caballeros
(segun lo expuesto en el enunciado). Se sabe asimismo que nro.damas + nro.caballeros = 42.
Pero precisamente, si la ultima dama en bailar es la n umero n, el valor n representa tambien
la cantidad de damas presentes en el baile. La dama n-esima bailo 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 C
1
,C
2
y C
3
las tres canillas disponibles.
Calculemos ahora el n umero de litros que vierte cada canilla en un minuto. As, para C
1
resulta por regla de tres simple:
15 min. |{ T litros
1 min. |{ x litros
De aqu resulta que x = T=15 litros. Analogamente, se tiene T=20 y T=30 litros para las
canillas C
2
y C
3
respectivamente. Luego, si se abren las tres canillas simultaneamente, en
un minuto se vertiran (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 =
T
9
60
T
=
60
9
= 6; 66 minutos = 6' 40". Este es el tiempo que demorara
en llenarse el tanque abriendo las tres canillas simultaneamente.
Ejercicio 2.10 Un problema de este tipo puede resolverse \al tanteo", o bien empleando
alguna metodologa que ordene la informacion con la que se cuenta. Una estrategia aplicable
para este tipo de enunciados es el denominado \analisis de mundos posibles".
Analisis de mundos posibles
Se distingue por un lado la informacion de la \realidad". Esta informacion corresponde
a aquellos datos que indudablemente sabemos que son ciertos. En este caso, la \realidad"
esta dada por el hecho de que le pregunte 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:
1. Hable con Pipo. Pipo es veraz; Nino miente.
2. Hable con Pipo. Pipo miente; Nino es veraz.
3. Hable con Nino. Pipo es veraz; Nino miente.
4. Hable con Nino. Pipo miente; Nino es veraz.
{14{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Esquematicamente, esto puede representarse como:
8
>
>
>
>
>
>
<
>
>
>
>
>
>
:
Hable con Pipo
(
Pipo es veraz, Nino miente (1)
Pipo miente, Nino es veraz (2)
Hable con Nino
(
Nino es veraz, Pipo miente (3)
Nino miente, Pipo es veraz (4)
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 continuacion se muestra un analisis 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 <estara diciendo la verdad!)
Luego la unica situacion posible es la 3 o la 4. Pero en cualquiera de esos casos resulta
ser que he hablado con Nino, y el enunciado del problema precisamente pide determinar con
quien hable. Por el analisis anterior, necesariamente el gemelo con quien se hablo fue Nino.
Ejercicio 2.11 Este problema puede resolverse bastante facilmente por medio de una
tecnica graca llamada \b usqueda espacio-estado".
Busqueda espacio-estado
Un \estado" S es una situacion posible de las cosas a partir de los datos del enunciado.
La idea consiste en pasar de un estado inicial S a otros alternativos S
1
, S
2
, . . . S
n
, 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 solucion del problema. El camino denido por la secuencia de
estados existente entre S y M es la secuencia de pasos que permite arribar a la solucion.
Estos conceptos pueden verse mas claramente en el caso concreto del enunciado a resolver.
Primeramente, debe establecerse una representacion adecuada para un estado posible. En
nuestro caso, se representaran los dos recipientes del campesino con un par de numeros 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 vacos). >Cuales 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 expresara
dicendo que a partir del estado 0; 0, puede pasarse al estado 0; 4, 9; 0 y 9; 4. Gracamente:
0 0
/ | \
0 4 9 0 9 4
{15{
2 RESOLUCI

ON DE PROBLEMAS: EJERCITACI

ON
Luego, a partir de cada nuevo estado obtenido, se intentara 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 valida, pues se vuelve al estado
inicial de donde se comenzo).
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 !).
Puede volcarse el recipiente de 4 lts. en el de 9 lts., pasando al estado 4,0. A partir
de 4,0 la unica nueva alternativa es pasar a 4,4, y a partir de ah no puede pasarse a
ningun otro nuevo estado.
Por lo tanto, a partir de este analisis puede asegurarse que si el campesino llena primero
el recipiente de 4 lts., <jamas llegara 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 solucion.
Un analisis 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 solucion para el problema
planteado. A continuacion se muestra el desarrollo completo del problema, utilizando esta
tecnica:
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 solucion de manera analoga al problema de Pipo y Nino.
En la \realidad", se tiene:
Le pregunte a un 1er. nativo \>Eres de los veraces?" y responde \Upf".
{16{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
\Upf" signica \s" o \no".
Le pregunte a un 2do. nativo que haba dicho el 1er. nativo, y responde \Dijo que s
y el es un gran mentiroso".
Los \mundos posibles" pueden esquematizarse como sigue:
Upf signica
8
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
<
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
:
S
8
>
>
>
>
>
>
<
>
>
>
>
>
>
:
1er. nativo veraz
(
2do. nativo veraz (1)
2do. nativo miente (2)
1er. nativo miente
(
2do. nativo veraz (3)
2do. nativo miente (4)
No
8
>
>
>
>
>
>
<
>
>
>
>
>
>
:
1er. nativo veraz
(
2do. nativo veraz (5)
2do. nativo miente (6)
1er. nativo miente
(
2do. nativo veraz (7)
2do. nativo miente (8)
A continuacion, se hara un analisis de dichos mundos posibles:
1 Imposible. Si el 1er. y 2do. nativos son veraces, el 2do. nativo no podra nunca decir
\el es un mentiroso", pues estara mintiendo (absurdo).
2 Imposible. Si se asume que \Upf" signica \s", dado que el 2do. nativo miente, nunca
podra decir \El dijo que s" (pues el 2do. nativo estara diciendo la verdad).
3 Es posible.
4 Imposible por razon identica a 2).
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" signica necesariamente \s". Luego
los mundos posibles 5,6,7 y 8 quedas descartados.
En consecuencia, el unico mundo posible es 3. Luego, \Upf" signica \s", el 1er. nativo
miente y el 2do. dice la verdad.
Ejercicio 2.13 Puede plantearse en forma analoga al ejercicio del campesino. Los estados
posibles se representaran con A j B, queriendo decir con esto que A son aquellas cosas que
estan en la orilla izquierda y B las que estan en la orilla derecha.
Sea P = pastor; R= repollo; O = oveja; L = lobo. El estado inicial es PLRO j vac{o. Los
estados marcados con X representan caminos que no conducen a solucion, ya que resulta
ser que \alguien se come a otro". Puede verse que hay dos soluciones, las cuales pueden
obtenerse a partir del graco de busqueda que se detalla mas abajo.
{17{
2 RESOLUCI

ON DE PROBLEMAS: EJERCITACI

ON
PLRO j vac{o , LR j PO, PLR j O, L j PRO, PLO j R, O j PLR, PO j LR,
vac{o j PLRO.
PLRO j vac{o , LR j PO, PLR j O, R j PLO, POR j L, O j PLR, PO j LR,
vac{o j PLRO.
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 mas
que el joven. Si el viejo saliera 10 minutos antes que el joven, ambos llegaran a la fabrica
a la vez. Si el viejo ha salido solo 5 minutos antes, el joven debe alcanzarle precisamente
a mitad de camino; es decir, 10 minutos despues (el joven recorre todo el camino en 20
minutos).
Una solucion mas formal sera 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
sera v
1
= dc=20; la del obrero viejo, sera v
2
= 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 seran las mismas. A partir de la ecuacion (1), se sabe tambien que d = vt. Luego
puede plantearse la igualdad:
(d=20)x min: = (d=30)(x min: +5 min:)
(1=20)x min: = (1=30)(x min: + 5 min:)
{18{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
(3=2)x min: = x min + 5 min:
x = 10 min:
Ejercicio 2.15 Sea x la edad actual de Ivan. Cuando el dice tomad tres veces la edad que
tendre dentro de tres a~nos, eso equivale a 3(x +3). De igual manera, la edad que tena hace
tres a~ nos sera 3(x 3). De la armacion de Ivan, puede plantearse la ecuacion:
3(x +3) 3(x 3) = x
de donde resulta x = 18. Luego, la edad actual de Ivan es 18 a~nos.
Ejercicio 2.16 Es claro que obteniendo la edad del padre, automaticamente se tiene la del
hijo (invirtiendo los dgitos de la edad del padre).
Asumamos que el hijo tiene \xy
00
a~nos. Luego el padre tiene \yx
00
a~ nos. Para poder
manipular los dgitos de dichas edades, deberan expresarse en su descomposicion decimal.
As, \xy
00
es equivalente a 10x + y, con x e y dgitos.
Cuando el padre cumpla a~ nos, pasa a tener \yx
00
+ 1 a~ nos, y en ese momento, su edad
sera el doble que la del hijo, esto es, 2\xy
00
. Puede plantearse entonces la siguiente ecuacion:
\yx
00
+ 1 = 2\xy
00
A partir de la descomposicion decimal de los numeros \yx
00
y \xy
00
, lo anterior puede
expresarse como:
10y + x + 1 = 20x + 2y
de donde se deduce y = (19x 1)=8.
Se sabe que x e y deben ser dgitos. Para que esto suceda, x debe necesariamente ser un
dgito impar (para que y sea entero en la ecuacion anterior). Luego x puede ser 1,3,5,7 o
9. De todas estas alternativas, la unica aceptable es x = 3. Reemplazando, resulta y = 7.
Luego el hijo tiene 37 a~ nos, y el padre tiene 73.
Ejercicio 2.17 Denominemos con M al estudiante de medicina, y con C al de computacion.
En la mesa hay cuatro estudiantes sentados, y no sabemos quienes son M y quienes son C.
Hay 6 casos posibles:
1. Todos los estudiantes son M: es posible.
2. Hay un estudiante C, y los demas son M: imposible, pues los estudiantes M estaran
diciendo la verdad (\hay estudiantes de computacion").
3. Hay dos estudiantes C, y dos M: imposible (idem razonamiento en el caso 2).
{19{
2 RESOLUCI

ON DE PROBLEMAS: EJERCITACI

ON
4. Hay tres estudiantes C, y uno M: imposible (idem razonamiento en el caso 2).
5. Todos los estudiantes son C: imposible. Todos ellos siempre dicen la verdad, y sera
mentira decir que \. . . hay estudiantes de medicina".
El unico caso posible es el primero: todos los estudiantes mienten. Luego todos los estu-
diantes sentados a la mesa son de medicina.
Ejercicio 2.18 Llamemos C
j
a la canilla de jugo, y C
s
a la de soda. El hecho de que el
recipiente tenga 1000 litros no es relevante a la solucion del problema.
Nuestros datos son los siguientes:
7
La canilla C
j
vierte 10 lit./min, y la canilla C
s
vierte 7 lit./min.
La canilla C
s
se abre 10 minutos despues que la canilla C
j
.
En el momento de cerrar ambas canillas, el recipiente contiene el doble de soda que de
jugo (es decir, el volumen de lquido vertido por C
j
es la mitad que el de C
s
.
La canilla C
j
esta abierta 10 minutos. En ese tiempo, vertira 10 lit./min * 10 min = 100
litros. A partir de ese momento, se abre la canilla C
s
, que vertira 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 C
j
vierte 100 + 10x litros. La canilla C
s
vierte 7x litros. Seg un
el enunciado, sabemos que transcurridos esos x minutos, se cumple que C
j
arrojo el doble
que C
s
, es decir:
100 +10x = 2(7x)
Despejando, resulta
100 +10x = 2(7x)
100 +10x = 14x
100 = 4x
x = 25
Luego Juan cerro ambas canillas a los 25 minutos de que abriera C
s
. Como C
s
se abrio a las
10:10, las canillas fueron cerradas 25 minutos mas tarde, esto es, 10:35.
7
En la solucion de este ejercicio haba errores tipogracos que fueron detectados por el alumno Pablo
Santiago en 1997.
{20{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Ejercicio 2.19 Este problema puede resolverse por medio de una ecuacion de una incognita.
Supongamos que el hijo tiene ahora x a~nos. Segun lo dicho por Julio, el padre tiene 2x a~nos.
Hace 18 a~ nos, cada uno tena 18 a~ nos menos, y resultaba ser que Jose era tres veces mas
viejo que su hijo. Puede entonces plantearse la igualdad
3(x 18) = 2x 18
Despejando la incognita, resulta que x = 36. Luego el hijo tiene 36 a~nos, y Jose tiene 72.
Ejercicio 2.20 Sea \abc" el numero de tres cifras que se ha escrito. Sea r el resultado
obtenido al hacer la resta. El numero \abc" puede expresarse como:
100a + 10b +c
Si se le resta la suma de sus dgitos, se tiene
r = 100a +10b + c (a + b +c)
Simplicando la expresion anterior:
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 aleman y d = valor de un yen. A partir de las armaciones del cajero, se sabe que:
a + b = c
a = b + d
2c = 3d
Para saber cuantas b recibo a cambio de 10a, debo averiguar la relacion 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
Luego 1 peso es equivalente a 5 coronas suecas. Consecuentemente, mis 10 pesos equivaldran
a 50 coronas suecas.
{21{
2 RESOLUCI

ON DE PROBLEMAS: EJERCITACI

ON
Ejercicio 2.22 Primeramente, identiquemos los datos relevantes en el problema. Es claro
que el hecho de que las armaciones hechas por Lulu hayan sido hechas en distintos das de
la semana no tiene mayor signicado para la pregunta nal.
En cada armacion, Lul u nos indica tres caractersticas de los tres pretendientes. Por la
forma en que estan hechas dichas armaciones, se sabe que cada caracterstica corresponde a
uno de los pretendientes (y no a los demas). Las armaciones de Lulu podran reformularse
como sigue:
1. Un pretendiente \vive en Cnel.Pringles", otro \es empresario", y otro \es ganadero".
2. Un pretendiente \tiene Alfa Romeo", otro \tiene un Mercedes", y otro \es viudo".
3. Un pretendiente \es estudiante", otro \vive en N.York", y otro \tiene yate".
4. Un pretendiente \vive en Cnel.Pringles", otro \es viudo", y otro \vive en N.York".
5. Un pretendiente \es ganadero", otro \tiene un Mercedes", y otro \es estudiante".
6. El pretendiente que \es estudiante" es el mismo que \tiene un Alfa Romeo"
Podemos construir el cuadro que se muestra a continuacion, volcando en el la informacion
disponible sobre cada pretendiente. En principio, se sabe que el estudiante tiene un Alfa
Romeo, y que los pretendientes son un estudiante, un ganadero y un empresario. A partir
de la armacion 1, se deduce que el estudiante es quien vive en Cnel.Pringles.
Profesion Vehculo Otra informacion
Pretendiente 1 estudiante Alfa Romeo vive en Cnel.Pringles
Pretendiente 2 ganadero
Pretendiente 3 empresario
A partir de la armacion 5, se deduce que quien tiene un Mercedes es el empresario.
Profesion Vehculo Otra informacion
Pretendiente 1 estudiante Alfa Romeo vive en Cnel.Pringles
Pretendiente 2 ganadero
Pretendiente 3 empresario Mercedes
A partir de la armacion 2, se deduce que el viudo es necesariamente el ganadero.
Profesion Vehculo Otra informacion
Pretendiente 1 estudiante Alfa Romeo vive en Cnel.Pringles
Pretendiente 2 ganadero es viudo
Pretendiente 3 empresario Mercedes
De la armacion 4, resulta que quien vive en N.York no es ni el viudo ni el de Pringles; luego,
se trata del empresario. Tambien es claro entonces que es el ganadero quien posee el yate.
Profesion Vehculo Otra informacion
Pretendiente 1 estudiante Alfa Romeo vive en Cnel.Pringles
Pretendiente 2 ganadero yate es viudo
Pretendiente 3 empresario Mercedes vive en N.York
{22{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
2.4 Problemas adicionales
Ejercicio 2.23 Al pobre de Don Nicanor le han robado los tomates de la huerta, y sospecha
de tres vagos que pasaron por all. Descubra al culpable sabiendo que:
Ale no es canoso ni es el que paso a pie.
Cesar paso en bicicleta.
El de la moto no es morocho.
Guille y el rubio odian los tomates.
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 haba sali do la reunion, dijo:
"Mi abuelo se sento a mi izquierda; entre el y mi ta, se sentaron dos hombres.
Mi mami no se sento al lado de mi ta porque estan peleadas. Entre mi to y mi
primo se sentaron dos mujeres. Mi primo se acomodo frente a mi papi, y entre
mi mami y la abuela."
>Como se distribuyeron los 8 familiares alrededor de la mesa de la gura?
1 2 3
\ | /
8___\|/___4
/|\
/ | \
7 6 5
Ejercicio 2.25 Un grupo de amigos renueva periodicamente sus colecciones de revistas,
cambiando algunas de las que tienen por otras. Las equivalencias de trueque son las siguien-
tes:
Dos revistas Somos se cambian por una Gente y dos Noticias.
Una Noticias se cambia por una Gente y una Billiken.
Una Somos se cambia por cuatro Billiken.
>A cuantas Billiken equivale una Noticias?
Ejercicio 2.26 Un chico y una chica estan 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, >quien es pelirrojo y quien moreno?
{23{
2 RESOLUCI

ON DE PROBLEMAS: EJERCITACI

ON
Ejercicio 2.27 La isla de Pampum esta en un rincon 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 solo dos palabras: pum y pam. Una de estas palabras
signica \s" y la otra \no", pero no necesariamente en ese orden. Le preguntamos a un
nativo de la isla:
{>Pum signica s?
{Pum -contesto.
Ahora bien: ese nativo >es brujo o zombie?
Ejercicio 2.28 En una estacion 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 apreton de manos, mientras que al saludarse un varon y una mujer, o
dos mujeres, se dan un beso. Por supuesto, cada una de las dos familias tiene mas 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. >Cuantos hombres
y cuantas mujeres estuvieron all despidiendose?
Ejercicio 2.29 El campeon del Tenis Club \Bolas y Raquetas" aparecio muerto en la cancha
central. La causa: un raquetazo. El inspector Fisgonetti, que conduce la investigacion, llamo
a declarar a los trillizos Pachinott pues, segun testigos, dos de ellos haban jugado esa ma~nana
con el infortunado campeon. A continuacion 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) : >Mato alguno de ustedes al campeon?
{Archibaldo : \Yo no lo mate!"
{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 jamas{ detuvo inmediatamente a uno de ellos >A quien?
Ejercicio 2.30 Guiso de Piedra: El astronauta Mark llego a la excavacion, y recogio mues-
tras de roca para llevar de regreso a los cientcos terrestres. Metio las rocas en tres bolsas
negras: una para las rocas gneas, otra para las sedimentarias y otra para las metamorcas.
En su mano tena tres etiquetas, una para cada bolsa. Pero estaba tan apurado para regresar
al cohete antes de que se le terminara la provision de oxgeno, que puso mal las etiquetas de
todas las bolsas. >Cuantas rocas tuvo que sacar de cuantas bolsas para averiguar que haba
en cada una?
Respuestas
Ejercicio 2.23 Cesar robo los tomates.
{24{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Ejercicio 2.24 Si se le asigna a Andrea el numero 1, los demas familiares {siguiendo el
sentido de las agujas del reloj{ son los siguientes: 2=abuelo, 3=papa, 4=to, 5=ta, 6=abuela,
7=primo, 8=mama.
Ejercicio 2.25 Una Noticias equivale a tres Billiken.
Ejercicio 2.26 Ambos mintieron. El muchacho es pelirrojo y la jovencita morena.
Ejercicio 2.27 El nativo es un brujo.
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 deberan ser veraces, y entonces nadie hubiera jugado con el campeon. Pero se sabe que
jugaron dos. Por lo tanto, Belisario debe ser veraz, y es cierta la acusacion 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 sabra que las otras dos bolsas no podran
contener rocas sedimentarias: tendran rocas gneas o metamorcas en su interior. Pero
como todas las bolsas tienen etiquetas erroneas, la que tiene la etiqueta \sedimentaria" tiene
que contener rocas metamorcas y la que dice \metamorca" debe contener rocas gneas.
Este problema resalta la necesidad de prestar atencion cuidadosa al lenguaje en el cual se
expresa un problema, intentando hacer uso de toda la informacion dada en el enunciado.
{25{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
3 Uso de condiciones en algoritmos: generalidades
3.1 >Que es una condicion?
En los diferentes algoritmos considerados en clase, han aparecido a menudo acciones bajo la
forma:
Si A es primo Repetir mientras (b< 4)
entonces .... ....
sino ....
Todas estas situaciones tienen un elemento com un: hay asociada a ellas una condicion.
Las condiciones utilizadas en algoritmos son un tipo especial de proposiciones. En el lenguaje
de la logica, se llama \proposicion" a aquella enunciacion o sentencia que solo puede ser
verdadera o falsa. Ejemplos de proposiciones son: \Juan tiene 20 a~nos", \3147 es primo",
\Baha Blanca es una ciudad ubicada en la Provincia de Buenos Aires", etc. Asimismo, la
pregunta \>Cuantos a~ nos tenes?" no es una proposicion, dado que no puede armarse nada
en particular acerca de su veracidad o falsedad. Los terminos \verdadero" y \falso" (en ingles
\true" y \false") constituyen el denominado valor de verdad asociado a una proposicion.
Ejemplo: el valor de verdad asociado a la proposicion \2 es menor que 3" es \verdadero".
Las condiciones constituyen proposiciones restringidas al uso de datos junto
con ciertas relaciones y operaciones matematicas. Una condicion puede ser \ver-
dadera" o \falsa". Cuando se determina el valor de verdad asociado a una condicion que
tiene ciertos datos, se dice que se evalua esa condicion. 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 condicion \A < 3" el resultado es \falso".
Para especicar una condicion 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
aritmeticas, como + (suma), - (resta), * (producto), / (division entera), y // (resto de la
division entera). Los smbolos <, >, <=, >=, = y 6= se denominan operadores relacionales,
mientras que los smbolos +, -, * y / son llamados operadores aritmeticos, y corresponden a
las operaciones tradicionales del algebra.
Del mismo modo en que contamos con acciones primitivas cuyo dato de salida es un
numero, tambien podremos denir acciones primitivas que devuelvan un valor de verdad
(esto es, verdadero o falso). Estas primitivas podran combinarse con los operadores
antes mencionados, para construir condiciones mas complejas.
Ejemplo: puede considerarse una primitiva EsBisiesto, la cual recibe como dato de en-
trada un numero de a~no, y devuelve \verdadero" si ese a~ no es bisiesto, y \falso" si no lo es.
Esta primitiva puede ayudar en la elaboracion de un algoritmo que cuente la cantidad de
das transcurridos entre dos fechas determinadas.
8
Al trabajar en la computadora en lenguaje Pascal, se utilizara el smbolo <> en lugar de 6=.
{27{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
Ejemplo: La primitiva EsPar, que permite determinar si un numero 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 condicion en otro algoritmo (posiblemente
mas 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 cuales
son las primitivas basicas de las que se dispone. Al resolver un ejercicio dado, puede resultar
conveniente contar con ciertas primitivas auxiliares, las que deberan ser denidas a partir de las
primitivas basicas disponibles.
Se menciono anteriormente que, a n de elaborar algoritmos que posteriormente van a co-
dicarse en un lenguaje de programacion, se utilizaran condiciones, y no proposiciones. Esto
es as en virtud de que los lenguajes de programacion no tienen la suciente \inteligencia"
como para poder expresar relaciones complejas en un nivel adecuado para ser ejecutado
por una computadora. Es por esto que ciertas veces aparecera la necesidad de \reescribir"
una proposicion, expresandola como una condicion, en un lenguaje mas cercano al de la
computadora. Ejemplo:
En lenguaje corriente ! En un lenguaje algortmico
Si Juan tiene 20 a~nos ! Si EdadDeJuan = 20
entonces .... entonces ....
Si el n umero N es par ! Si EsPar(N)=verdadero
entonces .... entonces ....
Si A es menor que B ! Si A < B
entonces .... entonces ....
Si A
2
es igual a B ! Si A*A = B
entonces . . . entonces . . .
Naturalmente, no todos los problemas que pueden plantearse intuitivamente en lenguaje
corriente son expresables facilmente a nivel algortmico. El analisis que se hara en lo
{28{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
sucesivo, se restringira al uso de condiciones formadas a partir de los operadores
relacionales y aritmeticos antes mencionados, combinados eventualmente con
primitivas que entreguen un valor \verdadero" o \falso".
3.2 Operadores logicos
Las condiciones expresadas usando operadores relacionales, operadores aritmeticos y pri-
mitivas que devuelven \verdadero" o \falso", pueden combinarse utilizando los llamados
operadores logicos y, o, y no (tambien identicados comunmente por las palabras en ingles
and, or y not, respectivamente). A continuacion se detalla sucintamente cual es el signicado
de cada uno de ellos.
3.2.1 Operador logico \y" (conjuncion)
Dadas dos condiciones C
1
y C
2
, el operador \y" permite construir una nueva condicion \C
1
y C
2
". El valor de verdad de esa condicion sera verdadero solo si C
1
es verdadero \y" C
2
es
verdadero.
9
Para denir el signicado de un operador logico, suele recurrirse a las denominadas tablas
de verdad. En una tabla de verdad se indican, para cada combinacion posible de los valores
de verdad de los operandos, cual es el valor resultante de la operacion.
En el caso de la operacion \y", la tabla de verdad asociada es la siguiente:
C
1
C
2
C
1
y C
2
F F F
F V F
V F F
V V V
Nota: es comun abreviar las palabras verdadero y falso con v y f, respectivamente.
Ejemplo: Sean los datos x e y con valores 1 y 2, respectivamente. Entonces el valor de
verdad de la condicion \(x = 1) y (y = 2)" es verdadero; \(x < 0) y (y = 2)" es falso;
\(x < 0) y (y = 3)" es falso.
Ejemplo: considerese el siguiente trozo de algoritmo
Si (a > 3) y (b < 4)
entonces
<Bloque acciones I>
sino
<Bloque acciones II>
9
En computacion a menudo se simplica el lenguaje utilizado en situaciones tpicas. As, en lugar de
enunciar \el valor de verdad resultante de evaluar la proposicion C es verdadero", suele decirse simplemente
\la condicion C es verdadera". Este abuso del lenguaje se considerara lcito en la medida en que no resulte
ambiguo.
{29{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
El bloque i se ejecutara solo si a > 3 y b < 4. El bloque ii se ejecutara en el caso
contrario, es decir: a > 3 es falso, o bien b < 4 es falso, o bien las dos condiciones son falsas.
Esto ultimo es analogo a decir: el bloque ii se ejecutara si a <= 3 o bien b >= 4.
3.2.2 Operador logico \o" (disyuncion)
Dadas dos condiciones C
1
y C
2
, el operador \o" permite construir una nueva condicion \C
1
o
C
2
". El valor de esta condicion sera \verdadero" solo si C
1
es verdadero \o" C
2
es verdadero,
\o" tanto C
1
como C
2
son verdadero. Dicho en otras palabras: \C
1
o C
2
" es falso solo si las
dos condiciones C
1
y C
2
son falsas; caso contrario, es verdadero. La tabla de verdad asociada
al operador \o" es la siguiente:
C
1
C
2
C
1
o C
2
F F F
F V V
V F V
V V V
Ejemplo: Sean los datos x e y con valores 1 y 2, respectivamente. Entonces la condicion
\(x = 1) o (y = 2)" es verdadero; \(x < 0) o (y = 2)" es verdadero; \(x < 0) o (y = 3)" es
falso.
Ejemplo: considerese el siguiente trozo de algoritmo
Si (a > 3) y (b < 4)
entonces
<Bloque acciones I>
sino
<Bloque acciones II>
El bloque i se ejecutara solo si a > 3, o b < 4, o se verican ambas (esto es, vale que
a > 3 y tambien que b > 4). El bloque ii se ejecutara en el caso contrario, es decir, si a > 3
es falso y b < 4 es falso.
Ejemplo:
Repetir mientras (a = 3) o (b = 4)
<Bloque acciones A>
El bloque A se ejecutara mientras que a valga 3, o bien b valga 4, o bien se veriquen
ambas (a valga 3 y b valga 4).
Nota: Existe un operador logico denominado \o exclusivo" (en ingles \exclusive or",
o abreviadamente xor). Este operador no es usado usualmente en algoritmos en lenguaje
de dise~ no, pero suele utilizarse en programacion de bajo nivel (lenguaje ensamblador). Una
condicion compuesta de la forma C1 xor C2 sera verdadera solo si C1 es verdadera o bien
C2 es verdadera, y sera falsa si C1 y C2 son ambas verdaderas (o ambas falsas). La tabla
de verdad asociada al operador \xor" es la siguiente:
{30{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
C
1
C
2
C
1
xor C
2
F F F
F V V
V F V
V V F
3.2.3 Operador logico \no" (negacion)
Dada una condicion C, el operador \no" permite construir una nueva condicion \no C".
Esta condicion sera \verdadero" solo si C es falsa, y sera 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 condicion \A 6= B" es equivalente a \no (A = B)" la condicion \A > B" es
equivalente a \no (A <= B)"
Ejemplo: los siguientes trozos de codigo 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 convencion, las expresiones que usan operadores relacionales suelen escribirse
entre parentesis cuando aparezcan asociadas a un operador logico 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 historica: Los operadores logicos y, o, y no se denominan tambien \booleanos", en
honor al matematico y logico ingles George Boole (1815-1864), quien los introdujera por
primera vez en su libro \Las leyes del pensamiento". Boole estudio las propiedades de estos
operadores como una tematica del algebra y de la logica matematica, sin sospechar que su
aplicacion pasara a ser, un siglo mas tarde, un concepto fundamental dentro de las Ciencias
de la Computacion.
{31{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
3.3 Condiciones mas complejas
Por medio de los operadores logicos \y", \o" y \no", pueden construirse condiciones com-
plejas a partir de otras mas sencillas.
Ejemplo: Si los datos x, y, y z valen 1,2 y 3 respectivamente, se tiene que:
la condicion \(x = 1) y (y = 2) y (z = 3)" es verdadera;
la condicion \( (x = 1) o (x > 7) o (z < 10)) y (y = 1 +1)" es verdadera;
la condicion \( (x = 1) y (x = 2) y (z < 10)) o (y = 1 + 1)" es verdadera;
la condicion \( (x 6= 1) o (x > 7) o (z = 10)) o (y < 2)" es falsa;
Los parentesis ayudan a expresar el orden en que se evaluaran 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 condicion es
verdadero, mientras que el de la segunda es falso.
Nota importante: En matematica 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 notacion
puede dar lugar a dudas en su interpretacion. Es comun 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.
3.4 Datos booleanos
A lo largo de distintos algoritmos, hemos visto la aplicacion de datos en diferentes situaciones:
para contar la cantidad de numeros primos entre 1 y 1000, para calcular una sumatoria dada,
etc. En todos esos casos, los datos han recibido valores numericos.
A un dato tambien puede asignarsele un valor de verdad (\verdadero" o \falso"). Un
dato de este tipo se denomina dato booleano. Se vera ahora una situacion que justica el uso
de datos booleanos. Considerese el siguiente enunciado:
Escribir un algoritmo que, dado un numero natural N (N > 0) y un dgito D, devuelva
verdadero si D es un dgito de N, y falso en caso contrario.
Un primer acercamiento a este problema sera pensar en descomponer gradualmente
al n umero N (dividiendolo por 10), y analizar el resto resultante de dicha division, com-
parandolo con el dgito D. Es decir, un esbozo de nuestra estrategia sera la siguiente:
Repetir mientras \haya d

igitos en N por analizar"


Resto N // 10
Si D=Resto
entonces \verdadero; D esta en N"
sino N N/10 fseguir buscandog
{32{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Sin embargo, sera conveniente que el ciclo repetir-mientras se cortase tan pronto
como se encontrara que D esta en N >Como expresar ese tan pronto como? Los datos
booleanos brindan una solucion para esto. La condicion \haya dgitos en N para analizar"
podra expresarse, en este caso, como \mientras N sea mayor que 0". El resto del algoritmo
podra reescribirse como sigue:
Algoritmo EstaDigitoPresente
d.e.: D, N fD es un dgito, N es un numero naturalg
d.s.: verdadero si D esta en N; falso en caso contrario.
AunNoEncontreDigito verdadero
Repetir mientras N > 0 y AunNoEncontreDigito = verdadero
Resto N // 10
Si D=Resto
entonces
AunNoEncontreDigito falso fEncontre que D esta en Ng
sino
N N/10
Si AunNoEncontreDigito=verdadero
entonces EstaDigitoPresente falso
sino EstaDigitoPresente verdadero
Este algoritmo trabaja de la siguiente manera: se asume inicialmente que el dgito no ha
sido encontrado en el numero N. Esto se indica asignando al dato AunNoEncontreDigito el
valor \verdadero". Se analiza uno a uno los dgitos que forman N, y si en algun momento se
encuentra que D es dgito de N, el valor de AunNoEncontreDigito se hace falso. Con esto, el
ciclo repetir mientras se corta (>por que?). Al abandonar ese ciclo, analizamos el valor
de AunNoEncontreDigito: si es \verdadero", esto signica que nunca el dgito D coincidio
con un dgito de N; luego el algoritmo debe devolver \falso" (el dgito no esta presente). En
caso contrario, sabemos que el dato AunNoEncontreDigito vale falso; para que a este dato
se le haya asignado este valor, necesariamente en alg un momento el dgito D coincidio con
un dgito de N; luego el algoritmo debe devolver \verdadero".
Consideremos otro ejemplo de aplicacion de datos booleanos.
Escribir un algoritmo que, dado un numero natural N, determine si N es un n umero primo.
Apelando a la denicion de n umero primo (aquel que tiene como divisores unicamente
al 1 y a s mismo), puede pensarse la siguiente estrategia: se asumira inicialmente que el
numero N es primo, y se ensayaran todos los numeros entre 2 y N 1 como potenciales
divisores de N. Si alguno de esos numeros divide exactamente a N, entonces el n umero N
no es primo; si, por el contrario, ningun numero entre 2 y N1 divide a N, puede asegurarse
que N es primo.
A partir de este analsis, puede escribirse el siguiente algoritmo:
Algoritmo EsPrimo fversion inicialg
{33{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
d.e.: N fentero positivog
d.s.: Imprime mensaje \s" en caso que el n umero N es primo; \no" si no lo es.
Cant de divs hallados 0
div considerado 2 finicialmente 2g
Repetir mientras (div considerado < N)
Si (N // div considerado = 0
entonces
Cant de divs hallados Cant de divs hallados + 1
div considerado div considerado + 1
Si cant de divs hallados = 0
entonces
Mostrar \S, N es primo"
sino
Mostrar \No, N no es primo"
El dato \div considerado" asume todos los valores posibles para un divisor de N (entre
2 y N 1 inclusive). El dato \Cant de divs hallados" cuenta la cantidad de divisores de N
encontrados. Este dato se incrementa en 1 cuando N es divisible por div considerado.
El algoritmo anterior, tal como esta planteado, no es util desde el punto de vista de
permitir construir primitivas para ser usadas para construir primitivas mas complejas, ya
que solamente imprime un mensaje. Sera mucho mas conveniente que la salida del algoritmo
estuviese dada en terminos de datos. Para lograr esto, puede reescribirse la parte nal del
algoritmo como sigue:
Si cant de divs hallados = 0
entonces
EsPrimo verdadero
sino EsPrimo falso
Sin embargo, aun incluyendo esta modicacion, el algoritmo tiene un defecto en cuanto
a su eciencia, ya que trabaja \en exceso". No se pretende saber cuantos 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-
tara el valor de \Cant de divs hallados", y en consecuencia se detendra el ciclo Repetir
mientras.
Los datos booleanos brindan una alternativa elegante para resolver el problema anterior.
Se introducira un dato \ElNroEsPrimo", que inicialmente sera \verdadero". Se ensayaran
{34{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
todos los divisores posibles, y si alguno de ellos divide a N, el dato \ElNroEsPrimo" tomara
valor \falso".
Algoritmo EsPrimo fversion mejoradag
d.e.: N
d.s.: verdadero si N es primo; falso en caso contrario
ElNroEsPrimo verdadero
Repetir mientras (ElNroEsPrimo = verdadero) y (div considerado < N)
ElNroEsPrimo (N // div considerado) 6= 0
div considerado div considerado + 1
Si (ElNroEsPrimo = verdadero)
entonces Es Primo verdadero
sino Es Primo falso
En este algoritmo, se asume primeramente que \ElNroEsPrimo" es verdadero. Si se
encuentra algun divisor para N, se hace que \ElNroEsPrimo" sea falso, y se abandona el
ciclo repetir mientras. Los datos \booleanos" permiten escribir la parte nal de este
algoritmo de una manera aun mas simple. En lugar de escribir
Si (ElNroEsPrimo = verdadero)
entonces entonces Es Primo verdadero
sino Es Primo falso
simplemente puede escribirse
Es Primo ElNroEsPrimo
Si se quiere aplicar al extremo el uso de datos booleanos, tambien podra reescribirse la
condicion \div considerado< N" utilizando un dato booleano. El algoritmo resultante sera
el siguiente:
debo probar mas numeros verdadero
ElNroEsPrimo verdadero
Repetir mientras (ElNroEsPrimo = verdadero) y (debo probar mas numeros = verdadero)
ElNroEsPrimo (N div considerado)*div considerado 6= N
div considerado div considerado + 1
debo probar mas numeros (div considerado < N)
Aqu se aprecia que el ciclo repetir-mientras termina cuando \ElNroEsPrimo" es
falso, o bien \debo probar mas numeros" es falso (es decir, ya se ensayaron todos los divisores
posibles).
Para escribir el algoritmo \EsPrimo", se ha recurrido a datos \booleanos" que asumen
inicialmente un valor determinado, y lo cambian cuando se verica una condicion particular.
Ejemplo: el dato \ElNroEsPrimo" es verdadero, y cambia de valor cuando se comprueba
que existe un divisor para el n umero considerado. En la jerga computacional, los datos
{35{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
booleanos utilizadas de esta manera se denominan \banderas" (en ingles \ags"). Un dato
\bandera" permite expresar ciertas condiciones de manera mas sintetica y clara al escribir un
algoritmo. Los datos \bandera" no siempre son necesarios; la conveniencia de su utilizacion
es algo que fundamentalmente se aprende con la practica.
Nota: Al elaborar algoritmos, es usual omitir las palabras \verdadero" y \falso" dentro
de una condicion. Ej: en lugar de escribir \Si DeboSeguir=verdadero entonces...", suele
escribirse simplemente \Si DeboSeguir entonces...". Analogamente, en lugar de escribir \Si
DeboSeguir=falso entonces...", suele escribirse \Si no(DeboSeguir) entonces....". Lo mismo
puede aplicarse a la condicion asociada a una estructura repetir-mientras. Esta forma de
expresar las condiciones permite muchas veces una lectura mas \agil" de los pasos asociados
a un algoritmo.
3.5 Uso de condiciones: aspectos mas avanzados
3.5.1 Datos booleanos y la resolucion de problemas complejos
Supongamos que se quiere escribir un algoritmo que reconozca si una fecha expresada me-
diante tres datos da, mes y a~no es una fecha valida. As, por ejemplo, la fecha 20-7-1969
10
(correspondiente a dia=20, mes=7 y a~no =1969) es una fecha valida. No seran fechas
validas 31-11-1987 (pues noviembre tiene 30 das) 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 demas tienen 31 das, excepto
el mes 2 que tiene 28 das. Se asume que el a~ no a considerar es un a~no valido 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 consideracion 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 difcil determinar si la condi-
cion asociada a la estructura si - entonces esta expresada correctamente. Por otro lado,
10
Este es el da en que el hombre llego por primera vez a la Luna.
{36{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
si alguien quisiera interpretar que signica la condicion anterior, debera analizar cuidado-
samente todas las expresiones en las que aparecen operadores \y" y \o"; es evidente que el
signicado de la condicion no salta a simple vista.
A n de expresar esta condicion de una manera mas clara y sencilla, podemos introducir
datos booleanos (tambien llamadas datos condicionales). Un dato booleano es aquel que
puede almacenar el \resultado" de una condicion (esto es, verdadero o falso). As, por
ejemplo, puede escribirse la asignacion:
EsUnDiaValido (dia>=1) y (dia<=31)
Esto debe interpretarse de la siguiente manera: evaluar la condicion \(dia>=1) y
(dia<=31)" y almacenar posteriormente el resultado de dicha evaluacion en el dato
EsUnDiaValido. En este caso, el dato EsUnDiaValido almacenara el valor \verdadero"
si la condicion \(dia>=1) y (dia<=31)" es verdadero; EsUnDiaValido almacenara el valor
falso si la condicion es falsa (es decir, en caso que el valor de \dia" sea menor que 1 o mayor
que 31). Ahora se analizara como puede reescribirse la condicion 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 menciono anteriormente que una dato booleano puede almacenar el resultado de eva-
luar una condicion. En particular, al escribir algoritmos, puede asignarsele 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 vera mas
adelante, en el inciso que trata el uso de datos booleanos como banderas.
3.5.2 Propiedades de los operadores logicos
Sean C
1
y C
2
dos condiciones. Pueden enunciarse las siguientes propiedades:
a) \no(no C
1
)" es equivalente a \C
1
"
b) \C
1
y C
2
" es equivalente a \no (no(C
1
) o no(C
2
))"
c) \C
1
o C
2
" es equivalente a \no (no(C
1
) y no(C
2
))"
{37{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
Las propiedades b) y c) pueden expresarse tambien como:
b') \no(C
1
y C
2
)" es equivalente a \no(C
1
) o no(C
2
)"
c') \no(C
1
o C
2
)" es equivalente a \no(C
1
) y no(C
2
)"
Las propiedades b y c fueron postuladas por el matematico Augusto de Morgan, por
lo que suele denominarselas \leyes de De Morgan". >Que utilidad tienen las propiedades
anteriores? Por medio de ellas puede expresarse una condicion C en una forma alternativa
C
0
. Eventualmente, puede resultar que C
0
sea mas sencilla de interpretar que C.
Ejemplo: Usando las propiedades anteriores, se tiene que
En lugar de escribir Puede escribirse: O tambien
Si no(no A=3) Si (A=3)
entonces .... entonces
Si no(A=B y C=D) Si (no(A=B) o no(C=D)) Si (A6=B) o (C6=D)
entonces .... entonces .... entonces ....
Si no(A=B o C=D) Si (no(A=B) y no(C=D)) Si (A6=B) y (C6=D)
entonces .... entonces .... entonces ....
Si no( no(A=B) y no(C=D)) Si (A=B) o (C=D)
entonces .... entonces ....
3.5.3 Bloques de acciones y condiciones
Si C es una condicion, y S
1
, S
2
y S son acciones (o bloques de acciones) en un algoritmo,
entonces las siguientes estructuras son equivalentes:
Si C () Si no(C)
entonces S
1
entonces S
2
sino S
2
sino S
1
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{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
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
3.5.4 Otras propiedades interesantes
A continuacion se analizara una serie de propiedades de los operadores logicos, que pueden
resultar de ayuda en el momento de vericar el comportamiento correcto de un algoritmo.
Considerese los siguientes trozos de codigo:
(a) (b)
Si (2=3) y C
2
y C
3
y C
4
Si (2=2) o C
2
o C
3
o C
4
entonces entonces
Accion A Accion B
donde C
1
, C
2
, C
3
y C
4
son condiciones cualesquiera.
En el caso (a), puede asegurarse que la accion A no se ejecutara, ya que (2=3) es \falso",
por lo que {por la denicion del operador \y"{ la condicion completa sera \falso". En el
caso (b), puede asegurarse que la accion B se ejecutara, ya que (2=2) es \verdadero", por lo
que {por denicion del operador \o"{ la condicion completa sera \verdadero". Lo anterior
puede expresarse {un poco mas formalmente{ como sigue:
Si se tiene una condicion \C
1
y C
2
y . . . y C
n
", y se sabe que existe alg un C
i
que es
siempre \falso", entonces la condicion \C
1
y C
2
y ... y C
n
" es siempre \falso".
Si se tiene una condicion \C
1
o C
2
o . . . o C
n
", y se sabe que existe alg un C
i
que es
siempre \verdadero", entonces la condicion \C
1
o C
2
o ... o C
n
" es siempre \verdadero".
Es claro que condiciones como las anteriores son, en cierto sentido, \redundantes". Si se
sabe que algo siempre va a ser \verdadero" o \falso" >para que escribirlo en forma de una
condicion? La \moraleja" de lo enunciado anteriormente es la siguiente:
{39{
3 USO DE CONDICIONES EN ALGORITMOS: GENERALIDADES
Debe tenerse precaucion 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
mas sutiles y no tan facilmente detectables. Ejemplo: en el siguiente trozo de algoritmo,
la parte entonces... nunca se ejecutara, ya que es imposible que un numero sea primo y
sea par (asumiendo que el n umero es mayor que 2).
Si EsPrimo(N) y EsPar(N) y C
3
y C
4
y ..... y C
n
entonces . . .
Segun lo enunciado anteriormente, es claro que esto resulta ser independiente de si las
condiciones C
3
,C
4
, . . . C
n
son verdaderas o falsas.
{40{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
4 Algoritmos en Lenguaje de Dise~ no - Ejercicios
Nota: la resolucion para los ejercicios abajo listados ha sido confeccionada recientemente.
Por esa razon, es posible que exista algun error tipograco en las soluciones. Si se llegara a
detectar errores de ese tipo, se agradecera que se lo comunique a la Catedra.
Ejercicio 4.1 Realice una traza para los siguientes bloques de acciones. Indique claramente
cuales seran 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
Ejercicio i Ejercicio j Ejercicio k Ejercicio l
a 0 Repetir 3 veces a 3 i 0
Repetir 4 veces a a+1 i 1 Repetir mientras i>0
a a+1 Repetir mientras i<4 i i+1
b a*2 a a*a a i
i i+1
Ejercicio m Ejercicio n Ejercicio o Ejercicio p
a 1 i 0 i 0 i 1
Repetir Repetir mientras i<2 Repetir Repetir
a a+1 b 0 i i+1 j 1
Hasta a=3 Repetir Hasta i=0 Repetir
b b+1 j j+1
Hasta b=2 Hasta j=2
i i+1 i i+1
Hasta i>2
{41{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
Nota: Asegurese de comprender claramente los conceptos de asignacion (ej: a b) y
estructura de control condicional (ej: Si a=b entonces c b) y estructura de control iterativa
(ej: Repetir . . . Hasta) antes de abordar la elaboracion de algoritmos mas complejos.
Ejercicio 4.2 Realice una traza para los siguientes bloques de acciones. Indique claramente
cuales seran 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:
EsDivisiblePor: recibe dos numeros enteros N y D, y devuelve verdadero si N es
divisible por D, y falso en caso contrario.
ValorAbsoluto: recibe un numero entero N, y devuelve el valor absoluto de N.
RaizCuadradaEntera: recibe un n umero natural N, y devuelve la raz entera (sin
decimales) de N. Ej: si N es 10, se devuelve 3.
EsCuadradoPerfecto: recibe un numero natural N, y devuelve verdadero si N es
cuadrado perfecto; falso en caso contrario.
Resto: recibe dos nros enteros N y D, y devuelve el resto de dividir N por D.
Potencia: recibe una base real B y un exponente entero E, y devuelve B elevado a la
E.
CantidadDeCifras: recibe un numero entero N, y devuelve la cantidad de dgitos de
N (ej: si N = 3421, devuelve 4)
{42{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Iesimo Digito: recibe un numero entero N, y un valor i, y devuelve el iesimo dgito
de N (contando desde la izquierda). Ejemplo: para N = 3478, i = 2, Iesimo Digito
devuelve 7.
Obs.: el operador \/" representa la division. Cuando se lo aplica a dos enteros Z
1
y Z
2
, Z
1
/ Z
2
corresponde a la division entera entre Z
1
y Z
2
. Cuando se los aplica a reales R
1
y R
2
,
la division R
1
/ R
2
corresponde a la division real.
Ejercicio 4.4 Escriba un algoritmo para hallar y mostrar todos los numeros de la forma
aabb, donde a y b son dgitos, tal que aabb sea cuadrado perfecto. Obs.: a debe ser distinto
de b.
Ejercicio 4.5 Escriba un algoritmo que reciba como entrada un numero natural N y diga
si es o no capicua. Un numero N formado por los dgitos d
1
d
2
: : : d
k
es capic ua si el n umero
d
k
d
k1
: : : d
2
d
1
es igual a N. Ejemplo: 1,7, 131, 212, 5005 son capic uas.
Ejercicio 4.6 Escriba un algoritmo que muestre todos los capicuas 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 dgitos de a
2
es igual a b, y la suma de los
dgitos de b
2
es igual a a. Ejemplo: 13 y 16 son parientes, ya que 13
2
= 169, y 1+6+9 = 16
y recprocamente 16
2
= 256, y 2 +5 +6 = 13.
Ejercicio 4.9 Escriba algoritmos que permitan sumar los n primeros terminos de las si-
guientes series:
a) 1 + 3 + 5 + 7 + : : : + 2k +1 +: : :
b) 1 3 +5 7 + : : : +(1)
k
2k + 1 + : : :
Ejercicio 4.10 Escriba un algoritmo para que dadas dos fechas expresadas como d
1
; m
1
; a
1
y d
2
; m
2
; a
2
, se obtenga como dato de salida la cantidad de das transcurridos entre ambas
fechas.
Ejemplo:
{43{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
Si d
1
= 1, m
1
= 1, a
1
= 1991 y d
2
= 1, m
2
= 1, a
2
= 1992 ! la cantidad de das
trancurridos es 365.
Si d
1
= 1, m 1 = 1, a
1
= 1992 y d
2
= 1, m
2
= 1, a
2
= 1993 ! la cantidad de das
trancurridos es 366.
Puede asumirse que las fechas dadas son posteriores al 1/1/1900, que la fecha d
2
=m
2
=a
2
es posterior a d
1
=m
1
=a
1
, y que se dispone de la primitiva EsBisiesto, que indica si un a~ no
es bisiesto o no.
Ejercicio 4.11 Escriba un algoritmo que permita calcular un valor de la serie
1
x
1
1!
+
x
2
2!

x
3
3!
+
x
4
4!

x
5
5!

para un valor de x cualquiera, con una \aproximacion" de 0.001 en el resultado (es decir, si
S
k
es la suma de los primeros k terminos, y S
k+1
es la suma de los primeros k +1 terminos,
la diferencia en valor absoluto entre S
k
y S
k+1
debe ser menor que 0.001).
Ejercicio 4.12 Escriba un algoritmo que calcule el primer numero primo de forma abc,
donde a < b < c. Si no existe ningun primo de esa forma, el algoritmo debera 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 multiplo 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.15 (<difcil!) Escriba un algoritmo que reciba como entrada un n umero natural
entre 1 y 999, y muestre como salida el numero romano correspondiente. Ejemplo: si se
entra 125, debera mostrarse cxxv; si se entra 40, debera mostrarse xl. Pista: piense cual
es el criterio que se usa para armar los numeros romanos. Los smbolos I,V,X,L,C,D,M
corresponden a 1,5,10,50,100, 500 y 1000, respectivamente.
Ejercicio 4.16 El Tercer Teorema de Fermat enuncia que no existen numeros enteros x,y,z,
tales que para un numero natural n, n > 2, se verique que x
n
+ y
n
= z
n
. Sin embargo, el
matematico frances Pierre Fermat (1601-1665) tan solo enuncio el teorema anterior, pero
no pudo demostrarlo . . . (seg un el, porque la hoja que tena en ese momento no le alcanzaba).
Quizas el teorema sea falso. Para asegurar eso habra que encontrar un contraejemplo, esto
{44{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
es, bastara encontrar tres n umeros x; y; z y un valor n mayor que 2 tales que x
n
+y
n
= z
n
.
Obs.: para n = 2, lo anterior puede satisfacerse; Ejemplo: 3
2
+4
2
= 5
2
).
Escriba un algoritmo que determine si el Tercer Teorema de Fermat se cumple para
cualquier entero entre 0 y 20, con n = 3 y n = 4. (Es decir, el algoritmo debera devolver
verdadero si no existen valores x; y; z comprendidos entre 0 y 20, tales que para n = 3
y n = 4, resulte x
n
+ y
n
= z
n
).
Ejercicio 4.17 Escriba un algoritmo que indique si dos n umeros naturales N y M estan
formados por los mismos dgitos. Ejemplo: 321 y 213; 599 y 995; 45 y 554 estan formados
por los mismos dgitos.
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 mas grande posible tal que 100! es divisible
por 2k. Pista: piense que 100! esta 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 numero N que divida exactamente a un valor M!.
Ejercicio 4.19 Escriba un algoritmo que dado un n umero natural N, devuelva un nuevo
numero natural M, tal que M este formado por los dgitos de N ordenados de menor a
mayor. Ejemplo: si N = 7124, entonces M sera 1247; si N = 2231, entonces M sera 1223.
Ejercicio 4.20 Escriba un algoritmo que dados dos numeros naturales N y M, diga si M
esta contenido en N. Un n umero M se dice contenido en otro N si la secuencia de los dgitos
de M aparece consecutivamente dentro de la secuencia de los dgitos de N. Ejemplo: 12
esta contenido en 2123 ; 12 no esta contenido en 2132; 103 esta contenido en 93103 ; 31
esta contenido en 93103. Atencion: 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 numero 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 podra 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 verique para todos los n umeros pares entre 100
y 1000, y falso en caso contrario.
{45{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
Resoluciones tentativas para los algoritmos propuestos
Las resoluciones siguientes muestran una manera de resolver los enunciados anteriores; esto
no implica que esta sea la unica forma de resolverlos.
Ejercicio 4.1
a) a b
0 ?
0 1
1 1
1 1
b) a
0
1
2
3
c) a b
? ?
? 0
d) a
2
4
8
64
e) a b
1 ?
1 ?
1 2
1 4
f) a b
0 ?
0 1
g) a b c
1 ? ?
1 1 ?
1 1 0
h) a b
0 ?
0 1
0 1
0 3
1 3
i) a b
0 ?
1 2
2 4
3 6
4 8
j) a
?
?
?
k) a i
3 ?
3 1
9 1
9 2
81 2
81 3
6561 3
6561 4
l) i
0
m) a
1
2
3
n) b i
? 0
0 0
1 0
2 0
2 1
0 1
1 1
2 1
2 2
o) i
0
1
2
3
...
p) i j
1 1
1 2
2 2
2 2
2 1
2 2
3 2
Notese que en el caso o), el bloque de acciones se ejecuta un n umero innito de veces (este
bloque de acciones no podra formar parte de un algoritmo, pues este debe llevarse a cabo
en un numero nito de pasos).
{46{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Ejercicio 4.2
a) a b
0 ?
0 1
b) a b
0 ?
0 1
1 1
c) a b
0 ?
0 0
1 0
1 0
2 0
2 0
3 0
3 0
4 0
... ...
d) a b
0 ?
0 0
1 0
2 0
... ...
Notese 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 innito de veces.
Ejercicio 4.3
Nota: para muchos nombres de variables se utilizo el caracter \ " (denominado \underscore"
en ingles). Este caracter se utiliza usualmente en computacion 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 sustituyo por un guion \-". (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 mayusculas 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{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
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 numero naturalg
d.s.: Raiz fcorresponde a la raz cuadrada entera de Nrog
i 0
Repetir mientras i*i<Nro
i i + 1
Raiz i-1
Algoritmo EsCuadradoPerfecto
d.e.: Nro fes un numero 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 esta definida''
sino
Resto Dividendo - (Dividendo / Divisor)*Divisor
Algoritmo Potencia
d.e.: Base, Exponente fBase es entera; Exponente es naturalg
{48{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
d.s.: Pot fResultado de calcular Base elevado a Exponenteg
Ex Exponente
Ba Base
Si Exponente=0
entonces
Pot 1
sino
Si Exponente<0
entonces
fObs: si el exponente es negativo, se lo pasa a un valor positivo equiva
Ex -Exponente
Ba 1/Base ffin del sinog
i Ex
Pot 1
Repetir mientras (i>0)
Pot Pot*Ba fen Pot se almacena Pot*Bag
i i - 1
Algoritmo CantidadDeCifras
d.e.: N fnumero 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 dgito 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{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
a 1 fa vara entre 1 y 9g
Repetir Mientras a<=9
b 0
Repetir Mientras b<=9 fb vara 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 numero d
k
: : : d
1
, se asume primero
que el n umero es capic ua, usando una variable EsCapicua a la que le asigna verdadero.
Se calcula luego la posicion del primer y el ultimo dgito, y se las almacena en variables
Izquierda y Derecha respectivamente. Se comparan los dgitos que estan 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 dgitos
se repite hasta que las variables Izquierda y Derecha se \crucen", o EsCapicua llegue a
tener valor falso.
Ejemplo: en un principio, EsCapicua = verdadero
199891 Izq = 6, Der = 1 , EsCapicua = (1=1) verdadero
199891 Izq = 5, Der = 2 , EsCapicua= (9=9) verdadero
199891 Izq = 4, Der = 3 , EsCapicua= (9=8) falso
y en este punto se corta el ciclo, ya que EsCapicua tiene valor falso.
Algoritmo EsCapicua
d.e.: N fnumero naturalg
d.s.: verdadero si N es capicua; falso en caso contrario.
{50{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
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 capicuas 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 analogo a generar todos los numeros posibles que pueden obtenerse a partir
de 4 dgitos distintos (p.ej: 1,2,3 y 4), considerando la posibilidad de que haya dgitos
repetidos. Habiendo hecho esto, necesitaramos hacer corresponder cada dgito con una de
las letras dadas (c,e,p,a). Un algoritmo para generar los n umeros anteriores sera:
Algoritmo GenerarNumeros
d.e.: ninguno
d.s.: muestra todos los numeros de 4 dgitos que pueden formarse a partir de
1,2,3 y 4.
a 1
Repetir mientras (a<=4)
{51{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
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 numericosg
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', segun el valor de N
Si N = 1
entonces
mostrar 'c'
sino
{52{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
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, includo 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)
(es decir, si la suma de los dgitos de ambos n umeros es igual, NrosParientes es verda-
dero; caso contrario es falso).
Ejercicio 4.9
Inciso a:
Algoritmo Serie
{53{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
d.e.: n fcantidad de terminos a sumarg
d.s.: Suma fsuma de los n primeros terminosg
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 termino i-esimo de la serieg
T 2*i+1
Inciso b:
Puede utilizarse el algoritmo Serie antes denido. El algoritmo Termino debera redenirse
como sigue:
Algoritmo Termino
d.e.: i
d.s.: T ftermino i-esimo de la serieg
Signo Potencia(-1,i)
factor 2*i+1
T signo*factor
Moraleja: para sumar los n primeros terminos de una serie, puede usarse por lo general un
algoritmo basico Serie, adaptando {segun el caso{ la denicion del algoritmo Termino.
Ejercicio 4.10
Para calcular los das transcurridos entre d1/m1/a1 y d2/m2/a2, se va a hacer lo siguiente:
primero, se calculan los das transcurridos entre d2/m2/a2 y 1/1/1900 (se llama a esto Cant2).
Luego se calculan los das 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 practicos es suciente).
Alternativamente, podra haberse elegido como fecha \base" cualquier primero de enero de
un a~ no dado.
Se deniran los siguientes algoritmos auxiliares
Algoritmo DiasDeA~ no
d.e.: a~no fnro. de a~nog
{54{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
d.s.: DiasA~no fla cantidad de das que tiene el a~nog
Si EsBisiesto(a~no)=verdadero
entonces
DiasA~no 366
sino
DiasA~no 365
Algoritmo DiasDeMes
d.e.: mes, a~no fnro. del mesg
d.s.: DiasMes fcantidad de das que tiene el mes en ese a~nog
Si Mes=2
entonces
Si EsBisiesto(a~no)=verdadero
entonces DiasMes 29 ffebrero tiene 29 dasg
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 dasg
sino DiasMes 30 fes mes de 30 dasg
Algoritmo DiasEnSigloXX
fcalcula la cantidad de das entre una fecha y 1/1/1900g
d.e.: d, m, a fda mes y a~nog
d.s.: CantDias fdas 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 das 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 dasg
Repetir Mientras d1>1
d1 d1-1
CantDias CantDias + 1
Algoritmo DiasEntreFechas
fCalcula la cantidad de das 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 das transcurridosg
{55{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
CantDiasAux DiasEnSigloXX(d2,m2,a2) - DiasEnSigloXX(d1,m1,a1)
CantDias ValorAbsoluto(CantDiasAux)
Ejercicio 4.11
Se denen primeramente los siguientes algoritmos auxiliares
Algoritmo Factorial
d.e.: n fnumero 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 aproximacion es 1g
signo -1 fel signo empieza siendo negativog
i 1 fi es el ndice para cada terminog
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{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Ejercicio 4.12
La estrategia sera 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 sera el valor de N. Los numeros entre
100 y 999 se iran armando siempre y cuando N sea 0 (es decir, si todava no se encontro
el primo que se busca). Si se llega a encontrar el primo N, entonces debe detenerse la
busqueda.
Algoritmo PrimoABC
d.e.: ninguno
d.s.: N fnro. primo de la forma abc segun el enunciado, o 0 si no hay
ningun 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) debera devolver falso para N = 0, para que el algoritmo
anterior funcione correctamente. Por razones de eciencia (que se veran mas adelante),
resulta conveniente sustituir dicha condicion por N > 0 en el texto del algoritmo. Esta
ultima condicion 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{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
TermineMul3 falso fse asume que aun no se tiene un multiplo de 3g
TermineMul5 falso fni de 5g
Repetir
Maux Maux + 1
Si EsMultiplo(Maux,3)
entonces fqueda por escribir la primitiva EsMultiplog
TermineMul3 verdadero
Si EsMultiplo(Maux,5)
entonces TermineMul5 verdadero
Hasta (TermineMul3=verdadero) o (TermineMul5=verdadero)
Mostrar Maux
Ejercicio 4.14
Se dene primero el siguiente algoritmo auxiliar:
Algoritmo ProximoPrimo
fdevuelve el proximo 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 < Mg
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 proximo primo que se encontrog
Ejercicio 4.15
Los smbolos romanos a usar seran I, V, X, L, C, D, y M. Puede establecerse la siguiente
{58{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
relacion de valor numerico entre los smbolos:
Smbolo 1 Smbolo 2 Smbolo 3
I V X
X L C
C D M
Es decir, la relacion entre I, V y X es la misma que se da entre X,L,C y C,D,M. Puede
escribirse el siguiente algoritmo:
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 fnumero naturalg
d.s.: Centena, Decena, Unidad fdescomposicion en digitos de Ng
Centena n / 100
Decena (n-Centena*100) / 10
Unidad (n-Centena*100-Decena*10)
Algoritmo ArmarNroRomano
d.e.: N fnumero naturalg
d.s.: muestra numero romano correspondiente a N
DescomponerNro(N,Cen,Dec,Uni)
{59{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
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 vericara por doble inclusion que los dgitos de
N son los mismos que los de M. Esto es: se vera que los dgitos de N estan contenidos
en los dgitos de M, y viceversa. La estrategia sera la siguiente: Se supone al principio
que N y M tienen los mismos dgitos. Esto se lo representa con una variable booleana
TienenLosMismosDigitos a la cual le asigna valor verdadero. Se toma N, y se verica
que cada dgito de N aparezca en M. Luego se toma M, y se verica que cada dgito de M
aparezca en N. Si en algun punto llega a darse el caso que hay un dgito de un n umero que
no aparece en el otro numero, entonces a TienenLosMismosDigitos se le asigna falso.
Algoritmo NumerosConDigitosIguales
{60{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
d.e.: N, M
d.s.: VERDADERO si dgitos de N son los mismos que dgitos 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 dene una primitiva que permite vericar si dado un
dgito D y un numero N, el dgito D esta presente entre los dgitos de N.
Algoritmo DigitoEnNumero
d.e.: Digito, Numero
d.s.: VERDADERO si Digito esta en Numero; FALSO en caso contrario.
DigitoPresente falso fse supone primero que el dgito no esta presente
en el numerog
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{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
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 descomposicion
de todos los naturales entre 1 y 100. Escribimos el siguiente algoritmo:
Algoritmo MayorPotenciaDe2
d.e.: ninguno
d.s.: exponente fexponente de la maxima 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 generalizacion 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 dgito
posible, desde el 9 hasta el 1 (el cero no lo consideramos pues no agrega nada al nuevo
numero a formar).
Para cada dgito 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 posicion correspondiente. Ejemplo: si N = 13491,
hacemos lo siguiente
13491 {buscamos dgito 9, y contamos 1 aparicion ! Resultado=9
13491 {buscamos dgito 8, y contamos 0 aparicion ! Resultado=9
. . .
13491 {buscamos dgito 4, y contamos 1 aparicion ! Resultado=49
13491 {buscamos dgito 3, y contamos 1 aparicion ! Resultado=349
. . .
13491 {buscamos dgito 1, y contamos 2 apariciones ! Resultado=11349
La posicion correspondiente para el nuevo numero la llevamos en una variable
Desplazamiento.
{62{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Algoritmo ObtenerNuevoNumero
d.e.: N
d.s.: M fnumero formado a partir de los dgitos 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 numero N
y un dgito D, y devuelve la cantidad de veces que el dgito 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 numero 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{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
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 esta 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 numeros
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{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
entonces
ConjeturaGoldbach VERDADERO
sino
ConjeturaGoldbach FALSO
El algoritmo AplicarGoldbach prueba todas las sumas posibles entre dos primos i y j, tal
que i+j < NroPar. Si en alg un momento resulta que i +j = NroPar, se han encontrado los
dos primos buscados, y el \resultado" de la conjetura es verdadero. Si en ningun momento se
encuentran los numeros i y j en las condiciones pedidas, el \resultado" devuelto es falso. para
probar todas las sumas posibles entre primos, se usaran dos estructuras repetir mientras
anidadas de la siguiente manera:
i primer primo
j primer primo
Repetir mientras (i+j)<NroPar y no encontre los primos buscados
j primer primo
Repetir mientras (i+j)<NroPar y no encontre los primos buscados
Si i+j=NroPar entonces <ENCONTRE LOS PRIMOS BUSCADOS>
j proximo primo siguiente a j
i proximo 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{
4 ALGORITMOS EN LENGUAJE DE DISE
~
NO - EJERCICIOS
sino
AplicarGoldbach FALSO
Cabe se~ nalar que la primitiva ProximoPrimo es analoga a la primitiva \Incrementar en
1", con excepcion de que cada incremento pasa al proximo natural primo, y no al proximo
natural (como suceda en el caso de \Incrementar en 1").
{66{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
5 De algoritmos en lenguaje de dise~no a programas en
Pascal
5.1 Introduccion
Ya se ha visto como 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 programacion Pascal. La estructura general de los
algoritmos permanecera inalterada, exceptuando muchas de las palabras clave empleadas,
las que deberan escribirse ahora en ingles (ej: repetir mientras a>0 sera escrito while
a>0 do).
En la elaboracion 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 maquina capaz de ejecutar programas a gran velocidad. Sin embargo, debe
indicarsele exactamente que se desea hacer mediante instrucciones dadas en un lenguaje de
programacion.
5.2 >Que es la sintaxis? La notacion bnf
Un elemento comun entre los idiomas hablados por los seres humanos y los lenguajes de
programacion es la presencia de una sintaxis. La sintaxis es un conjunto de reglas que dene
cuales son las sentencias validas de un lenguaje. La semantica, por otra parte, establece cual
es el signicado de una sentencia de un lenguaje.
Ejemplo: en castellano, es incorrecto escribir \Yo tenan hambre"; el verbo y el sujeto no
concuerdan; se dice en tal caso que la oracion es sintacticamente invalida. La oracion \Juan
vuela debajo del agua" es sintacticamente valida (verbo y sujeto concuerdan; debajo del agua
es una expresion correcta en castellano, etc.), pero es semanticamente incorrecta, ya que no
tiene sentido (esto es, no tiene un signicado claro) hablar de \volar debajo del agua".
Sera muy complicado denir exactamente cual es la sintaxis del castellano, ya que re-
sulta practicamente imposible denir formalmente todas las oraciones \validas" posibles; la
cantidad de oraciones diferentes que podran construirse es enorme. Sin embargo, en los
lenguajes de programacion, el problema no es tan grave. Los lenguajes de programacion
suelen tener un conjunto restringido de sentencias posibles, facilitando as al compilador la
tarea de detectar si un programa es o no sintacticamente valido.
Para denir la sintaxis de un lenguaje de programacion, suele emplearse una notacion
conocida como forma Backus-Naur, abreviada como bnf. Esta notacion permite caracterizar
aquellas secuencias de caracteres que van a aceptarse como sentencias validas. La notacion
bnf hace uso de una serie de smbolos especiales. Veamos cuales son estos smbolos:
{67{
5 DE ALGORITMOS EN LENGUAJE DE DISE
~
NO A PROGRAMAS EN PASCAL
Smbolo Signicado
j Se utiliza para separar varias alternativas.
f g Se utilizan para encerrar algo que se repite 0 o mas veces.
[ ] Se utilizan para indicar que algo es opcional.
::= Se utiliza para indicar que lo que aparece a la izquierda
de este smbolo esta denido por lo que aparece a la derecha.
<termino> los corchetes angulares se utilizan para indicar que
termino esta denido a partir de otros elementos.
termino se utiliza para indicar que termino consiste
exactamente de la secuencia de letras t, e, r, m, i, n y o.
Ejemplo: supongamos que queremos denir un identicador (esto es, el nombre asociado
a un dato o una variable dentro de un programa) como una secuencia de letras y/o dgitos,
que debe comenzar necesariamente con una letra. Ejemplos de identicadores validos seran
Pepe, P1, Eje01, ab00cd. Veamos primeramente como denir que es un dgito. Un dgito es
simplemente:
<dgito> ::= 0j1j2j3j4j5j6j7j8j9
Esto es, un dgito es o bien el caracter 0, o bien el caracter 1, o bien el caracter 2, etc.
Un n umero natural esta formado por uno o mas dgitos. Podemos denirlo entonces como:
<numero natural> ::= <dgito>f<dgito>g
Una letra tambien es facil de denir, de la siguiente manera
<letra> ::= ajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjz
Un identicador (ej: el nombre de una variable, o el nombre del programa) debe comenzar
con una letra, y estar seguido luego de letras o dgitos. Esto puede escribirse como:
<identicador> := <letra> f<letra>j<digito>g
Esto es: un identicador esta formado por una letra, seguido por 0 o mas smbolos, cada uno
de los cuales puede ser una letra o un dgito. Esta denicion de identicador es practicamente
identica a la que utiliza el lenguaje Pascal.
11
11
En los identicadores de Pascal tambien es posible utilizar como caracter intermedio el \ ", denominado
en ingles underscore. Ejemplo: en Pascal, son identicadores validos Es Nro Primo, Cantidad Digitos,
etc.
{68{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
5.3 La sintaxis de Pascal
A continuacion se analizara cual es la estructura general de un programa en Pascal, ex-
presandola en notacion bnf.
Program <identicador> (input,output) ;
[ <declaracion-constantes> ]
[ <declaracion-tipos> ]
[ <declaracion-variables> ]
[ <denicion-procedimientos-y-funciones> ]
Begin
<bloque de sentencias>
End.
La parte de codigo correspondiente a <bloque de sentencias> constituye lo que suele de-
nominarse programa principal, para diferenciarlo de los procedimientos y funciones auxiliares
que puedan utilizarse dentro del programa. Analizaremos ahora mas detalladamente cada
uno de los elementos que pueden aparecen en un programa en Pascal.
5.3.1 Declaracion de constantes
Esta parte es opcional. A traves de la misma, puede asociarse un valor constante a deter-
minados identicadores. La denicion de <declaracion-constantes> es:
<declaracion-constantes>::= Const <ident>=<valor> f; <ident> = <valor>g
Ejemplo: si en un programa P se incluye
Const
Pi = 3.14;
Verdadero = True;
Diez = 10;
entonces los identicadores Pi, Verdadero y Diez tendran asociados los valores constantes
3.14, True y 10, respectivamente.
5.3.2 Declaracion de tipos
Esta parte tambien es opcional. En este punto, el programador tiene la alternativa de denir
nuevos tipos de dato, a partir de los tipos basicos ya existentes provistos por Pascal. La
denicion de <declaracion-tipos> en notacion bnf es:
<declaracion-tipos>::= Type <ident>=<denicion-tipo>
f;<ident> = <denicion-tipo>g;
{69{
5 DE ALGORITMOS EN LENGUAJE DE DISE
~
NO A PROGRAMAS EN PASCAL
La especicacion de <denicion-tipo> es un tema importante, que sera tratado en pro-
fundidad en materias mas avanzadas. Veamos algunos ejemplos de denicion de tipos:
Type
Entero = integer;
TipoDiaDeSemana = (lunes, martes, miercoles, jueves, viernes);
TipoDigitos = 0..9;
En el primer caso, se esta deniendo un nuevo tipo Entero, que sera identico al ti-
po integer provisto por Pascal. Posteriormente, podra declararse una variable de tipo
Entero, y realizar sobre ella todas las operaciones que Pascalprovee para el tipo integer.
En el segundo caso, se esta deniendo un tipo enumerado: una variable que sea de tipo
TipoDiaDeSemana podra tener asumir unicamente lunes, martes, miercoles, jueves o viernes
como valor. Si Dia es una variable TipoDiaDeSemana, podran escribirse luego sentencias
tales como
If (Dia = lunes) or (Dia=martes)
then writeln('Comienzo de semana...');
En el tercer caso, se esta deniendo un tipo subrango: una variable de tipo TipoDigito
podra asumir unicamente valores que van de 0 a 9.
Advertencia: La declaracion de nuevos tipos es un tema que sera tratado en detalle mas
adelante; en este apunte se incluye el mismo solo a ttulo informativo.
5.3.3 Declaracion de variables
Esta parte tambien es opcional. En este punto, el programador debe declarar todas las
variables que se utilizaran posteriormente en <bloque de sentencias>. Para declarar una
variable, debe indicarse su nombre y su tipo. Si existe mas de una variable del mismo tipo,
puede declararselas separandolas por una coma, e indicando luego el tipo asociado. Mas
formalmente, la declaracion de variables puede denirse 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 validas de variables.
Var
indice,n,i,k: integer;
DeboSeguir,EncontreUnNumeroPrimo: boolean;
RaizCuadradaDeN,RaizCubicaDeN: Real;
5.3.4 Denicion de procedimientos y funciones
En este punto, el programador debe denir los \cuerpos" de los procedimientos y funciones
asociados al programa. Pueden denirse tantos procedimientos y funciones como se desee;
{70{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
mas formalmente, puede caracterizarse la denicion de procedimientos y funciones de la
siguiente manera:
<denicion-procedimientos-y-funciones> ::=
f <denicion-procedimiento> j<denicion-funcion> g
Al nal de este apunte, se detallara en que consisten <denicion-procedimiento> y
<denicion-funcion>. Debe tenerse presente que los procedimientos y funciones se corres-
ponden con el concepto de \primitiva" visto en clase. Seg un la cantidad de datos de salida
que posea la primitiva, sera conveniente utilizar procedimientos o funciones.
5.3.5 Bloque de sentencias
El bloque de programa esta formado por una o mas sentencias. Las sentencias estan sepa-
radas entre s por un punto y coma (;).
<Bloque> ::= <sentencia>f;<sentencia>g
Esto signica que un bloque tendra la forma:
<sentencia-1>;
<sentencia-2>;
...
<sentencia-n-1>;
<sentencia-n>
Existen distintos tipo de sentencias. Formalmente, <sentencia> puede denirse como:
<sentencia> ::= <sentencia While-Do> j
<sentencia Repeat-Until> j
<sentencia If-Then-Else> j
<sentencia de asignacion> j
<sentencia de llamada a procedimiento> j
<sentencia de entrada o salida> j
<sentencia compuesta> j
<sentencia vacia>
Veamos en detalle en que consiste cada una de dichas alternativas:
Sentencia While-Do: La sintaxis de esta sentencia es la siguiente:
<sentencia While-Do> ::= While <condicion> do <sentencia>
La sentencia While-do corresponde a la estructura Repetir-mientras de nuestro lenguaje
de dise~ no. Ejemplo: el trozo de algoritmo que se muestra a la izquierda es equivalente al
codigo Pascal que se muestra sobre la derecha:
{71{
5 DE ALGORITMOS EN LENGUAJE DE DISE
~
NO A PROGRAMAS EN PASCAL
Repetir mientras i > 0
i i-5
While i>0
do i:=i-5;
Sentencia Repeat-Until:
Su sintaxis es la siguiente:
<sentencia Repeat-Until> ::= Repeat <bloque> Until <condicion>
Basicamente, la sentencia Repeat-Until hace que se repita la ejecucion de <bloque>
hasta que (until) <condicion> sea verdadero. En ese punto, se corta la repeticion. Es-
ta sentencia no se utilizo generalmente en el lenguaje de dise~no, dado que siempre puede
ser sustituida alternativamente por una version equivalente, escrita utilizando la sentencia
Repetir-mientras (ver captulo 3 sobre uso de condiciones en algoritmos). Consideremos
un ejemplo de uso de la sentencia Repeat-Until:
a:=10;
Repeat
writeln(a);
a:=a-1;
Until a=0;
Este trozo de codigo muestra en pantalla los n umeros de 10 hasta 1. Cuando a vale 0, se
corta el ciclo Repeat-Until.
Sentencia If-Then-Else: Su sintaxis es la siguiente:
<sentencia If-Then-Else> ::= If<condicion> Then <Sentencia1> [Else <Sentencia2>]
La sentencia If-Then-Else se corresponde a la estructura Si-entonces-si no utilizada en
lenguaje de dise~no. Considerese el siguiente ejemplo:
If (a=3) and (b>7)
Then
Begin
writeln('Que suerte! a vale 3');
writeln('y b es mayor que 7...')
End
Else
Begin
writeln('Que desgracia! a no vale 3');
writeln('o bien b es menor o igual a 7...')
End
Sentencia de asignacion: Su sintaxis es la siguiente:
<sentencia asignacion> ::= <variable> := <expresion>
{72{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Su uso es analogo en lenguaje de dise~ no, con la excepcion de que se utilizo el smbolo en
lugar de :=. Considerese el siguiente ejemplo:
a := 7;
CuadradoDeN := N * N;
Sentencia vaca:
Es la sentencia que no contiene nada. Ejemplo: considerese el siguiente trozo de pro-
grama en Pascal:
Program P(input,output);
Begin
While 2=2 do;
writeln('hola!');
end.
Si se corre este programa, se vera que no termina nunca. En efecto, al ejecutarse la
sentencia while do, se verica que 2 es igual a 2, y se ejecuta la sentencia vaca. Se eval ua
nuevamente la condicion asociada al While, y se repite el proceso innitamente, ya que la
condicion siempre se mantiene valida. Para terminar el programa, debera abortarselo.
12
Sentencia compuesta: La sentencia compuesta corresponde a un conjunto de senten-
cias, delimitadas por las palabras begin y end. Mas formalmente:
<sentencia compuesta>::= begin <bloque> end
En lenguaje de dise~ no, solamos escribir bloques de acciones utilizando un corchete sobre el
lado izquierdo del algoritmo, que abarcaba todas las sentencias involucradas en una sentencia
compuesta. Considerese el siguiente ejemplo:
Repetir mientras i>0
mostrar i
mostrar i*i
i i-1
While i>3 do
begin
writeln(i);
writeln(i*i);
i:=i-1
End
Sentencia de entrada y salida: Todo equipo de computos posee asociados distintos
dispositivos de entrada/salida (en ingles, input/output devices). Los dispositivos de salida son
aquellos en los que un programa puede \escribir" o grabar informacion, como por ejemplo
un disco, un diskette, una cinta, una impresora o la pantalla de la terminal. Los dispositivos
de entrada son aquellos de los cuales un programa puede leer informacion, como por ejemplo
un disco, o un teclado. Ciertos dispositivos (ej: teclado) son unicamente dispositivos de
entrada; solamente puede leerse informacion de ellos (en el teclado, la computadora \lee"
12
En una computadora personal esto suele hacerse pulsando Ctrl+C.
{73{
5 DE ALGORITMOS EN LENGUAJE DE DISE
~
NO A PROGRAMAS EN PASCAL
cuales 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 informacion 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 termino \sentencias de entrada y salida", pues la entrada y salida de datos esta
provista a partir de procedimientos estandar provistos por el lenguaje. En terminos rigurosos
deber

iamos referirnos entonces a \procedimiento estandar read" y \procedimiento estandar


write". Abandonaremos de momento esta restriccion, para simplicar nuestra explicacion.
Ademas, debemos se~nalar que para los objetivos de esta materia la sentencia write se res-
tringira a \salida por pantalla", y la sentencia read se restringira a \lectura desde el teclado".
Posteriormente se vera que ambas sentencias pueden utilizarse para operaciones de entrada
y salida de datos a un mas complejas.
Sentencia Write:
La sentencia Write permite mostrar informacion por pantalla. Tiene la forma
write (<expresion-write>f,<expresion-write>g)
Una <expresion-write> puede ser:
Una expresion aritmetica convencional, como por ejemplo a, a*a, a+(b*3),
Cuadrado(3)*7+2.
Una constante alfanumerica. Esto es una secuencia de caracteres, encerrada entre
comillas simples ('). Ej: 'hola', 'que tal', etc.
Ejemplos de uso de la sentencia write:
write('La variable X vale ',X);
write(a,' por ',a, ' es igual a ',a*a);
write(b*b-c*(a+a),' es un numero');
La sentencia Writeln es similar a Write, excepto que pasa a la proxima lnea tras
realizar la impresion en pantalla. Ejemplo: el trozo de codigo
writeln('Hola');
writeln('Que tal');
Imprimira en pantalla
Hola
Que tal
Observaci on: write(e
1
,e
2
,...e
n
); es equivalente a escribir
{74{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
write(e
1
);
write(e
2
);
...
write(e
n
);
Asimismo, writeln(e
1
,e
2
,...e
n
); es equivalente a escribir
write(e
1
,e
2
,...e
n
);
writeln;
Sentencia Read:
La sentencia read permite leer informacion desde el teclado. Tiene la siguiente forma:
read(<identicador>f,<identicador>g)
Cuando la computadora debe ejecutar una sentencia read, se realiza la secuencia de acciones
siguiente:
1. Espera que el usuario ingrese una secuencia de caracteres cualesquiera mediante el
teclado.
2. Cuando pulse Enter, los valores ingresados por el teclado se almacenan en las variables
asociadas a la sentencia read.
3. Si hay algun error en los datos ingresados (ej: el read era para leer un numero entero,
y se ingreso una letra), el programa se abortara automaticamente, y aparecera en
pantalla un mensaje de error (en ingles).
Ejemplo: supongamos que el programa contiene declaradas dos variables enteras a y b, y
la sentencia
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 asociara 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 obtendra un mensaje de error (por ejemplo, Data type mismatch, esto es, inconsistencia
de tipo de dato), y el programa se abortara. Esto es debido a que Pascal intento asociar
la secuencia xxdj a un n umero entero. La sentencia Readln es similar a Read, excepto que
tambien se lee la tecla Enter ingresada por el usuario. Ejemplo: si se escribe
{75{
5 DE ALGORITMOS EN LENGUAJE DE DISE
~
NO A PROGRAMAS EN PASCAL
readln(a);
readln(b);
para ingresar los valores asociados a estas variables, debe escribirse
5 <Enter>
3 <Enter>
Recomendaci on: es conveniente combinar Write y Readln cuando se pretende ingresar
valores de variables en un programa, a n de claricar a que variable se esta haciendo
referencia. Siempre es recomendable que, al ingresar un valor, aparezca un cartel indicando
cual es la variable que esta siendo ingresada. Ejemplo:
write('Ingrese el valor de a:');
readln(a);
write('Ingrese el valor de b:');
readln(b);
Este trozo de codigo, al ejecutarse, generara la siguiente interaccion con el usuario:
Ingrese el valor de a: 3 <Enter>
Ingrese el valor de b: 5 <Enter>
Observaci on: read(var
1
,var
2
,...var
n
) es equivalente a escribir
read(var
1
);
read(var
2
);
...
read(var
n
);
Asimismo, readln(var
1
,var
2
,...var
n
) es equivalente a escribir
read(var
1
,var
2
,...var
n
);
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> esta formada por uno o mas parametros reales, sepa-
rados por comas. Cada parametro real se correspondera con un parametro formal en la
denicion del procedimiento. Ejemplos de llamadas a procedimientos (se supone que los
mismos fueron denidos en alguna parte del programa):
ImprimirDivisores(10); fMuestra en pantalla los divisores de 10g
BorrarPantalla; fBorra la pantallag
Importante: una llamada a procedimiento es una sentencia de Pascal; una invocacion
a funcion, por el contrario, es parte de una expresion .
{76{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
5.4 Procedimientos y Funciones
En lenguaje de dise~no, utilizamos la nocion de primitivas para construir algoritmos comple-
jos. En el lenguaje Pascal existen dos maneras de denir primitivas: los procedimientos y
las funciones.
5.4.1 Principales diferencias entre procedimientos y funciones
Una funcion tiene asociado un unico dato de salida; un procedimiento puede tener
asociados mas 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 podra
ser cuestionable, pero esta es una pregunta de ndole losoca. . .
A un procedimiento se lo invoca mediante una llamada a procedimiento, la cual cons-
tituye una sentencia de Pascal. A una funcion se la invoca siempre desde dentro
de una expresion.
5.4.2 Procedimientos
La sintaxis de denicion de un procedimiento es la siguiente:
<denicion-procedimiento> ::=
Procedure <identicador> [ ( <datos-de-entrada-salida> ) ] ;
[ <declaracion-constantes> ]
[ <declaracion-tipos> ]
[ <declaracion-variables> ]
[ <denicion-procedimientos-y-funciones> ]
Begin
<bloque de sentencias>
End;
Como puede apreciarse, la estructura general de un procedimiento es analoga a la de un
programa. Un procedimiento P puede tener constantes, tipos y variables asociadas a el, e
incluso otros procedimientos y funciones internos al procedimiento P.
La primer lnea de la denicion anterior corresponde a la cabecera del procedimiento. En
la cabecera guran el nombre del procedimiento, y los datos de entrada y datos de salida,
encerrados entre parentesis (si existen).
Cada dato de entrada se indica de manera analoga a una declaracion de variable, espe-
cicando el nombre de una variable y su tipo. Los datos de salida se especican de manera
similar, pero anteponiendo la palabra Var. Los datos de entrada y salida que aparecen en la
cabecera del procedimiento se denominan parametros formales del procedimiento. Veamos
algunos ejemplos de procedimientos:
{77{
5 DE ALGORITMOS EN LENGUAJE DE DISE
~
NO A PROGRAMAS EN PASCAL
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 numero 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 mas claramente
utilizando una funcion, dado que existe un unico dato de salida. Mas abajo se indica una
version equivalente de este procedimiento, expresado como funcion.
Invocacion de procedimientos
Un procedimiento P puede ser invocado desde el programa principal; tambien puede
invocarselo desde otro procedimiento (o funcion) ubicado al mismo nivel que P.
13
Para
invocar a un procedimiento, se indica su nombre y sus parametros reales,
14
los que se co-
rresponderan uno a uno con los parametros 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 invocacion
...
ObtenerCocienteYResto(7,2,X,Y);
...
13
Este concepto se puede analizar en detalle en un libro sobre lenguaje Pascal.
14
Llamados actual parameters en ingles. La palabra actual en ingles signica real o efectivo en castellano.
{78{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Tras ejecutarse la sentencia de llamada al procedimiento ObtenerCocienteYResto, la
variable X contendra el cociente de dividir 7 por 2, y la variable Y contendra el resto de dicha
division. Las variables X e Y constituyen parametros reales; las variables Cociente y Resto,
presentes en la cabecera de la denicion de la funcion, constituyen parametros formales.
5.4.3 Funciones
La sintaxis de denicion de una funcion es la siguiente:
<denicion-funcion> ::=
Function <identicador> [(<datos-entrada>)]:<tipo-dato-salida>;
[ <declaracion-constantes> ]
[ <declaracion-tipos> ]
[ <declaracion-variables> ]
[ <denicion-procedimientos-y-funciones> ]
Begin
<bloque de sentencias>
End;
La estructura de una funcion es similar a la de un procedimiento. La principal diferencia
radica en la cabecera de la funcion: la funcion tiene (al igual que un procedimiento) cero (o
mas) datos de entrada. El nombre de la funcion constituye el dato de salida de la funcion,
y es de tipo <tipo-dato-salida>. Veamos algunos ejemplos:
Function Cuadrado(n:integer):integer;
Begin
...
End;
La funcion Cuadrado tiene un dato de entrada n de tipo integer, y el dato de salida (el
nombre de la funcion) es tambien de tipo integer.
Function EsPar(n:integer):boolean;
Begin
If n mod 2 = 0
then EsPar:= true
else EsPar:= false;
End;
La funcion EsPar recibe como dato de entrada un entero n, y devuelve como dato de
salida true si n es par, y false en caso contrario.
Function Pi:real;
Begin
Pi:=3.14159;
End;
{79{
5 DE ALGORITMOS EN LENGUAJE DE DISE
~
NO A PROGRAMAS EN PASCAL
La funcion Pi no tiene ningun dato de entrada, y devuelve el valor constante Pi. A los
nes de un uso posterior, la funcion Pi se comporta exactamente igual a una denicion 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 funcion Potencia tiene dos datos de entrada de tipo integer, y el dato de salida
(nombre de la funcion) es de tipo integer.
Muy importante 1: en toda funcion F, debe asignarsele en alg un punto un valor
al nombre de la funcion, el que se comporta como una variable convencional, de tipo
<tipo-dato-salida>. Si no se realiza ninguna asignacion, el valor devuelto por la funcion
F sera indenido.
Muy importante 2: en toda funcion de nombre F, el nombre de la funcion podra aparecer
como una variable mas unicamente del lado izquierdo de una asignacion. >Por que? Consi-
deremos el ejemplo anterior, en el cual podra 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 funcion no esta correctamente denida; el compilador detectara un error en la
asignacion, ya que asumira que Potencia en el lado derecho corresponde a una invocacion
a la funcion 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.
Invocacion de funciones
{80{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
A diferencia de las llamadas a procedimiento, las llamadas a funcion no constituyen una
sentencia en si mismas. Las funciones deben ser invocadas desde dentro de una expresion.
Dicha expresion puede aparecer tpicamente en las situaciones siguientes:
A la izquierda dentro de una sentencia de asignacion.
Dentro de una sentencia Write o Writeln.
Dentro de una condicion.
Veamos algunos ejemplos de como invocar las funciones denidas anteriormente:
If (EsPar(n)=true) and (n>10)
then writeln(n,' es un numero par mayor de 10');
...
Writeln(Pi,' es un numero irracional);
...
write('Ingrese un numero:');
readln(n);
write('Ingrese un exponente:');
readln(i);
k:=Potencia(n,i);
writeln(n,' elevado a la ',i,' es ',k);
Estas ultimas dos sentencias podran haberse resumido en:
writeln(n,' elevado a la ',i,' es ',Potencia(n,i));
{81{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
6 Sugerencias para la impresion de dibujos en Pascal
La impresion de distintos dibujos en pantalla constituye una interesante motivacion para
ejercitar la programacion en Pascal. A ttulo 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
A continuacion se enumeran distintos elementos o pautas a tener en cuenta al momento
de resolver un ejercicio de este tipo. Entre ellos, pueden mencionarse:
1. Analizar primeramente como esta compuesta cada lnea del dibujo que se quiere reali-
zar. Debe tenerse presente que una lnea termina necesariamente con el caracter cr
(n de lnea), el cual puede imprimirse usando la sentencia Writeln. Analizar tam-
bien los caracteres correspondientes a espacios en blanco (' '), que aparecen entre el
comienzo y el nal de cada lnea.
A n de poder visualizar todos los caracteres impresos en pantalla, se representaran
los espacios en blanco como *, y el n de lnea con cr . El dibujo anterior podra
conceptualizarse como se muestra a continuacion:
Nro. de Lnea Texto a imprimir
1 ****1 cr
2 ***121 cr
3 **12321 cr
4 *1234321 cr
5 123454321 cr
6 *1234321 cr
7 **12321 cr
8 ***121 cr
9 ****1 cr
2. Luego puede analizarse que relacion existe entre los caracteres que componen cada
lnea (el numero marcado en italica corresponde a la columna central del dibujo)
{83{
6 SUGERENCIAS PARA LA IMPRESI

ON DE DIBUJOS EN PASCAL
Nro. de lnea Debe imprimirse:
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.
De lo anterior, puede concluirse que:
Para las primeras 5 lneas, el numero 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 terminos: cuando la columna central tiene asociado el dgito
i, hay 5 i blancos al principio de esa lnea.
Ademas, cuando el dgito de la columna central es i, la lnea asociada esta formada
por
{ los numeros de 1 hasta i, seguidos de
{ los numeros de i 1 hasta 1.
Luego, puede concluirse que dado un valor i, todo el contenido de la lnea estara en
funcion de el. Para la lnea con columna central i, debe hacerse lo siguiente:
Imprimir 5 i blancos;
imprimir los numeros desde 1 hasta i;
imprimir los numeros desde i 1 hasta 1;
imprimir cr
Esto vale para las lneas 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;
Para modularizar esto adecuadamente, podra denirse un procedimiento Linea:
{84{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
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 lneas de texto, y el numero de la columna
central es el mismo que el numero de lnea. Luego, para hacer las primeras 5 lneas del
dibujo puede escribirse
For j := 1 to 5
do Linea(j);
Consideremos ahora las lneas 6 a la 9: aqu la relacion entre el numero de la columna
central y la cantidad de blancos se mantiene (analogo al caso (*1*)). Pero ahora la columna
central vara entre 4 y 1. Como las lneas que siguen se van a ubicar automaticamente debajo
de las que ya estan impresas, para hacerlas simplemente basta con escribir:
For j:=4 downto 1
do Linea(j);
En sntesis, el programa denitivo es el que se muestra a continuacion:
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{
6 SUGERENCIAS PARA LA IMPRESI

ON DE DIBUJOS EN PASCAL
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}
Consideraremos ahora otro ejercicio a modo de ejemplo. La gura a imprimir es ahora
la siguiente:
1
2 2
3 3
4 4
5 5
6 6
5 5
4 4
3 3
2 2
1
Se analizara primeramente como estan compuestas las lneas del dibujo, en terminos
similares a los usados antes.
Nro.Lnea Debe imprimirse:
1 *****1 cr
2 ****2*2 cr
3 ***3***3 cr
4 **4*****4 cr
5 *5*******5 cr
6 6*********6 cr
7 *5*******5 cr
8 **4*****4 cr
9 ***3***3 cr
10 ****2*2 cr
11 *****1 cr
Es claro que, aplicando un criterio analogo al anterior, la solucion ideal consistira en poder
denir una lnea generica del dibujo en funcion de algun valor, y luego hacer el dibujo en
dos partes, de la siguiente manera:
{86{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
For j:=1 to 6
do Linea(...);
For j:=5 downto 1
do Linea(...);
Veamos como caracterizar la lnea iesima. Puede decirse que cuando se genera la lnea
k, hay 6k espacios en blanco al comienzo de la misma. Considerando a partir de la segunda
lnea (pues la primer lnea es un caso especial, ya que tiene un solo dgito), la lnea que tiene
asociado el n umero k tendra la forma:
write('':6-k); {blancos al comienzo de la linea} (*2*)
write(k); {digito a la izquierda}
<cierta cantidad de espacios en blanco>;
write(k); {digito a la derecha}
writeln; {escribir cr, y pasar a la proxima linea}
Falta caracterizar la expresion \cierta cantidad de espacios en blanco" >Cuantos son?
Analicemoslo:
Nro.Lnea Blancos intermedios:
2 1
3 3
4 5
5 7
6 9
>Cual es la relacion entre el valor del numero asociado a la lnea y la cantidad de blancos
intermedios? Puede apreciarse que la cantidad de blancos son impares consecutivos, pero ...
>como asociarlos a un numero dado? Si se considera que en cada una de las lneas (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:
Nro. Lnea Col.Izq. Col.Centro Col.Dcha.
2 0 1 0
3 1 1 1
4 2 1 2
5 3 1 3
6 4 1 4
Ahora se aprecia mas claramente la relacion entre el n umero y los blancos intermedios.
Cuando el n umero es k, la cantidad de blancos intermedios es
{87{
6 SUGERENCIAS PARA LA IMPRESI

ON DE DIBUJOS EN PASCAL
(k 2) + blancos a la izquierda de la columna del centro
1 + blanco ocupado por la columna del centro
(k 2) blancos a la derecha de la columna del centro
Realizando la suma algebraica de las expresiones anteriores, esto es equivalente a 2k 3.
En sntesis: cuando el numero que aparece en la lnea es k, hay 2k 3 blancos intermedios.
Luego el codigo (*2*) puede completarse, y escribirse un un procedimiento Lnea. Agregamos
tambien el caso de que la lnea sea la numero 1, ya que es un \caso especial": simplemente
debe imprimirse el dgito 1 con un desplazamiento de 6 1 = 5 blancos. Resulta entonces:
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}
y el programa principal sera:
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 relacion existente entre
los distintos caracteres que componen una lnea. En el caso de los blancos intermedios, la
{88{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
relacion entre la cantidad de blancos y el numero no salta a la vista. Haber distinguido entre
columna izquierda, central y derecha ayudo a visualizar esta relacion.
Obs.: no siempre hay una relacion entre los caracteres que componen las lneas. Ejemplo:
en el dibujo
1
253
342
no hay una relacion particular entre los blancos y los numeros. (Sin embargo, normalmente
las guras que deberan representarse en los ejercicios propuestos tienen alguna relacion entre
sus caracteres, de modo que se puedan aplicar los conceptos antes vistos)
Por ultimo, se analizara un tercer ejemplo. El ejercicio consiste ahora en escribir un
procedimiento DibujarFigura, que reciba como parametro un valor K, y que dibuje un
\arbol" compuesto por K triangulos, de la siguiente manera:
1
121
1
121
12321
.......
1
121
12321
1234321
... ...
123..K..321
Ejemplo: si se llama a DibujarFigura con K = 2, debera imprimirse:
1
121
1
121
12321
Deben dibujarse K triangulos, donde {si se analiza el dibujo{ se tiene que:
{89{
6 SUGERENCIAS PARA LA IMPRESI

ON DE DIBUJOS EN PASCAL
El primer triangulo tiene 2 lneas
El segundo triangulo tiene 3 lneas
...
El K-esimo triangulo tiene K +1 lneas
Ademas, todos los triangulos siguen el mismo patron (lo que vara es el numero de lneas
de cada uno de ellos). Luego puede escribirse:
Procedure DibujarFigura(K:integer);
Var NroTri:integer;
Begin
For NroTri := 1 to K do
DibujarTriangulo(NroTri+1);
End;
El procedimiento DibujarTriangulo recibe como parametro la cantidad de lneas del
triangulo. Resulta entonces:
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 lnea, 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 enumeracion de las pautas mas relevantes a tener en cuenta cuando
se resuelven ejercicios asociados a dibujar guras en pantalla.
Observar con atencion que regla de formacion sigue cada lnea del dibujo. Determinar
que elementos varan de una lnea a la otra.
Determinar que elementos estan en funcion de otros. Ejemplo: en el primer ejemplo,
si el numero de la columna central era i, la cantidad de blancos era 5 i. Analizar
cuantas variables entran en juego para denir una lnea (en el ejemplo, con una sola
variable se dena toda la estructura de la lnea).
{90{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
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 simetricas. 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 lnea 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 tambien de 5 a 1, el segundo bucle imprimira 2 veces la lnea central).
Finalmente, algunos ejemplos de dibujos con partes simetricas:
/----\
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{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
7 Consideraciones para manejo de Turbo Pascal 7.0
7.1 Introduccion
Turbo Pascal
15
es un entorno de programacion 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 programacion signica que incluye una serie de
facilidades que hacen mas facil la elaboracion, compilacion y ejecucion de programas en
Pascal.
En la actualidad, Turbo Pascal es una de los softwares mas difundidos para progra-
macion en lenguaje Pascal. Entre las caractersticas del entorno Turbo Pascal, podemos
mencionar las siguientes:
Facilidades de manejo de pantalla para programar en Pascal. Turbo Pascal incluye
un editor de textos, que permite elaborar, compilar y ejecutar programas de manera
interactiva. Como ventaja adicional, todas las palabras reservadas de lenguaje Pascal
aparecen resaltadas, de manera que pueden distinguirse facilmente del resto del texto.
Facilidades para desarrollar proyectos de programacion complejos en lenguaje Pascal.
Turbo Pascal permite crear modulos (denominados units), que agrupen a varios
algoritmos (procedimientos) que se utilizan para un n determinado. Dichos modulos
pueden compilarse y almacenarse por separado (ej: un modulo que contenga todos
los algoritmos fundamentales para trabajar con fechas), facilitando la elaboracion de
programas mas complejos.
Turbo Pascal incluye un depurador (debugger), que permite ejecutar un progra-
ma en Pascal paso a paso (sentencia por sentencia), indicando en cada momento
cuanto valen las distintas variables, constantes, etc. Esta facilidad permite encontrar
rapidamente errores logicos de programacion.
Turbo Pascal 7.0 brinda un sistema de ventanas, que facilita considerablemente el
desarrollo y ejecucion de programas. El usuario escribe su programa en una ventana de
edicion (asociada al editor de textos). El programa, al ser ejecutado, muestra sus resultados
en la ventana del usuario. El usuario puede alternar entre varias ventanas, ejecutando el
programa desde la ventana de edicion, y pasar a la ventana del usuario para visualizar los
resultados.
7.2 Como empezar a trabajar en Turbo Pascal
Primeramente, debera cargarse Turbo Pascal, escribiendo la palabra TURBO y pulsando
luego la tecla ENTER. Tras un mensaje que indica que Turbo Pascal esta siendo cargado,
15
Turbo Pascal es marca registrada de Borland, Inc.
16
IBM es la sigla de International Business Machines.
{93{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
en la pantalla aparecera una \ventana" (la ventana de edicion) con distintos comandos en
la parte superior. La primer letra de cada comando estara en video intenso,
17
si se tiene un
monitor monocromo; en un monitor color, la primer letra de cada comando aparecera en un
color distinto al de las letras restantes.
Pulsando la tecla esc, el cursor aparecera automaticamente 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 menu 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 ademas una serie de comandos para manipular
el texto del programa. Los comandos mas usados se detallan al nal de este apunte.
7.3 El men u de opciones
Seguidamente se analizaran las opciones mas importantes que brinda el menu de opciones
de Turbo Pascal. Se dara especial enfasis a aquellas opciones que son necesarias para
desarrollar programas en Pascal, dentro de los requerimientos de la materia \Resolucion
de Problemas y Algoritmos".
Al lado de cada opcion, se detalla su signicado en castellano, as como la secuencia de
teclas que constituye un \atajo" para llegar a dicha opcion (si es que dicha secuencia existe).
7.3.1 File (Archivo)
Para acceder a esta opcion, debe pulsarse Alt+F
18
desde el editor. Esta opcion hace
aparecer en pantalla un peque~no menu 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 automaticamente. Cuando
se termina de escribir un archivo, puede grabarselo en cualquier directorio y con cualquier
nombre.
Algunas opciones del menu \File" (y lo mismo vale para otros menues), 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:
Load (cargar; atajo: F3)
Permite cargar un archivo cualquiera, indicando su nombre y extension (ej: PE-
PE.PAS). Alternativamente, puede escribirse una \mascara" (ej:*.PAS), y en pantalla
17
En una pantalla de computadora monocromatica, el texto puede aparecer escrito en video normal, video
inverso o video intenso. El video inverso es identico al normal, excepto que se intercambian los colores de
fondo y el color de las letras; en video intenso, las letras aparecen en un tono resaltado.
18
ALT+F debe interpretarse como \pulsar simultaneamente la tecla ALT y la tecla F". Cabe se~nalar que
es conveniente pulsar primero la tecla ALT, y, manteniendola pulsada, presionar la tecla F. Las teclas ALT,
CTRL y SHIFT son denominadas teclas \mudas", ya que por s solas no tienen ning un efecto.
{94{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
se visualizaran todos los programas con extension PAS. Usando las teclas del cursor,
puede seleccionarse un programa cualquiera en particular, y pulsando Enter, puede
cargarse dicho programa, editandose automaticamente.
Save (grabar; atajo: F2)
Permite grabar en disco rgido o diskette el programa en Pascal que esta siendo
editado. Si el archivo aun no tiene nombre, Turbo Pascal le asigna por defecto el
nombre NONAME.PAS.
Si se quiere grabar un archivo que aun no tiene nombre (es decir, el archivo acaba
de ser creado mediante el editor de textos), Turbo Pascal pedira primero que se
indique el nombre que se le dara al archivo, y luego procedera a grabarlo.
New (nuevo)
Esta opcion borra todo archivo preexistente en el editor de Turbo Pascal, y permite
comenzar a escribir un archivo nuevo que aun no tiene nombre. Turbo Pascal asigna
por defecto el nombre NONAME.PAS al archivo asociado al texto. Cuando se desee
grabar el archivo (opcion \Save"), Turbo Pascal permitira que el usuario le de al
archivo el nombre que desee.
Save As (grabar como)
Permite escribir el archivo que esta siendo editado con un nuevo nombre. Ej: si se esta
usando el archivo PEPE.PAS, puede crearse una \copia" identica de el con nombre
JUAN.PAS usando Save As: Turbo Pascal solicitara simplemente el nombre nuevo
que se quiere usar (en este caso JUAN.PAS), y grabara el archivo que esta en edicion
bajo dicho nombre.
Save All (grabar todo)
Graba en diskette (o disco rgido) todos los archivos que hayan sido modicados utili-
zando el editor de textos. Es conveniente utilizar siempre esta opcion antes de salir de
Turbo Pascal.
Print (imprimir)
Lista por impresora el texto correspondiente al archivo que esta siendo editado.
Dos Shell (pasar al sistema operativo DOS)
Permite pasar al Sistema Operativo de la PC, sin que Turbo Pascal se retire de
la memoria de la computadora; se puede retornar a Turbo escribiendo exit desde el
sistema operativo.
Exit (salir; atajo: Alt+X)
Permite salir de Turbo Pascal, devolviendo el control al sistema operativo.
7.3.2 Edit (editar)
Para acceder a esta opcion, debe pulsarse Alt+E. Las principales alternativas que se pre-
sentan son:
{95{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
Undo (deshacer; atajo: Alt+Backspace):
Esta opcion permite \retroceder en el tiempo", deshaciendo las acciones de los ultimas
teclas pulsadas al usar el editor.
Redo (rehacer):
Rehace la operacion previamente deshecha usando \undo".
Cut (cortar; atajo: Shift+Delete):
Corta el bloque de texto (si existe), el cual desaparece del archivo de texto, y pasa al
portapapeles (clipboard).
Copy (copiar; atajo: Ctrl+Insert)
Copia el bloque de texto (si existe) al portapapeles.
Paste (pegar; atajo: Shift+Insert)
Copia el contenido del portapapeles en la posicion que ocupa el cursor, dentro del
archivo de texto que esta siendo editado.
Clear (borrar; atajo: Ctrl+Delete)
Corta el bloque de texto (si existe), el cual desaparece denitivamente del archivo de
texto.
Show Clipboard (mostrar portapapeles)
Muestra el contenido del portapapeles. Para retornar al editor de textos, debe pulsarse
Alt+F3.
7.3.3 Search (b usqueda)
Find (hallar; atajo: Ctrl+Q F
19
)
Permite buscar una cadena de caracteres particular dentro del archivo de texto que
esta siendo editado. Una vez que se accede a esta opcion, aparece una caja de dialogo,
que permite seleccionar diversos parametros, tales como:
{ Case sensitive (sensitividad a tipo de letra): activando esta opcion, en la busqueda
se distinguira entre mayusculas y min usculas.
{ Whole words only (solo palabras completas): activando esta opcion, la busqueda
se realizara para palabras completas, y no para subcadenas.
{ Forward/Backward (hacia adelante/hacia atras): permite seleccionar la direccion
en la que se hara la b usqueda del texto, dentro del archivo de texto que esta
siendo editado.
Replace (reemplazar; atajo Ctrl+Q A)
Permite reemplazar una cadena de texto por otra. Esta opcion tiene asociada una caja
de dialogo similar a Find.
19
Esto debe interpretarse como pulsar la combinacion Ctrl+Q, y luego pulsar la tecla F
{96{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Search Again (buscar nuevamente)
Permite repetir la ultima operacion efectuada con Find o Replace.
7.3.4 Run
Esta opcion permite ejecutar un programa en Pascal, brindando distintas alternativas.
Para acceder a ella, debe pulsarse Alt+R desde el editor. Esta opcion hace aparecer en
pantalla otro menu de opciones. Las opciones son:
Run (correr o ejectuar; atajo: Ctrl+F9)
Si no se ha compilado el archivo presente en la ventana de edicion, o si el archivo editado
ha sido modicado desde la ultima compilacion, esta opcion invoca automaticamente
al compilador. Luego pasa a ejecutar el programa correspondiente al archivo que
esta siendo editado. Cuando se ejecuta un programa en Pascal, Turbo Pascal
abandona la ventana de edicion, y realiza operaciones de entrada/salida (Write/ln o
read/ln) sobre una ventana \del usuario". Terminada la ejecucion, Turbo Pascal
retorna a la ventana de edicion. Nota: si el programa en Pascal ejecutado no incluye
ninguna sentencia Readln o Read que obligue al usuario a hacer una entrada de datos,
la ejecucion del programa puede ser tan veloz que el usuario tendra la impresion de que
<no paso nada! Para solucionar esto se dispone de la combinacion Alt+F5: pulsando
estas teclas, puede pasarse de la ventana de edicion a la ventana del usuario, y viceversa.
Program Reset (anulacion de programa; atajo: Ctrl+F2)
Esta opcion debe utilizarse si se quiere ejecutar un programa, habiendose usado pre-
viamente el depurador (\debugger"). Esta opcion libera la memoria adicional utilizada
por el depurador de Turbo Pascal.
Go to cursor (atajo: F4)
El uso de esta opcion va mas alla del alcance de la asignatura.
Trace into (trazar; atajo: F7)
Ejecuta el programa que esta siendo editado lnea por lnea. En cada paso, la lnea que
esta siendo ejecutada aparecera resaltada (en video inverso). Si el usuario quiere ver los
resultados parciales de la ejecucion del programa, puede hacerlo utilizando Alt+F5,
alternando entre la ventana de edicion y la ventana del usuario.
Si en el programa ejecutado hay una llamada a procedimiento, se muestran las lneas
de codigo del procedimiento a medida que van siendo ejectuadas.
Step Over (saltar por encima; atajo: F8)
Idem a la opcion Trace Into, pero con la diferencia que, en caso de ejecutarse una
llamada a procedimiento, se la realiza sin mostrar la ejecucion de cada una de las
lneas que componen el procedimiento. Permite \saltear" la ejecucion paso a paso de
un procedimiento. Esta opcion resulta util cuando se quiere evitar seguir paso a paso
la ejecucion de un procedimiento cuyo correcto funcionamiento ya ha sido vericado.
{97{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
7.3.5 Compile (compilar)
Para acceder a esta opcion, pulsar Alt+C desde la ventana de edicion. Esta opcion hace
aparecer en pantalla un menu con las siguientes opciones.
Compile (compilar; atajo: Alt+F9)
Compila el programa que esta en la ventana de edicion. Si no hubo errores, aparecera un
cartel indicando la cantidad de lneas compiladas y las palabras \Compile successful"
(compilacion exitosa). Si hubo al menos un error, Turbo Pascal hara que el cursor
se posicione en el lugar en que ocurrio ese error en el codigo del programa en Pascal.
Debe destacarse que, a diferencia de otros compiladores de Pascal, el entorno Turbo
Pascal, ni bien encuentra un error en el programa, da por terminada la compilacion,
esperando que el usuario corrija el error, y vuelva a compilar.
Make (atajo: F9)
El uso de esta opcion va mas alla del alcance del curso.
Build
El uso de esta opcion va mas alla del alcance del curso.
Destination (Disk/Memory) (destino disco o memoria)
Con esta opcion, puede seleccionarse si al compilar debe generarse un codigo ejecutable
en el disco (opcion Disk), o bien no se desea generar codigo ejecutable, manteniendose
dicho codigo en la memoria principal, sin crear ning un archivo de extension .EXE
(opcion Memory). Para alternar entre Disk y Memory, debe pulsarse la tecla Enter.
Si se esta editando un archivo llamado PEPE.PAS, al compilarlo con la opcion Compi-
le/Destination Disk, Turbo Pascal generara un archivo PEPE.EXE, el cual podra
ejecutarse directamente desde el sistema operativo, sin necesidad de cargar previa-
mente el entorno Turbo Pascal. Si, por el contrario, se utilizara la opcion Com-
pile/Destination Memory, el codigo ejecutable permanecera en la memoria principal;
cuando se abandone Turbo Pascal, se perdera la posibilidad de ejecutar el programa
PEPE.PAS desde fuera de Turbo Pascal.
Primary File
El uso de esta opcion va mas alla del alcance del curso.
Information (informacion)
Brinda distintas informaciones sobre el archivo que esta en la ventana de edicion.
7.3.6 Debug (depurar)
Esta opcion tiene asociadas varias opciones adicionales, todas ellas para facilitar la depura-
cion de programas. Para acceder, debe pulsarse Alt+D desde la ventana de edicion. Esta
opcion hace aparecer en pantalla un men u con distintas opciones.
{98{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
User Screen (pantalla del usuario; atajo: Alt+F5)
Pulsando Alt+F5, puede alternarse entre la pantalla de Turbo Pascal (ventana de
edicion) y la ventana del usuario (la pantalla en la que se realiza la ejecucion).
Output (salida)
Permite abrir una ventana, en la cual se muestran los contenidos de la ventana del
usuario. Esta opcion es sumamente conveniente para ver la ejecucion de un programa,
sin abandonar Turbo Pascal.
Call Stack (pila de invocaciones; atajo: Ctrl+F3)
Permite abrir una ventana en la cual se muestran los nombres de las funciones y proce-
dimientos que han sido invocados hasta el momento, y que aun no han sido concludos.
Para los conceptos siguientes, es conveniente analizar primero el signicado y utilidad de
ciertas expresiones.
>Que es un \watch"?
En Turbo Pascal, se llama \watch" a un indicador de algun estado del programa,
comunmente una variable. Un \watch" act ua como un visor, que nos va a permitir ver el
contenido de cualquier variable. Los \watchs" son creados por el usuario. A medida que van
siendo creados, van a aparecer en la parte inferior de la pantalla, en una ventana peque~ na
que tiene el ttulo \Watch". El usuario puede pasar de la ventana de edicion a la ventana
\Watch" y viceversa usando la tecla F6. Los \watchs" le permiten al usuario hacer una traza
dinamica del programa, pudiendo verse en pantalla los valores de las variables que uno desee
a medida que el programa va siendo ejecutado. Normalmente, la ejecucion del programa se
hara combinando Step Over y Trace Into.
>Que es un \breakpoint"?
Ademas de watches, Turbo Pascal incorpora el concepto de breakpoint para facilitar la
depuracion y seguimiento de programas. Un breakpoint es una lnea cualquiera de programa
(ej: una una asignacion, un \write"; no se permite que sea una llamada a procedimiento o
funcion). Marcar un breakpoint es sencillo: se posiciona el cursor sobre la lnea deseada, y
se pulsa Ctrl+F8. La lnea se iluminara en video intenso. Si se pulsa Ctrl+F8 de nuevo,
la lnea volvera a estar en video normal, anulandose el breakpoint. Cuando una lnea esta
\iluminada", es un breakpoint. Esto signica lo siguiente: cuando se ejecute el programa,
se ejecutara todo el codigo hasta llegar al breakpoint. En ese punto, Turbo Pascal se
detendra, permitiendo que el usuario {si lo desea{ contin ue la ejecucion usando Step Over o
Trace Into. En particular, si el usuario pulsa Ctrl+F9 (Run), el programa continuara su
ejecucion normal hasta llegar al proximo breakpoint. En sntesis, puede decirse que al llegar a
un breakpoint, el usuario puede continuar la ejecucion del programa haciendo Step Over (se
ejecuta la proxima lnea, sin \entrar" al codigo de los procedimientos), Trace Into (ejecuta
la proxima lnea, includo el codigo asociado a los procedimientos) o Run (Ctrl+F9) (se
ejecuta hasta el proximo breakpoint, y Turbo Pascal vuelve a detenerse).
Los breakpoints tienen sentido util solo si se los usa combinados con watchs, para ver los
valores que toman las variables.
Ahora ya puede analizarse en detalle el signicado de otras opciones en el men u Debug.
{99{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
Breakpoints (puntos de corte):
Muestra una caja de dialogo, a traves de la cual pueden visualizarse todos los break-
points activos, pudiendoselos borrar, modicar, etc.
Watch (punto de observacion o vigilancia):
Abre una ventana de watches. En la parte inferior de la pantalla, aparecen distintos
comandos para agregar, borrar y visualizar watches. Dicha ventana puede anularse
con Alt+F3.
Add Watch (a~ nadir watch; atajo: Ctrl+F7)
Permite a~ nadir un nuevo watch, el cual pasara a incorporarse a la ventana de watches.
7.3.7 Options
Esta opcion incluye distintas caractersticas de Turbo Pascal que pueden ser denidas
por el usuario. Para acceder, pulsar Alt+O desde la ventana de edicion. Las principales
opciones que aparecen son:
Compiler (compilador)
Permite denir caractersticas del compilador. Ej: Chequeo de rangos, evaluacion
booleana con corto circuito,etc.
Environment (entorno)
Permite denir caractersticas del entorno de trabajo Turbo Pascal. Ej: si hay
archivos de resguardo (back-up les), cual es el tama~no del tabulador, etc.
Directories (directorios)
Permite denir directorios por separado para casos particulares. Ej: cual es el directorio
donde se guardaran los archivos .EXE generados a partir de la compilacion,etc.
Save Options (grabar opciones)
Permite grabar todas las caractersticas que el usuario dene en el men u \Options"
bajo un nombre de archivo. Ej: TURBO.TP.
Retrieve Options (recuperar opciones)
Permite cargar un archivo de caractersticas denido previamente que se haya gra-
bado con la opcion Save Options. Esta opcion congura a Turbo Pascal con las
caractersticas denidas en dicho archivo.
7.3.8 Window (Ventana)
Todos los conceptos que se han mencionado anteriormente tienen un elemento comun: se
he hecho referencia a la ventana de edicion, 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 unica muchos aspectos de trabajo. Basicamente, la opcion
{100{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
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 proxima 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, mostrandose unicamente
en su totalidad la ultima ventana activa.
Close All (cerrar todo):
Cierra todas las ventanas abiertas.
Size/Move (tama~ no/mover; atajo: Ctrl+F5)
Permite cambiar el tama~ no de la ventana activa, utilizando las teclas del cursor.
Zoom (ampliacion; atajo: F5):
Agranda el tama~no de la ventana activa.
Next (proximo; atajo: F6):
Muestra la proxima ventana, de aquellas ventanas que hayan sido abiertas.
Previous (previo; atajo: Ctrl+F6):
Idem Next, pero para la ventana previa.
Close (cerrar; atajo: Alt+F3):
Cierra la ventana en curso.
List (listar):
Lista todas las ventanas abiertas.
7.3.9 Help
Esta opcion brinda ayuda sobre distintos topicos de Turbo Pascal. Cabe destacar
que, al escribir un programa, puede solicitarse ayuda sobre el lenguaje Pascal, pulsan-
do Ctrl+F1. Ej: posicionandose sobre la palabra IF, y pulsando Ctrl+F1, aparecera
en pantalla una explicacion de la sentencia If-Then-Else. El texto de ayuda aparece en
idioma ingles.
{101{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
7.4 Teclas utilizadas en Turbo Pascal
7.4.1 Teclas fundamentales
a) Parte central del teclado
ESC: permite cancelar cualquier opcion de un menu. Pulsando esta tecla se abandona
el men u principal, y se pasa al editor de textos.
SHIFT: (identicada 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 maquina
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-
recera en mayusculas. Para desactivar las mayusuclas, basta pulsar CAPS LOCK
nuevamente.
CTRL: Hay dos teclas CTRL, una a cada lado del teclado. Esta tecla no cumple
ninguna funcion en s misma, sino que es de utilidad cuando se la combina con otras
teclas especiales.
ALT: Idem CTRL.
ENTER: (tambien llamada RETURN) Esta tecla esta situada sobre la derecha del
teclado, y suele ser la de mayor tama~no. Se utiliza para pasar a la proxima lnea, al
escribir un texto, o tambien para conrmar la ejecucion de una opcion de un menu.
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.
F1..F12: estas teclas suelen denominarse \teclas de funcion". En Turbo Pascal,
algunas de ellas tienen asignado un n especco (ej: F1 permite obtener ayuda).
A veces puede utilizarselas en combinacion con CTRL o ALT para obtener nuevos
comandos.
b) Parte lateral del teclado
TECLAS DEL CURSOR: Caracterizadas por cuatro echas, en cuatro direcciones
distintas: arriba, abajo, derecha e izquierda. Permiten desplazar el cursor en la pantalla
en cualquiera de esas cuatro direcciones, pulsando la tecla respectiva.
{102{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
INSERT (o insertar): permite pasar de modo \insertar" a modo \sobreescribir" al utili-
zar el editor de textos de Turbo Pascal. En el modo \insertar", cada caracter escrito
desplaza a los caracteres situados a derecha del cursor; en el modo \sobreescritura",
cada caracter escrito tapa a los caracteres a la derecha del cursor.
DELETE (o suprimir): permite borrar el caracter sobre el cual se encuentra posicio-
nado el cursor, sin desplazarlo.
HOME (o inicio): Dentro del editor de textos, desplaza el cursor al comienzo de la
lnea en curso.
END (o n): Dentro del editor de textos, desplaza al cursor al nal de la lnea en
curso.
PAGE UP (o RePag): Dentro del editor de textos, desplaza el texto que se muestra
en pantalla cierto n umero de lneas hacia \arriba", permitiendo desplazarse hacia el
principio del texto.
PAGE DOWN (o AvPag): Idem PAGE UP, pero permitiendo desplazarse hacia el nal
del texto.
7.4.2 Teclas mas utilizadas dentro del editor
A continuacion se describen las combinaciones de teclas mas 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 elaboracion de programas en la computadora.
Comandos de insercion/borrado
Modo Insert on/o Ctrl+V o Insert
Insertar nueva lnea Ctrl+N
Borrar lnea en la que se halla el cursor Ctrl+Y
Borrar hasta n lnea Ctrl+Q Y
Borrar caracter a izquierda del cursor Ctrl+H o Backspace
Borrar caracter en posicion 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
Comandos de manejo de bloques
Marcar comienzo bloque Ctrl+K B
Marcar n de bloque Ctrl+K K
Copiar bloque Ctrl+K C
Mover bloque Ctrl+K V
Borrar bloque Ctrl+K Y
Leer bloque de disco Ctrl+K R
Escribir bloque a disco Ctrl+K W
Esconder/mostrar bloque Ctrl+K H
Imprimir bloque Ctrl+K P
Indententar bloque Ctrl+K I
Desindentar bloque Ctrl+K U
Comandos para hallar y reemplazar palabras
Hallar Ctrl+Q F
Hallar y reemplazar Ctrl+Q A
Repetir hallar o reemplazar Ctrl+L
7.5 Glosario
A continuacion se detalla el signicado de algunos de los terminos mas usuales en compu-
tacion, utilizados en la materia \Resolucion de Problemas y Algoritmos". Cabe se~ nalar que
las descripciones que se dan pueden no ser absolutamente precisas; se pretende, con ellas,
brindar un panorama general a aquellos alumnos que han tenido una experiencia escasa o
nula con el manejo de computadoras. Algunos terminos referidos a sistemas multiusuarios
(ej: terminal, etc.) se presentan de manera simplicada, para facilitar su comprension para
el alumno.
Abortar (ingles \abort"): anular la ejecucion normal de un programa, ya sea presionando
ciertas teclas, o bien ingresando un comando particular.
Aceptar: antonimo de cancelar. Suele conrmarse la aceptacion de una opcion utilizando
la tecla ENTER.
Archivo (ingles \le"): Uno de los conceptos mas importantes en las ciencias de la com-
putacion. Un archivo es, basicamente, un conjunto de datos identicados por un nombre.
Los archivos se guardan en dispositivos de almacenamiento, tales como diskettes, discos,
etc. Para una computadora, un programa en Pascal, una carta, etc. son archivos. Los
archivos mas comunes que se manejaran durante la materia seran los programas en Pascal
que uno mismo realiza. A n de poder guardar un programa en diskette (o disco rgido),
debera \grabarselo" como un archivo. Las acciones basicas que se hacen sobre los archivos
son grabar (save), borrar (delete), cargar (load) y modicar.
Archivo de texto (ingles \text le"): se llama as a todo archivo formado por secuencias
de letras (o mas genericamente, de caracteres) que forman un texto en la pantalla de la com-
{104{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
putadora. Un programa en Pascal, al grabarse en un medio de almacenamiento secundario
(disco o diskette) se graba como un archivo de texto.
Atajos (ingles \shortcuts"; tambien \hot keys"): Un atajo para un comando es una tecla
particular (o secuencia de teclas), que evita tener que utilizar otra secuencia mas larga (que
involucra mas teclas) para ejecutar dicho comando. Ej: para cargar un archivo en Turbo
Pascal, debe hacerse ALT+F, y luego ir a la opcion \Load", y pulsar Enter. Todos estos
pasos pueden resumirse con pulsar solamente la tecla F3. Dicho de otra manera, F3 es un
atajo para la opcion \Load".
Bloque de texto: se llama as a cualquier porcion del texto de un archivo de texto. El
usuario es quien dene donde comienza y donde termina un bloque de texto. En Turbo
Pascal, solo puede existir un unico bloque de texto activo. Un bloque de texto puede
abarcar una o mas lneas. Para denir un bloque de texto, Turbo Pascal cuenta con dos
comandos: CTRL+K y B (comienza bloque) y CTRL+K E (naliza bloque). Tras marcar el
comienzo y n de un bloque de texto, dicho bloque aparecera resaltado en la pantalla. Poste-
riormente, el editor de Turbo Pascal brinda distintos comandos que permiten manipular
dicho bloque de texto (copiar, borrar, etc). Sobre un bloque de texto, pueden efectuarse
distintas operaciones, tales como:
Cortar y Pegar (ingles \cut" y \paste"): estos terminos son usuales en computacion
para describir operaciones sobre archivos de texto. Al \cortar" un bloque (o trozo) de
texto, el bloque en cuestion desaparece del archivo de texto que esta 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.
\Copiar" y \Borrar" (ingles \copy" y \clear"): copiar un bloque de texto es una
accion similar a \pegar": el bloque de texto pasa al portapapeles, pero no desaparece
del archivo de texto editado. Borrar un bloque de texto es una accion similar a \cor-
tar": el bloque de texto desaparece del archivo de texto, pero no se almacena en el
portapapeles. Al borrar un bloque de texto, su contenido se pierde denitivamente.
\Mover" un bloque de texto: se denomina as a la accion de trasladar un bloque
de texto de un lugar a otro, dentro de un mismo archivo. Para mover un bloque de
texto en Turbo Pascal, debe primeramente delimitarse el comienzo y n del bloque
(utilizando Ctrl+K B y Ctrl+K K), posicionar luego el cursor en el punto al cual
se desea trasladar el bloque de texto, y pulsar Ctrl+K V.
Borrar (en ingles \delete"): Borrar un archivo del diskette (o disco rgido). Un archivo que
ha sido borrado desaparece del medio de almacenamiento que lo contena, y no podra ser
cargado en el futuro.
Cadena (ingles \string"): secuencia de caracteres.
Caja de dialogo (ingles \dialog box"): se llama as a un peque~ no recuadro que aparece
en pantalla, que permite seleccionar parametros adicionales para una opcion determinada.
{105{
7 CONSIDERACIONES PARA MANEJO DE TURBO PASCAL 7.0
Ej: al usar la opcion Edit/Find, aparece una caja de dialogo, en la que puede indicarse
parametros tales como direccion de la b usqueda (hacia atras o hacia adelante), punto de
comienzo de la busqueda, etc. Las cajas de dialogo son comunes en los programas que tienen
sistema de ventanas.
Cancelar (ingles \cancel"): decidir que no quiere ejecutarse una opcion particular de un
menu. Ej: si en un programa aparece la pregunta \>Quiere seguir? (s/n)", pulsando la tecla
\n" se cancela dicha opcion.
Cargar (en ingles \load"): Recuperar un archivo del diskette (o disco rgido), y pasarlo a
la memoria principal de la computadora.
Codigo ejecutable: secuencia de sentencias que pueden ser entendidas directamente por
la computadora. El codigo ejectuable es el resultado de la compilacion de un programa.
Compilador (ingles \compiler"): programa que recibe como dato de entrada un programa
escrito en un lenguaje de programacion (ej: Pascal o Fortran), y devuelve un codigo
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 Centro de Computos. 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 excepcion del usuario mismo.
Directorio (ingles \directory"): Un medio de almacenamiento como el diskette o disco
rgido puede organizarse en directorios, para llevar un mejor control de donde se encuentra
cada archivo. Si se piensa a un diskette como un armario (que guarda informacion a traves
de archivos), un directorio constituye un cajon dentro de ese armario. La idea es que un
directorio es una \division", en la que se agrupan varios archivos que tienen algun 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, sera conveniente contar con tres directorios:
CARTAS, PROGPAS y JUEGOS.
editar (ingles \edit"): este verbo se utiliza con el signicado de "cargar un archivo de
texto mediante un editor de textos". Cuando se edita un archivo, se esta en condiciones de
modicarlo desde el editor de textos, a traves del teclado.
Editor de textos: nombre generico 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, modicarlos y grabarlos nuevamente. Un editor de
textos es indispensable para poder escribir adecuadamente programas en Pascal, ya que
estos ultimos se almacenan como archivos de texto.
Grabar (o Salvar) (en ingles \save"): Almacenar un archivo en diskette o disco rgido.
{106{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Login: nombre de la cuenta que corresponde a un usuario. Ver Cuenta. Tambien se llama
as a la accion de acceder a una cuenta.
Logout: accion 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 informacion. La
memoria principal (o memoria RAM) es aquella en la que la computadora almacena los
programas que estan siendo ejecutados. La memoria secundaria corresponde a medios de
almacenamiento como diskettes o disco rgido.
Men u: conjunto de opciones que aparecen en un programa, y entre las que el usuario puede
optar.
MS-DOS: acronimo de \Microsoft Disk Operating System". Uno de los sistemas operativos
monousuarios mas difundidos para uso en computadoras personales (PCs).
Nombre de archivo (ingles \lename"): el nombre completo de un archivo suele estar
formado por dos partes: una secuencia de hasta 8 letras (tambien llamado simplemente
\nombre") y otra secuencia de hasta 3 letras (o \extension"), separadas entre s por un
punto (\."). La extension suele caracterizar el tipo o clase de archivo al cual esta asociado
el \nombre". Ej: PAS corresponde a archivos en Pascal; BAS corresponde a archivos en
lenguaje Basic. Ej: nombres de archivo validos son EJEM.PAS, RULETA.BAS, etc.
Por defecto (ingles \by default"): Esta expresion signica
a
nte la falta de mayor informa-
cion". Muchas opciones de Turbo Pascal requieren que el usuario brinde cierta informa-
cion (ej: al grabar un programa, sera natural que se indique que nombre se quiere dar a
dicho programa). Sin embargo, la ausencia de dicha informacion hace que Turbo Pascal
asuma que el nombre con que se grabara el programa es NONAME.PAS. Decimos entonces
que, por defecto, el nombre de un programa es NONAME.PAS (es decir, el nombre sera
NONAME.PAS a menos que el usuario indique lo contrario).
Password: palabra clave, conocida unicamente por un usuario particular, que le permite
acceder al uso de una cuenta (en un sistema multiusuario).
\Salir" de un programa (ingles \exit"): esta accion 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 computos que permite unicamente
el trabajo de una persona por vez. El concepto opuesto es sistema multiusuario. Una
computadora personal (PC) es un ejemplo tpico de un sistema monousuario.
Sistema multiusuario: se llama as a todo equipo de computos que permite trabajar
simultaneamente a varias personas, mediante terminales.
Sistema Operativo (ingles \operating system"): conjunto de programas encargados de
controlar y administrar las funciones basicas de la computadora, tales como: detectar que
teclas estan siendo pulsadas, cargar programas desde diskettera o disco rgido, 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 suciente 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 esta
recibiendo la instruccion 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.
UNIX
20
: nombre de un sistema operativo multiusuario, de uso ampliamente difundido.
Usuario (ingles \user"): persona que trabaja con la computadora.
Ventana (ingles \window"): se llama as a un recuadro en la pantalla de la computadora,
que cumple la funcion de una mini-pantalla. Las ventanas se popularizaron a traves 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 disposicion varias ventanas, el usuario puede trabajar con distintos
programas o archivos simultaneamente con un unico monitor. Las ventanas que no desean
utilizarse pueden \cerrarse". Las ventanas tienen una longitud y altura que pueden ser
modicadas 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 evolucion 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{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
8 Apendice: el ingles en computacion y su incidencia
en nuestro idioma
Es indudable que el idioma ingles juega hoy en da un rol fundamental en diversos ambitos,
y quizas las ciencias de la computacion sean el area en la cual se hace evidente su supremaca
como vehculo comun de comunicacion. El ingles esta presente en practicamente todos los
lenguajes de programacion, en gran cantidad de terminos tecnicos, en libros de texto y
revistas especializadas, y en la terminologa cientca de vanguardia utilizada en areas tales
como inteligencia articial, redes y teleprocesamiento, etc.
Sin embargo, tambien es innegable que, en calidad de hispanohablantes, los profesionales
argentinos del area de ciencias de la computacion debemos comunicarnos mayormente con
distintos tipos de usuarios, muchos de ellos con conocimiento escaso o nulo acerca de terminos
tecnicos o de programacion, pero con un denominador comun: la capacidad de comprender
el idioma castellano.
En tal sentido, el manejo de literatura tecnica casi exclusivamente en ingles provoca una
suerte de \deformacion profesional": muchos terminos en ingles se adaptan literalmente al
castellano, en una version supuestamente equivalente. Por desgracia, esa equivalencia a me-
nudo no existe; ciertas palabras en ingles se escriben de manera identica en castellano, pero
con distinto signicado (ej.: los adjetivos en ingles actual y eventual). En consecuencia, mu-
chas veces llegan a elaborarse frases en castellano utilizando palabras que resultan equvocas
o ambiguas, ya que para interpretarlas correctamente debe conocerse su signicado en ingles.
Lo dicho anteriormente no pretende constituir un argumento para sustituir cada termino
en ingles por uno equivalente en castellano, suprimiendo la jerga tecnica 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 idiomaticos que se semejan
a pautas de redaccion en ingles constituyesen una mera \cuestion de estilo", o resultasen
mas \tolerables". A modo de ejemplo, puede mencionarse el gran n umero de veces en que
se obvian acentos, o no se utilizan los dos smbolos de interrogacion o de admiracion.
Sin intencion de ponticar al respecto, ni adoptar una postura xenofoba, entendemos
que el idioma castellano debe preservarse y cultivarse como tal, ya que constituye nuestra
herramienta basica de comunicacion. Es imprescindible educar y desarrollar la capacidad de
redaccion de textos en castellano; el estilo utilizado podra adaptarse segun las circunstancias,
pero no debe deformarse al punto que se torne ininteligible \a menos que se lo interprete en
ingles".
A traves de estas paginas se intenta dar una modesta contribucion 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 traduccion de ciertos terminos
en ingles, pero cuyo signicado es ambiguo, incorrecto estilsticamente o equivocado. En
cada caso se menciona la palabra cuestionable en castellano, el termino en ingles a partir
del cual fue traducida o derivada dicha palabra, el problema asociado a la traduccion, sugi-
riendose nalmente algunas traducciones posibles. Se mencionan tambien ciertas cuestiones
{109{
8 AP

ENDICE: EL INGL

ES EN COMPUTACI

ON Y SU INCIDENCIA EN NUESTRO
IDIOMA
estilsticas y referentes a la tipografa en castellano, que suelen ser muchas veces confundidas
con aquellas empleadas en textos en ingles. En el texto que sigue, en aquellos casos en que
se considere necesario destacarlo, las palabras en ingles estaran en tipografa italica, y las
palabras en castellano apareceran en tipografa sans-serif.
8.1 Palabras cuestionables
Palabra cuestionable en castellano: actual
Termino original en ingles: actual
Problema: En ingles, actual signica \efectivo", \concreto", \que existe como un hecho real".
Ej: There is a big dierence between the opinion pol ls and the actual election results (Hay una
gran diferencia entre las encuestas de opinion y los resultados concretos de la eleccion); We must
consider both potential and actual problems (Debemos considerar tanto los problemas potenciales
como los problemas realmente existentes).
Traduccion sugerida: efectivo, real, concreto.
Palabra cuestionable en castellano: actualmente
Termino original en ingles: actually
Problema: El adverbio actually signica \en realidad" o \de hecho". Ej: She says it's a good lm,
though she hasn't actually seen it (Ella dice que la pelcula es buena, aunque en realidad ella no
la vio). En conversaciones, actual ly se usa para dar un tono amable a una correccion hecha a otra
persona, o bien para expresar disconformidad. Ej: una persona le dice a otra Happy Birthday!, y
la otra contesta Wel l, actual ly my birthday was yesterday.
Traduccion sugerida: en realidad, de hecho, en rigor de verdad.
Palabra cuestionable en castellano: aplicar
Termino original en ingles: to apply
Problema: El verbo ingles to apply signica, entre otras cosas, \solicitar algo, especialmente
de manera ocial y por escrito". Ej: I've applied for a scholarship (He pedido/solicitado una
beca). El verbo espa~nol \aplicar" no posee este signicado. Otra expresion derivada de to apply es
application form, es decir, una \solicitud" (<y no un \formulario de aplicacion"!).
Traduccion sugerida: En ciertos contextos, puede usarse solicitar o pedir
Palabra cuestionable en castellano: soportar
Termino original en ingles: support
Problema: El verbo \soportar" no puede usarse como equivalente de support en muchas expre-
siones, ya que, seg un la situacion, support puede traducirse como \apoyar", \nanciar", \alentar",
\sustentar", etc. Ej: The workers signed a petition in support of. . . , corresponde en castellano a
Los trabajadores rmaron una peticion en apoyo de. . . . La frase He needs much money to support
such spendings se corresponde a El necesita mucho dinero para solventar/nanciar semejantes gastos.
La pregunta What footbal l team do you support? se corresponde a >A que equipo de futbol apoya?
o, mas informalmente, >De que cuadro sos?. La oracion My theory is supported by this theorem
{110{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
puede interpretarse como mi teora se sustenta en este teorema.
Traduccion sugerida: Entre otros, pueden considerarse apoyar(se), nanciar, alentar, sustentar(se)
en, y basarse en.
Palabra cuestionable en castellano: eventual , eventualmente
Termino original en ingles: eventual, eventually
Problema: En castellano, la palabra \eventual" signica \sujeto a cualquier evento o contingen-
cia". En ingles, el signicado es totalmente distinto: eventual signica \que ocurre a la larga
como resultado nal". Ej: The new computer is expensive, but the eventual savings it wil l bring
are very signicant (La nueva computadora es cara, pero, a la larga, representara un ahorro muy
signicativo). Algo similar ocurre con \eventualmente", que en castellano signica \incierta o
casualmente"; en ingles, eventually se corresponde con expresiones tales como at last, in the end (es
decir, \a la larga"). Ej: After many attempts she eventual ly managed to pass the exam (Despues
de muchos intentos, ella pudo nalmente aprobar el examen).
Traduccion sugerida: a la larga; nalmente
Palabra cuestionable en castellano: procedural
Termino original en ingles: procedural
Problema: La palabra \procedural" no existe en castellano, ni esta asociada en modo alguno a la
idea de \procedimiento". El adjetivo procedural deriva de procedure; en castellano, la derivacion
resultante a partir de \procedimiento" sera, en todo caso, \procedimental".
Traduccion sugerida: procedimental.
Palabra cuestionable en castellano: discutir
Termino original en ingles: to discuss
Problema: En ingles, to discuss signica \considerar algo, ya sea en forma hablada o por escrito,
desde distintos puntos de vista". Ej: This chapter discusses dierent approaches to the treatment
of diseases; Discuss the fol lowing theorem. En castellano, si bien \discutir" tambien posee una
acepcion similar, es mas saludable utilizar como equivalente \analizar", \considerar", etc. Ej: en
la ultima frase mencionada, una traduccion mas acorde que \Discuta el siguiente teorema" sera
\Analice/considere el siguiente teorema".
Traduccion sugerida: En ciertos contextos, se sugiere utilizar analizar o considerar.
Palabra cuestionable en castellano: sino
Termino original en ingles: else
Problema: La palabra \sino" equivale a la palabra but, pero no a la palabra else. Ej: This is
not only...but also... (Esto no solo es..., sino tambien....). La palabra else, tal como se la usa en
lenguajes de programacion, equivale a otherwise o if not, por lo que se corresponde en castellano a
\si no", o \en caso contrario". Ej: You must pay $100 or else go to prison (Debe pagar $100, o si
no ira a la carcel).
Traduccion sugerida: Al escribir sentencias condicionales (if-then-else), se podra escribir
\si no" para poner en claro que la palabra utilizada no es la misma que \sino". De mantenerse
la palabra \sino", debe aclararse que se esta abusando del lenguaje por razones practicas o de
comodidad, y que no se la esta utilizando correctamente.
{111{
8 AP

ENDICE: EL INGL

ES EN COMPUTACI

ON Y SU INCIDENCIA EN NUESTRO
IDIOMA
Palabra cuestionable en castellano: ocurrir , ocurrencia
Termino original en ingles: to occur, occurrence
Problema: En ingles, el sustantivo occurrence esta asociado al verbo to occur (suceder, ocurrir,
tener lugar). Ej: How many times does the letter 'a' occur in this line of text?; The number of
occurrences of 'a's in the text is . . . En castellano no existe tal asociacion. Una \ocurrencia" tiene
el unico signicado de \una observacion o comentario chistoso, gracioso o ironico". Por otro lado,
en situaciones como la anterior, en castellano es usual utilizar el verbo \aparecer". Ej: >Cuantas
veces aparece la letra 'a' en esta lnea de texto?; La cantidad de apariciones de la letra 'a' en el texto
es . . . .
Traduccion sugerida: En contextos como el mencionado, puede usarse aparecer, y su forma
sustantivada aparicion.
Palabra cuestionable en castellano: refrasear
Termino original en ingles: to rephrase
Problema: La palabra \refrasear" no existe en castellano. El verbo to rephrase signica \expresar
algo con otras palabras, especialmente para hacer mas claro su signicado". Ej: We have to
rephrase the last two paragraphs.
Traduccion sugerida: reescribir, revisar.
Palabra cuestionable en castellano: sustituir a por b
Termino original en ingles: substitute a for b
Problema: En ingles, decir we substituted Xs for Ys signica we put Xs in place of Ys. En
castellano, por el contrario, decir \sustituir Xs por Ys" signica \poner Ys en lugar de Xs".
Traduccion sugerida: No hay ningun inconveniente en utilizar el verbo sustituir, siempre y
cuando se advierta que los roles que juegan Xs e Ys en el ejemplo anterior se invierten.
8.2 Otros problemas comunes
El uso de acentos y signos de puntuacion correctos es un aspecto importante en lo que respecta
a la calidad de presentacion de un trabajo. Es com un observar que solo se utilice el signo de
interrogacion o admiracion nal (esto es, ? o !). En castellano, es obligatorio el uso de los
dos smbolos correspondientes en cada caso: >, ?, < y !.
Cabe se~nalar que, en ingles, la estructura de las oraciones interrogativas permite \predecir"
que las mismas estan asociadas a preguntas, ya que el verbo se coloca en primer lugar. Ej:
considerense las preguntas Is there any sugar left?, o Do you know what time it is?. En
castellano no existe tal situacion, por lo que la presencia de dos signos de interrogacion
hace mas facil la identicacion de una pregunta, lo que resulta particularmente importante
al momento de leerla en voz alta. Ej: >Es importante diferenciar todos los aspectos antes
mencionados?. En esta frase, de haberse colocado solamente un unico signo de interrogacion
al nal, el lector reconocera que se trata de una oracion interrogativa unicamente cuando
llega al nal de la misma...
Es com un leer ttulos tales como \Evitando ciclos en la programacion en Pascal", como
traduccion de Avoiding Loops in Pascal Programming. Debe se~nalarse que el gerundio en
{112{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
ingles tiene un uso mucho mas frecuente que en castellano. En particular, en ingles es
comun especicar ttulos o encabezamientos utilizando verbos en gerundio. Ej: \Preparing
to Take the TOEFL Test", \Getting started", \Changing the Margins", etc. Para comprobar
esta armacion, basta tomar el ndice de un libro en ingles, y analizar el gran n umero de
captulos y secciones, cuyo encabezamiento tiene un verbo en gerundio. En castellano, por
el contrario, el uso del gerundio es mas restringido. El gerundio que aparece en ttulos
en ingles puede sustituirse por preguntas indirectas o por verbos sustantivados. As, los
ttulos anteriores podran escribirse como \Como evitar ciclos en la programacion en Pascal",
\Como prepararse para rendir el examen TOEFL", \Como empezar", y \Como cambiar los
margenes".
En ingles es obligatorio utilizar letras mayusculas en muchas situaciones especiales, como por
ejemplo:
a) en los sustantivos y adjetivos que aparecen en el ttulo de una obra literaria, o en un
encabezamiento (ej: \How to Live with no Money", \How to Program in Pascal");
b) en gentilicios y adjetivos derivados de nombres de personas (ej: Newtonian laws, an
American author);
c) en los nombres de religiones, grupos etnicos y raciales, etc. (ej: Buddhism, Democrats
and Republicans);
d) en los nombres de los meses y de los das (ej: Monday, June).
En castellano, como regla general, no se utilizan may usculas en ninguno de estos casos. As,
por ejemplo, el ttulo de un libro o artculo se escribe con su primer letra en may uscula (y las
demas en min uscula), o bien todas en mayuscula. Ej: \Como programar en Pascal", o \COMO
PROGRAMAR EN PASCAL". Los adjetivos asociados a nombres de personas, as como los
gentilicios, se escriben en minuscula. Ej: leyes newtonianas, regla bayesiana.
{113{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
9 Niklaus Wirth: el creador de Pascal
Niklaus Wirth fue quien introdujo por primera vez la programacion estructurada y la
descomposicion modular como metodologa de trabajo para desarrollar algoritmos. Su aporte
a las ciencias de la computacion fue muy signicativo. Fue el quien introdujo una serie de
lenguajes de programacion innovadores en muchos sentidos, tales como Euler, Algol-W,
Modula y Pascal. Este ultimo es quizas el mas famoso y difundido de todos ellos. Pascal,
desarrollado hacia 1972, adquirio una gran signicacion por su aplicacion a la ense~nanza de
la programacion. Los conceptos establecidos por Wirth a traves de este lenguaje sentaron las
bases de investigaciones futuras en areas tales como lenguajes de programacion, arquitectura
de computadoras y analisis de sistemas. Los elementos mas sobresalientes de Pascal son
su simplicidad y su potencialidad como herramienta para desarrollar sistemas complejos.
Pascal, comparado con los lenguajes existentes en la epoca en que fue creado, resulto ser
un lenguaje cuya notacion era una extension natural del pensamiento algortmico, sin recurrir
a ningun formalismo adicional.
En abril de 1971, Wirth publico un artculo en la revista "Communications of the ACM",
donde introdujo los conceptos de \renamiento paso a paso" y \modularizacion", ejempli-
candolos en la solucion del famoso problema de ubicar 8 reinas en un tablero de ajedrez
sin que se ataquen entre s. El trabajo de Wirth desperto, pocos a~nos mas tarde, una ola
de furor en el mundo de la computacion, dando lugar al nacimiento de la \programacion
estructurada". Las pautas que planteara Wirth en aquel trabajo de 1971 siguen aun vigen-
tes hoy como estrategias de programacion y de resolucion de problemas. Posteriormente,
Wirth desarrollo un lenguaje mas poderoso que Pascal en el manejo de estructuras de da-
tos, al que denomino Modula. Variantes posteriores de dicho lenguaje fueron Modula-2
y Modula-3.
Wirth recibio el ttulo de Ph.D. (doctor) de la Universidad de California, en Berkeley,
en 1963. Fue profesor asistente de la Universidad de Stanford hasta 1967. Desde 1968, se
desempe~na como profesor del Instituto Tecnologico Federal de Suiza (ETH). En 1984, recibio
el premio Turing (Turing Award) por parte de la Association for Computing Machinery
(ACM), en honor a su trayectoria y sus valiosos aportes a las ciencias de la computacion.
Lo que sigue es la parte principal del texto de la conferencia dada por Niklaus Wirth,
al recibir el premio Turing (Turing Award) 1984. Dicho premio se entrega anualmente a
aquellos que han realizado contribuciones importantes a las ciencias de la computacion. En
dicha conferencia (llevada a cabo en 1985), Wirth relato sus experiencias profesionales mas
relevantes, y resulta sumamente interesante releerlas para analizar {a la luz de nuestros co-
nocimientos actuales{ las motivaciones que sustentaron la contribucion de N. Wirth a las
Ciencias de la Computacion. El original de dicha conferencia gura en la revista Communi-
cations of the ACM, Vol.28, No.2, Feb.1985.
{115{
9 NIKLAUS WIRTH: EL CREADOR DE PASCAL
Del dise~ no de un lenguaje de programacion
a la construccion de una computadora
Turing Award Lecture 1984 por Niklaus Wirth
[...] Por cierto, cuando ingrese al campo de la computacion en 1960, esta no era el centro
de la atencion p ublica, ni en lo comercial ni en lo academico, como lo es hoy. Durante mis
estudios en el Instituto Federal Suizo de Tecnologa (ETH), la unica mencion que escuche
acerca de computadoras fue en un curso optativo dado por Ambros P.Speiser (quien mas
tarde resultara ser electo presidente del IFIP). Speiser haba desarrollado una computadora
llamada ERMETH, la cual era de difcil acceso para los estudiantes de computacion, razon
por la cual mi iniciacion en la computacion fue postergada hasta que tome un curso de analisis
numerico en la Universidad de Laval, en Canada. Pero la maquina con que contabamos all
era una Alvac III E, la cual tena problemas la mayor parte del tiempo, por lo que nuestros
ejercicios de programacion solan quedar en papel, en la forma de meras secuencias de dgitos
hexadecimales...
Mi siguiente intento fue ya mas exitoso: en Berkeley (California), me pusieron ante
la \maquina mascota" de Harry Huskey: la Bendix G-15. Aunque la Bendix G-15 provea
cierta sensacion de exito (pues produca resultados), la esencia del arte de programar pareca
radicar en como ordenar inteligentemente las instrucciones de los programas en el \tambor"
(drum) de almacenamiento de la maquina. Si uno ignoraba ese arte, los programas podan
llegar a correr cien veces mas lentos. Pero haba una ventaja educacional: uno no poda
dejar de lado ni siquiera el menor detalle. No haba forma de resolver errores de dise~no con
simplemente \poner mas memoria". Viendolo desde la optica de hoy en da, el aspecto mas
atractivo de esta maquina era que cada detalle era visible, y poda ser comprendido. No
haba nada escondido en una circuitera compleja, o en un sistema operativo magico.
Por otra parte, era obvio que las computadoras del futuro tenan que ser programables
mas efectivamente. Por esa razon, abandone la idea de estudiar como dise~nar hardware, y
me dedique a estudiar como usar el que haba disponible mas elegantemente. Fui afortunado
en unirme a un equipo de investigacion que estaba trabajando en el desarrollo (o mas 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 benecios de este \lenguaje" eran bastante obvios, y
la tarea de traducir automaticamente programas en codigo maquina planteaba problemas
considerables. Esto es precisamente lo que uno quiere encontrar cuando esta buscando un
doctorado. El compilador para NELIAC, que estaba escrito tambien en NELIAC, era un lo
bastante intrincado. El tema pareca consistir de un uno por ciento de ciencia, y noventa
y nueve por ciento de magia, y esto haba que cambiarlo. Evidentemente, los programas
tenan que dise~ narse siguiendo los mismos principios que los circuitos electronicos, 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, exista la esperanza
de entender nalmente el todo.
Este intento recibio un impulso vigoroso con la aparicion del informe tecnico sobre Algol
60. Algol 60 era el primer lenguaje dise~nado con claridad; su sintaxis estaba especicada in-
{116{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
cluso en un formalismo riguroso. La leccion era que una especicacion clara es una condicion
suciente, pero no necesaria, para lograr una implementacion efectiva y conable. El con-
tacto con Aadrian van Wijngaarden, uno de los codise~nadores de Algol, dio como resultado
un tema que resultara central: >Sera posible condensar y cristalizar mas a un los principios
del Algol?
As empezaron mis aventuras con los lenguajes de programacion. Mi primer experimento
llevo 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 academica, pero no de
mucha utilidad practica (casi la anttesis de los lenguajes de programacion estructurados y
basados en tipo de dato). Pero Euler creo una base para el dise~no sistematico de compi-
ladores que (esa era la idea), poda extenderse sin perder claridad, a n de incluir nuevas
caractersticas.
Euler atrajo la atencion 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 matematicos numericos,
tena una estructura sistematica y una denicion concisa, que fueron apreciados por gen-
te entrenada matematicamente; sin embargo, Algol careca de compiladores y apoyo en la
industria. Para ganar aceptacion, deba ampliarse su rango de aplicaciones. El Grupo de
Trabajo IFIP asumio la tarea de desarrollar un sucesor, y pronto este trabajo se dividio en
dos campos: en uno estaban los \ambiciosos", los que queran sentar un monolito dentro
del dise~no de lenguajes; en el otro estaban los que sentan que el tiempo apremiaba, y que
ampliar Algol 60 adecuadamente sera una tarea productiva. Yo estaba en este segundo
grupo, y enviamos una propuesta que perdio en la votacion. 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 llego 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-
cion. La nueva IBM 360 solo ofreca codigo 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 encontre el coraje su-
ciente para denir \otro lenguaje mas" para poder describir el compilador Algol: deba
ser un compromiso entre Algol, y las facilidades ofrecidas por lenguaje ensamblador; deba
ser un lenguaje maquina pero con estructuras de sentencias y declaraciones tipo Algol. In-
creblemente, denir este lenguaje llevo un par de semanas. Despues escrib el compilador en
una Burroughs B-5000 en cuatro meses, y un \estudiante aplicado" se encargo de adaptarlo
para la IBM 360 en otros cuatro meses. Este interludio preparativo ayudo a acelerar los tra-
bajos en Algol en gran medida. El lenguaje \intermedio" dise~nado (PL360) estaba pensado
para servir a nuestros propositos, y luego para descartarlo. No obstante, rapidamente ad-
quirio \su propio lugar": PL360 se convirtio en una herramienta efectiva en muchos lugares,
e inspiro el desarrollo de aplicaciones similares para otras maquinas.
Ironicamente, el exito de PL360 fue tambien un indicador del fracaso de Algol W. El rango
de aplicaciones de Algol haba aumentado, pero como herramienta para la programacion de
sistemas, segua teniendo sus deciencias. Haba surgido la dicultad de resolver muchas
demandas con un unico lenguaje: la meta de desarrollar \un unico lenguaje" paso a ser
{117{
9 NIKLAUS WIRTH: EL CREADOR DE PASCAL
cuestionable. PL/1, un lenguaje lanzado hacia esos a~nos, pareca apoyar mas aun esta
suposicion. PL/1 segua la idea de \Swiss army knife", la navaja multiuso, que serva para
todo proposito; esto tena sus meritos, pero tambien sus desventajas. El compilador de Algol
W, por su parte, crecio mas alla de los lmites en los que uno poda descansar tranquilo,
sabiendo que tena una \idea", una vision de todo el programa. El deseo de lograr un
formalismo mas conciso y mas apropiado para programacion de sistemas a un no se haba
visto concretado. La programacion de sistemas requiere un compilador eciente, que genere
codigo eciente, y que opera sin una gran cantidad de rutinas run-time (que deban estar
residentes). Este objetivo no haba sido alcanzado ni por Algol W ni por PL/1; en ambos
casos, el problema era que los lenguajes eran demasiados complejos, y las maquinas en las
que corran eran inadecuadas.
En el oto~no de 1967, volv a Suiza. Un a~no mas tarde, pude establecer un equipo con
tres asistentes, para implementar un lenguaje que mas adelante se denomino Pascal. Ya
estaba liberado de las presiones y restricciones de un comite (como el que rigio el desarrollo
de Algol), y pude concentrarme en incluir aquellas cosas que vea esenciales, y sacar aquellas
que a la larga no traeran benecio. Muchas veces, tambien 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 practicas. Con los estandares de hoy, Pascal tiene deciencias obvias con los
grandes sistemas de programacion, pero hace 15 a~nos, represento un compromiso adecuado
entre lo que era deseable y lo que era efectivo. En el ETH, comenzamos a introducir Pascal
en las clases de programacion en 1972, luchando contra una oposicion considerable. Al nal,
Pascal resulto ser un exito, porque le permita al profesor concentrarse mas en las estructuras
y conceptos que en los rasgos secundarios de un programa; es decir, poda concentrarse mas
en los principios que en las tecnicas.
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 codigo generado era muy inferior al que generaban los
compiladores Fortran, para programas equivalentes. La velocidad es un criterio esencial, y
facilmente medible, y creamos que la validez del concepto de \lenguaje de alto nivel" solo
sera aceptada en la industria si el costo a pagar en perfomance poda 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 basicamente la tarea de un unico profesional. En
1974, Urs Ammann desarrollo 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 codigo es proporcional a las diferencias que existen entre la maquina y el lenguaje, y
la CDC 6000 no estaba dise~nada para correr sobre ella lenguajes de alto nivel...
Una vez mas, ironicamente, el principal benecio aparecio por donde menos se lo es-
peraba. Despues de que la existencia de Pascal se hizo conocida, mucha gente comenzo
a pedirnos que la asistieramos en implementar Pascal en otras maquinas, enfatizando que
pensaban usarlo para ense~ nanza, y que la velocidad no era tan importante. Con esto fue que
{118{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
nos decidimos a escribir un compilador que generara codigo para una maquina de nuestro
propio dise~no. Este codigo sera conocido luego como codigo-P. El la version de codigo-P
era facil de construir, porque el nuevo compilador estaba dise~nado como un gran ejercicio
de programacion estructurada, donde haba que usar renamiento paso a paso. Pascal-P re-
sulto ser tremendamente exitoso, extendiendo el uso del lenguaje entre muchos usuarios. Si
hubiesemos tenido la vision suciente como para poder preveer los alcances de este lenguaje,
hubiesemos puesto mayor cuidado en el desarrollo, dise~no y documentacion del codigo-P. Sin
embargo, as como quedo, fue algo que valio la pena. Esto muestra que aun con las mejores
intenciones en mente, uno puede elegir sus propias metas equivocadamente.
Pero Pascal recien gano un reconocimiento verdadero cuando Ken Bowles, en San Diego,
reconocio que el sistema Pascal-P poda implementarse en las microcomputadoras, que aca-
baban de aparecer. Sus esfuerzos en lograr un entorno adecuado, con un compilador, editor
y depurador integrados, causaron sensacion: Pascal paso a estar disponible a miles de nuevos
usuarios, que ya no tenan sobre sus espaldas el peso de habitos adquiridos de programacion,
y no estaban urgidos por mantener compatibilidad con el software del pasado.
Mientras tanto, termine de trabajar con Pascal, y me decid a investigar un area nueva:
multiprogramacion. Aqu, Hoare ya haba sentado bases solidas, y Brinch Hansen haba
marcado el camino con su Pascal concurrente. El intento de \destilar" reglas concretas para
una disciplina de multiprogramacion me llevo rapidamente a formularlas en terminos 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 reejara
mi meta principal: modularidad en programacion. El modulo resulto ser mas adelante la
principal caracterstica de este lenguaje. A traves de este concepto, el concepto abstracto de
ocultamiento de la informacion (necesario en programacion de sistemas) tomaba una forma
concreta, e incorporaba un metodo que resultaba signicativo tanto para multiprogramacion
como para la programacion tradicional. El lenguaje, llamado Modula, tena facilidades para
expresar procesos concurrentes y su sincronizacion.
Hacia 1976, ya me haba cansado un poco de los lenguajes de programacion, y de la
tarea frustrante de construir buenos compiladores para las computadoras existentes, las que
estaban dise~nadas para ser codicadas \a mano", a la usanza antigua. Por fortuna, tuve la
posibilidad de pasar un a~no sabatico en el laboratorio de investigacion de Xerox Corp, en
Palo Alto (California), donde se haba originado y puesto en practica el concepto de una
\workstation" personal y poderosa. En lugar de compartir una computadora monoltica,
gigantesca, con varios usuarios, peleando por recibir atencion de un sistema con 3KHz de
ancho de banda, ahora yo contaba con mi propio sistema, debajo de mi escritorio, con un
canal de mas de 15KHz. La capacidad de trabajo se haba incrementado 5000 veces. La
sensacion mas particular fue que despues de estar 16 a~nos trabajando con computadoras,
recien ah la computadora pareca estar trabajando para m. Por primera vez empece a usar
una computadora para escirbir reportes y manejar mi correspondencia, en lugar de ponerme
a planicar nuevos lenguajes, compiladores y cosas por el estilo. Otra revelacion 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 poda implementarse en una
workstation como la que posea. Estas nuevas condiciones de trabajo tenan tantos ordenes
{119{
9 NIKLAUS WIRTH: EL CREADOR DE PASCAL
de magnitud por encima de lo que estaba acostumbrado, me llevaron a pensar en desarrollar
un entorno para este tipo de maquinas.
Finalmente, decid empezar a explorar primero el dise~no de hardware. Esta decision es-
tuvo reforzada por mi antiguo disgusto con las arquitecturas de computadoras existentes, las
que hacan miserable la vida de un dise~nador de compiladores que quera simplicar las cosas
sistematicamente. La idea de dise~ nar y construir un sistema computacional completo, con-
sistente de hardware, microcodigo, compilador, sistema oparativo, y utilitarios, fue tomando
forma en mi imaginacion: lograr un dise~no que estuviese liberado de cualquier restriccion de
ser compatible con PDP-11, IBM 360, o Fortran, Pascal, Unix, o cualquiera fuese el estandar
que un comite podra llegar a querer imponer.
Pero una sensacion de liberacion no basta para tener exito en un proyecto tecnico. El tra-
bajo duro, la determinacion, una sensibilidad de lo que es esencial y lo que es efmero, y una
cuota de buena suerte, son indispensables. El primer accidente afortunado fue una llamada
telefonica de un dise~nador de hardware que quera informarse acerca de las posibilidades de
venir a nuestra universidad, y aprender acerca de tecnicas de software y adquirir un ttulo
de Ph.D. >Por que no ense~narle software, mientras que el a nosotros nos ense~ naba hardware?
No llevo mucho tiempo para que los dos formasemos un equipo activo. La persona a que
hago referencia era Richard Ohran. Pronto estuvo tan excitado con el asunto de dise~nar un
nuevo hardware que se olvido todo respecto al software y a su Ph.D. Eso no me molestaba
demasiado, ya que yo estaba muy ocupado con la especicacion de micro- y macrocodigo (y
con la programacion de un interprete para este ultimo), con la planicacion de un sistema de
sofware integrado, y en particular, con la programacion de un editor de textos y un editor de
diagramas. Estos ultimos hacan uso de un nuevo tipo de monitor, de alta resolucion y con
mapeo de bits, y de un peque~no milagro llamado \mouse" como dispositivo auxiliar. Esta
ejercitacion en desarrollar programas utilitarios altamente interactivos requera el estudio y
la aplicacion de tecnicas bastante extra~ nas para alguien que haba trabajado en el dise~ no
convencional de sistemas operativos y compiladores.
El proyecto en su conjunto era tan diversicado y complejo que pareca irresponsable
comenzarlo, particularmente teniendo en cuenta del escaso numero de colaboradores con
semi-dedicacion que nos ayudaban (unos siete). La mayor amenaza consista en que era
difcil que nosotros dos nos mantuviesemos sucientemente entusiastas hasta que el resto
de la gente tambien fuese igualmente entusiasta (los demas no haban experimentado lo
suciente con la potencia de una workstation). Para que el proyecto se mantuviese dentro de
dimensiones razonables, me adher a tres dogmas: apuntar a una computadora con un unico
procesador, que sera operada por un unico usuario, y programada en un unico lenguaje.
Notablemente, estos tres elementos eran diametralmente opuestos a las tendencias de ese
momento, que estaban a favor de investigar conguraciones con multiprocesadores, sistemas
operativos multiusuario con tiempo compartido, y tantos lenguajes de programacion como
fuera posible.
Bajo las restricciones de \un unico lenguaje", encare una eleccion dicil, cuyos efectos
seran duraderos: >que lenguaje elegir? De los lenguajes existentes, ninguno pareca atracti-
vo. Ninguno satisfaca todos los requerimientos que tena en mente, ni era particularmente
llamativo para el dise~ nador de compiladores, quien sabe que la tarea propuesta tena que
{120{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
realizarse en un tiempo razonable. En particular, el lenguaje deba adaptarse a nuestros
deseos en cuanto a contar con estructuras (tenamos 10 a~ nos de experiencia con Pascal), y
poder manejar problemas que hasta ese momento solo podan ser resueltos usando lengua-
je ensamblador. Para resumir: la eleccion fue dise~nar un hijo de Pascal {que ya haba sido
probado lo suciente{ y del Modula experimental en el que haba estado trabajando anterior-
mente. El lenguaje resultante lo llamamos Modula-2. El modulo es la clave para poner bajo
un mismo techo los requerimientos contradictorios que imponen, por un lado, la abstraccion
de alto nivel, y por otro, facilidades de bajo nivel para permitir explotar las caractersticas
individuales de una computadora particular. El modulo le permite al programador encapsu-
lar el uso de facilidades de bajo nivel en peque~nas partes del sistema, protegiendolo de esta
manera de caer en alguna rutina a bajo nivel en lugares inesperados.
El proyecto Lilith demostro que no solo es posible, sino tambien ventajoso, dise~nar un
sistema basado en un unico lenguaje. Todo, desde los manejadores de dispositivos hasta los
editores gracos y de texto, estaban escritos en el mismo lenguaje. No hay distincion entre
los modulos que pertenecen al sistema operativo, y los modulos que pertenecen al programa
del usuario. De hecho, esta distincion casi desaparece, y con ello se evita el peso de un
bloque de codigo residente pesado y mastodontico, que nadie quiere pero que todos se ven
obligados a aceptar. Ademas, el proyecto Lilith demostro los benecios de formar una buena
pareja entre el dise~ no de software y hardware. Estos benecios pueden medirse en terminos
de velocidad: las comparaciones de tiempos de ejecucion de programas en Modula, revelaron
que Lilith era un sistema a menudo superior a una VAX 750, cuya complejidad y costo eran
superiores a los de Lilith. Las comparaciones entre sistemas pueden tambien medirse en
terminos de espacio: el codigo de programas Modula para Lilith es mas corto que el codigo
para PDP-11, VAX o 68000, en factores que van entre 2 y 3, y mas corto que el codigo
del NS 32000 en un factor de 1.5 a 2. Ademas, las partes de un compilador encargadas de
generacion de codigo para estos procesadores son mucho mas intrincadas que las de Lilith,
ya que las instrucciones a nivel de lenguaje maquina no se correspondan con el lenguaje a
alto nivel. Esto, de alguna manera, arroja una sombra oscura sobre la \adaptabilidad" de
muchos lenguajes de alto nivel, que han recibido mucha publicidad, para su uso en modernos
microprocesadores, pero que en vista de estas comparaciones antes mencionadas resulta ser
exagerada. La idea de que, ademas, estos dise~ nos de procesador seran reproducidos millones
de veces, es algo bastante deprimente. Por ser mayora, esos microprocesadores se impondran
como estandar. Por desgracia, los avances en tecnologa de semiconductores han sido tan
veloces que los avances en arquitectura han quedado opacados, y han pasado a ser menos
relevantes. La competencia fuerza a que los fabricantes armen nuevos dise~nos de chips antes
de que estos hayan probado realmente su ecacia. Y mientras que el software, por lo menos,
puede modicarse y reemplazarse, la complejidad mayor hoy da ha descendido a los mismos
chips. Y hay poca esperanza que dominemos mejor la complejidad cuando la aplicamos al
hardware, pero no en la misma medida al software.
Sin embargo, mirando las dos caras de la moneda, la complejidad tiene y ha mantenido
una fuerte fascinacion para mucha gente. Es cierto que vivimos en un mundo complejo, y
nos esforzamos para resolver problemas inherentemente complejos. No obstante, estno no
debera disminuir nuestro deseo de buscar soluciones elegantes, las cuales nos convenzan por
{121{
9 NIKLAUS WIRTH: EL CREADOR DE PASCAL
su claridad y efectividad. Las soluciones simples, elegantes, son mas efectivas, pero son
mas difciles de hallar que las complejas, y requieren mas tiempo, cosa que a menudo la
consideramos insoportable.
Antes de terminar, quisiera rescatar algunas de las caractersticas comunes de los pro-
yectos que se han mencionado. Una tecnica muy importante, y que rara vez se usa tan
efectivamente como en ciencias de la computacion, es el bootstrap. Nosotros lo usamos casi
en todos nuestros proyectos. Al desarrollar una herramienta, sea un lenguaje de programa-
cion, un compilador, o una computadora, los dise~ ne de tal manera que resultara benecioso
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 programacion al desarrollo y documentacion de circuitos, desde la preparacion de
reportes al dise~ no de tipos de letra (fonts). El bootstraping es la forma mas efectiva de
sacar provecho de los esfuerzos de uno, as como tambien 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
efmero. Siempre intente identicar y puntualizar lo que es esencial, y da benecios incues-
tionables. Por ejemplo, la inclusion de un esquema consistente y coherente de declaraciones
de tipo de dato en un lenguaje de programacion es, para m, un aspecto esencial, mientras
que los detalles de que tipo de sentencias FOR van a estar disponibles, o si el compilador
va a distinguir entre may usculas y min usculas, son cuestiones efmeras. En dise~no de com-
putadoras, considero que la eleccion de los modos de direccionamiento, y la provision de un
conjunto consistente y completo de instrucciones aritmeticas (incluyendo llamadas al siste-
ma, manejo de overow, etc) son esenciales; en contraste, los detalles de un mecanismo de
interrupcion prioritizada son mas bien perifericos. A un mas importante es asegurarse que lo
efmero nunca se impregne en el dise~no estructurado y sistematico de las facilidades centrales
de un sistema; es mejor que aquello que es efmero sea a~ nadido posteriormente a un marco
preexistene, perfectamente bien estructurado.
A veces, es difcil rechazar las presiones de incluir todas aquellas facilidades que \sera
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 inclusion de alguna caracterstica especial a
un lenguaje, o alg un tratamiento especial a alguna construccion o sentencia por parte del
compilador, uno debe ponderar los benecios frente a los costos agregados de su implemen-
tacion y su mera presencia, que van a ocasionar que el sistema sea mucho mas grande. Los
que dise~nan lenguajes a menudo fallan en este sentido. Yo admito con cierto placer que
ciertas caractersticas de Ada que no estan en Modula-2 seran \lindas de tener", pero, al
mismo tiempo, me pregunto si tenerlas valdra la pena por el costo que implican. Y este
costo es considerable. Pensemos que, aunque el dise~ no de ambos lenguajes comenzo en 1977,
los compiladores de Ada solo 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 lneas de codigo, mientras
que nuestro ultimo compilador de Modula tiene solo unas cinco mil lneas de codigo. Yo
{122{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
coneso que este compilador de Modula esta ya en los lmites de una complejidad compren-
sible, y que yo mismo me sentira incapaz de construir un buen compilador para Ada. Pero
aun si se ignora el esfuerzo de construir sistemas innecesariamente grandes, y el costo en
memoria para contener su codigo, el costo real esta oculto en los esfuerzos (que nadie ve) de
los inumerables programadoses que intentan desesperadamente entender estos compiladores
para usarlos efectivamente.
Otra caracterstica com un de los proyectos presentados anteriormente fue la eleccion de
herramientas. Creo que una herramienta debe estar a tono con el producto; debe ser tan
simple como sea posible, pero no mas simple que eso. Una herramienta es de hecho contra-
producente cuando lograr una gran parte de un proyecto esta 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 tecnicas de analisis sintactico bottom-up, guiadas por
tablas. Mas adelante, volv al metodo top-down recursivo descendente, que es facilmente
comprensible y sin lugar a dudas sucientemente poderoso, si la sintaxis del lenguaje esta
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 logicos.
Esto fue posible debido a conceptos sistematicos y sin trucos utilizados en el procesador.
Cada proyecto en s mismo fue, principalmente, una experiencia de aprendizaje. Uno
aprende mas cuando inventa. Solamente haciendo un proyecto de desarrollo uno puede ganar
suciente familiaridad con las dicultades intrnsecas, y suciente conanza para dominar
los detalles inherentes al mismo. Yo nunca pude separar el dise~ no de un lenguaje de su
implementacion, ya que una dencion rgida sin la retroalimentacion de la construccion de
su compilador, me parecera algo presuntuoso y poco profesional. De esta manera, participe
en la construccion de compiladores, dise~no de circuitos, e incluso en la conexion de cableado.
Esto puede parecer extra~no, pero simplemente me gusta la experiencia real, \hands-on",
mucho mas que el manejo de un equipo. Tambien he aprendido que los investigadores
aceptan el liderazgo de un miembro del equipo que \se ensucie las manos", mucho mas
facilmente que de un experto de organizacion, 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 metodos mas efectivos, y a veces, el unico disponible.
Finalmente, cada uno de estos proyectos fue llevado a cabo con el entusiasmo y el deseo
de triunfar, sabiendo que el desafo vala la pena. Esto quizas sea el prerequisito esencial,
pero tambien el mas sutil y difcil 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 contribucion. Mi sincero agradecimiento va tambien a
todos aquellos que participaron, en forma directa, trabajando en el equipo, o bien indirecta,
testeando nuestros resultados y contribuyendo con ideas a traves de crticas y palabras de
aliento, as como tambien aquellos que formaron sociedades de usuarios. Sin ellos, ni Algol
W, ni Pascal, ni Modula-2, ni Lilith habran llegado a ser lo que son. Este premio Turing
tambien honra sus contribuciones.
Niklaus Wirth
{123{
Resolucion de Problemas y Algoritmos { Ejercitac. y algunas consideraciones teoricas { Carlos I. Ches~ nevar
Referencias
[1] Diccionario Enciclopedico Abreviado Espasa-Calpe. Ed.Espasa-Calpe, Madrid, Espa~na,
1972.
[2] Trabajo Practico Nro. 1 (Tema: resolucion de problemas). Catedra de \Introduccion a
la Informatica" (a~nos 1992, 1993 y 1994). Universidad Nacional del Sur, Baha Blanca.
[3] Ches~ nevar, C. I. Gua Informativa para el estudiante de la U.N.S. en Licenciatura en
Ciencias de la Computacion. Baha Blanca, febrero de 1994.
[4] Ches~ nevar, C. I. \Some problems about English-Spanish translations in computer
science literature". En Special Interest Group on Computer Science Education (SIGC-
SE) Bulletin, de la Association for Computing Machinery, septiembre de 1994.
[5] Ches~ nevar, C. I. \Syntactic diagrams as a tool for solving text-processing problems".
En Special Interest Group on Computer Science Education (SIGCSE) Bulletin, de la
Association for Computing Machinery, diciembre de 1994.
[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.
[8] Longman Dictionary of Contemporary English. Longman Group, England, 1987.
[9] Mandell, M. Acertijos Fantasticos. Ed. Juegos & Co. { Zugarto Ediciones, 1995.
[10] Perelman, Y.I. Matematicas Recreativas. Ed. en Lenguas Extranjeras, URSS, 1959.
[11] Rueda, S., Castro, S. y Zanconi, M. Resolucion de problemas y algoritmos (notas
de curso). Universidad Nacional del Sur, Baha Blanca, 1990.
{125{

Indice de Materias
Pascal
Wirth: El creador de, 114
Turbo Pascal
Opcion de Archivo (File), 94
Opcion de Ayuda (Help), 101
Opcion de Busqueda (Search), 96
Opcion de Compilacion (Compile), 98
Opcion de Depuracion (Debug), 98
Opcion de Edicion (Edit), 95
Opcion de Ejecucion de programas
(Run), 97
Opcion de Ventana (Window), 100
Opciones varias (Options), 100
Teclas utilizadas en, 102
Teclas utilizadas en editor, 103
Consideraciones para manejo, 93
Menu de opciones de, 94
Unix, 108
Abortar, 104
Algorimtos
con fechas, 46
Algoritmo
para conjetura de Goldbach, 48
para numeros romanos, 47
Teorema de Fermat, 47
Algoritmos
para series, 46
Archivo, 104
Archivo de texto, 105
B usqueda espacio-estado, 19
Bloque de texto, 105
Boole, George, 34
Breakpoint
en Turbo Pascal, 99
Codigo ejecutable, 106
Cadena, 105
Camino, 19
Cancelar, 106
Cargar, 106
Compilador, 106
Condicion
Que es una, 30
Condiciones
Aspectos avanzados, 39
Bloques de acciones y su relacion con,
41
Situaciones redundantes en, 42
Conjuncion
Operador logico de, 32
Constantes
Declaracion de, 71
Cortar y Pegar, 105
Datos booleanos, 35
Aplicacion de, 36
De Morgan, Leyes de, 41
Directorio, 106
Disyuncion
Operador logico de, 33
Editar, 106
Editor de Textos, 106
Ejercicios
de trazas, 44
sobre algoritmos sencillos, 45
Estado
inicial, 19
meta, 19
Estados, 19
Funciones, 81
Denicion de, 72
Invocacion de, 82
Glosario de terminos de computacion, 104
Grabar, 106
Identicador, 70
Invocacion a procedimientos, 78
Lenguaje de programacion, 69
Login, 106
127

INDICE DE MATERIAS
Logout, 107
Memoria, 107
Menu, 107
Mover (bloque texto), 105
MS-DOS, 107
Mundos posibles, 18
en problemas de logica, 20
Numeros aabb, 45
Numeros capic uas, 45
Numeros contenidos, 48
Numeros parientes, 46
Negacion
Operador logico de, 34
Notacion bnf, 69
Operador logico \no", 34
Operador logico \o", 33
Operador logico \y", 32
Operadores logicos, 32
Condiciones complejas usando, 35
Propiedades de los, 40
Password, 107
Procedimiento estandar Read, 77
Procedimiento estandar Write, 76
Procedimiento y funciones
Diferencias entre, 79
Procedimientos, 79
Denicion de, 72
Invocacion de, 80
Procedimientos y funciones, 79
Programas
en Pascal, 69
Recomendaciones
sobre clases practicas, 8
sobre ejercicios resueltos, 8
Semantica, 69
Sentencia compuesta, 75
Sentencia de asignacion, 74
Sentencia vaca, 75
Sentencia If-Then-Else, 74
Sentencia Read, 77
Sentencia Repeat-Until, 74
Sentencia While-Do, 73
Sentencia Write, 76
Sentencias
de entrada y salida, 75
Sintaxis, 69
de Pascal, 71
Sistema
monousuario, 107
multiusuario, 107
operativo, 107
Sugerencias
para dibujos en Pascal, 84
para resolucion de problemas, 11
Terminal, 108
Tipos
Declaracion de, 71
Traduccion ingles-castellano
Palabras cuestionables, 110
Problemas comunes, 112
Uso de ingles
en computacion, 109
Variables
Declaracion de, 72
Watch
en Turbo Pascal, 99
Windows 95, 108
Wirth
Niklaus, 114
{128{

También podría gustarte