SlideShare a Scribd company logo
1 of 55
Download to read offline
Istruzioni del
Linguaggio C/C++
Istruzione di assegnamento




Programmazione - Paolo Valente, 2008/2009   2
Istruzione di assegnamento
 • Denotata mediante il simbolo =
      (l’operatore relazionale di uguaglianza è denotata con il simbolo == )

      nome_variabile = espressione ;

 • Viene utilizzata per assegnare ad una variabile (non ad
   una costante!) il valore di un’espressione
 • L'identificatore a sinistra rappresenta l'indirizzo della
   variabile di cui vogliamo modificare il valore
    – tale indirizzo è detto lvalue
 • Il valore dell'espressione che compare a destra
   rappresenta il nuovo valore
    – tale valore è detto rvalue

Programmazione - Paolo Valente, 2008/2009                                      3
Istruzione di assegnamento

 Esempio
   int N;
                                                                L’esecuzione di
                                                          ...
                                                                una definizione
                        simbolo        indirizzo                provoca l’allocazione
                                                                di uno spazio in
                                                          ?
                                                   1600
                            N               1600                memoria pari
                                                                a quello necessario a
                                                          ...
                                                                contenere un dato del
                                                                tipo specificato

       N = 150;

                                                                L’esecuzione di un
                                                          ...
                        simbolo        indirizzo                assegnamento
                                                                provoca l’inserimento
                                                          150
                                                   1600
                            N               1600                nello spazio relativo
                                                                alla variabile del valore
                                                                indicato a destra
                                                          ...
                                                                del simbolo =
Programmazione - Paolo Valente, 2008/2009                                             4
Istruzione di assegnamento (cont.)
 •    L’esecuzione di un’istruzione di assegnamento comporta innanzitutto
      la valutazione di tutta l’espressione a destra dell’assegnamento.
      Es.,               int      c, d;
                         c=       2;
                         d=       (c+5)/3 - c;
                         d=       (d+c)/2;
 •    Solo dopo si inserisce il valore risultante (rvalue) nella locazione di
      memoria relativa alla variabile (posta a sinistra dell’assegnamento)
       – Risultato espressione assegnamento: indirizzo della variabile




Programmazione - Paolo Valente, 2008/2009                                       5
Esercizio 1 (Specifica)

 • Inverti l’ordine delle cifre che formano un intero
   positivo non multiplo di 10 che sia compreso fra
   101 e 999.

 • Per esempio: 103                             301
                                            
                234                             432
                                            
                350                             53
                                            




Programmazione - Paolo Valente, 2008/2009               6
Esercizio 1 (Algoritmo)

 Idea!: Utilizzare le operazioni di modulo e di
   divisione fra numeri interi.
 Dato un numero, valgono le seguenti relazioni:
 • Unita = (numero/10^0)%10;
       – Es., (234/1)%10 = 4

 •     Decine = (numero/10^1)%10;
       – Es., (234/10)%10 = 3


 •     Centinaia = (numero/10^2)%10;
       – Es., (234/100)%10 = 2


Programmazione - Paolo Valente, 2008/2009           7
Esercizio 1 (Programma)
       main()
       {
         int numero;
         int unita, decine, centinaia, risultato;
        
         cin>>numero;
        
         unita = (numero)%10;
         decine = (numero/10)%10;
         centinaia = (numero/100)%10;

           risultato =unità*100+decine*10+centinaia;
           cout<<risultato;
       }
Programmazione - Paolo Valente, 2008/2009              8
Esercizi da svolgere

 Esercizio 1bis
  
   Si risolva lo stesso problema posto nell’Esercizio 1
   accettando in input un qualsiasi numero intero (anche
   divisibile per 10) compreso fra 100 e 999.
   Esempio: 100 va ristampato come 001
  
 Esercizio 1ter (servirà conoscere le istruzioni cicliche)
  
   Si risolva lo stesso problema posto nell’Esercizio 1
   accettando in input un qualsiasi numero intero positivo (si
   richieda in input sia il numero sia il numero di cifre che lo
   compongono).

Programmazione - Paolo Valente, 2008/2009                          9
Tipo booleano




Programmazione - Paolo Valente, 2008/2009    10
Tipo booleano
 • Disponibile solo in C++

 • Nome del tipo: bool

 • Valori possibili: vero (true), falso (false)
       – true e false sono due letterali booleani
 • Esempio di definizione:
      bool u, v = true ; // la seconda variabile
                         // è inizializzata a vero

 • Operazioni possibili: ...


Programmazione - Paolo Valente, 2008/2009           11
Operatori logici

                   operatore logico         operatore    C/C++


                                             unario
               not logico                                    !
               (negazione)                              (prefisso)

                                             binario
               and logico                                  &&
               (congiunzione)                           (infisso)

                                             binario
               or logico                                    ||
               (disgiunzione)                           (infisso)




Programmazione - Paolo Valente, 2008/2009                            12
Tabella di verità degli operatori

           AND            Ris.                      OR       Ris.       NOT   Ris.


                                                                     
       V   &&      V        V                   V   ||   V    V         !V    F
       V   &&      F        F                   V   ||   F    V         !F    V
       F   &&      V        F                   F   ||   V    V
       F   &&      F        F                   F   ||   F    F




Programmazione - Paolo Valente, 2008/2009                                            13
Tipo booleano e tipi numerici
 • Se un oggetto di tipo booleano è usato dove è
   atteso un valore numerico

       – true è convertito a 1
       – false è convertito a 0
 • Viceversa, se un oggetto di tipo numerabile è
   utilizzato dove è atteso un booleano
       – ogni valore diverso da 0 è convertito a true
       – il valore 0 è convertito a false

Programmazione - Paolo Valente, 2008/2009               14
Tipo booleano e linguaggio C

In C, non esistendo il tipo bool, gli operatori logici operano
su interi
e restituiscono un intero:
• il valore 0 viene considerato falso
• ogni valore diverso da 0 viene considerato vero
• il risultato è 0 o 1
  Esempi
            5 && 7               0 || 33    !5




Programmazione - Paolo Valente, 2008/2009                        15
Operatori di confronto




Programmazione - Paolo Valente, 2008/2009   16
Operatori di confronto
 ==          Operatore di confronto di uguaglianza
             (simbolo = denota l’operazione di assegnamento!)

 !=          Operatore di confronto di diversità

 >           Operatore di confronto di maggiore stretto
 <           Operatore di confronto di minore stretto
 >=          Operatore di confronto di maggiore-uguale
 <=          Operatore di confronto di minore-uguale

  Restituiscono un valore di tipo booleano:
  falso o vero
Programmazione - Paolo Valente, 2008/2009                       17
Sintassi del C++




Programmazione - Paolo Valente, 2008/2009    18
Sintassi del C/C++ 1/2
 • Ora che abbiamo più familiarità col linguaggio, fissiamo un
   po' meglio la sintassi ...

 • Programma C/C++: sequenze di parole (token) delimitate
   da spazi bianchi (whitespaces)

       – Spazio bianco: carattere spazio, tabulazione, a capo

 • Token possibili: identificatori, parole chiave, espressioni
   letterali, operatori, separatori

       – Operatore: denota una operazione nel calcolo delle
         espressioni

       – Separatore: ( ) , ; : { }

Programmazione - Paolo Valente, 2008/2009                        19
Sintassi del C/C++ 2/2
IDENTIFICATORI
   <Identificatore> ::= <Lettera> { <Lettera> | <Cifra> }

•   Lettera include tutte le lettere, maiuscole e minuscole, e l’underscore
    “_”
•   La notazione { A | B } indica una sequenza indefinita di elementi A o B
•   Maiuscole e minuscole sono diverse (linguaggio C è case-sensitive)

PAROLE RISERVATE
• int, float, double, char, if, for, do, while, switch, break, continue, ...
  { } delimitatore di blocco

COMMENTI
  // commento, su una sola riga
  /* commento, anche su più righe */        (non possono essere innestati)



Programmazione - Paolo Valente, 2008/2009                                  20
Uso degli spazi bianchi
• Una parola chiave ed un identificatore vanno
  separati da spazi bianchi
     – Es:
       int a; // inta sarebbe un
              // identificatore !

• In tutti gli altri casi gli spazi bianchi non sono
  necessari




Programmazione - Paolo Valente, 2008/2009              21
Espressioni




Programmazione - Paolo Valente, 2008/2009      22
Espressioni
 • Costrutto sintattico formato da letterali, identificatori,
   operatori, parentesi tonde, ...

 • Operatori binari
       o Moltiplicativi: * / %

       o Additivi: + -

       o Traslazione: << >>

       o Relazione (confronto): < > <= >=

       o Eguaglianza (confronto): == !=

       o Logici: && ||

 • Abbiamo già visto quasi tutti questi operatori
   parlando del tipo int e del tipo bool
Programmazione - Paolo Valente, 2008/2009                       23
Altri operatori
 • Assegnamento abbreviato: +=, -=, *=, /=, ...
   a += b ; <==>       a=a+b;

 • Incremento e decremento: ++ --
       – Prefisso: prima si effettua l'incremento/decremento, poi
         si usa la variabile. Restituisce un lvalue
         int a = 3; cout<<++a; // stampa 4
         (++a) = 4; // valido
       – Postfisso: prima si usa il valore della variabile, poi si
         effettua l'incremento/decremento. Restituisce un rvalue
         int a = 3; cout<<a++; // stampa 3
         (a++) = 4; // ERRORE !!!


Programmazione - Paolo Valente, 2008/2009                        24
Espressioni aritmetiche e logiche
 • Un'espressione si definisce
    – aritmetica: produce un risultato di tipo aritmetico
    – logica: produce un risultato di tipo booleano

 • Esempi:

     Espressioni aritmetiche
                                               4>2
          2+3
                                               true || (2 > 5)
          (2 + 3) * 5
                                            Espressioni logiche


Programmazione - Paolo Valente, 2008/2009                         25
Proprietà operatori
 • Posizione rispetto ai suoi operandi (o argomenti):
   prefisso, postfisso, infisso
 • Numero di operandi (arietà)
 • Precedenza (o priorità) nell'ordine di esecuzione

       – Es: 1 + 2 * 3 è valutato come 1 + (2 * 3)
             k<b+3 è valutato come k<(b+3), e non (k<b) +3
 • Associatività: ordine con cui vengono valutati due
   operatori con la stessa precedenza.
       – Associativi a sinistra: valutati da sinistra a destra
          o Es: / è associativo a sinistra, quindi 6/3/2  (6/3)/2
       – Associativi a destra: valutati da destra a sinistra
          o Es: = è associativo a destra ...
Programmazione - Paolo Valente, 2008/2009                            26
Associatività dell’assegnamento
 • L’operatore di assegnamento può comparire più volte in
   un’istruzione.
 • L’associatività dell’operatore di assegnamento è a destra
   Es.,
                      k = j = 5;
      equivale a                    j = 5;
                                    k = j;


                                    k = j+2 = 5;   NON SI PUO’ FARE!




Programmazione - Paolo Valente, 2008/2009                          27
Ordine valutazione espressioni
 • Ordine
    – Fattori: dalle espressioni letterali e calcolo delle
      funzioni e degli operatori unari
    – Termini: dal calcolo degli operatori binari
       o Moltiplicativi: * / %

       o Additivi: + -

       o Traslazione: << >>

       o Relazione: < > <= >=

       o Eguaglianza: == !=

       o Logici: && ||

 • Con le parentesi possiamo modificare l'ordine di
   valutazione dei termini
Programmazione - Paolo Valente, 2008/2009                28
Sintesi priorità degli operatori
              Fattori                           !            ++           --
                                                *        /            %
                                                     +            -
                                            >       >=            <            <=
             Termini                                ==            !=
                                                         &&
                                                             ||
                                                         ?:
Assegnamento                                                 =
Programmazione - Paolo Valente, 2008/2009                                           29
Espressioni
 • Esempi:
                          Espressioni aritmetiche

       2+3                                         (2 + 3) * 5
                                      Fattori


       4>2
                                                Termini
       true || (2 > 5)

        Espressioni logiche
Programmazione - Paolo Valente, 2008/2009                        30
Programmazione strutturata




Programmazione - Paolo Valente, 2008/2009   31
Programmazione “strutturata”
 • Si parla di programmazione strutturata se si utilizzano
   solo le seguenti strutture per alterare il flusso di
   controllo [Dijkstra, 1969]:
       – concatenazione (o composizione)
         legata al concetto di enumerazione (sequenza)
       – selezione o (istruzione condizionale)
         ramifica il flusso di controllo in base al valore vero o falso di una
         espressione detta “condizione di scelta”
       – iterazione
         dà luogo all’esecuzione ripetuta di un’istruzione (semplice o
         composta) finché permane vera una espressione detta
         “condizione di iterazione”


 • OBIETTIVO: rendere i programmi più leggibili,
   modificabili e manutenibili

Programmazione - Paolo Valente, 2008/2009                                        32
Teorema di Jacopini-Böem
      Le strutture di concatenazione, iterazione e selezione
      costituiscono un insieme completo
      in grado di esprimere tutte le funzioni calcolabili
 • Dunque, l’uso di queste sole strutture di controllo
   non limita il potere espressivo.
   P.es., un linguaggio con i seguenti
        Tipi di dato: Naturali con l’operazione di somma (+)
        Istruzioni:   assegnamento
                      istruzione composta
                      istruzione condizionale
                      istruzione di iterazione
   è un linguaggio completo, cioè è un linguaggio in grado
   di esprimere tutte le funzioni calcolabili.

Programmazione - Paolo Valente, 2008/2009                      33
Programmazione “strutturata” in
                   C/C++
 • Istruzioni composte
       – concatenazione di istruzioni “semplici” all'interno di un
         blocco  { }
  
 • Istruzioni espressione
       – esempio: assegnamento  =
  
 • Istruzioni condizionali
       – alternativa  if (), if () else
       – selezione  switch ()
  
 • Istruzioni di iterazione
       – ciclo  while (), do while (), for ( ; ; )

Programmazione - Paolo Valente, 2008/2009                            34
Istruzioni Condizionali




Programmazione - Paolo Valente, 2008/2009   35
Istruzioni condizionali
 Solitamente vengono rese disponibili due tipi di istruzioni condizionali:

 •    Istruzione di SCELTA (semplice) o ALTERNATIVA
 •    Istruzione di SCELTA MULTIPLA (questa non è essenziale, ma
      migliora l’espressività del linguaggio)




Programmazione - Paolo Valente, 2008/2009                                    36
Istruzione di scelta semplice (o Alternativa)
 • Consente di scegliere fra due istruzioni alternative in
   base al verificarsi di una particolare condizione
                         <istruzione-di-scelta> ::=
                                if (condizione) < istruzione1>
                                    [   else < istruzione2> ]   Opzionale

 •    Condizione è un’espressione logica che viene valutata al momento
      dell’esecuzione dell’istruzione if
 •    Se condizione risulta vera si esegue <istruzione1>, altrimenti si
      esegue <istruzione2>
      In entrambi i casi l’esecuzione continua poi con l’istruzione che segue
 •
      l’istruzione if.
      NOTA: Se condizione è falsa e la parte else (opzionale)
      è omessa, si passa subito all’istruzione che segue l’istruzione if
Programmazione - Paolo Valente, 2008/2009                                   37
Le due istruzioni di scelta semplice
             if (condizione) istruzione1;

             if (condizione)
                       istruzione1;

             if (condizione) istruzione1;
             else istruzione2;

             if (condizione) istruzione1;
             else
                   istruzione2;

Programmazione - Paolo Valente, 2008/2009    38
Esempio
             int a=3, n=-6, b=0;
             if (n > 0)
                    a = b + 5;
             else
                    n = b*5;

 ------------------
 a?
 b?
 n?
Programmazione - Paolo Valente, 2008/2009             39
Problema
 • E se vogliamo eseguire più di una istruzione in
   uno dei due rami o in entrambi?
 • Esempio:

             if (condizione)
                   <varie istruzioni>
             else
                   <varie istruzioni>




Programmazione - Paolo Valente, 2008/2009              40
Istruzioni Composte




