Diferència entre revisions de la pàgina «ASIX-M3-UF2-A1»
(24 revisions intermèdies per 2 usuaris que no es mostren) | |||
Línia 1: | Línia 1: | ||
− | ''' | + | ==Descomposició funcional== |
+ | |||
+ | :*L’objectiu serà resoldre el problema general com a una suma de subproblemes més petits. | ||
+ | |||
+ | :*La solució a cada subproblema s’anomena subrutina o subprograma, i a Java, mètode. | ||
+ | |||
+ | :*Permet la reutilització del codi, facilita la seva lectura i el seu manteniment. | ||
+ | |||
+ | :*Escriure codi més genèric facilita la seva reutilització. | ||
+ | |||
+ | '''Disseny descendent''' | ||
+ | |||
+ | :*El mètode del disseny descendent consisteix en descompondre el problema a resoldre en altres més senzills. A aquests se'ls aplica el mateix procediment fins arribar a problemes prou petits que podem resoldre directament. | ||
+ | |||
+ | :*Refinament de l’algorisme (stepwise refinement) és com es coneix aquest procediment de descomposició. | ||
+ | |||
+ | :*Representació en forma d'arbre: | ||
+ | |||
+ | ::- Cada node és un mòdul, o problema, o solució hipotètica. | ||
+ | ::- Cada subarbre depenent d'aquest node es fa servir per a la resolució d'aquest subproblema. | ||
+ | ::- El node del nivell més alt és el problema de partida. | ||
+ | ::- L’algorisme serà correcte si la solució que es dóna a cada nivell ho és. | ||
+ | ::- El programa es pot construir de sota a dalt creant primer procediments que resolguin els mòduls de detall que, un cop comprovats seran utilitzats per altres procediments més generals fins a arribar a la creació del programa. | ||
+ | |||
+ | [[Imatge:m3uf2_disseny_modular_1.png |600px|center| Disseny modular]] | ||
+ | |||
+ | ==Reutilització de subproblemes resolts== | ||
+ | |||
+ | :*La descomposició mitjançant disseny descendent permet reaprofitar la solució de subproblemes idèntics, o força semblants. | ||
+ | |||
+ | :*Qualsevol subproblema d’un nivell donat pot ser part de qualsevol subproblema d’un nivell superior. Per remarcar | ||
+ | |||
+ | [[Imatge:m3uf2_disseny_modular_2.png |600px|center| Disseny modular]] | ||
+ | |||
+ | :*En descompondre un problema, s'ha d'intentar fer-ho de manera que es forci l’aparició de subproblemes repetits, i així la seva resolució es pot reaprofitar en diversos llocs. | ||
+ | |||
+ | ==Aplicació correcta del disseny descendent== | ||
+ | |||
+ | Diferents persones poden arribar a conclusions diferents sobre com dur a terme la descomposició. Entre totes les solucions diferents possibles, algunes es poden considerar millors que d’altres. De fet, res impedeix, partir d'una solució concreta i aplicar refinaments que la millorin. | ||
+ | |||
+ | Criteris per a l'avaluació de la descomposició: | ||
+ | |||
+ | :*Si un problema que sembla a priori força complex es descompon en molts pocs nivells, potser val la pena fer una segona ullada. Inversament, si un problema no massa complex té massa nivells, potser s’ha anat massa lluny en la descomposició. | ||
+ | |||
+ | :*Veure si el nombre de passes incloses a cadascun dels subproblemes no és excessivament gran i és fàcil de seguir i entendre. En cas contrari, potser encara faria falta aplicar nous nivells de descomposició. | ||
+ | |||
+ | :*Repassar que els noms assignats als subproblemes siguin autoexplicatius i expressin clarament la tasca que estan resolent. Sense ni tan sols llegir les seves passes, caldria entendre perfectament què s’assoleix en resoldre’ls. En cas contrari, potser la descomposició no està agrupant conjunts de passes realment relacionades entre elles. | ||
+ | |||
+ | :*Si absolutament cap dels subproblemes és reutilitzat enlloc, especialment en descomposicions en molts nivells, és molt possible que no s’hagi triat correctament la manera de descompondre alguns subproblemes. | ||
+ | |||
+ | :*Vinculat al punt anterior, l’aparició de subproblemes molt semblants o idèntics, però tractats per separat en diferents llocs, també sol ser indici que no s’està aplicant la capacitat de reutilitzar subproblemes correctament. | ||
+ | |||
+ | ==Programació modular== | ||
La programació modular consisteix en dividir un programa gran i/o complex en subprogrames més petits o simples, aconseguint fer-lo més comprensible i manejable. Per això, s'implementen funcions, classes i mòduls. | La programació modular consisteix en dividir un programa gran i/o complex en subprogrames més petits o simples, aconseguint fer-lo més comprensible i manejable. Per això, s'implementen funcions, classes i mòduls. | ||
Línia 10: | Línia 62: | ||
:* Pot rebre zero o més arguments com a entrada. | :* Pot rebre zero o més arguments com a entrada. | ||
:* Por retornar un valor i/o realitzar una tasca. | :* Por retornar un valor i/o realitzar una tasca. | ||
− | :* L' | + | :* L'ús de funcions permet fer una programació estructurada: |
::* modularització: segmentar un programa complex en mòduls més simples facilitant la programació i la depuració. | ::* modularització: segmentar un programa complex en mòduls més simples facilitant la programació i la depuració. | ||
::* reutilització: una mateixa funció es pot utilitzar des de diferents punts d'un programa i també des de diferents programes. | ::* reutilització: una mateixa funció es pot utilitzar des de diferents punts d'un programa i també des de diferents programes. | ||
Línia 22: | Línia 74: | ||
return value | return value | ||
</source> | </source> | ||
+ | |||
:* Els arguments es passen per valor: si canvien el seu valor dins de la funció, no canvien "a fora". | :* Els arguments es passen per valor: si canvien el seu valor dins de la funció, no canvien "a fora". | ||
:* Per modificar variable no locals a la funció, cal definir-les com a globals en la primera línia. | :* Per modificar variable no locals a la funció, cal definir-les com a globals en la primera línia. | ||
Línia 40: | Línia 93: | ||
− | + | '''Example function''' | |
− | + | <source lang="python"> | |
+ | def saludo(primer_nombre,apellido): | ||
+ | print(f"Hola, {primer_nombre} {apellido}") | ||
+ | |||
− | + | saludo("Timmy","Jones",34) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | + | '''un altre''' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<source lang="python"> | <source lang="python"> | ||
− | + | def saludo(primer_nombre,apellido): | |
− | + | print(f"Hola, {primer_nombre} {apellido}") | |
− | + | ||
− | + | saludo("Timmy","Jones") | |
− | |||
− | |||
− | |||
</source> | </source> | ||
− | + | '''un altre més''' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<source lang="python"> | <source lang="python"> | ||
− | + | def myFun(arg1, *argv): | |
− | + | print("First argument :", arg1) | |
+ | for arg in argv: | ||
+ | print("Next argument through *argv :", arg) | ||
− | |||
− | + | myFun('Hello', 'Welcome', 'to', 'M03') | |
− | + | </source> | |
− | |||
− | + | '''Ejemplo de llamada a una función, con return de varios parámetros y recogida en diferentes variables.''' | |
− | + | <source lang="python"> | |
− | |||
− | |||
− | + | def aHsMinSeg (x): | |
+ | '''''Dada una duración en segundos sin fracciones (la función debe | ||
+ | invocarse con números enteros) se la convierte a horas, minutos y segundos''''' | ||
+ | hs = x / 3600 | ||
+ | min = (x % 3600) / 60 | ||
+ | seg = (x % 3600 ) % 60 | ||
+ | return (hs, min, seg) | ||
+ | '''''Llamada a función''''' | ||
+ | (h, m, s) = aHsMinSeg(3661) | ||
+ | print ("Resultado: ",h,"horas",m,"minutos",s,"segundos") | ||
− | + | </source> | |
− | + | [[https://j2logo.com/args-y-kwargs-en-python/ funcions amb número indeterminat de paràmetres]] | |
+ | :'''Mòduls''' | ||
− | + | [https://pythones.net/modularidad-en-python/ Moduls] | |
− | + | [https://docs.python.org/es/3.8/tutorial/modules.html __init__] | |
+ | :* Un mòdul és un arxiu amb un codi independent i una determinada funcionalitat. | ||
+ | :* Pot ser utilitzat per qualsevol aplicació. | ||
+ | :* Es poden utilitzar mòduls propis de python, de tercers o propis. | ||
+ | :* Conté funcions, classes, definicions, ... | ||
+ | :* Per poder utilitzar un mòdul s'ha d'importar prèviament. | ||
+ | <source lang="python"> | ||
+ | import modul # 'modul': nom del mòdul a importar | ||
+ | </source> | ||
+ | :* Si volem importar només algunes parts del mòdul: | ||
+ | <source lang="python"> | ||
+ | from modul import funcio_1, funcio_2 # 'funcio_x': funcions del mòdul. | ||
+ | </source> | ||
+ | ==Diagrames de flux== | ||
+ | Els diagrames de flux es poden utilitzar per representar gràficament una seqüència ordenada de passos lògics per fer una tasca. Per fer aquesta representació, s'utilitzen un conjunt de símbols en els que es descriuen els passos a fer. | ||
− | + | Abans de fer un diagrama de flux es convenient fer un algoritme que descrigui quins són els passos a seguir per fer la tasca. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | :* Algoritme: Passos ordenats per fer una tasca. | |
− | + | :* Diagrama de Flux: Representació gràfica amb símbols de l'algoritme. | |
− | |||
− | + | Un cop tenim l'algoritme / diagrama de flux, haurem de fer el programa utilitzen les ordres corresponents del llenguatge de programació emprat. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | :* Símbols emprats: | |
− | + | [[Imatge:m3_uf2_diagrama_flux_simbols.png |400px|center| Símbols diagrama flux]] | |
− | + | :* Regles: | |
− | + | ::1. Tots els símbols han d'estar connectats. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ::2. A un símbol d'un procés poden arribar varies línies. | |
− | + | ::3. A un símbol de decisió poden arribar varies línies, però només poden sortir dos (Sí o No, Cert o Fals). | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | ::4. A un símbol d'inici no poden arribar línies. | |
− | + | ::5. D'un símbol fi no surt cap línia. | |
− | |||
− | |||
− | |||
− | + | ::6. Es poden utilitzar colors per millorar la claredat del diagrama. | |
− | + | :* Exemple: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | [[Imatge:m3_uf2_diagrama_flux_exemple.png |400px|left| Exemple diagrama flux ]] |
Revisió de 15:35, 14 set 2023
Contingut
Descomposició funcional
- L’objectiu serà resoldre el problema general com a una suma de subproblemes més petits.
- La solució a cada subproblema s’anomena subrutina o subprograma, i a Java, mètode.
- Permet la reutilització del codi, facilita la seva lectura i el seu manteniment.
- Escriure codi més genèric facilita la seva reutilització.
Disseny descendent
- El mètode del disseny descendent consisteix en descompondre el problema a resoldre en altres més senzills. A aquests se'ls aplica el mateix procediment fins arribar a problemes prou petits que podem resoldre directament.
- Refinament de l’algorisme (stepwise refinement) és com es coneix aquest procediment de descomposició.
- Representació en forma d'arbre:
- - Cada node és un mòdul, o problema, o solució hipotètica.
- - Cada subarbre depenent d'aquest node es fa servir per a la resolució d'aquest subproblema.
- - El node del nivell més alt és el problema de partida.
- - L’algorisme serà correcte si la solució que es dóna a cada nivell ho és.
- - El programa es pot construir de sota a dalt creant primer procediments que resolguin els mòduls de detall que, un cop comprovats seran utilitzats per altres procediments més generals fins a arribar a la creació del programa.
Reutilització de subproblemes resolts
- La descomposició mitjançant disseny descendent permet reaprofitar la solució de subproblemes idèntics, o força semblants.
- Qualsevol subproblema d’un nivell donat pot ser part de qualsevol subproblema d’un nivell superior. Per remarcar
- En descompondre un problema, s'ha d'intentar fer-ho de manera que es forci l’aparició de subproblemes repetits, i així la seva resolució es pot reaprofitar en diversos llocs.
Aplicació correcta del disseny descendent
Diferents persones poden arribar a conclusions diferents sobre com dur a terme la descomposició. Entre totes les solucions diferents possibles, algunes es poden considerar millors que d’altres. De fet, res impedeix, partir d'una solució concreta i aplicar refinaments que la millorin.
Criteris per a l'avaluació de la descomposició:
- Si un problema que sembla a priori força complex es descompon en molts pocs nivells, potser val la pena fer una segona ullada. Inversament, si un problema no massa complex té massa nivells, potser s’ha anat massa lluny en la descomposició.
- Veure si el nombre de passes incloses a cadascun dels subproblemes no és excessivament gran i és fàcil de seguir i entendre. En cas contrari, potser encara faria falta aplicar nous nivells de descomposició.
- Repassar que els noms assignats als subproblemes siguin autoexplicatius i expressin clarament la tasca que estan resolent. Sense ni tan sols llegir les seves passes, caldria entendre perfectament què s’assoleix en resoldre’ls. En cas contrari, potser la descomposició no està agrupant conjunts de passes realment relacionades entre elles.
- Si absolutament cap dels subproblemes és reutilitzat enlloc, especialment en descomposicions en molts nivells, és molt possible que no s’hagi triat correctament la manera de descompondre alguns subproblemes.
- Vinculat al punt anterior, l’aparició de subproblemes molt semblants o idèntics, però tractats per separat en diferents llocs, també sol ser indici que no s’està aplicant la capacitat de reutilitzar subproblemes correctament.
Programació modular
La programació modular consisteix en dividir un programa gran i/o complex en subprogrames més petits o simples, aconseguint fer-lo més comprensible i manejable. Per això, s'implementen funcions, classes i mòduls.
- Funció
- Bloc de codi amb un nom associat.
- Pot rebre zero o més arguments com a entrada.
- Por retornar un valor i/o realitzar una tasca.
- L'ús de funcions permet fer una programació estructurada:
- modularització: segmentar un programa complex en mòduls més simples facilitant la programació i la depuració.
- reutilització: una mateixa funció es pot utilitzar des de diferents punts d'un programa i també des de diferents programes.
- Python disposa de moltes funcions integrades i permet la creació de funcions per part dels programadors.
- Sintaxi:
def nomFuncio(arg_1, arg_2, ..., arg_n):
...
return value
- Els arguments es passen per valor: si canvien el seu valor dins de la funció, no canvien "a fora".
- Per modificar variable no locals a la funció, cal definir-les com a globals en la primera línia.
def nomFuncio(arg_1, arg_2, ..., arg_n):
global var_1, var_2
...
return value
- Exemple senzill:
>>> def salutacio(nom):
... print("Hola "+ nom + "!")
...
>>> salutacio("Pep")
Hola Pep!
Example function
def saludo(primer_nombre,apellido):
print(f"Hola, {primer_nombre} {apellido}")
saludo("Timmy","Jones",34)
un altre
def saludo(primer_nombre,apellido):
print(f"Hola, {primer_nombre} {apellido}")
saludo("Timmy","Jones")
un altre més
def myFun(arg1, *argv):
print("First argument :", arg1)
for arg in argv:
print("Next argument through *argv :", arg)
myFun('Hello', 'Welcome', 'to', 'M03')
Ejemplo de llamada a una función, con return de varios parámetros y recogida en diferentes variables.
def aHsMinSeg (x):
'''''Dada una duración en segundos sin fracciones (la función debe
invocarse con números enteros) se la convierte a horas, minutos y segundos'''''
hs = x / 3600
min = (x % 3600) / 60
seg = (x % 3600 ) % 60
return (hs, min, seg)
'''''Llamada a función'''''
(h, m, s) = aHsMinSeg(3661)
print ("Resultado: ",h,"horas",m,"minutos",s,"segundos")
[funcions amb número indeterminat de paràmetres]
- Mòduls
- Un mòdul és un arxiu amb un codi independent i una determinada funcionalitat.
- Pot ser utilitzat per qualsevol aplicació.
- Es poden utilitzar mòduls propis de python, de tercers o propis.
- Conté funcions, classes, definicions, ...
- Per poder utilitzar un mòdul s'ha d'importar prèviament.
import modul # 'modul': nom del mòdul a importar
- Si volem importar només algunes parts del mòdul:
from modul import funcio_1, funcio_2 # 'funcio_x': funcions del mòdul.
Diagrames de flux
Els diagrames de flux es poden utilitzar per representar gràficament una seqüència ordenada de passos lògics per fer una tasca. Per fer aquesta representació, s'utilitzen un conjunt de símbols en els que es descriuen els passos a fer.
Abans de fer un diagrama de flux es convenient fer un algoritme que descrigui quins són els passos a seguir per fer la tasca.
- Algoritme: Passos ordenats per fer una tasca.
- Diagrama de Flux: Representació gràfica amb símbols de l'algoritme.
Un cop tenim l'algoritme / diagrama de flux, haurem de fer el programa utilitzen les ordres corresponents del llenguatge de programació emprat.
- Símbols emprats:
- Regles:
- 1. Tots els símbols han d'estar connectats.
- 2. A un símbol d'un procés poden arribar varies línies.
- 3. A un símbol de decisió poden arribar varies línies, però només poden sortir dos (Sí o No, Cert o Fals).
- 4. A un símbol d'inici no poden arribar línies.
- 5. D'un símbol fi no surt cap línia.
- 6. Es poden utilitzar colors per millorar la claredat del diagrama.
- Exemple: