Introduzione al C
Storia, struttura di un programma, compilazione e il tuo primo codice.
Cos'è il C?
Il C è un linguaggio di programmazione compilato, imperativo e procedurale creato da Dennis Ritchie nei Bell Laboratories tra il 1969 e il 1973. Nasce per riscrivere il sistema operativo Unix.
Il C++ è una sua estensione creata da Bjarne Stroustrup nel 1979, che aggiunge la programmazione orientata agli oggetti (OOP), i template e molte funzionalità moderne.
⚡ Velocità
Il codice C/C++ è compilato direttamente in istruzioni macchina: è tra i linguaggi più veloci esistenti.
🔩 Basso livello
Accesso diretto alla memoria, controllo totale delle risorse hardware.
🌍 Portabilità
Lo stesso codice può girare su Linux, Windows, macOS con minimi adattamenti.
📦 Ubiquità
Usato in sistemi operativi, kernel, game engine, compilatori, firmware e embedded.
Struttura di un Programma C
Ogni programma C ha una struttura minima che devi conoscere a memoria:
/* Questo è un commento su una riga o più righe */
// Questo è un commento su una riga (stile C++)
#include <stdio.h> // Libreria standard I/O
// La funzione main() è il punto di ingresso del programma
int main() {
// Istruzione: stampa una riga a schermo
printf("Hello, World!\n");
// return 0 indica che il programma è terminato correttamente
return 0;
}
Hello, World!
Analisi riga per riga
| Elemento | Significato |
|---|---|
| #include <stdio.h> | Include la libreria standard per input/output (printf, scanf, ecc.) |
| int main() | Punto di ingresso del programma. Restituisce un int al sistema operativo. |
| printf("...") | Stampa testo sul terminale. Il \n è il carattere di nuova riga. |
| return 0 | Valore restituito al SO: 0 = successo, qualsiasi altro valore = errore. |
;. Dimenticarlo è uno degli errori più comuni per i principianti.
Compilazione ed Esecuzione
Il C non è interpretato: devi compilarlo per ottenere un eseguibile. Il compilatore più usato è GCC (GNU Compiler Collection).
Compilare con GCC
# Compila hello.c e crea l'eseguibile "hello"
gcc hello.c -o hello
# Esegui il programma
./hello
# Con opzioni utili (warning + standard C17)
gcc -Wall -Wextra -std=c17 hello.c -o hello
# Per C++
g++ -Wall -std=c++17 hello.cpp -o hello
Il processo di compilazione
1. Preprocessore
Sostituisce le direttive #include, #define, ecc.
2. Compilatore
Trasforma il codice C in assembly (.s).
3. Assembler
Converte l'assembly in codice oggetto (.o).
4. Linker
Unisce i file oggetto e le librerie nel file eseguibile finale.
Input e Output di Base
#include <stdio.h>
int main() {
int eta;
char nome[50];
printf("Come ti chiami? ");
scanf("%s", nome); // legge una stringa (senza spazi)
printf("Quanti anni hai? ");
scanf("%d", &eta); // legge un intero (&eta = indirizzo)
printf("Ciao %s, hai %d anni!\n", nome, eta);
return 0;
}
Come ti chiami? Mario Quanti anni hai? 25 Ciao Mario, hai 25 anni!
Specificatori di formato
| Specificatore | Tipo | Esempio |
|---|---|---|
| %d | Intero (int) | printf("%d", 42) |
| %f | Decimale (float/double) | printf("%.2f", 3.14) |
| %c | Carattere (char) | printf("%c", 'A') |
| %s | Stringa (char[]) | printf("%s", "hello") |
| %ld | Long int | printf("%ld", 123456789L) |
| %lf | Double (in scanf) | scanf("%lf", &x) |
scanf, le variabili numeriche richiedono il simbolo & davanti (l'operatore "indirizzo di"). Le stringhe (char[]) no, perché il nome dell'array è già un puntatore.
Direttive del Preprocessore
#include <stdio.h>
#include <math.h> // Funzioni matematiche: sqrt, pow, sin, cos...
// Costanti definite con #define (NON sono variabili, non usano memoria)
#define PI 3.14159265
#define MAX_STUDENTI 30
#define QUADRATO(x) ((x) * (x)) // Macro con parametro
int main() {
double raggio = 5.0;
double area = PI * QUADRATO(raggio);
printf("Area del cerchio: %.4f\n", area);
printf("Max studenti: %d\n", MAX_STUDENTI);
return 0;
}
Area del cerchio: 78.5398 Max studenti: 30
const a #define per le costanti numeriche in C++ (sono tipizzate e più sicure). In C puro, #define è ancora lo standard per le costanti.
Scrivi un programma che chieda all'utente di inserire il suo nome e cognome (separati) e stampi: "Benvenuto, [Nome] [Cognome]! Il tuo programma funziona."
#include <stdio.h>
int main() {
char nome[50], cognome[50];
printf("Inserisci il nome: ");
scanf("%s", nome);
printf("Inserisci il cognome: ");
scanf("%s", cognome);
printf("Benvenuto, %s %s! Il tuo programma funziona.\n", nome, cognome);
return 0;
}
Scrivi un programma che chieda base e altezza di un rettangolo e stampi l'area e il perimetro con 2 decimali.
#include <stdio.h>
int main() {
double base, altezza;
printf("Inserisci la base: ");
scanf("%lf", &base);
printf("Inserisci l'altezza: ");
scanf("%lf", &altezza);
double area = base * altezza;
double perimetro = 2 * (base + altezza);
printf("Area: %.2f\n", area);
printf("Perimetro: %.2f\n", perimetro);
return 0;
}
Crea un programma che converta una temperatura da Celsius a Fahrenheit e Kelvin. Formula: F = C × 9/5 + 32, K = C + 273.15. Stampa tutti e tre i valori con 2 decimali.
#include <stdio.h>
int main() {
double celsius;
printf("Temperatura in Celsius: ");
scanf("%lf", &celsius);
double fahrenheit = celsius * (9.0 / 5.0) + 32.0;
double kelvin = celsius + 273.15;
printf("Celsius: %.2f °C\n", celsius);
printf("Fahrenheit: %.2f °F\n", fahrenheit);
printf("Kelvin: %.2f K\n", kelvin);
return 0;
}
Chiedi all'utente: nome, età, altezza (in metri), peso (in kg). Calcola il BMI (peso / altezza²) e stampa tutte le informazioni in una scheda formattata con linee di separazione.
#include <stdio.h>
int main() {
char nome[50];
int eta;
double altezza, peso;
printf("Nome: "); scanf("%s", nome);
printf("Età: "); scanf("%d", &eta);
printf("Altezza(m): "); scanf("%lf", &altezza);
printf("Peso(kg): "); scanf("%lf", &peso);
double bmi = peso / (altezza * altezza);
printf("\n================================\n");
printf(" SCHEDA PERSONALE\n");
printf("================================\n");
printf(" Nome: %s\n", nome);
printf(" Età: %d anni\n", eta);
printf(" Altezza: %.2f m\n", altezza);
printf(" Peso: %.1f kg\n", peso);
printf(" BMI: %.1f\n", bmi);
printf("================================\n");
return 0;
}
Scrivi un programma che definisca con #define le costanti IVA (0.22) e SCONTO (0.10). Il programma legge il prezzo netto di un prodotto, calcola e stampa: prezzo scontato, IVA sul prezzo scontato, prezzo finale. Scrivi anche una macro MAX(a, b) e usala per trovare il prezzo più alto tra due prodotti.
#include <stdio.h>
#define IVA 0.22
#define SCONTO 0.10
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int main() {
double prezzo1, prezzo2;
printf("Prezzo netto prodotto 1: ");
scanf("%lf", &prezzo1);
printf("Prezzo netto prodotto 2: ");
scanf("%lf", &prezzo2);
// Prodotto 1
double scontato1 = prezzo1 * (1.0 - SCONTO);
double iva1 = scontato1 * IVA;
double finale1 = scontato1 + iva1;
// Prodotto 2
double scontato2 = prezzo2 * (1.0 - SCONTO);
double iva2 = scontato2 * IVA;
double finale2 = scontato2 + iva2;
printf("\n--- Prodotto 1 ---\n");
printf("Prezzo scontato: %.2f\n", scontato1);
printf("IVA (22%%): %.2f\n", iva1);
printf("Prezzo finale: %.2f\n", finale1);
printf("\n--- Prodotto 2 ---\n");
printf("Prezzo scontato: %.2f\n", scontato2);
printf("IVA (22%%): %.2f\n", iva2);
printf("Prezzo finale: %.2f\n", finale2);
printf("\nProdotto più costoso (finale): %.2f\n", MAX(finale1, finale2));
return 0;
}