Sei sulla pagina 1di 41

IL LINGUAGGIO C

Per leleganza della sintassi e la compattezza dei costrutti, il C una sfida permanente alle capacit intellettuali del programmatore. E un linguaggio di alto livello con un insieme ristretto di costrutti di controllo e parole chiave (circa trenta), ma possiede un buon numero di operatori. Il C e' diventato un linguaggio professionale ampiamente utilizzato perch ha appunto strutture di alto livello ma pu maneggiare attivit di basso livello. Produce inoltre programmi efficienti e pu essere compilato su un'ampia gamma di sistemi operativi.

Il primo programma in C
Il pi semplice in assoluto il famoso "Hello World!" (Ciao Mondo) che ha soltanto lo scopo di stampare a video la suddetta scrittura.
1 2 3 4 5 6 7 8 9 10 /* Un primo programma in C */ #include <stdio.h> int main () { printf("Hello World! \n"); return 0; }

Analizziamo le singole righe


Si comincia con /* . */ alla riga 1 per indicare che questa linea di commento. I programmatori inseriscono dei commenti per documentare i programmi e migliorare la loro leggibilit. Alla riga 3 troviamo una direttiva per il prepocessore. Le righe che cominciano con # sono comandi che permettono di richiamare le librerie del C, in questo caso quella che ci permette di eseguire le operazioni di input-output (stdio.h = standard i/o) come printf. La main la funzione principale in un qualsiasi programma e identifica il punto dinizio dellesecuzione. Allinterno delle parentesi tonde si possono inserire, se necessari, dei parametri. La parentesi graffa aperta deve aprire il corpo di ogni funzione e una corrispondente parentesi graffa chiusa lo deve chiudere. La parte contenuta fra le due parentesi detta blocco.

Analizziamo le singole righe


Alla riga 7 listruzione printf ordina al computer di eseguire unazione: visualizzare sullo schermo la stringa di caratteri indicata fra le virgolette. La sequenza \n significa newline e provoca il posizionamento del cursore sulla riga successiva alla stringa stampata. Il punto e virgola, invece, serve per "chiudere" un'istruzione, per far capire che dopo quel simbolo inizia una nuova istruzione. La riga 10, return 0; inclusa alla fine di ogni main ed indica che il programma terminato con successo. N.B. Per poter visualizzare il risultato del programma, occorre inserire: #include <conio.h> getch(); Questo impedisce al sistema operativo di chiudere la finestra di visualizzazione del risultato una volta completata lesecuzione.

Risultato
#include <stdio.h> #include <conio.h> int main () { printf("Hello World! \n"); getch(); return 0; }

Ottenendo la videata mostrata a lato

Leditor di testo
Un programma in C pu essere scritto anche con un semplice editor di testi. Per poter vedere il risultato del codice dobbiamo salvare necessariamente il file con un'estensione ".c", ad esempio "hello world.c".

Puntare il mouse su File, Nuovo, File Sorgente

La compilazione
A questo punto non dobbiamo fare altro che compilare il programma.

Puntare il mouse su Compila

La compilazione
La compilazione di un programma in C segue varie fasi: Il codice sorgente viene controllato dal preprocessore che ha i seguenti compiti: - rimuovere eventuali commenti presenti nel sorgente; - interpretare speciali direttive per il preprocessore denotate da "#" - controllare eventuali errori del codice Il risultato del preprocessore sar un nuovo codice sorgente "pulito" ed espanso" che viene tradotto dal compilatore C in codice assembly L'assembler sar incaricato di creare il codice oggetto salvandolo con estensione .obj Il Link editor ha il compito di collegare tutti i file oggetto risolvendo eventuali dipendenze e creando il programma (.exe)

La compilazione
Tutte queste operazioni possono individuare facilmente errori di sintassi, ma mai e poi mai potranno trovare errori logici (come ad esempio un ciclo che non finisce), anche se spesso vengono segnalati dei Warning che non costituiscono errore, ma che segnalano parti di codice strane e quindi sulle quali porre attenzione per eventuali errori logici. Correggere gli errori e ripetere la procedura.

Lesecuzione
Puntare il mouse su Esegui

Il programma provveder, non solo ad eseguire tutte le operazioni citate, ma, una volta compilato, mander in esecuzione il vostro file presentandovi il risultato a video. Questo file, in ambiente Dos/Windows generalmente ha lo stesso nome del sorgente ma con estensione .exe invece che .c

La variabile
Il concetto di variabile. Pensiamo, ad esempio, a quando salviamo un numero di telefono di un nostro amico sul cellulare; se vogliamo chiamare il nostro amico, baster inserire il suo nome (nome della variabile) ed il cellulare comporr automaticamente il numero di telefono (valore della variabile). Si pu vedere quindi che una variabile esiste in funzione del nome e del suo valore corrispondente; la comodit risiede (come nel cellulare) nel poter usare un nome per valori, che possono essere numeri o lettere, di grande entit o difficili da ricordare. Un altro vantaggio, non da sottovalutare, la possibilit di usare il nome della variabile al posto del suo valore per eseguirvi sopra delle operazioni, con la possibilit, in seguito, di modificare il valore come e quante volte vogliamo. Le variabili vengono definite da un tipo e da un nome.

La variabile
Il nome di una variabile costituito da una o pi lettere, cifre o caratteri e deve iniziare con una lettera o il carattere di sottolineatura (underscore "_" ); la loro lunghezza massima dipende dal compilatore, ma generalmente non si possono superare i 31 caratteri, ed inoltre il C case-sensitive, quindi si fa distinzione tra lettere maiuscole e lettere minuscole. Il tipo della variabile indica quale tipo di valori pu assumere il contenuto della variabile stessa. Si pu ben capire che un tipo intero conterr soltanto dei numeri, mentre il tipo carattere conterr solamente lettere dell'alfabeto, numeri e simboli. Va fatto notare che l'intero '7' estremamente diverso dal carattere '7', infatti l'intero viene trattato come un numero e su di esso si possono svolgere le pi svariate operazioni matematiche, mentre il carattere viene gestito come un simbolo.

La variabile
Tutte le variabili, prima di essere utilizzate, devono essere dichiarate, cio deve essere detto al compilatore il tipo della variabile ed il suo nome (es. int x), questo per permettergli di allocare la memoria necessaria alla variabile stessa; la dichiarazione generalmente viene fatta all'inizio del programma, ma in programmi di grandi dimensioni pu trovarsi anche in altre posizioni (o altri file), ma bisogna ricordare che comunque la dichiarazione di una variabile pu essere fatta una ed una sola volta. Successivamente la variabile deve essere inizializzata, cio le deve essere assegnato un valore, operazione che generalmente viene fatta contemporaneamente alla dichiarazione. // solo dichiarazione int x; // inizializzazione x = 10;

// dichiarazione ed inizializzazione int y = 15;

Tipi di variabile
Tipi di Rappresentazione dichiarazione Char Int Short Long Float Double Carattere Numero intero Numero intero "corto" Numero intero "lungo" Numero reale Numero reale "lungo" N. di byte 1 (8 bit) 2 (16 bit) 2 (16 bit) 4 (32 bit) 4 (32 bit) 8 (64 bit)

Tipi di variabile
Il tipo char adibito a contenere uno ed un solo carattere Per dichiarare ed inizializzare una variabile char, ad esempio inizializzandola con la lettera 'r', basta scrivere: char a = 'r'; Il tipo int contiene numeri, appunto, interi, quelli che in matematica vengono chiamati numeri naturali, e cio senza la virgola e parti frazionate. int x = 7; Attenzione: int y = 3; int z; z = x / y; z vale 2, cio la parte intera della divisione tra 7 e 3

Tipi di variabile
I tipi float e double sono chiamati anche numeri in virgola mobile, cio quelli che in matematica vengono chiamati numeri reali. La differenza tra i due sta solamente nei bit che sono riservati per la loro rappresentazione. float x = 7.0 float y = 2.0 float z; z=x/y // z vale 3.5 short e long sono le due varianti del tipo int anche se in realt un tipo int gi di per s un tipo short.

Gli operatori aritmetici


Operatori aritmetici. Comprendono somma, sottrazione, moltiplicazione, divisione intera, divisione con modulo ecc. Operazioni con gli int Addizione Sottrazione Lavorando con i numeri float o double manca la "divisione con modulo" che non ha ragione di esistere. Moltiplicazione Divisione intera Simbolo + * / Esempio 4 + 27 = 31 76 - 23 = 53 4 * 7 = 28 10 / 3 = 3 (3 il n di volte divisibili senza resto) 11 / 6 = 5 (5 il resto della divisione)

Divisione con modulo

Gli operatori aritmetici


Esistono poi gli operatori di incremento (++) e quello di decremento (--), che possono essere preposti o posposti alla variabile; se sono preposti il valore calcolato prima che l'espressione sia valutata, altrimenti viene calcolato dopo; l'incremento ed il decremento avvengono sempre nel valore di una unit sul valore della variabile. Ad esempio x++ equivale a scivere x = x + 1; int x = 2; int y = 5; int z = 9; int k = 6; printf("%d\ n", x++); // 2, che si incrementer a 3 dopo il printf printf("%d \n", ++y); // 6, si incrementa prima del printf printf("%d \n", z--); // 9, che si decrementer a 8 dopo il printf printf("%d \n", --k); // 5, si decrementa prima del printf

Gli operatori aritmetici


Esiste nel C una forma contratta come mostrata in tabella. Supponiamo di assumere c = 3, d =5, e = 4, f = 6, h = 12 Operatore Espressione Spiegazione += -= *= /= %= c += 7 d -= 4 e *= 5 f /= 3 h %= 9 c=c+7 d=d-4 e=e*5 f=f/3 h=h%9 Assegna 10 alla variabile c 1 alla variabile d 20 alla variabile e 2 alla variabile f 3 alla variabile h

Gli operatori di confronto


Operatori di confronto. Operatori che permettono di verificare determinate condizioni, come ad esempio l'uguaglianza o la disuguaglianza. Simbolo == != < > <= > Significato uguale a diverso da minore maggiore minore o uguale maggiore o uguale Utilizzo a == b a != b a<b a>b a <= b a >= b

Gli operatori logici


Operatori logici. Da utilizzare con le istruzioni condizionali ed iterative. Simbolo && || ! ^^ Significato AND logico OR logico NOT logico XOR logico Utilizzo a && b a || b a!b a ^^ b

Queste operazioni restituiscono necessariamente 1 quando sono vere e 0 quando sono false, quindi facendo "a || b" questa assume valore uno se e solo se "a" o "b" valgono uno, mentre vale zero se entrambi gli operandi valgono zero; analogamente quando si ha "a & b", questa assume valore zero se "a" o "b" valgono zero, uno nel caso entrambi valgano uno.

Priorit degli operatori


Il C valuta le espressioni aritmetiche in una sequenza precisa, generalmente la stessa adottata dallalgebra. o In primo luogo saranno valutate le operazioni di divisione, moltiplicazione e resto che hanno stesso livello di priorit. Se ce ne sono pi di una di seguito allaltra, la valutazione proceder da sinistra a destra. o In seguito saranno valutate le somme e le sottrazioni analogamente al caso precedente. Attenzione alle parentesi! x = (a + b + c)/2 anche nel linguaggio C diverso da x = a + b + c /2

Priorit degli operatori


Esempio 1
Dato y=a*x*x+b*x+c e supponendo che a = 2, b = 3, c = 7 e x = 5, come sar valutato il precedente polinomio?

Passo 1: Passo 2: Passo 3: Passo 4: Passo 5: Passo 6:

y = 2 * 5 * 5 + 3 * 5 + 7 (la moltiplicazione pi a sinistra) y = 10 * 5 + 3 * 5 + 7 (la moltiplicazione pi a sinistra) y = 50 + 3 * 5 + 7 (prima la moltiplicazione delladdizione) y = 50 + 15 + 7 (laddizione pi a sinistra) y = 65 + 7 (lultima addizione) y = 72 (lultima operazione posiziona 72 in y)

Priorit degli operatori


Esempio 2
Dato il polinomio z=p*r%q+w/x-y gli operatori saranno valutati nel seguente ordine.

