Benvenuto Visitatore ( Log In | Registrati )
![]() ![]() |
15 Oct 2007, 21:01
Messaggio
#1
|
|
|
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. IMHO, le parti più didatticamente interessanti sono: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 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] -------------------- |
|
|
|
|
|
|
|
15 Oct 2007, 21:15
Messaggio
#2
|
|
|
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... |
|
|
|
|
15 Oct 2007, 21:31
Messaggio
#3
|
|
|
Molto simpatico e molto ben spiegato!
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! Buon scripting Farid -------------------- Abends lustig, morgens triste
das ist Leben von Artiste |
|
|
|
|
15 Oct 2007, 23:02
Messaggio
#4
|
|
|
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 -------------------- |
|
|
|
|
15 Oct 2007, 23:43
Messaggio
#5
|
|
|
Ehhm... però il giorno in inglese non corrisponde a quello italiano...
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 CODICE set gg to {"Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"}
-------------------- Abends lustig, morgens triste
das ist Leben von Artiste |
|
|
|
|
16 Oct 2007, 00:10
Messaggio
#6
|
|
|
Giusto, e dire che avevo pure controllato questa cosa, sarà stata l'ora tarda
Ciao Paolo -------------------- |
|
|
|
|
16 Oct 2007, 09:15
Messaggio
#7
|
|
|
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] -------------------- |
|
|
|
|
![]() ![]() |
| Titolo discussione | Risposte | Autore discussione | Visite | Ultima azione | ||
|---|---|---|---|---|---|---|
![]() |
10 | marcoch | 170 | 4 November 2008 - 17:23 Ultimo messaggio di: marcoch |
||
![]() |
3 | MacIavelli | 128 | 1 October 2008 - 14:25 Ultimo messaggio di: MacIavelli |
||
![]() |
2 | alcina | 106 | 25 September 2008 - 19:17 Ultimo messaggio di: alcina |
||
![]() |
5 | alby83 | 226 | 12 September 2008 - 10:43 Ultimo messaggio di: alby83 |
||
![]() |
23 | Emanuele Guicciardi | 1.124 | 8 August 2008 - 10:33 Ultimo messaggio di: saurospagnol |
||
![]() |
0 | TevacPhoto | 16 | 29 June 2008 - 14:57 Ultimo messaggio di: TevacPhoto |
||
![]() |
0 | TevacPhoto | 8 | 29 June 2008 - 14:57 Ultimo messaggio di: TevacPhoto |
||
![]() |
15 | Tevac | 1.892 | 10 March 2008 - 16:23 Ultimo messaggio di: Zagor |
||
![]() |
4 | melo | 191 | 21 January 2008 - 07:11 Ultimo messaggio di: melo |
||
![]() |
46 |