Benvenuti in SoftwareEngineering.SE. Dato che sei nuovo qui, potresti essere interessato leggendo i Apri la lettera agli studenti con i problemi a casa per prima.
torna al problema, ecco alcuni suggerimenti per portarti sulla giusta strada.
Rimozione della condizione
Prendi uno dei blocchi:
if($total_magazines <= 30 && $total_magazines >= 21)
{
$price = 1.75;
$total_amount = $total_magazines * $price;
}
Invertendo l'ordine delle condizioni, si ottiene (il codice significa quasi la stessa cosa per la macchina, ma è leggermente più leggibile per un essere umano in questo modo):
if($total_magazines >= 21 && $total_magazines <= 30)
{
$price = 1.75;
$total_amount = $total_magazines * $price;
}
Per soddisfare questa condizione, un numero intero dovrebbe essere uno di quei valori: 21, 22, 23, ⋯ 29, 30.
Cosa succede se dividi uno di quei numeri per dieci? In un caso di trent'anni, è facile: il risultato è tre. Nel caso di nove altri numeri, ottieni un numero variabile come risultato delle divisioni: 2.1, 2.2, 2.3, ⋯ 2.9, 3.
PHP ha un mucchio di funzioni per lavorare con i numeri in virgola mobile. C'è uno di quelli che, per tutti i numeri sopra elencati (incluso l'ultimo), danno lo stesso risultato esatto. Potresti scoprire quale è?
Dai tuoi commenti, sembra che tu l'abbia trovato. Hai ragione, ceil
restituisce 3 per 2.1, 2.2, ecc., Nonché 3. La parte successiva della risposta è stata modificata di conseguenza.
Rimozione della duplicazione del codice
Ora, in base ai tuoi commenti, hai scoperto che devi utilizzare ceil
, la parte precedente del codice può essere riscritta in questo modo:
if (ceil($total_magazines) == 3)
{
$price = 1.75;
$total_amount = $total_magazines * $price;
}
Ma aspetta, perché dovresti scrivere codice ripetitivo ancora e ancora? in gergo tecnico, si chiama duplicazione del codice, e ci sono solo pochi casi in cui la duplicazione del codice va bene. Questo non è uno di questi.
Vediamo come possiamo modificare il codice per evitare la duplicazione del codice. L'obiettivo qui è di esprimere il $total_amount
per diversi valori di ceil
. Esiste, infatti, un semplice calcolo che, dato un intero, ti darebbe il $total_amount
.
Per capirlo, un semplice approccio è quello di elencare i valori (cioè il risultato di ceil
e il previsto $price
.
- 1 → 0.75
- 2 → 1.25
- 3 → 1.75
- ⋮
- 9 → 4.75
Se non riesci a individuare il modello (e se la descrizione originale del problema non aiuta), un riflesso positivo sarebbe quello di disegnare quei punti su un pezzo di carta e vedere come appare. È una curva? Una linea retta? Perché? Una volta trovato, esprimerlo come una funzione matematica non dovrebbe essere un problema.
Gestione del caso limite
Una volta ottenuti i valori da 1 a 90 a destra, c'è un caso limite, espresso nella tua domanda dalla condizione $total_magazines > 91
(a proposito, c'è un errore: è piuttosto $total_magazines >= 91
).
Ovviamente puoi avere un'istruzione condizionale che restituisce una costante per qualsiasi input superiore o uguale a 91, ma tornando alle funzioni matematiche di PHP, ce n'è una che può aiutarti ad evitare la condizione.
È una buona cosa sbarazzarsi della condizione? Forse sì forse no. Dipende da ciò che il tuo insegnante si aspettava in uno specifico contesto di questo compito. In generale, si preferirebbe utilizzare una condizione per rendere più chiaro il caso limite, ma forse l'aspettativa era che gli studenti si affidassero ampiamente alle funzioni matematiche per fare un'espressione senza flusso di controllo alternativo.