Dati random da sql

Mentre lavoravo ad un bel progetto in Gambas, mi sono imbattuto nell’esigenza di dover tirar fuori dieci dati a caso da un database sqlite da riversare poi in una TableView. Non mi interessava molto il loro ordine ma mi sono focalizzato sulla loro casualità.

Sqlite permette di estrapolare un numero predefinito di dati random in maniera molto semplice. Basta eseguire infatti

SELECT * FROM NomeTabella ORDER BY RANDOM() LIMIT 10

per ottenere 10 dati qualsiasi dalla tabella indicata. Si noti come:

SELECT * : Il carattere speciale * serve ad indicare che non si cerca nulla di preciso ma tutto può andar bene, infatti * è un carattere jolly che può rimpiazzare qualsiasi carattere.

FROM NomeTabella : Preleva i dati dalla tabella indicata

ORDER BY RANDOM() : ORDER BY indica il modo in cui i dati devono essere prelevati. Tale prelievo può essere, ad esempio, per ordine alfabetico o numerico. Nel nostro caso stiamo indicando di prelevarli del tutto casuali (random = casuale)

LIMIT 10 : Impone un limite di 10 dati da prelevare

Preciso, infine, che qualora si voglia lo stesso lavoro con un database di tipo MySql, il comnado è del tutto simile apparte la sostituzione del termine RANDOM() con RAND() ottenendo così:

SELECT * FROM NomeTabella ORDER BY RANDOM() LIMIT 10

Algoritmo calcolo della pasqua


Oggi è pasqua e quale regalo migliore avrei potuto fare agli amici programmatori se non spiegare un algoritmo con il quale calcolare la tanto misteriosa data bellerina?
Di anno in anno, infatti, la data di questa festività è sempre un mistero ed è difficile conoscere qualcuno che sappia con largo anticipo quale sarà la domenica incriminata. Oggi vi vengo in aiuto e vedremo insieme un vecchio algoritmo che serve ad ovviare a tale mancanza.

Il codice che prenderemo in esame si rifà ad un algoritmo ideato dal matematico,fisico e astronomo Carl Friedrich Gauss. Il listato che presenterò sara uno pseudo-codice così da far in modo che ognuno possa convertirlo con facilità nel proprio linguaggio preferito.

Prima di addentrarci nel vivo della programmazione bisogna fissare i seguenti punti:
  • Con MOD sarà indicata quell’operazione matematica che restituisce il resto di una divisione. Ad esempio 15 MOD 2 = 1 poichè 15:2 = 7 con resto 1;
  • Tutti i valori trattati sono interi;
  • I mesi nei quali è possibile che ricada la data cercata sono Marzo e Aprile;
  • Con Y si indica l’anno di cui si vuole calcolare la data di Pasqua.
Bene!Detto ciò, iniziamo…

Si calcolano prima i tre valori A, B e C nel seguente modo:

A = Y MOD 19
B = Y MOD 4
C = Y MOD 7

Fatto ciò si passa i valori D ed E:

D = (19 * A + M) MOD 30
E = (2 * B + 4* C + 6 * D + N) MOD 7

Come si vede nelle formule scritte sopra, appaiono due valori che non conosciamo: M ed N. Tali valori sono delle semplici costanti intere che devono essere prelevate dal seguente schema in base all’anno Y in questione:

Anni M N
1583-1699 22 2
1700-1799 23 3
1800-1899 23 4
1900-2099 24 5
2100-2199 24 6
2200-2299 25 0
2300-2399 26 1
2400-2499 25 1

Una volta eseguiti i calcoli di D ed E si analizza la loro somma. Se

(D + E)

allora la Pasqua cade il giorno

(D + E + 22)

del mese di Marzo, altrimenti essa cade il giorno

(D + E – 9)

del mese di Aprile.

Vediamo ora il listato completo in pseudo-codice

Gambas: Passaggio parametri variabili ad una funzione


