IPB     Il futuro di Tevac dipende da te!  

Benvenuto Visitatore ( Log In | Registrati )

  · · · · · · · · · · · ·
Reply to this topicStart new topic
> [AS]calcolo del giorno natale, scopriamo in quale giorno della settimana siamo nati
Luca Dentis
messaggio 15 Oct 2007, 21:01
Messaggio #1


S.A.Y.K.
******

Gruppo: Supporter
Messaggi: 1.467
Iscritto il: 22-August 07
Da: /008/055
Utente Nr.: 8.622



confidando nella benevola comprensione dei geeks di Applescript , pubblico uno scriptino che, partendo dalla data di nascita - che però va introdotta iniziando dall'anno e finendo col giorno -, calcola in quale giorno della settimana si è nati:
CITAZIONE
-- Iniziamo creando la lista dei giorni di ciascun mese.
set giorni_mese to {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
-- Poi la lista dei giorni della settimana, cominciando da sabato.
set giorno_settimana to {"sabato", "domenica", "lunedì", "martedì", "mercoledì", "giovedì", "venerdì"}

tell application "Finder"
     -- Come primo dato, introduciamo l'anno di nascita.
     set anno to 0
     -- Con questo ciclo evitiamo che siano introdotti numeri di anni
     -- di valore inferiore a 1900 o superiore all'anno attuale.
     repeat while ((anno < 1900) or (anno > year of (current date)))
          set anno to text returned of (display dialog "Introduci l'anno di nascita" default answer "1965" buttons {"OK"} default button 1) as integer
     end repeat
     -- Ora che sappiamo qual è l'anno di nascita, vediamo se è
     -- bisestile.
     set anno_bis to my bisestile(anno)
     -- Se l'anno è bisestile, i giorni di febbraio sono 29.
     if anno_bis then set item 2 of giorni_mese to {29}
     -- Come secondo dato, introduciamo il mese di nascita; il perché
     -- di questa scelta sarà ovvio tra poco.
     set mese to 0
     -- Con questo ciclo evitiamo che siano accettati numeri di mesi
     -- di valore inferiore a 1 o superiore a 12.
     repeat while ((mese < 1) or (mese > 12))
          set mese to text returned of (display dialog "Introduci il mese di nascita" default answer "1" buttons {"OK"} default button 1) as integer
     end repeat
     -- Come terzo dato, introduciamo il giorno di nascita: ora si
     -- capirà perché è stato posposto rispetto al mese di nascita.
     set giorno to 0
     -- Con questo ciclo evitiamo non solo che siano accettati numeri
     -- di giorni di valore inferiore a 1 o superiore a 31, ma altresì
     -- che siano accettati numeri di giorni di valore superiore a
     -- quello del mese introdotto.
     repeat while ((giorno < 1) or (giorno > 31) or (giorno > item mese of giorni_mese))
          set giorno to text returned of (display dialog "Introduci il giorno di nascita" default answer "1" buttons {"OK"} default button 1) as integer
     end repeat
     -- In quest'ultima parte dello script procediamo ad individuare
     -- finalmente il numero del giorno della settimana della data
     -- di nascita.
     set numero_giorno to anno + ((anno - 1) / 4 as integer) - ((anno - 1) / 100 as integer) + ((anno - 1) / 400 as integer) + giorno
     repeat with i from 1 to (mese - 1)
          set numero_giorno to numero_giorno + (item i of giorni_mese)
     end repeat
     -- È necessario aggiungere 1 per evitare che numero_giorno
     -- assuma valore 0 (zero).
     set numero_giorno to 1 + (numero_giorno mod 7)
     -- È ora possibile visualizzare il giorno della settimana
     -- corrispondente alla data di nascita.
     display dialog "Il giorno della tua nascita è " & item numero_giorno of giorno_settimana buttons {"OK"} default button 1
end tell

-- La funzione booleana bisestile stabilisce se l'anno introdotto
-- è bisestile.
on bisestile(anno)
     return (((anno mod 4) = 0) and ((anno mod 100) is not 0)) or ((anno mod 400) = 0)
end bisestile
IMHO, le parti più didatticamente interessanti sono:
a) relativamente al ciclo di input dell'anno di nascita, l'uso di "year of (current date)" per determinare in modo dinamico l'anno corrente;
b) relativamente al ciclo di input del giorno di nascita, il test che verifica che il valore del giorno non sia superiore al numero dei giorni del mese di nascita;
c) la comparazione tra il costrutto "repeat while...end repeat" dei 3 cicli di input della data di nascita (cicli condizionali) ed il costrutto "repeat with...end repeat" del ciclo di calcolo del numero del giorno della settimana (ciclo iterativo).

