Gambas-it

Programmazione => Progetti degli utenti => Topic aperto da: Top Fuel - 23 Marzo 2013, 00:12:50

Titolo: Calcolo combinatorio (anche per Formulinux)
Inserito da: Top Fuel - 23 Marzo 2013, 00:12:50
Et voilà: calcolo combinatorio.  :)
Per calcolare disposizioni, permutazioni e combinazioni di tot elementi prendendone x alla volta, comprese le ripetizioni (escluse le permutazioni perchè complicava troppo il programma).
Alla fine ho ceduto a Picavbg ed ho usato le variabili float con la notazione scientifica. Pazienza.  :P
Se intravvedete dei possibili miglioramenti e/o/u/i errori ditemelo pure.  :)
Contento Michy?  ;)
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: Michy9393 - 23 Marzo 2013, 00:21:12
Ho visto che hai spostato la risposta aprendo un nuovo topic :) hai fatto bene! Comunque grazie vedo subito!
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: 9bit - 26 Marzo 2013, 22:33:19
Sembra che funzioni alla grande! Complimenti  :2birre:
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: Top Fuel - 27 Marzo 2013, 00:28:04
Grazie. Comunque spremetelo bene per cercare qualsiasi mancanza che mi sia sfuggita. :)
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: 9bit - 27 Marzo 2013, 12:14:56
Ho notato che quando lo compilo mi vengono fuori 8 Warnings...cosa sono?
Riga
32   global variable hidden by local declaration: Elemdausare
32   global variable hidden by local declaration: Ripetizioni
46   global variable hidden by local declaration: Elemtotali
46   global variable hidden by local declaration: Elemdausare
46   global variable hidden by local declaration: Ripetizioni
48   global variable hidden by local declaration: Permutazioni
46   global variable hidden by local declaration: Disposizioni
72   global variable hidden by local declaration: Elemdausare

Premetto che il programma funziona correttamente  :ciao:
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: md9327 - 27 Marzo 2013, 13:04:45
Hai dichiarato e usato variabili con nome uguale a proprietà
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: vuott - 27 Marzo 2013, 13:13:49


Hai posto una medesima variabile sia in modalità globale che locale.
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: Top Fuel - 27 Marzo 2013, 18:35:59
Non dovrebbero essere due entità indipendenti?
Allora cambio un pò di nomi. :coder:
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: vuott - 27 Marzo 2013, 18:51:40
Non dovrebbero essere due entità indipendenti?

          :rolleyes:
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: Picavbg - 28 Marzo 2013, 01:22:34
Hai posto una medesima variabile sia in modalità globale che locale

No, non incide, però occorre chiarire bene cosa intendiamo per variabile globale. Se essa è estesa a tutto il progetto deve essere dichiarata Public in un modulo e deve essere intercettata con NomeModulo.Variabile. In questo caso se nella :


Codice: [Seleziona]
' Gambas class file
Private Variabile as integer

Public Sub MiaProcedura_Click()
.......bla.......bla.......bla.......
if Variabile = 100 then
   print "Sto utilizzando la Variabile dichiarata [i]Private[/i] nella Form"
Endif
End
Sono sicuro di interrogare la variabile globale a livello di Form

Se invece ho:
Codice: [Seleziona]
' Gambas class file
Private Variabile as integer

Public Sub MiaProcedura_Click()
Dim Variabile as Integer
.......bla.......bla.......bla.......
if Variabile = 100 then
   print "Sto utilizzando la [i]Variabile[/i] locale"
Endif
End
Posso incappare in un esito non prevedibile, perchè sto pensando di utilizzare la variabile dichiarata come Private a livello di Form, mentre Gambas assume come corrente quella dichiarata nella DIM in testa alla stessa procedura.
Quindi bisogna stare ben attenti a quello che si sta scrivendo.

Spero di essermi spiegato con sufficienza.
 :ciao:
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: md9327 - 28 Marzo 2013, 12:30:27
Sì, come ha descritto picavbg, gambas prende in considerazione la variabile dichiarata all'interno della funzione come definizione.

Il mio consiglio, e si può anche notare nella documentazione e negli esempi, è di dichiarare le variabili dell'oggetto anteponendo il carattere del dollaro "$" prima del nome, così da distinguerle dalle variabili normali.

Ricordo, inoltre, che i metodi e le variabili con anteposto un carattere di sottolineatura "_", istruisce il compilatore gambas a nascondere il riferimento nel caso la classe venga utilizzata come libreria.
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: Top Fuel - 28 Marzo 2013, 23:42:36
Corretti i nomi. Ora non dovrebbe più creare problemi. :)
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: Michy9393 - 29 Marzo 2013, 15:28:21
Continua a migliorarlo mi raccomando :) formulinux ha bisogno di tutto e di tutti  ;)
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: simo97 - 29 Aprile 2013, 21:46:06
------su formulinux------
non ciò capto molto però avviando mi fa "too many arguments"...
forse un problema di integrazione...
non sò.. ma io non avendoci capito niente non posso neache capire "cos'ha" :hatecomputer: :hatecomputer:

dagli un occhiata...
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: simo97 - 29 Aprile 2013, 21:58:40
aggiornato all'ultima ver...
adesso va :-\
Titolo: Re: Calcolo combinatorio (anche per Formulinux)
Inserito da: Michy9393 - 30 Aprile 2013, 00:26:32
Credo sia problemi con le versioni...forse ci sono ancora alcune cose che non vanno al massimo ;)
Titolo: Re:Calcolo combinatorio (anche per Formulinux)
Inserito da: Top Fuel - 01 Maggio 2017, 23:40:07
Riprendo questa vecchia discussione perchè ho aggiornato il progetto usando la classe BigInt come mi ha fatto vedere Vuott.
Il programma sarebbe pronto, ma non riesco a testarlo perche appena premo il bottone Calcola mi va immediatamente in Errore di segmentazione(11).
Penso sia collegato all'utilizzo della classe BigInt, la vecchia versione con i Long funzionava.
Potete provare e vedere se capita anche a voi?
Titolo: Re:Calcolo combinatorio (anche per Formulinux)
Inserito da: vuott - 02 Maggio 2017, 01:13:52
Puoi spiegare come funziona ?
Più precisamente: quali campi dobbiamo valorizzare lì sul Form per verificare l'errore da te rilevato ?
Titolo: Re:Calcolo combinatorio (anche per Formulinux)
Inserito da: Top Fuel - 02 Maggio 2017, 21:31:09
Puoi spiegare come funziona ?
Più precisamente: quali campi dobbiamo valorizzare lì sul Form per verificare l'errore da te rilevato ?

Devi mettere dei valori nei campi in alto, "Totale elementi", "Elementi da usare" e, opzionale, "Ripetizioni", poi premere il bottone Calcola.
Ho provato ad eseguire il programma passo passo e ho trovato la linea che crea il problema, è nella funzione Calcoladisp:

Codice: [Seleziona]
Public Function Calcoladisp(Elementi As String, Dausare As String, Optional Ripeti As String) As BigInt ''ripeti è optional perchè non sempre serve
Dim Risultato, NElementi, NDausare, NRipeti, i As BigInt ''il risultato finale, num. elementi, num. elementi da usare, num. ripetizioni e indice in formato BigInt
NElementi = BigInt.FromString(Elementi) ''convertiamo le stringhe in BigInt
NDausare = BigInt.FromString(Dausare)
NRipeti = BigInt.FromString(Ripeti) <---E' QUESTA CHE DA ERRORE DI SEGMENTAZIONE
If NRipeti Then 'se ci sono delle ripetizioni...
   Risultato = NElementi ^ NRipeti '...è sufficiente un elevamento a potenza
   Return Risultato
Endif
Risultato = NElementi 'si parte da numero di elementi da usare conteggiando all'indietro
For i = NElementi To NElementi - NDausare + 2 Step -1 'il calcolo senza ripetizioni
   Risultato *= i - 1 'ogni elemento viene moltiplicato con quello che lo precede
Next
Return Risultato
End
Ma la cosa particolare è che lo fa solo se spunto la casellina davanti al campo "Combinazioni", e quindi quando esegue questa Function una seconda volta, Se non spunto la casellina l'errore non si produce.
Infatti in questa maniera e usando dei Print ho visto che Calcoladisp non da il risultato corretto, quindi devo correggerla, mentre Calcolaperm da dei numeri pazzeschi, quindi funziona. :D
Inoltre ho visto che non mi visualizza i risultati nella rispettive ValueBox, anche qui devo capire il perchè.
Titolo: Re:Calcolo combinatorio (anche per Formulinux)
Inserito da: vuott - 03 Maggio 2017, 00:21:19
Ho notato che, se i valori scritti nei campi "Totale elementi" e "Elementi da usare" sono uguali, non viene sollevato alcun errore.    :-\
Titolo: Re:Calcolo combinatorio (anche per Formulinux)
Inserito da: vuott - 03 Maggio 2017, 00:35:55
ho trovato la linea che crea il problema, è nella funzione Calcoladisp
Sì.
Sembra che alla riga:
Codice: [Seleziona]
NDisposizioni = Calcoladisp(Elementi, Dausare) 'calcoliamo le disposizioni
tu debba comunque passare anche il terzo argomento, anche se nella corrispondente routine della funzione chiamata il 3° parametro è dichiarato come "opzionale".

Correggendo dunque così:
Codice: [Seleziona]
NDisposizioni = Calcoladisp(Elementi, Dausare, Ripeti)
a me non viene sollevato alcun errore.
Titolo: Re:Calcolo combinatorio (anche per Formulinux)
Inserito da: Top Fuel - 22 Luglio 2018, 17:21:21
Ultima versione riveduta e corretta del progetto, adesso funziona bene (almeno credo, controllate  :) ).
L'unica cosa che non ho ancora implementato è la suddivisione delle migliaia, Format$ non supporta i BigInt. Magari ci lavorerò più avanti, convertendo i valori in stringhe.  :coder: