Novità

SpazioScript (per LuigiB o per chi può aiutarmi)

Edoardo_95

Advanced Member
Codice:
Sub Main
Dim cSvil
Set cSvil = New clsSviluppo
Dim aNumDaSvil,nClasse,nCombInt,nQNumeri
nQNumeri = ScegliNumeri(aNumDaSvil)
nClasse = CInt(InputBox("Classe dinamica",2))
nCombInt = cSvil.InitSviluppo(aNumDaSvil,nClasse)
If nCombInt > 0 Then
Call Scrivi ("Quantità numeri        :" & " " & nQNumeri)
Call Scrivi ("Classe                 :" & " " & nClasse)
Call Scrivi ("Combinazioni integrali :" & " " & nCombInt)
Else
MsgBox "Impossibile sviluppare",vbCritical
End If
End Sub

Immagine.jpg
 

Edoardo_95

Advanced Member
Codice:
Sub Main
   Dim cSvil
   Set cSvil = New clsSviluppo
   Dim aNumDaSvil,nClasse,nCombInt,nQNumeri
   nQNumeri = ScegliNumeri(aNumDaSvil)
   nClasse = CInt(InputBox("Classe dinamica",2))
   nCombInt = cSvil.InitSviluppo(aNumDaSvil,nClasse)
   If nCombInt > 0 Then
      Call Scrivi(" " & StringaNumeri(aNumDaSvil))
      Call Scrivi
      Call Scrivi(" Quantità numeri        :" & " " & nQNumeri)
      Call Scrivi(" Classe                 :" & " " & nClasse)
      Call Scrivi(" Combinazioni integrali :" & " " & nCombInt)
   Else
      MsgBox "Impossibile sviluppare",vbCritical
   End If
End Sub

Immagine.jpg

Sub Main con classe

Codice:
Option Explicit
Class clsSviluppo
   Private aBNumDaSvil
   Private nQNumeri
   Private nCombInt
   Private nClasse
   Function InitSviluppo(aNumeri,Classe)
      nQNumeri = AlimentArrayNumDaSvil(aNumeri)
      nCombInt = Combinazioni(nQNumeri,Classe)
      nClasse = Classe
      InitSviluppo = nCombInt
   End Function
   Private Function AlimentArrayNumDaSvil(aNumeri)
      Dim k,Q
      aBNumDaSvil = ArrayNumeriToBool(aNumeri)
      Q = 0
      For k = 1 To UBound(aBNumDaSvil)
         If aBNumDaSvil(k) = True Then
            Q = Q + 1
         End If
      Next
      AlimentArrayNumDaSvil = Q
   End Function
   Function GetStringaNumDaSvil
      Dim s,k
      s = ""
      For k = 1 To UBound(aBNumDaSvil)
         If aBNumDaSvil(k) = True Then
            s = s & aBNumDaSvil(k) & "."
         End If
      Next
      GetStringaNumDaSvil = RimuoviLastChr(s,".")
   End Function
   Function GetQuantitaNumeriDaSvil
      GetQuantitaNumeriDaSvil = nQNumeri
   End Function
End Class
Sub Main
   Dim cSvil
   Set cSvil = New clsSviluppo
   Dim aNumDaSvil,nClasse,nCombInt,nQNumeri
   nQNumeri = ScegliNumeri(aNumDaSvil)
   nClasse = CInt(InputBox("Classe dinamica",2))
   nCombInt = cSvil.InitSviluppo(aNumDaSvil,nClasse)
   If nCombInt > 0 Then
      Call Scrivi(" " & StringaNumeri(aNumDaSvil))
      Call Scrivi
      Call Scrivi(" Quantità numeri        :" & " " & nQNumeri)
      Call Scrivi(" Classe                 :" & " " & nClasse)
      Call Scrivi(" Combinazioni integrali :" & " " & nCombInt)
   Else
      MsgBox "Impossibile sviluppare",vbCritical
   End If
End Sub
 

Giggio

Super Member >PLATINUM<
molto bene , vedo che t isei accorto dell'errore che c'era e lo hai corretto.
la classe la scegli con una inputbox , io direi di sceglierla con scegliEsito e deve spaziare tra 2 e 90
fai questa correzione riposta la classe e proseguiamo.

mi correggo .. non te ne sei accorto perche invece che fati dire i numeri in gioco dalla classe te lo sei fatto dire
dalla funzione stringanumeri sui numeri selezionati.
Non è che non vada bene ma in questo caso va usata la funzione della classe senno che l'abbiamo scritta a fare ?
 

Edoardo_95

Advanced Member
Codice:
Option Explicit
Class clsSviluppo
   Private aBNumDaSvil
   Private nQNumeri
   Private nCombInt
   Private nClasse
   Function InitSviluppo(aNumeri,Classe)
      nQNumeri = AlimentArrayNumDaSvil(aNumeri)
      nCombInt = Combinazioni(nQNumeri,Classe)
      nClasse = Classe
      InitSviluppo = nCombInt
   End Function
   Private Function AlimentArrayNumDaSvil(aNumeri)
      Dim k,Q
      aBNumDaSvil = ArrayNumeriToBool(aNumeri)
      Q = 0
      For k = 1 To UBound(aBNumDaSvil)
         If aBNumDaSvil(k) = True Then
            Q = Q + 1
         End If
      Next
      AlimentArrayNumDaSvil = Q
   End Function
   Function GetStringaNumDaSvil
      Dim s,k
      s = ""
      For k = 1 To UBound(aBNumDaSvil)
         If aBNumDaSvil(k) = True Then
            s = s & aBNumDaSvil(k) & "."
         End If
         s = ArrayBToString(aBNumDaSvil)
      Next
      GetStringaNumDaSvil = RimuoviLastChr(s,".")
   End Function
   Function GetQuantitaNumeriDaSvil
      GetQuantitaNumeriDaSvil = nQNumeri
   End Function
End Class
Sub Main
   Dim cSvil
   Set cSvil = New clsSviluppo
   Dim aNumDaSvil,nClasse,nCombInt,nQNumeri
   nQNumeri = ScegliNumeri(aNumDaSvil)
   nClasse = ScegliEsito(2,2,90)
   nCombInt = cSvil.InitSviluppo(aNumDaSvil,nClasse)
   If nCombInt > 0 Then
      Call Scrivi(" " & cSvil.GetStringaNumDaSvil)
      Call Scrivi
      Call Scrivi(" Quantità numeri        :" & " " & nQNumeri)
      Call Scrivi(" Classe                 :" & " " & nClasse)
      Call Scrivi(" Combinazioni integrali :" & " " & nCombInt)
   Else
      MsgBox "Impossibile sviluppare",vbCritical
   End If
End Sub
 

Giggio

Super Member >PLATINUM<
c'è un errore qui ed e quell osu cui siamo stati 3 ore ....

Codice:
  For k = 1 To UBound(aBNumDaSvil)
         If aBNumDaSvil(k) = True Then
            s = s & aBNumDaSvil(k) & "."
         End If
         s = ArrayBToString(aBNumDaSvil) ' A che serve usare questa funzione ?  Perche lo hai fatto ?  Prova a toglierla e vedi che succede
      Next
 

Edoardo_95

Advanced Member
Di nuovo punto e daccapo ... voglio morire ahahahaha. Allora ArrayBToString trasforma un array di boolean in una stringa di numeri composta dagli elementi impostati a true. Ho inserito quella funzione in quanto omettendola ottenevo sia i risultati che la concatenazione... ma dell'array boolean ovvero:

Es: per

per quantità numeri 10

Vero.Vero.Vero.Vero.Vero.Vero.Vero.Vero.Vero.Vero

richiamando tale funzione invece ottengo:

00.01.02.03.04.05.06.07.08.09.10

il problema è che la stringa deve partirmi dal numero 01 ... ma non riesco a capire l'intoppo
 

Giggio

Super Member >PLATINUM<
scusa tanto

s = s & aBNumDaSvil(k) & "."

con k tu identifichi l'elemento dell'array , il valore di k va da 1 a 90

se aBNumDaSvil(k) è true allora vuol dire che il numero k è stato usato.


tu invece di concatenare i k hai concatenato il valore degli elementi dell'array

l'altra funzione semplicemente va rimossa... chi ti ha deto di usarla ti st oguidando sulle cose da fare percio devi fare quello che dico io senz voli pindarici ...
 

Edoardo_95

