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


Elementi di Linguaggio C, Appunti di Elementi di Informatica

Dispensa appunti su linguaggio C di programmazione elementi di informatica

Tipologia: Appunti

2023/2024

Caricato il 03/11/2025

leonardo-barelli
leonardo-barelli 🇮🇹

3 documenti

1 / 76

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
LINGUAGGIO C
1) Creazione: sviluppato da Dennis Ritchie nei Bell Labs nel 1972
2) Caratteristiche: linguaggio di basso livello con elevata portabilità
3) Applicazioni: utilizzato per sistemi operativi e sistemi embedded
Efficienza e performance:
- Velocità superiore: esecuzione rapida del codice
- Controllo hardware: accesso diretto alle risorse del sistema
- Gestione memoria: utilizzo di malloc() e free() per ottimizzazione
Portabilità:
- Windows: compatibile con sistemi Microsoft
- MacOS: eseguibile con sistemi Apple
- Linux: funzionamento su distribuzioni open-source
- Mobile: adattabilità a sistemi Android e iOS
Memoria: accesso diretto allo spazio di memoria
Processore: interazione con i registri della CPU
Dispositivi: comunicazione con periferiche hardware
C linguaggio fondamentale
C ++ estensione orientata agli oggetti
Java sintassi basata su C
Python implementazione in C (CPython)
APPLICAZIONI
Sistemi Operativi Database Giochi
Linux e Windows kernel MySQL e PostgreSQL sono Motori di gioco
utilizzano C utilizzano C scritti in C
per prestazioni ottimali
Il C è un linguaggio compilato: questo vuol dire che, una volta scritto il file sorgente (o
i files sorgenti), occorre che questo venga passato al compilatore C assieme al nome
del file in cui si desidera ottenere il programma eseguibile.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45
pf46
pf47
pf48
pf49
pf4a
pf4b
pf4c

Anteprima parziale del testo

Scarica Elementi di Linguaggio C e più Appunti in PDF di Elementi di Informatica solo su Docsity!

LINGUAGGIO C

  1. Creazione: sviluppato da Dennis Ritchie nei Bell Labs nel 1972
  2. Caratteristiche: linguaggio di basso livello con elevata portabilità
  3. Applicazioni: utilizzato per sistemi operativi e sistemi embedded Efficienza e performance:
  • Velocità superiore: esecuzione rapida del codice
  • Controllo hardware: accesso diretto alle risorse del sistema
  • Gestione memoria: utilizzo di malloc() e free() per ottimizzazione Portabilità:
  • Windows: compatibile con sistemi Microsoft
  • MacOS: eseguibile con sistemi Apple
  • Linux: funzionamento su distribuzioni open-source
  • Mobile: adattabilità a sistemi Android e iOS Memoria: accesso diretto allo spazio di memoria Processore: interazione con i registri della CPU Dispositivi: comunicazione con periferiche hardware C  linguaggio fondamentale C ++  estensione orientata agli oggetti Java  sintassi basata su C Python  implementazione in C (CPython) APPLICAZIONI Sistemi Operativi Database Giochi Linux e Windows kernel MySQL e PostgreSQL sono Motori di gioco utilizzano C utilizzano C scritti in C per prestazioni ottimali Il C è un linguaggio compilato: questo vuol dire che, una volta scritto il file sorgente (o i files sorgenti), occorre che questo venga passato al compilatore C assieme al nome del file in cui si desidera ottenere il programma eseguibile.

