Sei sulla pagina 1di 12

qwertyuiopasdfghjklzxcvbnmqwerty

uiopasdfghjklzxcvbnmqwertyuiopasd
fghjklzxcvbnmqwertyuiopasdfghjklzx
cvbnmqwertyuiopasdfghjklzxcvbnmq
C – La Guida
wertyuiopasdfghjklzxcvbnmqwertyui
Costanti,Variabili,Operatori,Parole Chiave.

opasdfghjklzxcvbnmqwertyuiopasdfg
03/08/2007

T4n|n0 Ru|3z

hjklzxcvbnmqwertyuiopasdfghjklzxc
vbnmqwertyuiopasdfghjklzxcvbnmq
wertyuiopasdfghjklzxcvbnmqwertyui
opasdfghjklzxcvbnmqwertyuiopasdfg
hjklzxcvbnmqwertyuiopasdfghjklzxc
vbnmqwertyuiopasdfghjklzxcvbnmq
wertyuiopasdfghjklzxcvbnmqwertyui
opasdfghjklzxcvbnmqwertyuiopasdfg
hjklzxcvbnmrtyuiopasdfghjklzxcvbn
mqwertyuiopasdfghjklzxcvbnmqwert
yuiopasdfghjklzxcvbnmqwertyuiopas
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

Note dell’autore

Questa guida è completamente gratuita e tratterà la programmazione C. L’autore non ha nulla in contrario
alla divulgazione o modifica della suddetta a patto che siano lasciati i riferimenti e i copyright di autore e
web site. Ho scritto questa guida per pura passione verso la programmazione e l’informatica in generale.
Ho preso spunto dalle slide del mio corso di C. Per qualsiasi domanda,dubbio,precisazione o correzione
potete contattarmi tramite il mio web site www.allf0ryou.altervista.org . Buona lettura.

Paradigmi di Programmazione

Il C è un linguaggio ibrido tra paradigma funzionale ed imperativo. Prevalentemente predilige le istruzioni


ma non disdegna le funzioni.

• Paradigma Funzionale
o Programma = ( insieme di ) funzioni
o Scheme,Lisp,ML…
• Paradigma Imperativo
o Programma = sequenza di istruzioni
o Pascal,C,Java..
o
Quindi,la domanda sorge spontanea… quando è utile utilizzare una funzione ? Quando un problema ha una
repricabilità.

Introduzione al C
Breve Storia del C

Linguaggio general purpose che fu progettato da Dennis Ritchie ( Bell laboratories ) nel 1972 su elaboratore
PDP11. Inizialmente era utilizzato per la programmazione del sistema operativo UNIX mentre in
seguito,dagli anni 80 in poi,fu utilizzato anche nelle scuole e nelle università per la didattica ( C tradizionale
). Alla fine degli anni 80,nacque l’ANSI C o C standard che supera alcuni limiti del C tradizionale. Col
tempo,la standardizzazione ha reso il C indipendente dal processore ( hardware ). Esistevano infatti alcune
sottili differenze tra le diverse implementazioni del C. Questo portava a problemi di incompatibilità e fu
creato un comitato che doveva dare una definizione non ambigua e indipendente dalla macchina. Fu
creato ne 1989 uno standard,che fu aggiornato nel 1999. Dunque,perché ANSI C ( d’ora in poi solo C ) ??
La risposta è semplice,rispetto ad altri linguaggi ( come il pascal ) il C ha meno parole chiave ma è più
potente per la presenza di strutture di controllo e tipi di dati più adeguati. Non dimentichiamoci che è un
linguaggio nativo di UNIX,che come tutti sappiamo è un sistema operativo interattivo molto utilizzato su
server,mainframe e workstation. Ha operatori che consentono di accedere alla macchina a livelli di bit,e che
sono in grado in modo pulito,elengante e compatto di realizzare operazioni complesse. Molti programmi
per la gestione di base di dati e per applicazioni grafiche sono scritti in C e soprattutto,è modulare ed è alla
base di C++ e Java.

