SlideShare a Scribd company logo
Laziness,
Dumbness,
and Functions
“Good Programmers Are
Lazy and Dumb”
http://blogoscoped.com/archive/2005-08-24-n14.html
Il programmatore deve essere pigro….
● Perché sono così può evitare di scrivere codice lungo, monotono, ripetitivo,
duplicato.
● Perché il codice prodotto motivato dalla pigrizia permette di sviluppare codice
molto più in fretta (lasciando tempo per altre cose)
Il programmatore deve essere stupido….
● Perché se è troppo furbo (o almeno lo crede) smetterà di imparare
● Perché se è troppo furbo (o almeno lo crede) smetterà di essere critico verso
il proprio lavoro
Real Life
Come diventare
programmatori pigri e
stupidi?
Facendo pratica!
“Practice makes perfect”
Primo trucchetto
int max=0;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
printf(“Il massimo e’%d”,x);
Usare i cicli
int max=0;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
printf(“Il massimo e’%d”,x)
int max=0,i=0;
while(i<5) {
cin>>x; if (max<x) max=x;
i++; }
printf(“Il massimo e’%d”,x)
Usare i cicli, ancora meglio
int max=0;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
cin>>x; if (max<x) max=x;
printf(“Il massimo e’%d”,x)
int max=0,i;
for (i=0;i<5;i++) {
cin>>x; if (max<x) max=i;
}
printf(“Il massimo e’%d”,x)
Ma si può fare di meglio
….usando le funzioni
A che servono le funzioni - RIUSABILITA’
Una volta scritta, una funzione può essere utilizzata più e più
volte. Tanto che molte funzioni sono fornite dai compilatori
proprio per questo motivo. Immaginate di NON avere la
funzione “radice quadrata”....ogni volta dovreste riscrivere
tutto daccapo, con grande noia e rischio di errore. Peggio
ancora per funzioni come cin/scanf eccetera.
A che servono le funzioni - ASTRAZIONE
Molto spesso i dettagli di una particolare operazione non ci interessano.
L’importante non è che una funzione usi un algoritmo particolare, un certo
linguaggio, ci importa che funzioni. In particolare dobbiamo sapere
1. Il NOME della funzione
2. Che cosa fa.
3. Che cosa dobbiamo comunicare alla funzione perché possa operare
4. Che tipo di risultati ci restituisce
Esempio: Radice quadrata
Molto spesso i dettagli di una particolare operazione non ci interessano.
L’importante non è che una funzione usi un algoritmo particolare, un certo
linguaggio, ci importa che funzioni. In particolare dobbiamo sapere
1. Il NOME della funzione: sqrt
2. Che cosa fa: calcola la radice quadrata
3. Che cosa dobbiamo comunicare alla funzione perché possa operare: un
numero positivo
4. Che tipo di risultati ci restituisce: un valore (double) che contiene il
risultato.
Formalmente
Molto spesso i dettagli di una particolare operazione non ci interessano.
L’importante non è che una funzione usi un algoritmo particolare, un certo
linguaggio, ci importa che funzioni. In particolare dobbiamo sapere
1. NOME: sqrt
2. DOCUMENTAZIONE: calcola la radice quadrata
3. PARAMETRI IN INGRESSO: double (positivo)
4. PARAMETRI IN USCITA (return): double
Applichiamolo qui:
int main() {
double a,b,c,x1,x2,delta;
cout<<"Inserisci il valore di A:";
cin>>a;
cout<<"Inserisci il valore di B:";
cin>>b;
cout<<"Inserisci il valore di C:";
cin>>c;
delta = ((b*b)-(4*a*c));
x1 = (-(b)-(sqrt (delta))) /(2*a);
x2 = (-(b)+(sqrt (delta))) /(2*a);
if (delta == 0)
cout<<"Le soluzioni sono coincidenti:
x1:"<<x1<<" x2:"<<x2<<endl;
else if (delta < 0)
cout<<"Non ci sono soluzioni
reali"<<endl;
else
cout<<"Le soluzioni sono: x1:"<<x1<<"
x2:"<<x2<<endl;
}
Applichiamolo qui:
int main() {
double a,b,c,x1,x2,delta;
cout<<"Inserisci il valore di A:";
cin>>a;
cout<<"Inserisci il valore di B:";
cin>>b;
cout<<"Inserisci il valore di C:";
cin>>c;
delta = ((b*b)-(4*a*c));
x1 = (-(b)-(sqrt (delta))) /(2*a);
x2 = (-(b)+(sqrt (delta))) /(2*a);
if (delta == 0)
cout<<"Le soluzioni sono coincidenti:
x1:"<<x1<<" x2:"<<x2<<endl;
else if (delta < 0)
cout<<"Non ci sono soluzioni
reali"<<endl;
else
cout<<"Le soluzioni sono: x1:"<<x1<<"
x2:"<<x2<<endl;
}
Applichiamolo qui:
int main() {
double a,b,c,x1,x2,delta;
cout<<"Inserisci il valore di A:";
cin>>a;
cout<<"Inserisci il valore di B:";
cin>>b;
cout<<"Inserisci il valore di C:";
cin>>c;
delta = ((b*b)-(4*a*c));
x1 = (-(b)-(sqrt (delta))) /(2*a);
….
double inserisci() {
double valore;
cout <<"Inserisci il valore: ";
cin>>valore;
return valore;
}
Applichiamolo qui:
int main() {
double a,b,c,x1,x2,delta;
a=inserisci();
b=inserisci();
c=inserisci();
delta = ((b*b)-(4*a*c));
x1 = (-(b)-(sqrt (delta))) /(2*a);
….
double inserisci() {
double valore;
cout <<"Inserisci il valore: ";
cin>>valore;
return valore;
}
Applichiamolo qui:
int main() {
double a,b,c,x1,x2,delta;
a=inserisci();
b=inserisci();
c=inserisci();
delta = ((b*b)-(4*a*c));
x1 = (-(b)-(sqrt (delta))) /(2*a);
….
double inserisci(char lettera) {
double valore;
cout <<"Inserisci il valore: "<<lettera<<” ”;
cin>>valore;
return valore;
}
Applichiamolo qui:
int main() {
double a,b,c,x1,x2,delta;
a=inserisci(‘A’);
b=inserisci(‘B’);
c=inserisci(‘C’);
delta = ((b*b)-(4*a*c));
x1 = (-(b)-(sqrt (delta))) /(2*a);
….
double inserisci(char lettera) {
double valore;
cout <<"Inserisci il valore: "<<lettera<<” ”;
cin>>valore;
return valore;
}
Pensarci prima, durante o
dopo?
...dipende...
Prima: approccio top-down (metodo “Hitler”)
Si prende un problema e si cerca di “spaccarlo” un problema difficile in tanti
problemi più facili, scomponendo il problema principale in problemi che sappiamo
risolvere.
Se un passo è troppo difficile, scomponiamolo ancora. Molto intuitivo.
Modello di sviluppo tradizionale, tipico del C e dei linguaggi procedurali (Fortran,
Pascal, C/C++)
Richiede di aver capito bene il problema generale. Può generare passi inutili o si
rischia di perdersi.
Stampa la
media di N
numeri interi
leggi_N;
leggi N
numeri e
calcolane la
somma;
calcola
media;
stampa_risu
ltato;
Stampa la
media di N
numeri interi
leggi_N;
leggi N
numeri e
calcolane la
somma
calcola
media;
stampa_risu
ltato;
Stampa la
media di N
numeri interi
leggi_N;
leggi N
numeri e
calcolane la
somma
calcola
media;
stampa_risu
ltato;
int leggi_N();
int leggi_somma(N);
double
c_media(N,somma);
void stampa(media);
Stampa la
media di N
numeri interi
leggi_N;
leggi N
numeri e
calcolane la
somma
calcola
media;
stampa_risu
ltato;
int leggi_N();
int leggi_somma(N);
double
c_media(N,somma);
void stampa(media);
void main() {
int n; double somma,media;
n=leggi_N();
somma=leggi_somma(N);
media=c_media(n,somma);
stampa(media);
}
Dopo: approccio bottom-up (metodo “Minecraft”)
Si considera un problema esaminando un singolo aspetto in grande dettaglio. “Per
fare un tavolo ci vuole il legno, per fare il legno ci vuole l'albero, per fare l'albero ci
vuole il seme…”
I componenti sono poi combinati per ottenere strumenti più complessi. Molto
spesso i risultati sono riutilizzabili in altri programmi.
Modello di sviluppo a oggetti, tipico di Java, C#, Ruby
Spesso non si ha una visione di insieme. Mettere assieme i pezzi può risultare
difficile.
Stampa la
media di N
numeri interi
stampare
messaggi
calcolare il
totale di
una
sequenza di
N numeri
calcolare
media
leggere un
intero
Stampa la
media di N
numeri interi
stampare
messaggi
calcolare il
totale di
una
sequenza di
N numeri
calcolare
media
leggere un
intero
void
s_inserisci_numero;
void st_media(double
media);
double
sommasequenza(int N);
double
c_media(somma,N);
int leggi_intero(int N);
Stampa la
media di N
numeri interi
stampare
messaggi
calcolare il
totale di
una
sequenza di
N numeri
calcolare
media
leggere un
intero
void
s_inserisci_numero;
void st_media(double
media);
double
sommasequenza(int N);
double
c_media(somma,N);
int leggi_intero(int N);
void main() {
int somma, n; double, media;
s_inseriscinumero();
n=inserisci_numero();
somma=sommasequenza(n);
media=c_media(n,somma);
st_media(media);
}
Durante: approccio iterativo (metodo “Chaos”)
Si crea una soluzione, che “più o meno va” e risolve “alcuni” problemi. Fatto
questo, si migliora la soluzione (a) aggiungendo più risultati (b) risolvendo casi
speciali/complicati (c) rendendo il codice più semplice.
Modello di sviluppo agile, utilizzato soprattutto nelle startup. Nella versione
peggiore, si trasforma nel “Cowboy programming”, assolutamente da evitare.
Si tratta di un metodo che può confondere molto i programmatori principianti, per
cui vi sconsiglio di applicarlo...per il momento. Ne riparleremo l’anno prossimo. O
tra due. Remember, Chaos rulez!
Esercizi...per le vacanze!
Prendete uno di questi problemi DIFFICILI. Scegliete un approccio TOP-DOWN o
BOTTOM-UP. Scrivete quindi la strutturazione in funzioni, indicando anche i
parametri. NON DOVETE SCRIVERE CODICE. Vi voglio pigri e stupidi (ma non
troppo).
● Programma che gestisce il gioco dell’oca a 4 giocatori.
● Programma che stampa tutte le tessere del domino, da ritagliare per giocarci.
● Programma che sceglie la miglior carta da giocare di una partita di briscola,
come primo o secondo giocatore, sapendo
○ Le carte in mano
○ Le carte sul tavolo (incluso la briscola sul tavolo, e quante carte mancano)
○ Quanti punti ho fatto
○ Se sono il primo o il secondo giocatore.

More Related Content

What's hot

Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatoriMajong DevJfu
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourse
rik0
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturatiMajong DevJfu
 
5 Strutture Iterative
5   Strutture Iterative5   Strutture Iterative
5 Strutture Iterativeguest60e9511
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)STELITANO
 
9 Altre Istruzioni Di I O
9   Altre Istruzioni Di I O9   Altre Istruzioni Di I O
9 Altre Istruzioni Di I Oguest60e9511
 
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimentiMajong DevJfu
 
03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++Majong DevJfu
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++
Ilio Catallo
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
Pasquale Paola
 
13 Puntatori E Memoria Dinamica
13   Puntatori E Memoria Dinamica13   Puntatori E Memoria Dinamica
13 Puntatori E Memoria Dinamicaguest60e9511
 
09 - Programmazione: Ingegneria del Codice
09 - Programmazione: Ingegneria del Codice09 - Programmazione: Ingegneria del Codice
09 - Programmazione: Ingegneria del CodiceMajong DevJfu
 
Gcc & Make
Gcc & MakeGcc & Make
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2Majong DevJfu
 
05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioniPiero Fraternali
 
Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012STELITANO
 

What's hot (20)

Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Pycrashcourse
PycrashcoursePycrashcourse
Pycrashcourse
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati
 
5 Strutture Iterative
5   Strutture Iterative5   Strutture Iterative
5 Strutture Iterative
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)
 
9 Altre Istruzioni Di I O
9   Altre Istruzioni Di I O9   Altre Istruzioni Di I O
9 Altre Istruzioni Di I O
 
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti08 - Programmazione: Passaggio valori tra funzioni per riferimenti
08 - Programmazione: Passaggio valori tra funzioni per riferimenti
 
03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++03 - Programmazione: Istruzioni C++
03 - Programmazione: Istruzioni C++
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
13 Puntatori E Memoria Dinamica
13   Puntatori E Memoria Dinamica13   Puntatori E Memoria Dinamica
13 Puntatori E Memoria Dinamica
 
09 - Programmazione: Ingegneria del Codice
09 - Programmazione: Ingegneria del Codice09 - Programmazione: Ingegneria del Codice
09 - Programmazione: Ingegneria del Codice
 
Gcc & Make
Gcc & MakeGcc & Make
Gcc & Make
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2
 
05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni
 
07 2 ricorsione
07 2 ricorsione07 2 ricorsione
07 2 ricorsione
 
Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012
 
07 1 funzioni
07 1 funzioni07 1 funzioni
07 1 funzioni
 

Similar to Vogliamo programmatori stupidi e pigri!

Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)STELITANO
 
Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)STELITANO
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Sergio Porcu
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
Laboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabiliLaboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabiliMajong DevJfu
 
