vuoi
o PayPal
tutte le volte che vuoi
INFORMATICA B
POLITECNICO DI MILANO - FACOLTA’ DI INGEGNERIA INDUSTRIALE
Criteri di valutazione di un algoritmo
Correttezza = capacità di pervenire alla soluzione in tutti i casi significativi possibili
Efficienza = proprietà strettamente legata al tempo di esecuzione e alla memoria impiegata
Linguaggi per esprimere gli algoritmi
Linguaggi semi-formali
Specifiche iniziali, ancora intelligibili solo all’essere umano.
Pseudo codice (“se A>0 allora B=B+A altrimenti B=B-A”)
Diagrammi di flusso
Linguaggi formali
Programmi da eseguire, intelligibili anche alla macchina. Consentono di scrivere
programmi eseguibili dal calcolatore.
Alto livello (vicini al linguaggio naturale). Es.C (if (A>0) B=B+A; else B=B-A)
Assembler (più vicini al codice macchina)
Componenti di un linguaggio
Vocabolario = parole chiave che costituiscono un linguaggio
Sintassi = regole per comporre i simboli del vocabolario
Semantica = significato delle espressioni
Compilatori e interpreti
Compilatore = programma che traduce un programma scritto in codice di alto livello (es. C) in linguaggio
macchina; genera un eseguibile (.exe) a partire da un file sorgente scritto in linguaggio di alto livello.
Interprete = programma che interpreta direttamente le operazioni, eseguendole di volta in volta che le
incontra; perciò non genera alcun eseguibile.
La catena di programmazione
1. Videoscrittura = scrittura del file sorgente del programma contenente testo in linguaggio di
programmazione, da parte del programmatore. (genera .asm, .c, .cpp)
2. Precompilazione = parte svolta dal preprocessore
3. Traduzione (compilazione) = un programma compilatore si fa carico del tradurre il codice in
linguaggio di programmazione in linguaggio macchina (binario). Si riconoscono costrutti, simboli e
parole del linguaggio. Genera un file programma oggetto (.obj)
4. Collegamento = un programma “collegatore” si occupa di collegare gli oggetti scritti nel programma
sorgente ai sottoprogrammi nelle librerie (istruzioni semplici come “printf” o “scanf” sono
sottoprogrammi costituita da più istruzioni precreate e incluse nelle librerie). Genera un programma
eseguibile (.exe)
5. Caricamento = un programma carica il programma .exe appena creato nella memoria di lavoro (RAM)
6. Esecuzione = l’operatore fornisce alla macchina i dati di input, poi elaborati, e la macchina restituisce
i dati di output.
GABRIELE MAZZOLARI A.A. 2017/2018 Pagina | 3
INFORMATICA B
POLITECNICO DI MILANO - FACOLTA’ DI INGEGNERIA INDUSTRIALE
Il linguaggio C
I programmi in C sono costituiti da funzioni (i mattoncini del programma). Esse possono essere create dal
programmatore o utilizzate quelle preesistenti, esse sono contenute nelle librerie.
Parti di programma
Commenti
/*… commento …*/ oppure //commento sono commenti. Queste parti di testo servono a rendere il codice
più facilmente capibile dal programmatore in un secondo momento. Parte ignorata dal compilatore.
Inclusioni
#include è un comando al preprocessore (preceduto da #) che dice di includere nel programma una libreria
di funzioni (es. stdio.h, stdlib.h,…) che saranno poi inserite nel programma tramite le shortcut (es. printf è in
realtà una shortcut per un sottoprogramma di più istruzioni).
#define
#define è un comando al preprocessore (fuori dalla main), che permette di definire delle macro, ovvero delle
variabili costanti/funzioni che verranno poi richiamate nella main. Esse vengono scritte a lettere maiuscole.
#define PIGRECO 3.14 //crei una costante che utilizzerai nella main richiamata con PIGRECO (es.
10*PIGRECO=31.4)
#define AREACERCHIO(x) (PIGRECO*(x)*(x)) //definisco una funzione di nome AREACERCHIO che calcola il
risultato fornendole in input il raggio
…
area = AREACERCHIO (4); //diventa (3.14*(4)*(4))
…
La main
int main () { … corpo della main …} è la funzione principale del programma, dentro alla quale staranno tutte
le istruzioni del programma, e i rimandi ad eventuali funzioni esterne ad essa (void) interpellabili al bisogno.
Dichiarazione di variabile
int a,b,c vuol dire dichiarare tre variabili di tipo int (numeri interi) di nome a,b,c a cui sarà assegnata una cella
di memoria. Al momento dell’assegnamento la cella di memoria corrispondente contiene un valore casuale
(0/1) dovuta ad un precedente assegnamento.
Prinf
printf(“Il risultato della funzione è:%d\n”, &a) è la funzione che permette di mandare in output valori. In
questo caso la funzione stamperà il testo tra virgolette “”.
I segnaposto (%...) sono caratteri speciali che indicano alla funzione printf di mandare in output la variabile
specificata in seguito al posto del segnaposto:
%d sta a significare che quel posto verrà occupato da una variabile di tipo int
%f sta a significare che quel posto verrà occupato da una variabile di tipo float
%c sta a significare che quel posto verrà occupato da una variabile di tipo char
%s sta a significare che quel posto verrà occupato da una variabile di tipo string (serie di caratteri)
GABRIELE MAZZOLARI A.A. 2017/2018 Pagina | 4
INFORMATICA B
POLITECNICO DI MILANO - FACOLTA’ DI INGEGNERIA INDUSTRIALE
La variabile a, scritta dopo la parte tra virgolette e preceduta dal carattere & che serve ad indicare l’indirizzo
di memoria da cui attingere la variabile da stampare (o il posto in cui immagazzinare un valore in caso sia in
una scanf). \n è un carattere di escape che dice al computer di andare a capo dopo aver stampato a.
Scanf
scanf (“%d”, &a)è la funzione che ha il compito di leggere il valore inserito dall’utente e di immagazzinarlo
nella variabile a (vedi printf per dettagli).
Assegnamento
a=a+b è un’operazione di assegnamento. Essa si indica con il segno di uguale e significa che sostituisce il
contenuto della cella identificata con la variabile a sinistra dell’espressione (a) con la parte a destra della
stessa (b+1, contenuto della cella b con l’aggiunta di 1).
Tipi di variabili
int è un tipo di variabile per numeri interi (senza parte decimale). Operazioni di divisione tra int troncano la
parte decimale.
float è un tipo di variabile per numeri decimali. Operazioni di divisione tra float danno in output un numero
decimale.
char è un tipo di variabile per caratteri singoli (a=’x’; vuol dire alla variabile a assegno la lettera x). Il carattere
da assegnare va racchiuso tra apici singoli. Sono rappresentati da numeri interi secondo la tabella ASCII,
perciò sono confrontabili e ordinabili secondo le regole relazionali (>,<,=).
array è un gruppo di celle di memoria consecutive (una “riga di tabella”), con stesso nome e tipo. Devono
essere specificati nome e tipo di variabile. Per riferirsi ad un elemento devono essere specificati nome
dell’array e posizione dell’elemento. Si scrivono come nomearray[posizione]. Si dichiarano come
nomearray[dimensione].
Es. char parola[12] //array di caratteri con 12 posizioni di memoria (da 0 a 11 (n-1))
int n[5] = {1,2,3,4,5}; // si può inizializzare anche così
array a più dimensioni A[20][20] //array bidimensionale (matrice) con 400 variabili distinte
Per inizializzare/scorrere una matrice si utilizzano due cicli for: uno per le righe e uno per le colonne.
stringhe sono array di caratteri da leggersi in fila.
Elementi della stringa = numero lettere della parola + 1 (carattere terminatore ‘\0’)
‘x’ vuol dire carattere x
“x” vuol dire stringa x composta da due caratteri (‘x’ e ‘\0’)
char stringa[] = “word” //crea una stringa di 5 elementi (4 della parola più \0 che è il carattere terminatore
di stringhe.
GABRIELE MAZZOLARI A.A. 2017/2018 Pagina | 5
INFORMATICA B
POLITECNICO DI MILANO - FACOLTA’ DI INGEGNERIA INDUSTRIALE
char stringa[] = {‘w’, ’o’, ’r’, ’d’, ’\0’}
Aritmetica
Istruzione condizionale (if-then-else)
if (x>5) { printf(“x è maggiore di 5: %d\n”, &x);
}
else printf(“x è minore di 5:%d\n”, &x);
Il ramo if esegue la sua istruzione/blocco di istruzioni se la condizione è verificata. In caso contrario vengono
eseguite le istruzioni del ramo else (se presenti).
Ciclo while
while (x>0) {…} è una funzione che serve ad iterare una istruzione fintantoché è verificata una condizione
(x>0).
Ciclo for
for (i=0; i<5; i++) è un ciclo che si utilizza quando si sa già il numero di iterazioni che il ciclo deve fare (in
questo caso 5).
Variabili enumerative
enum {qui, quo, qua} papero
GABRIELE MAZZOLARI A.A. 2017/2018 Pagina | 6
INFORMATICA B
POLITECNICO DI MILANO - FACOLTA’ DI INGEGNERIA INDUSTRIALE
E’ una variabile di tipo enumerativo, ovvero i nomi dichiarati tra parentesi graffe sono “etichette” per i
corrispondenti valori (da 0 a n-1 per n “etichette”).
printf( “%d”, &quo); //stampa 1
scanf(%d, &papero); //se inseriamo 2, papero assume automaticamente il valore qua
Per “sfalsare” l’inizio delle etichette basta assegnare un valore alla prima:
enum {sufficiente=6, buono, distinto, ottimo, eccellente} voto;
L’incremento
i++ e ++i sono entrambe funzioni che servono ad incrementare i di 1. i++ però prima fornisce il valore di i e
poi la incrementa. ++i invece prima la incrementa e poi ne fornisce il valore.
int c = 5;
printf( “%d” , ++c); //stampa 6
printf( “%d” , c++); //stampa 5
getch()
getch() è la funzione che blocca la schermata alla fine del programma in attesa di un comando dell’utente,
che altrimenti si chiuderebbe subito dopo aver completato il ciclo della main.
Return 0
return 0 alla fine della main serve a terminare la funzione. Il valore 0 significa che il programma è terminato
senza anomalie.
Struct
struct Luca {
char nome[] = “Luca”;
char cognome[] = “Rossi”;
int eta=10;
}
printf(“%s”, &luca.nome); //stampa il nome “Luca”
printf(“%d”, &luca.eta); //stampa il numero 10
Typedef
Il comando typedef (va fuori dalla main!!!) va a definire un nuovo nome per tipi di dati (che può essere float,
int, char, …).
1. In questo modo si definisce un nuovo nome per tipi di dato già esistenti (es. int dalla typedef in poi
si chiamerà Altezza).
2. Permette di definire e di assegnare un nome ad una struttura o ad una enumerazione.
a. Es.
typedef struct {
char nome[];
char cognome[];