Che giorno è - parte terza

Benvenuti!

Eccoci con la terza parte del nostro progetto e vediamo cosa fare, abbiamo individuato se il nostro anno è bisestile o meno e  anche come chiedere e controllare il numero di giorni inseriti, a questo punto prima di fermare lo script appena finito inviamo un messaggio calcola che andrà ad attivare una nuova sequenza di comandi che vedremo oggi.
Ci sono molte variabili e anche liste quindi le vedremo man mano spiegando anche a cosa servono , qualcuna potrebbe essere scritta in modo migliore ma i miei progetti spesso nascono in ritagli di tempo e per uso personale quindi non vado sempre per il sottile. A voi, che siete più bravi di me, specialmente se iniziate adesso ad avvicinarvi alla programmazione, al coding etc vi consiglio di essere più ordinati possibile e usare un nome che subito individui quello che rappresenta. Quando i vostri progetti diventeranno sempre più grandi , perché diventerete sempre più bravi , ordine e nomi ben calibrati saranno fondamentali sia nella fase di realizzazione che nella fase di debug.
Partiamo!
Come introdotto dal nome del messaggio andiamo ad effettuare dei calcoli perché non avendo la data nel formato classico dobbiamo ricavare alcuni dati da inserire nella formula finale o comunque per poter scrivere a video , o pronunciare , la data completa una volta finito il progetto.
La prima cosa che andremo ad individuare è il mese in cui cade il giorno inserito che vi ricordo viene introdotto con la sua posizione all'interno dell' intero anno , quindi non un giorno tra 1 e massimo 31 di un tale mese ma come 230 esimo giorno dell'anno.
Per il metodo che ho immaginato io ci servirà una variabile generica index che userò all'interno di un ciclo modificando il suo valore e usando quest'ultimo per muovermi all'interno di una lista, la lista in questione è durata mesi e contiene pensate un pò la durata di tutti i mesi , in ordine da gennaio (posizione 1) fino a dicembre (posizione 12). Per non appesantire di immagini vi consiglio di andare a vedere direttamente il progetto, adoro la possibilità che ci da scratch di poter visionare il codice di ogni progetto condiviso.Ecco il link diretto 👉 QUI 
Subito dopo  porto la variabile somma giorni ad un valore che vado a prelevare all'interno della lista durata mesi usando proprio l'index appena nominato , il valore di ritorno è la durata del mese di gennaio (posizione 1) quindi 31. Perché faccio questo ? La mia idea è quella di andare nella lista durata mesi , prendere il valore di ogni mese e sommarli tra di loro partendo da gennaio e proseguendo fino alla fine; la fine verrà identificata da un numero ben preciso e cioè quando il numero NUMERO DI GIORNI inserito da chi usa l'app è minore della somma giorni +1 che sto facendo effettuare a scratch.




Facciamo un esempio senza considerare il valore +1 così riuscirò anche a farvi capire il perché della sua aggiunta.
Prendiamo 30 come NUMERO GIORNI, scratch arrivando al ripeti fino a quando controlla se NUMERO GIORNI < somma giorni che adesso è 31 perché index è uguale ad uno, quindi gennaio.
La risposta sarà true quindi positiva e per come è stato creato questo blocco se riceve in risposta vero salta tutto quello che c'è al suo interno e va direttamente fuori, quindi a porta mese a index salvando così come mese il valore  1 che in seguito diventerà gennaio.
Effettivamente se inseriamo 30 come valore siamo a gennaio e allora vediamo con 31 cosa succede, 31 < 31 ( NUMERO GIORNI < somma giorni ) darà come risposta falso quindi a differenza di prima entrerà nel ciclo modificherà il valore di index portandolo a 2 e sommerà il valore già esistente 31 con il valore della durata del secondo mese, quindi febbraio e tornerà di nuovo all'inizio per verificare se 31 < 59 (31+28) e ricevendo vero salterà il ciclo andando a salvare il mese con il valore 2 quindi febbraio , commettendo un errore perché il trentunesimo giorno è ancora a gennaio. Ecco quindi il perché di aggiungere un valore in più rispetto a quello esatto, per poter inserire correttamente anche i valori limite, in alternativa possiamo salvare nella lista la durata già aumentata di una unità ma mi tornava credo meno intuitivo per la spiegazione .
I più attenti avranno notato che all'interno del ciclo in realtà ci sono due blocchi diversi infatti uno serve per modificare il valore da aggiungere nel caso di anno bisestile quando invece di 28 giorni dobbiamo inserire 29, infatti se BISESTILE = 1 (quindi è bisestile) e (quindi deve avvenire contemporaneamente) index = 2 quindi febbraio dobbiamo aggiungere un giorno in più a quelli salvati nella lista.
Con lo stesso criterio differenziamo anche il calcolo per capire in che giorno del mese cade quello scelto differenziando tra calcolo normale e calcolo con anno bisestile e mese febbraio, quindi ne vedremo uno solo.
Con il metodo precedente noi abbiamo un valore somma giorni superiore a quello inserito dall'utente (se cade a marzo avremo la somma dei giorni di gennaio febbraio e marzo) al quale sottraiamo proprio i giorni inseriti da chi usa l'app ricavando quanti giorni devo andare a ritroso per trovare il giorno esatto, infatti sottraggo dalla durata del mese identificato proprio questo valore.
Es. E' stato inserito 33 che a occhio subito identifichiamo con il giorno 2 (31 gennaio+2 febbraio) del mese di febbraio e vediamo se si trova : somma giorni è 59 - 33 che è NUMERO GIORNI dà come risultato 26 quindi io dovrò togliere dalla lunghezza del mese selezionato febbraio proprio 26 quindi 28-26 = 2 infatti è il secondo giorno di febbraio. Questo calcolo vale sempre anche nei conti più difficili ed è stato personalizzato con la variante bisestile con febbraio di 29.




