Ragioniamo e compariamo





Spesso mi sono divertito a modificare codici già utilizzati e funzionanti con il solo scopo di vedere se ci riuscivo , se riuscivo a trovare un'alternativa o se riuscivo a migliorare quello di partenza o semplicemente perché avevo imparato un nuovo metodo. Si lo so ho dei divertimenti strani 😂 ma la sfida di riuscire a fare una cosa spesso mi attira di più che ultimare le cose 😅, sarà per questo che non ho sfornato decine di applicazioni 😖 

Scherzi a parte, ho nato che spesso vengono fatte domande per spostare , mescolare o distribuire elementi, sia per quello che riguarda le liste ma anche per il testo o numeri da distribuire in label o textbox. Bene oggi vedremo 3 diversi metodi per prelevare 9 numeri da una lista e dividerli in tre label differenti. Naturalmente non sono metodi universali o i soli utilizzabili ma servono per dare lo spunto e ragionare su come poter realizzare il nostro codice.  


I numeri in alto li andremo a dividere per le tre label, ho scelto di inserire proprio dei numeri cosi da poter visualizzare meglio le posizioni e i vari indici che andremo ad usare. Let's go!


Queste sono le variabili che andremo ad utilizzare per i tre esempi , una lista con tutti i numeri LISTA NUMERI , una lista con i componenti label LISTA LABEL, quindi il blocchettino che ci da tutte le info su quel componente, il nome e cognome del componente per capirci, una variabile numerica inizializzata ad 1 NUMERO DA INSERIRE e in fine una procedura per pulire i vari cambi, non essenziale ma comoda per non riscrivere ogni volta il codice. 
ESEMPIO DI PRIMO LIVELLO 👶
Questo esempio è il più semplice, diciamo quello a cui tutti possono accedere e probabilmente il primo che viene in mente specialmente quando siamo alle prime armi, una traduzione, possiamo dire letterale, del codice che ci serve. Prendi la label lista1 e inserisci al suo interno l'elemento 1,2 e 3 della LISTA NUMERI , poi fai lo stesso con la label lista 2 inserendo 4,5 e 6 e in fine modifica il testo della label lista 3 inserendo l'elemento 7,8 e 9. Direi molto lineare, l'unica cosa che potrebbe essere un pò più difficile per i neofiti è l'utilizzo di join e l'interposizione di \n che permette di andare a capo; il primo raggruppa più cose in un' unica stringa o elemento , l'altro come detto permette di andare a capo incolonnando i termini.  
 

Beh, direi semplicissimo perché complicarsi la vita? Poniamoci qualche domanda. E se fossero 10 , 20 o 100 label? E se fossero 100 termini? E se domani dovessi aggiungere altri termini? 😵 

ESEMPIO DI SECONDO LIVELLO 👦

Ragionando un pò possiamo vedere che è un operazione ripetuta più volte, nello specifico 3 volte, riempi la label 1 ,2 e 3 e nel riempirla effettua ogni volta 3 operazioni (unite o separate che siano) e cioè prendere 3 elementi da una lista. Avrete intuito che dobbiamo utilizzare il blocco ripeti tot volte ,anzi lo dovremo usare due volte, un ciclo all'interno di un altro ciclo (cicli annidati) . In questo primo esempio andremo ad utilizzare una variabile NUMERO DA INSERIRE per semplificare il procedimento e concentrarci sui cicli, i blocchi Any component ( ho fatto alcuni tutorial specifici che ti consiglio di leggere ) ci permetteranno di generalizzare il codice e "passare" di volta l'elemento corretto da modificare e qui ci sarà utile la LISTA LABEL in cui avevamo salvato i tre componenti label proprio in previsione di questo. 

Operazioni da effettuare: 

- Selezionare la label corretta dalla lista ( x 3 volte )

- Selezionare gli elementi da inserire nella label ( x 3 volte)

Il ciclo esterno ci darà di volta in volta l'indice, quindi la posizione, della label all'interno della LISTA LABEL e tramite il select list andremo a prelevarla per inserirla all'interno del campo of component , in questo modo abbiamo detto a kodular quale label dovrà essere oggetto della modifica, quindi della modifica del testo. Il blocco any relativo alla label infatti è proprio set label Text , la modifica del testo . Una volta specificata la label da modificare il ciclo interno andrà , per tre volte, a prelevare un elemento dalla LISTA NUMERI , il numero da prelevare ( o qualsiasi elemento della lista ) è nella posizione indicata dalla variabile NUMERO DA INSERIRE che come potete notare viene aumentato di una unità ad ogni giro interno, quindi sempre, partendo da 1 ed arrivando a 9 (3 cicli esterni x 3 cicli interni) . Il blocco join in questo caso ad ogni giro ci permette di ricopiare quello che già è scritto nella label , infatti ad ogni ciclo prendere quello che già è scritto e lo unisce con il nuovo elemento. Quindi primo giro unisce niente con 1, secondo giro unisce 1 con 2, terno giro unisce 1 e 2 con 3 , interponendo un a capo ad ogni aggiunta. Per prelevare quello che già è scritto nella label usiamo sempre il blocco any visto che cambierà ad ogni passaggio del ciclo esterno esterno, label Text sarà il blocco magico e per quale label prendere in esame usiamo lo stesso blocco che ha selezionato of component precedentemente select list per prendere dalla LISTA LABEL cosa? l'elemento nella posizione ( index ) suggerita dalla variabile NUMERO DELLA LISTA   



Ricapitolando. Il ciclo esterno fa il suo primo giro passando il valore 1 di NUMERO DELLA LISTA che suggerisce di andare a prendere l' elemento 1 della LISTA LABEL per poter modificare il suo testo, infatti il ciclo interno andrà per tre volte a prendere l'elemento 1, poi il 2 e poi il 3 dalla LISTA DI NUMERI, l'elemento da prendere è gestito da NUMERO DA INSERIRE che correttamente viene aumentato ad ogni passaggio interno.

Alla fine del primo giro NUMERO DELLA LISTA vale 1 e NUMERO DA INSERIRE vale 4 , infatti viene cambiato a fine codice .

Nuovo giro , NUMERO DELLA LISTA diventa 2 andando a prendere la label in posizione 2 nella LISTA LABEL per essere modificata la stessa che viene aggiornata anche per essere utilizzata per ricopiare il testo già presente. Quindi la label modificata sarà la 2 e i numeri inseriti 4,5 e 6.  

Alla fine del secondo giro NUMERO DELLA LISTA vale 2 e NUMERO DA INSERIRE vale 7 , l'ultimo giro ormai è facile 👍 . Questo codice rispetto al precedente anche visivamente è più compresso , molto più compresso se pensiamo ad un codice rivolto a 100 label (estremizzo) , probabilmente è anche più veloce e basta modificare il numero di cicli per ottenere facilmente lo stesso effetto per 100 label o più. Ipoteticamente impostando nel modo corretto le liste e inserendo nei cicli non dei numeri fissi ma delle operazioni che lavorano sulla lunghezza di queste liste il codice si aggiorna automaticamente e basta solo aggiungere nuovi elementi nella lista dei numeri o delle label, quindi altra operazione in meno. 

ESEMPIO DI TERZO LIVELLO 👹

Probabilmente l'esempio che mi farà perdere i pochi utenti che mi seguono 😂 anche se spero invece di acquisirne altri proprio con questa modifica. Totalmente didattica , specialmente per l'esempio in questione a causa dei numeri da gestire nelle label e lo capiremo in corso, ma per tutti i codici di manipolazione, mescolamento , distribuzione può essere molto versatile. Andremo a eliminare anche la variabile che utilizziamo per selezionare l'elemento numerico grazie ad un pò di matematica e due operazioni di base per collegare correttamente i numeri che ci arrivano dai due cicli , questo sempre in previsione di automatizzare e modificare automaticamente il codice a seconda dei dati che passiamo. 

Ripeto qualche operazione risulterà un pò più contorta ma non ho avuto modo di studiare un esempio più calzante e comunque rimane un ottimo esercizio di ragionamento.

Come promesso la variabile e il suo incremento sono scomparsi ma potete notare anche una modifica al ciclo esterno , o meglio al numero di partenza e fine da 0 a 2, e come viene calcolato l'indice da utilizzare sia per scegliere la label sia per scegliere il numero dalla lista.