Advanced Member
Quindi morale della favola ... Ho un deficit mentale ... ecco perché ahahahahahahah

Codice:
   Function GetStringaNumDaSvil
      Dim s,k
      s = "" 
      For k = 1 To UBound(aBNumDaSvil)
         If aBNumDaSvil(k) = True Then        
            s = s & k & "."
         End If      
      Next
      GetStringaNumDaSvil = RimuoviLastChr(s,".")
   End Function

k assume il valore dell'array boolean impostato a True ... la funzione è superflua e quindi va rimossa ... altrimenti l'impostazione della funzione cambia radicalmente in quanto la function ArrayBToString va a svolgere il medesimo compito generato dalla function GetStringaNumDaSvil ....
 
Ultima modifica:

Giggio

Super Member >PLATINUM<
oh finalmente... non hai nessun deficit mentale .. devi semplicemente immedesimarti nel computer ed elaborare mentlmente le istruzioni per immaginare cosa farano
Nella versione precedente tu concatenavi i valori degli elementi dell'array e ottenvei una sequenza di True-True.....
che lui ti trasforma in Vero-Vero-...
Poi lanciavi la famosa funzione che hai tolto e la stringa S prendeva un valore quasi giusto sosttituendolo a quello che poi si è visto Vero.Vero.....
Ora mi sembra che sia corretto.

Fai una cosa
PRova lo script , se funziona metti i commenti sul codice e riposta il tuttto...
sostituisci anche la riga dove valorizzi la quantita di numeri scelti sfruttando la funzione apposita della classe

nQNumeri = cSvil.GetQuantitaNumeriDaSvil

poi si prosegue e si va un po ' piu sul difficile ..ti avverto ...
 

Edoardo_95

Advanced Member
Eccolo qui :D

Codice:
Option Explicit
Class clsSviluppo
   Private aBNumDaSvil
   Private nQNumeri
   Private nCombInt
   Private nClasse
   Function InitSviluppo(aNumeri,Classe)
      nQNumeri = AlimentArrayNumDaSvil(aNumeri) 'quantità dei numeri da sviluppare ottenuto mediante un ciclo for degli elementi impostati a true di un array convertito boolean
      nCombInt = Combinazioni(nQNumeri,Classe)  'combinazioni integrali ottenuti mediante la function combinazioni (sarà il valore restituito da InitSviluppo
      nClasse = Classe                          'classe di sviluppo
      InitSviluppo = nCombInt
   End Function
   Private Function AlimentArrayNumDaSvil(aNumeri)
      Dim k,Q
      aBNumDaSvil = ArrayNumeriToBool(aNumeri) 'conversione array numerico in arrey boolean
      Q = 0
      For k = 1 To UBound(aBNumDaSvil)         'conto gli elementi dell'array
         If aBNumDaSvil(k) = True Then         ' se l'elemento è stato usato lo imposto a true
            Q = Q + 1                          ' conto gli elementi true (quindi utilizzati)
         End If
      Next
      AlimentArrayNumDaSvil = Q                ' restituisco la quantità dei numeri
   End Function
   Function GetStringaNumDaSvil                ' function che restituisce una stringa dei numeri del chiamante
      Dim s,k
      s = ""
      For k = 1 To UBound(aBNumDaSvil)         ' conto gli elementi dell'array boolean
         If aBNumDaSvil(k) = True Then         ' imposta la condizione nella quale vengono considerati i numeri utilizzati
            s = s & k & "."                    ' effettuo una concatenazione degli elementi "k" impostati a true e quindi utilizzati
         End If
      Next
      GetStringaNumDaSvil = RimuoviLastChr(s,".") 'genero una stringa rimuovendo l'ultimo carattere separatore impostato, ovvero "."
   End Function
   Function GetQuantitaNumeriDaSvil             ' function che ritorna la quantità dei numeri da sviluppare
      GetQuantitaNumeriDaSvil = nQNumeri        '
   End Function