Programmazione - Paolo Valente, 2008/2009   41
Istruzione composta
 • Sequenza di istruzioni racchiuse tra parentesi graffe
      {
             <istruzione1>
             <istruzione2>
             ...
      }
 • E' un caso particolare di blocco
 • Ovunque la sintassi preveda una istruzione si può inserire
   una istruzione composta
 • Ai fini della sintassi e della semantica è trattata come una
   istruzione singola
 • L'esecuzione di una istruzione composta implica
   l'esecuzione ordinata di tutte le istruzioni della sequenza

Programmazione - Paolo Valente, 2008/2009                         42
Istruzioni Condizionali
                     Seconda parte




Programmazione - Paolo Valente, 2008/2009   43
Forma completa
             if (condizione)
                   <istruzione-ramo-if>
             [else <istruzione-ramo-else>]

 • istruzione può essere qualsiasi istruzione, ovvero
   espressione, condizionale, iterativa, composta
   (blocco di istruzioni)
 • Le istruzioni da eseguire sono spesso chiamate
   anche corpo del ramo if o corpo del ramo else,
   rispettivamente


Programmazione - Paolo Valente, 2008/2009           44
Esempio
 • Qualora occorra specificare più istruzioni, si dovrà quindi
   utilizzare un blocco

             if (n > 0)
                 {                               /* inizio blocco */
                     a = b + 5;
                     c = x + a - b;
                 }                               /* fine blocco */
             else n = b*5;




Programmazione - Paolo Valente, 2008/2009                              45
Osservazione 2
 Istruzioni if annidate
 • Come caso particolare, <istruzione-ramo-if> o
   <istruzione-ramo-else> potrebbero essere un’altra
   <istruzione-di-scelta>
 • In questo caso occorre attenzione ad associare i
   rami else (che sono opzionali) all’if corretto

      In base alla sintassi del linguaggio C/C++, il un
      ramo else è sempre associato all’if più interno
      (vicino)
      Se questa non è l'associazione desiderata,
      occorre inserire esplicitamente un blocco { }

Programmazione - Paolo Valente, 2008/2009             46
Osservazione 2 (cont.)
             if (n > 0)
   ?             if (a>b) n = a;
               else n = b*5; /* else riferito a if (a>b) */
       Per far sì che l’else si riferisca al primo if:
         if (n > 0)
              { if (a>b) n = a; }
         else n = b*5;
       Per leggibilità, si possono usare le parentesi anche
       nell'altro caso:
         if (n > 0)
               { if (a>b) n = a;
                   else n = b*5; }
Programmazione - Paolo Valente, 2008/2009                     47
Istruzione di scelta multipla: switch
 • Consente di scegliere fra molti casi in base
   al valore di un’espressione di selezione




Programmazione - Paolo Valente, 2008/2009     48
Istruzione di scelta multipla
           (sintassi e semantica) 1/2
 <istruzione-di-scelta-multipla> ::=
    switch (espressione di selezione)
        {
          case <etichetta1> : <sequenza_istruzioni1> [ break; ]
          case <etichetta2> : <sequenza_istruzioni2> [ break; ]
                 …
          [ default : < sequenza_istruzioniN> ]
        }
 espressione di selezione è un’espressione che
 restituisce un valore numerabile (intero, carattere,
 enumerato, …), e viene valutata al momento dell’esecuzione
 dell’istruzione switch
  
  Le etichette <etichetta1>, <etichetta2> ... devono essere
  delle costanti dello stesso tipo dell'espressione di
  selezione
Programmazione - Paolo Valente, 2008/2009                   49
Istruzione di scelta multipla
                 (sintassi e semantica) 2/2
 • Definiamo corpo dell'istruzione switch, la parte del
   costrutto compresa tra le parentesi graffe
 • Il valore dell'espressione di selezione viene confrontato
   con le costanti che etichettano i vari casi: l’esecuzione
   salta al ramo dell’etichetta corrispondente (se esiste)
    – L'esecuzione prosegue poi sequenzialmente fino alla
       fine del corpo dell'istruzione switch
    – A meno che non si incontri un'istruzione break, nel qual
       caso si esce dal blocco
 • Se nessuna etichetta corrisponde al valore
   dell’espressione, si salta al ramo default (se specificato)
    – Se non esiste, l’esecuzione prosegue con l’istruzione
      successiva all’istruzione switch
Programmazione - Paolo Valente, 2008/2009                        50
Diagramma di flusso

                                    espressione
                                    di selezione

                                       caso A                           break
                                                 sequenza_istruzioni1

                                                                        break
                                       caso B
                                                 sequenza_istruzioni2

                                                                        break
                                                           …

                                       default
                                                 sequenza_istruzioniN




Programmazione - Paolo Valente, 2008/2009                                       51
Esempio
 int a, n;
 cin>>a>>n;
 switch (n)
           {
                         case 1:
                            cout<<”Ramo A”<<endl;
                            break;
                         case 2:
                            cout<<”Ramo B”<<endl;
                            a = a*a;
                            break;
                         case 3:
                            cout<<”Ramo C”<<endl;
                            a = a*a*a;
                            break;
                         default: a=1;
         }
 cout<<a<<endl;
Programmazione - Paolo Valente, 2008/2009             52
Osservazioni
 • <sequenza_istruzioni> denota una sequenza di
   istruzioni per cui non è necessario un blocco per
   specificare più istruzioni
 • I vari rami non sono mutuamente esclusivi: una
   volta imboccato un ramo, l’esecuzione prosegue
   in generale con le istruzioni dei rami successivi
       – Per avere rami mutuamente esclusivi occorre forzare
         esplicitamente l’uscita mediante l’istruzione break




