Menù principale > indice

Introduzione alla programmazione

Desirare capire come funziona un computer :)

Prima di leggere il prossimo paragrafo si deve rispondere alla seguente domanda: cosa risponderesti se ti chiedessero a cosa servono i computer?

Scrivi la tua risposta…

Immaginiamo di dover spiegare a cosa serve un computer ad una persona che non lo ha mai usato. Ogni spiegazione si concentrerebbe su un particolare utilizzo:

  • qualcuno potrebbe dire che lo usa per vedere un video
  • qualcuno che lo usa per scrivere una lettera
  • qualcun altro che lo usa per navigare su Internet…

Chi ha dato la migliore spiegazione? In un certo senso, ogni risposta descrive sempre un corretto tipo di utilizzo, e tutte inseme spiegano che un computer può essere usato per risolvere diversi tipi di problemi.

Anche l'automobile è una macchina come il computer, ma può essere usata per molti impieghi come il computer? Perché? Che cosa ha di “diverso” il computer?

L'utente di fronte al computer deve svolgere dei compiti e si aspetta che il computer lo aiuti. Un problema può essere il calcolo della dichiarazione dei redditi, la visualizzazione e la modifica di un documento, la riproduzione di un filmato… Il computer non sa risolvere i problemi dell'utente. Nel senso che deve essere prima istruito per poi poter eseguire i calcoli necessari. A ben pensarci, anche risolvendo due volte lo stesso tipo di problema, ogni volta ci saranno sicuramente delle piccole differenze, perché i dati di partenza potrebbero essere diversi.

Probabilmente tutti abbiamo avuto familiarità con i problemi svolti a scuola. Nei problemi di matematica, dopo aver letto il testo, si indicano quali sono i dati noti (di partenza) e quali sono i dati incogniti (usando un punto interrogativo).

  • Ad esempio, dato il seguente problema, tu come imposteresti i dati noti e i dati incogniti?
  • Calcolare l'area di un triangolo che ha base 3.4 e altezza 1.0.

Si potrebbe descrivere la situazione iniziale scrivendo:

b = 3.4 h = 1.0 A = ?

  • Sei in grado di risolvere il precedente problema? Cosa si deve scrivere per risolverlo? Scrivi la tua soluzione, ti sarà utile per capire il successivo paragrafo.

Per poter risolvere ogni tipo di problema (come anche quelli di matematica) dopo aver visto i dati, è necessario conoscere un metodo risolutivo (di un problema generico). Le istruzioni che risolvono un problema generico potranno essere applicate a tutti i problemi dello stesso tipo (che possiamo chiamare problemi specifici).

Vediamo le istruzioni utili per risolvere il problema proprosto nel precedente paragrafo:

  • A = b * h / 2
  • A = 3.4 * 1.0 / 2

La soluzione consiste nell'applicare una formula (generica), sostituendo alle variabili presenti nella formula, il valore dei dati noti del particolare caso, per questo motivo è importante avere chiara la differenza tra costanti e variabili. In informatica si distingue inoltre anche tra variabili di input (dati iniziali: b, h) e variabili di output (risultati: A).

  • Quanti valori può contenere contemporaneamente una variabile?
  • Che tipo di valori possono essere memorizzati in una variabile?
  • Dove si trovano le variabili usate dal computer?

Se ci sono più passaggi e più formule da utilizzare, oltre alle variabili di input e di output ci possono essere anche variabili temporanee (variabili di lavoro).

Il metodo risolutivo, viene detto anche algoritmo. Conosci le origini di questa strana parola?

  • Esempio in cui il problema è quello di determinare (o calcolare) il valore massimo tra due numeri che sono forniti dall'utente. Se l'utente fornisse 5 e 9, quale sarebbe la risposta?
  • A chiunque si ponesse questo problema, sembrerebbe ovvio rispondere 9, ma descrivere il procedimento mentale che ha portato a questa risposta non è altrettanto facile.

In generale i numeri forniti potrebbero essere qualsiasi (non solo 5 e 9) ed è necessario determinare un metodo risolutivo che ci dia in ogni caso la risposta corretta. Il programmatore ha il compito di descrivere il metodo risolutivo generico. Un procedimento risolutivo potrebbe essere il seguente:

  1. determinare i dati di input (dati noti)
    1. chiamare X il primo numero
    2. chiamare Y il secondo numero
    3. chiamare Z il risultato (si desidera il massimo)
  2. operazione di confronto: se l'espressione X > Y è vera:
    1. allora il risultato Z = X
    2. altrimenti, se è falsa, il risultato Z = Y.

Questo metodo risolutivo funziona in tutti i casi? Oppure ci sono dei casi critici? Funziona anche se un numero vale zero? Oppure anche nel caso particolare in cui X = Y?

Un metodo risolutivo (o algoritmo) può essere descritto usando diversi tipi di linguaggio:

  • con delle parole (usando un linguaggio naturale o un linguaggio di programmazione)
  • con un grafico (diagramma di flusso o flow chart).
  • con un linguaggio di programmazione
  • con dei numeri (codice macchina)

Quando il programmatore ha individuato il metodo risolutivo può appuntarselo in italiano su un pezzetto di carta. Può disegnarlo con un grafico per farlo capire meglio agli altri. Infine può fornirlo al computer usando un linguaggio di programmazione o in forma numerica, all'interno di in un programma (file eseguibile). Ogni numero rappresenta un'istruzione espressa in linguaggio macchina che verrà eseguita dal computer.

Il diagramma di flusso

Nel caso di un diagramma di flusso (o flow chart) si hanno dei blocchi che contengono le istruzioni da eseguire. La forma del blocco dipende dal tipo di istruzione che essa contiene.

Le forme più usate sono le seguenti:

  • l'ovale contiene etichette di riferimento;
  • il parallelogramma contiene istruzioni di input o output;
  • il rettangolo contiene istruzione di assegnazione, che trasferiscono un valore in una variabile;
  • il rombo contiene espressioni logiche che devono essere valutate (vere o false);
  • le frecce orientate collegano tutti gli elementi e determinano il percorso da seguire.

Esempio

Immaginare il semplice problema del calcolo dell'area di un rettangolo a partire dalle misure della base e dell'altezza. Il seguente diagramma di flusso ne descrive la soluzione. Si può provare anche la sua esecuzione mediante la realizzazione di una tabella che tenga traccia dei valori delle variabili.

variabili di input variabili di output
base area
altezza

La prossima tabella tiene traccia dei valori assunti nel tempo da ogni variabile durante l'esecuzione dei vari elementi del diagramma di flusso. Immaginare di inserire come valori 5 e 6…

passo input base altezza area output
i - - - - inserire due numeri…
ii 5 5
iii 6 6
iv 30
v 30

Per esercizio si può provare a realizzare la stessa tabella, fornendo - 5 e 6 come valori di base e altezza. Si approfondiranno questi diagrammi nell'argomento della programmazione_strutturata

Algoritmo

La parola algoritmo può essere usata come sinonimo di “metodo risolutivo” di un generico problema. Gli algoritmi sono stati studiati dai matematici molto prima che venissero inventati i primi calcolatori. Gli argomenti che possono essere collegati allo studio degli algoritmi sono:

  • gli automi a stati finiti
  • i linguaggi formali
  • la teoria della calcolabilità delle funzioni
  • le funzioni calcolabili da macchina di Turing
  • le funzioni ricorsive e matematica della ricorsione
  • la complessità computazionale

Come è noto, per costruire un teorema o per dimostrarlo formalmente (quando possibile) è necessario fissare delle rigorose ipotesi di partenza. I matematici hanno dovuto quindi fissare delle condizioni che devono essere rispettate per dire di avere un algoritmo.

Un algoritmo per essere valido deve avere delle istruzioni con le seguenti caratteristiche:

  • avere un numero finito di istruzioni
  • avere delle istruzioni con un limite finito di complessità
  • contenere delle istruzioni deterministiche, non probabilistiche
  • le istruzioni devono poter essere eseguite dall'esecutore: devono essere elementari e chiare, non possono cambiare significato a seconda dell'intepretazione di chi le esegue

Tuttavia ci sono anche delle caratteristiche inaspettate:

  • sono ammesse esecuzioni che non terminano
  • non è necessario porre un limite alla lunghezza dei dati in input
  • non è necessario porre un limite alla dimensione della memoria dell'esecutore

Nei casi reali, i problemi da risolvere non sono facili come quello che chiedeva di trovare il massimo di due numeri interi. In questi casi il programmatore può trovare un aiuto seguendo un procedimento per sviluppare un programma per l'elaboratore e ottiene (oltre al programma desiderato) la relativa documentazione. La documentazione è utilissima per poter fare la necessaria manutenzione al programma, come per la correzione degli errori, e per l'eventuale sviluppo di versioni future. Vi sono due tipi di documentazione:

  • la documentazione delle fasi del processo di sviluppo (si individuano le responsabilità)
  • la documentazione delle funzioni usate nel programma (si individuano anche oggetti e variabili)