Let's give it a GO!
Let's give it a GO!Let's give it a GO!
Let's give it a GO!
MarioTraetta
 
Algorithmist guide II
Algorithmist guide IIAlgorithmist guide II
Algorithmist guide II
Marcello Missiroli
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)STELITANO
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
Pietro Di Bello
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio cughetta
 
Pycrashcourse3.0
Pycrashcourse3.0Pycrashcourse3.0
Pycrashcourse3.0rik0
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolare
PyCon Italia
 
What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018
Marco Parenzan
 
Fondamenti di Informatica - Esercitazione3 (1).pdf
Fondamenti di Informatica - Esercitazione3 (1).pdfFondamenti di Informatica - Esercitazione3 (1).pdf
Fondamenti di Informatica - Esercitazione3 (1).pdf
lorenzosalvi30
 
Pycrashcourse3.1
Pycrashcourse3.1Pycrashcourse3.1
Pycrashcourse3.1rik0
 
08 mapreduce
08   mapreduce08   mapreduce
08 mapreduce
Davide Carboni
 
Laboratorio Programmazione: Operatori logici
Laboratorio Programmazione: Operatori logiciLaboratorio Programmazione: Operatori logici
Laboratorio Programmazione: Operatori logiciMajong DevJfu
 
Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)STELITANO
 