Il linguaggio C,pur ponendosi al di sopra dei linguaggi orientati alla macchina,rimane un passo al di sotto
della maggior parte dei linguaggi orientati ai problemi. E’ sufficientemente vicino al computer per
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

consentire un grande controllo dei dettagli dell'implementazione di un'applicazione ma se ne distacca


sufficientemente per consentire di ignorare i dettagli dell'hardware. Questo è il motivo per cui il C è
considerato un linguaggio sia di alto che di basso livello.

I punti di forza del C

• Dimensioni compatte
poche regole sintattiche ed è possibile scrivere un compilatore C che opera con solo 256KB di
memoria.
• Ridotto numero di comandi
non include molte delle funzioni normalmente definite all'interno di altri linguaggi (funzioni di input
e output interne, particolari operatori aritmetici o funzioni per la gestione delle stringhe), ma è
dotato di un ricco insieme di funzioni di libreria.
• Velocità
elevata efficienza del codice C prodotto dalla maggior parte dei compilatori.
• Scarsi vincoli di tipo
a differenza del Pascal, che è un linguaggio fortemente orientato ai tipi, la gestione dei tipi di dati
del linguaggio C è molto poco vincolante.
• Un linguaggio strutturato
include tutte le strutture di controllo possedute da un linguaggio moderno.
• Supporto della programmazione modulare
compilazione e link separati.
• Facile interfacciabilità con routine scritte in linguaggio Assembler
• Manipolazione dei bit
include un numeroso gruppo di operatori per la manipolazione dei bit.
• Variabili puntatore
offre non solo la possibilità di implementare i puntatori ma anche quella di eseguire operazioni
aritmetiche su di essi.
• Strutture flessibili
tutti gli array sono monodimensionali. Tutte le elaborazioni multidimensionali sono costruite
a partire da combinazioni di array monodimensionali.
• Uso efficiente della memoria
la mancanza di funzioni interne evita al programma di includere il supporto per funzioni non
utilizzate da una determinata applicazione.
• Trasportabilità
è possibile convertire con facilità un programma che funziona su un computer o su un sistema
operativo in modo da poterlo utilizzare su un altro computer o un altro sistema operativo.
• Librerie di funzioni
sono disponibili numerose librerie di funzioni per tutti i più diffusi compilatori C.
• Mancanza di rigore nella gestione dei tipi
per esempio è possibile assegnare un intero a una variabile di tipo carattere o viceversa. Questo
significa che la corretta gestione delle variabili è a carico del programmatore.
• Mancanza di verifiche al momento dell'esecuzione
ad esempio il sistema runtime non avviserà se l'applicazione fa accessi oltre i limiti di un array.
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

Un semplice programma in C
1 /* Stampa una riga di testo ver. 1*/
2 #include <stdio.h>
3 int main(void)
4{
5 printf("Welcome to C!\n");
6 return 0;
7}

Commentiamo il programma
• Il testo racchiuso tra /* e */ è ignorato dal
• compilatore
• In blu le parole chiave
• #include <stdio.h>Sono direttive per il preprocessore: carica il contenuto di un certo file <stdio.h>
che consente operazioni di input/output
• int main(void) I programmi C contengono uno o più funzioni, esattamente una di queste deve essere
main. La parentesi è usata per indicare una funzione
• int significa che il main “restituisce” un valore intero
• void significa che il main non prende input
• Le parentesi graffe { } indicano un blocco. I corpi di tutte le funzioni devono essere contenuti in
parentesi graffe.
• printf("Welcome to C!\n"); La funzione printf() è inclusa nella libreria stdio.h e istruisce il computer
ad eseguire la stampa della stringa di caratteri all’interno delle virgolette. L’intera linea è detta una
istruzione (statement). Tutte le istruzioni devono terminare con un punto e virgola.
• \ Carattere di escape (fuga) e toglie l’usuale significato al carattere che lo segue
• \n è una sequenza di escape, ed indica il carattere di newline
• return 0: Un modo di uscire da una funzione in questo caso, significa che il programma termina
normalmente
• } Parentesi graffe chiuse indica che la fine del main è stata raggiunta