End Class
Sub Main
   Dim cSvil
   Set cSvil = New clsSviluppo                  ' inizializzo la classe
   Dim aNumDaSvil,nClasse,nCombInt,nQNumeri
   nQNumeri = ScegliNumeri(aNumDaSvil)          ' scelta dinamica dei numeri da sviluppare
   nClasse = ScegliEsito(2,2,90)                ' classe di sviluppo
   nCombInt = cSvil.InitSviluppo(aNumDaSvil,nClasse) ' inizializzo lo sviluppo
   If nCombInt > 0 Then
      Call Scrivi(" " & cSvil.GetStringaNumDaSvil)
      Call Scrivi
      Call Scrivi(" Quantità numeri        :" & " " & cSvil.GetQuantitaNumeriDaSvil)
      Call Scrivi(" Classe                 :" & " " & nClasse)
      Call Scrivi(" Combinazioni integrali :" & " " & nCombInt)
   Else
      MsgBox "Impossibile sviluppare",vbCritical
   End If
End Sub
 

Giggio

Super Member >PLATINUM<
ok bene , pero ho dovuto correggere i rem perche su alcuni punti a giudicare da quanto avevi scritto tu le cose non ti erqano chiarissime.

Rileggi la classe con le mie modifiche sui rem e confermami se hai capito la differenza tra le descrizioni. Prendi questo codice qui e sostituiscilo al tuo.


Codice:
Option Explicit
Class clsSviluppo
   Private aBNumDaSvil  ' array boolean contenente i numeri da sviluppare
   Private nQNumeri ' quantita dei numeri da sviluppare
   Private nCombInt ' combinazioni integrali
   Private nClasse  ' classe di sviluppo
   Function InitSviluppo(aNumeri,Classe)
      nQNumeri = AlimentArrayNumDaSvil(aNumeri) 'quantità dei numeri da sviluppare ottenuto mediante un ciclo for degli elementi impostati a true di un array convertito boolean
      nCombInt = Combinazioni(nQNumeri,Classe)  'combinazioni integrali ottenuti mediante la function combinazioni (sarà il valore restituito da InitSviluppo
      nClasse = Classe                          'classe di sviluppo
      InitSviluppo = nCombInt
   End Function
   Private Function AlimentArrayNumDaSvil(aNumeri)
      Dim k,Q
      aBNumDaSvil = ArrayNumeriToBool(aNumeri) 'conversione array numerico in arrey boolean
      Q = 0
      For k = 1 To UBound(aBNumDaSvil)         'Ciclo  gli elementi dell'array per contare i valori true (cioè i numeri selezionati)
         If aBNumDaSvil(k) = True Then         '  se l'elemento è True vuol dire che il numero è stato usato
            Q = Q + 1                          ' percio incremento la variabile Q che conteggia la quantita dei numeri usati
         End If
      Next
      AlimentArrayNumDaSvil = Q                ' restituisco la quantità dei numeri
   End Function
   Function GetStringaNumDaSvil                ' function che restituisce una stringa dei numeri del chiamante
      Dim s,k
      s = ""
      For k = 1 To UBound(aBNumDaSvil)         ' ciclo l'aarray boolean dei numeri usati 
         If aBNumDaSvil(k) = True Then         '  se l'elemento è true vuol dire che il numero K è tra quelli usati 
            s = s & k & "."                    ' effettuo una concatenazione degli elementi "k" impostati a true e quindi utilizzati
         End If
      Next
      GetStringaNumDaSvil = RimuoviLastChr(s,".") ' rimuovo l'ultimo punto che per forza di cose compare nella stringa costruita nel ciclo
   End Function
   Function GetQuantitaNumeriDaSvil             ' function che ritorna la quantità dei numeri da sviluppare
      GetQuantitaNumeriDaSvil = nQNumeri        '
   End Function
End Class
Sub Main
   Dim cSvil
   Set cSvil = New clsSviluppo                  ' inizializzo la classe
   Dim aNumDaSvil,nClasse,nCombInt,nQNumeri
   nQNumeri = ScegliNumeri(aNumDaSvil)          ' scelta dinamica dei numeri da sviluppare
   nClasse = ScegliEsito(2,2,90)                ' classe di sviluppo
   nCombInt = cSvil.InitSviluppo(aNumDaSvil,nClasse) ' inizializzo lo sviluppo
   If nCombInt > 0 Then
      Call Scrivi(" " & cSvil.GetStringaNumDaSvil)
      Call Scrivi
      Call Scrivi(" Quantità numeri        :" & " " & cSvil.GetQuantitaNumeriDaSvil)
      Call Scrivi(" Classe                 :" & " " & nClasse)
      Call Scrivi(" Combinazioni integrali :" & " " & nCombInt)
   Else
      MsgBox "Impossibile sviluppare",vbCritical
   End If
