Skip to content

Instantly share code, notes, and snippets.

@aziis98
Last active September 24, 2017 00:54
Show Gist options
  • Save aziis98/faa47f805a02b210e824b3771e99304f to your computer and use it in GitHub Desktop.
Save aziis98/faa47f805a02b210e824b3771e99304f to your computer and use it in GitHub Desktop.
Una breve introduzione alla programmazione

Una breve introduzione alla programmazione

AVVERTIMENTO: Tutti i frammenti di codice presenti in questo aritcolo non sono in nessun particolare linguaggio ma sono verosimili (vd. Manzoni).

WIP: Work In Progress, non leggere le cose contrassegnate con questo

Intro

La parte deprimente (può essere saltata)

I computer capiscono solo il linguaggio macchina (che varia anche da processore a processore). Detto questo ora si può dire a cosa servono veramente i linguaggi di programmazione: sono delle convenzioni inventate dall'uomo per capire relativamente facilmente cosa faccia del codice scritto da altri programmatori.

Ci sono molti utilizzi per i computer quindi sono stati creati vari linguaggi ognuno più adatto ad un certo utilizzo ed in grado di spiegare in modo abbastanza facile e breve ciò che si vuole fare. Si lascia poi ad altri programmi (chiamati compilatori) il compito di tradurre il testo dei nostri programmi in linguaggio macchina.

Quindi imparare un linguaggio di programmazione consiste semplicemente nell'imparare una serie di convenzioni (questa era la parte :C). La parte divertente della programmazione viene dopo, una volta imparate le convenzioni le si possono usare per far fare al nostro computer ciò che vogliamo (si pensi alla creazione di un gioco o di un software).

La vera introduzione

Programmare consiste nello spiegare alla nostra macchina come risolvere un certo problema. Come approccio iniziale pensiamo al nostro computer come una machina dotata di memoria e capace di manipolarla secondo le nostre istruzioni.

Variabili | 1

Abbiamo definito i computer come macchine dotate di memoria, vediamo ora meglio questo punto.

La prima istruzione di cui tratteremo è l'assegnazione di un valore ad una variabile, immaginiamo il nostro computer come un dizionario inizialmente vuoto. Col procedere del programma il computer scriverà nel dizionario voci e definizioni, le voci corrisponderanno ai nomi delle variabili mentre le definizioni ai valori assegnati.

a <- 10

Questo frammento di codice assegna alla voce a il volore numerico di 10.

La nostra macchina esegue le istruzioni in ordine quindi il seguente frammento

a <- 10
b <- 3
c <- a + b

dopo aver assegnato ad a il valore di 10 e a b il valore di 3 assegnerà a c il valore ottenuto dal calcolo dell'espressione a + b.

Vediamo ora come il nostro computer calcola l'espressione a + b: per prima cosa si chiederà cosa sia a, nel nostro caso scoprirà essere una voce del nostro dizionario che corrisponde al valore 10. Allo stesso modo b scoprirà avere il valore di 3. Ora sa i valori delle due variabili (a = 10 e b = 3), quindi a + b sarà 10 + 3 che corrisponde a 13. Ora sostituendo possiamo immaginare di avere l'istruzione c <- 13, e quindi nel nostro dizionario c ora corrisponderà al valore numerico di 13.

Le variabili possono essere riassegnate

Consideriamo il seguente frammento:

a <- 10
a <- a + 1

Seguendo la stessa procedura di prima possiamo notare come per prima cosa ad a viene assegnato il valore 10. Alla seconda riga abbiamo nuovamente un'istruzione che assegna un'espressione alla variabile (o "voce del dizionario") a, quest'espressione corrisponde a 11 poiché ad a era stata prima assegnato 10.

Esercizio

Prova a trovare il valore di d

a <- 10
b <- a / 2
a <- a + 1
c <- a - 4
d <- c * 2 - b
d <- d - 1

Un consiglio, scrivi su un foglio il programma qui sopra e accanto ad ogni istruzione segnati il "dizionario" corrente in modo da averlo sempre a vista.

Extra

Nella maggior parte dei linguaggi quello che sopra può essere considerato "operatore" di assegnazione non è una freccia (<-) ma è un uguale (=), l'uguale è spesso frainteso come uguale matematico ed infatti istruzioni come a = a + 1 non hanno senso in ambito matematico, mentre in programmazione in praticamente tutti i casi bisogna intendere a <- a + 1, nel senso che quell'uguale porta il computer a scrivere sul "dizionario" il nome della variabile (a in questo caso) e il rispettivo valore (a + 1)

Extra+

b <- a * 3

Questo frammento di codice genera un errore poiché a non è mai definita precedentemente nel programma.

Chiamate di funzioni | 1

Passiamo ora alle chiamate di funzione. Nel nostro programma possiamo trovare il nome della funzione seguito da una serie di parametri (elencati tra parentesi e separati da virgole per i linguaggi della famiglia del C).

println("Ciao, Mondo!")