L’output del programma è : “Welcome to C! “

Lo stesso programma,può essere scritto anche su una riga o due o tre,il con non conosce differenze di
spaziature
/* Stampa una riga di testo ver. 1.1 */
#include <stdio.h> int main(void)
{printf("Welcome to C!\n");return 0;}

L’uotput sarà sempre Welcome to C! .

E’ buona norma di programmazione inserire commenti quando si scrive un programma, indentare ( far
rientrare ) il corpo della funzione di un livello e mettere una sola istruzione per linea. Queste non sono
regole da rispettare ma solo suggerimenti per scrivere un programma chiaro e leggibile.
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

Le parole Chiave

Alcune parole sono dette parole chiave e non possono essere utilizzati dai programmatori come nomi di
variabili. Rispetto ad altri linguaggi,il C possiede un numero ridotto di parole chiave,come mostra la tabella
seguente.

Alcune sequenze di escape


esc
• \n Newline (nuova linea). Posiziona il cursore all’inizio
all della riga
successiva
• \t Tabulazione orizzontale. Posiziona il cursore alla tabulazione
successiva
• \r Ritorno carrello. Posiziona il cursore all’inizio
all della riga corrente
• \a Allarme. Fa suonare il cicalino del sistema
• \\ Backslash. Visualizza un carattere backslash in una istruzione
printf
• \’ Apice singolo. Visualizza un carattere apice singolo in una
istruzione printf
• \” Virgolette. Visualizza un carattere virgolette in una istruzione
printf
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

Uso di Printf
/* Stampa a video il valore di una variabile*/
#include <stdio.h>
int main(void)
{
int i; /* dichiarazione */
i = 3; /* inizializzazione */
printf(”Il valore della variabile è %d\n”, i); /* stampa */
return 0;
}

• int i: Dichiarazione di variabile


• Variabile: locazione in memoria dove un valore può essere memorizzato
• Il valore della variabile è 3
• int significa che la variabile può avere i valori interi (-1, 3, 0, 47)
• i - nome di variabile (identificatore)
• Identificatori: consistono di lettere, numeri (non possono iniziare con un numero), e underscore (_),
sono case sensitive, max 31 caratteri in ANSI C
• Le dichiarazioni appaiono prima degli statement eseguibili, altrimenti si ha un errore di sintassi (di
compilazione)
• printf(”Il valore della variabile è %d\n”, i); Questa printf prende due argomenti (separati da virgola)
Nel primo argomento appare la specifica di formattazione: %d indica che dovrà essere stampato un
valore di tipo intero decimale, quindi indica il tipo della variabile che segue. Nel secondo appare il
nome della variabile

Alcuni esempi sulla Printf


/*Stampa una riga di testo vers. 2 */
#include <stdio.h>
int main()
{
printf("Welcome to C!\n");
return 0;
}

Questo programma da come output Welcome to C!


C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

/* Stampa una riga di testo vers. 3*/