End Sub
 

Giggio

Super Member >PLATINUM<
Benissimo , ora dobbiamo pensare a come sviluppare il sistema senza usare i cicli for , a tale scopo lasciamo perdere il codice e ragioniamo semplicemente se fossimo armati di solo carta e penna.

Facciamo un esempio con un pronostico di 5 numeri sviluppato sia in ambi che in terni perch altrimenti seguire i passaggi è troppo lungo


qui vediamo il nostro pronostico

1600351848108.png

i numeri dell'array possono essere ddisposti in una griglia di due righe dovendo sviluppare ambi

1600351894710.png

lo sviluppo delle colonne puo essere identificato tramite una coppia di coordinate riga colonna per ciascuna posizione della colonna sviluppata

1600352181236.png



stesso discorso per lo sviluppo in terni , creiamo una griglia contenente i numeri che possono presentarsi in quella posizione

1600352271854.png


1600352324249.png

Questa griglia la dovremmo creare in funzione della classe di sviluppo , successivamente con un taccuino facendo finta di sviluppare in ambi dovremmo tenere un registro di 2 posizioni , la prima posizione per registrare la colonna per la prima riga (primo numero della coppia) , il scondo registro per mantenere la colonna della seconda riga cioe il secondo numero della coppia.

ogni volta che vogliamo la colonna successiva dobbiamo incrementare di uno l'ultima coordinata cioe la coordinata registrata nella seconda posizione del registro nel caso di sviluppo in ambi dell'esempio ,

se la coordinata è valida cioè rientra nel range possibile (1-4) tutto bene preleviamo i numeri dalla griglia in base alle coordinate riga-colonna e abbiamo la nostra colonna di sviluppo ,

se incrementando però la coordinata usciamo fuori dallo spazio possibile allora dovremo salire al registro precedente in questo caso al registro della posizione 1 , incrementare quello verificare che sia valido senno salire ancora se non si puo salire piu vuol dire che il sistema è completamente sviluppato , se è valido aggiornare tutti i registri successivi al nuovo valore valido , solo allora si potranno prelevare i numeri dalla griglia per formare la colonna di sviliuppo.


ora se cerchi di seguire mentalmente il processo ti accorgi che ha un andamento regolare ed è possibile costruire dinamicamente le coordinate per creare la colonna e mano mano sviluppare il sistema..



ti è chiaro il concetto se dovessi farlo a mano ?
 

Allegati

  • 1600351934868.png
    1600351934868.png
    5,3 KB · Visite: 9

Giggio

Super Member >PLATINUM<
ok allora per ora dobbiamo creare dinamicamente la famosa griglia dell'esempio.

La griglia si puo ottenere
tramite una matrice , dove il primo limite va da 1 alla classe di sviluppo e il secondo limite va da 1 alla quantita di numeri possibili per un a singola riga.
Abbiamo visto che 5 numeri per ambo danno 4 possibili posizioni , 5 numeri per terno danno 3 righe con 3 possibili posizioni.

ora introduciamo delle variabili globali nella classe che si chiameranno cosi

Codice:
Private aRighe
Private nQNumPerRiga

la prima è la matrice da dimensionare ed alimentare per creare la griglia
la seconda conterra quanti numri possono comparire in una singola riga


fatto questo andremmo a creare una funzione che chiameremo

Codice:
   Private Sub AlimentaArrayRighe
     
      Dim aNumeri  ' contiene i numeri del pronostico convertiti dall'array boolean
     
      Call ArrayBNumToArrayNum(aBNumDaSvil,aNumeri)  ' popolo aNumeri
    
     nQNumPerRiga =  che formula uso  per calcolare la quantita di numeri per singola riga della griglia
    
      ' dimensiono la griglia in modo opportuno
      ReDim aRighe(nClasse,nQNumPerRiga)
     
     ' alimento la griglia
    ' scrivere il codice ....



   End Sub


ora aggiungiamo una routine pubblica nella classe che serve per vedere se abbiamo alimentato bene la griglia.
questa l 'ho fatta io copiala cosi com'è