Una caratteristica fondamentale del C-Language è la sua portabilità, ossia la possibilità di adattare il software scritto per un certo tipo di computer a un tipo differente. Il C è un linguaggio strutturato. I linguaggi moderni tendono ad essere strutturati per renderne più semplice la scrittura e manutenzione. Il mattone con cui si costruiscono i programmi in C è la funzione. Tramite le funzioni è possibile scomporre il programma in blocchi più piccoli, ottenendo dei programmi modulari. L’uso di sottoprogrammi consente di scrivere il codice del sottoprogramma stesso in modo che gli eventi che occorrono al loro interno non provochino alcun effetto collaterale su altre parti del programma. Una volta creata e testata una funzione, la si potrà utilizzare in contesti differenti da quello in cui è stata creata con la certezza che fornendole i dati necessari effettuerà il suo compito senza effetti indesiderati sul resto del programma. La creazione di funzioni e quindi di moduli è fondamentale nella realizzazione di programmi di grandi dimensioni con magari un numero elevato di programmatori. Cosa serve per programmare in C?

  • un editor di testo (Notepad++, Sublime Text 3, …)
  • un compilatore (porting gratuito di GCC o TCC o MinGW)
  • un linker
  • numeri: 0, 1, 2, ..., 9
  • simboli speciali: + - * / = ^ <> ( ) [ ] {}. , : ; ’! @ $ % E’ pratica comune nel C usare le minuscole per i nomi delle variabili e delle funzioni/sottoprogrammi e le maiuscole per le costanti simboliche Dichiarazioni e identificatori I nomi degli identificatori delle variabili, comunemente chiamati nomi delle variabili, possono essere formati dai seguenti caratteri:
  • lettere: a,...,z, A,...,Z
  • cifre: 0,1,...,
  • underscore: _ Non devono comunque iniziare con una cifra, e non devono contenere più di 32 caratteri. È comunque opportuno verificare quale sia il maggior numero di caratteri significativi per gli identificatori supportato dal compilatore che si intende usare. Il linguaggio C è case-sensitive, per cui le lettere maiuscole e minuscole sono considerate come caratteri distinti. Bisogna prestare attenzione a non usare identificatori simili con differenze solo di maiuscole e minuscole, in quanto ciò può portare a confusione e ad errori di programmazione. In un programma in C-Language, una variabile prima di poter essere usata deve essere dichiarata associando al nome di un identificatore gli attributi necessari a predisporre lo spazio di memoria e le istruzioni necessarie per l'utilizzo del dato da parte del compilatore. I nomi degli identificatori non possono corrispondere a nessuna delle parole chiave utilizzate dal compilatore. Lo stesso carattere minuscolo e maiuscolo rappresenta identificatori diversi. C fa distinzione tra maiuscole e minuscole, cioè NON è vero che PLUTO = PlUtO = PLUto = pLUTO = pluto I nomi relativi a costanti, tipi di variabili, variabili e funzioni, devono essere costituiti da una lettera seguita da una qualunque combinazione di lettere, cifre o sottolineature (cioè un nome corrisponde ad una stringa di caratteri). Dichiarazioni e identificatori errati int 3RD: inizia con un numero int D2 lunghezza: c'è uno spazio bianco (blank) int raggio%: c'è un carattere speciale Tipi di dati La dichiarazione dei dati, e quindi la dichiarazione del loro tipo, consente di conoscere:
  • l’insieme dei valori ammissibili
  • l’insieme delle operazioni applicabili
  • la quantità di memoria necessaria
  • gli eventuali errori d’uso I tipi di dati del C-Language si possono dividere in due classi principali:
  • tipi fondamentali
  • tipi derivati o strutturati Tipi fondamentali char short, short int, unsigned int, int, long, long int float, double, long double, void enum C naming convention Short Variables: i,n,c,etc... (Only one letter. If one letter isn't clear, then make it a Local Variable) Local Variables: camelCase

Tipo: char Più raramente vengono impiegati per la rappresentazione di piccoli interi con o senza segno Il tipo char per default è equivalente a “signed char”. In molti compilatori esiste un'opzione per mezzo della quale si può cambiare il default a “unsigned char”. In ogni caso il tipo può essere specificato come: [ signed | unsigned ] char Solamente con char, il tipo risulta essere con o senza segno compatibilmente con l'opzione specificata durante la compilazione. Nel caso che il tipo venga specificato come signed char o unsigned char, questo prevale sul default assunto durante la compilazione. Normalmente i valori ammessi sono: -128..0..127 per signed char e 0..255 per unsigned char Occupano generalmente 2 o 4 byte a secondo dell'implementazione del compilatore e dell'architettura del sistema (16 o 32 bit). Rappresentazione tipica per numeri interi con o senza segno Si possono impiegare i termini “short” o “long” per forzare l'intero alla minima o massima dimensione ammessa. Possono essere utilizzate le parole chiave “signed” e “unsigned” per specificare se il tipo sia dotato o no di segno. Per default i numeri interi sono con segno. Sintassi ammessa: [ signed | unsigned ] int [ signed | unsigned ] short [ int ] [ signed | unsigned ] long [ int ] In ogni caso il compilatore deve garantire la relazione: sizeof(short) <= sizeof(int) <= sizeof(long) Operazioni built-in per dati di tipo int = Assegnamento di un valore int a una variabile int

  • Somma (tra int ha come risultato un int)
  • Sottrazione (tra int ha come risultato un int)
  • Moltiplicazione (tra int ha come risultato un int) / Divisione con troncamento della parte non intera (risultato int) % Resto della divisione intera

Operazioni built-in per dati di tipo int == Relazione di uguaglianza != Relazione di diversità < Relazione “minore di”

Relazione “maggiore di” <= Relazione “minore o uguale a” = Relazione “maggiore o uguale a” Tipo: float e double Generalmente, i float occupano 4 byte di memoria, mentre i double ne occupano 8. Il loro impiego è per la rappresentazione di numeri reali in singola precisione (float) o in doppia precisione (double). Molti compilatori supportano anche il tipo long double per la rappresentazione di un numero reale in quadrupla precisione. Due diverse rappresentazioni:

  • la normale rappresentazione decimale, o in virgola fissa
  • la rappresentazione in virgola mobile (floating point) con mantissa ed esponente (della base 10), separate dal carattere “E” Rappresentazione decimale, o in virgola fissa la normale rappresentazione decimale, o in virgola fissa: 3.14, 1234.543328, 543., 0. La rappresentazione in virgola mobile (floating point) con mantissa ed esponente (della base 10), separate dal carattere “E”. 1780000.0000023 può essere rappresentato in virgola mobile nei modi seguenti: 178000.00000023E1 / 17800000000023E-7 / 1.7800000000023E+ Le notazioni sono interscambiabili e la macchina provvede automaticamente alle necessarie conversioni. Spazio allocato (float) ≤ spazio allocato (double) ≤ spazio allocato (long double) Operazioni built-in per dati di tipo float e double = Assegnamento di un valore int a una variabile int
  • Somma (tra int ha come risultato un int)
  • Sottrazione (tra int ha come risultato un int)
  • Moltiplicazione (tra int ha come risultato un int)

int main() { ... }: la funzione principale di ogni programma C. L'esecuzione inizia sempre da qui. printf("Hello, World!\n"); : istruzione che stampa il testo tra virgolette. \n rappresenta un'interruzione di riga. return 0; : indica che il programma è terminato correttamente. Restituisce zero al sistema operativo. Struttura del Programma Sorgente C Un programma sorgente C è formato da uno o più blocchi chiamati funzioni. La definizione di una funzione rappresenta la specificazione delle operazioni che dovranno essere svolte all'atto della esecuzione. Un Programma C deve contenere nell’ordine:

  • una parte contenente le direttive per il compilatore
  • l’identificativo main
  • due parti racchiuse da {}
  • una parte dichiarativa (divisa in due sezioni): dichiarazione delle costanti e dichiarazione delle variabili
  • una parte esecutiva

L'intestazione definisce le regole di interfaccia. Il corpo specifica le operazioni da eseguire ed è formata da un insieme di istruzioni delimitato utilizzando le parentesi graffe { corpo } Da notare la parentesi graffa aperta "{" per l'inizio del corpo della funzione e la parentesi graffa chiusa "}" per la fine del corpo della funzione Dichiarazione delle variabili Lo scopo della dichiarazione di variabili è di conoscere le variabili utilizzate nella parte esecutiva e di attribuire a ciascuna di esse un tipo di dato. Per tipo di dato si intende un insieme di valori e un insieme di operazioni che ad esse possono essere applicate. La dichiarazione delle variabili ha la seguente forma: specificatore_tipo elenco_identificatori_variabili;

  • int a;
  • int b,c;
  • float x,y;
  • double z;
  • char carattere, simbolo;

La libreria descritta dall’header file <stdio.h> è predefinita Linkate al programma durante la compilazione  Il contenuto della libreria viene copiato dentro l’eseguibile finale.

  • Vantaggi:
  • Non servono file esterni per eseguire il programma.
  • Maggiore portabilità.
  • Svantaggi:
  • L’eseguibile è più grande.
  • Se la libreria cambia, bisogna ricompilare tutto. Linkate al programma a runtime (durante l’esecuzione)  Il programma carica la libreria solo quando ne ha bisogno.
  • Vantaggi:
  • L’eseguibile è più leggero.
  • Più programmi possono usare la stessa libreria (meno uso di memoria).
  • Aggiornare la libreria non richiede la ricompilazione dei programmi che la usano.
  • Svantaggi:
  • Il programma dipende da file esterni.
  • Se la libreria non è presente o compatibile, il programma può non funzionare. Utilizzo pratico e vantaggi delle librerie Riduzione della duplicazione: scrivi il codice una sola volta e riutilizzalo ovunque. Migliore organizzazione: struttura modulare per codice più leggibile e gestibile. Facilità di aggiornamento: le modifiche si riflettono automaticamente in tutti i programmi. Collaborazione facilitata: condivisione efficiente dei componenti tra sviluppatori. Standard C library Il linguaggio C consente di definire funzioni aggiuntive raggruppabili eventualmente in librerie Esiste in particolare una libreria standard (standard library) di funzioni.

Input / Output Per rendere disponibili queste funzioni di input e di output, occorre inserire nelle dichiarazioni globali del programma, la direttiva di precompilazione: #include <stdio.h

printf è il nome di una funzione il cui codice è già scritto ed inserito nella standard C library "stdio.h". Questa libreria viene inclusa durante la fase di compilazione del programma attraverso la direttiva del preprocessore #include <stdio.h> La libreria standard <stdio.h> è necessaria alla gestione dei flussi di:

  • standard input
  • standard output
  • standard error

Commenti I commenti sono utilizzati per fornire al programmatore descrizioni informali del programma

  • Non vengono eseguiti dalla macchina
  • Facilitano la comprensione del programmatore
  • Possono trovarsi su una o più righe e sono delimitati da /* e */
  • Possono essere inseriti sia in testa al programma (per dare una descrizione complessiva della sua funzionalità) sia vicino a particolari parti di codice Le parole chiave Il linguaggio C, come qualsiasi altro linguaggio di programmazione, consente la realizzazione di programmi adoperando un insieme di "parole chiave" (keywords). Le 32 parole chiave del linguaggio C: break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while Espressioni Il C è un linguaggio basato su espressioni. Una espressione è una notazione che determina un valore mediante un processo di valutazione. Una espressione può essere semplice o composta (tramite aggregazione di altre espressioni). Espressioni che coinvolgono elementi eterogenei in tipo Un’espressione aritmetica come x + y è caratterizzata dal valore e dal tipo del risultato. Il tipo degli operandi condiziona l’operazione che deve essere eseguita. A operandi di tipo int si applica l’operazione di somma propria di tale tipo. Diversa è l’operazione di somma che si applica a operandi di tipo float ecc. Se x è di tipo short e y di tipo int è necessario convertire una delle due variabili per rendere omogenea l’espressione e applicare la corretta operazione: x viene temporaneamente convertita in int e la somma tra interi restituisce un risultato intero. Cast di una variabile In linguaggio C, il cast di una variabile (o type casting) è un'operazione che serve per convertire il tipo di una variabile in un altro tipo. Il cast viene usato quando:
  • Vuoi forzare una conversione di tipo.
  • Vuoi evitare warning del compilatore.

typedef enum {Giovanni, Claudia, Carla, Simone, Serafino} persone; typedef enum {gen, feb, mar, apr, mag, giu, lug, ago, set, ott, nov, dic} mese; stdio.h (libreria standard di I/O) La libreria standard #include <stdio.h> consente di effettuare operazioni di lettura/scrittura su dispositivi logici e fisici, come files, linee seriali, e periferiche in genere. Le periferiche su cui è possibile effettuare I/O sono dipendenti dal sistema operativo in uso. La funzione scanf è uno strumento fondamentale nel linguaggio C. scanf è una funzione di input che consente di acquisire una sequenza di caratteri (lettere o cifre) dalla tastiera I dati vengono memorizzati in variabili specifiche. Questo permette un'interazione dinamica con l'utente. Dichiarazione: include la libreria stdio.h per utilizzare scanf Struttura: scanf("formato", &variabile); Operatore &: fornisce l'indirizzo di memoria della variabile Scanf: questa funzione legge dallo Standard input stdin e mette l'input negli indirizzi delle variabili specificate nella lista di argomenti. La funzione scanf richiede di specificare l'indirizzo di ogni variabile, oppure un puntatore ad essa. int iyz; scanf("%d", &iyz); E' anche possibile associare solamente il nome di un array o di una stringa a scanf, poiché questo corrisponde all'indirizzo di partenza dell'array/stringa: char string[80]; scanf("%s", string);

La funzione scanf leggerà i caratteri fino a che non incontra uno spazio, un newline o un indicatore di fine file. Quindi non si può usare scanf per leggere una stringa contenente spazi. non deve contenere messaggi! scanf("inserire un int: %d", &x) Inserire spazi o altri caratteri nella stringa di formato di scanf() è possibile, ma ha il significato di richiedere che tali caratteri siano obbligatoriamente presenti in input: se mancano allora scanf() dà errore. Questa caratteristica può essere sfruttata per leggere dati formattati in modo particolare, come ad esempio una data (gg/mm/aa) scanf("%d/%d/%d", &gg, &mm, &aa); In tal modo, scanf() filtra automaticamente i dati, eliminando le barre e “catturando” gli interi che interessano. #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; int n = 0; for(i=0; i<10; i++) { scanf ("%d",&n); if(n == 0) break; printf ("%d\n", n+n); } system ("PAUSE"); return 0; } La funzione printf in C L'output è essenziale per visualizzare i risultati. La funzione printf, serve per visualizzare sullo standard output una stringa costruita in base ad un formato specificato. La funzione printf rappresenta lo strumento principale per mostrare informazioni all'utente.