Академический Документы
Профессиональный Документы
Культура Документы
EN QUINTANA ROO
COMPENDIO DE EJERCICIOS
PARA LOS ENTRENAMIENTOS
CONTENIDO
FASE 1
1. LÓGICA Y MATEMÁTICA
1.1. ACERTIJOS
1.2. RAZONAMIENTO LÓGICO
1.3. RAZONAMIENTO MATEMÁTICO
FASE 2
2. PROGRAMANDO A KAREL EL ROBOT
3. INTRODUCCIÓN
3.1. ¿QUÉ ES?
3.2. EL MUNDO DE KAREL
3.2.1. CALLES
3.2.2. AVENIDAS
3.2.3. ESQUINAS
3.2.4. ZUMBADORES
3.2.5. MUROS
3.2.6. ORIENTACIÓN
3.2.7. MOCHILA (BOLSA) DE ZUMBADORES
4. VENTANAS DEL SIMULADOR
4.1. MUNDO
4.2. PROGRAMA
4.3. EJECUTAR
5. PROGRAMACIÓN EN KAREL
5.1. ESTRUCTURA DEL PROGRAMA
5.2. COMANDOS BÁSICOS
5.3. VARIABLE DE KAREL
5.4. CONDICIONES DE KAREL
5.5. OPERADORES LÓGICOS
5.6. SENTENCIAS DE CONTROL
5.6.1. SI / ENTONCES
5.6.2. SI / ENTONCES / SINO
5.6.3. REPETIR / VECES
5.6.4. MIENTRAS / HACER
5.7. FUNCIONES
5.7.1. DEFINE-NUEVA-INSTRUCCIÓN / COMO
5.7.2. RECURSIVIDAD
6. PROGRAMAS EJEMPLO
PRESENTACIÓN
Una de las actividades que se realizan con la computadora es su programación, pero en qué
consiste, es un conjunto de instrucciones y operaciones lógicas y matemáticas que se le
proporcionan a la computadora, para la realización de determinada acción o actividad.
Pero, para que la computadora pueda hacer lo que nosotros queremos o necesitamos, se
requieren de dos cosas muy importantes las cuales son:
Lo que se busca con este compendio es integrar un conjunto de ejercicios de tipo lógico y
matemático, para que los alumnos puedan practicar y planteen soluciones más elaboradas y
logren obtener mejores resultados.
Uno de los principales problemas que presentan los alumnos que al momento de resolver
exámenes de olímpicos, es que no pueden plantear sus soluciones, es decir que ya saben
qué es lo que deben de hacer, pero no saben cómo hacerlo.
La realización de estos ejercicios no garantizará que los alumnos puedan hacer un examen a
la perfección, pero si los realizan a conciencia, podrán tener un criterio más amplio para
resolver exámenes de diversos tipos y con la práctica podrán ellos mismos establecer sus
propios métodos para resolver problemas.
El presente compendio consta de tres partes principales, que corresponden a las fases
estatales que se llevan a cabo en la Olimpiada de Informática y son las siguientes:
En la primera parte los ejercicios están dirigidos para que los alumnos puedan desarrollar sus
habilidades lógicas, a partir del contexto de los enunciados, es decir que los textos no
contienen truco alguno y utilizando el razonamiento se pueden llegar a los resultados
correctos.
Aconsejo que los problemas se resuelvan sin la ayuda de calculadoras, para que los alumnos
puedan utilizar procesos de razonamiento, que es uno de los principales obstáculos con los
que se enfrentan al momento de resolver un examen de este tipo.
Estos son algunos, problemas que se presentan como material de estudio, si en sus
escuelas cuentan con otros ejercicios pueden aplicarlos y compartirlos para poder enriquecer
el presente material.
1.- ACERTIJOS
1.- Tuercas y clavos
Hay tres cajas, una contiene tornillos, otra tuercas y la otra clavos. El que ha puesto las
etiquetas de lo que contenían se ha confundido y no ha acertado con ninguna. Abriendo una
sola caja y sacando una sola pieza ¿Cómo se puede conseguir poner a cada caja su etiqueta
correcta?
Porsia explicó al pretendiente, que cuando mucho una de las 3 afirmaciones era
verdadera. ¿Cuál de los cofres contenía el retrato?.
Porsia explico al pretendiente que por lo menos una de las tres afirmaciones era verdadera y
que por lo menos una era falsa. Como quiso el destino, el pretendiente no fue nada menos
que el primer esposo. Resolvió este problema y se casaron otra vez
8.- Fichitas
Estamos frente a un tablero en el que hay un número desconocido de fichas, las cuales son
por una cara blancas y por la otra negras. Sabemos que 10 de estas fichas están con la cara
blanca hacia arriba y el resto con la negra hacia arriba. Están mezcladas sin ningún orden. Si
tenemos los ojos vendados, ¿como podemos formar 2 montones en los que haya el mismo
nº de fichas con la cara blanca hacia arriba?
12.- LA BOMBILLA:
Estás frente a una puerta cerrada que conduce a una habitación a oscuras en la cual hay una
bombilla, pero donde estás no puedes ver si está encendida o apagada. Lo que sí hay donde
estás, son cuatro interruptores de los cuales sólo uno enciende la bombilla del otro lado de la
habitación. Puedes activar o desactivar los interruptores cuantas veces quieras, pero sólo
puedes entrar en la habitación una sola vez. ¿Cómo harás para determinar cuál es el
interruptor que enciende la bombilla?
ALGORITMOS
1. BARAJEANDO
La mayoría de las personas, cuando juegan baraja, ordenan las barajas que les tocaron de
chico a grande, para poder ubicarlas con facilidad. El método más común de ordenamiento
es el siguiente:
Al inicio se tienen cero barajas en la mano, por lo que se toma la primera baraja y se coloca
en la mano. De la segunda a la quinta carta (suponiendo que se está jugando poker),se toma
la nueva carta y se compara con las cartas que se tienen en la mano, comenzando con la
que esté en el extremo izquierdo de la mano. Si la nueva carta es mayor que la carta con la
que se está comparando, se pasa a la siguiente carta a la derecha y se vuelve a comparar,
en caso de que no exista ninguna carta a la derecha, la nueva carta se inserta en el extremo
derecho de la mano. Si la nueva carta es menor o igual a la carta con la que se esta
comparando, la nueva carta se inserta a la izquierda de la carta con la que se comparó.
2.- Escribe dos números enteros positivos que al multiplicarse den como resultado un
número de un solo dígito y al sumarse den uno de dos dígitos.
Número menor: ___________ Número mayor: __________
3.- Encuentra un numero de dos dígitos que es igual al doble del producto de sus dígitos.
Número: _________
4.- La edad de un padre y su hijo suman 55 años. La edad del padre es la edad del hijo con
sus dígitos al revés.¿Qué edades tienen?
El padre tiene _____años y el hijo tiene _____años
5.- En cierto torneo de tenis se utiliza una bola nueva para cada juego. Cualquier jugador al
perder un juego es eliminado y el torneo continúa hasta quedar un solo ganador. Si al torneo
entraron 111 participantes,¿cuántas bolas se utilizaron?
Se utilizaron _____bolas
6.- Hay 100 edificios a lo largo de una calle, se le encarga a un impresor hacer los números
para estos edificios, ¿Cuántos 9 va a necesitar?
Necesitará ________ números
7.- ¿Qué tan larga es una cuerda 2 metros más corta que otra que es tres veces más larga
que la primera?
Mide ______ metros
8.- Un maestro muy anticuado utiliza un gran reloj de arena para tomar el tiempo que dura su
clase, que es de 4 horas y empieza a las 9:00.Un día un alumno travieso, decide darle vuelta
al reloj de arena sin que el maestro se dé cuenta. Después de un rato el maestro lo nota y
regresa el reloj a su posición original, en ese momento son las 11:30. Ese día la clase
termina a las 3:00.¿A qué hora volteó el alumno el reloj?
A las ________ Escribe tu resultado con el formato hh:mm
9.- Tengo la misma cantidad de hermanos y hermanas, pero mis hermanos tienen el doble de
hermanas que hermanos.¿Cuántos somos?
Mujeres _____ y Hombres _____
10.- .Observa las balanzas a continuación y di qué se debe colocar en la última balanza para
equilibrarla.
12.- Un poco antes del 14 de febrero, Karla que presumía de ser muy popular le dijo a sus
dos amigas: “Cada año recibo 100 tarjetas o más de mis admiradores” cada una de sus
amigas, incrédulas contestaron: “De seguro que son menos de 100 ” y “ Bueno, al menos
debes recibir una ”.
Si tan sólo una de las tres esta diciendo la verdad.¿Cuántas tarjetas recibe Karla?
Recibe _____ tarjetas
13.- Una persona dijo: “Todas mis corbatas son rojas, excepto dos. Todas mis corbatas son
azules excepto dos. Todas mis corbatas son cafés excepto dos.” ¿Cuántas corbatas tiene?
Tiene _____ corbatas
14.- Martha hace poco me dijo “ Ayer cuando me desperté tenía 29 años, pero el próximo
año voy a cumplir 32 ”.¿Qué día es el cumpleaños de Martha?
Es el día ______ de _________________
15.- Tres niñas van con sus padres de paseo a un río. Al llegar allí se encuentran con que tan
sólo hay un bote con 2 lugares para cruzar de un lado al otro.
16.- Si dos patos están nadando en frente de otro pato, dos patos están nadando atrás de
otro pato y un pato esta nadando entre otros dos patos, ¿cuál es el mínimo de numero de
patos que hay nadando?
Hay mínimo ________ patos nadando
17.- Tenemos 10 sacos llenos de diferente número de canicas, al menos con 1000 cada uno.
Cada saco contiene canicas que pesan 10 gramos, excepto uno de ellos que tiene canicas
defectuosas que pesan 9 gramos cada una. Si tienes una báscula ¿cuál es el mínimo
número de pesadas que se requieren para identificar el saco que tiene las canicas de 9
gramos?
Se necesitan mínimo _______
¿Cuántas cánicas en total pesarías?
Pesaría en total _______ canicas
18. Tenemos 10 vasos puestos en fila, los primeros 5 están llenos de agua y los otros 5
están vacíos. Moviendo los vasos, lo cuál implica cambiarlo de lugar o pasar el agua de un
vaso lleno a uno vacío, ¿cual es el mínimo numero de veces que tienes que mover un baso
para que queden alternados?
Se necesita mover ______ vasos mínimo
19. Tenemos 8 pares de calcetines blancos y 10 pares de calcetines negros en una caja.
¿cuál es el mínimo numero de calcetines que hay que sacar de la caja para asegurar que
tengamos al menos un par del mismo color?
Se necesita sacar al menos ______ calcetines.
20. Un reloj antiguo tarda 7 segundos desde que empieza hasta que termina en dar 8
campanadas, ¿Cuánto tardará cuando sean las 12?
Tardará ______ segundos
21. Un amigo me dijo: "Tengo 8 hijas y cada una tiene un hermano". ¿En total cuántos hijos
hombres tiene mi amigo?
Tiene ______ hijos hombres
22. El Sr. Blanco, el Sr. Rojo y el Sr. Azul están en una junta, los tres traen corbatas de
colores como sus apellidos, sin embargo ninguna corbata corresponde a su apellido, el Sr.
Azul le pregunta al hombre con la corbata blanca si le gusta el Rojo, pero no puede escuchar
la respuesta. ¿Cuál es el color de la corbata de cada uno?
Existe otro problema aún más grave; si la cabra se queda con la lechuga seguro se la va a
comer, si el lobo se queda con la cabra seguro se la va a comer.
¿Puede el hombre lograr llegar al otro lado con todas sus pertenencias? ____ Si _____ No
¿Si lo puede lograr cuántas veces cruza el río y a quién debe transportar primero?
Cruza el río _____ veces y lleva primero a (la / el) ______
23. La familia Sotomayor formada por el Sr. Noe, la Sra. Maricela y su hijo Gerardo tienen 4
vehículos: una camioneta, un sedan, un auto nuevo deportivo y una pick-up. ¿ cuál es el
vehículo que usa cada uno y cual es el color de cada uno de los vehículos? si todas las
siguientes aseveraciones son correctas:
a) el Señor maneja el vehículo blanco todos los días, por cierto, su auto no es un sedan
b) la pick-up tiene menos millas que el auto amarillo, el verde y que el blanco
c) el auto que Gerardo maneja a la escuela no es una camioneta
d) un vehículo que es verde, tiene mas de 50 años y lo utilizan solo en desfiles de autos
antiguos.
e) la Señora prefiere manejar el vehículo rojo.
f) A Gerardo le gusto manejar el auto nuevo.
g) El Sr.Noe maneja (el/la) _______ de color _______
h) La Sra. Maricela maneja (el/la) _______ de color _______
i) Gerardo maneja (el/la) _______ de color _______
24. Un caballero se encuentra con 4 grandes dragones y para que no lo maten, debe de
saber cuáles son sus razas y colores (el caballero es daltónico y no puede distinguir los
colores).
Los Grises Racionales y los Rojos Depredadores siempre dicen la verdad, los Rojos
Racionales y los Grises Depredadores así como los Azules Racionales y los Azules
Depredadores siempre mienten. Las pistas de los 4 dragones fueron:
A dijo:
1.- si quieres saber mi tipo C te dará una respuesta verdadera.
2.- D es Azul
B dijo:
1.- A y Yo somos Racionales
2.- 3 de nosotros son Azules
C dijo:
1.- si quieres saber el tipo de A, B te dará una respuesta verdadera
2.- solo uno de nosotros es azul
3.- todo lo que dice D es falso
1. El vendedor de naranjas:
Un vendedor ambulante se propuso vender una cesta de 115 naranjas a razón de 10
monedas cada 5 naranjas. En el momento de la venta cambió de opinión e hizo un montón
con las 58 naranjas más gordas y otro con las 57 más pequeñas. Las gordas las vendió a 5
monedas cada 2 naranjas y las pequeñas a 5 monedas cada 3 naranjas.
¿Era esto lo mismo que la intención primera?
2. El diablo y el campesino
Iba un campesino quejándose de lo pobre que era, dijo: daría cualquier cosa si alguien me
ayudara. De pronto se le aparece el diablo y le propuso lo siguiente:
Ves aquel puente, si lo pasa en cualquier dirección tendrás exactamente el doble del dinero
que tenias antes de pasarlo. Pero hay una condición debes tirar al rió 24 pesos por cada vez
que pases el puente.
Paso el campesino el puente una vez y contó su dinero, en efecto tenía dos veces más, tiro
24 pesos al río, y paso el puente otra vez y tenía el doble que antes y tiro los 24 pesos, paso
el puente por tercera vez y el dinero se duplico, pero resulto que tenia 24 pesos exactos y
tuvo que tirarlos al río. Y se quedo sin un peso. ¿ Cuánto tenia el campesino al principio?
¿Cuánto tenia el campesino antes de pasar por ultima vez?
3. La viejecita en el mercado:
Una viejecita llevaba huevos al mercado cuando se le cayó la cesta.
¿Cuantos huevos llevabas? - le preguntaron,
No lo se, recuerdo que al contarlos en grupos de 2, 3, 4 y 5, sobraban 1, 2, 3 y 4
respectivamente.
¿Cuantos huevos tenía la viejecita?
4. La botella de vino
Si nos dicen que una botella de vino vale 10 euros y que el vino que contiene cuesta 9
euros más que el envase, ¿cuanto cuestan el vino y el envase por separado?.
5. Llenar la piscina:
Para llenar de agua una piscina hay tres surtidores. El primer surtidor tarda 30 horas en
llenarla, el segundo tarda 40 horas y el tercero tarda cinco días. Si los tres surtidores se
conectan juntos, ¿cuanto tiempo tardará la piscina en llenarse?.
6. En el bar:
Tres amigos van a tomar café. Piden la cuenta y el camarero les dice que son 25 pesetas
por los tres cafés. Cada uno pone 10 pesetas, en total 30. Con las 5 que sobran, se queda
cada uno 1 peseta, y las otras 2 para el bote del bar. Es decir, cada uno paga 9 pesetas, que
por los tres serían 27, más las 2 de la propina, 29. ¿Donde está la peseta que falta?
7. María y Juan:
María tiene un hermano llamado Juan. Juan tiene tantos hermanos como hermanas.
María tiene el doble de hermanos que de hermanas. ¿Cuantos chicos y chicas hay en la
familia?
9. Juan y Pedro:
Juan le dice a dice a Pedro: "si me das una oveja tengo yo el doble que tu" Pedro le
contesta: " no seas tan listo, dámela tu a mi, y a si tenemos los dos igual" ¿Cuantas ovejas
tiene cada uno?.
22. Una pareja de novios en el día de San Valentín, se repartieron los chocolates de una
bolsa. Después de contar cuántos les había tocado, la novia le dijo:“ Si te doy uno, tu
tendrías el doble que yo, pero si tu me das uno, tendremos los dos la misma cantidad ”
¿Cuántos chocolates tenían?
La novia tenía _____ chocolates y el novio tenía ________chocolates
23. En la iglesia 17% dieron 5 pesos de limosna, 50% del restante 83 % dieron 10 pesos, el
resto no dio nada. ¿Cuantos pesos se juntaron en total ese domingo?
Se juntaron: ________ pesos
24. Al ir caminando por una calle que tiene 30 metros de largo noto, que desde que inicia hay
árboles a los lados, para ser exactos tiene árboles cada 6 metros, uno a cada lado,
¿Cuantos árboles tiene en total la calle?
La calle tiene ________ árboles
25. Una araña muy especial, comienza a tejer su telaraña enfrente de una ventana. Cada día
logra tejer un área igual al área que había logrado tejer hasta el día anterior. Después de
30 días completa el área de toda la ventana.¿Cuántos días les llevaría a dos arañas con
la misma característica tejer la ventana?(Cada araña teje un día el equivalente a lo que
había tejido ella misma hasta el día anterior)
Les lleva ____días
26. Una criadora de gallinas recogió en una canasta los huevos y los llevo a vender al
mercado. En el camino un hombre que llevaba prisa tropezó con ella, tirando la canasta.
Todos los huevos se rompieron, el hombre apenado quiso pagárselos. Pero al preguntarle
cuántos eran la mujer contesto: “No lo recuerdo, pero sé que cuando intenté dividirlos en
27. Dos madres con sus dos hijas fueron a comer pizza. La dividieron en partes iguales
utilizando 5 cortes y se la repartieron. Cada una comió la misma cantidad de
partes,¿cuántas comió cada una?
Cada una comió _____ piezas
28. Ponemos una espora en un tubo de ensayo. Cada hora la espora se divide en 3 partes
cada una del mismo tamaño de la original y con las mismas características de
crecimiento. Si se colocó a las 01:00 hrs y a las 07:00 hrs el tubo estaba completamente
lleno.
¿A qué hora estaba a la tercera parte de lleno?
Estaba a la tercera parte a las _______ (escribe la hora en el formato hh:mm)
Si el tubo de ensayo esta colocado adentro de una caja con volúmen 243 veces mayor
que el tubo.
¿A qué hora se llenará también la caja?
Se llenará la caja a las _______ (escribe la hora en el formato hh:mm)
29. Un hombre entró a una tienda y compro una sombrilla por $100. Para pagar le dio al
vendedor un billete de $500. El vendedor fue al banco para obtener cambio, pero 2 horas
mas tarde, el banquero fue a la tienda reclamando que el billete de $500 era falso, así que
el tendero tuvo que cambiárselo por uno verdadero y aceptar el falso de regreso
Entre el cliente estafador y el banco, ¿cuanto dinero perdió la tienda?
Perdió _______ pesos
30. Observa la figura de abajo, y determina cuantos diferentes caminos te pueden llevar del
inicio al fin, solo te puedes mover en la dirección de inicio a fin, no puedes regresar.
Existen _______ caminos diferentes
31. 10 flechas son lanzadas al blanco mostrado abajo, una de ellas cae fuera completamente,
si el total de los puntos sumados es 100, ¿cuántas flechas cayeron en cada parte del
blanco?
Cayeron ______ flechas en la zona de 8 puntos
Cayeron ______ flechas en la zona de 12 puntos
Cayeron ______ flechas en la zona de 14 puntos
Cayeron ______ flechas en la zona de 18 puntos
33. Ahora que ya sabes como balancear 2 columnas estas listo para balancear 3.
intercambiando un bloque de cada columna las sumas van a ser iguales. ¿Qué bloques
debes intercambiar?
34. En una clase de arte enseñan a los estudiantes a hacer una estatua con una bolsa de
barro de 1 Kg. Durante este proceso algo del barro se desperdicia, por cada 5 estatuas
que se hacen sobra suficiente barro para hacer una más, ¿Cuantas estatuas se pueden
hacer si se cuenta con 25 Kg?
Se pueden hacer ______ estatuas
35. Una barra de oro puesta en un platillo de una balanza se equilibra con 9/10 de Kg. y 9/10
de una barra igual de oro. ¿Cuánto pesa la barra de oro?
Pesa ______ kg.
36. Observa la figura de abajo en que los número están ordenados, tu tarea es reordenarlos
de tal forma que ningún número esté a un lado de su consecutivo, esto quiere decir que
no estén ordenados a derecha e izquierda, arriba y abajo o diagonalmente.
37. Un palíndromo es una palabra o número que se lee igual de derecha a izquierda que de
izquierda a derecha, como por ejemplo el 606 y el 4334.
Mientras conducía su carro por la ciudad, BOB (quien adora tanto los palíndromos que se
cambio en nombre de Juan a Bob) observa maravillado que el odómetro marca un
número palíndromo: 13,931 Km. BOB continúa manejando, 1 hora mas tarde se da cuenta
para su sorpresa que ahora el odómetro marca otro palíndromo. ¿Cuál es la velocidad
mas probable a la que iba BOB?
La velocidad a la que iba era ______ km/h
En esta sección se presenta un manual completo del simulador de Karel el Robot, donde se
exponen todas las funcionalidades, con las que cuenta, así como de las instrucciones,
estructuras y métodos de programación.
Karel es un robot que vive en su mundo, formado de calle y avenidas, donde su tarea
principal es buscar zumbadores, tomarlos y dejarlos en un lugar específico, sin embargo
Karrel tiene ciertos limitantes como son los muros que lo limitan para realizar mejor su
trabajo. La tarea principal de los alumnos es ayudar a Karel, a través de instrucciones
sencillas para que pueda cumplir con las tareas encomendadas.
Los que se busca con este simulador es que los alumnos se introduzcan a la programación
de computadores, de una forma sencilla y fácil de entender y no a través de conceptos
complejos y abstractos.
KAREL EL ROBOT
Karel es una herramienta de aprendizaje que presenta los conceptos de una forma visual, lo
cual es menos abstracto que programar en un lenguaje como Pascal o C, es un Robot simple
que vive en un mundo simple y debido a que Karel y su mundo son simulados, nosotros
podemos realmente ver los resultados de un programa en acción.
EL MUNDO DE KAREL
El mundo de karel está formado por Calles y Avenidas, en las cuales tiene que desplazarse
y hacer las tareas que le indiques.
Karel puede orientarse en una de las cuatro direcciones: este, oeste, norte y sur. Sólo gira
90º cada vez, por tanto no puede orientarse hacia el nordeste. En el mundo de Karel, las
calles van de este a oeste, y son numeradas comenzando por 1. No hay números de calle
igual a 0 o negativos. Las avenidas van de norte a sur, y también están numeradas
empezando por 1. Tampoco hay números de avenida igual a 0 o negativos. Se le llama
esquina a la intersección de una calle con una avenida. Karel va de una esquina a la
siguiente en un solo movimiento.
No. DE ZUMBADORES
DESPLAZADORES
C
A MUROS
L
L
E ZUMBADORES
S
KAREL
AVENIDAS
Figura 01: Elementos del Mundo de Karel
Las calles y avenidas se pueden limitar utilizando muros, que se pueden colocar al norte,
sur, este y oeste y evitan que Karel se salga de su mundo.
Otro elemento de interés en el mundo de Karel son los zumbadores. Un zumbador es una
forma de marca que Karel puede escuchar sólo cuando se encuentra en la misma esquina
Fase 2: Programando a Karel el Robot 19
11ª Olimpiada Mexicana de Informática 2006.
que el zumbador. Karel tiene una bolsa que puede utilizar para poner los zumbadores que
vaya cogiendo. También puede hacer lo contrario, es decir, sacar los zumbadores de su
bolsa y depositarlos en las esquinas por las que va pasando. Puedes ajustar el número inicial
de zumbadores en cada esquina con el control Zumbadores.
El ambiente de trabajo de Karen esta formado por tres ventanas con las cuales se
desarrollan diferentes ejercicios de variadas complejidades.
VENTANA MUNDO
Karel vive en mundo simple el cual podemos crear utilizando la ventana “Mundo”, en esta
ventana definimos el espacio en el cual puede transitar Karel agregando muros y
zumbadores.
La definición del mundo de Karel nos permitirá hacer mas fácil o complejas las diferentes
actividades que le encarguemos al robot Karel.
Haga clic en este botón para crear un nuevo mundo en blanco en el cual se
agregaran los muros y zumbadores
Permite guardar un mundo que ya existe con otro nombre. Al hacer clic en
este botón se abre el cuadro de dialogo de la figura 03.
Con este botón abrimos los mundos que tenemos creados previamente. Al
hacer clic en este botón se abre el cuadro de dialogo “Abrir” de Windows en el cual
seleccionaremos la ubicación y el nombre del mundo que se desee abrir
Para agregar un muro hacemos clic en la calle o avenida que deba existir un muro, y para
eliminarlo hacemos clic en el muro.
Los zumbadores están representados con un número el cual indica la cantidad exacta de
zumbadores que existe en una esquina (intersección de una avenida y una calle).
Para agregar zumbadores hacemos clic con el botón derecho del ratón en la esquina en la
cual requerimos uno o más zumbadores, del menú emergente (figura 06) hacemos clic en la
opción que nos convenga.
Para Borrar los zumbadores hacemos clic en los zumbadores con el botón derecho y en la
opción 0 zumbadores del menú emergente. (Ver figura 06)
Karel se representa con una flecha gruesa y se le puede situar en cualquier esquina en una
de las cuatro siguientes orientaciones al Norte, Este, Sur o al Oeste. La punta de la flecha
indica la orientación y dirección en la cual se desplazara Karel.
Para situar y orientar a Karel haga clic en una de las esquinas con el botón derecho y en el
menú emergente apunte en la opción Situar a Karel y clic en una de las cuatro opciones de
orientación, vea la figura 07.
VENTANA PROGRAMA
Para enseñar a Karel a realizar una actividad se debe codificar un programa el cual puede
tener la estructura de Pascal o Java, para lo cual nos servirá esta ventana.
La venta esta formada por dos partes: una barra de botones y un área de codificación en la
cual se escribe el código programa, la cual esta representada por un recuadro blanco el cual
en la parte izquierda se numeran las líneas de código.
Los programas se guardan con la extensión .txt indistintamente del lenguaje en que se haya
codificado
Nota: Siempre que se realice una modificación al código del programa se debe compilar
antes de ejecutarlo.
VENTANA EJECUAR
Esta ventana es una de las características que podemos resaltar de Karel debido a que nos
permite ver la forma en que se ejecuta el código del programa y las acciones que realiza
Karel por cada línea de código.
Ejecuta una línea de código cada vez que hacemos clic en este botón.
La programación de Karel se puede realizar en los lenguajes Pascal o Java, en el caso de este manual se
vera la forma de programar en Pascal el cual es un lenguaje estructurado.
Kerel cuenta con pocas condiciones y comandos. Las actividades que puede realizar son avanzar,
recoger y dejar zumbadores, al combinar esta simples actividades se pueden realizar innumerables
actividades desde las más simples como es el avanzar por una avenida o calle hasta las más complejas
como son operaciones matemáticas, ordenamientos entre otras.
Iniciar-programa
Inicia-ejecución
Termina-ejecucion
Finalizar-programa
Sintaxis general:
- Todas las instrucciones deben terminar con un punto y coma (;).
- No distingue entre minúsculas y mayúsculas.
- Los identificadores (nombre de las instrucciones, comandos y funciones) no deben llevar:
espacios en blanco acentos, ñ
- Las instrucciones que se pongan después de la palabra Finalizar-programa no se consideran
parte del programa.
- Los comentarios se empiezan con los caracteres (* y finaliza con *), ejemplo (* Esta es una
línea de comentario *) y no se consideran parte del código del programa.
COMANDOS BÁSICO.
Consideraciones:
- Si intentamos avanzar atreves de una pared karel marca un error y se desconecta
- Karel solo puede girar a la izquierda, por lo cual si queremos que gira a la derecha debemos
hacer que Karel gire 3 veces.
- Si intentamos dejar un zumbador cuando la mochila esta vacía Karel marca un error y se detiene
el programa.
VARIABLE DE KAREL
Karel solo cuenta con una variable que es su mochila en la cual podemos agregar o dejar zumbadores.
CONDICIONES DE KAREL
La condición es una función de la situación actual de Karel, a medida que se ejecuta el programa.
Estas funciones retornan dos posibles valores, Falso o Verdadero los cuales indican si Karel se
encuentra o no en la situación indicada por la condición.
OPERADORES LÓGICOS
Las condiciones de Karel se pueden combinar utilizando los operadores lógicos siguiente
Sintaxis:
Condición operador-lógico condición
Ejemplo:
mientras frente-libre Y derecha-bloqueada Y izquierda-bloqueada hacer inicio
deja-zumbador;
avanza;
fin;
SENTENCIAS DE CONTROL
Las sentencias de control se usan para elegir qué hacer, y/o cuantas veces hacerlo. Sin embargo, por si
solos no causan que ocurra algo. Simplemente controlan la ejecución de otras sentencias o fragmentos
de código. A continuación se lista una serie de sentencias de control de Karel:
- Si / Entonces
- Si / Entonces / Sino
- Repetir / Veces
- Mientras / Hacer
Siempre a continuación de las sentencias de control entonces, veces, sino, y hacer van seguidas de la
palabra inicio para iniciar el grupo de sentencias a ser realizado. El grupo de sentencias va seguido de
la palabra fin.
Utilizamos el par inicio/fin para un sólo parámetro o para varios, no importa el número de ellos. El
compilador devolverá una advertencia en caso de que no se siga este estilo.
Nota: Un punto y coma no debe estar a continuación de un inicio, pero sí es necesario a continuación
de un fin (excepto cuando precede una sentencia sino).
Sentencia Si / Entonces
Utilizamos esta sentencia cuando queremos que Karel realice algo solo en ciertas condiciones
Donde xxx es una condición, yyy son sentencias a realizar si xxx es verdadero.
Ejemplo:
...
Si orientado-al-sur entonces inicio
gira-izquierda;
gira-izquierda;
gira-izquierda;
fin ;
...
En este ejemplo si Karel se encuentra orientado al sur girara tres veces y quedara orientado al este.
Utilizamos esta sentencia cuando requerimos que Karel realiza una u otra acción dependiendo de la
condición en la que se encuentre.
Forma general:
Donde xxx es una condición, yyy son sentencias a realizar si xxx es verdadero, y zzz son las sentencias
a ejecutar si xxx es falso.
Ejemplo:
Fase 2: Programando a Karel el Robot 33
11ª Olimpiada Mexicana de Informática 2006.
En este ejemplo si las condiciones son verdaderas Karel ejecuta las funciones media-vuelta y alfombra-
cuarto (previamente definidas por el programador) y si son falsas se ejecutan las funciones media-
vuelta y avanza-por-el-cuarto.
Es útil cuando se sabe exactamente cuantas veces se debe de realizar una cosa.
Forma general:
Donde xxx debe ser un número entero positivo, y yyy representa cualquier número de sentencias de
Karel.
Ejemplo:
...
repetir 14 veces inicio
avanza ;
fin ;
...
En este ejemplo Karel avanza 14 esquinas a partir de su ubicación actual en la dirección en la que este
orientado.
Extremadamente valiosa cuando no se sabe de antemano exactamente cuantas veces se necesita realizar
una tarea.
Fase 2: Programando a Karel el Robot 34
11ª Olimpiada Mexicana de Informática 2006.
La sentencia mientras/hacer nos permite repetir pasos mientras se cumple una condición, y esto nos va
a permitir programar a Karel para que ¡no sea un chico tan rígido!.
Forma general:
Donde xxx debe ser una condición (una de las funciones booleanas listadas anteriormente), y yyy
representa cualquier número de sentencias de Karel.
Ejemplo:
…
Mientras frente-libre hacer inicio
avanza;
fin;
…
En este ejemplo Karel avanzara desde su posición actual hasta que se encuentre con una pared, si
encuentra una pared deja de avanzar.
FUNCIONES
Hasta ahora, le hemos dicho a Karel exactamente lo que tenía que hacer tal como necesitábamos que lo
hiciese. Esto funciona bien, pero se podrán haber dado cuenta de que siempre se utilizan secuencias de
sentencias similares. Un ejemplo es cuando Karel tiene que girar a la derecha, y nosotros le decimos
"gira-izquierda; gira-izquierda; gira-izquierda;". ¿No sería más fácil si le pudiéramos decir
simplemente "gira-derecha"?.
En otras palabras, diciendo " gira-derecha; " Karel giraría tres veces hacia la izquierda para alcanzar
nuestro objetivo. Es posible.
Una de las razones de crear nuevas instrucciones, es por evitar escribir tanto. Otra es para documentar
mejor cual es nuestro objetivo, cuando nosotros mismos u otra persona leen el programa. Como se
estarán dando cuenta, programar es una tarea muy sencilla, y ¡necesitamos toda la ayuda necesaria para
hacer las cosas correctamente!
En si una función es un segmento de programa que podemos utilizar tanta veces como sea necesario y
con tan solo hacer una llamada al nombre de la función desde cualquier parte del programa.
Sentencia Define-nueva-instruccion
Forma gerenal:
Nombre de la función:
- Debe empezar con una letra.
- El nombre de la función se pude formara con las letras del abecedario (acepción de la ñ),
números y los caracteres guión alto (-) y guión bajo ( _ ) para separa las palabras.
- No debe tener espacios en blanco o cualquier carácter no valido para identificadores como
pueden ser: acentos, ñ, /, ?, *, entre otros
Las sentencias se pueden anidar, es decir pueden existir una o más funciones dentro de otra función.
yyy;
…
fin;
Para ejecutar una función basta con escribir el nombre de la función seguida de punto y coma, en el
lugar que desee ejecutar dicha función, puede ser dentro de otra función o el bloque principal del
programa.
Ejemplo:
Programa que hace que Karel avance desde la esquina calle 1 avenida 1 hasta un muro y regrese y se
detenga hasta que encuentre un muro.
iniciar-programa
fin;
inicia-ejecucion
(* se realiza una llamada a la función avanza muro *)
Avanza-hasta-muro;
apagate;
termina-ejecucion
finalizar-programa
El siguiente es un programa válido para Karel:
Recursividad
La recursividad es la propiedad que tienen las funciones de realizar llamadas así misma.
Cuado se realiza una llamada a una función (llamémosla hija) la función que realiza la llamada
(llamémosla padre) queda inconclusa y requiere que la función que fue llamada (función hija) termine
para que termine la función padre.
Con la siguiente grafica intentaremos mostrar el proceso de recursividad, inicio y finalización de las
llamadas de a la misma función.
Debemos tener cuidado al utilizar la recursividad y definir claramente cuando termina la función, si no
podemos crear un ciclo infinito y nunca terminaría el programa.
Le sugerimos que la llamada a la función debe estar dentro de una sentencia de control si / entonces o si
/ entonces / sino mediante la cual controle si se realiza o no la llamada.
Debemos utilizar la recursividad cuando la solución del problema así lo requiera y no exista otra forma
de dar solución ya que utiliza una gran cantidad de recursos (memoria y procesamiento) y hace más
lenta la ejecución del programa.
Ejemplo de recursividad:
Este programa le indica a Karel que avance hasta que encuentre un muro y regrese a la ubicación
exacta en la que inicio.
iniciar-programa
inicia-ejecucion
si frente-libre entonces inicio
avanza;
fin;
media-vuelta;
apagate;
termina-ejecucion
finalizar-programa
En esta sección se busca que los alumnos comprendan los conceptos de un lenguaje de
programación específico, como puede ser Pascal, C y C++, que son los lenguajes de
programación oficiales en la Olimpiada Mexicana de Informática.
Se pretende también introducir a los alumnos en las metodologías utilizadas en para resolver
problemas con un lenguaje de programación específico, como son, búsquedas,
ordenamientos, recursividad, entre otros.
Los temas que aquí se presentan pueden ser aplicables a cualquier lenguaje de
programación oficial de la Olimpiada Mexicana de Informática. Además presenta ejemplos
para res implementados en los lenguajes oficiales y algunos temas de reflexión sobre las
metodologías de programación
Presenta también algunos temas sobre estructuras de datos, que son utilizados para resolver
problemas de la Olimpiada, como los arreglos unidimensionales y multidimencionales, las
pilas, las colas y los archivos, donde todos los datos de entrada para los programas se hacen
a través de archivos de texto, así como las salidas, tomando en cuenta que tanto las
entradas como las salidas de los programas tienen un formato especial que tienen que
cumplir, ya que sino lo hacen el programa es descartado y tiene un resultado de cero.
Un dato curioso que hay que tomar en cuenta es el nombre que tiene el programa, ya que
también debe de ser el que se indica en el examen, así como el nombre de lo archivos de
salida, por que sino lo hacen así también son descartados.
2. TÉCNICAS DE PROGRAMACIÓN
2.1. BÚSQUEDAS
Por ©César Arturo Cepeda García.
Las búsquedas son uno de los recursos más básicos e importantes dentro de las técnicas de
programación. Realmente, resulta difícil hacer hincapié suficiente en la importancia que
representan las técnicas de búsqueda dentro del conjunto de herramientas diarias de un
programador. Pero, ¿A qué nos referimos con búsqueda? ¿Qué es lo que se está
buscando? ¿Cuándo utilizar una búsqueda?
Una computadora puede utilizarse para una gran cantidad de fines distintos, para escribir un
documento, para ver una película, para jugar, etc. En el ambiente de los concursos de
programación, la computadora se utiliza como una herramienta para resolver problemas.
Normalmente, por “resolver un problema” nos referimos a encontrar un conjunto de datos S a
partir de un conjunto de datos inicial D que cumpla con ciertas características que se
estipulan en el planteamiento del problema. Y ¿Cómo encontrar el conjunto de datos S?
Pues obviamente, ¡Buscando!
Por búsquedas entonces, nos referimos a las diferentes técnicas que hay de buscar una
solución para un problema, utilizando como herramienta una computadora. Ahora si está
pareciendo algo útil, ¿Verdad?
Claro que para llevar a cabo dicho método de búsqueda requieres de un cuarto
suficientemente grande para distribuir la paja y de un detector de metales. Igual para buscar
soluciones con una computadora, en muchos casos requerirás de que la computadora
cuente con memoria suficiente para almacenar el espacio de búsqueda y necesitarás de una
forma de modelar las soluciones de modo que puedan ser representadas en la memoria de
una computadora.
Lo que si tienen de mágico las técnicas de búsqueda es que si las dominas, y aprendes a
definir los espacios de búsqueda podrás escribir programas que encuentren la solución
Vayamos entonces a los pasos que se requieren para implementar una búsqueda.
Tomemos por ejemplo, un caso bien conocido por todos. Dado un conjunto de N números
enteros escribe un programa que entregue como salida una permutación de dichos números
{x1, x2, ... , xN} tal que xi ≤ xj para toda i < j. Es decir, el programa recibe como entrada N
números enteros y debe entregar como salida los mismos números pero ordenados de
menor a mayor.
De la figura anterior puede observarse que si revisamos todos los caminos de este árbol, uno
de ellos (o más si hay números repetidos) será la solución que buscamos. Así es que, como
podrás ver, incluso problemas tan inocuos como el de ordenar un conjunto de números
puede resolverse buscando en un espacio de soluciones potenciales. Recorrer todo el
espacio de búsqueda de un problema puede ser muy lento, por ejemplo para la ordenación el
espacio de búsqueda es de N! Mientras que los algoritmos más comunes son de N logN,
muuuuuuucho más rápidos que N!. Sin embargo, lo importante de definir el espacio de
búsqueda es que te da una idea mucho más clara del problema. Además de que rara vez es
necesario buscar en todo el espacio, muchas veces el simple hecho de representar el árbol
te indica podas que te pueden ahorrar muchos pasos, por ejemplo, para la ordenación, si en
una rama se agregó un número mas chico al último número que se tenía, entonces podemos
estar seguros de que la solución no esta en ese camino y podemos cortar esa rama del
árbol.
2.2. ORDENAMIENTOS
INTRODUCCIÓN
Por ©César Arturo Cepeda García.
Aunque las computadoras de hoy en día son muy rápidas comparadas con sus similares de
hace algunos años, y son capaces de llevar a cabo millones de operaciones en un segundo,
resulta fácil encontrar ejemplos de problemas y soluciones que tardarían años en
solucionarse.
Cuando se analiza el tiempo de corrida de un algoritmo, mas que el tiempo exacto que
tardará el algoritmo en milisengudos, lo que importa es la función de crecimiento del
algoritmo, la función de crecimiento de un algoritmo, nos da una idea de que tanto aumentará
el tiempo de corrida según aumente el tamaño de la entrada. Por lo general, la función de
crecimiento de un algoritmo se expresa como la multiplicación de una constante y una
función que depende del tamaño de la entrada, es decir, c f(n) donde n es el tamaño de la
entrada.
Tomemos por ejemplo el problema de ordenar una lista de números. Se tiene un conjunto de
números A{x1, x2, ... , xn} un algoritmo de ordenación debe entregar como salida una
permutación del conjunto A tal que xi <= xj para cualquier i < j. Es decir debe ordenar los
números del conjunto de chico a grande.
Ordenar una lista de números es quizá la operación más común en las computadoras,
cientos de programas ordenan datos para poder trabajar con ellos, debido a eso, la cantidad
de algoritmos de ordenación que hay es muy grande, así como el tiempo que se ha dedicado
a estudiarlos, muy extenso. Para este apunte de análisis de complejidad vamos a estudiar
La ordenación por inserción tiene una función de crecimiento f(n) = n2, mientras que la
ordenación por mezcla tiene una función de crecimiento f(n) = n lg n donde lg n representa
el logaritmo base 2 de n. Para demostrar el porque es necesario estudiar el análisis de
complejidad, comparemos estos dos algoritmos. Supongamos que el mejor programador del
mundo implemento la ordenación por inserción en lenguaje máquina logrando una constante
de 2, por lo que el tiempo total de corrida será T=2 n2, donde n representa la cantidad de
números que queremos ordenar. Ahora supongamos que un programador promedio
implementa la ordenación por mezcla utilizando un lenguaje de alto nivel obteniendo una
constante de 50, por lo tanto el tiempo total de corrilda de la ordenación por mezcla será de
T=50 n lg n. Supongamos además que tenemos una computadora capaz de ejecutar
10,000,000 de operaciones por segundo.
ORDENAMIENTO-INSERCION (A)
1 desde j:=2 hasta Longitud(A) haz inicio
2 llave:=A[j]
3 i:=j - 1
4 mientras (i > 0) y (A[i] > llave) haz inicio
5 A[i + 1] := A[i]
6 i:=i - 1
7 fin-mientras
8 A[i + 1]:=llave
9 fin-desde
En la línea 1 del algoritmo, tenemos un ciclo que irá moviendo j desde 2 hasta el numero de
elementos de A en este caso denotado por Longitud(A). ¿Por qué desde 2? Recordemos
que al inicio tenemos el lado izquierdo vacio y tomamos elementos del lado derecho para
insertarlos en su posición correcta. Sin embargo la posición del primer elemento es trivial, ya
que un conjunto de 1 elemento siempre está ordenado! Por lo tanto no tiene caso buscar la
posición del primer elemento.
Para cada índice, a partir del 2, el elemento que se está insertando se compara con los
elementos ya ordenados de derecha a izquierda con el ciclo mientras de la línea 4. Aqui
pueden suceder dos cosas, si el elemento que se está insertando es menor que el elemento
ordenado, entonces el elemento ordenado se recorre un lugar hacia la derecha (asignación
de la línea 5). Si el elemento que se está insertando es mayor o igual, entonces se coloca en
ese lugar (asignación de la línea 8). Una vez que se encontro la posición del elemento, se
avanza al siguiente índice. Cuando j sea igual a Longitud(A) + 1 el algoritmo termina y
tenemos que los elementos en A están ordenados.
#veces que
ORDENAMIENTO-INSERCION (A) costo se ejecuta
1 desde j:=2 hasta ongitud(A) haz inicio c1 n
2 llave:=A[j] c2 n-1
3 i:=j – 1 c3 n-1
4 mientras (i > 0) y (A[i] > llave) haz inicio c4 Sum(2,n,tj)
5 A[i + 1] := A[i] c5 Sum(2,n,tj -
6 i:=i – 1 c6 1)
7 fin-mientras 0 Sum(2,n,tj -
8 A[i + 1]:=llave c7 1)
9 fin-desde 0
n-1
Para este ejemplo usamos la notación SUM(a,b,f(j)), que significa, la sumatoria desde j=a,
hasta j=b de la función f(j).
Para analizar un algoritmo, los pasos a seguir son basicamente 2, el primer paso es asignar
un costo computacional a cada línea del código, este costo computacional, que en la tabla
esta representado por c1, c2, ... , c7, está determinada por la velocidad de la máquina y la
naturaleza de la función, por ejemplo una suma requiere menos tiempo que una
multiplicación. Determinar este costo no es sencillo, ya que varía de máquina a máquina y
de arquitectura a arquitectura, por lo que muy rara vez se hará de manera exacta, sin
embargo vale la pena tener presente que existe. El segundo paso es ver cuantas veces va a
ser ejecutada cada línea de código, y está es la parte que más nos interesa, por lo que la
analizaremos paso a paso para nuestro ejemplo.
La línea 1 se ejecuta una vez por cada índice del arreglo, esto es desde 2 hasta
Longitud(A)+1 por lo que en total será ejecutado n veces, donde n es el número total de
elementos del arreglo.
Las líneas 2,3 y 8 se ejecutan el mismo número de veces que la 1 menos uno. Hay que
recordar que el ciclo desde (for), hace una última revisión para el caso en el que ya no
cumple con la condición. Por lo tanto estas líneas se ejecutan n-1 veces.
Entramos ahora a las líneas 4, 5 y 6 del algoritmo, estas líneas son las que se encargan de
buscar la posición correcta del elemento j. Si recordamos el funcionamiento del algoritmo,
para cada índice j se recorre la parte del arreglo ordenada de derecha a izquierda buscando
su posición, en el momento en que se encuentra su posición se termina el ciclo mientras.
Por lo tanto la función f(j) dependerá de cuantas comparaciones se tengan que hacer para
encontrar la posición del elemento j.
Como puede verse del último punto del analisis, la cantidad de veces que se ejecutan las
líneas 4, 5 y 6 no es fijo, sino que depende de la entrada. En la mayoría de los algoritmos, el
tiempo de ejecución dependerá de la entrada, por lo que la mayoria de las veces se puede
hacer un análisis de peor caso y análisis del caso promedio. En la teoría de la
computación lo más importante es el análisis del peor caso, este análisis busca cual sería
el tiempo de corrida del algoritmo con la peor entrada posible. Al obtener este tiempo, nos
damos una idea de que es lo más que puede llegar a tardar nuestro algoritmo.
Donde se puede apreciar claramente que el tiempo de corrida del ordenamiento por inserción
en el peor caso es una función cuadratica de n.
Cuando se analizan algoritmos, en general sólo importa el termino de la función que crece
más rápido, y se eliminan las constantes, por lo tanto en el caso del ordenamiento por
inserción, el término que crece más rápido es el término cuadrático, por lo que se dice que el
ordenamiento por inserción tiene una complejidad de O(n2).
Es conveniente que revises todo este análisis una y otra vez hasta que lo entiendas
perfectamente, ya que el analizar la complejidad de tus algoritmos es muy importante en las
ciencias de la computación y por lo tanto en la olimpiada.
Para explicar como funciona el procedimiento Mezcla volvamos al ejemplo de las barajas.
Supongamos ahora que se tienen dos montones de barajas, ordenados con las barajas hacia
arriba, y deseamos mezclarlos en un único montón ordenado con las barajas hacia abajo. Al
inicio ambos montones tienen a su carta más chica hasta arriba, el paso básico de nuestro
algoritmo es comparar las barajas en la parte superior de cada montón, retirar la que sea
más chica y ponerlas en nuestro montón de salida. Al quitar una baraja de uno de los
montones, queda expuesta la siguiente baraja, por lo que podemos seguir, si alguno de los
montones se llegara a terminar, entonces tomamos el montón que quedo y lo ponemos todo
en nuestro montón de salida y listo, terminamos!
Mezcla(A,p,q,r)
1 n1:=q - p + 1
2 n2:=r - q
3 Crea arreglo L[1..n1 + 1]
4 Crea arreglo R[1..n2 + 1]
5 desde i:=1 hasta n1 haz
6 L[i]:=A[p + i - 1]
7 desde j:=1 hasta n2 haz
8 R[j]:=A[q + j]
9 L[n1 + 1]:=infinito
10 R[n2 + 1]:=infinito
11 i:=1
12 j:=1
13 desde k:=p hasta r haz inicio
14 Si L[i] <= R[j] entonces inicio
15 A[k]:=L[i]
16 i:=i + 1
17 Si-No entonces inicio
18 A[k]:=R[j]
19 j:=j + 1
20 fin-Si-entonces
21 fin-desde
El ciclo desde que inicia en la línea 13 va desde p hasta r, es decir se ejecuta un número de
veces igual a la suma de los elementos de ambos sub-arreglos. El funcionamiento de este
ciclo es la idea básica del algoritmo. Compara el primer elemento no mezclado de cada sub-
arreglo y retira el menor, avanzando hacia el siguiente elemento del sub-arreglo de donde se
retiro el elemento.
Ordena-Mezcla(A,p,r)
1 Si p < r entonces inicio
2 q:=(p + r) div 2
3 Ordena-Mezcla(A,p,q) // ORDENA LA MITAD IZQUIERDA
4 Ordena-Mezcla(A,q+1,r) // ORDENA LA MITAD DERECHA
5 Mezcla(A,p,q,r)
6 fin-Si-entonces
los recursivos no siempre resulta algo muy sencillo, sin embargo para el caso de la
ordenación por mezcla se pueden seguir ciertos pasos que llevan a su análisis.
Como vimos anteriormente, la técnica de divide y vencerás se basa en tres pasos básicos.
Como con la ordenación por inserción sea T(n) el tiempo total que tarda el algoritmo en
ordenar n elementos. Cuando n es suficientemente chico, digamos n <= c, entonces
resolvemos el problema de la manera obvia, para este caso nuestro programa tarda un
tiempo constante, por lo que podemos decir que tiene una complejidad de O(1). En general,
supongamos que la division de nuestro problema nos entrega a subproblemas, cada uno de
tamaño 1/b (para el caso de la ordenación por mezcla, tanto a como b son iguales a 2). Si
tomamos que D(n) es el tiempo que tardamos en dividir el problema en subproblemas, y
C(n), el tiempo que tardamos en combinar los subproblemas en una solución, entonces
tenemos que
Hay un "teorema maestro" que sirve para resolver recurrencias de esta forma, sin embargo
para varios casos, como el de la ordenación por mezcla, se puede ver de manera intuitiva
cual va a ser el resultado. Revisemos paso a paso cada una de las partes.
Dividir: Para dividir, basta con cálcular cual es la mitad del arreglo, esto, se puede hacer sin
ningún problema en tiempo constante, por lo que tenemos que para la ordenación por mezcla
D(n) = O(1)
Fase 3: Resolviendo Problemas con un Lenguaje de Programación 50
11ª Olimpiada Mexicana de Informática 2006.
Vencer: Como dividimos el problema a la mitad y lo resolvemos recursivamente, entonces
estamos resolviendo dos problemas de tamaño n/2 lo que nos da un tiempo T(n) = 2T(n/2)
Combinar: Vimos anteriormente que nuestro Mezcla era de orden lineal, por lo que tenemos
que C(n)=O(n)
Para sustituir, sumamos D(n) + C(n) = O(n) + O(1) = O(n), recordemos que para el análisis
de complejidad únicamente nos importa el término que crezca más rápido. Por lo que
sustituyendo en la recurrencia tenemos que:
donde c representa una constante igual al tiempo que se requiera para resolver un problema
de tamaño 1.Sabemos que n sólo puede ser dividido a la mitad lg n veces, por lo que la
profundidad de nuestra recursión será de lg n, también del funcionamiento del algoritmo
podemos ver que cada vez que dividamos a la mitad, vamos a tener que mezclar los n
elementos, y sabemos que mezclar n elementos nos toma un tiempo proporcional a n, por lo
que resolver la recursión debe tomar un tiempo proporcional a n lg n, que de hecho es la
complejidad del algortimo. La ordenación por mezcla tiene una complejidad de O(n lg n).
Podemos comprobarlo, sustituyendo valores en la ecuación de recurrencia.
De la tabla anterior vemos que el tiempo real de corrida del ordenamiento por mezcla es
proporcional a n lg n + n, de nuevo, como en el análisis de complejidad únicamente nos
importa el término que crezca más rápido y en ésta función ese término es n lg n, por lo
tanto la complejidad del sistema es O(n lg n).
CONCLUSIONES
Las computadoras adquieren su nombre de su capacidad de computar, esto quiere decir que
las computadoras son capaces de realizar cálculos sobre un conjunto de datos.
Hoy en día las computadoras se utilizan para una gran cantidad de aplicaciones, juegos de
video, relojes, calculadoras portátiles, hornos de microondas, automóviles, laboratorios de
investigación, procesamiento de imágenes, etc. Sin embargo, aún cuando podría parecer
que las computadoras han perdido el rumbo de su finalidad original, esto no es cierto. Todas
las aplicaciones actuales de las computadoras siguen siendo básicamente la manipulación y
procesamiento de datos!
Por ejemplo, en un juego de video, la computadora debe procesar una serie de datos que
representan un mundo virtual, como son, posiciones de los personajes, orientación de los
mismos, puntos de vida, capacidad de ataque, etc. con base en estos datos y la entrada del
usuario, la computadora realizará operaciones sobre los mismos y determinará para el
siguiente instante, que caracteres siguen vivos, cuales han cambiado sus puntos de vida, etc.
En un automóvil la computadora recibe datos de los sensores del auto y con base en los
mismos, determina la cantidad de combustible y aire que debe introducir a los pistones para
el óptimo rendimiento del carro.
Y así, por inverosímil que parezca, todas las aplicaciones de las computadoras en el mundo
actual se basan en el procesamiento de los datos adquiridos para obtener el resultado
buscado.
0110111101101100011010010110110101110000011010010110000101100100
seguramente no te dice mucho, sin embargo si te indican que cada 8 dígitos binarios
representan un caracter ASCII, entonces podrías darte cuenta de que la cadena anterior
representa la palabra
olimpiad
o si supieras que la cadena binaria representa números enteros , dependiendo del tamaño de
los números enteros, la cadena representaría
Bytes (8 dígitos por entero): 111, 108, 105, 109, 112, 105, 97, 100
Entero corto (16 dígitos): 27759, 28009, 26992, 25697
Entero largo (32 dígitos): 1835625583, 1684105584
Entero cuádruple (64 dígitos): 7016998964367026544
Todos los ejemplos anteriores (enteros, flotantes, cadenas de caracteres, fechas, etc) se
conocen como Tipos de Dato, además de los tipos de dato, existen las Estructuras de Datos.
Las Estructuras de Datos sirven para organizar un conjunto de datos, pero a diferencia de los
Tipos de Dato, las Estructuras de Datos no son un objeto pasivo, ya que una Estructura de
Datos es un objeto que puede realizar una serie de operaciones sobre el conjunto de datos,
en general estas operaciones son insertar, remover, acceder, buscar, etc.
Existe una gran cantidad de estructuras de datos, cada una es útil para diferente tipo de
aplicaciones. Su estudio es muy importante, ya que el uso correcto de las estructuras de
datos adecuadas al problema que quieran resolver, puede facilitarles de manera increíble la
codificación, o puede mejorar el desempeño de su programa drásticamente.
3.1. PILAS
La PILA es quizá la estructura de datos común con un acceso más restrictivo, y sin embargo
es quizá también la más usada en el funcionamiento diario de cualquier programa de
cómputo.
La PILA cuenta únicamente con dos operaciones básicas: se puede insertar un dato al inicio
de la pila, y se puede remover un dato del inicio de la pila.
La pila, como puede inferirse, deriva su nombre de que los datos se apilan uno sobre otro,
ocasionando que en cualquier momento únicamente se tenga acceso al dato superior de la
A las pilas se les conoce en la literatura como estructuras LIFO por sus siglas en inglés (Last
In - First Out), que quiere decir, que el último que entro es el primero que sale. De ahí el
consabido dicho de "Los últimos serán los primeros".
Las pilas tienen un campo de aplicación muy grande en los programas, el más común es la
recursividad, aunque tal vez no lo notaron, ya que el compilador lo hace por ustedes, para
poder implementar cualquier rutina recursiva es necesario contar con una pila. En la sección
de ejercicios se revisarán aplicaciones de una pila para implementar recursión y para analizar
una sentencia.
Una buena implementación de pila debe de tomar en cuenta dos puntos. El primero es que
no debe permitir el remover un dato cuando la pila esta vacía, y el segundo es que no debe
permitir que se inserten datos a la pila si esta ya esta llena.
A continuación se muestra la implementación de una pila en C y en Pascal utilizando
memoria estática.
Pascal C
program Pila; #include<stdio.h>;
3.2. COLAS
Las COLAS, al igual que las pilas, son una estructura de datos de acceso restrictivo. Al igual
que en una pila únicamente se cuenta con 2 operaciones, la operación insertar y la
operación remover.
La diferencia entre una cola y una pila es que en la cola (como en una cola para comprar
boletos), el primero que llegó es al primero que se atiende, es decir, una cola tiene un inicio y
un final, los nuevos elementos que llegan se agregan al final de la cola, cuando se remueve
un elemento, se remueve del inicio de la misma.
A las colas se les conoce como estructuras FIFO (First In - First Out), que quiere decir que el
primero que entra, es el primero que sale.
Existe una implementación muy común de la cola que se conoce como cola circular, esta
implementación aprovecha el espacio en memoria de la computadora de la siguiente forma:
inicialmente aparta un espacio para la cola, conforme llegan los elementos los va agregando
al final, cuando remueve un elemento lo hace del inicio de la cola, una vez que ha terminado
con el espacio de memoria que había apartado, revisa si ya se liberó el espacio al inicio de la
Al igual que en la pila, en la cola es muy importante revisar si todavía hay espacio para
seguir guardando elementos, o si la cola esta vacía.
Pascal C
program Cola; #include<stdio.h>;