dilluns, 4 de setembre del 2017

Aprendre a programar 12 - Modificar una classe

Un cop hem arribat aquí, ja sabem com utilitzar la classe Estudiant, i Cjt_estudiants. Pot haver costat més o menys aconseguir-ho, però al final ho hem aconseguit. Doncs bé, ara ja no haurem d'escriure programes que la utilitzin. Com us quedeu?

Funcionament intern d'una classe

A l'article anterior vèiem com funciona una classe des del punt de vista de l'usuari extern. Aquí veurem com funciona des de dins

Públic vs privat

Una classe té 3 tipus d'atributs i mètodes. Són públics, privats i protegits. Als protegits no els farem gaire cas, a PRO2 no els utilitzem. 

Públic:

Normalment tenim mètodes públics, més que atributs. Són els mètodes amb els que treballem des de fora, i serveixen per interactuar amb la classe sense preocupar-nos del funcionament intern. En algun cas, també hi ha atributs, com per exemple en el cas de la classe pair, que tenim dos atributs públics (first i second)

Privat:

Aquí tenim mètodes i atributs. Normalment els atributs són els que emmagatzemen la informació que necessitem, mentre que els mètodes (s'entén que privats) són auxiliars cridats per les funcions públiques. Per exemple, a Cjt_estudiants tenim un mètode públic que és consultar_estudiant, que rep un DNI i retorna l'estudiant corresponent. Doncs ho fa utilitzant una funció auxiliar que fa la cerca dicotòmica, i que està com a privada. A aquesta no hi podem accedir des de fora, ja que és privada

Com funciona Cjt_estudiants?

Sí, comencem directament per aquí. El funcionament d'Estudiant és bastant senzill, i a més, no ens la faran modificar. Si a algú li interessa, és trivial, però per nosaltres seguirà sent una caixa negra. 

Atributs privats:

Bàsicament tenim 3 atributs privats. 

MAX_NEST:

És un enter que indica la mida màxima del conjunt. Pot ser 10, 60, 30.000, o qualsevol altra cosa. La idea és que hi puguin cabre tots els estudiants que vulguem

vest:

Aquest és el vector que emmagatzema els estudiants. És un vector<Estudiant> de mida MAX_NEST

nest.

És un enter que emmagatzema la quantitat d'estudiants que tenim. La idea és que estaran emmagatzemats entre la posició 0 i la posició nest-1

Mètodes públics

Afegir estudiant:

Aquesta el que fa és desplaçar tots els elements amb dni>est.dni una posició cap a la dreta, i un cop ha arribat al punt on el dni ja no és més gran, posa allà l'estudiant. Això, evidentment, si hi cap. Per tant, té cost lineal respecte a la mida

Modificar estudiant:

Fa la cerca dicotòmica per buscar on està aquell dni, i modifica aquella posició perquè hi hagi l'estudiant que volem

Modificar ièssim

Modifica l'ièssim, sempre que la posició sigui vàlida

Mida i mida màxima:

Retornen l'enter corresponent

Existeix estudiant:

Fa la cerca dicotòmica buscant el dni, i retorna si hi és o no

Consultar estudiant

Fa la cerca dicotòmica, i retorna l'estudiant que està a la posició retornada

Consultar ièssim:

Retorna vest[i-1]

Llegir:

Llegeix nest. Després fa nest iteracions, fent vest[i].llegir(). Finalment ordena el conjunt

Escriure:

Fa nest iteracions, fent vest[i].escriure()

Com modifiquem?

Normalment ens fan fer exercicis on ens diuen "hem afegit tal atribut privat, i tal funció. Modifica-ho perquè funcioni". El primer que hem de fer és descarregar els arxius del Jutge, allà hi ha les capçaleres i tot. Un cop ho tenim, modifiquem allà directament

Un exemple. Fem l'exercici X68173, que, com podeu veure a l'imatge, no és gaire difícil

No, de debò, no és gaire difícil. El que passa és que, al no haver-hi casos de proves, el que feia era provar-los directament al jutge, comprovant que compilessin i ja (excepte a l'enviament 1 i 15, que se'm va passar). No obstant, jo us diria que us feu un joc de prova (o més), i així no tindreu tants errors

Dit això:

Conjunt d'estudiants amb imax - X68173

Descarreguem els arxius, i veiem que tenim PRO2Exepcio.hh, Estudiant.hh, Estudiant.cc i Cjt_estudiants.hh. Per tant, el que ens toca fer és Cjt_estudiants.cc. De fet, l'únic que ens cal és afegir-hi les dues operacions que ens demanen, i modificar les que calgui. Comencem triant quines funcions cal modificar.

Constructores?

Només en tenim una. No cal fer-hi res, no hi ha màxim perquè està buit. Podem posar-li un valor fora del rang, perquè quedi clar que no tenim màxim. Depenent de com decidim implementar-ho, però jo crec que millor modificar-la

Modificadores?

Afegir estudiant, per si afegim un estudiant amb nota major, o la posició de l'estudiant amb nota màxima canvia
Modificar estudiant, per si modifiquem l'estudiant que té la nota màxima
Modificar ièssim, pel mateix
Esborrar estudiant, que de fet no està implementada

És a dir, totes

Consultores?

Aquí no n'hem de modificar cap. Al cap i a la fi, no modifiquen, consulten. L'únic que hem de fer és implementar estudiant nota max

Lectura/escriptura?

A la de lectura hem de mirar quina és la posició amb nota més gran. A la d'escriptura, res

Ja sabem quines hem de modificar. Ara toca fer-ho. Pots, o currar-te de comprovar si s'ha modificat alguna cosa, si cal recórrer tot el conjunt... O pots simplement recalcular el màxim al final. Jo vaig aconseguir el verd així, per tant, es pot fer així i no et compliques la vida. O pots fer-ho bé, esforçant-te. Això ja depèn de tu

Cap comentari:

Publica un comentari a l'entrada