Autore Topic: Idee e consigli creazione di un algoritmo per un'applicazione  (Letto 2469 volte)

Offline miky2184

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Incredible S
  • Sistema operativo:
    Windows 7
Idee e consigli creazione di un algoritmo per un'applicazione
« il: 23 Giugno 2012, 17:35:09 CEST »
0
Ciao,
è da poco che mi sono avvicinato al mondo della programmazione android, però ho un problema su come realizzare un algoritmo di calcolo delle spese per un'applicazione che sto creando.

Sto creando un'applicazione, che date diverse spese, deve effettuare il calcolo di quanto ognuno deve dare ad un altro utente.

Ad esempio c'è l'utente x, y, z e k
x ha avuto spese di 5 euro
y ha avuto spese di 10 euro
z ha avuto spese di 25 euro
k ha avuto spese di 0 euro
ogni spesa è una variabile di input, che ovviamente possono variare, quelle riportate sono a titolo di esempio.

l'applicazione dovrà quindi mostrare come risultato che
x deve dare 5 euro a z
y non deve dare nulla a nessuno
e k deve dare 10 euro a z

avete idee di come posso calcolare ed ottenere questo risultato finale?

grazie mille anticipatamente
ogni idea è ben accetta

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Idee e consigli creazione di un algoritmo per un'applicazione
« Risposta #1 il: 23 Giugno 2012, 18:10:17 CEST »
0
Questo è un problemino di matematica.  :-)

Un modo semplice di trasporlo in un algoritmo è:

1) Sommi tutte le spese ( SPESE = 5+10+25+0 = 40 )

2) Calcola la giusta quota procapite ( QUOTA = SPESE / NUMEROPERSONE = 40 / 4 = 10

3) Per ogni persona K trovi se ha da avere o dare ( AVERE[k] = SPESA[k] - QUOTA )

e trovi nel tuo caso (-5,0,+15,-10) che vuol dire che il primo deve dare 5, il secondo niente, il terzo deve avere 15, il quarto deve dare 10.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline miky2184

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Incredible S
  • Sistema operativo:
    Windows 7
Re:Idee e consigli creazione di un algoritmo per un'applicazione
« Risposta #2 il: 23 Giugno 2012, 18:27:36 CEST »
0
Grazie dell aiuto, io a questo c ero arrivato, lo avevo implementata la funzione che indica quanto ognuno deve dare o ricevere, ora mi serve implementare la funziona che indica quanto uno deve dare ad un altro,
ad esempio:
x deve dare 5 a z
y 0 a nessuno
e k 10 a z

Spero di essere stato chiaro :)
Grazie :)

Offline ab5000

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One
  • Play Store ID:
    Andrea Biondo
  • Sistema operativo:
    Windows 7
Re:Idee e consigli creazione di un algoritmo per un'applicazione
« Risposta #3 il: 23 Giugno 2012, 21:51:32 CEST »
0
Potresti farlo ricorsivo. Calcoli l'array suggerito da bradipao, e quando trovi un elemento minore di 0 passi tutto l'array finchè non trovi quello a cui si devono più soldi. Se deve ricevere una somma >= a quella che tu devi dare, nessun problema. Se è minore, ne dai solo una parte. Ti registri il passaggio di soldi. Una volta che hai fatto questo, richiami la stessa funzione con il nuovo array, e così via. La funzione si ferma quando tutti gli elementi sono 0.
Tipo così (delta è l'array di quello che ognuno deve avere):

Codice: [Seleziona]
void distributeMoney(int[] delta) {
   // Trova il primo elemento minore di 0
   for(int i=0;i<delta.length && delta[i] >= 0;i++);
   
   // Sono tutti == 0
   if(i == delta.length)
      return delta;
   
   // L'indice del credito più alto
   int max_k = 0;
   
   // Trovo quello con il credito maggiore
   for(int k=0;k<delta.length;k++) {
      // Aggiorno max_k
      if(delta[k] > delta[max_k])
         max_k = k;
   }
   
   // delta[max_k] è sempre positivo se l'array è calcolato correttamente
   
   // Soldi dati
   int given = -delta[i];
   
   // Scambio i soldi
   delta[max_k] = delta[max_k] + delta[i];
   delta[i] = 0;
   
   if(delta[max_k] < 0) {
      // La somma da ricevere era < di quella da dare
      // Ridò l'eccesso al debitore e azzero il credito di max_k
      given = given + delta[max_k];
      delta[i] = delta[max_k];
      delta[max_k] = 0;
   }
   
   // Registro il passaggio
   Log.d(TAG, i + " --> " + max_k + ": " + given);
   
   // Chiamata ricorsiva
   distributeMoney(delta);
}

Non l'ho testato ma dovrebbe circa funzionare. Per migliorare la performance si può controllare se delta(i) != 0 invece di delta(i) < 0 e implementare il funzionamento anche nella direzione opposta.

Lo chiami tipo così:
Codice: [Seleziona]
int[] delta = {-5; 0; 15; -10};
distributeMoney(delta);
« Ultima modifica: 23 Giugno 2012, 22:09:05 CEST da ab5000 »

Offline miky2184

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Incredible S
  • Sistema operativo:
    Windows 7
Re:Idee e consigli creazione di un algoritmo per un'applicazione
« Risposta #4 il: 24 Giugno 2012, 00:14:14 CEST »
0
Grazie, anche se con questo metodo, non so come è possibile determinare chi deve dare a chi.
È possibile usare le Collection, anziché un array, così da avere coppie nome/valore?

comunque grazie, lo testero un Po, vedo come va :)

