|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[qualsiasi]problemino matematico
Ciao a tutti
Chiedo aiuto a voi per il seguente problema che riguarda la lettura dei contatori dell'acqua nei condomini: 1)Si legge il contatore generale, che per esempio segnerà 2385 scatti; In base al numero di utenze di questo condominio, c'è da fare la moltiplicazione per una costante (23) ed in base al risultato si applica una determinata tariffa. Per esempio: Condominio A, numero utenze = 40 Devo fare: 40 * 23 = 920 e applicare la prima fascia di tariffazione, per esempio = 0.45 quindi: 920 * 0.45 = 414 poi, dovrei fare sempre 40 * 23 che fa sempre 920 e applicare la seconda tariffa: 920 * 0.75 = 690 A questo punto, io devo sempre tenere presente che devo arrivare al numero totale di scatti (2385) e quindi devo fare: 920 + 920 (1a e 2a tariffa) = 1840 2385 - 1840 = 545 e applicare una terza tariffa (o una quarta...) Sperando di essere stato chiaro, come potrei automatizzare il tutto? Grazie mille RaouL. P.S.: credo che il tutto si possa sintetizzare in questo modo: quante volte il risultato della moltiplicazione del numero di utenze * 23 è contenuto nel numero di scatti del contatore generale;
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
Ultima modifica di RaouL_BennetH : 13-08-2007 alle 09:30. |
|
|
|
|
|
#2 | |
|
Member
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
|
Quote:
ma dalla sintesi che hai fatto sembra che il tutto si riduce ad una divisione n = numero di scatti /(numero di utenze * 23) |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Per esempio, ho una tabella con 13 tipi di tariffe: Codice:
1) 0.45 2) 0.72 3) 1.18 4) 2.15 blabla le utenze del condominio sono 34; il primo calcolo che faccio è: Codice:
int numTariffeDaApplicare = contatore / (utenze * 23); //che non mi darà il numero esatto perchè c'è il resto che calcolo così: int resto = contatore % (utenze * 23); //con i numeri che ho messo in esempio ho: numTariffeDaApplicare = 3 //così divise: primaTariffa = (utenze * 23) * 0.45 secondaTariffa = (utenze * 23) * 0.72 terzaTariffa = (utenze * 23) * 1.18 //rimane quella del resto che secondo l'operazione di prima è: 214 //e su quest'ultima devo fare: quartaTariffa = 214 * 2.15
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
|
ma il tuo problema è calcolare la tariffa sul resto, perche non sai qual applicare ?
|
|
|
|
|
|
#5 |
|
Registered User
Iscritto dal: Jun 2006
Città: Tuttoporto (Sicily) Tipologia: Giocatore-samurai
Messaggi: 2199
|
Insomma, se ho capito bene è come la tassazione progressiva...
In tal caso puoi fare così. (codice simil-C) Codice:
int n_utenze = 34;
int costante = 23;
fascia = n_utenze*costante;
int lettura= 2560;
int totale = 0;
double[] tariffe = {0.45, 0.72, 1.18... etc }
for (int i=0; lettura>0; i++)
{
if (lettura>=fascia)
{
totale+=fascia*tariffe[i];
lettura-=fascia;
}
else
{
totale+=lettura*tariffe[i];
lettura=0;
}
}
A livello puramente matematico era un bell'integrale di una funzione a gradini... ma è meglio non trattarlo così. |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Per il momento ho risolto così: Codice:
//il codice è in C#
private void MyData()
{
int result = Int32.Parse(cmbUtenze.ComboBox.Text) * 23;
int contatore = Int32.Parse(txtContatore.Text);
int numTariffe = contatore / result;
int resto = contatore % result;
switch (numTariffe)
{
case 1:
double totale = (result * 0.417) + (resto * 0.719);
MessageBox.Show("caso 1");
label2.Text = totale.ToString();
break;
case 2:
double totale2 = (result * 0.417) + (result * 0.719) + (resto * 0.835);
MessageBox.Show("caso 2");
label2.Text = totale2.ToString();
break;
case 3:
double totale3 = (result * 0.417) + (result * 0.719) + (result * 0.835) + (resto * 1.121);
MessageBox.Show("caso 3");
label2.Text = totale3.ToString("N3");
break;
case 4:
double totale4 = (result * 0.417) + (result * 0.719) + (result * 0.835) + (result * 1.121) + (resto * 1.334);
MessageBox.Show("caso 4");
label2.Text = totale4.ToString();
break;
case 5:
double totale5 = (result * 0.417) + (result * 0.719) + (result * 0.835) + (result * 1.121) + (result * 1.334) + (resto * 1.334);
MessageBox.Show("caso 5");
label2.Text = totale5.ToString();
break;
}
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#7 |
|
Registered User
Iscritto dal: Jun 2006
Città: Tuttoporto (Sicily) Tipologia: Giocatore-samurai
Messaggi: 2199
|
Forse ti è sfuggito il mio messaggio perché abbiamo postato insieme. Nella tua soluzione vedo che calcoli preventivamente quante "aliquote" incontri e fai un calcolo ad hoc per ogni caso, ma non è necessario.
E poi è poco flessibile... appena cambia una tariffa o se ne aggiunge una devi andare a cambiare tutto il codice. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Scusa se mi permetto, mi sento di darti un consiglio.
Da quel che ho capito, si tratta di un problema che ben si presta ad una soluzione impostata mediante tabelle. Il consiglio e' quindi di fare in modo che l'applicazione vada a consultare delle tabelle ed eventualmente fare i conti con il loro contenuto invece di usare uno switch. Il vantaggio e' che il risultato e' piu' comprensibile di uno switch chilometrico (con parti di codice che, per forza di cose, sono duplicate o comunque molto simili). Hai anche il vantaggio della configurabilita': in versioni future, potresti inserire le tabelle in un file di configurazione, e cambiarlo senza nemmeno toccare il codice. Puoi prendere come riferimento il codice di naoto84 ed eventualmente ampliarlo....
__________________
In God we trust; all others bring data |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Grazie a tutti per i consigli
Per rispondervi: Si, alle tabelle ci avevo pensato, magari lasciando all'utente la possibilità di inserirle in una list box o in un db, in modo che possa aggiornarle in tempo reale quando cambiano. Quello che ho fatto con lo switch era più che altro per rendermi conto di come far fare matematicamente l'operazione. Ora vedo cosa riesco a capire dal codice di nato84.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 311
|
__________________
Senior Member Registrato il: Jan 2001 Messaggi: 2609 |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 311
|
tre righe tre di codice e passa la paura
Codice:
Sub ppp() Dim t(1 To 10), tt(1 To 10) t(1) = 0.45 t(2) = 0.75 t(3) = 0.95 t(4) = 1.15 tt(1) = t(1) For i = 2 To 10: tt(i) = tt(i - 1) + t(i): Next i Nsc = 2385 Nut = 40 a = 23 c = Nut * a II = Int(Nsc / c) TOT = c * tt(II) + (Nsc Mod c) * t(II + 1) End Sub
__________________
Senior Member Registrato il: Jan 2001 Messaggi: 2609 |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
sono 15
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#14 |
|
Registered User
Iscritto dal: Jun 2006
Città: Tuttoporto (Sicily) Tipologia: Giocatore-samurai
Messaggi: 2199
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 311
|
__________________
Senior Member Registrato il: Jan 2001 Messaggi: 2609 |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 311
|
ciao
__________________
Senior Member Registrato il: Jan 2001 Messaggi: 2609 |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Piu' che altro carina l'idea che hai usato per calcolare il risultato.
Capita proprio a proposito, perche' sfruttandola si riesce a scrivere una soluzione in due righe Codice:
rates = zip (0.45:0.75:0.95:repeat 1.15) (scanl (+) 0.0 (map fst rates)) bill users amount = (\fi u -> (\(x,y) -> x*(fi (mod amount u)) + y*(fi u) ) (rates !! (div amount u))) fromIntegral (users*23)
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 311
|
certo anche perchè, da buon copy-paste programmer, non sapendo un C++ di matematica ti tocca copiare la sostanza dagli altri e incollare il tutto con un po' di immonda C-like glue-shit .
P.S. non te la prendere ma è la verità, d'altra parte non è colpa tua: ve lo hanno insegnato che il codice (degli altri
__________________
Senior Member Registrato il: Jan 2001 Messaggi: 2609 Ultima modifica di a2000.1 : 15-08-2007 alle 05:44. |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Aug 2004
Messaggi: 311
|
dopo lo mandiamo in esecuzione 10^9 volte e vediamo quello che ci mette di meno, se il tuo anacoluto da barboni pala&piccone o quello in lingua evoluta porsche-cayenne modello ranzani (alias fortran).
comunque eccotelo servito, non in anacoluto da cavernicoli , in una sola riga (con una ripetizione) ![]() Codice:
Function f_TOT(Nsc, c, tt(), t()) 'II = Int(Nsc / c) f_TOT = c * tt(Int(Nsc / c)) + (Nsc Mod c) * t(Int(Nsc / c) + 1) End Function
__________________
Senior Member Registrato il: Jan 2001 Messaggi: 2609 Ultima modifica di a2000.1 : 15-08-2007 alle 06:05. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:46.












, in una sola riga (con una ripetizione)








