Pillola n.2 C++

La manipolazione dei dati in C++ – Pillola 2

Nella lezione precedente abbiamo visto che la gestione dell’Input Output è delegata alla libreria iostream la quale mette a disposizione del programmatore le istruzioni cin e cout. Ora tali istruzioni sebbene utili non consentono la formattazione dell’Input e dell’Output.

Ad esempio se il risultato di una divisione fra due numeri ha un numero elevato di cifre decimali come fare per troncare ad un numero di cifre voluto il numero ?

Dobbiamo innanzitutto ricordare che i numeri reali in singola e doppia precisione in C++ sono dichiarati con float e double che la rappresentazione nel calcolatore dei numeri reali avviene in virgola mobile ovvero scrivendo il numero in notazione scientifica normalizzata.

Ad esempio il numero x=-432,334441 in notazione normalizzata si esprime come x=-0,432334441 x10E3.

Quindi il numero si compone di una mantissa parte frazionaria compressa fra 0 e 1 e da una caratteristica esponente della base 10.

Il C++ calcola e visualizza i risultati in forma scientifica. E’ opportuno richiamare prima delle funzioni per il passaggio di un numero in rappresentazione in virgola mobile a virgola fissa.Per far questo negli header del programma si deve richiamare la libreria iomanip che aggiunge nuove caratteristiche alle istruzioni cin e cout e non solo per la manipolazione dei numeri ma anche delle stringhe. Ora per passare alla rappresentazione in virgola fissa si utilizza la parola riservata fixed e per impostare il numero di cifre decimale.Il tutto deve precedere la stampa del numero nell’istruzione cout in quanto deve preparare il formato opportuno.

In altri termini tornando al numero x si ha che per stamparlo con tre cifre decimali avrò:

cout << fixed << setprecision(3) << x;

Quindi l’istruzione fixed passa alla rappresentazione in virgola fissa, mentre l’istruzione setprecision imposta il numero di cifre decimali.

Un modo alternativo ma del tutto equivalente è scrivere:

cout << setioflags(ios::fixed) << setprecision(3) << x;

La manipolazione dei dati in C++ Nella lezione precedente abbiamo visto che la gestione dell’Input Output è delegata alla libreria iostream la quale mette a disposizione del programmatore le istruzioni cin e cout. Ora tali istruzioni sebbene utili non consentono la formattazione dell’Input e dell’Output.

Ad esempio se il risultato di una divisione fra due numeri ha un numero elevato di cifre decimali come fare per troncare ad un numero di cifre voluto il numero ?

Dobbiamo innanzitutto ricordare che i numeri reali in singola e doppia precisione in C++ sono dichiarati con float e double che la rappresentazione nel calcolatore dei numeri reali avviene in virgola mobile ovvero scrivendo il numero in notazione scientifica normalizzata.

Ad esempio il numero x=-432,334441 in notazione normalizzata si esprime come x=-0,432334441 x10E3. Quindi il numero si compone di una mantissa parte frazionaria compressa fra 0 e 1 e da una caratteristica esponente della base 10. Il C++ calcola e visualizza i risultati in forma scientifica. E’ opportuno richiamare prima delle funzioni per il passaggio di un numero in rappresentazione in virgola mobile a virgola fissa. Per far questo negli header del programma si deve richiamare la libreria iomanip che aggiunge nuove caratteristiche alle istruzioni cin e cout e non solo per la manipolazione dei numeri ma anche delle stringhe. Ora per passare alla rappresentazione in virgola fissa si utilizza la parola riservata fixed e per impostare il numero di cifre decimale.

Il tutto deve precedere la stampa del numero nell’istruzione cout in quanto deve preparare il formato opportuno. In altri termini tornando al numero x si ha che per stamparlo con tre cifre decimali avrò:

cout << fixed << setprecision(3) << x;

Quindi l’istruzione fixed passa alla rappresentazione in virgola fissa, mentre l’istruzione setprecision imposta il numero di cifre decimali.

Un modo alternativo ma del tutto equivalente è scrivere:

cout << setioflags(ios::fixed) << setprecision(3) << x;

Una scrittura invece del tipo:

cout << setioflags(ios::floatfield) << setprecision(3) << x

arrotonda il numero su tre cifre complessive.

Per finire un listato C++ per verificare le varie possibilità:

L’output del problema:

inserisci il numero x
10.1121321313
inserisci il numero di cifre decimali
5
Numero a p cifre inclusi i decimali
10.11213
0x1.4396961f9874fp+3
10.1121

#include <iostream>
#include <iomanip>
using namespace std;
int main (){
double x;
int p;
cout << "inserisci il numero x" << endl;
cin >> x;
cout << "inserisci il numero di cifre decimali "<<endl;
cin >> p; cout << endl;
cout << "Numero a p cifre inclusi i decimali"<<endl;
cout << setiosflags(ios::fixed) << setprecision(p)<< x << endl;
cout << setiosflags(ios::floatfield) << setprecision(p) << x << endl;
cout << fixed << setprecision(4) << x << endl;
return 0;
}


alcune annotazioni il primo output è un numero con 5 cifre dopo la virgola come indicato nella nostra richiesta di input, il secondo p un numero in virgola fissa in notazione scientifica normalizzata, il terzo è lo stesso numero solo con quattro cifre dopo la virgola.

Per finire un listato C++ per verificare le varie possibilità:

#include <iostream>
#include <iomanip>
using namespace std;int main (){
double x;
int p;
cout << "inserisci il numero x" << endl;
cin >> x;
cout << "inserisci il numero di cifre decimali "<<endl;
cin >> p; cout << endl;
cout << "Numero a p cifre inclusi i decimali"<<endl;
cout << setiosflags(ios::fixed) << setprecision(p)<< x << endl;
cout << setiosflags(ios::floatfield) << setprecision(p) << x << endl;
cout << fixed << setprecision(4) << x << endl;
retrun 0;}

Quale sarà l’output del seguente programma ? Svolgere per esercizio la codifica citata.