Vous êtes sur la page 1sur 37

CuadernoTericodeGobstones

Introduccin

EstecuadernocomplementalasactividadesdiseadasenGobstonesconinformacin
terica.Sibienlasactividadesensmismassonimportantes,tambinlosonlas
conclusionesalasquearribamossobrelosconceptosquesevanpresentandoenuncurso.

El objetivo de este documento es sloeldeaproximarunpocodeteoraalasactividades.Si


se desean estudiar estos temas en profundidad, deben tomarse cursos acordes o consultar
bibliografaadecuadaparatalfin.

Temario

Loscontenidossonexplicadosenelordenenquedeseamosseanpresentados.
Programas,valoresycomandos
Procedimientos
Subtareas
Comentariosyprecondiciones
Parametrizacin
Otroejemplodeparametrizacin
Repeticin
Repeticinindexada
Alternativacondicional
Repeticincondicional
Recorridos
Recorridosportodoeltablero
Variables

Programas, valores y comandos


Si bien en Scratch se programa combinando y encajando bloques entre s, actualmente la
mayora de los programadores no define programas deestamanera.Encambio,desarrollan
programas escribiendo texto encierto lenguaje de programacin,tarea que seconocecomo
codificar
. Por ende los programas son definidos como
descripciones ejecutables
.
Descripciones porque loquedefineunprogramaesuntexto,distintoalosqueescribimosen
espaol porque conlleva seguir una serie de reglas estrictas que estn incluidas en el
lenguaje deprogramacin,alaquellamamos
sintaxis
yejecutablesporqueestadescripcin
debepoderserejecutadaporunacomputadora.
En este caso utilizaremos un lenguaje de programacin llamado
Gobstones,
elcualpermite

presentarconceptosbsicosdeprogramacin.
En Gobstones describen
tableros
con celdas que contienen
bolitas de colores
. Adems
todotableroposeeuncabezalapuntandoaunadeterminadaceldadelmismo.

Porotraparte,ellenguajeposee
valores
y
comandos
.Losvalores
sonsimplesdatos
,yen
Gobstones(porahora)disponemosde
colores
,
direcciones
,
nmeros
y
booleanos
.Los
colorespuedenser
Azul
,
Negro
,
Rojo
y
Verde
lasdireccionespuedenser
Norte
,
Sur
,
Este
y
Oeste
losnmerosyalosconocemos(1,54145,23,etc),ylosbooleanossimplementeson
True
(verdadero)y
False
(falso).

Porsuparte,loscomandos,queson
accionesdirigidasalcabezaldeltablero
,consistenen:
Poner
,quetomauncoloryponeunabolitadeesecolorenlaceldaalaqueapunta
elcabezal.
Mover
,quetomaunadireccinymueveelcabezalhaciadichadireccin.
Sacar
, que toma uncolorysacaunabolitadeese colorenlaceldaalaqueapunta
elcabezal.

UnprogramaGobstones
siempre
empiezadelasiguientemanera:

program
{


Las llaves encierran un
bloque de cdigo
, y dentro de todo bloque de cdigo podemos
ejecutarloscomandosantesmencionados.

Para aquellosqueanteriormente usaron Scratch,estasllavessonsimilaresaloshuecosque


poseenalgunosbloques:

EnGobstoneshayreglasquehayquerespetar:
Losnombresdecomandosempiezanconmayscula
Losnombresdevaloresempiezanconmayscula
Losnombresdeprocedimientosempiezanconmayscula
procedureempiezaconminscula
Losbloquesdecdigoquedandefinidosporunallavequeabreyotraquecierra

Para esto programar utilizaremos una herramienta denominada


PyGobstones que
implementa el lenguaje Gobstones. Esta herramientaconsistedeuneditordetextossobreel
que codificaremos y que definirn programas que al ejecutarse mostrarn un tablero final
comoresultado.

El siguiente programa pone una bolita de color rojo en la celda ala que apunta el cabezal
actualmente(quepuedesercualquieraenunprincipio)

program
{
Poner(Rojo)
}

A continuacin vern dos tableros. Uno es el inicial (izquierda) y el otro es el tablero


resultantedeejecutarelprogramasobreeltableroinicial(derecha)

Procedimientos
EnGobstonespodemosaprovecharunconceptoquevimosenScratch:asignarnombresa
secuenciasdecomandos,quedenominamos
procedimientos
.Estoserealizaconlapalabra
procedure
seguidadeunnombreaeleccin,que
debeempezarconmaysculas
.
Porejemplo,podemosdibujaruncuadradocompuestodelneas.Losprocedimientosautilizar
podranser
LneaRoja
y
CuadradoRojo
.
program
{
IrAlOrigen()
CuadradoRojo()
}
procedure
CuadradoRojo
()
{

LineaRoja
()Mover(Norte)

LineaRoja
()Mover(Norte)


LineaRoja
()
}
procedure
LineaRoja
()
{
Poner(Rojo)Mover(Este)
Poner(Rojo)Mover(Este)
Poner(Rojo)
Mover(Oeste)Mover(Oeste)
//retornamosalaposicininicialdelalinea
}

Elresultadoes:

Subtareas
Estaideadesepararelproblemaendistintosprocedimientosseconocecomo
divisinen
subtareas
.Laideaesque
CuadradoRojo
utilice
LneaRoja
ensudefinicin,loquehacequeel
cdigoseamsfcildeescribirydeentender.Si,porejemplo,luegosepidemodificarellargo

delafigura,slodebemosaadiruna
LineaRoja
msdentrodelbloquedecdigode
CuadradoRojo
.Si,porelcontrario,queremosmodificarelancho,modificamos
LineaRoja
para
quedibujeunabolitams.
Porotraparte,esimportantedefinirbuenosnombresdeprocedimientos,loquepermiteintuirsin
mirarelcdigoquesloquehaceelprograma,slobasndonosenlosnombresdelos
procedimientosycmoserelacionanentres.

Comentarios y precondiciones
Ademspodemosagregarcomentariosenelcdigo,simplementeagregandodosbarras(//)
seguidasdetextoenidiomacotidiano.Loscomentariossonsimplementetextoquenoser
ejecutadoperoquepermitenalprogramadorentenderquhaceelprogramaoqucosasdebe
tenerencuentaelleerlooutilizarlo.
Loscomentariossontambintilesparadefinirlas
precondiciones
deunprocedimiento,que
sonaquelloquerequiereelprocedimientoparaejecutarsecorrectamente.Enestecasola
precondicinsera:
//Precondicin:elcuadradonecesitaunespaciode3x3parapoderserdibujado.
AscomosucedeenScratch,ciertoscomandosrequierenciertascondicionesparanofallar,yen
estecaso,elcomandoMover,requierequehayaunaceldahacialadireccinenlaquese
desplazaelcabezal.Siestaceldanoexiste,elprogramaterminardeformaabrupta.Otro
comandoquepuedefallaresSacar,sinohaybolitasdelcolorasacarenlaceldaactual.

Parametrizacin
Unaactividadquepodemosrealizarsobreelcuadradoanteriorescambiarel
color
conelquese
dibuja,de
Rojo
a
Verde
.Loqueharemosserbuscarcadacomando
Poner
quehabaylo
modificaremosparaquepongaunabolitadelnuevocolor.Tambinmodificaremoslosnombres
deprocedimientosparaquereflejenestecambiodecolor:
procedureLineaVerde()
{
Poner(
Verde
)Mover(Este)
//AntesdecaPoner(
Rojo
)
Poner(
Verde
)Mover(Este)
Poner(
Verde
)
Mover(Oeste)Mover(Oeste)//retornamosalaposicininicialdelalinea

procedureCuadradoVerde()
{
LineaVerde()Mover(Norte)
LineaVerde()Mover(Norte)
LineaVerde()
}
Sinuevamentepedimosquevuelvanacambiarelcolorporotrodelosexistentesharnlo
mismo:buscardndefiguraelcoloractualparacambiarloporotrocolor,siempremodificandoel
cdigodelosprocedimientos.
Noobstante,noesprcticoandarmodificandoelprocedimientoparaelegirdequcolor
deseamospintaruncuadrado.Deestamanera,existeunmecanismomuchomejorparahacer
esto,quepermiteseleccionarundeterminadovaloralmomentodeinvocarunprocedimiento.
Estoposibilitacomousuariosdelprocedimientoelegirelcoloradibujaralmomentodeutilizarlo.
Deestamanera,podramosescribirloscuatrocuadradosdecadacolorposiblecomo:
program
{
IrAlOrigen()Cuadrado(
Rojo
)
IrAlOrigen()Cuadrado(
Azul
)
IrAlOrigen()Cuadrado(
Verde
)
IrAlOrigen()Cuadrado(
Negro
)
}


Estaesunatcnicayautilizadaconloscomandos
Poner
,
Mover
y
Sacar
,esdecir,indicamos
conquvalordeseamosquetrabajaralinvocarelprocedimiento.Alquebrindabamosal
momentodeutilizaralprocedimientolollamaremos
parmetro
,yparaqueelprocedimiento
puedautilizarlodebemosmodificarlosiguiente:
procedureCuadrado(
colorDeCuadrado
)
{

}
procedureLinea(
colorDeLinea
)
{

}
Comopuedeobservarse,aadimosun
nombreconmnusculas
(
aeleccin
)entrelosparntesis
acontinuacindelosprocedimientosquedebenelegirelcoloradibujar.ComoCuadradoutiliza
Linea,esteltimotambinnecesitardefinirestecolorarbitrario.Elnombrequeinventamos,al
invocarelprocedimiento,esreemplazadoentodassusaparicionesporunvalorconcreto(
Rojo,
Verde,AzuloNegro
),peronospermitemientrastanto,utilizarloparaocuparellugardeaquellos
valoresconcretos,aunquenosepamosculserelegidotodava.Alaaccindeaadirun
parmetroalprocedimientoparareemplazarunvalorconcretodentrodeste,la
denominaremos
parametrizar
.
Elejemplocompletode
Cuadrado
parametrizandoestevalores:

program
{
IrAlOrigen()Cuadrado(
Azul
)
IrAlOrigen()Cuadrado(
Rojo
)
IrAlOrigen()Cuadrado(
Negro
)
IrAlOrigen()Cuadrado(
Verde
)
}

procedureCuadrado(
colorDeCuadrado
)
{
Linea(
colorDeCuadrado
)Mover(Norte)
Linea(
colorDeCuadrado
)Mover(Norte)
Linea(
colorDeCuadrado
)
}
procedureLinea(
colorDeLinea
)
{
Poner(
colorDeLinea
)Mover(Este)
Poner(
colorDeLinea
)Mover(Este)
Poner(
colorDeLinea
)
Mover(Oeste)Mover(Oeste)//retornamosalaposicininicialdelalinea
}
Esstilperointeresante
noutilizarexactamenteelmismonombre
paralosparmetrosdeambos
procedimientos.Paraelprocedimiento
Cuadrado
elparmetrosellama"
colorDeCuadrado
"y
para
Linea
elparmetrosellama"
colorDeLinea
".Conestoquedaenevidenciaquecadauno
defineelnombredelparmetroparasmismo,yquecadaunoutilizaestenombredentrodel
bloquedecdigoquelodefine(dehecho,noesposibleutilizarunnombredeparmetrofuera
delbloquedecdigodelprocedimiento).Estoseconocecomo"scoping"o
alcncedel

parmetro
.
Siestetemanoquedaclaro,operacionalmenteelpasajedeunparmetrofuncionadela
siguientemanera.En
program
indicbamoscomousuariosdequcolorqueremoselcuadrado
program
{
IrAlOrigen()
Cuadrado(
Rojo
)
}
Conescribir
Cuadrado(Rojo)
,leindicamosalprocedimiento
Cuadrado
queelparmetrocon
nombre"
color
"esiguala
Rojo
,porloquecadaaparicindeestapalabrasereemplazaporel
colorconcreto(enestecaso
Rojo
).Podemospensarendostiposdeprocedimientos,uno
general,antesdesaberdequcolorvamosadibujar,yunoparticular,cuandoyaseleccionamos
dichocolor.Alescribir
Cuadrado(Rojo)
,transformamosalprocedimientogeneralenuno
particular.
Elprocedimientogeneralsera:
procedureCuadrado(
colorDeCuadrado
)
{
Linea(
colorDeCuadrado
)Mover(Norte)
Linea(
colorDeCuadrado
)Mover(Norte)
Linea(
colorDeCuadrado
)
}
quenoindica(todava)conqucolorparticularsedibujarelcuadrado,yelprocedimiento
particular(cuandoyasesabeelcolor)seraalgocomo:
procedureCuadrado(
Rojo
)//estoessloconfinesilustrativos,noesunprogramavlido
{
Linea(
Rojo
)Mover(Norte)
Linea(
Rojo
)Mover(Norte)

Linea(
Rojo
)
}
Eslamismatareaquerealizbamosamano,peroestavezhechademaneraautomticaporel
lenguaje.
Asuvez
Linea
tambinrecibeelvalorconcreto,porloqueelprocedimientogeneralde
Linea
sera
:
procedureLinea(
colorDeLinea
)
{
Poner(
colorDeLinea
)Mover(Este)
Poner(
colorDeLinea
)Mover(Este)
Poner(
colorDeLinea
)
Mover(Oeste)Mover(Oeste)//retornamosalaposicininicialdelalinea
}
Yluegodeaplicarelcolorconcretosetransformaen:
procedureLinea(
Rojo
)
{
Poner(
Rojo
)Mover(Este)
Poner(
Rojo
)Mover(Este)
Poner(
Rojo
)
Mover(Oeste)Mover(Oeste)//retornamosalaposicininicialdelalinea
}
Lomismosucederconcadacolorqueelijamosparadibujarelcuadrado.

Otro ejemplo de parametrizacin


Definamosunprocedimientoms,queserunavariacindedibujaruncuadrado.Dibujaremos
enestecasosloelpermetrodelcuadrado(sinlaparteinternapintada).Haremosquesea
ademsdecolorRojo.Elresultadosera:

Antesdeempezaracodificarsinpensar,debemosrazonarlassubtareasqueutilizaramos:
program
{
PerimetroCuadrado()
}

procedure
PerimetroCuadrado()
{}
procedure
LineaArriba()
{}
procedure
LineaAbajo()
{}
procedure
LineaIzquierda()
{}

procedure
LineaDerecha()
{}

detalformaquePerimetroCuadradoquedabadefinidocomo
procedurePerimetroCuadrado()
{
LineaArriba()
LineaDerecha()
LineaAbajo()
LineaIzquierda()
}

Asuvezlasdistintassubtareasparalineasquedandefinidascomo
procedureLineaArriba()
{
Poner(Rojo)
Mover(
Norte
)
Poner(Rojo)
Mover(
Norte
)
Poner(Rojo)
Mover(
Norte
)
}
procedureLineaAbajo()
{
Poner(Rojo)

Mover(
Sur
)
Poner(Rojo)
Mover(
Sur
)
Poner(Rojo)
Mover(
Sur
)
}
procedureLineaDerecha()
{
Poner(Rojo)
Mover(
Este
)
Poner(Rojo)
Mover(
Este
)
Poner(Rojo)
Mover(
Este
)
}
procedureLineaIzquierda()
{
Poner(Rojo)
Mover(
Oeste
)
Poner(Rojo)
Mover(
Oeste
)
Poner(Rojo)
Mover(
Oeste
)
}
Comopodemosobservar,loscuatroprocedimientossonequivalentesentodomenosenla

direccinconcretahacialaquesemuevenparapintar.
Parareducirtantocdigosimilar,podemosparametrizarladireccinhaciadondesedibujar
cadalnea,detalmaneraquepasamosatenerunsloprocedimiento:
procedureLineaHacia(
dir
)
{
Poner(Rojo)
Mover(
dir
)
Poner(Rojo)
Mover(
dir
)
Poner(Rojo)
Mover(
dir
)
}

PorloquePerimetroCuadradosertansimplecomo:
procedurePerimetroCuadrado()
{
LineaHacia(
Norte
)
LineaHacia(
Este
)
LineaHacia(
Sur
)
LineaHacia(
Oeste
)
}
Iremoseligiendovaloresconcretos
almomentodeutilizarelprocedimiento
,yen
LineaHacia
utilizamosunnombreparadesignarqueelvalorserreemplazadoluegoporalgoconcreto,el
cualllamamos
dir
(pordireccin)
Perosiahoratambinqueremosparametrizarelcolor?Estanfcilcomoagregarotronombre
deparmetroms,juntoa"
dir
",separadoporunacoma.

procedureLineaHacia(dir,
color
)
{
Poner(
color
)
Mover(dir)
Poner(
color
)
Mover(dir)
Poner(
color
)
Mover(dir)
}

YtambinmodificamosPerimetroCuadrado:
procedurePerimetroCuadrado(
color
)
{
LineaHacia(Norte,
color
)
LineaHacia(Este,
color
)
LineaHacia(Sur,
color
)
LineaHacia(Oeste,
color
)
}
Enestecaso
PerimetroCuadrado
utiliza
LineaHacia
primeropasndoleunadireccinconcreta
(Norte,Este,SuryOeste)perotambinpasndoleelparmetroquerecibe,denominado"color".
LineaHacia
esunprocedimientototalmentegeneral,trabajaconunadireccinyuncolorque
todavanosabeculessonysueleccinquedaagustodelusuarioqueutiliceelprocedimiento.
Porsuparte,
program
quedadefinidocomo:
program
{
PerimetroCuadrado(
Rojo
)

Repeticin
Veamos otro caso totalmente distinto. Definamos un procedimiento simple pero tedioso, que
consista en colocar 300 bolitas de algn color. Lo llamaremos Poner300(). Para simplificarlo
crearemos dos subtareas Poner10 y Poner100. De estamaneraPoner300esPoner1003veces
yPoner100es10vecesPoner10:
procedurePoner10()
{
Poner(Rojo)Poner(Rojo)Poner(Rojo)Poner(Rojo)Poner(Rojo)
Poner(Rojo)Poner(Rojo)Poner(Rojo)Poner(Rojo)Poner(Rojo)
}
procedurePoner100()
{
Poner10()Poner10()Poner10()Poner10()Poner10()
Poner10()Poner10()Poner10()Poner10()Poner10()
}
procedurePoner300()
{
Poner100()Poner100()Poner100()
}
Pero qu sucede si ahora quisiramos poner 1000 bolitas, 512 bolitas, 215 bolitas, etc. El
programa se torna difcil de modificar, pese a que la tarea de poner una cantidad arbitraria de
bolitasdeberasertrivial.
En programacin solemos utilizar constantemente el concepto de
repeticin
, para ejecutar una
cantidadarbitrariadevecesciertatarea.Gobstonesposeeunaconstruccinllamada
repeat
,que
permite repetir una tarea dependiendo de un rango de valores. Adems permite utilizar cada
elementodelrangoparahaceralgo.

Enestecasoponer300bolitasrojasseraalgotansimplecomo
repeat(300)
{
Poner(Rojo)
}
Lapartequeindica"300"representaeslacantidaddevecesquequeremosrepetirunatarea.
Ahora pensemos un procedimiento que aprovecha el poder de la repeticin colocando una
cantidad de bolitas a eleccin del usuario. Nuestros procedimientos concretos que ponan una
cantidad fija de bolitas se llamaran Poner300, Poner100, Poner10, etc., y ahora necesitamos
algo como PonerLasQueQueramos(cantidad, color) o PonerX(cantidad, color). Con la X
queremos significar nmero arbitrario, as comoantesponamoscomopartedelnombredelos
procedimientos un nmero concreto (300, 200, 100, 10, etc.).Ahoraindicamos con una Xque
elnmeropuedesercualquieraqueelijamos.Estoessimplementeunaconvencin.
El procedimiento que definamos deber tomar un nmero y uncolor, y pondr ese nmero de
bolitas del color dado. Una posible definicin de
program que utiliza este procedimiento puede
ser:
program
{
PonerX(10,Rojo)//pone10bolitasrojas
PonerX(25,Negro)//pone25bolitasnegras
PonerX(5,Verde)//pone5bolitasverdes
}

Como podemos ver, el comportamiento del procedimiento vara cuando le pasamosparmetros


distintos. El primer parmetro indicar lacantidad de bolitas a poner yel segundo de qu color
queremos a estas bolitas. En la definicin de PonerX debemos utilizar estos parmetros para
reflejarestecomportamientovariable:
procedurePonerX(cantidad,color)
{
//cdigoqueutilizacantidadycolor

}
Lo primero que podemos imaginar es que debemos utilizar el comando Poner junto con el
parmetrocolorparacolocarbolitasdeesecolorquenospasanporparmetro:
procedurePonerX(cantidad,
color
)
{

Poner(
color
)
...
}
Esto coloca sloslo
una
bolitadelcolordado.Loquequeremosesutilizarelnmerocantidad
para ejectuar exactamente ese nmero de veces el comando Poner. Aqu es donde entra en
juegolarepeticin.
procedurePonerX(
cantidad
,color)
{
repeat(
cantidad
)
{Poner(color)}
}
Como podemos ver, utilizamoselparmetrocantidadjuntoconel
repeat
,enlugarderepetirun
nmero concreto de veces. Si cantidad fuese 300, entonces Poner(color) se repetir 300
veces, pero en principio, dentro de la definicin dePonerX,lacantidaddevecesarepetirpuede
sercualquiera,siendoelusuarioquieneligecuntasexactamente.
De la misma manera nos podemos imaginar la implementacin de SacarX(cantidad, color), que
toma un nmero y un color y saca esa cantidad de bolitas del color dado, y MoverX(cantidad,
direccion), que se mueve la cantidad dada por parmetro deveces haciala direccin dada por
parmetro:
procedureSacarX(
cantidad
,color)
{
repeat(
cantidad
)

{Sacar(color)}
}
procedureMoverX(
cantidad
,dir)
{
repeat(
cantidad
)
{Mover(dir)}
}

Repeticin indexada
Existe otro tipo derepeticin, denominada
repeticin indexada
.
Enlugar deutilizar un nmero
para repetir tareas una cantidad determinada de veces, esta repeticin recorre una lista de
valores que sern utilizados en una tarea que hace uso de estos(generalmente se pasan por
parmetro).
Un ejemplo sencillo es el de poner una bolita de todos los colores posibles. Bien podramos
hacerlosiguiente:
procedurePonerUnaDeCadaColor()
{
Poner(Azul)Poner(Negro)Poner(Rojo)Poner(Verde)
}
Peroutilizandounarepeticinindexada,estoseresuelvetansimplecomo:
procedurePonerUnaDeCadaColor()
{
foreach
color
in[minColor()..maxColor()]
{Poner(
color
)}
}
En Gobstones, la repeticin indexada se denomina
foreach
. Es similar al
repeat
, dado que
utilizaunbloquedecdigoparadefinirlatareaquevaarepetirse,peroposeemselementos:

Lapartequedice"color"esun
ndice
,esdecir,eselnombre que representaacadavalor
de la lista para poderutilizarlodentro.Estenombreestotalmenteinventadopornosotros,
y bienpodraserotro.Elndicedelforeachnopuedeserutilizadoenotroladoqueno sea
elbloquedefinidoparaestaconstruccin.
La parte que encerrada entre corchetes representa la lista con los valores a recorrer.
Como queremos arrancar desde el primer color hasta el ltimo, utilizamos las
expresiones
minColor() (que representa el Azul) y
maxColor()
(que representa el
Verde), situadas entre
..
(dos puntos), para que se completen de forma automtica los
elementos que hay entre medio de los dos extremos. Los colores estn ordenados
alfabticamente, por lo que la lista resultanteseridnticaa
[Azul,Negro,Rojo,Verde]
,
pero la forma en la que construimos la lista (como un rango delmnimo almximovalor)
nosfacilitanotenerqueescribirlostodos.
Operacionalmente, el
foreach pasar por cada elemento de lalista, y repetir la tarea por cada
cada elemento por los que pasa. En cada momento, elndiceapuntaraunelementodistinto,y
pasar por el primer valor de la lista, hasta el ltimo. En el ejemplo anterior, el ndice color,
empiezavaliendoAzul,luegopasaavalerNegro,prosigueconRojoyterminasiendoVerde.

Otroejemplosencilloesunoqueutilicetodaslasdirecciones:
procedurePonerUnaEnCadaDireccion(color)
{
foreach
dir
in[minDir()..maxDir()]
{Mover(
dir
)Poner(color)Mover(
opuesto(dir)
)}
}
Para construir una lista con todas las direcciones utilizamos
minDir() y
maxDir()
. La primera
direccin es Norte, ylaltimaesOeste.Lasdireccionesestnordenadasensentidohorario,por
lo que la lista resultante de[minDir()..maxDir()]terminasiendo[Norte,Este,Sur,Oeste].Elndice
en esta ocasin lo nombramoscomo
dir
. Lo que hacemos como tarea es movernoshaciacada
direccin de la lista, ponemos una bolita de un color que recibimos porparmetro, y volvemos
sobreelopuestodeesamismadireccin.
La expresin
opuesto toma una direccin y devuelve la direccin contraria aesta.Porejemplo,
opuesto(Norte) es igual aescribirSur,y
opuesto(Oeste)eslomismoqueEste.Utilizamosesta
expresin, porque nosabemos de qudireccinestamoshablandoencadamomento(sabemos
que va a ser alguna de la lista, pero no cul exactamente). Pero s sabemos que es una
direccin,ycomocontodadireccin,podemosaveriguarsuopuesto.Estonospermiteiryvolver

paracualquierdireccindelaqueestemoshablando.
Un
program
construidoconesteprocedimientoqueacabamosdedefinirpodraser:
program
{
IrAlOrigen()Mover(Norte)Mover(Este)
PonerUnaEnCadaDireccion(Azul)
}

Los dos ejemplos mencionados, que utilizan colores ydirecciones,alsercuatrovaloresdecada


tipo, no demoraramos mucho en enumerarlos todos amanosiquisiramos.Peroqusucedesi
queremosrecorrerunalistadenmeros,del1al10,pararealizarunatarea.Aqueltrabajosera
mspesado.
Unejemplocomoelanteriorpuedeserelsiguiente:
procedurePonerX(
cantidad
,color)
{
repeat(
cantidad
)

{Poner(color)}
}
procedureProgresionVerde(
longitud
)
{
foreach
numero
in[1..
longitud
]
{PonerX(
numero
,Verde)Mover(Este)}
}
program
{
IrAlOrigen()
ProgresionVerde(10)
}

PonerX, es un procedimiento definido enelapartadode


Repeticin
.Elprocedimientoaobservar
es
ProgresionVerde
, al que le pasamos un nmero y construye una sucesin de distintas
cantidades de bolitas verdes, empezando por el 1 hasta el nmero que hayamos indicado. En
este programa utilizamos ProgresionVerde(10), por lo que la sucesin se detiene en 10 bolitas
verdes.
Funciona de la siguiente manera. El parmetro es utilizado para formar la lista que se va a
recorrer [1 ..
longitud
]. Al ndice lo nombramos
numero
, dadoque cada elemento va a ser un
nmerode allista.ElndiceespasadoaPonerX,junto conelcolorVerde,paraquecadavez,se
coloquen
numero
bolitas verdes, es decir, que vayan colocando bolitas verdes usando cada

nmero que haya en la lista. En cada momento el cabezal es movido al Este, para que las
bolitas se coloquen en distintas celdas, pero contiguas. El resultado de todo esto es el
observadoenlaimagen.

Funciones
Hasta el momentodefinimosnuestrospropiosprocedimientos,querepresentantareasaejecutar
sobre el tablero. Los procedimientos se componen de comandos, que son ordenados de forma
secuencial enun bloque de cdigo. En sntesis, la herramienta llamadaprocedimientopermite
asignarleunnombreaunatarea.
Anteriormente vimos algo llamado expresiones, que son elementosquedescribenvalores.Por
ejemplo, la expresin 3+1 describe el valor 4 yla expresin opuesto(Norte) describe el valor
Sur. Ms an, opuesto(Norte) es equivalente a Sur, y son intercambiables justamente por
denotar el mismo valor. En este ejemplo opuesto representa una expresin que, al recibir una
direccin, equivale a la direccin opuesta a esta. Si recibe Norte sera equivalente a Sur, si
recibe Oeste sera equivalente a Este, y as con cada direccin. Esta operacin ya existe en
Gobstones, al igual que existe la suma, la multiplicacin y la restaentrenmeros.Sinembargo,
estaexpresinoperasobrecolores,adiferenciadeestasltimasquetrabajanconnmeros.
Tambin existen expresiones que no reciben ningn valor y directamente equivalen a uno. Por
ejemplo, minColor() equivale a Azul. Con esto queremos decir que es lo mismo poner
minColor() que Azul en unprograma. Pero lo que sucede es quea vecesconvieneunaforma u
otra de describir lo mismo. Si en el futuro el primer color no fuese Azul sino, por ejemplo,
amarillo, minColor() pasara adescribiramarillo,porquesufuncinesdescribirel primercolorde
los existentes en Gobstones. Si por el contrario ponemos Azulenunlugarendondeenrealidad
queremos el primer color existente y en el futuro cambian los colores, nuestro programa
quedara desactualizado ante la nueva versin de Gobstones (cosa que pasa en muchos
programasdondeestosetomaalaligera).
Por lo que podemos observar, las expresiones serelacionanconvalores,puedenrecibirvalores
por parmetro y equivalen a otros valores, y se diferencian de loscomandos y procedimientos,
que representan tareas o acciones, dado quelosvaloresnohacenalgo,sinoquesimplemente
son datos. De la misma manera, las expresiones no son comandos, ya que no describen
acciones sino que describen valores. La expresin 3+1 no es la accin de sumar 3 a 1 sino
que simplemente describe 4 al igual que2+2describe4.Porejemplo,decirrepeatWithi in1..
2+2 es equivalente a decir repeatWith iin4.Yestoesloquenosinteresarcuandohablemos
deexpresiones:quvalordescribenenltimainstancia.
La nueva herramienta que veremos en esta clase sirve para ponerle un nombre a una
expresin. As como antes, de manera opuesta, asignbamos nombres a tareas a travs de
procedimientos, ahora asignaremos nombres a expresiones con una herramienta llamada

funcin
.Unejemplofcileselsiguiente:
functionigualA4()
{
return(2+2)
}
Esta funcin simplemente equivale a la expresin 2+2. Es decir, si en un programa
encontramos escrito igualA4(), la invocacin a esta funcin equivaldr a encontrar 2+2. Este
simpleejemplonossirveparadistinguiralgunascosasimportantes:
As como antes escribamos
procedure <nombre del procedimiento> ahora escribimos

function
<nombredelafuncin>.
El nombre de una funcin empieza en
minscula
, contrariamente al de los
procedimientos,queempiezaenmayscula.
Existe una palabra llamada
return que significa esta funcin equivale a la siguiente
expresin. Vienedelingls devolver o retornar, yestoesasporquetradicionalmente
se dice que la funcin devuelve o retorna, en este caso, 2+2. Peroenlugardedecir
devolvertambinpodemosdecirdescribeoequivalealasiguienteexpresin.
Laexpresinjuntoalreturnvaentreparntesis.
La palabra return porahora ser la nica que encontraremos dentro del bloque decdigoque
definealafuncin.
UnejemplountantomsinteresanteeslafuncinsumarUno:
functionsumarUno(x)
{
return(x+1)
}
Podemosverenestecasoquelasfuncionestambinpuedendefinirparmetros.Enestecasola
invocacin sumarUno(2) describir al nmero 3, y la invocacin sumarUno(5) describir el
nmero 6. Esto es as porque el parmetro recibido se utiliza en la expresin x+1, que
describirdistintosvaloresconformevareelvalordelparmetro.
Por ltimo las funciones tambin pueden llevar una parte de procesamiento, antesdereturn.
La palabra return siempre debeser la ltima en dentro del bloque de cdigo que define a una
funcin. Por procesamiento entendemos que
podemos ejecutar comandos (yprocedimientos)

dentrodeestebloquedecdigo.
Por ejemplo, la siguiente funcin devuelve el nmero de bolitas rojas de la celda lindante al
Norte:
functionnroDeBolitasRojasAlNorte()
{
Mover(Norte)
return(nroBolitas(Rojo))
}
Los comandos y procedimientos ejecutados antes del return, afectarn lo que describa la
expresin finalquedescribe la funcin. En este caso la expresinnroBolitas(Rojo),describeel
nmero de bolitas de la celda en la que est posicionado el cabezal. Como primero nos
movemos alNorte, describirlacantidaddebolitasrojas que hayunaceldahaciaelNortedesde
donde est posicionado el cabezal al momento de ejecutar la funcin. Si no hay una celda al
Norte,lafuncinfallaraligualqueunprocedimiento.
La mayor diferencia entre procedimientos y funciones con procedimiento, adems de que los
procedimientos no devuelven ningn valor, es que luego del return de la funcin todos los
efectos generados dentro de la funcin desaparecern. En el casoanterior,elcabezalvolvera
su posicin original (la posicin que tena antes de ejecutar la funcin). Esto significa que lo
procesado dentro de una funcin no genera un efecto final, dado que esa es la tarea de los
procedimientos y no el de las funciones. Lo procesado dentro de una funcin slo modifica el
contexto dentro de esa funcin, pero luego de retornar la expresin deseada (objetivo de las
funciones), los efectos internos generados son descartados (se reintegra el estado inicial antes
deejecutarlafuncin).
Parailustrarmejoresteefecto,podemospensarenelsiguienteprocedimiento:
procedurePonerTantasAzulesComoRojasHayaAlNorte()
{
PonerX(nroDeBolitasRojasAlNorte(),Azul)
}
Analicemos qu valores pasamos como argumentos de PonerX. Por un lado (segundo
parmetro) indicamos con el valor Azul el color de las bolitas a poner y por otro lado (primer
parmetro) indicamos que queremos poner exactamente la cantidad de bolitas que haya en la
celdaalNortedelaactual.

Con el siguiente estado inicial, deberamos estar poniendo 10 bolitas de color Azul en la celda
actual,copiadasdelacantidaddebolitasrojas,alNortedeestacelda:

AntesdeejecutarelprogramaDespusdeejecutarelprograma
La cantidad de bolitas rojas al Norte de la celda actuales dada por la invocacin de la funcin
nroDeBolitasRojasAlNorte(), que simplemente equivale a dicho nmero. As como podramos
haber escrito PonerX(
10
, Azul) para poner 10 bolitas azules, ahora escribimos
PonerX(
nroDeBolitasRojasAlNorte()
, Azul) para poner exactamente tantas bolitas azules
comoelnmerodebolitasrojashayaalNorte.
Recordamosladefinicindeestafuncin:
functionnroDeBolitasRojasAlNorte()
{
Mover(Norte)
return(nroBolitas(Rojo))
}
En ninguna parte delasecuenciavolvemosalSur.Estonoesnecesarioyaqueelmovimientoal
Norte ser eliminado luego deretornarelnmero debolitas rojas.Esaquentoncesdonde seve
que la funcin nroDeBolitasRojasAlNorte no gener efectos finales sobre el tablero sobre el
que trabaja PonerX. Si bien la funcinnroDeBolitasRojasAlNortedebemoversealNortepara
devolver la cantidad de bolitas rojas de esa celda, ese movimiento no cuenta al terminar de
devolver el valor deseado.Simplemente el cabezal sigue en la misma posicin sobre la cualse
comenz a ejectuarel procedimiento PonerTantasRojasComoHayaAlNorte, porlo que PonerX
colocarlasbolitassobrelaceldaactual.

Alternativa condicional
En Gobstonestambindisponemosdeloque seconocecomo
alternativacondicional
,unaforma
de condicionar la ejecucin de una tarea en base al valor de una expresin booleana. Por
ejemplo:


if
(puedeMover(Norte))
{
Mover(Norte)
}
La funcin
puedeMover es algo existente en Gobstones. Cuando recibe una direccin indica si
hay una celda en esa direccin.Enestecaso sialNortenohaymsespacio(elcabezalesten
el borde Norte del tablero), entonces devolver False (falso), caso contrario devolver True
(verdadero). Combinando esta expresin con la alternativa condicional, si el valor de la
expresin que toma entreparntesis es verdadera, entonces ejecutala tarea que se encuentra
entre las llaves (el bloque de cdigo). Si la expresin es falsa, entonces no ejecuta nada. Esto
sirve para aquellos casos en donde queremos comprobar el estado de una situacin antes de
ejecutarunatarea.
Otro caso en donde se utiliza una alternativa, es cuando queremos ejecutar una tarea si una
expresin es verdadera,y otra tarea en caso deserfalsa.Porejemplo,imaginemosunafuncin
que dada una direccin marca con una bolita roja la celda en caso de estar en el borde
pertenecienteaesadireccin,yconunabolitaazulencasodenoestareneseborde:
procedureMarcarBorde(dir)
{

if
(notpuedeMover(dir))
{Poner(Rojo)}

else
{Poner(Azul}
}
La forma de decir sino se cumple ejecutar esta otra tarea es
else
, a continuacin del primer
bloquedecdigodelaalternativacondicional.
Las alternativas condicionales tambin sirven para chequear que cierta condicin se cumpla
antesdeejecutaruncomandoparcial:
procedureMoverSiSePuede(dir)
{


if(puedeMover(dir))
{Mover(dir)}
}
Este procedimiento funcionar correctamente en todos los casos, dado queantesdeejecutarel
movimiento, verifica si es posiblehacerlo. Sin embargo, esto no significa que debamossiempre
chequear estas condiciones, dado que podemos estar modificando el significado de lo que
queremos hacer en situaciones en las queno lodeseamos.Porejemplo,siqueremosmovernos
10vecesalNorte,simplementepodemoshacer:
repeatWithiin1..10{Mover(Norte)}
Estatareafallaralnotenersuficienteespacio,ynosecomportarigualqueestaotra:
repeatWithiin1..10{MoverSiSePuede(Norte)}
El problema deesta ltima tarea es que si no hay suficiente espacio, se mover las veces que
pueda. Si nuestra intencin es movernos exactamente 10 veces, esto no ser lo mismo que
movernos 4, 6 u 8 veces. La tarea igualmente no se estara cumpliendo, verifiquemos o no en
cada movimiento si nos vamos a caer del tablero, y probablemente sea preferible que
directamente no se realice,a que se realice parcialmente. Si bien depende de loque queramos
modelar,hayquetenerestosdetallesencuenta.
Otra pregunta til en Gobstones es
hayBolitas,
que toma un colory responde si hay bolitas de
ese color en la celda actual. Para qu sirve? Podemos asociarla al comando
Sacar
. Para el
comando
Sacar la precondicin que debe cumplir es que haya bolitas del color a sacar. Si
queremos escribir un programa que exprese la idea de sacar de un colorslo en el caso que
haya bolitas deese color, entonces necesitamos esta nueva herramienta para preguntar antes
sihayonobolitas,yencasoafirmativosacar,ysinonohacernada:
procedureSacarSIHay(color)
{
if(hayBolitas(color))
{Sacar(color)}
}

Repeticin condicional
Otra herramienta interesante sera aquellaquepermita
repetirunaaccinMIENTRASsecumpla

una condicin
. Observenque hasta el momento slo podamos repetir un nmero
fijo de veces
una determinada tarea(o utilizar cada elemento de una lista bien definida, que es similar),pero
nopodamosresolverproblemasenlosquenosesabe
cuntohayquerepetirlatarea
.
Por ejemplo, deseamos definir un procedimiento que mueve el cabezal hacia el Norte
mientras
no haya una bolita de color Negro. El cabezal puede encontrarse en cualquierpartedeltablero,
al igual que las bolitas negras. Queremos detenernos ante la presencia de alguna, pero no
sabemoscuntadistanciadebemosrecorrerhastaterminar.Nopodemosresolveresteproblema
conun
repeat
,porloqueprecisamosunanuevaconstruccinexistenteenGobstones:
while
(nothayBolitas(Negro))
{
Mover(Norte)
}
La construccin
while al igualque
if
,recibeunaexpresinquepuedeserverdaderao falsa(una
condicin o pregunta) y un bloque de cdigo que ser la tarea aejecutar.Enestecaso, cuando
la condicin sea falsa, la tarea se dejar de ejecutar, pero MIENTRAS esa condicin sea
verdadera se seguirejecutando. En otraspalabras, mientrasNOhayabolitasdecolornegro,el
cabezal se moveral Norte, ycuandoexistaunaceldaen laquehayaunabolitadecolornegro,
latareasedejardeejecutar.
Un problema tpico que es posible resolver con un
while
, pero no con lo que vimos hasta el
momento, consta de ir hacia alguno de los bordes del tablero. Si no sabemos dnde se
encuentra el cabezal ni el tamao del tablero en donde ejecutamos nuestro programa, no
podemos saber cunto deberamos movernos hasta alcanzar cualquiera de los bordes. Pero
utilizando un
while
, podemos movernos
MIENTRAS podamos movernos hacia una determinada
direccin.Cuandonopodamosmovernosms,significarquealcanzamosunbordedeltablero.
procedureIrAlBorde(dir)
{
while(puedeMover(dir))
{Mover(dir)}
}
Un problema que se introduce con el uso de esta construccin es la posibilidad de que un
programa no termine. Cmo es posibleesto? Si la condicin del
while nunca llega a serfalsa,
jamsterminardeejecutarunatarea.Elsiguienteejemplopuedenoterminar:

while(hayBolitas(Negro))
{Poner(Verde)}
Si existen bolitas negras en la celda actual, se seguirn poniendobolitas verdes,ynohay nada
quesealcanceelcasocontrario.Elprogramaefectivamentenoterminarnunca.
Por esta razn, cuandoutilizamos un
while
, debemos pensar si la tareaquedefinimosharque
la condicin en algn momento pase a ser falsa, dado que si esto no sucede, la tarea, como
acabamosdever,noterminardeejecutarsejams.

Recorridos
La idea de repetir una tarea a travs de una condicin nos permite pensar en la idea de
recorrido. Un recorrido es una tarea que consiste en ir pasando por una serie de elementos,
desde el primero hasta el ltimo, sin importar CUANTOS sean. La idea de recorrido la hemos
utilizado juntocon la repeticin indexada para recorrer valores deunalista,peroestavezloque
recorreremossernceldasdeltablero.
Unejemplopuedesereldepintartodaunacolumnadenegro:
procedurePintarColumnaDeNegro()
{
IrAlBorde(Sur)//Voyalbordesurdelacolumna
Poner(Negro)//Pintolaprimeracolumnadenegro
while(puedeMover(Norte))//mientraspuedamovermealnorte
{

Mover(Norte)//pasoalasiguientecelda

Poner(Negro)//pintolacelda

}
}

Todorecorridosobreeltablerosigueelsiguienteesquema:
procedureUnRecorrido()
{
EmpezarRecorrido()
PrimerPasoDeLaTarea()
while(puedoContinuarRecorrido())
{
PasarAlSiguienteElemento()
RealizarTarea()
}
}
Este procedimiento no est bien definido porque esassubtareas no existen, perorepresentaun
recorrido tpico en Gobstones. Lo nico que tenemos que hacer para implementar recorridos
concretos es pensar cmo cambiar esas subtareas por otras que tengan sentido para el
problema que se desea resolver. Para el caso de pintar toda la columnacon bolitas negras, el
recorrido empieza con IrAlOrigen(), sigue con Poner(Negro) para pintar ya la primer celda, y

contina pintando (procesando la celda actual) y movindose (pasando a la siguiente celda)


mientrashayaceldasalnorte(mientrasseaposiblecontinuarelrecorrido).
Como podemos observar, recorrido no es una herramienta del lenguaje Gobstones, como lo
son
repeat
,
foreach
,
while
o
if
, sino que es una construccin mental que permite estructurar un
procedimiento o funcin para reflejar el pasaje por distintos elementos en los que se procesa
algunatarea.

Recorridos por todo el tablero


Enelejemploanteriorhicimosunrecorridosloporunacolumna.Perolointeresanteen
Gobstonesesrealizarunatareaparatodaslasceldasdeltablero.Siguiendoelesquema
abstractoderecorrido,podemosconstruirlosiguiente:

functionhaySiguienteCelda()//noestoyenelbordesuperiorderecho
{
return(puedeMover(Norte)||puedeMover(Este))
}

procedurePasarASiguienteCelda()
//moverhaciaelNorteysinopasarasiguientecolumna(Este)desdeelSur
{
if(puedeMover(Norte))
{Mover(Norte)}
else
{Mover(Este)IrAlBorde(Sur)}
}

procedureUnRecorridoPorTodoElTablero()//recorridoabstractoportodoeltablero
{
IrAlOrigen()
//procesarprimercelda
while(haySiguienteCelda())
{
PasarASiguienteCelda()
//procesarceldaactual
}
}


En este caso,como sabemos de antemano que lo que vamos a recorrer serntodaslasceldas
del tablero, podemos fijar cierto comportamiento para gran parte del esquema abstracto de
recorrido. Enparticular,podemosdefinircmovaarecorrerseeltablero.Enestecasodecidimos
recorrerlo desde el borde inferior izquierdo hasta el borde superior derecho, procesando las
columnas desde su extremo sur hacia su extremo norte, y pasando a la siguiente columna
(movindo el cabezal al este) cuando alcanzamos este ltimo extremo. En otras palabras,
dejamos de procesar cuando ya no nos podemos mover ni al Norte ni al Este. Lo nico que
faltaradefiniresquhacemosconcadaceldaenparticular.
Siquisiramosponerunabolitarojaencadauna,completamoslosiguiente:
procedurePonerUnaRojaEnTodoElTablero()
{
IrAlOrigen()

Poner(Rojo)
while(haySiguienteCelda())
{
PasarASiguienteCelda()
Poner(Rojo)
}
}
Siquisiramosenrealidadvaciartodaslasceldasdeltablero,podemoshacerlosiguiente:
procedureVaciarCelda()
{
foreachcin[minColor()..maxColor()]
{SacarX(nroBolitas(c),c)}
}
procedureVaciarElTablero()
{

IrAlOrigen()

VaciarCelda()
while(haySiguienteCelda())
{
PasarASiguienteCelda()
VaciarCelda()
}
}
Como podemos observar, toda la estructura del recorrido se mantieneintacta, y slo cambia lo
queharemosencadacelda.

Variables
Por ltimo, existe una herramienta que se utililza en aquellos casos en los que queremos
guardar informacin que ser utilizada en un futuro, y que si no guardamos ya no podremos
consultar.
Imaginen el problema de copiar la cantidad de bolitas verdes deuna celda a otra. La forma de
saber la cantidad debolitas de la celda ACTUAL es preguntar conla expresin nroBolitas. Es
decir, si escribimosnroBolitas(Verde)estorepresentarelnmerode bolitasverdesdelacelda
actual. Pero qu pasa si queremos llevarnos ese dato a la celda al Norte, para colocar esa
cantidad de verdes pero de rojas en esa celda al Norte. Al mover el cabezal, ya no podemos
consultar la informacin de la celdaanterior,dadoqueslopodemosconsultardatosdelacelda
en donde est posicionado el cabezal. Sin embargo, este problema se resuelve fcilmente
haciendousode
variables
:
procedureCopiarVerdesHaciaElNorte()
{

cantidadVerdes:=nroBolitas(Verde)
Mover(Norte)
PonerX(cantidadVerdes,Rojo)
}
La lnea resaltada es exactamente la que hace uso de esta nueva herramienta. Del lado
izquierdo tenemos un nombre, inventando de la misma manera que pensamos nombres para

procedimientos o parmetros, que luego se puede utilizar como cualquier otrovaloroexpresin


dentro del programa. El valor asignado a esta palabra ser el resultado de la expresin que
aparezca del lado derecho. A este proceso de relacionar una palabra (una variable) a una
expresin se denomina
asignacindelavariable
. Adems,lasvariablespuedenserreasignadas
lasvecesquequeramos.Porejemplo:
distintasCantidades:=nroBolitas(Verde)
distintasCantidades:=10
La variable distintasCantidades primero vale nroBolitas(Verde), pero despus decidimos
asignarle arbitrariamente el nmero 10. Dicha variable es un nombre que podemos asignar a
cualquier nmero. En general, si una variable es utilizada para nombrarun tipodedato, sloes
reasignada para seguir representando valores de ese tipo. Por ejemplo,lassiguienteslneasno
tienensentido:
unaVariable:=15
unaVariable:=Rojo
Primero dijimos que unaVariable describe el valor 15, y a continuacin le decimos que vale
Rojo. Debemos intentar evitar este tipo de comportamiento, y pensar qu tipo tiene una
variablecuandolaasignamosaundato.
Enlugardehacerloanterior,esposibleutilizardistintasvariablesparadistintostiposdedatos:
unNumero:=15
unColor:=Rojo
Otro uso para lasvariableses acumular resultados.Dijimosanteriormentequeelnombredela
variable luego puede ser utilizado como cualquier valor o expresin dentro del programa, por lo
quetambinpodemosasignarelvalordeunavariableaotrasvariables:
unaVariable:=10
otraVariable:=unaVariable
Como es de esperar, si unaVariable representa el valor 10, entonces otraVariable tambin
vale 10, porque la primera vale exactamente eso. Y yendo an ms lejos podemos hacer lo
siguiente:
unaVariable
:=10
unaVariable
:=
unaVariable

Esto es totalmente vlido. Primero decimos que unaVariablevale10,yluegoreasignamosese


nombre al valor que posee ese mismo nombre, que es 10. Al final lavariable vuelveavaler10.
Sibienesteejemploconcretocarecedesentido,stienesentidoalgocomolosiguiente:
unaVariable
:=10
unaVariable
:=
unaVariable
+1
En este caso, la variable empieza valiendo 10, y luego pasamos a asignarle ese mismo valor
que tena pero sumndole 1. La variable ahora pasa a valer 11. Para qu sirve esto? Existen
casos en dondequeremos acumularresultadosbajo unmismonombredevariable.Porejemplo,
si queremos sumar la cantidad de bolitas de cada celda de una columna podemos realizar un
recorrido en donde sumamos al resultado actual de una variable cada cantidad de bolitas que
encontramosenlasdistintasceldas.
Supongamosquecontamosentonceslacantidaddebolitasnegrasdetodalacolumna:
functioncantidadNegrasDeColumna()
{
IrAlBorde(Sur)

cantidadTotal
:=nroBolitas(Negro)
while(puedeMover(Norte))
{
Mover(Norte)
cantidadTotal
:=
cantidadTotal
+
nroBolitas(Negro)
}
return(
cantidadTotal
)
}
Esta funcin empieza por la primera celda al sur de la columna actual y cuenta la cantidad de
bolitas de esa celda (la recuerda). Luego continua su recorridohacia el norte, y mientras haya
celdas al norte se mueve y suma, a la cantidad actual de bolitas, las distintas cantidades de
bolitas de cada celda por la que pasa. Estamos
acumulandoel nmero de bolitas de todas las
celdas de la columna en un nico nmero final, que terminamos por devolver al final de este
recorrido(cuandonohaymsceldasalnorte).