Codice:
Sub OutputARighe
      Dim k,j,s
     
      For k = 1 To nClasse
         s = ""
         For j = 1 To nQNumPerRiga
            s = s & Format2(aRighe(k,j)) & "."
         Next
         Call Scrivi(Format2(k) & ") " & RimuoviLastChr(s,"."))
      Next
   End Sub

la routine AlimentaArrayRighe dve essere lanciata da InitSviluppo solo se le combinazioni integrali sono > 0
successivamente nela sub main richiama la sub cSvil.OutputARighe per vedere se hai alimentato bene la griglia

testando lo script deve uscire una cosa simile per qualsiasi classe e quantita di numeri scelta , io ad esemio ho scelto 10 numeri in quartine e la griglia è di 4 righe e di 7 posizioni.



1600362240376.png
 

Edoardo_95

Advanced Member
Penso che la formula necessaria a trovare la quantità per ogni singola riga sia questa

Codice:
   Private Sub AlimentaArrayRighe
      Dim aNumeri' contiene i numeri del pronostico convertiti dall'array boolean
      Call ArrayBNumToArrayNum(aBNumDaSvil,aNumeri) ' popolo aNumeri
      nQNumPerRiga =((nQNumeri - nClasse) + 1) 'che formula uso  per calcolare la quantita di numeri per singola riga della griglia
      ReDim aRighe(nClasse,nQNumPerRiga) ' dimensiono la griglia in modo opportuno    
   End Sub

il problema nasce quando devo alimentare la griglia. nClasse è un valore dinamico che viene preso così com'è, mentre nQNumPerRiga lo ottengo mediante la formula. Suppongo che ArrayBNumToArrayNum venga richiamato per fare in modo tale che aNumeri contenga i numeri del pronostico convertiti dall'array boolean e che alimenti la griglia che nel caso del tuo esempio è aRighe(4,7), per uno sviluppo di dieci numeri in quartine.
Quindi mi ritrovo con una griglia limitata però non riesco a capire come inserire i valori all'interno. Da come ho capito devo alimentare entrambi con dei valori presi da aNumeri ... ma non ho capito come. Suppongo con dei cicli for ....
 

Giggio

Super Member >PLATINUM<
allora i numeri del pronostico sono registrati nell'array booelean , in questo caso per quello che dobbiamo fare ci conviene trasformarlo di nuovo in un array di numeri tanti quanti sono quelli del pronostico.
Queso lo facciamo con l'apposita funzione.

Ora per poter dimensionare la matrice deella griglia hai bisogno dei due limiti supriori , il primo lop conosci è la classe , il secondo sono l quantita di numeri che possono apparire su una riga.
Questo valore è influenzato dalla quantita di numeri in gioco e dalla classe usata e si calcola con una semplice sottrazione poi al valore ottenuto dalla sottrazione si aggiunge 1 .

una volta ottenuto il valore la griglia e quindi la matrice verrà dimensionata in modo dinamico.

ora la matrice la devi alimentare , si tratta di traslare i valori dell'array dei numeri del pronostico nelle rispettive righe .
si fa con dei cicli for congegnati in modo opportuno , vedi un po come vuoi fare ...

per verificare se la griglia è stata alimentata bene c'è la funzion che la scrive in output
 

Giggio

Super Member >PLATINUM<
procedi che se non vedo la griglia alimentata cvome si deve non vado avanti :)
Intanto hai trovato la formula per la quantita dei numeri su una riga ?
 

Ultima estrazione Lotto

  • Estrazione del lotto
    venerdì 26 aprile 2024
    Bari
    65
    67
    84
    22
    77
    Cagliari
    38
    09
    83
    18
    20
    Firenze
    76
    24
    78
    30
    40
    Genova
    50
    56
    61
    90
    57
    Milano
    87
    21
    15
    12
    79
    Napoli
    13
    66
    86
    25
    49
    Palermo
    72
    60
    68
    74
    09
    Roma
    23
    15
    43
    07
    75
    Torino
    82
    79
    31
    41
    64
    Venezia
    66
    89
    18
    80
    41
    Nazionale
    04
    24
    10
    69
    73
    Estrazione Simbolotto
    Genova
    33
    03
    16
    35
    32

Ultimi Messaggi

Alto