[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 MS-DOS

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

 

#include <stdio.h> // Header incluso nella libreria kernel32.lib

 

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.

 

 

La funzione main()

 

Tutte le istruzioni partono dalla funzione main().

 

#include <stdio.h>

 

int main() {

    /* comandi */

    return 0;

}

 

return 0 indica che la funzione si è svolta senza problemi.

 

 

Inserire commento

  

Per inserire un commento ci sono due modi:

 

// A riga singola

  

/*

    A

    riga

    multipla

*/

 

Esempio:

 

#include <stdio.h>

 

int main() {

    // Questa è una applicazione

    return 0;

}

 

 

Definire una variabile

 

Nella maggior parte dei linguaggi di programmazione, come nel C, è neccessario 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:

 

#include <stdio.h>

 

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):

 

#include <stdio.h>

 

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:

 

#include <stdio.h>

 

int main() {

    int a = 5;

    int b = 10;

 

    return 0;

}

 

short si usa per definire variabili contenenti un numero intero abbastanza corto, non deve superare 2 byte. Esempio:

 

#include <stdio.h>

 

int main() {

    short a = 20;

 

    return 0;

}

 

long si usa per definire variabili contenenti un numero intero abbastanza lungo, ma non deve superare 4 byte. Esempio:

 

#include <stdio.h>

 

int main() {

    long a = 329;

 

    return 0;

}

 

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

 

#include <stdio.h>  

 

int main() {

    float a = 55.00000f; // La virgola è quella americana, 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:

 

#include <stdio.h>

#include <stdlib.h>

 

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 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 byte 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.

 

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 su Code::Blocks)
\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. E' necessario per delimitare la fine di una stringa.
\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 per il fatto che il codice può essere compilato (in questo caso) in un S.O. Windows.

 

 

Espandere variabili in printf()

 

#include <stdio.h>

#include <stdlib.h>

 

int main() {

    char var[] = "Ciao nonno!";

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

 

    system("pause>nul");

    return 0;

}

 

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

 

%c = char;

%s = char[] (o string in C++);

%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 espanderne infinite variabili, basta elencarle poi in ordine. Esempio:

 

#include <stdio.h>

#include <stdlib.h>

 

int main() {

    char var1[] = "Ciao";

    char var2[] = "pippo";

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

    system("pause>nul");

    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).

 

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>

#include <stdlib.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]);

 

    system("PAUSE > NUL");

    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.

 

#include <stdio.h>

#include <stdlib.h>

 

int main() {

    printf("Hello World!\n");

    system("PAUSE > NUL");

    return 0;

}

 

#define dichiara costanti (non è necessario dare a loro un valore).

 

#include <stdio.h>

#include <stdlib.h>

#define PI 3.141593f

 

int main() {

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

    system("PAUSE > NUL");

    return 0;

 }

 

#undef elimina costanti definite.

 

#include <stdio.h>

#include <stdlib.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);

    system("PAUSE > NUL");

    return 0;

}

 

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

 

#ifdef x vuol dire "se è dichiarata la costante x allora" ed è uguale a scrivere #if defined(x), mentre #ifndef x vuol dire "se non è dichiarata la costante 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, vedremo in seguito come svuotare il buffer in modo standard.

 

Passa alla lezione 2 --->