Lezione 4. L’assignment: un importante operatore

programmazione-partecipata-762x429Lโ€™ultima volta, nella Lezione 3, ci siamo occupati delle operazioni base in C++ ma non abbiamo parlato dellโ€™operatore piรน interessante, ovvero lโ€™ASSIGNMENT che viene rappresentato dal simbolo = e, fondamentalmente, dร  una variabile ad un nuovo valore.

Se, per esempio, ho un iniziale int a = 3 e voglio cambiare il suo valore in 5 scriverรฒ a = 5. Questo puรฒ essere messo in pratica anche con le stringhe. Lโ€™assignment serve ogni qualvolta vogliamo dare ad una variabile un nuovo valore. Vediamo, allora, un piccolo esempio e scriviamo un programma che trova la ripetizione delle parole allโ€™interno di un testo:

//Controlla le parole che sono state ripetute
#include "iostream" 
#include "string"
using namespace std;

int main ()
{
    string previous = ""; //parola precedente; "non una parola"
    string current;       //parola corrente (parola piรน recente"
    while (cin>>current) {   //leggi una sequenza di parole
         if (previous == current) //controlla se la parola รจ uguale all'ultima
             cout <<"parola ripetuta: " <<current <<'\n';
         previous=current;
    }
}

Questo tipo di codice fa normalmente parte della maggior parte di software dedicati ai controlli grammaticali.ย 

Allora, come sempre abbiamo aperto il programma specificando il tipo di librerie (iostream e string) e l’utilizzo di std di cui si รจ parlato in maniera piรน approfondita nella Lezione 1 e nella Lezione 2.

Guardiamo, ora, il corpo della funzione. Nella prima riga avvertiamo il nostro programma che la parola iniziale “non รจ una parola”. Mentreย string current permette immediatamente al computer di leggere la parola usata, ovvero la parola corrente.

Ilย while-statementย nota che l’affermazione successiva, ovvero cin >> current, verrร  ripetuta finchรฉ l’operazione non avrร  successo; ciรฒ significa anche che l’operazione cin >> current continuerร  finchรฉ ci saranno caratteri da leggere. Ricordiamoci cheย CINย si riferisce allo standard input stream definito dalla libreria e che l’operatore >>ย ย (get from, prendi da) specifica dove lโ€™input dato deve leggere, in questo caso la parola corrente.

Notiamo l’uso dell’operatore IFย  (che significa โ€œseโ€) giร  notato nella lezione precedente il quale, qui, specifica che se la parola precedente รจ uguale a quella corrente allora il programma dovrร  specificarlo scrivendo “parola ripetuta: X”.ย Ciรฒ significa che il programma legge una parola e la compara a quella che la precede: se sono uguali lo scrive.ย 

Infine useremo l’assignment per dire al programma che la parola precedente diverrร  quella corrente man mano che continuerร  a leggere il brano.

Sarร  evidente, inoltre, la presenza di quattro parentesi graffe { } anzichรฉ due: questo perchรฉ il nostro programma sta svolgendo due specifiche azioni: controllare il brano e, nel mentre, scrivere le parole ripetute.

L’assignment ovviamente non รจ utilizzabile solo per le stringhe ma anche per gli int, ovvero i numeri interi. Spesso, infatti, nei programmi si utilizza l’aumento di una variabile, spesso aggiungendo 1, tant’รจ che รจ stata creata per questo una sintassi specifica:ย ++counter che significa e si puรฒ anche scrivereย counter=counter+1. Questo tipo di assignment viene chiamatoย Composite assignment operators. Vi sono, comunque, molti modi di cambiare il valore di una variabile basandosi sul valore di riferimento, come per esempio:

a+=2     //significa a = a+2
b-=7ย     //significa b = b-7
c*=3     //significa c = c*3

Proviamo, quindi, a cambiare il programma qui sopra dandogli un’idea di dove si trovino le parole all’interno della sequenza cosรฌ da fargliele contare e dare poi l’output.

//Controlla e conta, poi, le parole ripetute
#include "iostream"
#include "string"
using namespace std;

int main ()
{
    int_number_of_words = 0;
    string previous = "" ;  //parola precedente;"non una parola"
    string current;         //parola corrente: la piรน recente 
    while (cin>>current) {
           ++number_of_words; //aumenta il numero parole
           if (previous == current) //controlla se la parola 
                           precedente รจ uguale a quella corrente
                cout <<"word number" <<number_of_words;
                cout <<"repeated: " <<current <<'\n';
           previous=current;
     }
}
     

L’ordine iniziale presente nel corpo della funzione, ovvero int_number_of_word = 0, dice al nostro programma di iniziare a contare da zero: ogni volta che viene rilevata una parola si incrementa il conto con il comando ++number_of_words che puรฒ scriversi anche in altre due modi, ovvero, number_of_words+=1 oppure number_of_words=number_of_words+1.

Fate attenzione quando nominate le variabili poichรฉ non potrete utilizzare caratteri speciali e dovrete sempre iniziare sempre con una lettera.

Questi sono esempi di nomi di variabili corretti:

w
number_of_things
fourier_transform
z3
Square

I seguenti, invece, non sono nomi di variabili:

2x             //un nome DEVE iniziare con una lettera
time$to$shop   //$ non รจ una lettera, un numero o un underscore
Start menu     //lo spazio non va MAI utilizzato

Possono trovarsi in giro, perรฒ, dei nomi che iniziano con l’underscore (ovvero _ ) come, per esempio, _foo ma questi sono riservati per l’implementazione e le entitร  di sistema: evitando di scriverli noi stessi non creeremo confusione, in un secondo momento, tra i nomi che abbiamo creato e quelli che sono stati generati dal sistema.

Riassumiamo, quindi, un po’ di definizioni tanto per rinfrescare la memoria:

TYPE, definisce un set di valori e di operazioni per un object.

OBJECT, รจ una regione di memoria che contiene un valore di un dato type.

VALUE, รจ il valore, ovvero un set di bits nella memoria che vengono interpretati secondo un type.

VARIABLE, รจ una variabile, ovvero un object a cui si รจ dato un nome.

DECLARATION, รจ un’affermazione che da un nome ad un object.

DEFINITION, รจ una declaration che mette da parte la memoria per un dato object.

Un programma si dice essere TYPE-SAFE quando gli objects al suo interno vengono utilizzati tenendo conto delle regole del loro type.

Ci sono dei modi per operare in modalitร  non type-sape come, per esempio, usare una variabile senza averla inizializzata ma รจ sconsigliato farlo! Nel caso, comunque, per vari motivi si decida di non usare il type-safe il compiler non sarร  in grado di aiutarci ad individuare eventuali errori e, quindi, dovremmo affidarci semplicemente a noi stessi per ricontrollare il codice.


Scopri di piรน da CODEXSPRAWL

Abbonati per ricevere gli ultimi articoli inviati alla tua e-mail.

Lascia un commento

Il tuo indirizzo email non sarร  pubblicato. I campi obbligatori sono contrassegnati *