BTW: il 1965 (la "default answer" per l'anno di nascita) è null'altro che l'anno in cui sono nato

-------------------------
[This script was automatically tagged for color coded syntax by Convert Script to Markup Code]


--------------------
Share All Your Knowledge

A guy's dream
Go to the top of the page
 
+Quote Post
supertux
messaggio 15 Oct 2007, 21:15
Messaggio #2


Level 3/11
***

Gruppo: Observed
Messaggi: 105
Iscritto il: 15-September 07
Utente Nr.: 8.745



Molto bello grazie!

Con esempi non troppo articolati viene voglia di imparare e di approfondire l'argomento. Semplice ed efficace... grazie!

Ci vorrebbe un piccolo prontuario dei comandi principali allora sarebbe il massimo...
Go to the top of the page
 
+Quote Post
chebfarid
messaggio 15 Oct 2007, 21:31
Messaggio #3


Level 8/11
********

Gruppo: Supporter
Messaggi: 3.763
Iscritto il: 11-July 03
Da: Milano
Utente Nr.: 395



Molto simpatico e molto ben spiegato! icon_biggrin.gif

CITAZIONE(Luca Dentis @ 15 Oct 2007, 21:01) *
IMHO, le parti più didatticamente interessanti sono:
(...)
c) la comparazione tra il costrutto "repeat while...end repeat" dei 3 cicli di input della data di nascita (cicli condizionali) ed il costrutto "repeat with...end repeat" del ciclo di calcolo del numero del giorno della settimana (ciclo iterativo).

Molto elegante questo! L'avevo già visto in qualche situazione senza capire fino in fondo la sua utilità, ma nel tuo script tutto diventa molto chiaro.

