[C] Lezione 1

In questa lezione vedremo:

- come si struttura un programma in C;

- le funzioni principali di output e input;

- come si dichiara una variabile;

- cos'è un vettore (array) e una matrice e come si dichiarano;

- le direttive.

 

Creare applicazioni Console

Per creare applicazioni Console l'header principale è stdio.h, che contiene le funzioni printf(), scanf()getchar() ecc... quindi aggiungere questa stringa:

 

#include <stdio.h>

 

All'inizio di ogni vostro programma dovete inserire questa stringa. Per includere una libreria invece andare (con Code::Blocks) su Project > Build options... > Linker settings. Per adesso menziono solo kernel32. In generale, comunque, le librerie necessarie per eseguire le funzioni standard del C non necessitano di essere specificate nella compilazione del programma.

 

 

La funzione main()

 

Tutte le istruzioni partono dalla funzione main().

 

int main() {

    /* comandi */

    return 0;

}

 

con return 0 si vuole indicare che la funzione si è svolta senza problemi.

 

 

Inserire commento

  

Per inserire un commento ci sono due modi:

 

// A riga singola

 

/*

    A

    riga

    multipla

*/ 

 

Definire una variabile

 

Nella maggior parte dei linguaggi di programmazione, come nel C, è necessario dichiarare una variabile oltre a definirla. Ci sono diversi comandi in base al contenuto della variabile.

 

char si usa per definire variabili contenenti uno ed un solo carattere. Esempio:

 

int main() {

    char a = 'w'; // Mi raccomando: ci vanno gli apici singoli!

 

    char b = 25; // Può essere assegnato anche un valore numerico

 

    return 0;

}

 