Offline ab5000

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One
  • Play Store ID:
    Andrea Biondo
  • Sistema operativo:
    Windows 7
Re:Idee e consigli creazione di un algoritmo per un'applicazione
« Risposta #5 il: 24 Giugno 2012, 08:46:56 CEST »
0
Grazie, anche se con questo metodo, non so come è possibile determinare chi deve dare a chi.
È possibile usare le Collection, anziché un array, così da avere coppie nome/valore?

comunque grazie, lo testero un Po, vedo come va :)

Io lo ho registrato con Log.d per velocità, comunque tu sai che la persona i dà given euro a max_k. Associare gli indici ai nomi e registrare lo scambio lo devi fare tu. Usare coppie nv è una buona idea per non dover cercare gli indici e puoi farlo con qualche modifica al codice. In ogni caso devi anche pensare ad una struttura dati in cui memorizzare gli scambi.

Offline miky2184

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Incredible S
  • Sistema operativo:
    Windows 7
Re:Idee e consigli creazione di un algoritmo per un'applicazione
« Risposta #6 il: 28 Giugno 2012, 11:20:47 CEST »
0
Ciao,
grazie mille, l'ho provato ed è perfetto per quello che volevo ottenere :D grazie mille.

Ho ora un altro problema.

Quando l'utente clicca su un EditText deve avviarsi una seconda activity (una calcolatrice), di questa seconda activity ho realizzato già l'interfaccia, ed utilizzo uno StringBuilder per catturare le cifre e gli operatori digitati dall'utente, ho però un problema quando eseguo questo comando, che mi deve calcolare il totale:

totale = Double.parseDouble(builder.toString());

supponendo che il builder contenga 12+13, mi da errore perchè il parseDouble non esegue l'operazione. come posso fare?

al click sull'operatore + per eseguire la somma ho usato questo codice:

      piuB.setOnClickListener(new OnClickListener() {

         public void onClick(View v) {                  
                            builder.insert(0, totale);                     
               totale = Double.parseDouble(builder.toString());
               viewTotal();
               builder.delete(0, builder.length());            
               cifra = menoB.getText().toString();   
               builder.append(cifra);             
         }
           
        });

qualche consiglio?
spero di essere stato chiaro.

grazie mille a tutti :D


Offline ab5000

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus One
  • Play Store ID:
    Andrea Biondo
  • Sistema operativo:
    Windows 7
Re:Idee e consigli creazione di un algoritmo per un'applicazione
« Risposta #7 il: 28 Giugno 2012, 13:06:59 CEST »
+1
parseDouble non esegue operazioni, converte solo un numero scritto in una String in un double.
Ci sono varie librerie già pronte per l'utilizzo, una veloce e semplice a mio parere è questa: https://github.com/darius/expr
Scarichi lo ZIP da GitHub, lo scompatti, ci navighi con un prompt dei comandi e (sei hai make) basta dare il comando make. Se non ce l'hai fai manualmente:

Citazione
cd expr
javac -O *.java
jar cf expr.jar BinaryExpr.class Parser.class Token.class ConditionalExpr.class Scanner.class UnaryExpr.class Expr.class SyntaxException.class Variable.class LiteralExpr.class

A questo punto nella cartella expr avrai un file expr.jar. Lo importi nel progetto Eclipse e poi parsare l'espressione è facile:

Codice: [Seleziona]
Parser parser = new Parser();
parser.allow(null);

Expr expr;

try {
    expr = parser.parseString("3 + 4 * 2 - 6 / 2");
} catch (SyntaxException e) {
    // Uh oh, errore di sintassi!
    // Errore dettagliato: e.explain()
}

