diff options
Diffstat (limited to 'it-it')
| -rw-r--r-- | it-it/bash-it.html.markdown | 72 | ||||
| -rw-r--r-- | it-it/brainfuck-it.html.markdown | 111 | ||||
| -rw-r--r-- | it-it/c++-it.html.markdown | 211 | ||||
| -rw-r--r-- | it-it/coffeescript-it.html.markdown | 34 | ||||
| -rw-r--r-- | it-it/elixir-it.html.markdown | 10 | ||||
| -rw-r--r-- | it-it/java-it.html.markdown | 170 | ||||
| -rw-r--r-- | it-it/json-it.html.markdown | 25 | 
7 files changed, 442 insertions, 191 deletions
| diff --git a/it-it/bash-it.html.markdown b/it-it/bash-it.html.markdown index f892845f..af8823c4 100644 --- a/it-it/bash-it.html.markdown +++ b/it-it/bash-it.html.markdown @@ -13,13 +13,14 @@ contributors:  filename: LearnBash.sh  translators:      - ["Robert Margelli", "http://github.com/sinkswim/"] +    - ["Tommaso Pifferi", "http://github.com/neslinesli93/"]  lang: it-it  ---  Bash è il nome della shell di unix, la quale è stata distribuita anche come shell del sistema oprativo GNU e la shell di default su Linux e Mac OS X.  Quasi tutti gli esempi sottostanti possono fare parte di uno shell script o eseguiti direttamente nella shell. -[Per saperne di piu'.](http://www.gnu.org/software/bash/manual/bashref.html) +[Per saperne di più.](http://www.gnu.org/software/bash/manual/bashref.html)  ```bash  #!/bin/bash @@ -34,32 +35,34 @@ echo Ciao mondo!  echo 'Questa è la prima riga'; echo 'Questa è la seconda riga'  # Per dichiarare una variabile: -VARIABILE="Una stringa" +Variabile="Una stringa"  # Ma non così: -VARIABILE = "Una stringa" -# Bash stabilirà che VARIABILE è un comando da eseguire e darà un errore +Variabile = "Una stringa" +# Bash stabilirà che Variabile è un comando da eseguire e darà un errore  # perchè non esiste.  # Usare la variabile: -echo $VARIABILE -echo "$VARIABILE" -echo '$VARIABILE' +echo $Variabile +echo "$Variabile" +echo '$Variabile'  # Quando usi la variabile stessa - assegnala, esportala, oppure — scrivi  # il suo nome senza $. Se vuoi usare il valore della variabile, devi usare $.  # Nota che ' (singolo apice) non espande le variabili!  # Sostituzione di stringhe nelle variabili -echo ${VARIABILE/Una/A} +echo ${Variabile/Una/A}  # Questo sostituirà la prima occorrenza di "Una" con "La"  # Sottostringa di una variabile -echo ${VARIABILE:0:7} +Lunghezza=7 +echo ${Variabile:0:Lunghezza}  # Questo ritornerà solamente i primi 7 caratteri  # Valore di default per la variabile -echo ${FOO:-"ValoreDiDefaultSeFOOMancaOÈ Vuoto"} -# Questo funziona per null (FOO=), stringa vuota (FOO=""), zero (FOO=0) ritorna 0 +echo ${Foo:-"ValoreDiDefaultSeFooMancaOppureÈVuoto"} +# Questo funziona per null (Foo=), stringa vuota (Foo=""), zero (Foo=0) ritorna 0 +# Nota: viene ritornato il valore di default, il contenuto della variabile pero' non cambia.  # Variabili builtin:  # Ci sono delle variabili builtin molto utili, come @@ -71,31 +74,40 @@ echo "Argomenti dello script separati in variabili distinte: $1 $2..."  # Leggere un valore di input:  echo "Come ti chiami?" -read NOME # Nota che non abbiamo dovuto dichiarare una nuova variabile -echo Ciao, $NOME! +read Nome # Nota che non abbiamo dovuto dichiarare una nuova variabile +echo Ciao, $Nome!  # Classica struttura if:  # usa 'man test' per maggiori informazioni sulle condizionali -if [ $NOME -ne $USER ] +if [ $Nome -ne $USER ]  then      echo "Il tuo nome non è lo username"  else      echo "Il tuo nome è lo username"  fi +# Nota: se $Name è vuoto, la condizione precedente viene interpretata come: +if [ -ne $USER ] +# che genera un errore di sintassi. Quindi il metodo sicuro per usare +# variabili che possono contenere stringhe vuote è il seguente: +if [ "$Name" -ne $USER ] ... +# che viene interpretato come: +if [ "" -ne $USER ] ... +# e dunque funziona correttamente. +  # C'è anche l'esecuzione condizionale  echo "Sempre eseguito" || echo "Eseguito solo se la prima condizione fallisce"  echo "Sempre eseguito" && echo "Eseguito solo se la prima condizione NON fallisce"  # Per usare && e || con l'if, c'è bisogno di piu' paia di parentesi quadre: -if [ $NOME == "Steve" ] && [ $ETA -eq 15 ] +if [ "$Nome" == "Steve" ] && [ "$Eta" -eq 15 ]  then -    echo "Questo verrà eseguito se $NOME è Steve E $ETA è 15." +    echo "Questo verrà eseguito se $Nome è Steve E $Eta è 15."  fi -if [ $NOME == "Daniya" ] || [ $NOME == "Zach" ] +if [ "$Nome" == "Daniya" ] || [ "$Nome" == "Zach" ]  then -    echo "Questo verrà eseguito se $NAME è Daniya O Zach." +    echo "Questo verrà eseguito se $Nome è Daniya O Zach."  fi  # Le espressioni sono nel seguente formato: @@ -137,7 +149,7 @@ python hello.py > /dev/null 2>&1  # se invece vuoi appendere usa ">>":  python hello.py >> "output.out" 2>> "error.err" -# Sovrascrivi output.txt, appendi a error.err, e conta le righe: +# Sovrascrivi output.out, appendi a error.err, e conta le righe:  info bash 'Basic Shell Features' 'Redirections' > output.out 2>> error.err  wc -l output.out error.err @@ -145,7 +157,7 @@ wc -l output.out error.err  # vedi: man fd  echo <(echo "#ciaomondo") -# Sovrascrivi output.txt con "#helloworld": +# Sovrascrivi output.out con "#helloworld":  cat > output.out <(echo "#helloworld")  echo "#helloworld" > output.out  echo "#helloworld" | cat > output.out @@ -164,7 +176,7 @@ echo "Ci sono $(ls | wc -l) oggetti qui."  echo "Ci sono `ls | wc -l` oggetti qui."  # Bash utilizza uno statemente case che funziona in maniera simile allo switch in Java e C++: -case "$VARIABILE" in  +case "$Variabile" in       #Lista di pattern per le condizioni che vuoi soddisfare      0) echo "C'è uno zero.";;      1) echo "C'è un uno.";; @@ -172,10 +184,10 @@ case "$VARIABILE" in  esac  # I cicli for iterano per ogni argomento fornito: -# I contenuti di $VARIABILE sono stampati tre volte. -for VARIABILE in {1..3} +# I contenuti di $Variabile sono stampati tre volte. +for Variabile in {1..3}  do -    echo "$VARIABILE" +    echo "$Variabile"  done  # O scrivilo con il "ciclo for tradizionale": @@ -186,16 +198,16 @@ done  # Possono essere usati anche per agire su file..  # Questo eseguirà il comando 'cat' su file1 e file2 -for VARIABILE in file1 file2 +for Variabile in file1 file2  do -    cat "$VARIABILE" +    cat "$Variabile"  done  # ..o dall'output di un comando  # Questo eseguirà cat sull'output di ls. -for OUTPUT in $(ls) +for Output in $(ls)  do -    cat "$OUTPUT" +    cat "$Output"  done  # while loop: @@ -223,7 +235,7 @@ bar ()  }  # Per chiamare la funzione -foo "Il mio nome è" $NOME +foo "Il mio nome è" $Nome  # Ci sono un sacco di comandi utili che dovresti imparare:  # stampa le ultime 10 righe di file.txt @@ -245,7 +257,7 @@ grep "^foo.*bar$" file.txt  grep -c "^foo.*bar$" file.txt  # se vuoi letteralmente cercare la stringa,  # e non la regex, usa fgrep (o grep -F) -fgrep "^foo.*bar$" file.txt  +fgrep "^foo.*bar$" file.txt  # Leggi la documentazione dei builtin di bash con il builtin 'help' di bash: diff --git a/it-it/brainfuck-it.html.markdown b/it-it/brainfuck-it.html.markdown index 4999d7e6..08d2ede9 100644 --- a/it-it/brainfuck-it.html.markdown +++ b/it-it/brainfuck-it.html.markdown @@ -1,75 +1,72 @@  --- -  language: brainfuck  contributors:      - ["Prajit Ramachandran", "http://prajitr.github.io/"]      - ["Mathias Bynens", "http://mathiasbynens.be/"]  translators:      - ["Ivan Sala", "http://slavni96.github.io/"] +    - ["Christian Grasso", "http://chris54721.net"]  lang: it-it -  --- -Brainfuck è un linguaggio di programmazione estremamente minimale, -ma è ingrado di rappresentare completamente una macchina di turnig, -e sfrutta solo 8 caratteri. -[Per saperne di più](http://it.wikipedia.org/wiki/Brainfuck) +Brainfuck è un linguaggio di programmazione +[Turing equivalente](https://it.wikipedia.org/wiki/Turing_equivalenza) +estremamente minimale, composto da solo 8 comandi. + +Puoi provarlo nel tuo browser utilizzando +[brainfuck-visualizer](http://fatiherikli.github.io/brainfuck-visualizer/).  ``` -Qualsiasi carattere che non sia "><+-.,[]" (escludendo gli apici)  +Qualsiasi carattere diverso da "><+-.,[]" (escludendo gli apici)  viene ignorato. -Branfuck è caratterizzato da un array (vettore) di 30,000 celle  -inizializzare a zero, e un puntatore che punta alla cella corrente. +Branfuck è caratterizzato da un array di 30,000 celle inizializzate a zero +e da un puntatore che punta alla cella corrente. -Vi sono solo otto comando: +Vi sono otto comandi:  + : Incrementa il valore della cella attuale di uno.  - : Decrementa il valore della cella attuale di uno. -> : Sposta il puntatore sulla cella seguente (prossima a destra). -< : Sposta il puntatore sulla cella precendete (precedente a sinistra). -. : Stampa il valore in ASCII della cella corrente. (es: 65 = 'A') -, : Legge un singolo carattere come input per la cella corrente. -[ : Se il valore della cella corrente è zero, conclude il ciclo  -    andando alla sua corrispondente ]. +> : Sposta il puntatore sulla cella seguente (sulla destra). +< : Sposta il puntatore sulla cella precendete (sulla sinistra). +. : Stampa il valore ASCII della cella corrente. (es. 65 = 'A') +, : Legge un singolo carattere come input e lo salva nella cella corrente. +[ : Se il valore della cella corrente è zero, prosegue fino alla ] corrispondente.      Altrimenti, passa alla prossima istruzione.  ] : Se il valore della cella corrente è zero, passa alla prossima istruzione. -    Altrimenti torna indetro fino alla [ corrispondente.  +    Altrimenti, torna indietro fino alla [ corrispondente. -[ e ] creano un loop (while). Ovviamente dovranno essere bilanciati. -Per ogni [ dovrà corrispondere una ] +[ e ] formano un ciclo while. Ovviamente dovranno essere bilanciati. +(Ad ogni [ dovrà corrispondere una ]) -Alcuni semplici esempi di programmi scritti in Brainfuck: +Ecco alcuni semplici esempi di programmi scritti in Brainfuck:  ++++++ [ > ++++++++++ < - ] > +++++ . -Questo programma stampa in output la lettera 'A'. Priam incrementa -la cella #1 fino a 6, Quindi la cella #1 viene usata per crare un ciclo. -Poi, entra in un loop ([) e si sposta alla cella #2. -Incrementa la cella #2 10 volte, e torna alla cella #1, e la decrementa. -Questo avviene 6 volte (servono che la cella #1 venga decrementata 6 volte -per raggiungere lo 0. Quindi passa alla corrispondente ] e prosegue). +Questo programma stampa in output la lettera 'A'. Prima di tutto, incrementa +la cella #1 fino al valore 6. La cella #1 verrà utilizzata per il ciclo. +Poi, entra nel ciclo ([) e si sposta alla cella #2. Incrementa la cella #2 10 +volte, torna alla cella #1, e decrementa quest'ultima. +Il ciclo si ripete 6 volte (la cella #1 viene decrementata 6 volte prima di +raggiungere lo 0, quindi prosegue oltre la corrispondente ]). -A questo punto, siamo sulla cella #1, che ha valore 0,  -la cella #2 ha valore 60 (6*10). Ci spostiamo sulla cella #2, incrementiamo -per 5 volte, e otteniamo il valore 65, quindi stampaimo il valore della cella -#2 (.). -65 è 'A' in ASCII, quindi alla fine viene stampata 'A'. +A questo punto, siamo sulla cella #1, che ha valore 0, mentre la cella #2 ha +valore 60. Ci spostiamo sulla cella #2, la incrementiamo per 5 volte, ottenendo +il valore 65, quindi stampiamo il valore della cella #2. +Il valore 65 equivale ad 'A' in ASCII, per cui viene stampato 'A' nel terminale.  , [ > + < - ] > . -Questo programma legge un carattere come input dall'utente,  -quindi salva il carattere dentro la cella #1. -In seguito, incominca a ciclare. -Si sposta alla cella #², e increementa il valore della cella (#2). -Quindi torna alla cella #1, e decrementa il valore della cella (#1). -Questo continua fino a quando la cella #²1 diventa 0, e quindi la cella #2 -avrà il valore iniziale della cella #1. -Infine, visto che ci troviamo sulla cella #1 alla fine del ciclo, si sposta -sulla cella #2 e stampa il valore in ASCII. +Questo programma legge un carattere come input dall'utente, quindi salva il +carattere nella cella #1. Dopodichè entra in un ciclo. Si sposta alla cella #2, +incrementa quest'ultima, torna alla cella #1, e decrementa quest'ultima. +Il ciclo continua fino a quando la cella #1 diventa 0, e quindi la cella #2 +avrà il valore iniziale della cella #1. Infine, visto che ci troviamo sulla +cella #1 alla fine del ciclo, si sposta sulla cella #2 e stampa il valore in +ASCII. -Gli spazi nel codice sovrastante, sono presenti solo a scopo di ottenere -una maggiore leggibilità, si poteva anche scrivere senza: +Gli spazi nel codice sovrastante sono presenti solo a scopo di ottenere +una maggiore leggibilità. Lo stesso programma poteva essere scritto senza spazi:  ,[>+<-]>. @@ -77,25 +74,19 @@ Proviamo, adesso, a capire cosa fa invece questo programma:  ,>,< [ > [ >+ >+ << -] >> [- << + >>] <<< -] >> -Prende due numeri in input e quindi li moltiplica. +Il programma legge 2 numeri come input dall'utente, e li moltiplica. -Prima prende in input i due numeri (,>,<), quindi inizia un cilclo -basandosi sulla cella #1. -Quindi si sposta sulla cella #2, e inizia un altro ciclo condizionato -dal valore della cella #2, incrementando la cella #3. +Innanzitutto, legge in input i due numeri. Poi entra nel ciclo più esterno +basandosi sulla cella #1. Quindi si sposta sulla cella #2, e inizia il ciclo +più interno basandosi sul valore della cella #2, incrementando la cella #3.  Arrivati a questo punto abbiamo un problema: alla fine del ciclo interno -la cella #2 ha valore 0. In questo caso, quando il ciclo esterno rifarà -partire il ciclo interno, non funzionerà più perchè la cella #2 ha valore 0. -Per ovviare a questo problema, oltre alla cella 3, incrementiamo anche la cella -#4, e alla fine di ogni ciclo interno copiala il valore della cella #4  -nella cella #2, in modo che il ciclo interno  -possa essere eseguito una altra volta. -Alla fine la cella #3 contiene il risultato. +la cella #2 avrà valore 0. Ciò impedirà di eseguire nuovamente il ciclo interno. +Per ovviare a questo problema, incrementiamo anche la cella #4, e copiamo il +valore di quest'ultima nella cella #2. +Il risultato sarà infine contenuto nella cella #3.  ``` -E questo è brainfuck...Non è difficele, vero?  -Per divertimento adesso puoi scrivere i tuoi programmi in brainfuck, -oppure puoi scrivere un interprete brainfuck in un altro linguaggio. -L'interprete è abbastanza semplice da implementare, ma se sei veramente -masochista prova ad implementare un interprete brainfuck in... -brainfuck. +E questo è brainfuck. Non è così difficile, eh? Se vuoi, ora puoi scrivere per +divertimento altri programmi in brainfuck, oppure scrivere un interprete +brainfuck in un altro linguaggio. L'interprete è abbastanza semplice da +implementare, ma se sei veramente masochista, prova ad implementare un interprete brainfuck... in brainfuck. diff --git a/it-it/c++-it.html.markdown b/it-it/c++-it.html.markdown index e7e1d89e..92ebc165 100644 --- a/it-it/c++-it.html.markdown +++ b/it-it/c++-it.html.markdown @@ -4,6 +4,8 @@ filename: learncpp-it.cpp  contributors:      - ["Steven Basart", "http://github.com/xksteven"]      - ["Matt Kline", "https://github.com/mrkline"] +    - ["Geoff Liu", "http://geoffliu.me"] +    - ["Connor Waters", "http://github.com/connorwaters"]  translators:      - ["Robert Margelli", "http://github.com/sinkswim/"]  lang: it-it @@ -54,11 +56,11 @@ int main(int argc, char** argv)  // Tuttavia, il C++ varia nei seguenti modi: -// In C++, i caratteri come letterali sono da un byte. -sizeof('c') == 1 +// In C++, i caratteri come letterali sono dei char. +sizeof('c') == sizeof(char) == 1 -// In C, i caratteri come letterali sono della stessa dimensione degli interi. -sizeof('c') == sizeof(10) +// In C, i caratteri come letterali sono degli interi. +sizeof('c') == sizeof(int)  // C++ ha prototipizzazione rigida @@ -160,11 +162,14 @@ void foo()  int main()  { -    // Assume che tutto venga dal namespace "Secondo" -    // a meno che non venga dichiarato altrimenti. +    // Include tutti i simboli del namespace Secondo nello scope attuale. +    // Osserva che chiamare semplicemente foo() non va più bene perché è ambiguo: +    // bisogna specificare se vogliamo chiamare foo definita nel namespace Secondo +    // o foo definita nel livello principale del programma. +      using namespace Secondo; -    foo(); // stampa "Questa è Secondo::foo" +    Secondo::foo(); // stampa "Questa è Secondo::foo"      Primo::Annidato::foo(); // stampa "Questa è Primo::Annidato::foo"      ::foo(); // stampa "Questa è foo globale"  } @@ -244,12 +249,137 @@ cout << fooRef; // Stampa "Io sono foo. Ciao!"  // Non riassegna "fooRef". Questo è come scrivere "foo = bar", e  //   foo == "Io sono bar"  // dopo questa riga. +cout << &fooRef << endl; // Stampa l'indirizzo di foo  fooRef = bar; +cout << &fooRef << endl; // Stampa lo stesso l'indirizzo di foo +cout << fooRef;  // Stampa "Io sono bar" + +// L'indirizzo di fooRef rimane lo stesso, ovvero si riferisce ancora a foo. +  const string& barRef = bar; // Crea un riferimento const a bar.  // Come in C, i valori const (i puntatori e i riferimenti) non possono essere modificati.  barRef += ". Ciao!"; // Errore, i riferimenti const non possono essere modificati. +// Facciamo un piccolo excursus: prima di approfondire ancora i riferimenti, è necessario +// introdurre il concetto di oggetto temporaneo. Supponiamo di avere il seguente codice: +string tempObjectFun() { ... } +string retVal = tempObjectFun(); + +// Nella seconda riga si ha che: +//   - un oggetto di tipo stringa viene ritornato da tempObjectFun +//   - viene costruita una nuova stringa, utilizzando l'oggetto ritornato come +//     argomento per il costruttore +//   - l'oggetto ritornato da tempObjectFun viene distrutto +// L'oggetto ritornato da tempObjectFun viene detto oggetto temporaneo. +// Un oggetto temporaneo viene creato quando una funzione ritorna un oggetto, e viene +// distrutto quando l'espressione che lo racchiude termina la sua esecuzione - questo +// comportamento viene definito dallo standard, ma i compilatori possono modificarlo +// a piacere. Cerca su google "return value optimization" se vuoi approfondire. +// Dunque nel seguente codice: +foo(bar(tempObjectFun())) + +// dando per scontato che foo e bar esistano, l'oggetto ritornato da tempObjectFun +// è passato a bar ed è distrutto prima dell'invocazione di foo. + +// Tornando ai riferimenti, c'è un'eccezione a quanto appena detto. +// Infatti un oggetto temporaneo "viene distrutto quando l'espressione +// che lo racchiude termina la sua esecuzione", tranne quando è legato ad un +// riferimento di tipo const. In tal caso la sua vita viene estesa per tutto +// lo scope attuale: + +void constReferenceTempObjectFun() { +    // constRef riceve l'oggetto temporaneo, che non viene distrutto fino +    // alla fine di questa funzione. +    const string& constRef = tempObjectFun(); +    ... +} + +// Un altro tipo di riferimento introdotto nel C++11 è specifico per gli +// oggetti temporanei. Non puoi dichiarare una variabile di quel tipo, ma +// ha la precedenza nella risoluzione degli overload: + +void someFun(string& s) { ... }  // Riferimento normale +void someFun(string&& s) { ... }  // Riferimento ad un oggetto temporaneo + +string foo; +someFun(foo);  // Chiama la versione con il riferimento normale +someFun(tempObjectFun());  // Chiama la versione con il riferimento temporaneo + +// Ad esempio potrai vedere questi due costruttori per std::basic_string: +basic_string(const basic_string& other); +basic_string(basic_string&& other); + +// L'idea è che se noi costruiamo una nuova stringa a partire da un oggetto temporaneo +// (che in ogni caso verrà distrutto), possiamo avere un costruttore più efficiente +// che in un certo senso "recupera" parti di quella stringa temporanea. +// Ci si riferisce a questo concetto come "move semantics". + +///////////////////// +// Enum +///////////////////// + +// Gli enum sono un modo per assegnare un valore ad una costante, e sono +// principalmente usati per rendere il codice più leggibile. +enum ETipiMacchine +{ +  AlfaRomeo, +  Ferrari, +  SUV, +  Panda +}; + +ETipiMacchine GetPreferredCarType() +{ +    return ETipiMacchine::Ferrari; +} + +// Dal C++11 in poi c'è un modo molto semplice per assegnare un tipo ad un enum, +// che può essere utile per la serializzazione dei dati o per convertire gli enum +// tra il tipo desiderato e le rispettive costanti. +enum ETipiMacchine : uint8_t +{ +  AlfaRomeo, // 0 +  Ferrari, // 1 +  SUV = 254, // 254 +  Ibrida // 255 +}; + +void WriteByteToFile(uint8_t InputValue) +{ +    // Serializza InputValue in un file +} + +void WritePreferredCarTypeToFile(ETipiMacchine InputCarType) +{ +    // L'enum viene implicitamente convertito ad un uint8_t poiché +    // è stato dichiarato come tale +    WriteByteToFile(InputCarType); +} + +// D'altro canto potresti voler evitare che un enum venga accidentalmente convertito +// in un intero o in un altro tipo, quindi è possibile create una classe enum che +// impedisce la conversione implicita. +enum class ETipiMacchine : uint8_t +{ +  AlfaRomeo, // 0 +  Ferrari, // 1 +  SUV = 254, // 254 +  Ibrida // 255 +}; + +void WriteByteToFile(uint8_t InputValue) +{ +    // Serializza InputValue in un file +} + +void WritePreferredCarTypeToFile(ETipiMacchine InputCarType) +{ +    // Il compilatore darà errore anche se ETipiMacchine è un uint8_t: questo +    // perchè abbiamo dichiarato l'enum come "enum class"! +    WriteByteToFile(InputCarType); +} +  //////////////////////////////////////////////////  // Classi e programmazione orientata agli oggetti  ///////////////////////////////////////////////// @@ -296,13 +426,16 @@ public:      // Questi sono chiamati quando un oggetto è rimosso o esce dalla visibilità.      // Questo permette paradigmi potenti come il RAII      // (vedi sotto) -    // I distruttori devono essere virtual per permettere a classi di essere derivate da questa. +    // I distruttori devono essere virtual per permettere a classi di essere +    // derivate da questa; altrimenti, il distruttore della classe derivata +    // non viene chiamato se l'oggetto viene distrutto tramite un riferimento alla +    // classe da cui ha ereditato o tramite un puntatore.      virtual ~Dog();  }; // Un punto e virgola deve seguire la definizione della funzione  // Le funzioni membro di una classe sono generalmente implementate in files .cpp . -void Cane::Cane() +Cane::Cane()  {      std::cout << "Un cane è stato costruito\n";  } @@ -325,7 +458,7 @@ void Cane::print() const      std::cout << "Il cane è " << nome << " e pesa " << peso << "kg\n";  } -void Cane::~Cane() +Cane::~Cane()  {      cout << "Ciao ciao " << nome << "\n";  } @@ -340,10 +473,12 @@ int main() {  // Ereditarietà: -// Questa classe eredita tutto ciò che è public e protected dalla classe Cane +// Questa classe eredita tutto ciò che è public e protected dalla classe Cane, +// ma anche ciò che privato: tuttavia non potrà accedere direttamente a membri/metodi +// privati se non c'è un metodo pubblico o privato che permetta di farlo.  class MioCane : public Cane { -    void impostaProprietario(const std::string& proprietarioCane) +    void impostaProprietario(const std::string& proprietarioCane);      // Sovrascrivi il comportamento della funzione print per tutti i MioCane. Vedi      // http://it.wikipedia.org/wiki/Polimorfismo_%28informatica%29 @@ -447,6 +582,7 @@ int main () {  // definire una classe o una funzione che prende un parametro di un dato tipo:  template<class T>  class Box { +public:      // In questa classe, T può essere usato come qualsiasi tipo.      void inserisci(const T&) { ... }  }; @@ -519,19 +655,23 @@ printMessage<10>();  // Stampa "Impara il C++ più velocemente in soli 10 minuti  // (vedi http://en.cppreference.com/w/cpp/error/exception)  // ma ogni tipo può essere lanciato come eccezione  #include <exception> +#include <stdexcept>  // Tutte le eccezioni lanciate all'interno del blocco _try_ possono essere catturate dai successivi   // handlers _catch_.  try {      // Non allocare eccezioni nello heap usando _new_. -    throw std::exception("È avvenuto un problema"); +    throw std::runtime_error("C'è stato un problema.");  } +  // Cattura le eccezioni come riferimenti const se sono oggetti  catch (const std::exception& ex)  { -  std::cout << ex.what(); +    std::cout << ex.what(); +} +  // Cattura ogni eccezioni non catturata dal blocco _catch_ precedente -} catch (...) +catch (...)  {      std::cout << "Catturata un'eccezione sconosciuta";      throw; // Rilancia l'eccezione @@ -541,7 +681,7 @@ catch (const std::exception& ex)  // RAII  /////// -// RAII sta per Resource Allocation Is Initialization. +// RAII sta per "Resource Allocation Is Initialization".  // Spesso viene considerato come il più potente paradigma in C++.  // È un concetto semplice: un costruttore di un oggetto  // acquisisce le risorse di tale oggetto ed il distruttore le rilascia. @@ -563,9 +703,9 @@ void faiQualcosaConUnFile(const char* nomefile)  // Sfortunatamente, le cose vengono complicate dalla gestione degli errori.  // Supponiamo che fopen fallisca, e che faiQualcosaConUnFile e  // faiQualcosAltroConEsso ritornano codici d'errore se falliscono. -// (Le eccezioni sono la maniera preferita per gestire i fallimenti, -//  ma alcuni programmatori, specialmente quelli con un passato in C, -//  non sono d'accordo con l'utilità delle eccezioni). +//  (Le eccezioni sono la maniera preferita per gestire i fallimenti, +//   ma alcuni programmatori, specialmente quelli con un passato in C, +//   non sono d'accordo con l'utilità delle eccezioni).  // Adesso dobbiamo verificare che ogni chiamata per eventuali fallimenti e chiudere il gestore di file  // se un problema è avvenuto.  bool faiQualcosaConUnFile(const char* nomefile) @@ -615,7 +755,7 @@ void faiQualcosaConUnFile(const char* nomefile)  {      FILE* fh = fopen(nomefile, "r"); // Apre il file in modalità lettura      if (fh == nullptr) -        throw std::exception("Non è stato possibile aprire il file."). +        throw std::runtime_error("Errore nell'apertura del file.");      try {          faiQualcosaConIlFile(fh); @@ -678,26 +818,29 @@ class Foo {    virtual void bar();  };  class FooSub : public Foo { -  virtual void bar();  // sovrascrive Foo::bar! +  virtual void bar();  // Sovrascrive Foo::bar!  };  // 0 == false == NULL (la maggior parte delle volte)!  bool* pt = new bool; -*pt = 0;  // Setta il valore puntato da 'pt' come falso. +*pt = 0; // Setta il valore puntato da 'pt' come falso.  pt = 0;  // Setta 'pt' al puntatore null. Entrambe le righe vengono compilate senza warnings.  // nullptr dovrebbe risolvere alcune di quei problemi:  int* pt2 = new int; -*pt2 = nullptr;  // Non compila +*pt2 = nullptr; // Non compila  pt2 = nullptr;  // Setta pt2 a null. -// Ma in qualche modo il tipo 'bool' è una eccezione (questo è per rendere compilabile `if (ptr)`. -*pt = nullptr;  // Questo compila, anche se '*pt' è un bool!  +// C'è un'eccezione per i bool. +// Questo permette di testare un puntatore a null con if(!ptr), ma +// come conseguenza non puoi assegnare nullptr a un bool direttamente! +*pt = nullptr;  // Questo compila, anche se '*pt' è un bool!  // '=' != '=' != '='! -// Chiama Foo::Foo(const Foo&) o qualche variante del costruttore di copia. +// Chiama Foo::Foo(const Foo&) o qualche variante (vedi "move semantics") +// del costruttore di copia.  Foo f2;  Foo f1 = f2; @@ -711,6 +854,22 @@ Foo f1 = fooSub;  Foo f1;  f1 = f2; + +// Come deallocare realmente le risorse all'interno di un vettore: +class Foo { ... }; +vector<Foo> v; +for (int i = 0; i < 10; ++i) +  v.push_back(Foo()); + +// La riga seguente riduce la dimensione di v a 0, ma il distruttore non +// viene chiamato e dunque le risorse non sono deallocate! +v.empty(); +v.push_back(Foo());  // Il nuovo valore viene copiato nel primo Foo che abbiamo inserito + +// Distrugge realmente tutti i valori dentro v. Vedi la sezione riguardante gli +// oggetti temporanei per capire come mai funziona così. +v.swap(vector<Foo>()); +  ```  Letture consigliate: diff --git a/it-it/coffeescript-it.html.markdown b/it-it/coffeescript-it.html.markdown index 16eb9bd4..31973369 100644 --- a/it-it/coffeescript-it.html.markdown +++ b/it-it/coffeescript-it.html.markdown @@ -4,6 +4,8 @@ contributors:    - ["Luca 'Kino' Maroni", "http://github.com/kino90"]    - ["Tenor Biel", "http://github.com/L8D"]    - ["Xavier Yao", "http://github.com/xavieryao"] +translators: +    - ["Tommaso Pifferi","http://github.com/neslinesli93"]  filename: coffeescript-it.coffee  lang: it-it  --- @@ -59,34 +61,34 @@ matematica =    quadrato: quadrato    cubo:   (x) -> x * quadrato x  #=> var matematica = { -#  "radice": Math.sqrt, -#  "quadrato": quadrato, -#  "cubo": function(x) { return x * quadrato(x); } -#} +#     "radice": Math.sqrt, +#     "quadrato": quadrato, +#     "cubo": function(x) { return x * quadrato(x); } +#   }  # Splats:  gara = (vincitore, partecipanti...) ->    print vincitore, partecipanti  #=>gara = function() { -#  var partecipanti, vincitore; -#  vincitore = arguments[0], partecipanti = 2 <= arguments.length ? __slice.call(arguments, 1) : []; -#  return print(vincitore, partecipanti); -#}; +#    var partecipanti, vincitore; +#    vincitore = arguments[0], partecipanti = 2 <= arguments.length ? __slice.call(arguments, 1) : []; +#    return print(vincitore, partecipanti); +#  };  # Esistenza:  alert "Lo sapevo!" if elvis?  #=> if(typeof elvis !== "undefined" && elvis !== null) { alert("Lo sapevo!"); }  # Comprensione degli Array: -cubi = (matematica.cubo num for num in lista)  +cubi = (matematica.cubo num for num in lista)  #=>cubi = (function() { -#	var _i, _len, _results; -#	_results = []; -# 	for (_i = 0, _len = lista.length; _i < _len; _i++) { -#		num = lista[_i]; -#		_results.push(matematica.cubo(num)); -#	} -#	return _results; +#	   var _i, _len, _results; +#	   _results = []; +#    for (_i = 0, _len = lista.length; _i < _len; _i++) { +#      num = lista[_i]; +#      _results.push(matematica.cubo(num)); +#    } +#    return _results;  #  })();  cibi = ['broccoli', 'spinaci', 'cioccolato'] diff --git a/it-it/elixir-it.html.markdown b/it-it/elixir-it.html.markdown index f5d0c172..60301b1a 100644 --- a/it-it/elixir-it.html.markdown +++ b/it-it/elixir-it.html.markdown @@ -4,6 +4,8 @@ contributors:      - ["Luca 'Kino' Maroni", "https://github.com/kino90"]      - ["Joao Marques", "http://github.com/mrshankly"]      - ["Dzianis Dashkevich", "https://github.com/dskecse"] +translators: +    - ["Tommaso Pifferi","http://github.com/neslinesli93"]  filename: learnelixir-it.ex  lang: it-it  --- @@ -379,6 +381,12 @@ spawn(f) #=> #PID<0.40.0>  # Per passare messaggi si usa l'operatore `send`.  # Perché tutto questo sia utile dobbiamo essere capaci di ricevere messaggi,   # oltre ad inviarli. Questo è realizzabile con `receive`: + +# Il blocco `receive do` viene usato per mettersi in ascolto di messaggi +# ed elaborarli quando vengono ricevuti. Un blocco `receive do` elabora +# un solo messaggio ricevuto: per fare elaborazione multipla di messaggi,  +# una funzione con un blocco `receive do` al suo intero dovrà chiamare +# ricorsivamente sé stessa per entrare di nuovo nel blocco `receive do`.  defmodule Geometria do    def calcolo_area do      receive do @@ -394,6 +402,8 @@ end  # Compila il modulo e crea un processo che esegue `calcolo_area` nella shell  pid = spawn(fn -> Geometria.calcolo_area() end) #=> #PID<0.40.0> +# Alternativamente +pid = spawn(Geometria, :calcolo_area, [])  # Invia un messaggio a `pid` che farà match su un pattern nel blocco in receive   send pid, {:rettangolo, 2, 3} diff --git a/it-it/java-it.html.markdown b/it-it/java-it.html.markdown index 6eabd61f..54602cff 100644 --- a/it-it/java-it.html.markdown +++ b/it-it/java-it.html.markdown @@ -6,6 +6,7 @@ contributors:      - ["Madison Dickson", "http://github.com/mix3d"]  translators:      - ["Ivan Sala","http://github.com/slavni96"] +    - ["Tommaso Pifferi","http://github.com/neslinesli93"]  lang: it-it  --- @@ -31,9 +32,9 @@ import java.security.*;  // Ogni file .java contiene una classe pubblica, con lo stesso nome del file  public class LearnJava { -    // Un programma deve avere un metodo main come punto di partenza -    // Ma si possono creare anche file senza main, che però per essere usati -    // devono essere richiamati da altri file. +    // Un programma deve avere un metodo main come punto di partenza. +    // Tuttavia si possono creare anche file senza main, che però +    // per essere usati devono essere richiamati da altri file.      public static void main (String[] args) {          // Per stampare a schermo si usa System.out.println @@ -47,88 +48,157 @@ public class LearnJava {          System.out.print("Ciao ");          System.out.print("Mondo "); +        // Per stampare del testo formattato, si puo' usare System.out.printf +        System.out.printf("pi greco = %.5f", Math.PI); // => pi greco = 3.14159          /////////////////////////////////////// -        // Tipi e Variabili +        // Variabili          /////////////////////////////////////// -        // Si dichiara una variabile usando <tipo> <nome> -        // Byte - variabile intera da 8 bit con segno + +        /* +        *  Dichiarazione delle Variabili +        */ +        // Per dichiarare una variabile basta fare <tipoDato> <nomeVariabile> +        int fooInt; +        // Per dichiarare piu' di una variabile dello lo stesso tipo si usa: +        // <tipoDato> <nomeVariabile1>, <nomeVariabile2>, <nomeVariabile3> +        int fooInt1, fooInt2, fooInt3; + +        /* +        *  Inizializzazione delle Variabili +        */ + +        // Per inizializzare una variabile si usa +        // <tipoDato> <nomeVariabile> = <valore> +        int fooInt = 1; +        // Per inizializzare piu' di una variabile dello lo stesso tipo +        // si usa <tipoDato> <nomeVariabile1>, <nomeVariabile2>, <nomeVariabile3> = <valore> +        int fooInt1, fooInt2, fooInt3; +        fooInt1 = fooInt2 = fooInt3 = 1; + +        /* +        *  Tipi di Variabili +        */ +        // Byte - intero con segno a 8 bit (in complemento a 2)          // (-128 <= byte <= 127)          byte fooByte = 100; -        // Short - variabile intera da 18 bit con segno +        // Short - intero con segno a 16 bit (in complemento a 2)          // (-32,768 <= short <= 32,767)          short fooShort = 10000; -        // Integer - variabile intera da 32 bit con segno +        // Integer - intero con segno a 32 bit (in complemento a 2)          // (-2,147,483,648 <= int <= 2,147,483,647)          int fooInt = 1; -        // Long - variabile da 64 bit intera con segno +        // Long - intero con segno a 64 bit (in complemento a 2)          // (-9,223,372,036,854,775,808 <= long <= 9,223,372,036,854,775,807)          long fooLong = 100000L; -        // L viene usato per specificare che il valore dalla variabile -        // e' di tipo "Long", qualsiasi variabile che non viene contrassegnata -        // e' trattata di base come un intero. +        // L viene usato per indicare che il valore e' di tipo Long; +        // altrimenti il valore viene considerato come intero. -        // Nota: Java non dispone di variabili senza segno +        // Nota: Java non dispone di interi senza segno. -        // Float - variabile piu' precisa, con virgola [numeri reali] -        // di grandezza 32 bit +        // Float - Numero in virgola mobile a 32 bit con precisione singola (IEEE 754) +        // 2^-149 <= float <= (2-2^-23) * 2^127          float fooFloat = 234.5f; -        // f e' usato per specificare che la variabile e'' di tipo "float" -        // altrimenti di default viene trattata come un "dobule" +        // f o F indicano the la variabile e' di tipo float; +        // altrimenti il valore viene considerato come double. -        // Double - ancora piu' precisione la si puo' ottenere con una variabile -        // Double, con granzezza di 64 bit. +        // Double - Numero in virgola mobile a 64 bit con precisione doppia (IEEE 754) +        // 2^-1074 <= x <= (2-2^-52) * 2^1023          double fooDouble = 123.4; -        // Boolean - vero & falso +        // Boolean - Puo' assumere il valore vero (true) o falso (false)          boolean fooBoolean = true;          boolean barBoolean = false; -        // Char - un singolo carattere con grandezza 16 bit +        // Char - Un singolo carattere Unicode a 16-bit          char fooChar = 'A'; -        // final - Costanti, non possono essere riassegnate ad un altro oggetto -        final int ORE_LAVORATIVE_DI_UNA_SETTIMANA = 9001; - -        // String - Stringhe, array di caratteri -        String fooString = "Ecco una stringa!"; - -        // \n e' un carattere speciale che permette di andare a capo. -        String barString = "Andare a capo?\nNessun problema!"; -        // \t e' un carattere speciale che permette di aggiungere un 'Tab' -        String bazString = "Vuoi inserire tab?\tNessun problema"; +        // Le variabili precedute da final possono essere inizializzate una volta sola, +        final int HOURS_I_WORK_PER_WEEK = 9001; +        // pero' e' possibile dichiararle e poi inizializzarle in un secondo momento. +        final double E; +        E = 2.71828; + + +        // BigInteger - Interi a precisione arbitraria +        // +        // BigInteger e' un tipo di dato che permette ai programmatori di +        // gestire interi piu' grandi di 64 bit. Internamente, le variabili +        // di tipo  BigInteger vengono memorizzate come un vettore di byte e  +        // vengono manipolate usando funzioni dentro la classe BigInteger. +        // +        // Una variabile di tipo BigInteger puo' essere inizializzata usando +        // un array di byte oppure una stringa. +         +        BigInteger fooBigInteger = new BigDecimal(fooByteArray); + +        // BigDecimal - Numero con segno, immutabile, a precisione arbitraria +        // +        // Una variabile di tipo BigDecimal e' composta da due parti: un intero +        // a precisione arbitraria detto 'non scalato', e un intero a 32 bit +        // che rappresenta la 'scala', ovvero la potenza di 10 con cui +        // moltiplicare l'intero non scalato. +        // +        // I BigDecimal permettono un controllo completo sull'arrotondamento +        // dei numeri. Essi sono molto usati in ambito finanziario, nella +        // gestione delle valute, e in ogni altro posto in cui serve +        // precisione esatta. +        // +        // Le variabili di tipo BigDecimal possono essere inizializzate con un +        // int, long, double o String, oppure con un intero non scalato +        // (di tipo BigInteger) e una scala (int). + +        BigDecimal fooBigDecimal = new BigDecimal(fooBigInteger, fooInt); + + + +        // Stringhe +        String fooString = "Questa e' la mia stringa!"; + +        // \n e' un carattere di escape che rappresenta l'andare a capo +        String barString = "Stampare su una nuova riga?\nNessun problema!"; +        // \t e' un carattere di escape che aggiunge un tab +        String bazString = "Vuoi aggiungere un tab?\tNessun problema!";          System.out.println(fooString);          System.out.println(barString);          System.out.println(bazString); -        // Vettori [array] -        //La lunghezza del vettore deve essere decisa quando viene istanziato -        //Si puo' dichiarare come segue: -        //<tipodato> [] <nomevariabile> = new <tipodato>[<grandezza vettore>]; -        //<tipodato> <nomevariabile>[] = new <tipodato>[<grandezza vettore>]; -        int [] intArray = new int[10]; -        String [] stringArray = new String[1]; -        boolean boolArray [] = new boolean[100]; - -        // Un altro modo per dichiarare & inizializzare un vettore -        int [] y = {9000, 1000, 1337}; -        String nomi [] = {"Andrea", "Bob", "Pippo", "Susan"}; +        // Vettori +        // La dimensione di un array deve essere decisa in fase di +        // istanziazione. Per dichiarare un array si puo' fare in due modi: +        // <tipoDato>[] <nomeVariabile> = new <tipoDato>[<dimensioneArray>]; +        // <tipoDato> <nomeVariabile>[] = new <tipoDato>[<dimensioneArray>]; +        int[] intArray = new int[10]; +        String[] stringArray = new String[1]; +        boolean boolArray[] = new boolean[100]; + +        // Un altro modo per dichiarare ed insieme inizializzare un vettore. +        int[] y = {9000, 1000, 1337}; +        String names[] = {"Gianni", "Anna", "Luca", "Cristina"};          boolean bools[] = new boolean[] {true, false, false}; -	 -	// I vettori vengono indicizzati a parire dallo 0 + +        // Per accedere ad un elemento di un vettore          System.out.println("intArray @ 0: " + intArray[0]); -        // e' possibile un accesso diretto ad un elemento +        // I vettori non sono immutabili (ma la loro dimensione si!) +        // e gli indici partono da 0.          intArray[1] = 1;          System.out.println("intArray @ 1: " + intArray[1]); // => 1 -        // Altro da vedere: -        // Liste di array - come i vettori ma piu' funzionali -        // e la loro grandezza puo' variare in corso di esecuzione -        // Liste concatenate di memoria +        // Ci sono altri tipo di dato interessanti. +        // ArrayList - Simili ai vettori, pero' offrono altre funzionalita', +        //             e la loro dimensione puo' essere modificata. +        // LinkedList - Si tratta di una lista linkata doppia, e come tale +        //              implementa tutte le operazioni del caso. +        // Map - Un insieme di oggetti che fa corrispondere delle chiavi +        //       a dei valori. Non permette l'inserimento di chiavi uguali. +        // HashMap - Questa classe usa una tabella di hash per implementare +        //           l'interfaccia di tipo Map. Questo permette di effettuare +        //           operazioni basilari, come inserimento e cancellazione, +        //           in tempo costante anche su insiemi molto grandi.          ///////////////////////////////////////          // Operatori diff --git a/it-it/json-it.html.markdown b/it-it/json-it.html.markdown index 0c401753..379bad73 100644 --- a/it-it/json-it.html.markdown +++ b/it-it/json-it.html.markdown @@ -1,29 +1,36 @@  --- -  language: json  contributors: -  	- ["Anna Harren", "https://github.com/iirelu"] -  	- ["Marco Scannadinari", "https://github.com/marcoms"] +  - ["Anna Harren", "https://github.com/iirelu"] +  - ["Marco Scannadinari", "https://github.com/marcoms"] +  - ["himanshu", "https://github.com/himanshu81494"]  translators:      - ["Robert Margelli", "http://github.com/sinkswim/"] +    - ["Christian Grasso", "http://chris54721.net"]  lang: it-it -  --- -Dato che JSON è un formato per lo scambio di dati estremamente semplice, questo sarà con molta probabilità -il più semplice Learn X in Y Minutes. +JSON è un formato per l'interscambio di dati estremamente semplice, per cui questo sarà +con molta probabilità il più semplice Learn X in Y Minutes.  Nella sua forma più pura JSON non ha commenti, ma molti parser accettano  commenti in stile C (//, /\* \*/). Per lo scopo prefissato, tuttavia, tutto sarà  100% JSON valido. Fortunatamente, si spiega da sè. +I tipi supportati da JSON comprendono: numeri, stringhe, boolean, array, oggetti e null. +I browser supportati sono: Firefox (Mozilla) 3.5+, Internet Explorer 8+, Google Chrome, +Opera 10+, Safari 4+. +I file JSON sono salvati nel formato ".json". Il MIME type per documenti JSON è +"application/json". Gli svantaggi del JSON includono l'assenza di una definizione dei tipi +e di una sorta di [DTD](https://it.wikipedia.org/wiki/Document_Type_Definition). +  ```json  {    "chiave": "valore",    "chiavi": "devono sempre essere racchiuse tra doppi apici",    "numeri": 0, -  "stringhe": "Ciaø, møndø. Tutti gli unicode sono permessi, assieme con l \"escaping\".", +  "stringhe": "Ciaø, møndø. Tutti i caratteri Unicode sono permessi, insieme all'\"escaping\".",    "ha booleani?": true,    "il nulla": null, @@ -52,8 +59,8 @@ commenti in stile C (//, /\* \*/). Per lo scopo prefissato, tuttavia, tutto sarà   ],    "stile alternativo": { -    "commento": "Guarda quà!" -  , "posizione della virgola": "non conta - fintantochè è prima del valore, allora è valida" +    "commento": "Guarda qua!" +  , "posizione della virgola": "non conta - se è prima della chiave successiva, allora è valida"    , "un altro commento": "che bello"    }, | 