Rest sdk
Rest sdkRest sdk
Rest sdk
Raffaele Rialdi
 

Similar to Vogliamo programmatori stupidi e pigri! (20)

Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)
 
Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)Lezione 6 (12 marzo 2012)
Lezione 6 (12 marzo 2012)
 
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeuticiAlgoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
Laboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabiliLaboratorio Programmazione: In - Out variabili
Laboratorio Programmazione: In - Out variabili
 
Let's give it a GO!
Let's give it a GO!Let's give it a GO!
Let's give it a GO!
 
Algorithmist guide II
Algorithmist guide IIAlgorithmist guide II
Algorithmist guide II
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)
 
A brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA eventA brief intro to TDD for a JUG-TAA event
A brief intro to TDD for a JUG-TAA event
 
Caratteristiche del linguaggio c
Caratteristiche del linguaggio cCaratteristiche del linguaggio c
Caratteristiche del linguaggio c
 
Pycrashcourse3.0
Pycrashcourse3.0Pycrashcourse3.0
Pycrashcourse3.0
 
Spyppolare o non spyppolare
Spyppolare o non spyppolareSpyppolare o non spyppolare
Spyppolare o non spyppolare
 
What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018
 
Fondamenti di Informatica - Esercitazione3 (1).pdf
Fondamenti di Informatica - Esercitazione3 (1).pdfFondamenti di Informatica - Esercitazione3 (1).pdf
Fondamenti di Informatica - Esercitazione3 (1).pdf
 
