flowchart LR
P["Problema<br/>(què vull)"] --> A["Algorisme<br/>(com ho faré)"]
A --> C["Programa<br/>(codi executable)"]
C --> R["Resultat"]
1 Introducció
Objectius
- Entendre què vol dir programar i per a què serveix.
- Distingir entre problema, algorisme i programa.
- Reconèixer les propietats d’un bon algorisme.
- Conèixer les grans fases del cicle de vida del programari.
- Llegir i escriure un algorisme senzill en pseudocodi i en diagrama de flux.
Programar és donar instruccions a un ordinador perquè resolgui un problema.
L’ordinador és molt ràpid, però no té sentit comú. Fa exactament el que li dius, ni més ni menys. Si les instruccions estan mal escrites, el resultat serà erroni… i l’ordinador no s’adonarà de l’error. La responsabilitat és sempre del programador.
Un ordinador no “entén” el problema. Només segueix passos. La teva feina és convertir un problema en una seqüència de passos clara i sense ambigüitats.
Una analogia: la recepta de cuina
Pensa en una recepta. Una recepta és una llista de passos per obtenir un plat:
- Bull aigua amb sal.
- Aboca la pasta.
- Espera 9 minuts.
- Escorre l’aigua.
- Serveix.
Un algorisme és exactament això: una llista ordenada de passos per aconseguir un resultat.
Programar és escriure aquesta recepta amb tant de detall que fins i tot una màquina sense sentit comú la pugui seguir.
1.1 Problema, algorisme i programa
| Concepte | Definició | Exemple |
|---|---|---|
| Problema | La necessitat que volem resoldre | Vull saber la mitjana de tres notes |
| Algorisme | El pla de passos per resoldre’l | Suma les tres notes i divideix per 3 |
| Programa | L’algorisme escrit en un llenguatge que l’ordinador executa | El codi en Java |
L’ordre importa. Primer entens el problema, després dissenyes l’algorisme i, només al final, l’escrius com a programa.
La temptació de principiant és obrir l’editor i començar a escriure codi de seguida. Sense un algorisme pensat abans, acabaràs perdut. Primer pensa, després escriu.
1.2 Què és un algorisme?
Un algorisme és una seqüència finita i ordenada de passos que resol un problema.
No és un concepte informàtic modern: una recepta, les instruccions per muntar un moble o el procés per fer una arrel quadrada a mà són algorismes.
Propietats d’un bon algorisme
Un bon algorisme ha de complir:
| Propietat | Vol dir que… | Contraexemple |
|---|---|---|
| Precís | Cada pas és clar i sense ambigüitat | “Posa una mica de sal” (quanta?) |
| Finit | Acaba després d’un nombre limitat de passos | “Repeteix per sempre” (no acaba mai) |
| Definit | Amb les mateixes dades, dona sempre el mateix resultat | Un pas que depèn de l’atzar sense control |
| Té entrada | Rep unes dades inicials (potser cap) | — |
| Té sortida | Produeix un o més resultats | Un algorisme que no dona cap resultat no serveix |
Exemple: la mitjana de tres notes
Vegem l’algorisme del problema de la taula anterior, escrit en llenguatge natural:
- Demana la primera nota.
- Demana la segona nota.
- Demana la tercera nota.
- Suma les tres notes.
- Divideix la suma entre 3.
- Mostra el resultat.
Observa que té entrada (les tres notes), uns passos precisos i una sortida (la mitjana). I acaba: és finit.
1.3 Les tres estructures bàsiques
Encara que un problema sigui molt complex, tot algorisme es pot construir combinant només tres tipus de construccions.
Ho va demostrar el teorema de Böhm-Jacopini.
- Seqüència. Els passos s’executen un rere l’altre, de dalt a baix. És el cas de la recepta de la pasta.
- Selecció (o condició). El programa decideix entre camins diferents segons una condició. “Si plou, agafa el paraigua; si no, no.”
- Repetició (o bucle). Un grup de passos es repeteix diverses vegades. “Mentre quedin plats bruts, renta’n un.”
Amb aquestes tres peces, i combinant-les, es pot escriure qualsevol programa. És una idea molt potent: la complexitat neix de la combinació de coses senzilles.
1.4 Representació d’algorismes
Per escriure algorismes abans de tenir un llenguatge de programació, fem servir dues eines. Totes dues expressen la mateixa idea de maneres diferents.
- Pseudocodi
- Diagrama de flux
1.4.1 El pseudocodi
El pseudocodi és una manera d’escriure algorismes amb un llenguatge intermedi: més estructurat que el català normal, però sense les regles estrictes d’un llenguatge de programació. No s’executa a cap ordinador; és per a persones.
Aquest és l’algorisme de la mitjana en pseudocodi:
Algorisme MitjanaTresNotes
Escriure "Introdueix la primera nota:"
Llegir nota1
Escriure "Introdueix la segona nota:"
Llegir nota2
Escriure "Introdueix la tercera nota:"
Llegir nota3
mitjana ← (nota1 + nota2 + nota3) / 3
Escriure "La mitjana és:", mitjana
FiAlgorisme
Fixa’t en el símbol ←: vol dir “assigna”, és a dir, “guarda aquest valor aquí”.
1.4.2 El diagrama de flux
Un diagrama de flux és la representació visual del mateix algorisme. Fa servir figures connectades per fletxes que indiquen l’ordre. Cada figura té un significat:
| Figura | Significat |
|---|---|
| Òval / rectangle arrodonit | Inici i final |
| Rectangle | Una acció o procés (càlcul, assignació) |
| Paral·lelogram | Entrada o sortida de dades (llegir / escriure) |
| Rombe | Una decisió (pregunta amb resposta sí/no) |
| Fletxa | El sentit del flux |
Aquest és el diagrama de flux de la mitjana:
flowchart TD
inici([Inici]) --> lec[/"Llegir nota1, nota2, nota3"/]
lec --> calc["mitjana ← (nota1+nota2+nota3) / 3"]
calc --> esc[/"Escriure mitjana"/]
esc --> fi([Final])
El pseudocodi i el diagrama de flux no competeixen: expliquen el mateix algorisme. El diagrama va bé per veure el flux d’un cop d’ull; el pseudocodi va bé quan l’algorisme és llarg i el dibuix quedaria massa gran.
Exemple amb decisió: parell o senar
Vegem un algorisme amb una selecció. Volem dir si un número és parell o senar.
Algorisme ParellOSenar
Escriure "Introdueix un número enter:"
Llegir n
Si (n mòdul 2) = 0 llavors
Escriure "És parell"
Si no
Escriure "És senar"
FiSi
FiAlgorisme
L’operació mòdul dona el residu d’una divisió. Si el residu de dividir per 2 és zero, el número és parell. El mateix algorisme, en diagrama de flux:
flowchart TD
inici([Inici]) --> lec[/"Llegir n"/]
lec --> dec{"n mòdul 2 = 0?"}
dec -->|Sí| par[/"Escriure 'És parell'"/]
dec -->|No| sen[/"Escriure 'És senar'"/]
par --> fi([Final])
sen --> fi
1.5 El cicle de vida del programari
Un programa real no neix de cop. Es construeix seguint unes fases. Aquest procés s’anomena cicle de vida del programari. Encara que hi ha diferents models, gairebé tots inclouen aquestes fases:
flowchart TD
A["1 · Anàlisi<br/>Què ha de fer?"] --> B["2 · Disseny<br/>Com ho farà?"]
B --> C["3 · Codificació<br/>Escriure el programa"]
C --> D["4 · Proves<br/>Funciona bé?"]
D --> E["5 · Manteniment<br/>Corregir i millorar"]
E -.->|nous requisits| A
- Anàlisi. Entenem el problema i decidim què ha de fer el programa (els requisits).
- Disseny. Decidim com ho farà: dissenyem els algorismes i l’estructura.
- Codificació. Traduïm el disseny a un llenguatge de programació. És el que la gent associa a “programar”, però és només una fase.
- Proves. Comprovem que el programa fa el que ha de fer i busquem errors.
- Manteniment. Un cop en marxa, cal corregir errors nous i afegir millores.
En projectes reals, l’anàlisi, el disseny i les proves ocupen molt més temps que la codificació. Un bon algorisme pensat abans t’estalvia hores d’esmenar codi després.
Errors: la realitat de programar
Programar és equivocar-se i corregir. Hi ha tres grans tipus d’errors que trobaràs:
| Tipus d’error | Quan apareix | Exemple |
|---|---|---|
| Sintàctic | En escriure el codi; l’ordinador no l’entén | Oblidar un símbol obligatori |
| D’execució | Quan el programa corre i peta | Dividir per zero |
| Lògic | El programa corre, però el resultat és incorrecte | Sumar quan calia restar |
Els lògics són els més perillosos: el programa no es queixa, però dona resultats erronis. Un bon algorisme, ben traçat des del principi, ajuda a evitar-los.
1.6 Resum
- Programar és donar a l’ordinador una seqüència de passos precisos per resoldre un problema. L’ordinador no té sentit comú: fa exactament el que li dius.
- Cal distingir problema (què vull), algorisme (com ho faré) i programa (el codi executable). Sempre en aquest ordre.
- Un bon algorisme és precís, finit, definit, i té entrada i sortida.
- Tot algorisme es construeix combinant tres estructures: seqüència, selecció i repetició.
- El pseudocodi i el diagrama de flux expressen el mateix algorisme: un amb text estructurat, l’altre amb figures.
- El cicle de vida del programari té fases (anàlisi, disseny, codificació, proves, manteniment); la codificació n’és només una part.
- Hi ha errors sintàctics, d’execució i lògics; els lògics són els més difícils de detectar..