miércoles, 6 de octubre de 1999

Una flor y sus pétalos. Un ejercicio de programación en WinLogo (Logo)

; --------------------------------------
; Una flor, amb els seus pètals --------
;     © Joan Aranes Clua, 1999 
;---------------------------------------


procediment flor :n :color
id
repeteix :n [petal :color gd 360 / :n]
fi

procediment petal :color
repeteix 2 [repeteix 90 [av 1 gd 1] gd 90]
no.llapis gd 45 av 50 llapis fes.color :color pinta
no.llapis centre ge 45 llapis
fes.color 1
fi

flor 15 10 ;demo


martes, 5 de octubre de 1999

Simulación de un sencillo billar rectangular empleando el lenguaje WinLogo

;-------- Simulació d'un billar rectangular --
;   © Joan Aranes Clua, 1999
;---------------------------------------------
procediment Posa.marc.i.bola
inicia.dibuix restaura.tortuga fes.color 1
no.llapis
posa't [-202 -92]
llapis
posa't [-202 92]
posa't [202 92]
posa't [202 -92]
posa't [-202 -92]
no.llapis
centre
llapis
fes.forma 87 fes.color 10
orienta't atzar 360
sensor [-200 90 200 -90]
fi


procediment Mou.bola
fes.local "xx fes.local "yy
no.llapis
posa.a "xx coor.x
posa.a "yy coor.y
posa.a "rumb orientació
av 1
si detecta 1 [fes.x :xx fes.y :yy Canvia.direcció]
Mou.bola
fi

procediment Canvia.direcció
posa.a "canvi 2*abs(residu orientació 90)
gira.dreta :canvi*(potència -1 atzar 2) 
fi


procediment A.jugar
Posa.marc.i.bola
Mou.bola
fi

A.jugar

La divisibilitat dels nombres enters positius

  1. Introducció
  2. A la recerca dels nombres primers
  3. Màxim comú divisor i mínim comú múltiple de dos nombres enters positius


1. Introducció
Aquí hi trobareu una proposta metodològica encarada a l'estudi dels nombres primers i la divisibilitat fonamentada en l'experimentació per ordinador de diverses estratègies i processos. Vaig redactar aquestes notes, ja fa molts anys (1999). Els centres d'interès procedimental són l'algorisme d'Eratòstenes i d'altres alternatius elementals per a la recerca sistemàtica de nombres primers així com l'algorisme d'Euclides -- i d'altres més elementals -- per la determinació del mcd de dos nombres enters. Quant als conceptes hom incideix sobre les nocions de múltiples i divisors; en particular, les de màxim comú divisor i mínim comú múltiple. Pel que fa referència a l'educació d'actituds hom pretén fomentar una actitud activa, rigorosa i de descobriment quant a la valoració i verificació dels resultats, així com encoratjar l'alumnat a la comprensió i justificació de les propietats i teoremes matemàtics. Per bé que els algorismes figuren escrits segons els constructors del llenguatge WinLogo i, per tant, són directament implementables per a aquest interpret, la claredat del llenguatge permet emprar el codi font com a pseudocodi que facilitarà escriure'ls en d'altres llenguatges de programació. Abans de començar: tinguem en compte que el zero es divisible per qualsevol nombre enter (positiu o negatiu) i, per tant, és múltiple de qualsevol nombre enter; per altra banda, és clar que la noció de divisibilitat que tractem aquí per als nombres enters positius (i per al zero) és extensible a tots els nombres enters, per bé que, per facilitar la comprensió dels algorismes i dels senzills programes en Logo, en aquest article només es parla dels positius.

2. A la recerca dels nombres primers
Un primer procediment el dedicarem a realitzar la següent tasca: donat un nombre enter positiu qualsevol volem que el procediment doni com a resultat si aquest és - o no és - un nombre primer.

procediment Genera.nombres.primers :nombre_enter_fins_on_cal_buscar
  fes.local "nombre.inicial
  posa.a "nombre.inicial 2
  escriu.seguit 2 escriu [...‚s un nombre primer]
  repeteix :nombre.enter.fins.on.cal.buscar
     [
       Digues.quin.nombre.es.primer :nombre.inicial
       posa.a "nombre.inicial  (:nombre.inicial + 1)
     ]
fi
procediment Digues.quin.nombre.es.primer :n
  fes.local "divisor 
  fes.local "fita_del_bucle 
  posa.a "divisor 2
  posa.a "fita.del.bucle  part.entera (arrel :n)
  repeteix :fita.del.bucle 
    [
      si (residu :n :divisor) = 0 
        [acaba] 
        [posa.a "divisor (:divisor+1)]   
    ] 
  escriu.seguit :n escriu [és un nombre primer]
fi
3. Màxim comú divisor i mínim comú múltiple de dos nombres enters positius
El següent algorisme mostra una manera de calcula el màxim comú divisor de dos nombres enters:
procediment mcd.rudimentari :a :b
  si :a=:b 
      [escriu.seguit [mcd=] escriu :a  acaba] 
     [
       si :a<:b 
         [posa.a "b :a] 
         [posa.a "a (:a - :b) mcd.rudimentari :a :b]
     ]
fi
I, aquest altre, ens servirà per calcular el mínim comú múltiple:
procediment mcm_rudimentari :a :b
  fes.local "n
  fes.local "múltiple
  fes.local "nombre_més_petit
  fes.local "nombre_més_gran
  fes.local "màxim_iteracions
  posa.a  "n 0
  si :a>:b 
    [posa.a "nombre_més_gran :a posa.a "nombre_més_petit :b]
    [posa.a "nombre_més_gran :b posa.a "nombre_més_petit :a]             
  posa.a "màxim_iteracions :nombre_més_gran
  repeteix  :màxim_iteracions 
    [
      posa.a "n :n+1 
      posa.a "múltiple :n*:nombre_més_petit
      si :nombre_més_gran>:múltiple  
         [si residu :nombre_més_gran  :múltiple = 0 [escriu [mcm=] :múltiple acaba]
         [si residu :múltiple  :nombre_més_gran = 0 [escriu [mcm=] :múltiple acaba ]
    ]
fi
Un procediment alternatiu es fonamenta en el mètode d'Euclides:
procediment mcd.i.mcm.Euclides :a :b 
  fes.local "r 
  fes.local "dividend 
  fes.local "divisor 
  si :a > :b 
     [
       posa.a "dividend :a 
       posa.a "divisor :b
     ]  
     [
       posa.a "dividend :b  
       posa.a "divisor :a
     ]   
  repeteix :dividend
    [
      posa.a "r residu :dividend :divisor
      si :r=0 
        [
           escriu.seguit  [mcd =] escriu :divisor 
           escriu.seguit [mcm =]  escriu :a * :b / :divisor 
           acaba
        ]
        [
           posa.a "dividend :divisor 
           posa.a "divisor :r
        ]
     ]  
fi
$\square$