Problema ‘Tariffa telefonica’

Problema. Un piano telefonico per una chiamata voce prevede uno scatto alla risposta di 0,15 € e una tariffazione che per i primi cinque minuti di conversazione è pari a 0,12 €/min  e che per i minuti successivi si riduce a 0,08 €/min. La tariffazione, inoltre, viene applicata a scatti anticipati della durata di 30 sec.
Progettare l’algoritmo che calcola il costo di una telefonata, nota la durata della conversazione espressa in secondi (durata >0).

Ipotesi semplificativa. È possibile utilizzare gli operatori ‘/’ (backslash) e ‘MOD’ (o ‘%’) che calcolano rispettivamente il quoziente e il resto della divisione fra 2 numeri interi.

Soluzione proposta #1
L’obiettivo è calcolare il costo di una telefonata che dipende dalla durata della conversazione secondo lo schema della figura seguente: sono previste due fasce di tariffazione che, in funzione della durata della conversazione, sono individuate da un valore di soglia (s) pari a 5 min.

Piano tariffarioSi deve inoltre tener presente che viene applicata una tariffazione a scatti anticipati di 30sec., pertanto all’interno di ciascuna fascia il calcolo del costo della telefonata dipenderà:

  1. dai minuti interi di conversazione (min);
  2. dai secondi di conversazione che per comodità, per distinguerli da quelli che compongono i minuti interi, chiameremo secondi residui (sec);

in modo che:

  • a partire dal 1° secondo residuo fino al 30° si pagherà uno scatto anticipato di 30 sec. (ossia ai minuti interi di conversazione si aggiungerà ½ min);
  • a partire dal 31° secondo residuo fino al 59° si pagheranno due scatti anticipati di 30 sec. (ossia ai minuti interi di conversazione si aggiungerà 1 min).

Durante la discussione sono stati individuati alcuni dati per la cui manipolazione si introducono le variabili e le costanti descritte nelle tabelle seguenti.

Tabella delle variabiliTabella delle costanti

Per procedere nell’analisi del problema può essere utile individuare alcuni casi particolari che possano aiutarci nella generalizzazione della soluzione, per esempio:

1) nel caso di una conversazione con una durata pari a Xmin ≤ 5min viene applicata solo la tariffa t1 e potrebbe valere la pena distinguere i seguenti tre casi particolari:

a) con durata = Xmin0sec     (cioè, con secondi residui = 0) si ha che:
costo = sRisposta + X*t1

b) con durata = Xmin 20sec       (cioè, con 0< secondi residui  ≤30) si ha che:
costo = sRisposta+ X*t1 + il costo di 1 scatto anticipato,
ossia agli Xmin si aggiunge 0,5 min con tariffa t1, quindi:
costo = sRisposta + (X+0,5)*t1

c) con durata = Xmin 45sec       (cioè, con secondi residui >30) si ha che:
costo = sRisposta+ X*t1 + il costo di 2 scatti anticipati,
ossia agli Xmin si aggiunge 1 min con tariffa t1, quindi:
costo = sRisposta + (X+1)*t1

 2) nel caso di una conversazione con una durata pari a Xmin > 5min vengono applicate entrambe le tariffe t1 e t2 e potrebbe valere la pena distinguere i seguenti tre casi particolari:

 a) con durata =Xmin0sec       (cioè, con secondi residui = 0) si ha che:
costo = sRisposta + s*t1 + (X – s)*t2

b) con durata = Xmin 25sec      (cioè, con secondi residui >30)
si ha che: costo = sRisposta+ s*t1 + (X – s)*t2 + il costo di 1 scatto anticipato,
ossia agli X min si aggiunge 0,5 min con tariffa t2, quindi:
costo = sRisposta + s*t1 + (X – s + 0,5)*t2

c) con durata = Xmin 55sec       (cioè, con secondi residui >30) si ha che:
costo = sRisposta+ s*t1 + (X – s)*t2 + il costo di 2 scatti anticipati,
ossia agli  Xmin si aggiunge 1 min con tariffa t2, quindi:
costo= sRisposta + s*t1 + (X – s + 1)*t2

Dopo l’analisi del problema possiamo facilmente generalizzare la soluzione, così come viene descritto di seguito in flow chart.

Flow chart

Soluzione proposta #2
Lo stesso problema può essere risolto utilizzando una diversa strategia risolutiva che consiste nel concentrarsi sugli scatti della conversazione piuttosto che sui minuti interi di conversazione come abbiamo fatto prima.

Sfruttando gli operatori “/” e “MOD”, infatti, possiamo calcolare il numero di scatti della durata di 30 sec. (scatti) e gli eventuali secondi residui della conversazione (sec):

scatti = durata / 30
sec = durata MOD 30

Poiché viene applicata una tariffazione a scatti anticipati di 30sec, inoltre, nel caso in cui siano presenti dei secondi residui bisognerà aggiungere uno scatto anticipato agli scatti calcolati sopra. Per il calcolo del costo della telefonata, infine, basterà tener presente che gli scatti che ricadono nella prima fascia devono essere tariffati alla tariffa t1, mentre i restanti alla tariffa t2. Nel far questo bisognerà considerare che t1 e t2 rappresentano il costo di un minuto di conversazione e che uno scatto ha la durata di 30 sec., pertanto uno scatto avrà un costo pari a t1/2 o t2/2, a seconda della fascia di tariffazione in cui ricade.

Durante la discussione sono state individuate le variabili e le costanti descritte nelle seguenti tabelle.

Tabella delle variabiliTabella delle costantiSegue il flow chart dell’algoritmo ottenuto.

Flow chart