Benissimo , ottimo Legend .. il concetto lo hai capito hai implmentato bene hai pero lasciato una variabile globale della classe che non serviva , quella che memorizza lo storico.
Ora copia lo script numero 4 a fondo pagina cosi ci riallineamo
I valori statistici che ci serviranno li calcoleremo a suo tempo solo se la lunghetta rispetta le condizioni.
Non ci discosteremo dalla richiesta iniziale di LottoTom perche aggiungere tutte le cose che vuole lui noin ci fa imparare niente di nuovo , quello lo potrai fare tu stesso dopo che questo script verrà portato a termine.
Ripeto qui stiamo facendo una spiegazione non uno script ,anche se alla fine è proprio lo script che otterremo. E' per questo che deve essre il piu compatto possibile , aggiungere le carattristiche nuove richieste da Tom agginge solo complessita ma nom serve a toccare concetti nuovi.
come dicevo ora dobbiamo dedicarci alla sub che disegnerà il grafico , in realtà scriveremo un nuovo metodo della classe.
Dovresti aver gia capito che nuovo metodo della classe significa semplicemente scrivere una nuova sub pubblica che la classe espone al chiamante.
come hai visto nei post precedenti Lottotom ci ha proposto il grafico dell'evoluzione dell'incremento del ritardo massimo che dimostra a colpo d'occhio l'esattezza della condizione.
per disegnare un grafico dobbiamo disporre dei valori per le ascisse e per le ordinate , le ascisse sono la X , le ordinate sono la Y
Dato che gli incrementi del ritmax si sono verificati in un momento preciso del tempo misurato in estrazioni noi useremo per i valori della X il numero dell'estrazione che indica appunto il momento
Invece per i valori della Y useremo il valore dell'incremento (linea rossa ) e del ritardo.(linea blu)
Incremento e
ritardo
sul nostro grafico dovranno comparire due differenti linee , la prima si riferisce ai valori dell'incrRitMax
la seconda ai valori del ritardo , linea rossa e linea blu.
i momenti che noi vogliamo fotografare con il grafico sono queli scanditi dall'array aIdEstrIncrRitMax
ad ogni estrazione in cui si è verificato un incremento prendiamo il valore dell'incremento per la Y (quello contenuto in aElencoIncrRitMax ) e quello del'estrazione (contenuto in aIdEstrIncrRitMax ) per la X
Sulla seconda linea quella del ritardo prendiamo per la X lo stesso valore di prima perche ci interessa
il valore del ritardo nello stesso preciso momento in cui si è verificato l'incremento quindi il valore contenuto in aIdEstrIncrRitMax rappresenterà ancora una volta la nostra X , per la Y invece prenderemo il valore del ritardo di quella stessa estrazione (il valore x) dall'array aElencoRit
qui sorge un piccolo problemino da risolvere.
Ora segui bene il ragionamento :
Mentre scriviamo i valori del grafico l'array che comanda è quello degli incrementi perche è quello che indica le estrazioni salienti che ci interessano ch escandiscono la X
Ti ricorderai che l'array degli incrementi è dinamico , contiene tanti elementi quanti sono
i casi in cui si è avuto un superamento del vecchio rit max,
Questo array ha il suo parallelo che contiene l'id estrazione in cui quell'incremento si è verificato.
quindi con un ciclo per esempio For k = 1 to ubound(aIdEstrIncrRitMax ) è chiaro che k andrà bene
per identificare sia l'elemento di aIdEstrIncrRitMax che quello di aElencoIncrRitMax , purtroppo non va piu bene per identificare l'elemento dell'array aElencoRit che invece è proprio quello che ci serve quando disegnamo la linea blu,
Infatti l'array aElencoRit ha piu elementi di aElencoIncrRitMax quindi la stessa K non va piu bene per
leggere quale era il ritardo di quel momento identificato da X.
Questo problema si potrebbe risolvere in due modi , il primo piu difficile (per modo di dire) consisterebbe nello scrivere una funzione privata alla quale passare l'idEstrazione , questa funzione al suo interno leggerebbe l'array aIdEstrElencoRit troverebbe l'elemento che contiene l'idEstrazione passato e ci darebbe il valore del ritardo letto dal'elemento del vettore aElencoRit alla stessa posizione di dove è stato trovato idEstrazione.
Il secondo metodo molto piu semplice introduce una ridondanza di valori ma ci risparma codice.
Basta dichiarare un altro vettore gobale alla classe che cresca insieme agli altri due dell'incremento
e che contenga il valore del ritardo in quel momento.
Ti consiglio di fare cosi , di usare il secondo metodo quindi dichiarare un nuovo vettore globbale da chiamarsi ad esempio aRitardiAllIncremento , questo vettore si alimentera insieme agli altri due dell'incremento e in ogni elemento conterra il ritardo di quel momento.
Quindi anche se abbiamo una ridondanza di valori questo array non ha piu il problema della corrispondenza di K quando facciamo il ciclo for che calcola i valori di x e y per il grafico.
quindi , la sub per il grafico la scriviamo dopo , ora fai questa modifica : prendi lo script 4 e aggiungi il vettore che ti ho detto e alimentalo, appena avrai fatto ci dedicheremo al grafico
4
Codice:
[COLOR=#0000CD][B]Option Explicit
Class clsLunghetta
Private aNumeri ' contiene i numeri della lunghetta
Private mInizio,mFine,aRuote,mSorte ' parametri per il range analisi
Private mClasse ' contine la classe della lunghetta
Private aElencoRit ' conterra l'elenco dei ritardi per la lunghetta
Private aIdEstrElencoRit ' conterra l'elenco dei ritardi per la lunghetta
Private aElencoIncrRitMax 'contiene l'elnco degli incrementi del ritardo max
Private aIdEstrIncrRitMax ' conterra l'elenco degli id estrazione in
'cui si è registrato l'incremento del ritmax conosciuto
' inizializza le proprietà dell'oggetto
Sub Init(sLunghetta,sChrSep,RangeInizio,RangeFine,vetRuote,SorteInGioco)
' acquisisco i parametri per l'analisi
mInizio = RangeInizio
mFine = RangeFine
aRuote = vetRuote
mSorte = SorteInGioco
' alimento il vettore con i numeri della lunghetta
Call AlimentaVettoreLunghetta(sLunghetta,sChrSep)
' calcolo l'elenco dei ritardi
Call ElencoRitardiTurbo(aNumeri,aRuote,mSorte,mInizio,mFine,aElencoRit,aIdEstrElencoRit)
' alimento il vettore che contien l'elenco degli incrementi rit max
Call AlimentaVettoreIncrRitMax
End Sub
Private Sub AlimentaVettoreLunghetta(sLunghetta,sChrSep)
' antepongo un carattere separatore per fare in modo che
' aNumeri si valorizzi dall'indice 1 (senno si sarebeb valorizzato dall'indice 0)
Call SplitByChar((sChrSep & sLunghetta),sChrSep,aNumeri)
' valorizzo la classe della lunghetta
mClasse = UBound(aNumeri)
End Sub
Private Sub AlimentaVettoreIncrRitMax
Dim nRitMax,nIncr,nId,k
nId = 0
' inizializzo il vettore a 0 elementi
ReDim aElencoIncrRitMax(0)
ReDim aIdEstrIncrRitMax(0)
ReDim aRitardiAllIncremento (0)
' ciclo sul vettore dei ritardi
For k = 1 To UBound(aElencoRit)
' se il ritardo corrente supera il ritmax attuale..
If aElencoRit(k) > nRitMax Then
If nRitMax > 0 Then
' se il ritmax attuale è >0 (ivvero ne esiste uno)
' calcolo di quanto si è incrementato
nIncr = aElencoRit(k) - nRitMax
' incremento il contatore dei valori trovati
nId = nId + 1
' ridimensiono il vettore mantenendo i valori precedenti ma
' aggiungendone uno
ReDim Preserve aElencoIncrRitMax(nId)
' memorizzo il valore
aElencoIncrRitMax(nId) = nIncr
' ridimensiono il vettore mantnendo i valori precedenti ma
' aggiungendone uno
ReDim Preserve aIdEstrIncrRitMax(nId)
' memorizzo l'id dell'estrazione dove si è avuto l'incremento
aIdEstrIncrRitMax(nId) = aIdEstrElencoRit(k)
End If
nRitMax = aElencoRit(k)
End If
Next
End Sub
Function IsCondizioneRispettata
' verifica che l'incremento dell'ultimo ritmax sia uguale al massimo incr rit max conosciuto.
Dim nUpper
nUpper = UBound(aElencoIncrRitMax)
If aElencoIncrRitMax(nUpper) > 0 And aIdEstrIncrRitMax(nUpper) = mFine Then
IsCondizioneRispettata =(aElencoIncrRitMax(nUpper) >= MassimoV(aElencoIncrRitMax,1,nUpper - 1))
Else
IsCondizioneRispettata = False
End If
End Function
End Class
Sub Main
Dim clsL,n,r
Set clsL = New clsLunghetta
ReDim aRuote(1)
For r = 1 To 10
aRuote(1) = r
For n = 1 To 90
Call clsL.Init(n,".",5000,8000,aRuote,1)
If clsL.IsCondizioneRispettata Then
Call Scrivi ( "Il numero " & n & " rispetta la condizione su " & NomeRuota(r) )
End If
Next
Next
Set clsL = Nothing
End Sub[/B][/COLOR]