Partiamo dal ragionamento , dobbiamo trovare delle operazioni e , vi anticipo, anche una costate che intrecciate a dovere con i numeri dei cicli diano i valori corretti per gestire le liste. Il numero 3 risuona spesso in questo esempio e infatti sarà fondamentale perché è proprio lo step chiave che mi indica ogni quando dovrà cambiare il mio codice. Ogni tre numeri effettuo una nuova operazione cambiando label. Questa volta non abbiamo una variabile che incrementa quindi dobbiamo accontentarci della variabile NUMERO che ci viene passata dal ciclo interno , ma tutti sappiamo che ad ogni cambio del ciclo esterno si resetta ripartendo da 1 per terminare a 3 , quindi dobbiamo collegare questa costante con i numeri 1,2 e 3 del ciclo interno e quelli del ciclo esterno ( che potrà aumentare a nostro piacimento) per ottenere un numero sempre crescente a step di 1.

Se non facessi questa operazione il ciclo interno mi prenderà sempre e solo i primi 3 elementi e li distribuirà per tutte le label.

Ad ogni giro dovrò effettuare un incremento che mi permetterà poi di sfruttare il ciclo interno per continuare la serie numerica , quindi dovrò valutare di aggiungere 3 dopo il primo giro e 6 dopo il secondo giro così da comporre 3+1= 4 , 3+2= 5, 3+3= 6 per il secondo giro e 6+1= 7 , 6+2= 8 , 6+3=9 per il terzo giro e così via . I numeri in rosso sono il famoso numero progressivo che mi gestisce i numeri da prelevare, naturalmente non posso usare una variabile che parte da 3 ed incremento di 3 ad ogni giro altrimenti sarebbe inutile.

I numeri in celeste vi dico niente ? 1,2 e 3 che si ripete ad ogni giro , per caso ci potrebbe essere utile la variabile NUMERO ? Ebbene si, ottimo il primo scoglio lo abbiamo superato. Accesa la lampadina, ci possiamo chiedere se il ciclo esterno potrebbe esserci utile per generare l'altro numero che ci serve , quello in verde.

Lo so che già hai sbirciato la foto sotto 😂 e allora leggiamo insieme la formula che ho trovato : ( NUMERO DELLA LISTA x 3) + ( NUMERO)


Ecco utilizzate anche le informazioni che arrivano dal primo ciclo e la costante che abbiamo trovato prima, l'inserimento di zero come partenza del ciclo grande ci serve proprio per annullare i valori al primo giro che dovrà proseguire senza " l'aggiunta " della costante, infatti un numero moltiplicato per zero da sempre zero ( la matematica serve sempre, incredibile ) .

Al primo giro avremo : 0+1 , 0+2 , 0+3 

al secondo giro avremo : (1x3)+1 , (1x3)+2, (1x3)+3

al terzo giro avremo : (2x3)+1, (2x3)+2, (2x3)+3

A voi i conti 😂 Questo calcolo ci darà lo stesso valore che prima andavamo ad ottenere incrementando una variabile e se riusciamo a ottimizzare la presenza di variabili all'interno di un codice è sempre una buona cosa , specialmente quando i nostri progetti ne conterranno tante. C'è però un prezzo da pagare e non mi riferisco al tasto dona del mio blog 😂 così facendo perdiamo il filo diretto che avevamo tra NUMERO DELLA LISTA  e la label da prelevare , infatti partiamo da zero e sappiamo bene che le liste su AppInventor , kodular e simili partono da 1, alzi la mano chi non ha mai sbagliato ed è uscito l'errore : zero non è un valore ammissibile per la lista Ciccio 😂😂

Si risolve con una semplice addizione che ci permetterà di usare NUMERO DELLA LISTA ma incrementato di 1 unità. Questo codice è ancora più compatto e sempre facilmente modificabile e si può autogestire con piccoli accorgimenti sulla lunghezza delle liste e un pò di matematica.

Probabilmente per chi ha studiato informatica queste saranno le basi e si farà una grassa risata ma per me è stato un  modo per mettermi alla prova, una nuova sfida, anche perché adoro come sia possibile trovare tante strade differenti per fare la stessa cosa. 

Spero vi sia piaciuto e che sia stato interessante , un pò di ragionamento non gusta mai, fatemelo sapere nei commenti, controllate se ho fatto errori 😅 o se avete domande vi aspetto sempre nei commenti o sui vari social.

Altre proposte ? 





 

Commenti

Ciao, spero ti piaccia il blog. Se ti fa piacere qui puoi offrirmi un caffè!

Post popolari in questo blog

GOOGLE SCRIPT & KODULAR READ, WRITE, UPDATE, DELETE

Tu lo conosci THUNKABLE?