7 Sottoprogrammi
7   Sottoprogrammi7   Sottoprogrammi
7 Sottoprogrammi
 
Pycrashcourse3.1
Pycrashcourse3.1Pycrashcourse3.1
Pycrashcourse3.1
 
08 mapreduce
08   mapreduce08   mapreduce
08 mapreduce
 
Laboratorio Programmazione: Operatori logici
Laboratorio Programmazione: Operatori logiciLaboratorio Programmazione: Operatori logici
Laboratorio Programmazione: Operatori logici
 
Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)
 
Rest sdk
Rest sdkRest sdk
Rest sdk
 

More from Marcello Missiroli

Guida del perfetto Algoritmista I
Guida del perfetto Algoritmista IGuida del perfetto Algoritmista I
Guida del perfetto Algoritmista I
Marcello Missiroli
 
Workshop: Introduzione ad TDD
Workshop: Introduzione ad TDDWorkshop: Introduzione ad TDD
Workshop: Introduzione ad TDD
Marcello Missiroli
 
Dal c a Java (3/3)
Dal c a Java (3/3)Dal c a Java (3/3)
Dal c a Java (3/3)
Marcello Missiroli
 
Dal C a Java (2/3)
Dal C a Java (2/3)Dal C a Java (2/3)
Dal C a Java (2/3)
Marcello Missiroli
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
Marcello Missiroli
 