La moltiplicazione, il resto e la divisione saranno valutati per primi in ordine da sinistra a destra, poich hanno una priorit maggiore delladdizione e della sottrazione. In seguito saranno valutate la somma e la sottrazione anche queste da sinistra a destra.

ATTENZIONE
Non confondere loperatore di uguaglianza == con quello di assegnamento =
Ci che rende questi scambi cos dannosi che essi, solitamente, non provocano degli errori di sintassi e quindi non vengono segnalati dal compilatore. Se vogliamo verificare che la variabile x assuma il valore 0 dovremo scrivere x == 0. Nel caso in cui vogliamo assegnare il valore 0 a suddetta variabile dovr scrivere x = 0.

Operazioni di input output


printf
Per fare questo tipo di operazioni dobbiamo includere il file <stdio.h> che mette a disposizione alcune funzioni predefinite per eseguire la lettura da un dispositivo di input (es. tastiera) o scrittura su un dispositivo di output (es. video). L'istruzione per stampare a video pi usata la printf, che ha il controllo su ci che viene stampato, nel senso che permette di decidere cosa stampare ed in quale forma. Si possono stampare: caratteri ordinari (questi vengono copiati nell'output) specificazioni di conversione (contraddistinte dal carattere percentuale "%" e da un carattere che specifica il formato con il quale stampare le variabili presenti nella lista di argomenti)

Operazioni di input - output


La tabella seguente mostra i possibili formati che possono essere usati per formattare le variabili; tali considerazioni si applicano anche al comando scanf

Operazioni di input - output


E possibile inserire, tra il simbolo % e l'identificativo del formato, una delle seguenti voci: Segno meno (-), esegue la giustificazione a sinistra Un numero intero, specifica l'ampiezza del campo m.d, dove m l'ampiezza del campo e d la precisione del numero; usato generalmente per le stringhe o per un numero di tipo reale ESEMPIO: int x = 10; printf("Il numero %d", x); // l'output a video "Il numero 10" print("%-.2.3f \n", 24.392734); // l'output a video 24.393

Operazioni di input - output


Le sequenze di escape servono per rappresentare quei caratteri "speciali" presenti nella codifica ASCII e che non stampano nulla a video, ma permetto di introdurre ad esempio eventuali spaziature.

Si inseriscono prima di chiudere le virgolette: int x = 10; printf("Il numero %d\n", x); // l'output a video "Il numero 10 e il cursore torna a capo

Operazioni di input output


scanf
La funzione scanf serve per leggere dallo stdin (generalmente la tastiera) una sequenza di caratteri (lettere o cifre) che verranno memorizzate all'interno di opportune variabili. A differenza della printf, per la variabile deve essere preceduta dal simbolo &, perch in realt tra gli argomenti non dobbiamo passare il nome della variabile, ma il suo indirizzo, cosa che pu essere fatta tranquillamente utilizzando un puntatore. E possibile usare gli specificatori di conversione anche per la scanf, che quindi si comporta in modo molto simile a printf.

Operazioni di input output


ESEMPIO: #include <stdio.h> int main() { int i; scanf("%d \n", & i); printf("%d \n", i); }

Questo semplice programma sopra esposto serve solamente per leggere un numero da tastiera e ristamparlo a video.

Operazioni di input output


Una piccola particolarit limitatamente all'uso delle stringhe e degli array con la funzione scanf, la seguente:

char stringa[100]; scanf("%s", stringa);

In questo caso possibile omettere il simbolo & che richiama l'indirizzo del puntatore, ed usare, invece, il nome della variabile, perch il nome di un array corrisponde all'indirizzo di partenza dell'array stesso.

Esempio: Somma fra due numeri


/* Programma di addizione */ #include <stdio.h> int main( ) { int = A; int = B; int = somma; printf(Inserisci il primo numero\n); scanf(%d, &A); printf(Inserisci il secondo numero\n); scanf(%d, &B); somma = A + B; printf(La somma %d\n, somma); return 0; }

Nozioni sulla memoria