Finalmente siamo riusciti a capire in che mese siamo e che giorno del mese è quindi possiamo andare ad utilizzare la formula che ci permette di scoprire che giorno della settimana è, questo passaggio non è diretto perché dobbiamo individuare in che periodo ci troviamo, se prima o dopo la riforma gregoriana che ha aggiornato il calendario tenendo in conto una  durata molto più precisa dell'anno .
Il primo periodo lo individuiamo facilmente perché utilizzando un semplice se allora dove verifichiamo l'anno 1582 del cambiamento e poi il secondo se allora (diviso per praticità di lunghezza) dove individuiamo il mese e il giorno che dovrà essere compreso nell'intervallo 4 < giorno < 15 che identifica precisamente il periodo di tempo cancellato dalla storia ; in questo caso inviamo il messaggio SPIEGAZIONE che ci porterà su una nuova linea di codice dove spiegheremo l' evento storico, attendiamo 0.2 sec non necessario ma precauzionale per evitare che interferisca con il blocco successivo che va a bloccare invece la linea di codice in cui siamo visto che non dobbiamo fare nessun calcolo.
Se invece il periodo è corretto proponiamo gentilmente a video con dire elemento index di lista mesi 😂 , index è ancora salvato con il valore che identifica il mese quindi andrà nella lista mesi che contiene la lista con i nomi dei mesi per poter trasformare il numero in nome , quindi 3 marzo 7 luglio e così via. Quindi scrivendo correttamente le liste possiamo con un semplice numero spostarci agilmente e prelevare le informazioni corrette.
Fatto questo rimane da dividere ancora il tempo rimanente e dobbiamo essere molto  precisi con scratch e rappresentarlo correttamente visto che la formula è differente tra prima e dopo la riforma, vediamo come ho impostato io le condizioni ma ciò non toglie che voi possiate trovare strade alternative. Ho fatto anche un piccolo schema colorato.
Per facilità ho individuato con la prima condizione tutti gli anni dopo il 1582 ( colore verde ) quindi dal 1583 in poi che va sotto il periodo gregoriano infatti invia un messaggio GREGORIANO alternativamente avremo tutti gli altri quindi dal 1582 andando a ritroso; in questo periodo abbiamo il tempo eliminato ( in rosso ) un pezzo di tempo sempre gregoriano ma non compreso nella prima condizione ( colore azzurro dal 15 ottobre 1582 fino al 1583 ) ma anche tutto il periodo giuliano.
Per questo motivo ho introdotto un altro se allora altrimenti che in tutti gli anni inferiori al 1583 ( vi ricordo che siamo nella sezione altrimenti della prima condizione ) va a differenziare l'anno 1582 in ottobre e dal giorno 15 in poi compreso , quindi il pezzettino gregoriano escluso prima ( colore azzurro ) , con tutto il resto della storia ( colore arancione ) che fa parte del periodo giuliano inviando il relativo messaggio. Da notare che la presenza della zona rossa in questa parte della divisione temporale effettuata non mi porta problemi perché ho preventivamente escluso la possibilità che arrivi a questo punto del codice una data compresa tra il 5 e il 14 ottobre del 1582.
Anche oggi abbiamo finito , con il prossimo articolo credo di riuscire ad ultimare tutto il progetto sperando di avervi incuriosito sull'utilizzo infinito di scratch ma anche su questa curiosità storica.
Alla prossima!





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?