#include <stdio.h>
main()
{
printf(“ Welcome to C!\n");
return 0;
}

Questo programma da come output : Welcome to C!

Come notate,l’output è spostato verso destra.

/* Stampa una riga di testo vers. 4*/


#include <stdio.h>
int main(void)
{
printf("Welcome ");
printf("to C!\n");
return 0;
}

L’output sarà : Welcome to C !

/* Stampa tre righe di testo vers. 1*/


#include <stdio.h>
main()
{
printf("Welcome \nto \nC!\n" );
return 0;
}

Con output : Welcome


To
C!

Dichiarazioni, Espressioni e Assegnamento

• Oggetti manipolati da un programma


– Costanti
• Interi (tipicamente [-231, 231-1]), Reali (floating point), Stringhe
– Variabili (devono essere dichiarate prima di essere utilizzate)
• Nome (identificatore: No parole chiave)
• Tipo
• Valore
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

• Utilità della dichiarazione di variabili


– Definizione dello spazio di memoria da parte del compilatore
– Scelta delle istruzioni macchina appropriate per l’esecuzione

• Espressione
– Combinazione di costanti, variabili, operatori e chiamate a funzione
• tot=n1+n2;
• user=GetLine();
• tot=GetInteger()+1;
• Assegnamento
– Operatore di Assegnamento =
• Associatività: da destra a sinistra
– tot=138;
– tot=n1+n2;
Variabili e Memoria
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

La funzione Scanf

/* Prendere in input un valore


e stamparlo a video */
#include <stdio.h>
int main(void)
{
int i; /* dichiarazione */
printf(”Inserisci un intero:"); /* prompt */
scanf(”%d”, &i); /* legge un intero */
printf(”\nIl valore inserito è %d\n”, i); /*stampa */
return 0;
}

Inserisci un intero:-33
Il valore inserito è -33

• scanf("%d", &i); Ottiene un valore dall’utente


• scanf usa l’input standard (di solito la tastiera) Questa scanf ha due argomenti
• %d - la specifica di conversione indica che il dato dovrebbe essere un intero decimale,
• &i - indica la locazione in memoria per memorizzare la variabile
• & (ampersand) può confondere all’inizio - per ora ricordate solo di inserirlo con il nome della variabile nel
comando scanf
• L’utente risponde a scanf digitando il numero, quindi premendo il tasto enter (return)
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

/* lettura e scrittura di variabili */


#include <stdio.h>
int main(void)
{
int i, j, sum;
i = 3;
printf(”Inserisci un intero:");
scanf(”%d”, &j);
sum = i + j;
printf(”\ni = %d\tj = %d\tsomma = %d\n”, i, j, sum);
j = i;
sum = i +j;
printf(”i = %d\tj = %d\tsomma = %d\n”, i, j, sum);
return 0;
}
Inserisci un intero: -5
i=3 j=-5 somma=-2
i=3 j=3 somma=6

Memoria : Lettura e Scrittura

• La lettura delle variabili non cambia il loro valore


• La scrittura è distruttiva: Ogni volta che un valore è sistemato in una locazione di memoria esso si
sostituisce al valore contenuto in precedenza in quella locazione

Operatori e Precedenza

• Operatori
– Caratteri speciali a cui è assegnato un particolare significato:
• + addizione
• - sottrazione
• * moltiplicazione
• / divisione
• % modulo (a%b equivale al resto di a/b)
• Operatori di Incremento e Decremento: ++ e - -
++i e i++ equivalgono a i=i+1
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

/* Prova operatori ++ e -- : Il risultato è corretto? */


#include <stdio.h>
int main(void)
{
int a, b, c, d, e=0;
a=++e;
b=e++;
c=--e;
d=e--;
printf(“a=%d\tb=%d\tc=%d\td=%d\te=%d\n”, a, b, c, d, e);
return 0;
}
a=1 b=1 c=1 d=1 e=1

L’uotput non è corretto,in quanto e = 0 … provate per credere ;) La differenza tra ++e ed e++ è la seguente :
• ++e = prima “ incrementa e “ e poi lo assegna alla variabile
• E++ = prima assegna il valore alla variabile e poi lo incrementa

• Operatori di Assegnamento = += -= *= /= %= >>= <<= &= ^= |=


• variable op = expression → variable = variable op (expression)
• Esempio
– j*=k+3 → j=j*(k+3)
– d -= 4 (d = d - 4)
– e *= 5 (e = e * 5)
– f /= 3 (f = f / 3)
– g %= 9 (g = g % 9)
• Precedenze (priorità) e Associatività
– Alcuni operatori aritmetici agiscono prima di altri (es. La moltiplicazione prima dell’addizione
• Esempio: Trova la media delle tre variabili a, b e c
– NO: a + b + c / 3
– SI: (a + b + c ) / 3
C – La Guida
Costanti,Variabili,Operatori,Parole Chiave.
T4n|n0 Ru|3z

La seconda parte termina qui. Nel prossimo capitolo parleremo di librerie e Operatori Relazionali. Alla
prossima allora, saluti da T4n|n0 Ru|3z.
www.allf0ryou.altervista.org