Fino ad ora si è parlato di problemi e di metodi risolutivi. Si può applicare un metodo risolutivo ad un computer in modo che sia in grado di risolvere un determinato genere di problemi. Il computer è flessibile e può eseguire qualsiasi istruzione venga data all'interno di un programma.

Si può paragonare un programma ad una lunga e complessa ricetta di cucina. Il computer è il cuoco che la deve eseguire per l'utente. Il programmatore cosa è? È l'autore della ricetta (cioè del programma) da eseguire. Noi possiamo essere programmatori e poi anche utenti, quando proviamo ad utilizzare gli stessi programmi che abbiamo scritto.

Quando dobbiamo insegnare al computer a fare qualcosa, come glie lo possiamo insegnare? Potrebbe eseguire le istruzioni in questa ricetta?

Esempio: Fiori di zucca ripieni al forno

  1. lavare 6 fiori di zucca
  2. lavare 1 zucchina
  3. cuocere la zucchina a rondelle con sale ed olio per 10 minuti
  4. frullare con il mixer la zucchina con 100 gr di ricotta
  5. riempire i fiori di zucca con il precedente preparato
  6. mettere in forno ventilato a 160 gradi per 10 minuti
  7. spolverare le zucchine con parmigiano
  8. mettere in forno per 5 minuti

Per un cuoco esperto queste istruzioni possono essere semplici da realizzare, ma per altri no: si può notare che richiedono di sapere come si cuoce una zucca o come si accende il forno.

Rispetto ad un vero cuoco, un computer non possiede nemmeno una propria intelligenza. Le istruzioni che può eseguire un computer, quindi, devono essere molto più dettagliate, accade così che un programma risulti molto più lungo di una comune ricetta.

Linguaggi compilati ed interpretati

Il programmatore indica le istruzioni da eseguire usando uno specifico linguaggio. Le scrive dentro dei file di testo, detto anche file sorgente (source), ma di solito non usa l'estensione .txt. Ad esempio:

  • se scrive in linguaggio C++ potrebbe usare per i file di testo l'estensione .cpp
  • se scrive in linguaggio Python potrebbe usare l'estensione .py
  • se scrive in linguaggio Javascript potrebbe usare l'estensione .js
  • ecc.

Le istruzioni, però, dovranno essere eseguite dalla CPU che comprende solo un linguaggio numerico (detto anche linguaggio macchina) dove ogni numero corrisponde ad una diversa istruzione da eseguire.

La traduzione da linguaggio di programmazione al linguaggio macchina (istruzioni eseguibili dalla CPU) può essere fatta in due modi diversi:

  • usando un compilatore: un programma che converte il file sorgente in un file (binario) eseguibile (a volte .exe); questo tipo di programma può essere paragonato ad un traduttore che deve tradurre un intero documento, generando un nuovo documento tradotto. Se il compilatore trova un errore nelfile sorgente la traduzione si interrompe e non si ottiene nessun file eseguibile per la CPU.
  • usando un interprete: un programma che legge le istruzioni nel file sorgente e le traduce una alla volta per la CPU. Questo programma può essere paragonato ad un interprete che ascolta e traduce “al volo” le parole di una persona straniera. Se l'interprete trova un errore durante la traduzione si interrompe, ma le istruzioni precedenti l'errore sono già state tradotte e date alla CPU che le ha eseguite.

Alcuni linguaggi di programmazione vengono tradotti usando un compilatore, mentre altri usando un interprete. Sia il compilatore che l'interprete sono a loro volta dei programmi fatti per questi compiti.

  • Nei linguaggi compilati, come il C++ o il Pascal, una volta tradotto, il file sorgente diventa inutile. Si esegue solo il file eseguibile (.exe).
  • Nei linguaggi interpretati, come il Python o il Javascript, viene eseguito direttamente il file sorgente, ma per farlo, ogni volta è necessario usare l'interprete che deve ripeterne la traduzione. Questo rende un po' meno efficiente l'esecuzione, ma può offrire altri vantaggi.
pagina.html
<html>
	<head>
		<script type="text/javascript">
		function miafunzione()
		{
			var name=prompt("Scrivi il tuo nome","Mario");
			if (name!=null && name!="")
			{
				document.write("<h1>Ciao " + name + "! </h1>");
			}
		}
		</script>
	</head>
 
	<body onload="miafunzione()">
 
	</body>
 
</html>
  • Cosa rappresenta un blocco a forma di rettangolo?
  • Cosa rappresenta un blocco a forma di parallelogramma?
  • Da quali colonne è composta la tabella che tiene traccia dell'esecuzione di un algoritmo?
  • appunti3s/introduzione_alla_programmazione.txt
  • Last modified: 2018/05/03 11:16
  • by profpro