Programmazione - Paolo Valente, 2008/2009                      53
Esempio
 int a, n, b = 1;
 cin>>a>>n;
 switch (2 - n)
    {
                 case 0:
                     b *= a;
                       case 1:
                           b *= a;
                       case 2:
                          break;
                       default:
                           cout<<”Valore non valido per nn” ;
         }
 cout<<b<<endl;

Programmazione - Paolo Valente, 2008/2009                        54
Pro e contro della scelta multipla
 • L’istruzione switch garantisce maggiore leggibilità
   rispetto all'if quando c'è da scegliere tra più di due
   alternative
 • Altrimenti è ovviamente un costrutto più
   ingombrante
 • Limitazioni:
       – è utilizzabile solo con espressioni ed etichette di tipo
         numerabile (intero, carattere, enumerato, ...)
       – non è utilizzabile con numeri reali (float, double) o con
         tipi strutturati (stringhe, vettori, strutture...)

Programmazione - Paolo Valente, 2008/2009                           55

More Related Content

More from Majong DevJfu

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA CloudMajong DevJfu
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processesMajong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product lineMajong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformationMajong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven ArchitectureMajong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture PortfolioMajong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural stylesMajong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architectureMajong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a productMajong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural stylesMajong DevJfu
 

More from Majong DevJfu (20)

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 

