Newsgroup: it.comp.lang.c
Titolo: [newbie] da float a int

Salve a tutti,
    sono un newbieissimo del c, ma come linguaggio mi affascina tantissimo!
Lo sto studiando con il K&R e ogni tanto, mi invento qualche esercizio extra
per prendere un po' di confidenza con il linguaggio, visto che sul K&R gli
esercizi sono piuttosto facili (per lo meno ancora lo sono :P)
Ora pero' mi trovo davanti ad un "piccolo" problema: dovrei, dato un float
spezzarlo in un long per la parte intera e in un int per la parte decimale:
123.45
long pippo=123
int pluto=45
Non conoscendo funzioni che lo facciano in "automatico" mi sono inventato
una cosa del genere:
    float num
    long numero;
    int decimali;
    numero = (int) num;
    decimali=(num*100)-(numero*100);   <--- questa non mi sembra molto
"elegante"
voi che ne dite? esistono sistemi migliori?
grazie 1000 a tutti
Dade

 ha scritto nel messaggio
news:4147...@x-privat.org...
ehmm aggiungo anche che in alcuni casi non funziona es:. con il 126.56
decimali diventa 55... non capisco il motivo :(
ciao
Dade

 int pluto=45
Dai un'occhiata a modf(). Non fa esattamante quello che chiedi, ma
ci si mette poco ad ottenerlo.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 voi che ne dite? esistono sistemi migliori?
una soluzione casalinga e poco performante č:
- stampare il numero in una stringa
- parserizzare la parte di stringa prima del punto e quella dopo il punto
char s[10];
sprintf(s,"%f",num);
sscanf(s,"%d.%d",&numero,&decimali);
non ho provato il codice, ma comunque l'idea e' quella.
Ciao,
Ema

 ha scritto nel messaggio
news:4147...@x-privat.org...
grazie a tutti per l'aiuto!
il mio problema e' che il dato nel float non e' preciso: se gli assegno
123.56 e lo vado poi a leggere ci trovo 123.5599etcetc
nei vecchi post ho trovato che questo e' dato fatto che sono valori
convertiti dal binario e quindi "approssimati"
il mio problema, e' che il decimale di quel numero sara' l'indice di un
vettore e leggere 55 invece di 56 mi cambia la vita...
ma credo che il problema si presenti anche su programmi di contabilita', con
l'euro in particolare... fare una fattura di 123.56 euro e' diverso da
123.55.....
questi float......
voi come vi comportate?
per chi fosse interessato, magari sbaglio io qualcosa, ho messo il codice
qui: 
http://paste.phpfi.com/29842
 e' solo un esercizio personale... ma ogni
critica e' oro per me :)
ciao
Dade

 questi float......
Non per voler criticare, ma tu hai gia qualcosa in formato testo
che converti in float per poi riconvertire questo in int ed andare
a ravanare in un vettore.
Non ti semra che ci sia qualcosa di sbagliato nella logica del
processo?
Non sarebbe meno incasinato convertire il testo in int direttamente
senza passare i float?


 voi come vi comportate?
Per i valori monetari, in C, uso semplicemente un long.
In una variabile globale a parte tengo un fattore di moltiplicazione che
rappresenta il numero di cifre decimali necessarie: ad esempio, 100 per gli
euro (che hanno due decimali), 10 per le vecchie pesetas spagnole (che
avevano un solo decimale), 1 per le vecchie lire italiane (che non avevano
decimali), ecc.
Somme e sottrazioni fra valori monetari si fanno normalmente. Le
moltiplicazioni e le divisioni fra valori monetari (cose rare: capita
praticamente solo convertendo da una valuta a un'altra) richiedono invece
qualche piccolo salto mortale, che giustifica l'implementazione di un paio
di funzioni di libreria per farlo.
(OT: In C++ si farebbe qualcosa di molto più ganzo, definendo una classe
"fixed" e demandando tutti i dettagli aritmetici agli operatori overloaded).
--
Cingar
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 ha scritto nel messaggio
news:4149...@x-privat.org...
grazie ragazzi!!!! ora funziona :)
riporto il link al codice se voleste darci un'occhiata :)
http://paste.phpfi.com/29866
grazie in particolare ad Angelo Paolitto e Cingar
se avete altri consigli e/o critiche fate pure, e' un piacere
ciao
Dade

 
http://paste.phpfi.com/29866
Due cose:
tieni presente che una funzione di input cosi' semplice funziona solo
se l'utente non sbaglia mai (e di solito sbaglia, eccome se sbaglia) e
il codice sotto e' meglio evitare di scriverlo.
{
   ...
   char numlet[200]="";
   .... 
   return &numlet;
}
Quello che stai facendo e' restituire l'indirizzo di un qualcosa
che all'uscita della funzione non esiste piu': le variabili
automatiche "vivono" solo all'interno del blocco in cui sono
definite.


 C:\>iao Angelo
ciao e grazie
Dade

 l'unico sistema che ho trovato funzionante e' questo :/
Peccato che non funzioni. Avere una compilazione senza warning e'
solo il primo passo per ottenere un programma funzionante.


 wrote in message
news:ba8b914eefd283886f1...@mygate.mailgate.org
Anche le istruzioni come
sprintf(numlet ,"%sVirgola%s",numlet,dieci[decimali]);
sono sbagliate (a quanto mi risulta). Quello che devi fare e' una
cosa del genere:
   char* tmpP = numlet + strlen(numlet);
   sprintf(tmpP, "Virgola%s", dieci[decimali]);
Ovviamente e' la stessa cosa usando la memoria dinamica.


 Ovviamente e' la stessa cosa usando la memoria dinamica.
mammamia mi sto perdendo :))))))))
scusami ma perche' usi char* tmpP e non char *tmpP sono la stessa cosa?
e perche' la funzione la definisci con char* num2text(etc etc) l'* non e'
implicito?
grazie 100000000
dade


 implicito?
E questo dove lo hai letto?
char num2text();
restituisce un char, ovvero una quantita' di un byte.
char* num2text();
restituisce un indirizzo che molto difficilmente sara' un byte.
Se vuoi rendertene conto, prova a vedere cosa restituisce
sizeof(char)
e cosa restituisce
sizeof(char*)
