|
Pràctica 5: Aritmètica i fraccions (I) |
En aquesta pràctica i la següent es tracta de fer servir tot el que ja hauràs après fins ara (i potser una mica més) per tal d'elaborar alguna cosa prou complexa: un projecte amb tots els ets i uts! |
||||
Aritmètica de fraccions de nombres enters | ||||
Et proposem, doncs, la construcció d'un conjunt de classes i mètodes que tinguin com a finalitat l'automatització del càlcul amb fraccions de nombres enters: allò que, en la majoria de calculadores habituals a les aules de secundària, no pots fer si no és que dónes els resultats com a nombres decimals: |
||||
|
||||
El projecte serà, doncs, un conjunt de classes (amb els seus mètodes, constructors,...) que automatitzarà els càlculs amb fraccions i et permetrà trobar els resultats en forma de fracció simplificada. | ||||
|
||||
Obre el . Tria l'opció de menú Projecte|Nou Projecte i comença, doncs, per crear un projecte que convé que guardis en la carpeta de treball (en les pràctiques anteriors t'hem aconsellat ../Bluej/projectes). Dona a aquest projecte el nom d'Aritmetica i, entre aquesta pràctica i la següent, l'ompliràs amb les classes que ha de contenir. Veuràs que el programa ja t'ha preparat la infrastructura pel teu projecte però que encara no hi tens cap classe. | ||||
Una classe plena de mètodes: NombresEnters | ||||
La primera classe que necessites serà, només, una mena de contenidor de mètodes per treballar amb nombres enters, més enllà de les quatre operacions bàsiques, i no la instanciarem mai (podríem fer-ho, però no en treuríem cap avantatge). Serà com una mena de "biblioteca de mètodes" que podrem cridar des d'altres classes quan ens convingui. En conseqüència, els mètodes d'aquesta classe han d'estar disponibles sense que se n'hagi creat cap objecte!
Això fa que una classe amb mètodes static sigui quelcom més que un simple esquema, que un simple esquelet, perque ja conté elements que són funcionals! |
||||
|
||||
Ara, doncs, en l'entorn del clica a Nova Classe, deixa l'opció per defecte per crear una classe i li poses el nom NombresEnters. Aquesta classe serà la que es tracta de fer i ha de tenir aquest codi: |
||||
|
||||
Per escriure aquest codi a la teva classe NombresEnters has de fer doble clic a la caixa que el programa li ha preparat (o botó dret i Obrir Editor). Llavors has de modificar les propostes inicials que et fa el programa i incloure-hi el text precedent amb el benentès que...
Quan ja ho hagis fet és l'hora d'analitzar el codi amb una explicació dels mètodes que conté la classe. |
||||
Valor Absolut | ||||
El primer mètode, public static int valorAbsolut (int a), no necessita cap explicació especial: si el nombre a és negatiu se li canvia el signe i, si no, se'l deixa tal com està. | ||||
Màxim comú divisor | ||||
El segon mètode, public static int Mcd (int
a,int b), calcula el màxim comú divisor de dos nombres
mitjançant l'ús de l'algorisme d'Euclides. Molt breument:
del fet que, si a
i b són
dos nombres enters i r
és el residu de la divisió de a
entre b, aleshores
m.c.d.(a, b)
= m.c.d.(b, r), i del fet que, en una divisió
de nombres no negatius, el residu és sempre més petit que
el divisor, simplement es tracta d'anar fent les divisions successives
fins arribar a residu zero. El mètode comença tot assegurant que els càlculs es faran amb nombres positius i els guarda a les variables divisor i residu. |
||||
|
||||
Després comença una estructura while(...){...}, que és el primer exemple de bucle (en anglès: "loop") que apareix en aquest curs. D'acord amb el fet que while vol dir mentre l'estructura condicional funciona així: | ||||
|
||||
Vegem ara l'exemple que ens ocupa. El nostre bucle repeteix el cicle
(les sentències del cos del bucle, que més
avall examinarem) mentre residu
sigui diferent de zero. Adoneu-vos de quin és per a Java
el signe que permet comprovar si els valors de dues variables son diferents:
és != |
||||
|
||||
Dels dos nombres, cal
guardar el primer que era divisor, en una altra
variable intermèdia int dividend: |
||||
|
||||
Tot seguit es fa que el segon dels nombres, que havíem designat com a residu, passi a ser el divisor: | ||||
|
||||
i calcula el nou residu amb l'operador mòdul, %. (a%b dóna el residu de la divisió entera de a per b) : | ||||
|
||||
Quan residu sigui zero, divisor (on hi tenim el darrer divisor emprat) ja serà el màxim comú divisor: | ||||
|
||||
Mínim comú múltiple | ||||
|
||||
|
||||
Funcionament dels mètodes | ||||
Ara hem d'anar per verificar el funcionament d'aquests mètodes. Compila la classe NombresEnters. Recorda que ho pots fer des de l'entorn del , botó dret del ratolí sobre la caixa de la classe i Compilar, o bé des de l'editor de codi desant primer els canvis i clicant a Compilar. Sense crear cap objecte de la classe, comprova què fan aquests mètodes, cosa que et mostrem amb unes imatges. |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Mètodes recursius: | ||||
El mètode public static int Mcd (int a,int b) pel càlcul del màxim comú divisor dels nombres a i b es pot escriure d'una manera força més elegant que la d'abans: | ||||
|
||||
Com que m.c.d.(a, 0) = a, les línies de codi | ||||
|
||||
es justifiquen per elles mateixes. D'altra banda, com que, si r és el residu de la divisió de a entre b, aleshores m.c.d.(a, b) = m.c.d.(b, r), i l'operació a%b dóna, precisament, el residu de la divisió de a entre b, les línies | ||||
|
||||
queden perfectament explicades. Finalment, com que cada residu a%b és, cada vegada, estrictament menor que l'anterior, és clar que, en algun moment, el càlcul arribarà a a%b==0 i el mètode acabarà. | ||||
Observa que, en aquest mètode, la línia | ||||
|
||||
fa una crida a ell mateix. Els mètodes que fan això es diuen mètodes recursius i solen ser més eficients que els que fan la mateixa feina, però no són recursius. | ||||
Pràctica, pràctica! | ||||
Un primer exercici per a comprovar les teves habilitats en mètodes recursius és aquest: | ||||
|
||||
Si no te'n surts (ep! només si no te'n surts), o bé, vols comparar el teu codi amb el que nosaltres proposem, trobaràs la solució d'aquest exercici aquí. | ||||
|
||||
La solució és aquí. | ||||
Comentari final: | ||||
Tot
i que, com ja t'hem comentat, els mètodes recursius solen ser els
més potents, en aquests dos exercicis que acabem de plantejar hi
ha una característica que sovint hom demana als programes informàtics:
la repetició d'un procediment (multiplicar a
per sí mateix un munt de vegades; multiplicar uns nombres, el resultat
per l'anterior, etc...).
|