Quando si programmano software un pò più avanzati si deve tener conto che non tutto nella vita può essere definito a priori.
Basti immaginare a chi sviluppa una semplice calcolatrice da riga di comando. Molte volte ho visto questo esempio ma l’errore sempre ricorrente era quello di accettare sempre e solo due parametri numerici ai quali applicare l’operazione prescelta. La cosa è molto utile dal lato sviluppo ma davvero poco professionale dal lato utenza.

Qualsiasi linguaggio che si rispetti da la possibilità a chi programma di scrivere funzioni che accettano anche parametri senza prima definirne l’esatte numero, semplicemente scrivendo un prototipo che indichi al sistema che tale funzione accetta parametri ma ne accetta tanti quanti l’utente ne inserisce.

Questo modo di programmare è davvero utile e flessibile e toglie dall’imbarazzo di dover specificare nei propri programmi che una certa operazione può essere eseguita solo tra due dati alla volta.

In Gambas, svolgere tale compito è davvero semplice e vedremo ora come fare.

Il passaggio indefinito di parametri prevede una struttura della funzione uguale a quelle a cui siamo abituati con una differenza nella dichiarazione dei parametri da passare in fase di esecuzione. Immaginiamo di avere la nostra funzione di nome FAddizione che deve sommare tutti i numeri interi passati come parametri (di cui ovviamente non sappiamo il numero a priori) e ne deve restituire la somma intera. Il prototipo di tale funzione sara quindi:

FAddizione (Numero1 AS Integer, Numero2 AS Integer, …) AS Integer

Innanzitutto vediamo che la definizione prevede un costrutto del tutto simile ad una normale funzione, con la differenza che il terzo parametro viene definito come una serie di tre punti ( … ) che sta ad indicare al linguaggio che dopo Numero2 non si sa quanti altri parametri verranno sottoposti ad operazione.
Si noti che i primi due parametri, ovvero Numero1 e Numero2, vengono definiti esplicitamente per il semplice fatto che non ha senso effettuare una somma se non ci sono almeno due numeri su cui effettuare l’operazione.

Il codice che eseguirà il lavoro voluto è il seguente:

FAddizione (Numero1 AS Integer, Numero2 AS Integer, …) AS Integer

DIM Elemento AS Integer
DIM Risultato AS Integer

Risultato = Numero1 + Numero2

FOR EACH Elemento IN Param
Risultato = Risultato + Elemento
NEXT

RETURN Risultato

END

Dunque, come si vede la funzione, come primo passo, somma i due numeri passati esplicitamente alla funzione mediante l’operazione

Risultato = Numero1 + Numero2

Fatto ciò scorre tutti gli altri elementi passati alla funzione, non definiti, mediante il ciclo FOR EACH. Si vede infatti che è stato definito un intero all’interno della funzione di nome Elemento che indica di volta in volta nel ciclo un nuovo elemento presente in Param. Elemento viene sommato a Risultato che aggiorna, di volta in volta, il suo valore con il proprio valore precedente sommato al nuovo parametro.

Apriamo una parentesi. Param è una classe statica, di sola lettura, interna di Gambas che prevede la gestione di tutti gli extra-parametri di una funzione. Essa gode di alcune proprietà che agevolano il trattamento di questa particolare situazione.
Nel nostro caso sfruttiamo la particolarità della classe di essere enumerabile mediante il ciclo FOR EACH e di scorrerla quindi finchè c’è un dato da leggere.

Tornando al codice si può vedere come con l’istruzione:

RETURN Risultato

Restituisce alla fine di tutto il dato voluto.

CONSIDERAZIONI

L’uso di questo tipo di struttura e del suo costrutto deve diventare una prassi per i codici che richiedono la risoluzione di questi tipi di situazioni poichè può accadere che all’utente serva passare un grosso numero di parametri e si costringerebbe chi opera sul nostro software a creare numerosi cicli, dispendiosi in termini di tempo, per effettuare semplici operazioni.

Ovviamente rimango a vostra disposizione per chiarimenti in merito a questo articolo.