Variabili
VariabiliVariabili
Sviluppo degli algoritmi
Sviluppo degli algoritmiSviluppo degli algoritmi
Sviluppo degli algoritmi
Marcello Missiroli
 
5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo
Marcello Missiroli
 
Big O Notation
Big O NotationBig O Notation
Big O Notation
Marcello Missiroli
 
Insegnare Agile
Insegnare AgileInsegnare Agile
Insegnare Agile
Marcello Missiroli
 
The Sequel to sql
The Sequel to sqlThe Sequel to sql
The Sequel to sql
Marcello Missiroli
 
L'avvento del programmatore sociale
L'avvento del programmatore socialeL'avvento del programmatore sociale
L'avvento del programmatore sociale
Marcello Missiroli
 
Il ciclo for
Il ciclo forIl ciclo for
Il ciclo for
Marcello Missiroli
 
Lo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in JavaLo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in Java
Marcello Missiroli
 
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Marcello Missiroli
 
Controllo di versione e Git
Controllo di versione e GitControllo di versione e Git
Controllo di versione e Git
Marcello Missiroli
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
Marcello Missiroli
 
Moodle: i compiti (homework)
Moodle: i compiti (homework)Moodle: i compiti (homework)
Moodle: i compiti (homework)
Marcello Missiroli
 
Uefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il maleUefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il male
Marcello Missiroli
 
Corso Moodle: presentazione
Corso Moodle: presentazioneCorso Moodle: presentazione
Corso Moodle: presentazione
Marcello Missiroli
 

More from Marcello Missiroli (20)

Guida del perfetto Algoritmista I
Guida del perfetto Algoritmista IGuida del perfetto Algoritmista I
Guida del perfetto Algoritmista I
 
Workshop: Introduzione ad TDD
Workshop: Introduzione ad TDDWorkshop: Introduzione ad TDD
Workshop: Introduzione ad TDD
 
Dal c a Java (3/3)
Dal c a Java (3/3)Dal c a Java (3/3)
Dal c a Java (3/3)
 
Dal C a Java (2/3)
Dal C a Java (2/3)Dal C a Java (2/3)
Dal C a Java (2/3)
 
Dal C a Java (1/3)
Dal C a Java (1/3)Dal C a Java (1/3)
Dal C a Java (1/3)
 
Variabili
VariabiliVariabili
Variabili
 