03 - Programmazione: Istruzioni C++

  • 2. Istruzione di assegnamento Programmazione - Paolo Valente, 2008/2009 2
  • 3. Istruzione di assegnamento • Denotata mediante il simbolo = (l’operatore relazionale di uguaglianza è denotata con il simbolo == ) nome_variabile = espressione ; • Viene utilizzata per assegnare ad una variabile (non ad una costante!) il valore di un’espressione • L'identificatore a sinistra rappresenta l'indirizzo della variabile di cui vogliamo modificare il valore – tale indirizzo è detto lvalue • Il valore dell'espressione che compare a destra rappresenta il nuovo valore – tale valore è detto rvalue Programmazione - Paolo Valente, 2008/2009 3
  • 4. Istruzione di assegnamento Esempio int N; L’esecuzione di ... una definizione simbolo indirizzo provoca l’allocazione di uno spazio in ? 1600 N 1600 memoria pari a quello necessario a ... contenere un dato del tipo specificato N = 150; L’esecuzione di un ... simbolo indirizzo assegnamento provoca l’inserimento 150 1600 N 1600 nello spazio relativo alla variabile del valore indicato a destra ... del simbolo = Programmazione - Paolo Valente, 2008/2009 4
  • 5. Istruzione di assegnamento (cont.) • L’esecuzione di un’istruzione di assegnamento comporta innanzitutto la valutazione di tutta l’espressione a destra dell’assegnamento. Es., int c, d; c= 2; d= (c+5)/3 - c; d= (d+c)/2; • Solo dopo si inserisce il valore risultante (rvalue) nella locazione di memoria relativa alla variabile (posta a sinistra dell’assegnamento) – Risultato espressione assegnamento: indirizzo della variabile Programmazione - Paolo Valente, 2008/2009 5
  • 6. Esercizio 1 (Specifica) • Inverti l’ordine delle cifre che formano un intero positivo non multiplo di 10 che sia compreso fra 101 e 999. • Per esempio: 103 301  234 432  350 53  Programmazione - Paolo Valente, 2008/2009 6
  • 7. Esercizio 1 (Algoritmo) Idea!: Utilizzare le operazioni di modulo e di divisione fra numeri interi. Dato un numero, valgono le seguenti relazioni: • Unita = (numero/10^0)%10; – Es., (234/1)%10 = 4 • Decine = (numero/10^1)%10; – Es., (234/10)%10 = 3 • Centinaia = (numero/10^2)%10; – Es., (234/100)%10 = 2 Programmazione - Paolo Valente, 2008/2009 7
  • 8. Esercizio 1 (Programma) main() { int numero; int unita, decine, centinaia, risultato;   cin>>numero;   unita = (numero)%10; decine = (numero/10)%10; centinaia = (numero/100)%10; risultato =unità*100+decine*10+centinaia; cout<<risultato; } Programmazione - Paolo Valente, 2008/2009 8
  • 9. Esercizi da svolgere Esercizio 1bis   Si risolva lo stesso problema posto nell’Esercizio 1 accettando in input un qualsiasi numero intero (anche divisibile per 10) compreso fra 100 e 999. Esempio: 100 va ristampato come 001   Esercizio 1ter (servirà conoscere le istruzioni cicliche)   Si risolva lo stesso problema posto nell’Esercizio 1 accettando in input un qualsiasi numero intero positivo (si richieda in input sia il numero sia il numero di cifre che lo compongono). Programmazione - Paolo Valente, 2008/2009 9
  • 10. Tipo booleano Programmazione - Paolo Valente, 2008/2009 10
  • 11. Tipo booleano • Disponibile solo in C++ • Nome del tipo: bool • Valori possibili: vero (true), falso (false) – true e false sono due letterali booleani • Esempio di definizione: bool u, v = true ; // la seconda variabile // è inizializzata a vero • Operazioni possibili: ... Programmazione - Paolo Valente, 2008/2009 11
  • 12. Operatori logici operatore logico operatore C/C++ unario not logico ! (negazione) (prefisso) binario and logico && (congiunzione) (infisso) binario or logico || (disgiunzione) (infisso) Programmazione - Paolo Valente, 2008/2009 12
  • 13. Tabella di verità degli operatori AND Ris. OR Ris. NOT Ris.       V && V V V || V V !V F V && F F V || F V !F V F && V F F || V V F && F F F || F F Programmazione - Paolo Valente, 2008/2009 13
  • 14. Tipo booleano e tipi numerici • Se un oggetto di tipo booleano è usato dove è atteso un valore numerico – true è convertito a 1 – false è convertito a 0 • Viceversa, se un oggetto di tipo numerabile è utilizzato dove è atteso un booleano – ogni valore diverso da 0 è convertito a true – il valore 0 è convertito a false Programmazione - Paolo Valente, 2008/2009 14
  • 15. Tipo booleano e linguaggio C In C, non esistendo il tipo bool, gli operatori logici operano su interi e restituiscono un intero: • il valore 0 viene considerato falso • ogni valore diverso da 0 viene considerato vero • il risultato è 0 o 1 Esempi 5 && 7 0 || 33 !5 Programmazione - Paolo Valente, 2008/2009 15
  • 16. Operatori di confronto Programmazione - Paolo Valente, 2008/2009 16
  • 17. Operatori di confronto == Operatore di confronto di uguaglianza (simbolo = denota l’operazione di assegnamento!) != Operatore di confronto di diversità > Operatore di confronto di maggiore stretto < Operatore di confronto di minore stretto >= Operatore di confronto di maggiore-uguale <= Operatore di confronto di minore-uguale Restituiscono un valore di tipo booleano: falso o vero Programmazione - Paolo Valente, 2008/2009 17
  • 18. Sintassi del C++ Programmazione - Paolo Valente, 2008/2009 18
  • 19. Sintassi del C/C++ 1/2 • Ora che abbiamo più familiarità col linguaggio, fissiamo un po' meglio la sintassi ... • Programma C/C++: sequenze di parole (token) delimitate da spazi bianchi (whitespaces) – Spazio bianco: carattere spazio, tabulazione, a capo • Token possibili: identificatori, parole chiave, espressioni letterali, operatori, separatori – Operatore: denota una operazione nel calcolo delle espressioni – Separatore: ( ) , ; : { } Programmazione - Paolo Valente, 2008/2009 19
  • 20. Sintassi del C/C++ 2/2 IDENTIFICATORI <Identificatore> ::= <Lettera> { <Lettera> | <Cifra> } • Lettera include tutte le lettere, maiuscole e minuscole, e l’underscore “_” • La notazione { A | B } indica una sequenza indefinita di elementi A o B • Maiuscole e minuscole sono diverse (linguaggio C è case-sensitive) PAROLE RISERVATE • int, float, double, char, if, for, do, while, switch, break, continue, ... { } delimitatore di blocco COMMENTI // commento, su una sola riga /* commento, anche su più righe */ (non possono essere innestati) Programmazione - Paolo Valente, 2008/2009 20
  • 21. Uso degli spazi bianchi • Una parola chiave ed un identificatore vanno separati da spazi bianchi – Es: int a; // inta sarebbe un // identificatore ! • In tutti gli altri casi gli spazi bianchi non sono necessari Programmazione - Paolo Valente, 2008/2009 21
  • 22. Espressioni Programmazione - Paolo Valente, 2008/2009 22
  • 23. Espressioni • Costrutto sintattico formato da letterali, identificatori, operatori, parentesi tonde, ... • Operatori binari o Moltiplicativi: * / % o Additivi: + - o Traslazione: << >> o Relazione (confronto): < > <= >= o Eguaglianza (confronto): == != o Logici: && || • Abbiamo già visto quasi tutti questi operatori parlando del tipo int e del tipo bool Programmazione - Paolo Valente, 2008/2009 23
  • 24. Altri operatori • Assegnamento abbreviato: +=, -=, *=, /=, ... a += b ; <==> a=a+b; • Incremento e decremento: ++ -- – Prefisso: prima si effettua l'incremento/decremento, poi si usa la variabile. Restituisce un lvalue int a = 3; cout<<++a; // stampa 4 (++a) = 4; // valido – Postfisso: prima si usa il valore della variabile, poi si effettua l'incremento/decremento. Restituisce un rvalue int a = 3; cout<<a++; // stampa 3 (a++) = 4; // ERRORE !!! Programmazione - Paolo Valente, 2008/2009 24
  • 25. Espressioni aritmetiche e logiche • Un'espressione si definisce – aritmetica: produce un risultato di tipo aritmetico – logica: produce un risultato di tipo booleano • Esempi: Espressioni aritmetiche 4>2 2+3 true || (2 > 5) (2 + 3) * 5 Espressioni logiche Programmazione - Paolo Valente, 2008/2009 25
  • 26. Proprietà operatori • Posizione rispetto ai suoi operandi (o argomenti): prefisso, postfisso, infisso • Numero di operandi (arietà) • Precedenza (o priorità) nell'ordine di esecuzione – Es: 1 + 2 * 3 è valutato come 1 + (2 * 3) k<b+3 è valutato come k<(b+3), e non (k<b) +3 • Associatività: ordine con cui vengono valutati due operatori con la stessa precedenza. – Associativi a sinistra: valutati da sinistra a destra o Es: / è associativo a sinistra, quindi 6/3/2  (6/3)/2 – Associativi a destra: valutati da destra a sinistra o Es: = è associativo a destra ... Programmazione - Paolo Valente, 2008/2009 26
  • 27. Associatività dell’assegnamento • L’operatore di assegnamento può comparire più volte in un’istruzione. • L’associatività dell’operatore di assegnamento è a destra Es., k = j = 5; equivale a j = 5; k = j; k = j+2 = 5; NON SI PUO’ FARE! Programmazione - Paolo Valente, 2008/2009 27
  • 28. Ordine valutazione espressioni • Ordine – Fattori: dalle espressioni letterali e calcolo delle funzioni e degli operatori unari – Termini: dal calcolo degli operatori binari o Moltiplicativi: * / % o Additivi: + - o Traslazione: << >> o Relazione: < > <= >= o Eguaglianza: == != o Logici: && || • Con le parentesi possiamo modificare l'ordine di valutazione dei termini Programmazione - Paolo Valente, 2008/2009 28
  • 29. Sintesi priorità degli operatori Fattori ! ++ -- * / % + - > >= < <= Termini == != && || ?: Assegnamento = Programmazione - Paolo Valente, 2008/2009 29
  • 30. Espressioni • Esempi: Espressioni aritmetiche 2+3 (2 + 3) * 5 Fattori 4>2 Termini true || (2 > 5) Espressioni logiche Programmazione - Paolo Valente, 2008/2009 30
  • 31. Programmazione strutturata Programmazione - Paolo Valente, 2008/2009 31
  • 32. Programmazione “strutturata” • Si parla di programmazione strutturata se si utilizzano solo le seguenti strutture per alterare il flusso di controllo [Dijkstra, 1969]: – concatenazione (o composizione) legata al concetto di enumerazione (sequenza) – selezione o (istruzione condizionale) ramifica il flusso di controllo in base al valore vero o falso di una espressione detta “condizione di scelta” – iterazione dà luogo all’esecuzione ripetuta di un’istruzione (semplice o composta) finché permane vera una espressione detta “condizione di iterazione” • OBIETTIVO: rendere i programmi più leggibili, modificabili e manutenibili Programmazione - Paolo Valente, 2008/2009 32
  • 33. Teorema di Jacopini-Böem Le strutture di concatenazione, iterazione e selezione costituiscono un insieme completo in grado di esprimere tutte le funzioni calcolabili • Dunque, l’uso di queste sole strutture di controllo non limita il potere espressivo. P.es., un linguaggio con i seguenti Tipi di dato: Naturali con l’operazione di somma (+) Istruzioni: assegnamento istruzione composta istruzione condizionale istruzione di iterazione è un linguaggio completo, cioè è un linguaggio in grado di esprimere tutte le funzioni calcolabili. Programmazione - Paolo Valente, 2008/2009 33
  • 34. Programmazione “strutturata” in C/C++ • Istruzioni composte – concatenazione di istruzioni “semplici” all'interno di un blocco  { }   • Istruzioni espressione – esempio: assegnamento  =   • Istruzioni condizionali – alternativa  if (), if () else – selezione  switch ()   • Istruzioni di iterazione – ciclo  while (), do while (), for ( ; ; ) Programmazione - Paolo Valente, 2008/2009 34
  • 35. Istruzioni Condizionali Programmazione - Paolo Valente, 2008/2009 35
  • 36. Istruzioni condizionali Solitamente vengono rese disponibili due tipi di istruzioni condizionali: • Istruzione di SCELTA (semplice) o ALTERNATIVA • Istruzione di SCELTA MULTIPLA (questa non è essenziale, ma migliora l’espressività del linguaggio) Programmazione - Paolo Valente, 2008/2009 36
  • 37. Istruzione di scelta semplice (o Alternativa) • Consente di scegliere fra due istruzioni alternative in base al verificarsi di una particolare condizione <istruzione-di-scelta> ::= if (condizione) < istruzione1> [ else < istruzione2> ] Opzionale • Condizione è un’espressione logica che viene valutata al momento dell’esecuzione dell’istruzione if • Se condizione risulta vera si esegue <istruzione1>, altrimenti si esegue <istruzione2> In entrambi i casi l’esecuzione continua poi con l’istruzione che segue • l’istruzione if. NOTA: Se condizione è falsa e la parte else (opzionale) è omessa, si passa subito all’istruzione che segue l’istruzione if Programmazione - Paolo Valente, 2008/2009 37
  • 38. Le due istruzioni di scelta semplice if (condizione) istruzione1; if (condizione) istruzione1; if (condizione) istruzione1; else istruzione2; if (condizione) istruzione1; else istruzione2; Programmazione - Paolo Valente, 2008/2009 38
  • 39. Esempio int a=3, n=-6, b=0; if (n > 0) a = b + 5; else n = b*5; ------------------ a? b? n? Programmazione - Paolo Valente, 2008/2009 39
  • 40. Problema • E se vogliamo eseguire più di una istruzione in uno dei due rami o in entrambi? • Esempio: if (condizione) <varie istruzioni> else <varie istruzioni> Programmazione - Paolo Valente, 2008/2009 40
  • 41. Istruzioni Composte Programmazione - Paolo Valente, 2008/2009 41
  • 42. Istruzione composta • Sequenza di istruzioni racchiuse tra parentesi graffe { <istruzione1> <istruzione2> ... } • E' un caso particolare di blocco • Ovunque la sintassi preveda una istruzione si può inserire una istruzione composta • Ai fini della sintassi e della semantica è trattata come una istruzione singola • L'esecuzione di una istruzione composta implica l'esecuzione ordinata di tutte le istruzioni della sequenza Programmazione - Paolo Valente, 2008/2009 42
  • 43. Istruzioni Condizionali Seconda parte Programmazione - Paolo Valente, 2008/2009 43
  • 44. Forma completa if (condizione) <istruzione-ramo-if> [else <istruzione-ramo-else>] • istruzione può essere qualsiasi istruzione, ovvero espressione, condizionale, iterativa, composta (blocco di istruzioni) • Le istruzioni da eseguire sono spesso chiamate anche corpo del ramo if o corpo del ramo else, rispettivamente Programmazione - Paolo Valente, 2008/2009 44
  • 45. Esempio • Qualora occorra specificare più istruzioni, si dovrà quindi utilizzare un blocco if (n > 0) { /* inizio blocco */ a = b + 5; c = x + a - b; } /* fine blocco */ else n = b*5; Programmazione - Paolo Valente, 2008/2009 45
  • 46. Osservazione 2 Istruzioni if annidate • Come caso particolare, <istruzione-ramo-if> o <istruzione-ramo-else> potrebbero essere un’altra <istruzione-di-scelta> • In questo caso occorre attenzione ad associare i rami else (che sono opzionali) all’if corretto In base alla sintassi del linguaggio C/C++, il un ramo else è sempre associato all’if più interno (vicino) Se questa non è l'associazione desiderata, occorre inserire esplicitamente un blocco { } Programmazione - Paolo Valente, 2008/2009 46
  • 47. Osservazione 2 (cont.) if (n > 0) ? if (a>b) n = a; else n = b*5; /* else riferito a if (a>b) */ Per far sì che l’else si riferisca al primo if: if (n > 0) { if (a>b) n = a; } else n = b*5; Per leggibilità, si possono usare le parentesi anche nell'altro caso: if (n > 0) { if (a>b) n = a; else n = b*5; } Programmazione - Paolo Valente, 2008/2009 47
  • 48. Istruzione di scelta multipla: switch • Consente di scegliere fra molti casi in base al valore di un’espressione di selezione Programmazione - Paolo Valente, 2008/2009 48
  • 49. Istruzione di scelta multipla (sintassi e semantica) 1/2 <istruzione-di-scelta-multipla> ::= switch (espressione di selezione) { case <etichetta1> : <sequenza_istruzioni1> [ break; ] case <etichetta2> : <sequenza_istruzioni2> [ break; ] … [ default : < sequenza_istruzioniN> ] } espressione di selezione è un’espressione che restituisce un valore numerabile (intero, carattere, enumerato, …), e viene valutata al momento dell’esecuzione dell’istruzione switch   Le etichette <etichetta1>, <etichetta2> ... devono essere delle costanti dello stesso tipo dell'espressione di selezione Programmazione - Paolo Valente, 2008/2009 49
  • 50. Istruzione di scelta multipla (sintassi e semantica) 2/2 • Definiamo corpo dell'istruzione switch, la parte del costrutto compresa tra le parentesi graffe • Il valore dell'espressione di selezione viene confrontato con le costanti che etichettano i vari casi: l’esecuzione salta al ramo dell’etichetta corrispondente (se esiste) – L'esecuzione prosegue poi sequenzialmente fino alla fine del corpo dell'istruzione switch – A meno che non si incontri un'istruzione break, nel qual caso si esce dal blocco • Se nessuna etichetta corrisponde al valore dell’espressione, si salta al ramo default (se specificato) – Se non esiste, l’esecuzione prosegue con l’istruzione successiva all’istruzione switch Programmazione - Paolo Valente, 2008/2009 50
  • 51. Diagramma di flusso espressione di selezione caso A break sequenza_istruzioni1 break caso B sequenza_istruzioni2 break … default sequenza_istruzioniN Programmazione - Paolo Valente, 2008/2009 51
  • 52. Esempio int a, n; cin>>a>>n; switch (n) { case 1: cout<<”Ramo A”<<endl; break; case 2: cout<<”Ramo B”<<endl; a = a*a; break; case 3: cout<<”Ramo C”<<endl; a = a*a*a; break; default: a=1; } cout<<a<<endl; Programmazione - Paolo Valente, 2008/2009 52
  • 53. Osservazioni • <sequenza_istruzioni> denota una sequenza di istruzioni per cui non è necessario un blocco per specificare più istruzioni • I vari rami non sono mutuamente esclusivi: una volta imboccato un ramo, l’esecuzione prosegue in generale con le istruzioni dei rami successivi – Per avere rami mutuamente esclusivi occorre forzare esplicitamente l’uscita mediante l’istruzione break Programmazione - Paolo Valente, 2008/2009 53
  • 54. Esempio int a, n, b = 1; cin>>a>>n; switch (2 - n) { case 0: b *= a; case 1: b *= a; case 2: break; default: cout<<”Valore non valido per nn” ; } cout<<b<<endl; Programmazione - Paolo Valente, 2008/2009 54
  • 55. Pro e contro della scelta multipla • L’istruzione switch garantisce maggiore leggibilità rispetto all'if quando c'è da scegliere tra più di due alternative • Altrimenti è ovviamente un costrutto più ingombrante • Limitazioni: – è utilizzabile solo con espressioni ed etichette di tipo numerabile (intero, carattere, enumerato, ...) – non è utilizzabile con numeri reali (float, double) o con tipi strutturati (stringhe, vettori, strutture...) Programmazione - Paolo Valente, 2008/2009 55