• Non ci sono risultati.

Osservazioni sul Osservazioni sul primo laboratorio primo laboratorio

N/A
N/A
Protected

Academic year: 2021

Condividi "Osservazioni sul Osservazioni sul primo laboratorio primo laboratorio"

Copied!
13
0
0

Testo completo

(1)

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/

(2)

Algoritmi su Array 2

(3)

Algoritmi su Array 3

Da evitare

if ( A && B && C && D ) { blah( );

] if ( A ) {

if ( B ) { if ( C ) { if ( D ) { blah( );

} } } ]

(4)

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) { ...

(5)

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

(6)

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);

} } }

(7)

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

(8)

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...

(9)

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

(10)

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;

}

(11)
(12)

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!

(13)

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!

Riferimenti

Documenti correlati

I profili dell’impulso utilizzati nei tre modelli temporali della Vela pulsar sono riportati in figura 2.4 e corrispondono in ordine: al fit del profilo osservato da Fermi-LAT

Primo appello di Laboratorio di Matematica.. 6

Per dimostrare la tesi basta verificare che due coefficienti adiacenti di P non possono essere

Primo appello di Laboratorio di Matematica.. 14

Primo appello di Laboratorio di Matematica.. 14

Problema 1. , n) converge ad un numero irrazionale positivo minore

diffusione Coulombiana multipla, Bremsstrahlung, effetto fotoelettrico, effetto Compton, produzione di coppie, sciami elettromagnetici, interazioni adroniche.. Interazioni

Per quanto riguarda l’utilizzo clinico, le problemati- che possono diversificarsi in base al fatto che siano considerati profili limitati, e comunque composti da autoantigeni già noti