Upload
lehuong
View
217
Download
1
Embed Size (px)
Citation preview
Nozioni base di programmazione Nozioni base di programmazione in linguaggio Cin linguaggio C
Politecnico di MilanoSede di Cremona
Gianpaolo CugolaDipartimento di Elettronica e Informazione
[email protected]://www.elet.polimi.it/~cugola
Informatica A - Cugola 2
Codifica degli algoritmiCodifica degli algoritmi
• Algoritmo formulato per essere eseguito automaticamente– Preciso ed eseguibile
• Linguaggio macchina � �
linguaggio di programmazione di alto livello
• Formulato per essere comunicato tra esseri umani – Sintetico e intuitivo
• Linguaggio naturale
Informatica A - Cugola 3
C: differenze rispetto al linguaggio C: differenze rispetto al linguaggio macchinamacchina
• Elementi del programma (celle di memoria, istruzioni, valori costanti) denotati in modo simbolico– Usando un identificatore... più facile da ricordare
• Sequenza di esecuzione istruzioni espressa in modo più simile al linguaggio naturale e alla matematica
Informatica A - Cugola 4
La macchina astratta CLa macchina astratta C
Informatica A - Cugola 5
Standard I/OStandard I/O
• Un programma C ha due periferiche “ standard” di ingresso e uscita– Standard input (tastiera)– Standard output (video)
• Possiamo pensarle come “ sequenze” di celle elementari ognuna delle quali contiene un dato (da leggere o scritto)
Informatica A - Cugola 6
MemoriaMemoria
• Divisa in celle elementari: VARIABILI
• Ogni cella può contenere un dato
• I dati possono essere– Numeri– Caratteri– Stringhe (successioni finite di caratteri,
immagazzinati in celle consecutive)
• Semplificazioni/ idealizzazioni (astrazioni)– Nessun limite al numero delle celle e al valore
numerico contenuto
Informatica A - Cugola 7
VariabiliVariabili
• Denotate tramite identificatori simbolici• Regole per gli identificatori in C:
– Un identificatore è composto da una successione di lettere, cifre e simbolo _ , con al primo posto una lettera o il simbolo _
• Esempi di identificatori C• a, x, alfa, pippo, a1, xy23, Giuseppe, DopoDomani,
velocita_massima, _velocita• NB maiuscole distinte dalle minuscole: Var1, var1 e VAR1 sono tre
diversi identificatori
• Si noti che il concetto di variabile in un linguaggio di programmazione differisce dal concetto di variabile in matematica– I n un linguaggio di programmazione una variabile è
semplicemente il nome per una cella di memoria– x=x+1 è una tipica istruzione C, non ha molto senso in
matematica
Informatica A - Cugola 8
AttenzioneAttenzione
• Per evitare ambiguità è vietato usare:– Stesso identificatore per indicare diversi elementi
– Diversi identificatori per lo stesso elemento
• Esistono identificatori riservati– Associati a priori a qualche elemento del li nguaggio
– Non usabili dal programmatore con significati differenti da quello predefinito• Esempio: parole chiave
– scanf operazione di ingresso – printf operazione di uscita
Informatica A - Cugola 9
Struttura di un programma CStruttura di un programma C
• Intestazione costituita dall ’identificatore predefinito main sequito da una coppia di parentesi tonde ()
• Seguita da una sequenza di istruzioni, racchiuse tra { e }– Ogni istruzione termina con ;
• Esempio:main() {
x = 3;
myVar = 5;
}
Informatica A - Cugola 10
IstruzioniIstruzioni
• Assegnamenti
• Ingresso/ Uscita
• I struzioni composte
Informatica A - Cugola 11
AssegnamentoAssegnamento
• Sintassi:variabile = espressione;
• Esempio:lunghezza = 10;
altezza = 20;
alt = altezza;
peso = 10*altezza*(lunghezza +1);
• L’espressione può essere – Un valore costante – Una variabile – combinazione di espressioni mediante operatori (e.g. aritmetici
+, −−, * , / , %) e parentesi
Informatica A - Cugola 12
Esecuzione assegnamentoEsecuzione assegnamento
• L’esecuzione di una istruzione di assegnamento avviene secondo i seguenti due passi in sequenza– valutazione dell’espressione– memorizzazione del risultato nella variabile a sinistra del
simbolo =
• Esempio:x = y * (x + 3) * 2;
passo 1
passo 2
passo 3
passo 4
Informatica A - Cugola 13
AutoassegnamentiAutoassegnamenti e incrementie incrementi--decrementidecrementi
• E’ comunque avere istruzioni del tipo:x = x + 1;
dette “auto -assegnamenti”• Per questo esiste una sintassi abbreviata per
auto-assegnamenti e incrementi-decrementix = x + a →→ x += a
x = x – a →→ x - = a
x = x * a →→ x *= a
x = x / a →→ x /= a
x = x + 1 →→ x++
x = x – 1 →→ x--
Informatica A - Cugola 14
Istruzioni di I/OIstruzioni di I/Otrascurando qualche dettaglio!!!trascurando qualche dettaglio!!!
• scanf (variabi l e) � �
ingresso
• printf (espres sione )� �
uscita
• Esempioprintf (larghezza);
printf ((a –z)/10);
Informatica A - Cugola 15
Casi particolariCasi particolari
• Stampa di un carattere– Per evitare ambiguità con gli identificatori, i
caratteri vengono racchiusi tra apiciprintf ('a');
• In maniera analoga le stringhe vengono racchiuse tra doppi apici printf (" alfa ");
sta perprintf ('a');
printf ('l');
printf ('f');printf ('a');
Informatica A - Cugola 16
Istruzione compostaIstruzione composta((compoundcompound statement)statement)
• Si possono raggruppare più istruzioni in sequenza tra { e } a costituire un blocco del tutto equivalente a una singola istruzione
• Non è necessario il “;” dopo “}”, in quanto il blocco è già una istruzione (non necessita del terminatore per diventarla)
Informatica A - Cugola 17
CondizioniCondizioni
• Le condizioni sono espressioni che hanno valore vero o falso
• In C non esiste un tipo boolean vero e proprio ma si ricorre a una convenzione– vero � � qualunque valore intero ≠ 0– falso � � il valore 0
Informatica A - Cugola 18
CondizioniCondizioni
• Le condizioni si costruiscono usando operatori relazionali== != < > <= >=
• Oppure logici! (NOT)
|| (OR)
&& (AND)
Informatica A - Cugola 19
Esempi di condizioniEsempi di condizioni
X == 0
X>0 && A != 3
!((x+5)*10 >= (ALFA3/BETA_DUE))
NB esistono regole di precedenza ! a || b && c prima !, poi &&, poi | |
in caso di dubbio, usare le parentesi tonde
Informatica A - Cugola 20
DettagliDettagli
• Gli operatori && e | | si valutano da sinistra a destra
• La valutazione continua solo fino a quando si è raggiunta la certezza del valore di verità dell ’espressione, quindi si ferma (valutazione in corto circuito) – Esempio:(i==0) || ((a/i)>5)non genera un errore se i=0; genera 0 (falso)
Informatica A - Cugola 21
Istruzione composta condizionaleIstruzione composta condizionale
• E’ possibile modificare il flusso di controllo del programma in funzione del risultato della valutazione di una espressione condizionale usando l’istruzioneif...elseif ( xx < 0) xx = - xx ; else xx = xx + 10;
• Per maggior leggibilità, è bene usare regole di incolonnamento (indentazione)if ( xx < 0)
xx = - xx ;
else
xx = xx + 10;
Informatica A - Cugola 22
EsempioEsempio
if (a > b) {
max = a;
printf (“mass i mo: %d”, a);
}
else {
max = b;
printf (“mass i mo: %d”, b);
}
Notare
Notare
Informatica A - Cugola 23
if if “ semplice”“ semplice”
• E’ possibile omettere la parte elseif(x < 0) x = - x; /* calcola val. assoluto*/
• Nel caso di if nidificati possono esserci delle ambiguità:if(n > 0) if(a>b) z = a; else z = b;
• L’ambiguità è risolta dal C associando l’else all’if più vicino– L'i ndentazione lo rende evidente (ma l’indentazione non ha
significato per il compilatore)if(n > 0)
if(a > b) z = a;
else z = b;
– Se incerti, usare le parentesi (che invece hanno un significato ben preciso anche per il compilatore)if(n > 0) {
if(a > b) z = a;
else z = b;
}
Informatica A - Cugola 24
CommentiCommenti
• Racchiusi tra / * e */• L’intera stringa è ignorata dal compilatore
• Servono per migliorare la leggibili tà di un programma e la facilità di modifica
• Esempio:printf(“a = %d”,a); /*stampa il valore di a*/
Informatica A - Cugola 25
Il ciclo (Il ciclo (looploop) ) whilewhile
• Ripete una istruzione, o un blocco di istruzioni, fin tanto che una condizione è vera
• Sintassi:while (condizione) istruzio ne;
• Esempio:scanf (a);/* a è un natural e*/
scanf (b); /* b è un natural e*/
while (b > 0) {
a = a + a;
b-- ;
}
Informatica A - Cugola 26
Esempio: calcolo del MCD (1)Esempio: calcolo del MCD (1)
/*si scandiscono tutti i naturali da 1 al min tra x e y. L’ultimo div. comune trovato è il MCD*/
scanf (x); scanf (y); /*x, y naturali positivi*/
contatore = 1;
if (x<y)
min = x;
else
min = y;
while (contatore <= min ) {
if ((x % contatore)==0 && (y % contatore)==0) )
mcd = contatore;
contatore++;
}
Informatica A - Cugola 27
Esempio: MCD (2)Esempio: MCD (2)
/*si scandiscono i naturali dimin uendo a partire dal minimo tra x e y. Il primo divisore comune trovato è i l MCD*/
scanf (x); scanf (y); /*x, y natura l i positivi*/
if (x<y)
cand = x; else
cand = y;
while ((x % cand ) != 0 || (y % can d) != 0)
-- cand ;
mcd = cand ;
Informatica A - Cugola 28
Esempio: MCD (3)Esempio: MCD (3)
/*si codifica l’algoritmo d i Eucl i de*/
scanf (x); scanf (y); /*x, y natura l i positivi*/
while (x != y)
if (x > y)
x = x – y;
else
y = y – x;
mcd = x;
Informatica A - Cugola 29
AnalisiAnalisi criticacritica
• Siamo sicuri che il ciclo termini sempre?– Cruciale l'i potesi che x e y siano naturali positivi– I l programmatore serio immetterebbe un opportuno
controllo– Sotto questa ipotesi, ad ogni passo o x o y decresce,
ma resta positivo– Non esiste una sequenza di coppie <x, y> che
rispett i queste proprietà e che non sia finita
Informatica A - Cugola 30
EserciziEsercizi
• Si implementi un programma che chiede all ' utente di inserire un numero intero e verifica se sia primo
• Si scriva un programma che calcola il più piccolo numero primo successivo ad un intero dato
Informatica A - Cugola 31
I “dettagli” del CI “dettagli” del C
• I l programma deve essere definito come “ main”main ( ) {
...
}
• Per poter effettuare I / O deve “includere” le librerie opportune#include < stdio .h>
Informatica A - Cugola 32
Le dichiarazioniLe dichiarazioni
• Tutte le variabili devono essere dichiarate, specificandone il tipo
• TIPO: definisce l' insieme di valori assumibili e le operazioni applicabili
• Perché dichiarare?– Per poter controllare il programma in compilazione
int pippo ; int beppe ;
pippo = pipo+1; beppe =‘a’;
Informatica A - Cugola 33
Tipi predefiniti in CTipi predefiniti in C
• char , int , fl oat e doubleint i = 0; /* inizializzazio ne*/
char a;
const float pi = 3.14; /*pi non p uò più essere modificato*/
float zeta = 1.33;
• Consigli: – Inizializzare sempre esplicitamente. – Evitare le inizializzazioni implicite che C potrebbe
eseguire, al fine di migliorare la leggibilità
Informatica A - Cugola 34
printfprintf: maggiori dettagli: maggiori dettagli
• Richiede oltre agli elementi da stampare una stringa di controllo che specifica il tipo del dato da stampare
• Sintassi esatta:printf (stringa_controllo, elemen t i);
• Stringa di controllo:– %d intero decimale– %f floating point– %c carattere– %s stringa– \ n (new line) manda a capo
Informatica A - Cugola 35
EsempioEsempio
float t1, t2;/*temperatura in gradi celsius e fahrenheit*/
...
printf (“%s\n%s%f\n%s%f\n”, “temperatura”, “in gradi celsius=”, t1, “in fahrenheit=”, t2);
printf (“temperatura\nin gradicelsius=%f\nin fahrenheit=%f\n”, t1, t2);
Informatica A - Cugola 36
scanfscanf
• Anch’essa prevede una stringa di controllo che specifica come devono essere interpretati i caratteri letti in ingresso
• I nomi delle variabili di cui leggere il valore (per motivi che vedremo) debbono essere preceduti da &
• Esempio:int a, b; char c; float d;
scanf(“%d%d%c%f”, &a, &b, &c, &d);
Informatica A - Cugola 37
I tipi di datiI tipi di dati
• I l tipo rappresenta l’insieme dei possibili valori che una variabile può assumere...
• ... nonché le operazioni che possiamo effettuare su tale variabile
• Attraverso l’attribuzione di un tipo l’uso di una variabile diventa molto diverso dalla visione di un dato da parte del linguaggio macchina– Sequenza di bit, che posso interpretare come voglio
(sommarla come se fosse un numero intero, farla “scorrere” a destra o sinistra, ecc.)
Informatica A - Cugola 38
Vantaggi del concetto di tipoVantaggi del concetto di tipo
• Si conosce quanta memoria riservare a una variabile in funzione del suo tipo– int: di solito una parola– float: di solito due parole
• Si possono rilevare errori di uso della variabile in fase di compilazione (ma qui i l C è alquanto debole...)
Informatica A - Cugola 39
Conversioni di tipoConversioni di tipo
• Quando in C un operando non è del tipo atteso, anziché segnalare errore viene fatta di soli to una conversione automatica di tipo
• Esempioint i; float f, f1;
f1 = i + f;
/* la valutazione dell’espr ession e i+f effettua prima la conversio ne di i infloat e poi la somma */
Informatica A - Cugola 40
Altre conversioni di tipoAltre conversioni di tipo
int a, b; flo at c;
a=c; /*tronca mento*/
c=a; /*trasfo r mazione di int ero infloat */
a=a/b; /*ness una conve r sione , a/b è un valore int ero tronc ato*/
a=a/c; /*a tr asformato in fl oat , divisione ese guita, tr oncamento nell’assegnam ento*/
Si noti l’uso dello stesso simboloper operazioni diverse
Informatica A - Cugola 41
Il tipoIl tipo intint
• E` un’approssimazione sul concetto matematico di numero intero
• Normalmente utilizza 1 parola• Esistono anche short int e long int
– Tipicamente:long 32 bit, short 16 bit eint 16 o 32
– E’ richiesto che • spazio per short <= spazio per int <= spazio per long
– Si può usare il tipo char per interi tra –127 e 127– Si può anche specificaresigned/unsigned
• signed è ridondante per i tipi numerici• Posso avereunsigned int, signed char, ...
Informatica A - Cugola 42
I tipiI tipi floatfloat ee doubledouble
• Sono un’approssimazione sul concetto matematico di numero razionale
• Le costanti si possono scrivere in vario modo:– 315.779
– 3.73E-5
• double di solito occupa più memoria difloat– Tipicamente 4 byte per float e 8 byte per double
(...esistono anche i long double, che devono occupare almeno tanto spazio quanto i double)
Informatica A - Cugola 43
long double
double
float
unsigned longunsigned long int
unsignedunsigned int
unsigned shortunsigned short int
long int, signed long, long
signed long int
signed, intsigned int
signed short, shortsigned short int
unsigned char
signed char
char
Denominazioni alternative
Tipo predefinito
Informatica A - Cugola 44
Ancora sulle conversioni automatiche Ancora sulle conversioni automatiche di tipodi tipo
• Si consideri un operatore aritmetico binario– Se uno dei due operandi è long double, converti
l’altro a long double, altrimenti– Se uno dei due è double, converti l’altro a double,
altrimenti– Se uno dei due è float, converti l’altro a float,
altrimenti– Converti char e short a int– Quindi, se un operando è long, converti l’altro a long
Informatica A - Cugola 45
Ancora sulle conversioni automatiche Ancora sulle conversioni automatiche di tipodi tipo
• Si consideri un assegnamento– I l valore dell ’espressione della parte destra viene
convertito al tipo che sta a sinistra di “=“• Un char è convertito a int• I nteri lunghi (p.es. int) sono convertiti in interi più corti
(p. es. char) troncando bit• float x; int i;
– sia x=i che i=x causano conversioni
• Quando double viene convertito in float dipende dall ’implementazione se troncamento o arrotondamento
Informatica A - Cugola 46
CauteleCautele
• Attenzione ai confronti tra floatif (a == b) ...
• potrebbe non avere senso a causa delle approssimazioni nella memorizzazione!!!
Informatica A - Cugola 47
Il tipoIl tipo charchar
• Di soli to rappresentato mediante un byte di 8 bit– pertanto consente di rappresentare i caratteri ASCII
• I caratteri sono rappresentati da numeri interi e quindi tra essi è definito un ordinamento– Per esempio il carattere ASCI I ‘0’ è rappresentato
dall ’intero 48 “più grande” del carattere ASCI I ‘1’ rappresentato dall ’intero 49
Informatica A - Cugola 48
Un esempioUn esempio
• I l prossimo esempio illustra:– La somiglianza trachar eint
– Come progettare il dialogo di I / O • Facendo precedere sempre un input da un output di
richiesta (" prompt" )
Informatica A - Cugola 49
#i ncl ude <st dio . h>mai n( ) {/ * l egge un c ara t t ere e ne st ampa i l va l or e ASCI I se è l et te r a mi nusco l a; s e no t er mi na* /
char c; in t i ;pr i nt f ( “ sc r i v i un ca r at t er e mi nuscol o ( maiu scol o
per t er min ar e) \ n” ) ;scanf ( ” %c” , &c );whi le ( c>=’ a’ && c <=’ z’ ) {
i =c;pr i nt f ( “ va l or e ASCII pe r % c r i sul t a %d” , c, i );pr i nt f ( “ sc r i v i un ca r at t er e mi nuscol o ( maiu scol oper t er min ar e) \ n” ) ;scanf ( ” %c” , &c );
}}
Informatica A - Cugola 50
EserciziEsercizi
• Si scriva un programma che legge da standard input un numero e una sequenza di caratteri (terminata dal carattere ‘x’) e via via che legge crittografa i caratteri usando la tecnica di shiftdi tante cifre quanto vale il numero letto– Nota: i caratteri leggibili vanno da 32 a 127 (ascii)
• Moltiplicare 2 numeri razionali (definiti da numeratore e denominatore) semplificando il risultato
Informatica A - Cugola 51
Tipi Tipi integralintegral
unsigned longunsignedunsigned short
longintshort
unsigned charsigned charchar
Informatica A - Cugola 52
Studio Studio deidei ciclicicli
• Caso con numero di iterazioni predeterminato(p. es., n)
• vedremo l' esistenzadi un ulteriore forma diciclo per questo caso
i nt cont at or e = 1 ;whi le ( cont at or e <= n) {
…;conta t or e++;
}
i nt cont at or e = 0 ;whi le ( cont at or e < n) {
…;conta t or e++;
}
oppure
Informatica A - Cugola 53
Studio dei cicliStudio dei cicli
• I terazione controllata da " sentinella"
• Esempio: calcolare la media di una serie di numeri naturali da leggere. I l valore –1 indica la fine del flusso
• NB: scegliere la sentinella in modo che non faccia parte dell'i nsieme dei valori da elaborare!!!
Informatica A - Cugola 54
printf("fornisci valore da elaborare;se hai finito, fornisci %…", sentinella);
scanf("%…", valore);while (valore != sentinella) {
elabora valore;printf("fornisci valore da elaborare;
se hai finito, fornisci %…", sentinella);scanf("%…", valore);
}
Informatica A - Cugola 55
La costruzione incrementale (top La costruzione incrementale (top down) dei programmidown) dei programmi
• Si leggono sequenze di gruppi di naturali; ciascun gruppo è separato dal successivo dal numero 0
• L’ultimo gruppo è terminato da “ -1”
• Si stampano in uscita sequenze di naturali che rappresentano le somme dei valori dei singoli gruppi
Informatica A - Cugola 56
cerca gruppo;while (esiste un gruppo) {
calcola sommatoria;stampa sommatoria;passa a prossimo gruppo;
}
passo 1
int i;scanf(“%d”, &i);while (i != -1) {
calcola sommatoria;stampa sommatoria;passa a prox. gruppo;
}
passo 2
int i; int sum;scanf(“%d”, &i);while (i != -1) {
sum=0;accumula sommatoria;printf (“%d \n”, sum);passa al prossimo gruppo;
}
passo 3
Informatica A - Cugola 57
int i; int sum;scanf(“%d”, &i);while (i != -1) {
sum=0;while (gruppo non finito) {
sum += i;scanf (“%d”, &i);
}printf (“%d \n”, sum);if (i!= -1) scanf (“%d”, &i);
}
passo 4
gruppo non finito � i!=0 && i != -1
Informatica A - Cugola 58
Che cosa abbiamo fattoChe cosa abbiamo fatto
• I l programma viene derivato per passi successivi di raff inamenti
• Viene scritto ad ogni passo in un misto di C e linguaggio naturale (pseudo-codice)
• Alla fine del processo di raff inamenti risulta scritto in C ed è eseguibile
• I passi scritt i in linguaggio naturale e raff inati al passo successivo possono diventare commenti