I Dati i tipi di.dati possono essere classificati in: tipi semplici o elementari tipi strutturati al cui interno vi è un’aggregazione di dati; ogni linguaggio di programmazione mette a disposizione un set di tipi di dati le cui proprietà e struttura sono definite da esso: essi prendono il nome di tipi di dati predefiniti, ma lascia anche l’opportunità al programmatore di definirne altri che prendono il nome di dati definiti dall’utente Il tipo intero Rappresenta un sottoinsieme dell’insieme Z dei numeri relativi la cui estensione è determinata dal numero dei bit (N) che il linguaggio mette a disposizione per rappresentarlo secondo la regola -2N-1, +2N-1 con un bit riservato al segno. Qualora il risultato di un’operazione esce fuori da questo intervallo si genera un errore di overflow o underflow. Un altro errore che si può verificare è la divisione by 0. questi errori che si possono verificare durante l’esecuzione di un programma vengono segnalati come errori di run-time. Il tipo intero Le operazioni che si possono eseguire su questi dati sono le quattro operazioni algebriche la cui divisione deve dare risultato intero (10/4=2) con l’accorgimento di evitare una divisione per 0. Essi permettono anche l’aritmetica modulare che rappresenta il resto delle divisione intera. Le operazioni di confronto sono comuni a tutti i tipi di dati il cui dominio è totalmente ordinato e sono >, >=, <,<=, = e != che indica il diverso o not=. Il risultato delle operazioni di confronto è un valore vero o falso. Il tipo reale Il tipo reale è rappresentato in virgola mobile dove una serie di bit sono destinati alla mantissa che rappresenta le cifre che compongono il numero e una parte destinata all’esponente che determina la posizione della virgola se N sono i bit destinati alla mantissa e M quelli per l’esponente il loro range sarà -2N-1*10 -exp, +2N-1*10 –exp dove exp vale 2M-1. Con i dati di tipo reale si possono effettuare tutte le operazioni degli interi tranne la divisione intera che diventa decimale e il modulo. Ma si allarga ad esso tutte le operazioni di potenza, esponente, e si definiscono tutte le funzioni matematiche che hanno per dominio e condominio i valori reali. Anche in questo insieme sono definite le operazioni di confronto e gli errori di run-time degli interi. Il tipo carattere Rappresentano tutti i caratteri disponibili nel computer. Su di essi si possono effettuare le operazioni di confronto, essendo un insieme totalmente ordinato. Ma quale valore essi assumono? Assumono tutti i valori definiti nel codice ASCII, il quale ad ogni carattere fa corrispondere un valore numerico Per distinguere il carattere 1 dal numero 1 i caratteri vano racchiusi tra apici cosi ‘1’ è il carattere che è diverso dal valore intero o numerico 1. Del resto con il simbolo a si intende una variabile che può contiene la lettera ‘a’. Va anche sottolineato che ‘a’ è diversa da’A’, infatti il loro codice differisce di un valore di 32 (97 la prima, 65 la seconda). Il tipo booleano Le variabili booleane possono assumere due soli valori costanti: vero o falso; questi tipi di dati sono importanti nella definizione delle condizioni e dei risultati dei confronti. Le operazioni che si possono effettuare sono l’or, l’and e il not: l’operatore not nega il valore di verità dell’operando su cui agisce. L’operatore or richiede due operandi e dà come risultato vero se almeno una dei due operandi è vero L’operatore and richiede due operandi e dà come risultato vero se entrambi gli operandi sono veri. Le istruzioni • La sequenza • La selezione • L’iterazione La sequenza Lettura cin>>a; Scrittura cout<<“questo è un messaggio” Assegnamento a=3; a=b; a=b+4; Incremento a++; a--; a=a+b; Richiamo di funzioni a=sqrt(b); Richiamo di procedure line(3,3,10,10); La selezione Binaria Permette di modificare il flusso dell’algoritmo tra due possibili vie: Una relativa al verificarsi della condizione testata e l’altra al caso falso Multipla Permette di modificare il flusso dell’algoritmo tra diverse possibili alternative ognuna relativa ad un valore dell’espressione che si valuta: La selezione Binaria if (condizione) { blocco_istruzione_caso_vero } else { blocco_istruzione_caso_falso } La selezione Binaria La condizione è un’espressione booleana a==b a!=b a>b && a<c a<b ||a>=c La selezione Binaria Il ramo della condizione falsa (caso else) è opzionale E può avere la seguente sintassi if (condizione) { blocco_istruzione_caso_vero } La selezione Binaria il blocco istruzione contiene istruzioni in sequenza e può contenere al suo interno un’altra istruzione di selezione: Infatti il blocco di selezione è considerato un’unica istruzione if (condizione) { if (condizione) { blocco_istruzione_caso_vero } else { blocco_istruzione_caso_falso } } else { blocco_istruzione_caso_falso } La selezione multipla Permette di modificare il flusso dell’algoritmo tra diverse possibili alternative ognuna relativa ad un valore dell’espressione che si valuta: La selezione multipla Ha la seguente sintassi: Switch (espressione){ Case 1:{ blocco_istruzione_caso_1 } break; Case 2:{ blocco_istruzione_caso_2 } break ; Case 3:{ blocco_istruzione_caso_3 } break; Default { blocco_istruzione } } La selezione multipla Come si nota a differenza della selezione binaria non si valuta una condizione, ma un’espressione che può assumere diversi valori di tipo numerico, carattere o di valori costanti Il caso default è opzionale L’iterazione Con controllo in testa while Con controllo in coda do.. while Con contatore for L’iterazione while La sintassi è la seguente: while (condizione) { blocco istruzione } Il blocco di istruzione viene ripetuto fino a quando la condizione risulta vera Quante volte viene ripetuto il ciclo? L’iterazione while Quante volte viene ripetuto il ciclo? Questo dipende da come viene espressa la condizione e la modalità di modificarne il valore di verità Vi sono dei cicli che non vengono mai eseguiti nel caso la condizione risulta falsa al primo test Esempio Int a=0 While (a<0) { cout <<a; } L’iterazione while Quante volte viene ripetuto il ciclo? Vi sono dei cicli che non terminano mai nel caso la condizione risulta sempre vera Esempio Int a=0; While (a==0) { cout <<a; } L’iterazione while Quante volte viene ripetuto il ciclo? Vi sono dei cicli di cui possiamo dire quante volte vengono eseguiti nel caso la condizione ha un valore iniziale e un valore finale Esempio Int a=0; While (a<10) { cout <<a; a++; } Il ciclo verrà eseguito esattamente 10 volte L’iterazione while Quante volte viene ripetuto il ciclo? Vi sono dei cicli che non possiamo prevedere quante volte vengono eseguiti nel caso la condizione diventa falsa al verificarsi di un certo evento che non possiamo prevedere Esempio while(!kbhit()); Int ,n,a=0; While (a<100) { cin>>n; a=a+n; } cout<<a; L’iterazione do… while Viene definito con controllo in coda perché prima esegue il blocco di istruzione e poi valuta se lo deve ripetere: La sintassi è la seguente: do { blocco _struzione } while (condizione); Il blocco di istruzione viene ripetuto fino a quando la condizione risulta vera Quante volte viene ripetuto il ciclo? la risposta è almeno una volta Il numero preciso dipende da come viene posta la condizione secondo i criteri visti per il While Con il do…while non si può implementare il caso che il ciclo non venga mai eseguito. L’iterazione In realtà si può affermare che ogni ciclo while si può tradurre in un ciclo do..while e viceversa, con opportuni accorgimenti Vediamo alcuni esempi: L’iterazione Int a=0; While (a<10) { cout <<a; a++; } Int a=0; do { cout <<a; a++; } While (a<10); L’iterazione: un uso particolare costruire menù di scelta: bool continua = true; int scelta; int main(){ do{ cout<<“inserire un numero tra 1 e 3 , 0 per terminare” cin>>scelta; switch(scelta){ case 1: cout<<endl<<“hai premuto 1”; break; case 2: cout<<endl<<“hai premuto 2”; break; case 3: cout<<endl<<“hai premuto 3”; break; case 0: continua = false; break; default cout<<endl<<“scelta errata”; } //fine switch } while (continua); return 0; } // fine main L’iterazione for Detto anche ciclo con contatore Si utilizza quando è noto il numero delle volte che si vuole eseguire il ciclo La sintassi è la seguente: for (contatore = valore_iniziale; condizione_di_uscita; incermento/decremento ) { blocco istruzione } L’iterazione for Contatore = valore_iniziale Vuol dire che devo attribuire alla variabile che funge da contatore del ciclo un valore iniziale Es cont=0; cont=1; cont=1000; cont=-30; L’iterazione for Condizione di uscita Esprime la condizione di uscita del ciclo, cioè il valore finale che deve assumere la variabile contatore Es cont<100; cont<=100; cont>0; cont>=1; cont>= -10; cont <-100: L’iterazione for Incremento/decremento Indica ad ogni ciclo di quanto (il passo) la variabile contatore deve essere incrementata o decrementata. Di solito il passo è unitario E si incrementa quando il valore iniziale della variabile contatore è minore del valore finale, altrimenti si decrementa Esempi for(cont=0; cont<100; cont++) //cont è di tipo int { } for(cont=10; cont>0; cont--) { } for(cont=0; cont<100; cont+=2) { } for(cont=0; cont<100; cont+=0.20) // cont è di tipo float { } L’iterazione for Il ciclo for può essere tradotto nel while e viceversa? La risposta è si Vediamo alcuni esempi Int a=10; while (a>0) { cout <<a; a--; } for (int a=10; a>0; a--) cout<<a; L’iterazione for Il ciclo for può essere tradotto nel while e viceversa? La risposta è si Vediamo alcuni esempi char c=‘a’; while (c<=‘z’) { cout <<c; c++; } for (char c=‘a’; c<=‘z’; c++) cout<<c<<“ “; L’iterazione for Anche questo costrutto si può nidificare vediamo il codice che calcola e stampa a video la tavola pitagorica for (i=1;i<=10;i++){ for (j=1;J<=10;j++) cout<<i*j<<“ “; cout<<endl; } Esercizio Scrivere un programma C++ che permette di scegliere una delle seguenti funzionalità 1. Visualizzare i primi n numeri 2. Visualizzare i primi n numeri pari 3. Visualizzare i primi n numeri dispari 4. Visualizzare i primi n numeri primi 5. Visualizzare i primi n numeri della serie di Fibonacci 6. Dato in input n calcolare n! 7. Dato in input n stampare le prime n righe del triangolo di Tartaglia Il compito deve essere consegnato non oltre la prima ora di lunedì 7 maggio Indicazioni e suggerimenti per lo svolgimento Nelle pagine successive Indicazioni Il programma deve essere realizzato con l’uso di: Selezione multipla e deve contenere un ciclo continuo fino a quando l’utente decide di uscire dal programma Ogni caso di scelta deve essere realizzato con un sottoprogramma Ogni caso deve essere realizzato con il ciclo for Suggerimenti Serie di Fibonacci 0 1 1 2 3 5 8 13…… n! è il fattoriale di n esso assume i seguenti valori se n=0 fatt(n)=1 Altrimenti fatt(n(= n*n-1*n-2* *2*1 cioè è il prodotto dei numeri da 1 a n Triangolo di Tartaglia Ogni elemento è dato da j!/(k!*(j-k)! Con J che va da 0 a n dove n è il numero delle righe e k va da 0 a j