Sei sulla pagina 1di 13

Le istruzioni di un ciclo possono non essere chiuse tra {…}

5 Flusso di controllo quando c’è solo una linea di istruzioni da eseguire

terminatore di istruzione ;
C Reference Card (ANSI) - versione semplificata delimitatore blocco { ... }
istruzione if if (espr) istruzione1 else istruzione2
corso Informatica B Politecnico di Milano istruzione while while (espr) istruzione —> la condizione viene verificata prima di eseguire le istruzioni
istruzione for for (istr1; espr; istr3) istr2 for(i=0; i<N; i++)
istruzione do do istruzione while (espr);
istruzione switch switch (espr) {case val1: istr1; break; ...
default istr}
1 Struttura del programma
6 Libreria ANSI C
struttura del programma principale A inizio codice bisogna
<assert.h> <ctype.h> <errno.h> <float.h> <limits.h> <locale.h> includere delle librerie:
int main(void) { #include <stdio.h>
<math.h> <setjmp.h> <signal.h> <stdarg.h> <stddef.h> <stdio.h>
declarations #include …
<stdlib.h> <string.h> <time.h>
statements
}
7 Input/Output <stdio.h>
Dichiarazione di variabile: type name;
stampa formattata printf(‘‘formato’’, arg1, arg2, ...); printf("%tipovar
printf(“%d”,n);
...", variabile);

2 Comandi per il preprocessore acquisizione formattata scanf(‘‘formato’’, arg1, arg2, ...); scanf("%tipovar", &nome);
scanf("%d", &n);

Le stringhe sono array di caratteri da leggersi in fila, quindi vanno definiti


inclusione di un file di libreria #include <filename> 8 Operazioni tra stringhe <string.h> come caratteri
definizione di costante #define name value —> è utilizzato per definire una costante globale al di fuori del char stringa[]={‘c’,’i’,’a’,’o’,’\0’} #\0 è il carattere che termina le stringhe
main, ad esempio la dimensione massima di un array char stringa2[10];
#include <stdio.h> lunghezza di s strlen(s) printf(“Inserisci il tuo nome: “)
#define DIM 20 scanf(“%s”, stringa2); #il nome dell’array rappresenta l’indirizzo del
3 Dichiarazioni int main() { copia di s1 in s2 strcpy(s1, s2) primo elemento, perciò quando ci si vuole
int v[DIM}; riferire all’intero array non serve &

concatenazione di s2 dopo s1 strcat(s1, s2) printf(“%s %s”, stringa, stringa2);
carattere (1 byte) char %c } confronto tra s1 e s2 strcmp(s1, s2) - restituisce 0 se uguali, < 0 se s1 precede s2,
intero int %d > 0 altrimenti
short (16 bit integer) short Nel caso di stringhe scanf legge in input i caratteri fin quando non trova lo spazio o invio, se trova una
stringa troppo lunga è memorizzata oltre la fine dell’array ed è un errore grave!
long (32 bit integer) long Per definire una struct:
typedef struct{ TipoVariabile NomeVariabile; #tipo variabile può essere un int, 9 Mathematical Functions <math.h>
numero senza segno unsigned un char o una struct o un array
constante type const name; precedentemente definiti funzioni trigonometriche sin(x), cos(x), tan(x)
…} NomeStruct;
numero reale float, double Typedef NomeStruct NomeVariabile [N]; funzioni trigonometriche inverse asin(x), acos(x), atan(x)
type enumerativo typedef enum name1, name2, ... typeName; arctan(y/x) atan2(y,x)
struct typedef struct ... typeName; funzioni trigonometriche iperboliche sinh(x), cosh(x), tanh(x)
ridefinizione di tipo typedef oldTypeName newTypeName; esponenziali & logaritmi exp(x), log(x), log10(x)
Gli array sono gruppi di celle consecutive con
tipo array typedef elementType arrayType[dim]; lo stesso nome e dello stesso tipo elevamento a potenza pow(x,y), sqrt(x)
tipo matrice typedef elementType matrixType[dim1][dim2];
Per riferirsi ad un array o ad una matrice si specifica il nome e la posizione:
int v[10]; #definisco un array di dimensione 10 (le posizioni vanno da 0 a 9), quando dichiaro la dimensione DEVE essere nota
scanf(“%d”, &v[2])
4 Operatori printf(“%d”, v[2])

accesso al campo di una struct structName.field


accesso all’i-esimo elemento di un array arrayName[i]
operazioni aritmetiche per interi +, -, *, /, %, ++, -- (% è utilizzato per calcolare il resto di una divisione)

operazioni aritmetiche per reali +, -, *, /


operatori di confronto ==, !=, >, <, >=, <= Per array e matrici è possibile fare
operatore di assegnamento = operazioni solo sui singoli elementi, non
sull’intero array simultaneamente
operatori logici &&, ||, !
Struttura di un programma C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

parte dichiarativa globale

inclusione librerie /* per poter invocare funzioni utili (i/o, ...) */


dichiarazione di variabili globali e funzioni

int main ( ) { parte dichiarativa locale


dichiarazione di variabili locali

istruzione 1; /* tutti i tipi di operazioni, e cioè: */


istruzione 2; /* istr. di assegnamento */
istruzione 3; /* istr. di input / output */
istruzione 4; /* istr. di controllo (condizionali, cicli) */
...
istruzione N; parte
} esecutiva

Ogni programma C deve contenere un modulo int main() {...}


19
Inizializzazione di un array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

• Sintassi compatta:
int n[5] = {1, 2, 3, 4, 5};
§ Inizializzazione parziale: gli elementi più a destra sono
posti a 0
int n[5] = {13}; tutti gli altri elementi sono posti a 0
§ Specificare troppi elementi tra le graffe è un errore di
sintassi
• Se la lunghezza dell’array è omessa, gli
inizializzatori la determinano:
int n[] = {5, 47, -2, 0, 24};
è equivalente a:
int n[5] = {5, 47, - 2, 0, 24};
§ In tal caso la dimensione è inferita automaticamente, e si
avranno 5 elementi nell’array

13
Definire un nuovo tipo
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Tipi strutturati:

typedef struct ilMioRecord


{
?
A ?
24.56 ?
23 ?
45
char campo1;
float campo2;
int campo3[2];
} Record;
campo1 campo2 campo3
Record ilMioRecord; #Definisco una variabile di tipo Record e la chiamo ilMioRecord

ilMioRecord.campo1 = 'A'; #Usiamo il punto per indicare un campo di una struttura


ilMioRecord.campo2 = 24.56;
ilMioRecord.campo3[0] = 23;
ilMioRecord.campo3[1] = 45;

24
L’elemento principale di un programma in C è il main, che contiene le istruzioni che verranno eseguite all’avvio del programma:
int main (){

return 0; #In questo caso il main restituisce un intero, 0, cosicché la macchina capisce che il programma è terminato
}

void main(){

} #In questo caso una volta concluso il programma non viene restituito nulla

Le variabili non sono altro che contenitori, aree di memoria, identificate da un nome univoco. Dato il nome di una variabile, &nome
restituisce la sua posizione in memoria.

if(A){ #Il ciclo verrà eseguito se A ha un valore considerato VERO, cioè un valore diverso da 0
printf(“ciclo eseguito\n”)
}
Codifica binaria
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

• Alfabeto binario: usiamo dispositivi con solo due stati


• Problema: assegnare un codice univoco a tutti gli oggetti
compresi in un insieme predefinito (e.g. studenti)

• Quanti oggetti posso codificare con k bit:


§ 1 bit Þ 2 stati (0, 1) Þ 2 oggetti (e.g. Vero/Falso)
§ 2 bit Þ 4 stati (00, 01, 10, 11) Þ 4 oggetti
§ 3 bit Þ 8 stati (000, 001, …, 111) Þ 8 oggetti
§ …
§ k bit Þ 2k stati Þ 2k oggetti

• Quanti bit mi servono per codificare N oggetti:


§ N ≤ 2k Þ k ≥ log2N Þ k = élog2Nù (intero superiore)

• Attenzione:
ipotesi implicita che i codici abbiano tutti la stessa
lunghezza

6
bit, Byte, KiloByte, MegaByte, …
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

bit = solo due stati, “0” oppure “1”.


Byte = 8 bit, quindi 28 = 256 stati
KiloByte [KB] = 210 Byte = 1024 Byte ~ 103 Byte
MegaByte [MB] = 220 Byte = 1'048'576 Byte ~
106 Byte
GigaByte [GB] = 230 Byte ~ 109 Byte
TeraByte [TB] = 240 Byte ~ 1012 Byte
PetaByte [PB] = 250 Byte ~ 1015 Byte
ExaByte [EB] = 260 Byte ~ 1018 Byte

17
Indirizzi di memoria
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

• I bit nelle memorie sono raggruppati in celle:


§ tutte le celle sono formate dallo stesso numero di bit;
§ una cella composta da k bit, è in grado di contenere una
qualunque tra le 2k combinazioni diverse di bit.
• Ogni cella ha un indirizzo:
§ serve come accesso all’informazione;
§ in una memoria con N celle gli indirizzi vanno da 0 a N–1.
• La cella è l’unità indirizzabile più piccola.
In quasi tutti i calcolatori è di 8 bit (un byte).
• I byte vengono raggruppati in parole (che oggi sono di
32/64 bit), su cui la CPU esegue le operazioni.

39
Variabili e memoria
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

• Dichiarare una variabile significa riservare una


zona di memoria composta da diverse celle

• Il numero di celle dipende dal tipo di dato


(short int 2 byte, float 4 byte, …)

• Ogni cella di memoria ha un indirizzo fisico e:


§ il nome della variabile indica il contenuto della
cella di memoria
§ l’operatore & permette di ottenere l’indirizzo di
memoria della cella associata alla variabile cui
l’operatore è applicato

46

Potrebbero piacerti anche