|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
[excel c++]gestire il LIFO continuo.
Salve, premetto subito che non è nessun esercizio assegnatomi ma una cosa che mi serve.
per gestire alcuni soldi devo seguire un sistema che si chiama LIFO continuo. è tipo una pila ma vengono eseguite delle operazioni quando si fa il pop(prelievo) degli elementi. Innanzitutto volevo sapere se qualcuno poteva indirizzarmi su qualcosa di già pronto, magari qualche macro di excel (non ci riesco a realizzarla io e paradossalmente riesco meglio in c++ dove almeno so cosa cercare). Se mi potete aiutare ve ne sarei grato. In c++ ho realizzato una classe pila statica seguendo l'esempio del libro, con push e pop degli elementi, ovviamente non ci sono altre operazioni sugli elementi. Compri 100 Fiat a 18 euro Compri altre 100 Fiat a 17.50. Vendi 50 Fiat a 17.80. Si considerano vendute per prime quelle che hai comprato per ultime, quindi quelle comprate a 17.50. Quindi avrai un gain di 0.30 ad azione. Compri altre 100 Fiat a 17.20. Vendi 120 Fiat a 17.60. Si considerano vendute prime le ultime 100 comprate a 17.20 (quindi su queste avrai un gain di 0.40 ad azione) poi 20 di quelle comprate a 17.50 (e su queste avrai un gain di 0.10 ad azione). E così via. Semplicemente le ultime ad entrare (Last In) sono le prime ad uscire (First Out). Non devi mai considerare il prezzo medio. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
sarei più interessato ad excel perchè devo importare dei dati sul cambio con una queryweb e non saprei farlo con altri programmi.
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
non so se vi è chiaro quello che il programma deve fare.
facendo una pila dite che può andare bene? nessuno mi da qualche consiglio? |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
Ecco qui un po'di pseudocodice:
Codice:
auto = new Coda compraAuto(quantitá, prezzo) auto.push_front(new Automobili(quantitá, prezzo)) end vendiAuto(quantitá) prezzo = 0 do if auto.front.quantitá > quantitá auto.front.quantitá -= quantitá prezzo += auto.front.prezzo * quantitá quantitá = 0 else quantitá -= auto.front.quantitá prezzo += auto.front.prezzo * auto.front.quantitá auto.pop_front endif while quantitá != 0 return prezzo end |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
Quote:
l'esempio era per i titoli azionari ma credo valga lo stesso. mi resta un po difficile capire. devo implementare con la coda? |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 2195
|
Quote:
ma se si comprano delle azioni che si hanno gia in portafoglio l'acquisto delle ultime non è calcolato con la media dell'acquisto delle prime e delle ultime comprate????
__________________
venitemi a trovare nel mio sito www.skintek.altervista.org/skintek1.htm forum di camionisti virtuali http://virtualtrucker.mastertopforum.com/index.php |
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
Quote:
è un modo per complicare le cose e favorire le banche nostrane. cmq rimaniamo in topic, per queste domande ci sono altri topic ai quali sarò felice di partecipare. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
Posto l'esempio base che ho realizzato.
è solo la classe pila realizzata in forma statica(in pratica è un vettore) su cui avevo intenzione di lavorare. Il main è solo per vedere che tutto funziona. file main.cpp Codice:
#include <cstdlib> #include <iostream> #include "PILAS.h" using namespace std; int main(int argc, char *argv[]) { Pila p; E e=10; E secondo=0; E terzo=0; E sum=0; p.print(); system("PAUSE"); for (int i=0;i<10;i++) { e=e+1; p.push(e); } p.print(); system("PAUSE"); p.pop(e); cout<<"\nElemento prelevato"<<e<<"\n"; p.print(); p.push(99); p.print(); p.pop(secondo); p.pop(terzo); cout<<"e: "<<e<<"\n"; cout<<"secondo: "<<secondo<<"\n"; cout<<"terzo: "<<terzo<<"\n"; sum=e+secondo+terzo; cout<<"Somma: "<<sum<<"\n"; p.print(); system("PAUSE"); return 0; } Codice:
#ifndef PILAS_H #define PILAS_H typedef int E; class Pila { public: Pila(); void zero(E p[]); void push(const E e); void pop(E& e); void top (E& e)const; bool empty()const; bool full()const; void print()const; private: enum {N=10}; E p[N]; int t; }; #endif Codice:
#include "PILAS.H" #include <iostream> //FUNZIONE COSTRUTTORE using namespace std; Pila::Pila(){ t=0; for (int i=0;i<N;i++) //inizializza a zero la pila p[i]=0; } bool Pila::empty()const{ return (t==0); } bool Pila::full()const{ return (t==N); } void Pila::push(const E e){ p[t]=e; t++; } void Pila::pop(E& e){ t--; e=p[t]; p[t]=0; } void Pila::top(E& e)const { e=p[t-1]; } void Pila::print()const{ cout<<"Stampa Pila\n"; for (int i=N-1;i>=0;i--) cout<<"p["<<i<<"] :"<<p[i]<<"\n"; } Ultima modifica di limpid-sky : 06-01-2008 alle 16:48. |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
Esiste giá una classe per una pila nella libreria standard, piú precisamente nelle STL, e si chiama:
STACK - (Per lifo) QUEUE - (Per fifo) Dai un occhiata al link http://www.cplusplus.com/reference/stl/ ![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
ma pensi che la pila va bene per quello che voglio realizzare?
In realtà è qualcosa di più di una pila perchè gli elementi vengono modificati quando si fa la pop. Ultima modifica di limpid-sky : 07-01-2008 alle 15:20. |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
qualcuno che mi vuole aiutare a cercare o a fare un programma simile?
forse l'esempio è poco chiaro? edit: ho fatto un animazione powerpoint che magari può aiutare a capire. non è molto accurata ma magari si capisce meglio. è più difficile a dirlo che a farlo il conto. capite bene però che se si aggiunge una pop i conti sono totalmente diversi e il conto va ripetuto ogni volta. una vera scocciatura e perdita di tempo. Ultima modifica di limpid-sky : 07-01-2008 alle 15:21. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
up.
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
è un esercizio troppo difficile?
non mi potete aiutare? |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
mi sembra di essere trasparente qui sul forum alle volte.
possibile che nessuno mi sappia indirizzare o darmi un aiutino? non sto chiedendo se me lo fate voi ma di darmi una mano. il titolo del topic è forse sbagliato? Ultima modifica di limpid-sky : 11-01-2008 alle 11:09. |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
up
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ci credi che e' proprio il nodo centrale del mio ultimo colloquio di assunzione?
Io l'avevo risolto piu' o meno come riporto qui. Si puo' ottimizzare pesantemente, ma cosi' funziona (sono stato assunto). Ovviamente poi sono stato assunto per un problema simile, e la prima ottimizzazione e' stata proprio quella di "compattare" e quindi sveltire le operazioni. Codice:
class Program { static void Main(string[] args) { Agente ag = new Agente(); Console.WriteLine("Compro 10 azioni a 70.0"); ag.Compro(10, 70.0); Console.WriteLine("Compro 8 azioni a 75.0"); ag.Compro(8, 75.0); Console.WriteLine("Vendo 15 azioni a 78.0"); double gain = ag.Vendo(15, 78.0); Console.WriteLine("Gain ultima operazione={0}", gain); Console.ReadKey(); } } class Agente { private Stack<double> Azioni = new Stack<double>(); public void Compro(int Numeroazioni, double Prezzo) { for (int t = 0; t < Numeroazioni; t++) { Azioni.Push(Prezzo); } } public double Vendo(int NumeroAzioni, double Prezzo) { double ret = 0; for (int t = 0; t < NumeroAzioni; t++) { double conf = Azioni.Pop(); ret += (Prezzo - conf); } return ret; } }
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 14-02-2008 alle 14:24. Motivo: Risultato |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
Ne avevo fatto uno molto più alla buona e scritto male.(la funzione pop è scritta malissimo). In c++ funziona ora però cercavo di esportare la cosa in excel e non riesco a trovare un modo per far capire bene le operazioni che vengono eseguite.
Non riesco proprio a organizzare le celle in Excel in un modo che ad esempio l'ultima pop da 120 sia visualizzabile chiaramente in modo da poter controllare manualmente. Hai idee? Magari conosci software adatti allo scopo. header.h Codice:
#ifndef header_h #define header_h typedef double E; class Pila { public: Pila(); void pushRiga(const E num, const E val, const E dollar); void pop(E num, E val); // void top (E& e)const; bool empty()const; bool full()const; void print()const; private: enum {N=10}; enum {M=3}; E p[N][M]; int t; }; #endif Codice:
#include "header.h" #include <iostream> //FUNZIONE COSTRUTTORE using namespace std; Pila::Pila(){ t=N-1; for (int i=0;i<N;i++) for (int j=0;j<M;j++) //inizializza a zero p[i][j]=0; } bool Pila::empty()const{ return (t==0); } bool Pila::full()const{ return (t==N); } void Pila::pushRiga(const E num, const E val, const E dollar){ p[t][0]=num; p[t][1]=val; p[t][2]=dollar; //temp=num*val; //p[t][2]=temp; t--; } void Pila::pop(E numero, E prezzo) { double valenza=0; int temp=0; cout<<"Vendita di "<<numero<<" azioni a "<<prezzo; t++; if (numero<p[t][0]) { temp=p[t][0]-numero; p[t][0]=temp; valenza=(prezzo-p[t][1])*numero; t--; } else if (numero==p[t][0]) { temp=p[t][0]-numero; p[t][0]=temp; valenza=(prezzo-p[t][1])*numero; for (int j=0;j<M;j++) p[t][j]=0; } else if (numero>p[t][0]) { valenza=0; while(numero>p[t][0]) { valenza=valenza+(prezzo-p[t][1])*p[t][0]; numero=numero-p[t][0]; for (int j=0;j<M;j++) p[t][j]=0; t++; } valenza=valenza+(prezzo-p[t][1])*numero; p[t][0]=p[t][0]-numero; t--; } cout<<"\nPlusvalenza: "<<valenza; } void Pila::print()const{ cout<<"\nStampa Pila\n"; for (int i=0;i<N;i++) { for (int j=0;j<M;j++) cout<<p[i][j]<<" "; cout<<"\n"; } cout<<"\n"; } Codice:
#include <iostream> #include "header.h" using namespace std; int main(int argc, char *argv[]) { Pila p; E num3=100; E val3=17.2; E popnum1=0; E popval1=0; p.pushRiga(100, 18, 1.50); p.pushRiga(100, 17.5, 1.50); p.print(); p.pop(50,17.8); p.print(); p.pushRiga(num3,val3,1.50); p.print(); p.pop(120,17.6); p.print(); system("PAUSE"); return 0; } Ultima modifica di limpid-sky : 14-02-2008 alle 15:26. |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Aug 2004
Messaggi: 1703
|
ho trovato un esempio già realizzato in rete.
questo è un template http://www.businessfunctions.com/fun...?comp=LIFOCalc mentre questo è il pacchetto di funzioni gratuite da scaricare e installare altrimenti non funziona. ho scaricato e installato il pacchetto ma ci sono un sacco di funzioni inutili. sapete come estrarre l'unica funzione che mi interessa e come installarla in excel? grazie. Ultima modifica di limpid-sky : 18-03-2008 alle 15:32. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:03.