Cicli
Ci sono almeno tre modi diversi per costruire un ciclo in C e occorre utilizzare quello che meglio si adatta alle esigenze del problema che si vuole risolvere. while (espressione) istruzione; do istruzione; while (espressione); Il ciclo do...while corrisponde al ciclo repeat...until del Pascal. Cicli for (variabile di controllo= espressione iniziale; condizione di ciclo; legge di incremento) istruzione; I cicli possono essere uno dentro l’altro (nidificazione). L’esecuzione di un break interrompe il ciclo più interno ma non gli altri.
esegue l’istruzione finché il valore della condizione è true ( vera ), appena quel valore diventa false ( falso ) esce dal ciclo. Esempio - Calcola il fattoriale di n #include main () { int i,n,fatto; printf("Calcolo del fattoriale di un numero utilizzando il ciclo WHILE \n\n\n"); printf("Inserire un numero per calcolare il fattoriale "); scanf("%d", &n); printf(" \n "); /*ISTRUZIONE PER LASCIARE UNA RIGA VUOTA NELLA FINESTRA DEL PROGRAMMA*/ i=1; fatto=1; while ( i<=n ) { fatto=fatto*i; i=i+1; } printf(" il fattoriale di %d ",n); printf(" risulta essere %d ",fatto); printf(" \n\n\n");/*ISTRUZIONE PER LASCIARE UNA RIGA VUOTA NELLA FINESTRA DEL PROGRAMMA*/ system("PAUSE"); return 0; } Ciclo While while (condizione) istruzione;
Il ciclo do...while corrisponde al ciclo repeat...until del Pascal. Ripete le istruzioni finché il valore della condizione è true. Poiché l’istruzione viene eseguita prima della valutazione della espressione, il ciclo viene eseguito almeno una volta. Esempio – Calcolo del fattoriale con do..while #include #include main () { int i,n,fatto; printf("Calcolo del fattoriale di un numero utilizzando il ciclo DO.. WHILE \n\n\n"); printf("Inserire un numero per calcolare il fattoriale "); scanf("%d", &n); printf(" \n "); /*ISTRUZIONE PER LASCIARE UNA RIGA VUOTA NELLA FINESTRA DEL PROGRAMMA*/ i=1; do { fatto=fatto*i; i=i+1; } while ( i<=n ) ; printf(" il fattoriale di %d ",n); printf(" risulta essere %d ",fatto); printf(" \n\n\n");/*ISTRUZIONE PER LASCIARE UNA RIGA VUOTA NELLA FINESTRA DEL PROGRAMMA*/ system("PAUSE"); return 0; } do istruzione; while (condizione);
In C e C++ il ciclo for è molto flessibile. - Può semplicemente eseguire le istruzioni all’interno del ciclo al variare della variabile di controllo tra un valore iniziale ed un valore finale - può eseguirle fino a che non si verifica una condizione di uscita (NOT(condizione di ciclo)). - il valore iniziale ed il valore finale sono variabili interi, -devono soddisfare le condizioni seguenti: valore iniziale > valore finale se la variabile di controllo decresce nel ciclo al contrario se deve crescere. -E’ obbligatorio specificare l’incremento della variabile di controllo. for (variabile di controllo=espressione iniziale; condizione di ciclo; legge di incremento) istruzione; Esempio – Calcolo del fattoriale con for( ) #include main () { int i,n,fatto; printf("Calcolo del fattoriale di un numero utilizzando il ciclo FOR \n\n\n"); printf("Inserire un numero per calcolare il fattoriale "); scanf("%d", &n); printf(" \n "); /*ISTRUZIONE PER LASCIARE UNA RIGA VUOTA NELLA FINESTRA DEL PROGRAMMA*/ for (i=1;i<=n;i++) { fatto=fatto*i; } printf(" il fattoriale di %d ",n); printf(" risulta essere %d ",fatto); printf(" \n\n\n");/*ISTRUZIONE PER LASCIARE UNA RIGA VUOTA NELLA FINESTRA DEL PROGRAMMA*/ system("PAUSE"); return 0; }
int Il tipo int serve a rappresentare l’insieme dei numeri interi, per intenderci “senza virgola”, positivi e negativi (1, 2, 43, -89, 4324). Storicamente i compilatori rappresentavano gli interi con 16bit (valori compresi tra e ) questo perché gli indirizzamenti erano a 16bit, ma attualmente quasi ovunque troviamo gli interi codificati da 32bit (valori compresi tra e ), in alcuni casi si sta passando anche agli interi da 64bit. Ad arricchire la varietà di tipi numerici interi, troviamo i qualificatori unsigned, short e long, (“senza segno”, “corto” e “lungo”) che modificano alcune caratteristiche dei tipi fondamentali, char e int. float e double – i numeri in virgola mobile I valori in virgola mobile sono utilizzati per rappresentare i numeri reali (quindi anche decimali e numeri molto grandi). Questi numeri sono rappresentati da una parte intera ed una parte frazionale. I numeri in virgola mobile richiedono una maggiore precisione rispetto agli interi e sono quindi normalmente rappresentati da 32 bit. Il loro intervallo varia, perciò, tra 3,4 x e 3,4 x (con 7 cifre significative). I valori double in virgola mobile sono valori molto estesi che normalmente occupano 64 bit (o 8 byte) e possono avere, quindi, un valore compreso fra ! 1,7 x e 1,7 x (con 15 cifre significative). I valori long double sono ancora più precisi e normalmente occupano 80 bit (o 10 byte). Il loro valore è compreso fra ! 1,18 x e 1,18 x (con ben 19 cifre significative). La base dell’esponente può variare a seconda del compilatore e della macchina fisica (il microprocessore) che eseguirà il codice.
L'aritmetica modulare detta aritmetica dell'orologio poiché su tale principio si basa il calcolo delle ore a cicli di 12 o 24 rappresenta un importante ramo della matematica L’orologio di Gauss Circa duecento anni fa, K.F.Gauss introdusse i concetti base dell’aritmetica modulare. Se la lancetta delle ore di un orologio punta sulle due: 12 ore dopo, la lancetta punta sempre sulle 2 (abbiamo fatto un giro completo). Quindi aggiungere 12 non cambia niente al numero delle ore: = 2. I matematici, per indicare che stanno contando le ore su un orologio a 12 ore, scrivono: = 2 ( mod 12) oppure ≡ 2( mod 12 ) (da ora in poi useremo questa seconda notazione). Anzi, se facciamo un numero qualsiasi, n, di giri, la lancetta punterà sempre sulle 2: n ≡ 2(mod 12) Invece 14 ore dopo la lancetta punterà sulle 4: Strano però perchè: = 16 e non 4?! In realtà non è cosi strano perchè: = 2 + (2 + 12) = (2 + 2) + 12 = = 4 (mod 12) 47 = = 11 ( mod12)
Nell'elaboratore, oltre che di aritmetica finita, si parla anche di aritmetica modulare in cui i numeri interi «si avvolgono su se stessi» e si possono rappresentare su una circonferenza anziché sulla usuale retta infinita. Notiamo infatti che se si dedicano sedici bit alla rappresentazione dei valori interi si ha un intervallo di valori compreso tra e ma, al di fuori di esso non c'è il «vuoto» in quanto, essendo i valori disposti su una circonferenza, dopo il valore si troverà il valore , poi e così via. Aumentando il numero di bit a disposizione si amplia ovviamente l'intervallo dei valori rappresentabili: con trentadue bit (valori interi per il linguaggio c) si va da a ; rimane però valido il concetto di disposizione «circolare» di tali valori.
Nella storia dell'informatica c'è stato un periodo in cui ogni grande azienda proponeva il suo metodo di rappresentazione dei valori reali in virgola mobile senza curarsi dei problemi di compatibilità dei dati. Per porre fine alla proliferazione dei formati di rappresentazione fu proposto uno standard dallo IEEE (Institute of Electrical and Electronics Engineers) denominato IEEE 754 o Standard for Binary Floating-Point Arithmetic. Lo standard definisce tre formati: singola precisione (single precision) con utilizzo di 32 bit; doppia precisione (double precision) con utilizzo di 64 bit; precisione estesa (extended precision) con utilizzo di 80 bit. La precisione estesa è comunque usata solo internamente alle unità di calcolo FPU (Floating Point Unit) e non viene messa a disposizione per la definizione dei dati da parte dei linguaggi di programmazione. In tutti e tre i formati le informazioni che vengono gestite per memorizzare i valori reali sono: segno del numero; mantissa del numero; caratteristica del numero.
Dichiarazione di variabili Il C++ richiede tassativamente che ogni variabile prima di essere utilizzata dal programma venga preventivamente dichiarata. La dichiarazione avviene semplicemente indicando il tipo dell’identificatore in oggetto seguito da uno o più identificatori di variabile, separati da una virgola e seguiti dal punto e virgola al termine della dichiarazione stessa. Per esempio per definire le variabili a e b di tipo float basta indicare: float a,b; Oppure per le variabili c e d di tipo int : int c,d; È importante sottolineare il fatto che una variabile può essere dichiarata soltanto una volta e di un solo tipo all’interno dell’intervallo di azione della variabile stessa. È possibile inizializzare una variabile, cioè assegnare alla stessa un valore contemporaneamente alla sua dichiarazione; ad esempio è consentita la dichiarazione: float a, b = 4.6; char ch = 't'; che corrisponde a scrivere: cioè ad a non verrebbe per il momento assegnato alcun valore mentre b avrebbe inizialmente il valore 4,6 e ch avrebbe il carattere ‘ t’
Alcuni comandi in C \n Newline posiziona il cursore all’inizio della riga successiva \t Tabulazione orizzontale Muove il cursore alla tabulazione successiva \a Allarme Fa suonare il cicalino del sistema \\ Blackslash Inserisce un carattere blackslah in una stringa %d serve a scrivere un numero intero come decimale all’interno di un printf %05d in printf scrive il numero su 5 spazi quelli non occupati dal numero vengono occupati da 0. Ad esempio printf(‘’ numero 1 %05d «,89) il programma restituisce %5.2f in printf scrive il numero su un massimo di 5 spazi per la parte intera (senza riempire con 0 come nel comando precedente quelli vuoti ) con 2 cifre decimali dopo la virgola. Ad esempio printf( ‘’ float %5.5f.’’,3,14) in C lo scrive