C++ - Risorse gratuite :: programmi,esercizi,visual,dev,compilatori,esempi,classi,strutture,liste,array,funzioni,C,java :: Leggi il Topic - Da numero decimale a frazione corrispondente
 FAQFAQ   CercaCerca   Lista degli utentiLista degli utenti   RegistratiRegistrati   ProfiloProfilo   Messaggi PrivatiMessaggi Privati   LoginLogin 

Da numero decimale a frazione corrispondente
Nuovo Topic   Rispondi    Indice del forum -> Aiuto - C++
Pagina 1 di 1
Precedente :: Successivo  
Autore Messaggio
Mefistofele
Nuovo membro



Messaggi: 10
Località: Bergamo

MessaggioInviato: Martedì 27 Aprile 2004    Oggetto:
Rispondi citando

Allora ne approfitto Dancing

#include <iostream.h>
#include <math.h>

void main() {
int a,b,c,g,i;
double n;
cout << "Inserisci un numero decimale! Usa il punto! "; cin >> n;
c=(int)n; //Prende l'intero del decimale
double d=n-c; //d=alla parte decimale e basta!
for(a=0;d>c,d<(c+1);a++)
{ d*=10;} //Calcola quanti numeri decimali ha
g=n*pow(10,a);
cout << "La frazione e' " << g <<"/"<< pow(10, a) << "\n";
for(;g%2==0; ) {g/=2;}
for(;g%5==0; ) {g/=5;}
for(;i%2==0; ) {i/=2;}
for(;i%5==0; ) {i/=5;} //Cicli per semplificare la frazione
cout << "Equivalente a " << g << "/" << i;
}

Ora, mi accade una cosa piuttosto strana, esempi di output:
"
Inserisci un numero decimale! Usa il punto! 4.5
La frazione e' 45/10
Equivalente a 9/7 --> Un po' difficile!
-----------
Inserisci un numero decimale! Usa il punto! 5.5
La frazione e' 549/100
Equivalente a 549/7 -->Argh!
-----------
Inserisci un numero decimale! Usa il punto! 6.7
La frazione e' 67/10
Equivalente a 67/7 --> Ma perchè non un due??
_________________
<<L'unica cosa che so fare col computer è farlo lavorare per me...>> yumichan
Torna in cima
Profilo Messaggio privato Invia email
Webmaster
Amministratore del forum



Messaggi: 438
Località: Provincia AL

MessaggioInviato: Martedì 27 Aprile 2004    Oggetto:
Rispondi citando

Ti spiego cosa non va

Mefistofele ha scritto: Espandi/Riduci

#include <iostream.h>
#include <math.h>

void main() {
int a,b,c,g,i;
double n;
cout << "Inserisci un numero decimale! Usa il punto! "; cin >> n;
c=(int)n; //Prende l'intero del decimale
double d=n-c; //d=alla parte decimale e basta! se n fosse 0.2 (ad es) d sarebbe negativo!
for(a=0;d>c,d<(c+1);a++) ???
{ d*=10;} //Calcola quanti numeri decimali ha
g=n*pow(10,a);
cout << "La frazione e' " << g <<"/"<< pow(10, a) << "\n";
for(;g%2==0; ) {g/=2;}
for(;g%5==0; ) {g/=5;}
for(;i%2==0; ) {i/=2;} // i non è inizializzato da nessuna parte! per questo ti vengono dei valori sballati
for(;i%5==0; ) {i/=5;} //Cicli per semplificare la frazione
cout << "Equivalente a " << g << "/" << i;
}


Ciò che vuoi realizzare tu (se ho capito bene!) si può fare molto più semplicemente così:

#include <iostream.h>

void main() {
int a,b;
double n;
cout << "Inserisci un numero decimale! Usa il punto! "; cin >> n;
n*=10; //supponendo che i decimali abbiano una sola cifra dopo lo zero
a=(int)n; //conversione double->int necessaria per i calcoli successivi
cout << "La frazione e' " << a <<"/10"<< "\n";
b=10; // inizializzo il denominatore
// il denominatore è sempre 10 quindi mi interessa che il num sia divisibile solo per 2 e 5
// di seguito sarebbe da usare while invece di if ma intanto 10 si può dividere 1 sola volta per 2 o 5
if (a%2==0) {a/=2; b/=2;}
if (a%5==0) {a/=5; b/=5;}
cout << "Equivalente a " << a << "/" << b;
}


Partendo da questo listato volendo puoi creare un programma più completo ed efficiente. Wink
Torna in cima
Profilo Messaggio privato
Mefistofele
Nuovo membro



Messaggi: 10
Località: Bergamo

MessaggioInviato: Martedì 27 Aprile 2004    Oggetto:
Rispondi citando

Si ma io non voglio limitare solo a una cifra dopo il punto... deve scegliere l'utente.. potrebbero essere anke 12..

double d=n-c; //d=alla parte decimale e basta! se n fosse 0.2 (ad es) d sarebbe negativo! --> perkè?

for(a=0;d>c,d<(c+1);a++) ??? --> d>c AND d<(c+1) --> se è compreso tra un numero e il suo successore è per forza decimale!

for(;i%2==0; ) {i/=2;} // i non è inizializzato da nessuna parte! per questo ti vengono dei valori sballati ---> no c'è int etc.etc.

PICCOLO MIGLIORAMENTO:
#include <iostream.h>
#include <math.h>

void main() {
int a,b,c,g,i;
double n;
cout << "Inserisci un numero decimale! Usa il punto! "; cin >> n;
c=(int)n;
double d=n-c;
for(a=0;d>c,d<(c+1);a++)
{ d*=10;}
g=n*pow(10,a);
cout << "La frazione e' " << g <<"/"<< pow(10, a) << "\n";
i=pow(10,a);
if ((g%2==0) && (i%5==0)) {g/=2; i/=2;}
if ((g%5==0) && (i%5==0)) {g/=5; i/=5;}
cout << "Equivalente a " << g << "/" << i;
}


ma con 5.5 o 6.5..... robe con .5 insomma ho ancora casini non so perkè!
_________________
<<L'unica cosa che so fare col computer è farlo lavorare per me...>> yumichan
Torna in cima
Profilo Messaggio privato Invia email
Webmaster
Amministratore del forum



Messaggi: 438
Località: Provincia AL

MessaggioInviato: Martedì 27 Aprile 2004    Oggetto:
Rispondi citando

Mefistofele ha scritto: Espandi/Riduci
Si ma io non voglio limitare solo a una cifra dopo il punto... deve scegliere l'utente.. potrebbero essere anke 12..


In questo caso allora devi anche fare i conti coi bit! Potrebbe servirti un "long double"... in c++ non puoi lavorare con valori con precisione indefinita.

Citazione: Espandi/Riduci
double d=n-c; //d=alla parte decimale e basta! se n fosse 0.2 (ad es) d sarebbe negativo! --> perkè?


Sorry, una svista! d'oh!
Ad ogni modo le operazioni tra tipi diversi (double e int) generano errori.

Citazione: Espandi/Riduci
for(a=0;d>c,d<(c+1);a++) ??? --> d>c AND d<(c+1) --> se è compreso tra un numero e il suo successore è per forza decimale!


Si, ma il ciclo for non funziona molto bene così. Innanzitutto le condizioni dovrebbero riguardare la stessa variabile (in questo caso a) e poi rischi di avere errori se confronti (o esegui operazioni su) double e interi (d e c)indistintamente.

Citazione: Espandi/Riduci
for(;i%2==0; ) {i/=2;} // i non è inizializzato da nessuna parte! per questo ti vengono dei valori sballati ---> no c'è int etc.etc.


"int ecc ecc" è una dichiarazione. L'inizializzazione è una cosa tipo "int a=1". Se dichiari una variabile ma non gli dici da che valore partire il compilatore potrebbe assegnargli un valore a caso (come infatti succede).

Citazione: Espandi/Riduci
PICCOLO MIGLIORAMENTO:
#include <iostream.h>
#include <math.h>

void main() {
int a,b,c,g,i;
double n;
cout << "Inserisci un numero decimale! Usa il punto! "; cin >> n;
c=(int)n;
double d=n-c;
for(a=0;d>c,d<(c+1);a++)
{ d*=10;}
g=n*pow(10,a);
cout << "La frazione e' " << g <<"/"<< pow(10, a) << "\n";
i=pow(10,a);
if ((g%2==0) && (i%5==0)) {g/=2; i/=2;}
if ((g%5==0) && (i%5==0)) {g/=5; i/=5;}
cout << "Equivalente a " << g << "/" << i;
}


ma con 5.5 o 6.5..... robe con .5 insomma ho ancora casini non so perkè!



In conclusione, il consiglio che ti do è di partire dal listato che ti ho postato in precedenza e aggiungere, all'inizio, un controllo sui decimali (tipo conteggio delle cifre totali e moltiplicazione per 10 altrettante volte, oppure richiesta all'utente di specificare in input quante cifre decimali inserirà - e ricordati che un limite deve esserci per forza-) e infine di adattare le operazioni (inserendo magari il while al posto degli ultimi if come già ti avevo suggerito).
Se ti serve ancora aiuto posta pure! Wink
Torna in cima
Profilo Messaggio privato
Mefistofele
Nuovo membro



Messaggi: 10
Località: Bergamo

MessaggioInviato: Martedì 27 Aprile 2004    Oggetto:
Rispondi citando

"(tipo conteggio delle cifre totali e moltiplicazione per 10 altrettante volte"

Ma come posso farlo?
_________________
<<L'unica cosa che so fare col computer è farlo lavorare per me...>> yumichan
Torna in cima
Profilo Messaggio privato Invia email
Webmaster
Amministratore del forum



Messaggi: 438
Località: Provincia AL

MessaggioInviato: Mercoledì 28 Aprile 2004    Oggetto:
Rispondi citando

Un metodo semplice per contare i decimali potrebbe essere implementato con l'uso del tipo char:

#include <iostream.h>

void main () {
int a;
char b[8]; //array di 7 caratteri (+ il valore null che viene aggiunto di default)
cout<<"Inserisci un numero decimale di 7 cifre totali (compresa la virgola)."<<endl;
cin>>b;
int i=0;
while(b[i]!='.') {i++;}
a=(6-i);
cout<<"il numero ha " <<a<<" cifre decimali";
}


Con questo programma il valore dato in input (che deve essere di 7 cifre totali) viene visto come una stringa di caratteri e il "." serve come riferimento per contare le cifre della parte intera.
Ma questo è solo uno dei modi che puoi utilizzare.

Realizzare esattamente ciò che credo tu abbia in mente, richiede un livello molto più elevato e un programma ben più complesso che faccia uso dei puntatori e magari della oop per consentire una certa dinamicità e adattabilità. Inoltre andrebbero implementati alcuni controlli (che ad esempio notino l'eventuale presenza di zeri come ultime cifre che potrebbero falsare le dimensioni del numero). Think
Solitamente, data la scarsa utilità pratica di questo tipo di programma, ci si limita a soluzioni come quelle che ti ho suggerito.
Torna in cima
Profilo Messaggio privato
Mefistofele
Nuovo membro



Messaggi: 10
Località: Bergamo

MessaggioInviato: Mercoledì 28 Aprile 2004    Oggetto:
Rispondi citando

Che idea Exclamation
_________________
<<L'unica cosa che so fare col computer è farlo lavorare per me...>> yumichan
Torna in cima
Profilo Messaggio privato Invia email
Mostra prima i messaggi di:   
Nuovo Topic   Rispondi    Indice del forum -> Aiuto - C++
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi Topic in questo forum
Non puoi rispondere ai Topic in questo forum
Non puoi modificare i tuoi messaggi in questo forum
Non puoi cancellare i tuoi messaggi in questo forum
Non puoi votare nei sondaggi in questo forum


Powered by phpBB

 

home - esercizi base - esercizi oop - algoritmi - java - forum - info & siti amici

Siti partner: c++ maniacs . web-creations . compilatori.com