Sei sulla pagina 1di 8

Programmazione

Modulo 1:
Cos' un programma? E' un insieme finito di azioni che, compiute,
generano uno o pi effetti che permettono di arrivare alla
risoluzione di uno o pi problemi, cio ottenere qualcosa di non
immediatamente raggiungibile attraverso un metodo risolutivo
scaturito dall'analisi degli elementi che descrivono il problema
stesso.
Questo metodo risolutivo detto Problem Solving e consiste in
3 fasi: Formulazione del problema individuazione del metodo
risolutivo esecuzione del metodo sopracitato.
Problem solving:
1) Formulazione del problema: si cerca di operare un'analisi del
problema, individuando gli elementi che lo descrivono sui quali
lavorare (dati di ingresso) e i risultati che si vogliono ottenere
(dati di output).
2)Esprimere tutto ci attraverso un linguaggio che permetta la
descrizione di relazioni tra diverse informazioni, con l'ausilio di
un insieme di operatori semplici eseguibili che permettono
l'evoluzione graduale degli status delle informazioni inizialmente
descritte, enunciati con il medesimo linguaggio, fino a
raggiungere la risoluzione del problema, descrive quella che la
fase dell' individuazione del metodo risolutivo. Amalgamando il
tutto, il risultato, cio la soluzione del problema, un operatore
complesso, all'interno del quale vi descritto il come e
l'ordine con cui devono essere eseguiti i vari operatori semplici
che lo compongono, chiamato ALGORITMO.
3)Infine l'esecuzione del metodo risolutivo prevede che il
sopracitato ALGORITMO venga fatto eseguire da un esecutore
artificiale, con l'accortezza che quest'ultimo conosca e quindi
sappia interpretare il linguaggio con cui l'algoritmo stato
descritto.
E' inoltre importante che l' ALGORITMO rispetti determinate
propriet:
1)Deve essere FINITO spazialmente e temporalmente

2)Deve essere GENERALE, cio deve essere applicabile a qualsiasi


insieme di dati appartenente al dominio dell'Algoritmo (e quindi
DEVE essere anche RIPETIBILE)
3)NON deve essere AMBIGUO, cio le istruzioni che lo
compongono devono evitare ogni tipo di contraddizione per non
generare conflitti che porterebbero a risultati non attesi (quindi
la sua descrizione deve essere UNIVOCA)
4)DEVE essere COMPLETO
Metodi di rappresentazioni di un ALGORITMO (possono essere
GRAFICI o STRUTTURATI):
1)Diagramma di flusso;
2)Linguaggio lineare;
3)Alberi di decomposizione;
4)Diagrammi di Nassi-Schneidermann;
Diagramma di flusso:
E' un linguaggio Grafico che accompagna l'esecutore passo passo
da un punto di INIZIO verso la risoluzione di un dato problema
(punto d i FINE) seguendo un percorso ordinato rappresentante
l'algoritmo di risoluzione dello stesso problema. Nel caso di
percorsi alternativi, come cicli, strutture selettive, si hanno delle
diramazioni, scelte durante lo scorrimento del grafico in base al
verificarsi di una determinata condizioni piuttosto che di un'altra.
Graficamente, son composti da diverse figure geometriche piane,
ognuna con il proprio significato e il proprio indirizzo di
applicazione.
Le Operazioni vengono indicate con Rettangolo, Parallelogramma
e Rombo, che rispettivamente si traducono in Blocco di calcolo o
Azione, Blocco di Input/Output, Blocco di decisione (cicli,
strutture selettive)
I Controlli vengono indicati con una forma ellittica, una freccia e
un cerchio o un pentagono, che rispettivamente si traducono in
Blocco di Start/end (dominio dell'algoritmo), Flusso (collega un
blocco ad un altro), Connessione (in soldoni ha la stessa
funzionalit del Flusso ma viene utilizzato solitamente quando si
deve saltare nella lettura da un foglio a un altro o comunque ad
una rappresentazione di una continuazione di una serie di blocchi

di un diagramma di flusso, ma rappresentato in separata sede per


una necessit di spazio.
La rappresentazione dei Diagrammi di Flusso deve rispettare
alcune regole:
1) Devono esserci soltanto un blocco iniziale e finale;
2)I blocchi azione ha una sola freccia flusso in entrata e in uscita,
mentre i blocchi di decisione devono avere una freccia in
entrata e due frecce in uscita, le quali possono diventare flussi in
entrata per un blocco successivo o possono sfociare in un' altra
freccia di flusso
Punti di Forza:
Sono facilmente interpretabili e semplici da seguire, adatti per la
rappresentazione di metodi sequenziali. Aiutano il team work, in
quanto un diagramma di flusso non deve necessariamente
rappresentare il metodo risolutivo dell'intero problema
principale, ma pu pi semplicemente raffigurare un insieme di
istruzioni appartenenti ad un dominio di definizione appartenete
a quello del macro-problema ma pi ristretto e che costituiscono
l'algoritmo necessario per risolvere solo una parte del macro
problema la cui soluzione comunque necessaria per la
risoluzione del macro-problema.
Inoltre sono privi di ambiguit e facilmente traducibili in
linguaggi di programmazione
Punti di Debolezza:
Sono linguaggi di altissimo livello, quindi molto pi vicini
all'uomo e molto pi lontani dal linguaggio macchina. E' quindi
necessaria una maggiore attenzione in fase di codifica.
Inoltre non sono nativamente linguaggi strutturati e,
generalmente, necessario operare dei linker a causa delle
dimensioni.
Linguaggio Lineare:
E' un linguaggio strutturato a tutti gli effetti, non ambiguo ed
molto vicino alla sintassi di un linguaggio di programmazione
Alberi di Decomposizione:
E' la rappresentazione tramite un sistema top down di un macroproblema in tanti problemi figli pi semplici.

Le operazioni dello stesso livello di complessit vengono


rappresentati sulla stessa riga e vengono letti da sinistra verso
destra.
Si utilizzano rombi allungati per le operazioni di selezione
dipendenti da una condizione tipo CASE o IF, o una forma ellittica
per i comandi di iterazione dipendenti anch'essi da una
condizione.
Nassi: vedi slides.
SVILUPPO DI UN PROGRAMMA:
alle fase di analisi e di ricerca di un metodo risolutivo di cui abbiamo
precedentemente, seguono sicuramente fasi di codifica dello stesso
metodo in un linguaggio di programmazione, la verifica che l'
algoritmo codificato sia quanto pi bug-free possibile in quanto errori
di codifica pi o meno gravi presenti in una parte dell'algoritmo
possono propagarsi anche nelle strutture successive, e la
manutenzione del software prodotto
E' inoltre importante la documentazione del software prodotto, per
migliorarne la leggibilit e facilitarne la manutenibilit
Tecniche di sviluppo di problemi complessi:
1) Top-Down
2) Bottom-up
3) Ibrida
Ognuna delle 3 tecniche ha come obiettivo la scomposizione di un
problema non primitivo (cio non semplice, quindi risolvibile
attraverso un azione primitiva o un gruppo di azioni primitive) in
sottoproblemi equivalenti al problema di partenza, fino al
raggiungimento di micro-problemi primitivi. In questo modo risulta
possibile facilitare la risoluzione del problema attraverso la scrittura di
pi semplici algoritmi che risolvono i sottoproblemi primitivi. La
summa di tutto equivarr alla risoluzione del problema padre.
Albero di sviluppo Top Down:
Si passa dal problema generale e si scende gradualmente di livello
aggiungendo sempre pi nel dettaglio fino a giungere a sottoproblemi
primitivi. Ci si allontana dal linguaggio ad alto livello pi vicino

all'uomo e si arriva ad una descrizione pi vicino al linguaggio di


programmazione
BOTTOM UP:
Si ragione in maniera completamente inversa rispetto al Top Down,
quindi si parte da strutture e algoritmi primitivi e si sale gradualmente
di livello da problemi pi semplici fino al raggiungimento della
soluzione del macro-problema. Risulta molto pi utile in fase di
manutenzione di un software.
La scomposizione di problemi possono essere:
1)Sequenziale
2)Selettiva
3)Iterativa
4)Ricorsiva
Sequenziale: si esegue un'istruzione alla volta senza omissioni e
ripetizioni, nell'ordine esatto con cui sono state scritte.
Selettiva: La soluzione cambia a seconda che una condizione da cui
dipende sia verificata o meno, come negli if o nei case che prevedono
una multipla scelta da parte dell'utente.
Iterativa: Successione di istruzioni dello stesso tipo. Si individua
quando vi sono sottoproblemi uguali o dello stesso tipo ma simili e si
rivela necessario eseguire pi volte ciclicamente un set di istruzioni
finch una determinata condizione vera.
Ricorsiva: Si applica quando almeno uno dei sottoproblemi dello
stesso tipo al problema di livello superiore, ma di ordine inferiore; e
quando noto l'ordine del problema.
Si scompone fino a raggiungere il livello assiomatico, cio i problemi
primitivi

MODULO 2:
Linguaggio: una sequenza di simboli appartenenti ad un lessico e
posti in sequenza secondo le regole di una sintassi. Queste sequenze di
simboli, informazioni, bisogna analizzarle dal punto di vista sintattico
e semantico.

Sintassi: regole che stabiliscono la forma, l'estetica, di un linguaggio, e


che devono essere rispettate in fase di progettazione per evitare
problemi di interpretazione infattibile o ambiguit.
Semantica: riguarda prevalentemente la parte logica che vi dietro la
forma di un linguaggio. Cio riguarda il significato di una frase (si cura
prevalentemente in fase di analisi).
Lo scopo finale di un linguaggio, in soldoni, quello di poter
comunicare informazioni ad un'altra entit, che sia uomo o macchina.
Questa comunicazione pu essere di due tipi: Diretta o Indiretta.
Perch una comunicazione sia Diretta necessario che le fonti che
emettono e ricevono il messaggio conoscano la sintassi del linguaggio
con cui stato formulato il suddetto e quindi sappiano interpretarlo
allo stesso modo
Contrariamente, parliamo di comunicazione Indiretta. In questo caso,
per permettere che il messaggio arrivi a destinazione, si deve ricorrete
ad un traduttore, cio uno strumento che traduca il messaggio dal
linguaggio di partenza in un linguaggio comprensibile al destinatario
del messaggio.
Questo discorso va applicato in toto per quanto concerne la
Comunicazione tra Uomo e Macchina, attraverso i linguaggi di
programmazione.
I linguaggi che permettono di essere molto vicini a quello della
macchina e che quindi permettono una comunicazione diretta,
vengono detti linguaggi a basso livello. Il problema principale di un
approccio di questo tipo, in fase di codifica, che il linguaggio binario
della macchina si discosta decisamente molto dal linguaggio naturale
dell'uomo, rendendone molto complessa l'interpretazione e di
conseguenza la comunicazione. Per questo motivo, preferibile
utilizzare altri tipi di linguaggio che sono molto pi vicini al linguaggio
umano naturale e che vengono chiamati linguaggi ad alto livello.
Vi un'ulteriore distinzione per i linguaggi ad alto livello: Procedurali e
non procedurali.
I primi descrivono il percorso per arrivare alla soluzione del problema
(variabili, assegnamenti), i secondi descrivono pi nel dettaglio le
propriet dei risultati attesi (espressioni)

Per far comprendere un linguaggio ad alto livello ad una macchina,


abbiamo detto sia necessario un Traduttore: in soldoni, integrato nel
software di sistema e permette di studiare le frasi del linguaggio ad
alto livello(istruzioni e strutture dati), attribuire a ogni suo simbolo il
giusto valore semantico e forma sintattica comprensibile alla
macchina.
I traduttori sono di due tipi: Interpreti e Compilatori.
La differenza sostanziale che l'interprete analizza l'algoritmo scritto
ad alto livello e procede con traduzione in linguaggio macchina ed
esecuzione simultaneamente, mentre il Compilatore analizza
l'algoritmo, lo traduce in un codice oggetto comprensibile dalla
macchina e poi eseguito.
Ne risulta quindi che : un programma interpretato un programma che
risiede in memoria, pi semplice e interattivo, risulta pi semplice
rilevare errori relativi al codice sorgente, MA meno efficiente in
termini spaziali e temporali, in quanto per ogni esecuzione necessaria
la traduzione in linguaggio macchina.
Di contro i programmi compilati sono pi manutenibili, efficienti in
termini di tempo e spazio, facilitano il rilevamento di bug nel codice
oggetto, MA peccano di interattivit
MODULO 3:
Un algoritmo, quindi, costituito da set di istruzioni, che devono
essere presenti in qualsiasi linguaggio di programmazione per essere
considerato tale. Esistono diversi tipi di istruzioni:
Istruzioni di input = forniscono all'esecutore dati dall'esterno
Istruzioni di output = l'esecutore notifica i risultati dell'elaborazione di
dati all'utente
Istruzioni operative = permettono di operare sui dati forniti
all'esecutore
Istruzioni dichiarative = permette di descrivere un entit reale del
problema sotto forma di variabile all'interno del programma,
riservandole dello spazio in memoria, specificandone il tipo e dandole
un nome che la identifichi
Strutture di controllo.
Caratteristiche di una variabile:
Nome (identificatore)

Indirizzo = Locazione di memoria in cui salvata la variabile


Valore = Contenuto dell'indirizzo di memoria in cui salvata la
variabile
Tipo = dominio dei valori che pu assumere la variabile e le operazioni
effettuabili su di essa
Un valore pu essere assegnato ad una variabile attraverso istruzioni
di ingresso come operazioni di lettura da supporto esterno (tastiera,
mouse, file ecc) oppure attraverso operatori di assegnamento tipo o
== e l'assegnazione procede da destra verso sinistra.
Nei linguaggi di programmazione pi moderni esistono 4 tipi pi
comuni di variabili: Interi, Reali, Logici, Caratteri.
Ognuno di questi ha un determinato dominio di definizione che pu
ospitare un numero limitato di valori.
Gli interi: possono essere positivi e negativi e le operazioni di base sono
somma, prodotto, differenza, quoziente, resto, pow.
Reali: insieme numerico che include sia una parte intera sia una parte
decimale. La loro rappresentazione sensibilmente affetta da
troncamento o arrotondamento e ci pu generare diversi errori di
precisione. Per i reali, vi un numero potenzialmente infinito di valori
reali, ma esiste un valore massimo oltre il quale si rischia un errore di
Overflow.