Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Programmazione in C (Programmazione 1), Sintesi del corso di Programmazione C

Riassunto degli argomenti di Programmazione 1 del corso di laurea in Informatica

Tipologia: Sintesi del corso

2017/2018

In vendita dal 13/04/2018

giovanna-de-notaris
giovanna-de-notaris 🇮🇹

4.5

(2)

2 documenti

1 / 6

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Fondamenti del C
I programmi C richiedono pochissimo codice di contorno, per questo possono essere lunghi anche solo poche
righe, per esempio il programma pun.c:
#include <stdio.h>
int main (void)
{
printf (“To C or not to C: this is the question.\n”);
return 0
}
La linea #include <stdio.h> è necessaria per includere le informazioni riguardanti la libreria standard di I/O
(input/output) del C. Il codice eseguibile si trova all’interno della sezione main che rappresenta la parte
principale del programma. La printf è la funzione della libreria standard I/O adatta a produrre dell’output
opportunamente formattato. Il codice \n serve per avvertire la printf di avanzare alla linea successiva dopo la
stampa del messaggio. L’istruzione return 0; indica che il programma, quando termina, restituisce il valore 0
al sistema operativo.
Per convertire il programma in una forma che il compilatore possa eseguire bisogna che passi attraverso tre
fasi:
1. Preprocessamento, dove il programma viene prima dato in pasto ad un preprocessore, il quale
obbedisce ai comandi che iniziano con #, conosciuti come direttive. Un preprocessore è simile ad un
editor, può aggiungere parti al programma ed introdurre delle modifiche.
2. Compilazione, il programma modificato va ad un compilatore che lo traduce in istruzione macchina
(object code)
3. Linking, il linker combina il codice oggetto prodotto dal compilatore con del codice addizionale
necessario per rendere il programma eseguibile.
Per compilare e fare il linking del programma pun.c si deve immettere il seguente comando in un terminale:
cc pun.c
Dopo aver compilato ed eseguito il linking, per default cc rilascia il programma eseguibile in un file
chiamato a.out. Il linker cc ha molte opzioni, una di queste, l’opzione -o, ci permette di scegliere il nome del
file contenete il programma eseguibile. Per esempio, se vogliamo una versione eseguibile del programma
pun.c allora immetteremo il comando:
cc -o pun pun.c
I programmi C più semplici hanno la forma:
direttive
int main(void)
{
istruzioni
}
Dove le parentesi graffe indicano l’inizio e la fine del main. Prima che un programma C venga modificato da
un preprocessore, i comandi indirizzati a quest’ultimo vengono chiamati direttive. Per esempio:
1 | Pag.
pf3
pf4
pf5

Anteprima parziale del testo

Scarica Programmazione in C (Programmazione 1) e più Sintesi del corso in PDF di Programmazione C solo su Docsity!

Fondamenti del C

I programmi C richiedono pochissimo codice di contorno, per questo possono essere lunghi anche solo poche righe, per esempio il programma pun.c :

#include <stdio.h>

int main (void)

{

printf (“To C or not to C: this is the question.\n”);

return 0

}

La linea #include <stdio.h> è necessaria per includere le informazioni riguardanti la libreria standard di I/O (input/output) del C. Il codice eseguibile si trova all’interno della sezione main che rappresenta la parte principale del programma. La printf è la funzione della libreria standard I/O adatta a produrre dell’output opportunamente formattato. Il codice \n serve per avvertire la printf di avanzare alla linea successiva dopo la stampa del messaggio. L’istruzione return 0 ; indica che il programma, quando termina, restituisce il valore 0 al sistema operativo.

Per convertire il programma in una forma che il compilatore possa eseguire bisogna che passi attraverso tre fasi:

  1. Preprocessamento, dove il programma viene prima dato in pasto ad un preprocessore, il quale obbedisce ai comandi che iniziano con # , conosciuti come direttive. Un preprocessore è simile ad un editor, può aggiungere parti al programma ed introdurre delle modifiche.
  2. Compilazione, il programma modificato va ad un compilatore che lo traduce in istruzione macchina (object code)
  3. Linking, il linker combina il codice oggetto prodotto dal compilatore con del codice addizionale necessario per rendere il programma eseguibile.

Per compilare e fare il linking del programma pun.c si deve immettere il seguente comando in un terminale:

cc pun.c

Dopo aver compilato ed eseguito il linking, per default cc rilascia il programma eseguibile in un file chiamato a.out. Il linker cc ha molte opzioni, una di queste, l’opzione -o , ci permette di scegliere il nome del file contenete il programma eseguibile. Per esempio, se vogliamo una versione eseguibile del programma pun.c allora immetteremo il comando:

cc -o pun pun.c

I programmi C più semplici hanno la forma:

direttive

int main(void)

{

istruzioni

}

Dove le parentesi graffe indicano l’inizio e la fine del main. Prima che un programma C venga modificato da un preprocessore, i comandi indirizzati a quest’ultimo vengono chiamati direttive. Per esempio:

#include <stdio.h>

Questa direttiva indica che le informazioni contenute in <stdio.h> devono essere incluse nel programma prima che venga compilato. L’header <stdio.h> contiene informazioni riguardanti la libreria standard di I/O del C. Le direttive iniziano sempre con il carattere # che le distingue dagli altri oggetti presenti in un programma C. Per default le direttive sono lunghe una sola riga e non vi è nessun punto e virgola alla loro fine.

Le funzioni sono blocchi per mezzo dei quali i programmi vengono costruiti. Infatti, un programma C non è altro che una collezione di funzioni, le quali si dividono in due categorie: quelle scritte dal programmatore e le funzioni di libreria, cioè quelle fornite insieme al compilatore. Il termine funzione deriva dalla matematica dove una funzione è una regola per calcolare un valore a partire da uno o più argomenti dati. Il C invece utilizza il termine funzione in modo meno restrittivo. In C una funzione è semplicemente un raggruppamento di una serie di istruzioni al quale è stato assegnato un nome. Alcune funzioni calcolano un valore, altre no. Una funzione che calcola un valore utilizza l’istruzione return per specificar il valore che deve restituire. Sebbene un programma C possa essere composto da molte funzioni, solo la funzione main è obbligatoria. Il main è una funzione che restituisce un codice di stato che viene passato al sistema operativo quando il programma termina. Per esempio nel programma pun.c , la parola int, che si trova immediatamente prima della funzione main , indica che la funzione restituisce un valore intero, mentre la parola void indica che main non ha argomenti. L’istruzione return 0 ; ha due effetti: causa la fine del main ed indica che restituisce il valore 0. Il programma termina ugualmente se non c’è nessuna istruzione return alla fine del main , tuttavia in quel caso molti compilatori produrranno un messaggio di warning.

Un’istruzione è un comando che viene eseguito quando il programma è in funzione, il termine dell’istruzione è indicato del punto e virgola.

In C all’interno dei programmi si possono inserire dei commenti. Il simbolo /* indica l’inizio di un commento e il simbolo */ ne indica la fine.

/* Questo è un commento */

I commenti possono apparire ovunque in un programma, sia su righe separate che sulla stessa riga sul quale si trova altro testo appartenente al programma. Una volta che il compilatore legge il simbolo /* , ignora tutto il resto finché non incontra il simbolo */. Dimenticare di chiudere un commento può far sì che il compilatore ignori parte del programma.

In C i dati vengo memorizzati in variabili. Ogni variabile deve avere un tipo che specifichi la tipologia di dati che dovrà contenere. Una variabile di tipo int (abbreviazione di integer), può memorizzare un numero intero, tuttavia l’intervallo dei possibili valori è limitato. Una variabile di tipo float (abbreviazione di floating- point), può memorizzare numeri più grandi rispetto ad una variabile int , ed inoltre può memorizzare numeri con cifre dopo la virgola, ma i calcoli svolti su questo tipo di variabili sono più lenti ed il valore della variabile è di solito un’approssimazione del numero memorizzato in essa.

Le variabili devono essere dichiarate, cioè descritte, prima di poter essere utilizzate. Per dichiarare una variabile bisogna prima specificarne il tipo e poi il nome. Per esempio

int height;

afferma che height è una variabile di tipo int, indicando in questo modo che può memorizzare un numero intero. Se diverse variabili sono dello stesso tipo, le loro dichiarazioni possono essere combinate. Per il compilatore una dichiarazione completa termina con il punto e virgola.

Si può conferire un valore ad una variabile tramite un assegnamento. Per esempio l’istruzione height=8; assegna il valore 8 ad height, il numero 8 è chiamato costante. Prima che ad una variabile possa essere assegnato un valore, deve essere dichiarata.

Alcune delle variabili vengono automaticamente impostate a zero quando un programma inizia l’esecuzione. Una variabile che non ha un valore di default e alla quale il programma non ha ancora assegnato un valore è

  • d , stampa gli interi nella forma decimale. Il valore p indica il numero minimo di cifre da stampare, se p viene omesso si assume che abbia valore 1.
  • e , stampa un numero a virgola mobile nel formato esponenziale. Il valore p indica quante cifre devono apparire dopo il separatore decimale, per default sono 6. Se p è 0, il punto decimale non viene stampato.
  • f , stampa un valore a virgola mobile nel formato a virgola fissa senza esponente. Il valore di p ha lo stesso significato che per e.
  • g , stampa un valore a virgola mobile sia nel formato esponenziale che in quello decimale a seconda della dimensione del numero. Il valore di p specifica il numero di cifre significative che devono essere visualizzate. Questo specificatore è utile per visualizzare numeri la cui dimensione non può essere predetta durante la scrittura del programma.

Sequenze di escape

Il codice \n è chiamato sequenza di escape. Le sequenze di escape permettono alle stringhe di contenere dei caratteri che altrimenti causerebbero dei problemi al compilatore, inclusi i caratteri non stampabili e i caratteri che hanno un significato speciale per il compilatore.

Quando queste sequenze di escape appaiono nelle stringhe di formato della printf, rappresentano un’azione che deve essere eseguita durante la stampa. Su molti computer stampare \a provoca un beep udibile, stampare \b fa in modo che il cursore si muova indietro di una posizione, \n fa avanzare il cursore all’inizio della riga successiva, \t sposta il cursore al punto di tabulazione successivo. Alcune sequenze di escape rappresentano dei caratteri, come \” che rappresenta il carattere e \ che rappresenta __.

La funzione scanf

Così come la funzione printf stampa l’output secondo uno specifico formato, la scanf legge l’input secondo un particolare formato, e come la printf può contenere sia caratteri ordinari che specifiche di conversione. La scanf è controllata da una stringa di formato, quando viene chiamata inizia ad elaborare le informazioni presenti nella stringa partendo dalla sinistra. La scanf , quindi legge l’oggetto fermandosi non appena incontra un carattere che non può appartenere all’oggetto stesso. Se l’oggetto è stato letto con successo la scanf prosegue elaborando il resto della stringa di formato. Se un qualsiasi oggetto non viene letto con successo la scanf termina immediatamente senza esaminare la parte rimanente della stringa di formato. Quando la scanf cerca l’inizio di un numero ignora i caratteri che rappresentano degli spazi vuoti, di conseguenza i numeri

possono essere messi sia su una singola riga che sparsi su righe diverse. Quando le viene chiesto di leggere un intero, la scanf per prima cosa va alla ricerca di una cifra, di un segno più o di un segno meno. Successivamente legge le cifre fino a quando non incontra un carattere che non corrisponde a una cifra. Quando le viene chiesto di leggere un numero a virgola mobile, la scanf va alla ricerca di un opzionale segno più o meno, seguito da una serie di cifre contenenti un opzionale punto decimale, seguita da un opzionale esponente.

Caratteri ordinari nelle stringhe di formato

Quando una stringa di formato incontra uno o più caratteri di spaziatura consecutivi, la scanf legge consecutivamente tali caratteri dall’input fino a quando non raggiunge un carattere non appartenente alla spaziatura, il numero di caratteri di spaziatura nella stringa di formato è irrilevante.

Quando in una stringa di formato la scanf incontra un carattere non corrispondente a spaziatura, lo confronta con il successivo carattere di input. Se i due combaciano, la scanf scarta il carattere di input e continua l’elaborazione della stringa. Se invece i due caratteri non combaciano, la scanf rimette il carattere diverso nell’input e poi si interrompe senza elaborare ulteriormente la stringa di formato o leggere altri caratteri di input.

Sebbene la scanf e la printf siano molto simili, ci sono delle differenze significative tra le due funzioni. Ignorare queste differenze può essere rischioso per la salute del programma. Uno degli errori più comuni è quello di mettere il simbolo & davanti alle variabili in una chiamata alla printf.

Operatori aritmetici

Unario Binario Binario Additivo Moltiplicativo

  • più unario + somma * moltiplicazione
  • meno unario - sottrazione / divisione % resto

L’operatore % è l’operatore resto, il valore i % j è il resto che si ottiene dividendo i per j. Gli operatori della tabella, ad eccezione di %, ammettono sia operandi interi che a virgola mobile, inoltre è ammesso persino mischiare i tipi. Quando operandi float vengono mischiati, il risultato sarà float.

Gli operatori / e % necessitano un’attenzione particolare. Quando entrambi gli operandi sono interi, l’operatore / tronca il risultato omettendo la parte frazionaria. L’operatore % richiede operandi interi, se anche solo uno degli operandi non è un intero, allora il programma non verrà compilato. Utilizzare lo 0 come operando destro di uno dei due operatori / e % provoca un comportamento non definito.

Precedenza degli operatori e associatività

Come regola generale, il C ammette in tutte le espressioni l’utilizzo di parentesi per effettuare dei raggruppamenti. Il C utilizza delle regole di precedenza degli operatori per risolvere delle potenziali ambiguità. Gli operatori aritmetici utilizzano il seguente ordine di precedenza.

Precedenza più alta + unario -

  • % / Precedenza più bassa + binario