Sviluppo degli algoritmi
Sviluppo degli algoritmiSviluppo degli algoritmi
Sviluppo degli algoritmi
 
5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo5 stadi dello sviluppo di un gruppo
5 stadi dello sviluppo di un gruppo
 
Big O Notation
Big O NotationBig O Notation
Big O Notation
 
Insegnare Agile
Insegnare AgileInsegnare Agile
Insegnare Agile
 
The Sequel to sql
The Sequel to sqlThe Sequel to sql
The Sequel to sql
 
L'avvento del programmatore sociale
L'avvento del programmatore socialeL'avvento del programmatore sociale
L'avvento del programmatore sociale
 
Il ciclo for
Il ciclo forIl ciclo for
Il ciclo for
 
Lo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in JavaLo stack: tipo di dato astratto e implementazione in Java
Lo stack: tipo di dato astratto e implementazione in Java
 
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
 
Controllo di versione e Git
Controllo di versione e GitControllo di versione e Git
Controllo di versione e Git
 
Ruby in 25 minuti
Ruby in 25 minutiRuby in 25 minuti
Ruby in 25 minuti
 
Moodle: i compiti (homework)
Moodle: i compiti (homework)Moodle: i compiti (homework)
Moodle: i compiti (homework)
 
Uefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il maleUefi: l'eterna lotta tra il bene e il male
Uefi: l'eterna lotta tra il bene e il male
 
Corso Moodle: presentazione
Corso Moodle: presentazioneCorso Moodle: presentazione
Corso Moodle: presentazione
 