// Risultato: expr.value()

Per maggiori informazioni pui consultare la documentazione allegata.

Offline miky2184

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Incredible S
  • Sistema operativo:
    Windows 7
Re:Idee e consigli creazione di un algoritmo per un'applicazione
« Risposta #8 il: 28 Giugno 2012, 23:45:44 CEST »
0
Ciao io ho provato ad usare la libreria Parser, però pur se Eclipse non mi segnala errori, qnd avvio l'applicazione nel log ho questo errore:

Could not find class 'expr.Parser', referenced from method it.spesa.calculator.CalculatorActivity.viewTotal

come posso fare?

mi passeresti uno jar corretto? perchè io qnd ho provato a farlo mi ha dato questi problemi (anche se poi il jar me lo ha creato ugualmente)

Citazione
C:\expr>javac -O *.java
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

C:\expr>javac -O -Xlint *.java
Parser.java:74: warning: [unchecked] unchecked call to put(K,V) as a member of the r
aw type java.util.Hashtable
            allowedVariables.put(pi, pi);
                                ^
Parser.java:77: warning: [unchecked] unchecked call to put(K,V) as a member of the r
aw type java.util.Hashtable
            allowedVariables.put(optVariable, optVariable);
                                ^
Parser.java:273: warning: [unchecked] unchecked call to insertElementAt(E,int) as a
member of the raw type java.util.Vector
                v.insertElementAt(candidates[j], i);
                                 ^
Parser.java:296: warning: [unchecked] unchecked call to insertElementAt(E,int) as a
member of the raw type java.util.Vector
                v.insertElementAt(t, i);
                                 ^
Parser.java:310: warning: [unchecked] unchecked call to setElementAt(E,int) as a mem
ber of the raw type java.util.Vector
                v.setElementAt(candidates[j], i);
                              ^
Parser.java:316: warning: [unchecked] unchecked call to setElementAt(E,int) as a mem
ber of the raw type java.util.Vector
            v.setElementAt(t, i);
                          ^
Variable.java:25: warning: [unchecked] unchecked call to put(K,V) as a member of the
 raw type java.util.Hashtable
            variables.put(name, result = new Variable(name));
                         ^
SyntaxException.java:11: warning: [serial] serializable class expr.SyntaxException h
as no definition of serialVersionUID
public class SyntaxException extends Exception {
       ^
Scanner.java:100: warning: [unchecked] unchecked call to addElement(E) as a member o
f the raw type java.util.Vector
                    tokens.addElement(new Token(ttype, 0, s, i, i+2));
                                     ^
Scanner.java:104: warning: [unchecked] unchecked call to addElement(E) as a member o
f the raw type java.util.Vector
            tokens.addElement(new Token(s.charAt(i), 0, s, i, i+1));
                             ^
Scanner.java:111: warning: [unchecked] unchecked call to addElement(E) as a member o
f the raw type java.util.Vector
            tokens.addElement(makeErrorToken(i, i+1));
                             ^
Scanner.java:122: warning: [unchecked] unchecked call to addElement(E) as a member o
f the raw type java.util.Vector
        tokens.addElement(new Token(Token.TT_WORD, 0, s, from, i));
                         ^
Scanner.java:142: warning: [unchecked] unchecked call to addElement(E) as a member o
f the raw type java.util.Vector
            tokens.addElement(makeErrorToken(from, i));
                             ^
Scanner.java:146: warning: [unchecked] unchecked call to addElement(E) as a member o
f the raw type java.util.Vector
        tokens.addElement(new Token(Token.TT_NUMBER, nval, s, from, i));
                         ^
14 warnings

C:\expr>jar cf expr.jar expr
expr : impossibile trovare il file o la directory

C:\expr>cd..

C:\>jar cf expr.jar expr

C:\>

e mi diresti anche come devo fare per importare la libreria in eclipse? Io ho fatto Proporties -> Java Build Path -> Add External Jar e ho seleziona expr.jar

è corretto?

Grazie anticipatamente.
Michele

Offline miky2184

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Incredible S
  • Sistema operativo:
    Windows 7
Re:Idee e consigli creazione di un algoritmo per un'applicazione
« Risposta #9 il: 30 Giugno 2012, 13:50:02 CEST »
0
Ciao a tutti, alla fine ho risolto anche il problema delle espressioni matematiche, però ora ho un'altro e credo ultimo problema:

sull'emulatore il TextWatcher() per il metodo onTextChanged() funziona, qnd però installo l' app sul mio dispositivo, questa non funziona più...come mai???


grazie anticipatamente a tutti :D