CITAZIONE
BTW: il 1965 (la "default answer" per l'anno di nascita) è null'altro che l'anno in cui sono nato
Questo invece l'avevo capito subito! icon_lol.gif

Buon scripting
Farid


--------------------
Abends lustig, morgens triste
das ist Leben von Artiste
Go to the top of the page
 
+Quote Post
poweruser
messaggio 15 Oct 2007, 23:02
Messaggio #4


MacInATopic
Gruppo icone

Gruppo: Root Admin
Messaggi: 24.319
Iscritto il: 27-July 03
Da: Maglie (LE)
Utente Nr.: 440



Bello script, utile soprattutto didatticamente perché usa molte delle strutture del linguaggio AppleScript.
Di seguito una versione semplificata che fa tutto in due righe sfruttando le funzioni del linguaggio.
CODICE
-- chiediamo la data
set t to text returned of (display dialog "Inserisci la data:" default answer "2/3/82")
try
    -- convertiamo il testo in data
    set d to date t
on error
    display dialog "Mi prendi in giro?
Scrivi una data corretta la prossima volta!"
    return
end try

-- otteniamo il giorno
set g to weekday of d

-- lo mostriamo in inglese…
display dialog g

-- … e in italiano
set gg to {"Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica"}
set g to g as number
display dialog item g of gg


Ciao
Paolo


--------------------
Paolo Portaluri

guru, n: A computer owner who can read the manual.
Go to the top of the page
 
+Quote Post
chebfarid
messaggio 15 Oct 2007, 23:43
Messaggio #5


Level 8/11
********

Gruppo: Supporter
Messaggi: 3.763
Iscritto il: 11-July 03
Da: Milano
Utente Nr.: 395



Ehhm... però il giorno in inglese non corrisponde a quello italiano... icon_rolleyes.gif
9/12/62
-> sat
-> Domenica

Ciao
Farid

EDIT: Mi sembrava strano, perché naturalmente la procedura di Paolo è corretta! La lista delle giornate deve cominciare con la Domenica icon_wink.gif

CODICE
set gg to {"Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"}


--------------------
Abends lustig, morgens triste
das ist Leben von Artiste
Go to the top of the page
 
+Quote Post
poweruser
messaggio 16 Oct 2007, 00:10
Messaggio #6


MacInATopic
Gruppo icone

Gruppo: Root Admin
Messaggi: 24.319
Iscritto il: 27-July 03
Da: Maglie (LE)
Utente Nr.: 440



Giusto, e dire che avevo pure controllato questa cosa, sarà stata l'ora tarda icon_confused.gif.

Ciao
Paolo


--------------------
Paolo Portaluri

guru, n: A computer owner who can read the manual.
Go to the top of the page
 
+Quote Post
Luca Dentis
messaggio 16 Oct 2007, 09:15
Messaggio #7


S.A.Y.K.
******

Gruppo: Supporter
Messaggi: 1.467
Iscritto il: 22-August 07
Da: /008/055
Utente Nr.: 8.622



Riesaminando il codice, mi sono accorto della possibilità di meglio strutturare i cicli condizionali relativi all'input della data di nascita, nonché d'un bug nel calcolo della variabile "numero_giorno" qualora l'anno introdotto sia quello corrente.
Ecco qui di seguito il codice revisionato:
CITAZIONE
-- Iniziamo creando la lista dei giorni di ciascun mese.
set giorni_mese to {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
-- Poi la lista dei giorni della settimana, cominciando da sabato.
set giorno_settimana to {"sabato", "domenica", "lunedì", "martedì", "mercoledì", "giovedì", "venerdì"}
-- Infine mese ed anno della data di oggi.
set questo_mese to month of (current date)
set questo_anno to year of (current date)

tell application "Finder"
     -- Come primo dato, introduciamo l'anno di nascita.
     set anno to 0
     -- Con questo ciclo evitiamo che siano introdotti numeri di anni
     -- di valore inferiore a 1900 o superiore all'anno attuale.
     repeat while ((anno < 1900) or (anno > questo_anno))
          set anno to text returned of (display dialog "Introduci l'anno di nascita" default answer "1965" buttons {"OK"} default button 1) as integer
     end repeat
     -- Ora che sappiamo qual è l'anno di nascita, vediamo se è
     -- bisestile.
     set anno_bis to my bisestile(anno)
     -- Se l'anno è bisestile, i giorni di febbraio sono 29.
     if anno_bis then set item 2 of giorni_mese to {29}
     -- Come secondo dato, introduciamo il mese di nascita; il perché
     -- di questa scelta sarà ovvio tra poco
     set mese to 0
     -- Con questo ciclo evitiamo che siano accettati numeri di mesi
     -- di valore inferiore a 1 o superiore a 12 o a quello del mese
     -- attuale.
     repeat while ((mese < 1) or (mese > 12) or ((anno = questo_anno) and (mese > questo_mese)))
          set mese to text returned of (display dialog "Introduci il mese di nascita" default answer "1" buttons {"OK"} default button 1) as integer
     end repeat
     -- Come terzo dato, introduciamo il giorno di nascita: ora si
     -- capirà perché è stato posposto rispetto al mese di nascita.
     set giorno to 0
     -- Con questo ciclo evitiamo che siano accettati numeri
     -- di giorni di valore inferiore a 1 o superiore a quello
     -- del mese introdotto.
     repeat while ((giorno < 1) or (giorno > item mese of giorni_mese))
          set giorno to text returned of (display dialog "Introduci il giorno di nascita" default answer "1" buttons {"OK"} default button 1) as integer
     end repeat
     -- In quest'ultima parte dello script procediamo ad individuare
     -- finalmente il numero del giorno della settimana della data
     -- di nascita.
     set numero_giorno to anno + ((anno - 1) / 4 as integer) - ((anno - 1) / 100 as integer) + ((anno - 1) / 400 as integer) + giorno
     repeat with i from 1 to (mese - 1)
          set numero_giorno to numero_giorno + (item i of giorni_mese)
     end repeat
     -- Se l'anno è quello corrente, occorre sottrarre 1 a
     -- numero_giorno.
     if anno = questo_anno then set numero_giorno to (numero_giorno - 1)
     -- Poiché (numero_giorno mod 7) potrebbe dare 0 (zero)
     -- come risultato, ma non esiste un item 0, allora occorre
     -- aggiungere 1 a (numero_giorno mod 7) così che i valori
     -- siano compresi tra 1 e 7.
     set numero_giorno to 1 + (numero_giorno mod 7)
     -- È ora possibile visualizzare il giorno della settimana
     -- corrispondente alla data di nascita.
     display dialog "Il giorno della tua nascita è " & item numero_giorno of giorno_settimana buttons {"OK"} default button 1
end tell

-- La funzione booleana bisestile stabilisce se l'anno introdotto
-- è bisestile.
on bisestile(anno)
     return (((anno mod 4) = 0) and ((anno mod 100) is not 0)) or ((anno mod 400) = 0)
end bisestile


-------------------------
[This script was automatically tagged for color coded syntax by Convert Script to Markup Code]


--------------------
Share All Your Knowledge

A guy's dream
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic

 

Collapse

> 

    Titolo discussione Risposte Autore discussione Visite Ultima azione
No new 10 marcoch 170 4 November 2008 - 17:23
Ultimo messaggio di: marcoch
No New Posts   3 MacIavelli 128 1 October 2008 - 14:25
Ultimo messaggio di: MacIavelli
No New Posts 2 alcina 106 25 September 2008 - 19:17
Ultimo messaggio di: alcina
No New Posts   5 alby83 226 12 September 2008 - 10:43
Ultimo messaggio di: alby83
No new   23 Emanuele Guicciardi 1.124 8 August 2008 - 10:33
Ultimo messaggio di: saurospagnol
No New Posts   0 TevacPhoto 16 29 June 2008 - 14:57
Ultimo messaggio di: TevacPhoto
No New Posts   0 TevacPhoto 8 29 June 2008 - 14:57
Ultimo messaggio di: TevacPhoto
No new   15 Tevac 1.892 10 March 2008 - 16:23
Ultimo messaggio di: Zagor
No New Posts   4 melo 191 21 January 2008 - 07:11
Ultimo messaggio di: melo
No new 46