Ma si può usare per definire variabili contenenti stringhe, basta che si mettano le parentesi quadre dopo il nome della variabile, come ad indicare un array (vedremo che nel C++ c'è il tipo string):

 

int main() {

    char a[] = "Ciao!"; // Qui invece ci vanno gli apici doppi

 

    return 0;

}

 

Se la definizione è successiva è necessario scrivere nelle quadre il numero di caratteri che contiene la stringa (in questo caso sarebbero 5).

 

int si usa per definire variabili contenenti un numero intero. Esempio:

 

int main() {

    int a = 5;

    int b = 10;

 

    return 0;

}

 

short si usa per definire variabili contenenti un numero intero abbastanza corto, di solito di 2 byte. Esempio:

 

int main() {

    short a = 20;

 

    return 0;

}

 

long si usa per definire variabili contenenti un numero intero abbastanza lungo, di solito di 4 byte. Esempio:

 

int main() {

    long a = 329;

 

    return 0;

}

 

float si usa per definire variabili contenenti un numero a virgola mobile (con circa 7 cifre di precisione). Esempio:

 

int main() {

    float a = 55.00000f; // La virgola è quella anglosassone, cioè il .

 

    return 0;

}

 

f indica un numero a virgola mobile di tipo float.

 

double è simile a float, ma può raggiungere una precisione doppia (in genere 15 cifre). Esempio:

 

int main() {

    double a = 234.483017495736;

 

    return 0;

}

 

Non è obbligatorio specificare tutte le cifre di precisione ovviamente.

 

 

Ecco i simboli delle operazioni principali in C:

 

+ : addizione

- : sottrazione

* : moltiplicazione

/ : divisione

% : resto (di una divisione)

= : assegnazione

 

 

La funzione printf()

 

printf() stampa su schermo una stringa. Esempio:

 

#include <stdio.h> // Quest'header include la funzione printf()

 

int main() {

    printf("Ciao Pluto!\n\n");

    return 0;

}

 

\n serve per andare a capo, questo è un carattere di escape. Per espandere una variabile:

 

#include <stdio.h>

  

int main() {

    int var = 5;

    printf("var e' uguale a %d\n\n", var);

    return 0;

}

 

%d è il tipo di variabile. Vedremo specificamente come stampare su schermo altri tipi di variabili.

 

Tabelle riassuntive:

 

I tipi di variabili

Tipo Dimensione (byte) Valori
char 1 Da -128 (Ç) a 127 ()
short 2 Da -32768 a 32767
short int 2 Da -32768 a 32767
int 4 Da -2147483648 a 2147483647
long 4 Da -2147483648 a 2147483647
long int 4 Da -2147483648 a 2147483647
long long 8 Da -9223372036854775808 a 9223372036854775807
float 4 Da 1.17549e-038 a 3.40282e+038 con precisione di 7 cifre
double 8 Da 2.22507e-308 a 1.79769e+308 con precisione di 15 cifre
long double 12 o 16 Da 3.3621e-4932 a 1.18973e+4932 con precisione di 18 cifre

 

Prima di specificare i tipi short, int e long è possibile specificare unsigned, così la variabile può contenere un numero solo positivo, cioè senza segno -, occupando tutti i bit per i numeri positivi. Ad esempio unsigned short può avere un valore da 0 a 65535, mentre unsigned int e unsigned long possono avere un valore da 0 a 4294967295.

 

NB: In realtà le reali dimensioni dei vari tipi di variabili dipendono dalla macchina utilizzata, a parte per il tipo char.

 

Caratteri di Escape

Carattere Descrizione
\a Dà un segnale acustico, ovvero un BIP.
\b Va indietro di un carattere.
\f Salta la pagina (non funziona in tutti gli IDE)
\n Va a capo.
\r Ritorna all'inizio della riga.
\t Esegue una tabulazione.
\' Scrive il carattere '.
\" Scrive il carattere ".
\\ Scrive il carattere \.
%% Scrive il carattere % (questo non è un carattere di escape).
\0 Carattere vuoto: è necessario per delimitare la fine di una stringa. Viene inserito in modo automatico alla fine di una stringa quando è specificata con le virgolette doppie. Va inoltre ricordata la presenza di questo carattere quando si conteggia il numero di elementi di un array di caratteri.
\xNN Utilissimo per scrivere caratteri di formato ASCII. NN è il codice ASCII in esadecimale (esempio: \x4A). In alternativa, si può scrivere il numero in formato decimale senza scrivere x (esempio: \074).

 

Codici ASCII

Nella sezione Download troverai un file con tutti i codici ASCII.

  

La funzione system()

 

Serve per eseguire un comando del sistema operativo, se è Windows esegue un comando DOS. La funzione è inclusa nell'header stdlib.h. Esempio:

 

#include <stdio.h>

#include <stdlib.h> // quest'header include il comando system()

 

int main() {

    printf("Programmazzo.\n\nPremi un tasto per uscire...");

    system("pause>nul");

 

    return 0;

}

 

Questa funzione può essere utile ma non è consigliata poiché non è portabile (ovvero non funziona in un ambiente non-Windows).

 

 

Espandere variabili in printf()

 

#include <stdio.h>

 

int main() {

    char var[] = "Ciao nonno!";

    printf("%s\n", var);

 

    return 0;

}

 

%s specifica il tipo della variabile (o della costante). Ecco un elenco dei tipi di variabili:

 

%c = char;

%s = char[];

%u = unsigned short, unsigned int o unsigned long;

%i = short, int o long;

%d = short o int decimali;

%ld = long decimale;

%oshort o int ottali;

%lo = long ottale;

%xshort o int esadecimali;

%lx = long esadecimale;

%f = float;

%lf = double;

%e = rende il numero in notazione scientifica o in "standard form" (esempio: 5000 = 5e+003, ovvero, 5 * 10 ^ 3).

 

var invece è la variabile, sostituisce %s con il valore della variabile var. E' possibile espandere infinite variabili, basta elencarle poi in ordine. Esempio:

 

#include <stdio.h>

 

int main() {

    char var1[] = "Ciao";

    char var2[] = "pippo";

    printf("%s %s!\n", var1, var2);

    return 0;

}

 

L'output sarà:

 

Ciao pippo!

 

 

Vettori e matrici

 

I vettori (chiamati anche array) sono un insieme ordinato di valori. Le matrici non sono altro che dei vettori a due dimensioni (ovvero vettori di vettori). In C++ il termine "array" è preferito perché "vettore" si può riferire a una particolare classe della libreria standard.

 

int vet[5]; // Vettore con 5 valori (da 0 a 4)

int mat[5][5]; // Matrice 5x5 (da 0 a 4)

 

Si possono creare anche vettori a 3, 4, o più dimensioni, dipende da cosa si vuol fare. Ora un esempio con vettori e matrici:

 

#include <stdio.h>

 

int main() {

    // I valori vanno messi fra parentesi graffe { }

    int vet[3] = {0, 5, 9};

   

    int mat[2][4] = { {0, 2, 4, 6}, {8, 1, 3, 5} };

    // Significa "un array che contiene due array che contengono ognuno 4 elementi".

 

    printf("Vettore vet:\n\n%d %d %d\n\n\nMatrice mat:\n\n%d %d %d %d\n%d %d %d %d", vet[0], vet[1], vet[2], mat[0][0], mat[0][1], mat[0][2], mat[0][3], mat[1][0], mat[1][1], mat[1][2], mat[1][3]);

 

    return 0;

}

 

Output:

 

Vettore vet:

 

0 5 9

 

 

Matrice mat:

 

0 2 4 6

8 1 3 5

 

Quando vedremo i cicli i vettori e le matrici diventeranno più utili.

 

 

Le direttive

 

Le direttive sono istruzioni che vengono eseguite durante la compilazione e non durante l'esecuzione, e hanno sempre # prima. #include è una direttiva.

 

#include include nel programma un header (o file d'intestazione).

 

#include <stdio.h>

 

int main() {

    printf("Hello World!\n");

    return 0;

}

 

#define dichiara macro. Può essere un valore numerico o letterale, ma non è necessario dare loro un valore.

 

#include <stdio.h>

#define PI 3.141593f

 

int main() {

    printf("Pi greco vale %f\n",PI);

    return 0;

 }

 

#undef elimina macro.

 

#include <stdio.h>

#define CONST 0

  

int main() {

    printf("CONST vale %d\n\n",CONST);

    #undef CONST

    #define CONST 1

    printf("CONST vale %d\n\n",CONST);

    return 0;

}

 

#if, #elif, #else, ed #endif creano condizioni (#endif chiude la condizione).

 

#ifdef x vuol dire "se è dichiarata la macro x allora" ed è uguale a scrivere #if defined(x), mentre #ifndef x vuol dire "se non è dichiarata la macro x allora" ed è uguale a scrivere #if !defined(x).

 

 

La funzione scanf()

 

Serve per ottenere un input dall'utente. Questa funzione è inclusa nell'header stdio.h.

 

#include <stdio.h>

 

int main() {

    int var;

    scanf("Inserisci un numero intero: %d\n", &var);

    printf("Hai inserito %d!", var);

 

    return 0;

 

}

 

Semplice, no? Questo è l'output:

 

Inserisci un numero intero: 6

Hai inserito 6!

 

Le scritte in blu sono gli input da tastiera. Notare anche che è necessario premere Invio se si usa scanf().

 

 

Le funzioni getchar()

 

Come si può immaginare, "prende" un carattere. Questa funzione è dichiarata in stdio.h. Esempio:

 

#include <stdio.h>

 

int main() {

    char var;

    printf("Inserisci un carattere: ");

    var = getchar();

    printf("Hai inserito %c!", var);

 

    return 0;

 

}

 

Output:

 

Inserisci un carattere: a

Hai inserito a!

 

Se si inserisce più di un carattere, copia i caratteri rimanenti nel buffer. Ciò significa che la volta dopo che abbiamo un getchar() "prenderà" il secondo carattere che abbiamo scritto, e così via. Esempio:

 

#include <stdio.h>

 

int main() {

    char var[2];

    printf("Inserisci due caratteri: ");

    var[0] = getchar();

    var[1] = getchar();

    printf("Hai inserito %c e %c!", var[0], var[1]);

 

    return 0;

 

}

 

Output:

 

Inserisci due caratteri: ab

Hai inserito a e b!

 

Quando sapremo fare le condizioni e i cicli vi spiegherò come si fa a sapere quando il buffer è vuoto.

 

 

Funzione gets()

 

Con scanf() le stringhe non possono contenere spazi. gets() è più consigliato per le stringhe. Esempio:

 

#include <stdio.h>

 

int main() {

    char stringa[2][256];

    printf("Inserisci una stringa con degli spazi: ");

    scanf("%s", &stringa[0]);

    fflush(stdin);

 

    printf("Inseriscine un\'altra sempre con gli spazi: ");

    gets(stringa[1]);

 

    printf("scanf = %s\n\gets = %s", stringa[0], stringa[1]);

 

    return 0;

}

 

Output:

 

Inserisci una stringa con degli spazi: Sono bello

Inseriscine un'altra sempre con gli spazi: Sono bello

scanf = Sono

gets = Sono bello

 

Abbiamo usato fflush() per svuotare il buffer. Se non l'avessimo usato, gets() avrebbe preso la stringa bello, dato che scanf() aveva considerato solo la stringa Sono.

 

Inserisci una stringa con degli spazi: Sono bello

Inseriscine un'altra sempre con gli spazi: scanf = Sono

gets = bello

 

Attenzione! L'istruzione fflush(stdin) non è portabile, poiché è undefined behaviour. Questo significa che il risultato è dipendente dal compilatore in uso o dal sistema operativo. Vedremo in seguito come svuotare il buffer in modo standard.

 

Passa alla lezione 2 --->