[C++]Guida teorica

parte 4

« Older   Newer »
 
  Share  
.
  1. n1md4
     
    .

    User deleted


    I tipi di dati e gli operatori

    I Tipi di dati offerti dal linguaggio C++
    Ok, sarà un pò noioso, ma alla fine se non avrete letto le lezioni di teoria introduttiva, non capirete nulla dei programmi. Vi limiterete a copiare il codice e a farlo funzionare, magari cambiando il nome dell'autore nel vostro?? Brutta cosa :/
    Invece, con una conoscenza basilare del linguaggio, potrete modificare i programmi a vostro piacimento e crearne di vostri. Detto ciò fate come vi pare. Io inizio..
    C++ definisce vari tipi di dati che vanno dai numeri interi (6), ai valori cosiddetti "booleani" (Vero o Falso), ai caratteri ('D'), ai numeri in virgola mobile (6.54), alle stringhe ("Ciao io sono paolo."), e così via...
    Esistono 7 tipi standard:

    Tipo Significato
    char Caratteri
    wchar_t Caratteri estesi
    int Numeri interi
    float Numeri in virgola mobile
    double Numeri in virgola mobile a precisione doppia
    bool Valori booleani
    void Non-valori



    Inoltre il linguaggio C++ consente di impiegare vari "modificatori" dei tipi base detti sopra. Un "modificatore" altera il significato del tipo base e lo rende più adatto alla situazione del programma. I modificatori sono:

    signed
    unsigned
    long
    short



    Al tipo int per esempio, possono essere applicati tutti. Al tipo char invece solo "signed" e "unsigned". Al tipo double solo il modificatore "long", e così via... Per utilità, vi riporto una tabella che mostra tutte le combinazioni valide di tipi e modificatori assieme al loro intervallo minimo garantito.

    - Tutti i tipi di dati numerici definiti dal linguaggio C++ con i valori minimi garantiti dallo standard ANSI / ISO


    TIPO INTERVALLO MINIMO
    char da -127 a 127
    unsigned char da 0 a 255
    signed char da -127 a 127
    int da -32 767 a 32 767
    unsigned int da 0 a 65 535
    signed int come int
    short int da -32 767 a 32 767
    unsigned short int da 0 a 65 535
    signed short int come short int
    long int da -2 147 483 647 a 2 147 483 647
    signed long int come long int
    unsigned long int da 0 a 4 294 967 295
    float da 1E-37 a 1E+37, con sei cifre di precisione
    double da 1E-37 a 1E+37, con dieci cifre di precisione
    long double da 1E-37 a 1E+37, con dieci cifre di precisione

    Non spaventatevi di questa tabella, perché non serve a molto. Tenete presente che comunque se scrivete un programma che sfora di poco questi valori, molte volte il programma non subisce nessun errore. Infatti la vera ampiezza dell'intervallo dati, dovrebbe essere riportata nella documentazione del compilatore. Inoltre dipendono dall'ambiente dove si lavora (ad esempio su Windows 2000 si va a 32 bit), ma a voi questo non interessa troppo per ora.

    Gli Interi (int)

    Come già visto, le variabili "int" possono contenere numeri interi senza componenti frazionari. Le variabili di tipo int vengono spesso utilizzate per contare i cicli (come abbiamo visto nel ciclo "for") o le istruzioni condizionali ("if"). Inoltre i tipi "int" possono essere con segno o senza segno ("signed" o "unsigned"). Per default, (cioé per impostazione predefinita), gli int sono presi per numeri con segno "signed", dunque scrivere

    signed int var;

    è considerato ridondante, cioé ripetitivo e inutile. Un intero con segno può dunque essere positivo o negativo. Un intero senza segno invece, "unsigned", può essere solo positivo. La differenza tra "signed" e "unsigned" è piuttosto complessa perché si basa sull'interpretazione dei bit di ordine più elevato. Siccome vi complicherei solo la vita, non ve lo spiegherò, tanto non vi servirebbe a nulla oltre che per conoscenza personale. Ricordate solo che un valore "signed" e uno "unsigned" sono diversi. Giusto un solo esempio:

    CODICE:
    SPOILER (click to view)
    #include <iostream>

    void main()
    {

    short int i; //Intero short con segno
    short unsigned j; //Intero short senza segno

    j = 60000;
    i = j;

    printf("%d", i);
    printf("n");
    printf("%d", j);

    }


    Questo programma dà come output

    -5536

    60000

    perché il numero 60000 rientra nell'intervallo di un "unsigned short int", ma non nell'intervallo di un "signed short int". Pertanto nell'assegnamento a ' i ' verrà interpretato come un valore negativo. Tutto questo solo per dirvi che una conversione da un intero senza segno ad uno con segno, può generare errori. Stateci attenti.

    I Caratteri

    Le variabili di tipo char contengono caratteri interi ASCII a 8 bit come A, Z o G o qualsiasi altra quantità a 8 bit. Per specificare un carattere, questo deve essere racchiuso tra apici:

    char letter;

    letter = 'X';

    printf("%c", letter);

    L'output di questo pezzo di codice è X. Notare che per stampare a video un carattere singolo si usa il flag " %c ". Anche il tipo char può essere modificato con "signed" o "unsigned". Nella maggior parte dei compilatori un valore char è dotato di segno. Ecco un esempio di utilizzo del tipo char per stampare a video tutte le lettere dell'alfabeto:

    CODICE:
    SPOILER (click to view)
    //Stampa a video tutto l'alfabeto

    #include <iostream>

    void main()
    {

    char letter;

    for(letter = 'A'; letter <= 'Z'; letter++)
    printf("%cn", letter);

    }


    In queso codice, il ciclo "for" può sembrare un pò strano, ma in verità è del tutto normale. Le lettere sono rappresentate ciascuna da un numero (vedi il codice ASCII ). La lettera 'A' è il 65, mentre la 'B' il 66, la 'C' il 67 e così via. Dunque il ciclo "for" interpreta le lettere come interi con segno da 65 a 90 ( 'Z' ) ed esegue l'operazione senza problemi.

    Il tipo wchar_t contiene caratteri di un set molto esteso. Infatti questo tipo è stato aggiunto al linguaggio C++ per integrare gli insufficienti 8 bit per altre lingue come il cinese, che definiscono un gran numero di caratteri. Non parleremo del tipo wchar_t perché non credo che dobbiate scrivere programmi in cinese.

    I tipi in virgola mobile

    I tipi float e double vengono utilizzati ogni qualvolta devono essere definiti numeri con componenti frazionari. Una variabile double conserva numeri 10 volte più grandi di una di tipo float. Inoltre il tipo più utilizzato è il double poiché quasi tutte le funzioni matematiche definite nella libreria del C++, usano valori double. Ecco un semplice esempio del Teorema di Pitagora:

    CODICE:
    SPOILER (click to view)
    /*
    Uso del teorema di Pitagora per trovare la
    lunghezza dell'ipotenusa data la lunghezza
    dei due lati opposti.
    */

    #include <iostream>
    #include <cmath> //Header necessario per "sqrt"

    void main()
    {

    double x, y, z;

    x = 3;
    y = 4;

    z = sqrt(x*x + y*y);

    printf("L'ipotenusa e' %­g", z);

    }


    L'output del programma è : "L'ipotenusa e' 5". Poiché "sqrt" fa parte della libreria di funzioni matematiche, richiede l'utilizzo dell'header . Il tipo long double consente di far lavorare con numeri estremamente grandi o piccoli. Di solito si usa per applicazioni scientifiche, come l'analisi di dati astronomici.



    Il tipo bool "booleano"

    Il tipo bool è relativamente recente per il linguaggio C++. Questo definisce due costanti booleane: true (vero) e false (falso) che sono gli unici due valori che può assumere una variabile bool. Ogni valore diverso da 0, in C++ viene interpretato come true, ogni valore pari a 0, come false. Ecco un programma di esempio:

    CODICE:
    SPOILER (click to view)
    //Uso dei valori booleani

    #include <iostream>

    void main()
    {

    bool b;

    b = false;
    printf("b e' %d", b);

    printf("n");//A capo

    b = true;
    printf("b e' %d", b);

    printf("n");//A capo

    //Controllo dell'istruzione "if" con un valore booleano
    if (b)
    printf("Questa istruzione e' eseguita");

    b = false;
    if (b)
    printf("Questa istruzione non e' eseguita");

    printf("n");//A capo

    //Risultato di un operatore relazionale: vero o false
    printf("10 > 9 e' %d", (10 > 9));

    printf("n");//A capo

    }


    L'output sarà:

    b e' 0
    b e' 1
    Questa istruzione e' eseguita
    10 > 9 e' 1

    Per il controllo di una variabile booleana, con l'istruzione "if", non è necessario scrivere

    if (b == true)...


    Basta scrivere solo if (b) ... poiché la variabile di tipo bool basta da sola.


    Il tipo void

    Per ora non dico molto perché potrebbe complicare le cose inutilmente. Il tipo void specifica un'espressione senza valore, come una funzione che per esempio chiude il programma e non vogliamo nessun valore di ritorno, cioé non ce ne frega se è andata a buon fine o se ha fallito.


    I letterali stringa

    C++ supporta le stringhe. Una stringa è un insieme di caratteri racchiuso tra doppi apici. Ad esempio "Ciao io sono paolo". Già abbiamo visto vari esempi di stringhe nei programmi fatti fin qui. Alcune sequenze di caratteri hanno un significato particolare per il compilatore, (ad esempio n fa tornare a capo la riga), allo stesso modo alcuni caratteri specifici, (se noi volessimo inserire dei doppi apici all'interno della stringa?). Per questo esistono delle sequenze di escape per caratteri. Ecco l'elenco di queste sequenze:

    CODICE SIGNIFICATO
    b Backspace (cancella carattere precedente)
    f Form Feed
    n New Line
    r Carriage Return
    t Tabulazione Orizzontale
    " Doppi apici
    ' Apice
    Barra Inversa
    v Tabulazione Verticale
    a Segnale acustico
    ? Punto interrogativo
    N Costante ottale (dove N è una costante ottale)
    xN Costante esadecimale (dove N è una costante esadecimale)



    Nota bene: una stringa di un carattere, non è uguale ad un tipo carattere: "K" non è uguale a 'K'. Forse in sostanza le due cose possono produrre simili risultati, ma il per il compilatore, sono due tipi totalmente diversi.

    Gli operatori aritmetici

    Gli operatori aritmetici sono i seguenti:

    OPERATORE SIGNIFICATO
    + Somma
    - Sottrazione (e meno unario)
    * Moltiplicazione
    / Divisione
    % Modulo
    ++ Incremento
    -- Decremento



    Gli operatori +, -, * e / sono normali operatori algebrici e possono essere utilizzati per qualsiasi tipo di dati numerico, compreso il tipo char. L'operatore di modulo % fornisce il resto di una divisione intera. Quando si fa una divisione con un numero intero, il resto viene troncato. Per esempio 10 / 3 è 3. Per ottenere il resto di una divisione si usa %. 10 % 3 sarà uguale a 1. Attenzione: % può essere applicato solo agli operandi interi, non ai tipi in virgola mobile. Gli operatori di incremento e decremento li abbiamo già visti, unica cosa da aggiungere è che possono essere scritti sia così:


    y = x++;

    sia così:

    y = ++x;

    Infine la precedenza degli operatori aritmetici è questa :

    Più elevata ++ --
    - (meno unario)
    * / %
    Meno elevata + -

    Gli operatori aventi lo stesso livello di precedenza sono valutati da sinistra a destra. Naturalmente si possono usare delle parentesi.


    Operatori Logici

    Credo che a scuola abbiate fatto tutti gli operatori logici, in caso contrario questa parte vi creerà qualche problema. Gli operatori logici sono usati per supportare le operazioni logiche di base e sono AND, OR e NOT. Questi funzionano secondo la seguente tabella delle verità:

    p q p AND q p OR q NOT p
    False False False False True
    False True False True True
    True True True True False
    True False False True False



    La sintassi degli operatori logici è la seguente:

    OPERATORI LOGICI SIGNIFICATO
    && AND
    || OR
    ! NOT




    CODICE:
    SPOILER (click to view)
    //Uso degli operatori logici

    #include <iostream>

    void main()
    {

    bool a;
    bool b;

    a = true;
    b = false;

    if(a && b)
    printf("a && b = true");
    else
    printf("a && b = false");

    printf("n");

    if(a || b)
    printf("a || b = true");
    else
    printf("a || b = false");

    printf("n");

    if(!(a && b))
    printf("!(a & b) = true");
    else
    printf("!(a & b) = false");

    }


    L'output del programma è

    image

    Gli operatori logici hanno una precedenza più bassa di quelli aritmetici. Un'espressione come 10 > 1 + 12 verrà valutata come 10 > (1 + 12). Il risultato è dunque falso. La precedenza degli operatori logici è la seguente:

    Più elevata !
    > >= < <=
    == !=
    &&
    Meno elevata ||


    Conversioni Cast


    E' possibile infine forzare una espressione trasformandola in un altro tipo. Una conversione cast è appunto una conversione esplicita di tipo. Anche queste conversioni sono considerate degli operatori. Eco un esempio di conversione cast:

    CODICE:
    SPOILER (click to view)
    //Conversioni cast

    #include <iostream>

    void main()
    {

    int i;

    for (i = 1; i <= 10; ++i)
    printf("%d / 2 e' uguale a: %­gn", i, (float)i / 2 /*conversione !*/);

    }



    L'output del programma è

    image

    Questa lezione è stata abbastanza prolissa, ma adesso ne sono rimaste veramente poche di lezioni teoriche. Giusto qualche altro approfondimento e poi partiamo.

    fonte: AlexMark
     
    Top
    .
0 replies since 4/9/2009, 10:48   820 views
  Share  
.