Quest'espressione è composta da tre parti:

  • println: è il nome della funzione che si vuole chiamare
  • ( ... ): un insieme di parametri tra parentesi
  • "Ciao, Mondo!": E' uno dei parametri da passare alla funzione, in questo caso l'unico. Questa in particolare è una stringa di testo, in programmazione capita di voler manipolare o inserire del testo nei propri programmi per essere visualizzato o per essere usato in altri modi; nella maggior parte dei linguaggi per far capire al computer che vogliamo inserire del testo nel nostro codice, lo si inserisce tra virgolette (questo è il caso del C).

(Assumiamo che la funzione println scriva il testo del primo parametro nell'output del nostro programma)

Un'espressione del genere può somigliare molto ad una normale funzione matematica ma ha un significato completamente diverso. In programmazione le funzioni sono dei punti nei quali il computer passa dall'eseguire la riga corrente ad eseguire il codice presente nella definizione della funzione. Quindi se abbiamo una funzione funzione1 che scrive due righe e poi la richiamiamo di seguito due volte...

definizione di funzione1()
    println("Test 1")
    println("Ciao Mondo!")
fine della definizione di funzione1

funzione1()
funzione1()

...il nostro programma andrà in ordine: prima definirà la funzione1; poi la chiamerà una prima volta saltando alla prima riga del codice di funzione1 (ovvero println("Test 1")) e la eseguirà, poi passerà alla seconda; a questo punto il programma ha finito di eseguire il codice nella funzione1 e ritornerà alla posizione precedente continuando ad eseguire le cose successive ed in questo caso più precisamente richiamerà la stessa funzione una seconda volta.

Nell'esempio precedente la funzione println non è definita nel nostro codice ma ci è fornita dalla libreria di base del nostro linguaggio (più o meno tutti i linguaggi hanno cose simili).

Teoria dei tipi (Type Theory) | 1

Il titolo di questo capitolo richiama una vera e propria branca dell'informatica ma ora voglio dare giusto qualche accenno per chiarire meglio le cose (basta aver presenti gli insiemi numerici della matematica).

Come in matematica esistono gli insiemi quali N (spesso chiamato int o long), R (float o double) o C (non è presente in tutti i linguaggi dal principio ma si può creare come vedremo in seguito), nella maggior parte dei linguaggi di programmazione questi soli insiemi non bastano più ed allora si introducono elementi quali i caratteri (a, ..., z, 0, ..., 9, ...) che ad esempio in C si indicano con 'a'. La differenza tra scrivere 9 e '9' sarà quindi che il primo 9 sarà un numero intero, mentre il secondo rappresenterà il carattere 9.

Liste 1 (chiamati anche array o vettori)

Spesso si lavora con tabelle o ad esempio liste di utenti e simili. Molti linguaggi quindi forniscono la possibilità di raggruppare insieme valori di uno stesso tipo. Avremo quindi un nuovo tipo oltre a quelli già visti (N, R e Carattere) e sarà quello della lista (Lista), a differenza dei precedenti tipi le liste hanno una restrizione, possono contenere solo elementi di un solo tipo e quindi dovremo dire al nostro programma il tipo di lista che vogliamo creare (In C avremo int[] e char[], mentre in Java ad esempio ArrayList<Int> o LinkedList<Double>, in JavaScript invece non c'è bisogno di dire di che tipo è la nostra lista perché essendo un linguaggio dinamico è in grado di gestire da solo ciò che mettiamo nella lista (ex. [1, 2, 3, "banana"])).

Vedremo meglio come comportarsi con le liste al capitolo sui cicli.

Controllo del flusso | 1

Un programma che esegue cose in ordine o chiama funzioni non è molto utile, per questo esistono costrutti come gli if e i for che alterano l'ordine in cui il nostro computer esegue le istruzioni del nostro programma.

Il costrutto if (capitolo abbastanza pronto)

Ogni linguaggio di programmazione ha un costrutto di questo tipo e ci permette di eseguire certe azioni in relazione al valore di una certa condizione vera o falsa.

age <- 10

if age >= 18 then
    println("Sei maggiorenne")
else
    println("Sei minorenne")
endif

Il seguente pseudo-programma scriverà sulla nostra console Sei minorenne perché essendo 10 >= 18 falso il computer salterà completamente la prima parte di codice contenuta nel costrutto (da then fino a prima di else) e eseguirà solo la parte dedicata all'altrimenti (dall'else fino all'endif).

Il costrutto for (WIP)

Chiamate di funzioni 2 (WIP)

definisci una funzione chiamata somma(a, b)
    c <- a + b
    ritorna il valore di c
fine della definizione di somma

println(somma(5, 10))

Vediamo cosa succede in questo esempio: per primo il programma definisce la funzione somma che ha due parametri, uno chiamato a ed uno b. I parametri servono a passare dei dati alla nostra funzione al momento della chiamata. In questo caso...

.

.

.

.

.

TK

  • Pensiero sequenziale
  • Strutture di base
  • A bit of low level stuff
  • Controllo del flusso
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment