Cicli
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.
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.
Ciclo While
while (condizione)
istruzione;
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 <stdlib.h>
#include <stdio.h>
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;
}
do istruzione; while (condizione);
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 <stdlib.h>
#include <stdio.h>
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;
}
for (variabile di controllo=espressione iniziale; condizione di ciclo; legge di incremento) istruzione;
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.
Esempio – Calcolo del fattoriale con for( )
#include <stdlib.h>
#include <stdio.h>
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 32768 e 32767) questo perché gli indirizzamenti erano a 16bit, ma attualmente quasi ovunque
troviamo gli interi codificati da 32bit (valori compresi tra-2.147.483.648 e 2.147.483.647), 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 10-38e 3,4 x 1038
(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 10-308 e 1,7 x 10308 (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 10-4932 e 1,18 x 104932
(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 + 12 = 2.
I matematici, per indicare che stanno contando le ore su un orologio
a 12 ore, scrivono: 2 + 12 = 2 ( mod 12) oppure 2 + 12 ≡ 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:
2 + 12n ≡ 2(mod 12)
Invece 14 ore dopo la lancetta punterà sulle 4: Strano però perchè: 2 + 14 = 16 e non 4?!
In realtà non è cosi strano perchè:
2 + 14 = 2 + (2 + 12) = (2 + 2) + 12 = 4 + 12 = 4 (mod 12)
47 = 11 + 12 + 12 +12 = 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 -32.768 e +32.767 ma, al di
fuori di esso non c'è il «vuoto» in quanto, essendo i valori disposti su una
circonferenza, dopo il valore 32.767 si troverà il valore -32.768, poi -32.767 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 -2.147.483.648 a 2.147.483.647; 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
\t Tabulazione orizzontale
\a Allarme
\\ Blackslash
posiziona il cursore all’inizio della riga successiva
Muove il cursore alla tabulazione successiva
Fa suonare il cicalino del sistema
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 00089
%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 3.14000
Scarica

2 presentazione