Vogliamo programmatori stupidi e pigri!

  • 2. “Good Programmers Are Lazy and Dumb” http://blogoscoped.com/archive/2005-08-24-n14.html
  • 3. Il programmatore deve essere pigro…. ● Perché sono così può evitare di scrivere codice lungo, monotono, ripetitivo, duplicato. ● Perché il codice prodotto motivato dalla pigrizia permette di sviluppare codice molto più in fretta (lasciando tempo per altre cose)
  • 4. Il programmatore deve essere stupido…. ● Perché se è troppo furbo (o almeno lo crede) smetterà di imparare ● Perché se è troppo furbo (o almeno lo crede) smetterà di essere critico verso il proprio lavoro
  • 8. Primo trucchetto int max=0; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; printf(“Il massimo e’%d”,x);
  • 9. Usare i cicli int max=0; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; printf(“Il massimo e’%d”,x) int max=0,i=0; while(i<5) { cin>>x; if (max<x) max=x; i++; } printf(“Il massimo e’%d”,x)
  • 10. Usare i cicli, ancora meglio int max=0; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; cin>>x; if (max<x) max=x; printf(“Il massimo e’%d”,x) int max=0,i; for (i=0;i<5;i++) { cin>>x; if (max<x) max=i; } printf(“Il massimo e’%d”,x)
  • 11. Ma si può fare di meglio ….usando le funzioni
  • 12. A che servono le funzioni - RIUSABILITA’ Una volta scritta, una funzione può essere utilizzata più e più volte. Tanto che molte funzioni sono fornite dai compilatori proprio per questo motivo. Immaginate di NON avere la funzione “radice quadrata”....ogni volta dovreste riscrivere tutto daccapo, con grande noia e rischio di errore. Peggio ancora per funzioni come cin/scanf eccetera.
  • 13. A che servono le funzioni - ASTRAZIONE Molto spesso i dettagli di una particolare operazione non ci interessano. L’importante non è che una funzione usi un algoritmo particolare, un certo linguaggio, ci importa che funzioni. In particolare dobbiamo sapere 1. Il NOME della funzione 2. Che cosa fa. 3. Che cosa dobbiamo comunicare alla funzione perché possa operare 4. Che tipo di risultati ci restituisce
  • 14. Esempio: Radice quadrata Molto spesso i dettagli di una particolare operazione non ci interessano. L’importante non è che una funzione usi un algoritmo particolare, un certo linguaggio, ci importa che funzioni. In particolare dobbiamo sapere 1. Il NOME della funzione: sqrt 2. Che cosa fa: calcola la radice quadrata 3. Che cosa dobbiamo comunicare alla funzione perché possa operare: un numero positivo 4. Che tipo di risultati ci restituisce: un valore (double) che contiene il risultato.
  • 15. Formalmente Molto spesso i dettagli di una particolare operazione non ci interessano. L’importante non è che una funzione usi un algoritmo particolare, un certo linguaggio, ci importa che funzioni. In particolare dobbiamo sapere 1. NOME: sqrt 2. DOCUMENTAZIONE: calcola la radice quadrata 3. PARAMETRI IN INGRESSO: double (positivo) 4. PARAMETRI IN USCITA (return): double
  • 16. Applichiamolo qui: int main() { double a,b,c,x1,x2,delta; cout<<"Inserisci il valore di A:"; cin>>a; cout<<"Inserisci il valore di B:"; cin>>b; cout<<"Inserisci il valore di C:"; cin>>c; delta = ((b*b)-(4*a*c)); x1 = (-(b)-(sqrt (delta))) /(2*a); x2 = (-(b)+(sqrt (delta))) /(2*a); if (delta == 0) cout<<"Le soluzioni sono coincidenti: x1:"<<x1<<" x2:"<<x2<<endl; else if (delta < 0) cout<<"Non ci sono soluzioni reali"<<endl; else cout<<"Le soluzioni sono: x1:"<<x1<<" x2:"<<x2<<endl; }
  • 17. Applichiamolo qui: int main() { double a,b,c,x1,x2,delta; cout<<"Inserisci il valore di A:"; cin>>a; cout<<"Inserisci il valore di B:"; cin>>b; cout<<"Inserisci il valore di C:"; cin>>c; delta = ((b*b)-(4*a*c)); x1 = (-(b)-(sqrt (delta))) /(2*a); x2 = (-(b)+(sqrt (delta))) /(2*a); if (delta == 0) cout<<"Le soluzioni sono coincidenti: x1:"<<x1<<" x2:"<<x2<<endl; else if (delta < 0) cout<<"Non ci sono soluzioni reali"<<endl; else cout<<"Le soluzioni sono: x1:"<<x1<<" x2:"<<x2<<endl; }
  • 18. Applichiamolo qui: int main() { double a,b,c,x1,x2,delta; cout<<"Inserisci il valore di A:"; cin>>a; cout<<"Inserisci il valore di B:"; cin>>b; cout<<"Inserisci il valore di C:"; cin>>c; delta = ((b*b)-(4*a*c)); x1 = (-(b)-(sqrt (delta))) /(2*a); …. double inserisci() { double valore; cout <<"Inserisci il valore: "; cin>>valore; return valore; }
  • 19. Applichiamolo qui: int main() { double a,b,c,x1,x2,delta; a=inserisci(); b=inserisci(); c=inserisci(); delta = ((b*b)-(4*a*c)); x1 = (-(b)-(sqrt (delta))) /(2*a); …. double inserisci() { double valore; cout <<"Inserisci il valore: "; cin>>valore; return valore; }
  • 20. Applichiamolo qui: int main() { double a,b,c,x1,x2,delta; a=inserisci(); b=inserisci(); c=inserisci(); delta = ((b*b)-(4*a*c)); x1 = (-(b)-(sqrt (delta))) /(2*a); …. double inserisci(char lettera) { double valore; cout <<"Inserisci il valore: "<<lettera<<” ”; cin>>valore; return valore; }
  • 21. Applichiamolo qui: int main() { double a,b,c,x1,x2,delta; a=inserisci(‘A’); b=inserisci(‘B’); c=inserisci(‘C’); delta = ((b*b)-(4*a*c)); x1 = (-(b)-(sqrt (delta))) /(2*a); …. double inserisci(char lettera) { double valore; cout <<"Inserisci il valore: "<<lettera<<” ”; cin>>valore; return valore; }
  • 22. Pensarci prima, durante o dopo? ...dipende...
  • 23. Prima: approccio top-down (metodo “Hitler”) Si prende un problema e si cerca di “spaccarlo” un problema difficile in tanti problemi più facili, scomponendo il problema principale in problemi che sappiamo risolvere. Se un passo è troppo difficile, scomponiamolo ancora. Molto intuitivo. Modello di sviluppo tradizionale, tipico del C e dei linguaggi procedurali (Fortran, Pascal, C/C++) Richiede di aver capito bene il problema generale. Può generare passi inutili o si rischia di perdersi.
  • 24. Stampa la media di N numeri interi leggi_N; leggi N numeri e calcolane la somma; calcola media; stampa_risu ltato;
  • 25. Stampa la media di N numeri interi leggi_N; leggi N numeri e calcolane la somma calcola media; stampa_risu ltato;
  • 26. Stampa la media di N numeri interi leggi_N; leggi N numeri e calcolane la somma calcola media; stampa_risu ltato; int leggi_N(); int leggi_somma(N); double c_media(N,somma); void stampa(media);
  • 27. Stampa la media di N numeri interi leggi_N; leggi N numeri e calcolane la somma calcola media; stampa_risu ltato; int leggi_N(); int leggi_somma(N); double c_media(N,somma); void stampa(media); void main() { int n; double somma,media; n=leggi_N(); somma=leggi_somma(N); media=c_media(n,somma); stampa(media); }
  • 28. Dopo: approccio bottom-up (metodo “Minecraft”) Si considera un problema esaminando un singolo aspetto in grande dettaglio. “Per fare un tavolo ci vuole il legno, per fare il legno ci vuole l'albero, per fare l'albero ci vuole il seme…” I componenti sono poi combinati per ottenere strumenti più complessi. Molto spesso i risultati sono riutilizzabili in altri programmi. Modello di sviluppo a oggetti, tipico di Java, C#, Ruby Spesso non si ha una visione di insieme. Mettere assieme i pezzi può risultare difficile.
  • 29. Stampa la media di N numeri interi stampare messaggi calcolare il totale di una sequenza di N numeri calcolare media leggere un intero
  • 30. Stampa la media di N numeri interi stampare messaggi calcolare il totale di una sequenza di N numeri calcolare media leggere un intero void s_inserisci_numero; void st_media(double media); double sommasequenza(int N); double c_media(somma,N); int leggi_intero(int N);
  • 31. Stampa la media di N numeri interi stampare messaggi calcolare il totale di una sequenza di N numeri calcolare media leggere un intero void s_inserisci_numero; void st_media(double media); double sommasequenza(int N); double c_media(somma,N); int leggi_intero(int N); void main() { int somma, n; double, media; s_inseriscinumero(); n=inserisci_numero(); somma=sommasequenza(n); media=c_media(n,somma); st_media(media); }
  • 32. Durante: approccio iterativo (metodo “Chaos”) Si crea una soluzione, che “più o meno va” e risolve “alcuni” problemi. Fatto questo, si migliora la soluzione (a) aggiungendo più risultati (b) risolvendo casi speciali/complicati (c) rendendo il codice più semplice. Modello di sviluppo agile, utilizzato soprattutto nelle startup. Nella versione peggiore, si trasforma nel “Cowboy programming”, assolutamente da evitare. Si tratta di un metodo che può confondere molto i programmatori principianti, per cui vi sconsiglio di applicarlo...per il momento. Ne riparleremo l’anno prossimo. O tra due. Remember, Chaos rulez!
  • 33. Esercizi...per le vacanze! Prendete uno di questi problemi DIFFICILI. Scegliete un approccio TOP-DOWN o BOTTOM-UP. Scrivete quindi la strutturazione in funzioni, indicando anche i parametri. NON DOVETE SCRIVERE CODICE. Vi voglio pigri e stupidi (ma non troppo). ● Programma che gestisce il gioco dell’oca a 4 giocatori. ● Programma che stampa tutte le tessere del domino, da ritagliare per giocarci. ● Programma che sceglie la miglior carta da giocare di una partita di briscola, come primo o secondo giocatore, sapendo ○ Le carte in mano ○ Le carte sul tavolo (incluso la briscola sul tavolo, e quante carte mancano) ○ Quanti punti ho fatto ○ Se sono il primo o il secondo giocatore.