Osservazioni sul Osservazioni sul primo laboratorio primo laboratorio
Moreno Marzolla
Dipartimento di Informatica—Scienza e Ingegneria (DISI) Università di Bologna https://www.moreno.marzolla.name/
Algoritmi su Array 2
Algoritmi su Array 3
Da evitare
if ( A && B && C && D ) { blah( );
] if ( A ) {
if ( B ) { if ( C ) { if ( D ) { blah( );
} } } ]
Algoritmi su Array 4
Da evitare
● Se la stessa sequenza di istruzioni si ripete "quasi uguale" diverse volte, indica che qualcosa non va
void mossa(char s[3][3], int p) {
if (p == 0) {
if (s[0][0] == '*') s[0][0] = '.' else s[0][0] = '*';
if (s[0][1] == '*') s[0][1] = '.' else s[0][1] = '*';
if (s[1][0] == '*') s[1][0] = '.' else s[1][0] = '*';
if (s[1][1] == '*') s[1][1] = '.' else s[1][1] = '*';
} else if (p == 1) {
if (s[0][0] == '*') s[0][0] = '.' else s[0][0] = '*';
if (s[0][1] == '*') s[0][1] = '.' else s[0][1] = '*';
if (s[0][2] == '*') s[0][2] = '.' else s[0][2] = '*';
} else if (p == 2) { ...
Algoritmi su Array 5
Da evitare
● Se la stessa sequenza di istruzioni si ripete "quasi uguale" diverse volte, indica che qualcosa non va
void inverti(int s[3][3], int i, int j) {
s[i][j] = 1 – s[i][j];
}
void mossa(int s[3][3], int p) {
if (p == 0) {
inverti(s, 0, 0);
inverti(s, 0, 1);
inverti(s, 1, 0);
inverti(s, 1, 1);
} else if (p == 1) { inverti(s, 0, 0);
inverti(s, 0, 1);
inverti(s, 0, 2);
} else if (p == 2) { ...
meglio, ma sempre
Algoritmi su Array 6
Spostare la logica nei dati
● In casi come questo può essere utile spostare la
logica del programma "nei dati" anziché nelle istruzioni
int nbor[9][3][3] =
{{1, 1, 0}, /* vicini cella 0 */
{1, 1, 0}, {0, 0, 0}},
{{1, 1, 1}, /* vicini cella 1 */
{0, 0, 0}, {0, 0, 0}}, …
}
void mossa(int s[3][3], int p) {
int i, j;
for (i=0; i<3; i++) { for (j=0; j<3; j++) {
if (nbor[p][i][j]) inverti(s, i, j);
} } }
Algoritmi su Array 7
Esempio
● Il sindaco di Paperopoli ha deciso di tassare i residenti in base al reddito.
● Detto R il reddito lordo annuo, l'importo dovuto in tasse è (R ´ x), dove x dipende da R secondo la seguente tabella
– Se 0 ≤ R < 10000 → x = 0.05
– Se 10000 ≤ R < 22000 → x = 0.11
– Se 22000 ≤ R → x = 0.15
● Scrivere un programma in C che chiede all'utente di inserire il reddito R (tipo double; se l'utente inserisce un valore negativo, richiederlo), e stampa l'importo
dovuto in tasse
Algoritmi su Array 8
/* tasse-1.c */
#include <stdio.h>
int main( void ) {
double R, x;
do {
printf("Inserire reddito R\n");
scanf("%lf", &R);
} while (R < 0);
if ( R < 10000.0) { x = 0.05;
} else {
if ( R < 22000.0 ) { x = 0.11;
} else {
x = 0.15;
} }
printf("Le tasse dovute ammontano a %f\n", R*x);
return 0;
}
Primo tentativo: funziona, ma...
Algoritmi su Array 9
Un bel giorno...
● Vista la situazione disastrata delle finanze di
Paperopoli, il sindaco decide di introdurre nuovi scaglioni:
– Se 0 ≤ R < 10000 → x = 0.05
– Se 10000 ≤ R < 22000 → x = 0.11
– Se 22000 ≤ R < 35000 → x = 0.15
– Se 35000 ≤ R < 45000 → x = 0.17
– Se 45000 ≤ R < 57000 → x = 0.20
– Se 57000 ≤ R → x = 0.25
● Modificare il programma precedente per funzionare correttamente nella nuova situazione
Algoritmi su Array 10 /* tasse-2.c */
#include <stdio.h>
int main( void ) { double R, x;
do {
printf("Inserire reddito R\n");
scanf("%lf", &R);
} while (R < 0);
if ( R < 10000.0) { x = 0.05;
} else {
if ( R < 22000.0 ) { x = 0.11;
} else {
if ( R < 35000.0 ) { x = 0.15;
} else {
if ( R < 45000.0 ) { x = 0.17;
} else {
if ( R < 57000.0 ) { x = 0.20;
} else {
x = 0.25;
} } }
}
}printf("Le tasse dovute ammontano a %f\n", R*x);
return 0;
}
Algoritmi su Array 12
Idea
● Memorizzo gli scaglioni e le relative percentuali in una tabella
– cioè in un array
● Dato il reddito R, cerco nell'array lo scaglione
corrispondente e da questo ricava la percentuale
● Se gli estremi degli scaglioni e/o le percentuali cambiano, devo cambiare solo l'array e non il programma che fa la ricerca!
Algoritmi su Array 13
/* tasse-4.c */
#include <stdio.h>
int main( void ) {
double scaglioni[]={ 0.0, 10000.0, 22000.0, 35000.0, 45000.0, 57000.0};
double imposta[] ={0.05, 0.11, 0.15, 0.17, 0.20, 0.25};
const int N = sizeof(scaglioni) / sizeof(scaglioni[0]);
double R, x;
int i;
do {
printf("Inserire reddito R\n");
scanf("%lf", &R);
} while (R < 0);
for (i=N-1; R < scaglioni[i]; i--) ; x = imposta[i];
printf("Le tasse dovute ammontano a %f (imposta=%f%%)\n", R*x, x*100);
return 0;
}
Nuova soluzione
scaglioni[i] è il limite inferiore dello scaglione i-esimo (inizio
a contare da i = 0).
imposta[i] è la percentuale di tasse per i redditi appartenenti
allo scaglione i-esimo
Corpo del ciclo "for" vuoto!