Fondamenti di Informatica
Algoritmi
Programmi
Linguaggi
Problema
Algoritmo
Linguaggio
Programma
Programma in C
Esempi
di
problema
Tizio
deve calcolare l’irpef da pagare
Caio deve ordinare il materiale per un certo
lavoro
Dimensionare le travi per l’edificio B
Trovare il telefono di un ristorante in centro
Aggiornare l’agenda…..
problema
Un
problema si applica a dati ben precisi
Usa eventuali normative disponibili
Richiede di individuare un metodo per la
risoluzione
…
Il computer può aiutare a risolvere il
problema?
Per
risolvere un problema:
Occorre
dei
rappresentare le informazioni
(struttura
dati)
Occorre
rappresentare
il metodo
risolutivo
(algoritmo)
Dobbiamo usare un linguaggio comprensibile
all'elaboratore, e scrivere una sequenza di istruzioni
(=
programma)
del
linguaggio
scelto.
La
granularità delle operazioni dipende dal linguaggio
Spesso la soluzione non si può ottenere con una semplice
sequenza di passi ma richiede di ripetere alcuni passi o di
prendere strade diverse per diverse situazioni.
Algoritmo
Insieme di regole o direttive atte a
fornire una risposta specifica ad
uno o piu' dati in input.
Questo termine deriva dal nome del
matematico persiano Abu Ja'far
Mohammed ibn Mâsâ alKhowârizmî (825 d.C.).
Introdusse nel mondo arabo i numeri
indiani.
Compose il trattato Al-giabr wa'l mu
kabala (Del modo di assestare cose
opposte) da cui deriva la parola algebra.
Stesura
di algoritmo
Linguaggi
diversi per scrivere algoritmi
Grafico:
Input
test
Testo:
Chiedi il numero di partita IVA
fino a che ci sono spese registrale
Output
valore
PROBLEMA -> SOLUZIONE
inventare l'algoritmo.
Il metodo di soluzione di solito non compare nella
formulazione del problema.
Proprieta' dell'algoritmo:
1 non ambiguita' - le istruzioni devono essere
univocamente interpretabili
2. eseguibilita' - l’esecutore deve essere in grado di
eseguire ogni istruzione in un tempo finito
3. finitezza - l’esecuzione dell’algoritmo deve terminare
in un tempo finito per ogni ingresso
Spesso l’algoritmo si ottiene ragionando per livelli di
astrazione
Esempio: cercare nella guida telefonica
1. apriamo l'elenco in un punto vicino a quello in cui
dovrebbe trovarsi il cognome
2. se e' prima del punto in cui siamo, torniamo indietro;
se e' dopo andiamo avanti, fino ad arrivare alla
pagina che ci interessa
3. eseguiamo una ricerca sequenziale nella pagina fino a
trovare il cognome o scoprire che non esiste
4. fine
Il metodo risolutivo dipende dalla struttura dei dati: ad es. se
eseguiamo la ricerca in una agenda personale il metodo e’
diverso
Cercare
in
una
agenda
1.
apriamo l'agenda alla prima pagina che porta
come etichetta le lettere dell’alfabeto fra cui esiste
l’iniziale
del cognome (o nome se cosi’
organizziamo l’agenda)
2. eseguiamo una ricerca sequenziale nelle pagine
fino a trovare il cognome o scoprire che non esiste se
le pagine corrispondenti a quel gruppo di lettere
finiscono
fine
Dal
problema
all’algoritmo
(parametrizzazione)
cercare il numero di telefono di Mario Rossi e di
Antonio Neri richiede di eseguire esattamente le
stesse istruzioni. Perciò il nome da ricercare e’ un
dato del problema; non e’ codificato direttamente nel
programma
ma
viene
acquisito
in
fase
di
esecuzione.
Ipotizziamo di avere un contenitore (memoria) in cui
depositare il nome che verrà fornito di volta in volta.
Dovremo usare nel programma un nome fittizio, che
ci indichi dove è memorizzato il nome da ricercare.
Questo e’ il concetto di variabile.
problema -> algoritmo-> programma
Problema (istanza di una funzione):
calcolare la media dei miei 4 voti : 30, 25, 26, 28.
Metodo di soluzione:
sommo
i 4 voti -> (30+25+26+28) = 109
poi divido il risultato per 4 -> 109/4 = 27,25
Algoritmo (calcola la funzione):
crea un contatore somma per costruire la somma degli n
numeri,
ponilo a 0,
per
ogni voto aggiungilo a somma,
dividi somma per n
Programma codifica l’algoritmo nel linguaggio
scelto
Quanti algoritmi?
ESEMPIO : MCD
1.
Calcola l’insieme I dei divisori di m
2. Calcola l’insieme J dei divisori di n
3.
Calcola
K,
l’insieme
intersezione
fra
I
e
J
4. Trova il massimo di K
5. MCD e’ il massimo trovato
ogni passo va a espanso; ad esempio calcolare il
massimo di un insieme di lunghezza nota
Scegli
un elemento come max_provvisorio
per ogni elemento i dell’insieme I
se i>max_provvisorio allora eleggi i a max_ provvisorio.
Per
ottenere
un
programma:
Occorre
rappresentare le informazioni e il
metodo risolutivo (algoritmo)
Dobbiama
usare un linguaggio comprensibile
all'elaboratore, e scrivere una sequenza di istruzioni
(= programma) del linguaggio scelto.
Spesso la soluzione non si puo’ ottenere con una
semplice sequenza di passi ma richiede di ripetere
alcuni passi o di prendere strade diverse per diverse
situazioni.
Il
linguaggio naturale
Noam
Chomsky - Comprendere i linguaggi naturali
la capacità che ogni essere umano ha di capire
e produrre frasi nella sua lingua è dovuta ad un
insieme di conoscenze implicite presenti nella
sua mente: la competenza linguistica.
tale
competenza è almeno in parte inconsapevole.
la maggior parte di questa competenza deve essere
innata: non si spiegherebbe la velocità con cui un
bambino riesca a parlare una lingua imitando chi lo
circonda.
Linguaggi formali
i linguaggi formali possono essere assunti
come veicolo di descrizione scientifica dei
linguaggi naturali (storici), ma non possono
essere considerati essi stessi il modello dei
linguaggi naturali.
Linguaggi
di
programmazione
(artificiali)
sintassi
- si occupa della forma della frase, cioe’ delle
regole per la sua costruzione - ci sono delle regole
formali che consentono di verificare se una sentenza
appartiene al linguaggio
semantica - e’ il significato che si attribuisce alla frase,
quindi alle istruzioni del programma.
Diversi
linguaggi sviluppati, nessuno è universale
Classificazione
dei linguaggi
Imperativi
(FORTRAN,
PASCAL, C,
Python…)
Funzionali (Scheme, LISP, …)
Logici (Prolog, …)
A regole (OPS, …)
A vincoli (Prolog III, …)
Il linguaggio C
ideato nei Bell Laboratories della AT&T nel 1972 da Dennis
Ritchie come evoluzione del B di Ken Thompson, usato per
la scrittura dei primi sistemi operativi UNIX.
Il C viene classificato come linguaggio ad alto livello: la scrittura
delle istruzioni è indipendente dall'architettura del calcolatore.
Però è molto vicino all'hardware:
si basa su poche istruzioni che spesso ricalcano l'assembler;
riserva un ruolo centrale al concetto di puntatore, che viene
generalizzato fino a concidere con l'indirizzamento indiretto
rispetto al linguaggio assembler, il C ha in più il controllo sui tipi.
Nel 1983, l' American National Standards Institute (ANSI)
formò un comitato per stabilire le specifiche standard del C.
ANSI C venne adottato dall' International Organization for
Standardization (ISO) con il nome di ISO/IEC 9899:1990.
Il
C
flessibilità ed universalità di applicazioni
soppianta i linguaggi assembler (ad esempio
per la scrittura di sistemi operativi)
è un linguaggio imperativo
introduce alcuni concetti di astrazione
Astrazione sui dati
La memoria è composta da un insieme di celle che
possono contenere sequenze di bit (1 e 0) e possono
essere modificate
Esempio: 10011011 rappresenta un simbolo dell’alfabeto
tipo di dato:
L’informazione memorizzata nelle celle di memoria è vista
non come sequenza anonima di bit, ma come valori di un tipo:
interi, reali, carattere
Ad ogni cella (gruppo di celle) può essere associato un nome
simbolico - variabile.
Ogni variabile è caratterizzata dal tipo di dato che può
memorizzare.
La
memoria
principale
0
1
2
3
4
Ciascuna
cella è caratterizzata da
un indirizzo
Gli
indirizzi corrispondono
all’ordinamento delle celle nella
sequenza
Gli
Gli
indirizzi sono interi positivi
indirizzi non sono scritti da
nessuna parte, sono solo
determinati dall’ordinamento
consecutivo
Astrazione
sui
comandi
Anche i comandi vengono rappresentati
come sequenze di bit (0 e 1)
Es.
incrementa di 1 il contenuto della cella
11000010
Il processore fornisce due meccanismi base
per eseguire i comandi
l’elaborazione
il
in sequenza
salto
00101101
10101100
00110101
01111101
...
Aspetto
dichiarativo e procedurale in C
I dati
Le istruzioni (programmi
Sono rappresentati nello stesso modo nella
macchina ma sono diversi in C;
I dati sono letti, scritti, usati in espressioni,
…
I programmi sono compilati ed eseguiti
Ciclo
di produzione del software
Creazione del codice:
editor ASCII generici o dedicati
Compilazione:
Miofile.c
compilatore
dal codice al file .obj
controllo sintattico
controllo lessicale
controllo semantico
ottimizzazione
Link:
Miofile.obj
linker
collegamento con le funzioni di
libreria
generazione del file eseguibile .exe
dati
computer
Miofile.exe