Ammettiamo che si voglia fare la somma fra A = 3 e B = 2 (numeri che immettiamo da tastiera), ottenendo banalmente somma = 5. Il computer sistemer i precedenti valori in apposite locazioni di memoria, distruggendo il dato che cera scritto prima, identificate rispettivamente dal nome A, B e somma. Da osservare che queste locazioni non saranno necessariamente adiacenti. N.B. Mentre loperazione di scrittura di un dato in memoria distruttiva, non lo quella di lettura.

Le decisioni
Nella programmazione le istruzioni vengono eseguite dalla prima fino all'ultima. Per deviare il flusso delle scelte (ad esempio per scegliere tra l'opzione A e l'opzione B) basta porre delle condizioni che, se verificate, eseguono un pezzo di codice o altrimenti ne eseguono un altro; queste istruzioni particolari che permettono di incanalare il flusso si chiamano strutture di controllo condizionale e sono:

ifelse

eseguir una certa azione nel caso che una data condizione sia vera, mentre ne eseguir una differente nel caso sia falsa

Le decisioni: ifelse
L'istruzione ifelse ha la seguente sintassi: if (espressione) { istruzione 1 } else { istruzione 2 } ESEMPIO: Se il voto dello studente maggiore o uguale a 60 Visualizza PROMOSSO altrimenti Diagramma di flusso Visualizza BOCCIATO if (voto >= 60) { printf(PROMOSSO\n);} else { printf(BOCCIATO\n);}

Le decisioni: ifelse nidificati


ESEMPIO: if (risultato_esame >=18) { printf ("Complimenti hai superato l'esame");} else { if (risultato_esame >=15) {printf ("Devi sostenere l'orale per questo esame");} else {printf ("Non hai superato l'esame"); } } Generalmente dopo un if o un else viene eseguita solo la prima istruzione pi vicina.

REGOLA: "l'else si riferisce sempre all'if pi vicino, a meno che non sia diversamente specificato da eventuali parentesi graffe"

Le decisioni: ifelse nidificati


La precedente regola pu creare dei problemi quando ci sono due o pi istruzioni da eseguire. Si pu porre rimedio ponendo tutte le istruzioni tra due parentesi graffe. if (risultato_esame >=18) { printf ("Complimenti hai superato l'esame");} else { if (risultato_esame >=15) { printf ("Devi sostenere l'orale per questo esame"); printf (Definire la data dellorale "); } else { printf ("Non hai superato l'esame"); printf (Devi ripetere la prova scritta"); } }

Istruzioni di ciclo
Permettono di risparmiare la quantit di codice scritta rendendo quindi il programma pi leggero e pi facile da comprendere. Le istruzioni di ciclo, come le istruzioni condizionali, hanno bisogno che alcune condizioni vengano verificate affinch il ciclo continui nella sua opera o si interrompa. Le istruzioni di ciclo del C sono tre: : il while, che continua il suo ciclo fino a quando l'espressione associata non risulta falsa il do-while, che agisce come il while, ma assicura l'esecuzione delle istruzioni associate almeno una volta il for, che il costrutto pi usato, versatile e potente tra i tre

Istruzioni di ciclo: dowhile


Molto simile al while il do-while che ha la seguente struttura: do { istruzione/i; } while (condizione); Questo comando controlla la condizione di continuazione del ciclo dopo che stato eseguito il corpo dello stesso. Di conseguenza le istruzioni allinterno del corpo saranno eseguite almeno una volta. Nel corpo del dowhile non saranno necessarie le parentesi graffe se listruzione da eseguire solo una.

Diagramma di flusso

Istruzioni di ciclo: dowhile


Esempio: visualizzare i numeri da 1 a 10
/* Visualizzare i numeri da 1 a 10 utilizzando il comando dowhile */ #include <stdio.h> int main( ) { int contatore = 1; /* inizializza la variabile chiamata contatore */ do { printf(% d , contatore); /* visualizza contatore */ } while (++contatore <= 10); /* incrementa di 1 contatore fino al valore 10 e riesegui il ciclo; fine del comando */ return 0; }

Apparir sullo schermo:

1 2 3 4 5 6 7 8 9 10

Potrebbero piacerti anche