Newsgroup: it.comp.lang.c
Titolo: Separare un float in int

Vorrei acquisire un numero decimale dalla tastiera in 2 interi (uno per la
parte intera ed uno per la parte decimale).
Come mi suggerite di fare ciň?
Ho pensato al getchar piů la funzione isdigit utilizzate su un array di char
singoli; ma poi mi viene la domanda: come identifico la fine dell'immissione
del numero?
Identificando il carattere "invio"?
E questo carattere qual'č?
Grazie
Claudio

 Claudio
Maurizio

 wrote in message
news:Cw3p8.90718$%g7.28...@twister2.libero.it...


 Claudio
void main()
{
 char c;
...
if (c == 13)
...
//oppure
...
if (c == '\n')
...
}

 Come mi suggerite di fare ciň?
<code>
	#include <stdio.h>
	#include <stdlib.h>
	#include <string.h>
	int
	main(void)
	{
	  int ip,fp;
	  double number;
	  char *buff1[32],*buff2[32],buff3[64];
	  fputs("Insert the integer part    : ",stdout);
	  fflush(stdout);
	  fgets(buff1,32,stdin);
	  fputs("Insert the fractionary part: ",stdout);
	  fgets(buff2,32,stdin);
	  strcat(buff3,buff1);
	  strcat(buff3,".");
	  strcat(buff3,buff2);
	  number=strtod(buff3,NULL);
	  return 0;
	}
</code>
-- 
Baci,
Mony

 Come mi suggerite di fare ciň?
<code>
	#include <stdio.h>
	#include <stdlib.h>
	#include <string.h>
	int
	main(void)
	{
	  double number;
	  char buff1[32],buff2[32],buff3[64]={};  /* to "zero" it */
 
	  fputs("Insert the integer part    : ",stdout);
	  fgets(buff1,32,stdin);
	  *(buff1+strlen(buff1)-1)='\0';  /* strips the trailing '\n' */
	  fputs("Insert the fractionary part: ",stdout);
	  fgets(buff2,32,stdin);
	  strcat(buff3,buff1);
	  strcat(buff3,".");  /* no locale supported */


Scusa tanto, ma cosě ero buono pure io.
Quello che volevo ottenere era:
ricevere un numero
xxxxxx.xxxxxxx
(con tanto di punto decimale o virgola)
e ottenere
xxxxxxx(.)xxxxxxx
senza il punto.
Per cui il sistema doveva sostanzialmente eliminare il punto.
Credo che a questo punto sia fattibile proprio con un array e la isdigit...
Ciao
Claudio

}
Sicuro che il newline sia sempre 13 sotto ogni piattaforma? Sicuro che
non ci siano sistemi in cui tu non lo vedi neanche il carattere di
newline ma solo il carriage return? E sistemi in cui non ti generi sia
il carriage return che il newline?
Se usi il '\n' ti metti al riparo da tutti i pericoli perche' ci pensa
il compilatore a convertirlo esplicitamente nella giusta sequenza (a
meno che non gli dici espressamente di non farlo, come potevi fare
sotto alcuni compilatori).
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 E questo carattere qual'e`?
'\n'
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La vispa candela bruciava l'erbetta
creando un'essenza alquanto sospetta;
sembrava l'odore di una sacrestia
ma presto mi accorsi che era maria.

 il codice ASCII dell'invio e' 13
Il newline e` '\n'. Dove e` scritto che il suo valore numerico e` 13?
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"L'abilita` politica e` l'abilita` di prevedere quello che
 accadra` domani, la prossima settimana, il prossimo mese e
 l'anno prossimo. E di essere cosi` abili, piu` tardi,
 da spiegare  perche' non e` accaduto."

 Mox
Maurizio

 Kronos
Maurizio

standard presumo che sia cosi'...
Non esiste solo l'ASCII, anche se è il più diffuso.
-- 
Marco Barisione (ICQ 84277092)

 Marco Barisione (ICQ 84277092)
Maurizio

e poi quali s.o. non lo usano?
Onestamente non lo so, comunque EBCDIC è diverso da ASCII.


 dalla curiosita' :p
Si`, ma il newline non e` il  13. E` il 10. Il C mette a disposizione il
'\n'  che  corrisponde  alla  sequenza newline  usata  dal  sistema. Tra
l'altro  sotto Win/DOS  il  newline  non e`  un  carattere  solo, e`  la
sequenza 0xA,0xD. Sotto Mac e` 0xD. La  libreria C provvede a convertire
le varie sequenza in '\n'.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La differenza fra l'intelligenza e la stupidita`?
All'intelligenza c'e` un limite.

 line feed)...tutto qui.
Ehm, veramente il new line e il line feed sono sinonimi.
Se si valuta la codifica ASCII:
10 -> '\n' -> (ritorno a capo)(new line)(line feed);
13 -> '\r' -> (ritorno carrello)(carriage return)(enter)
Ciao.

 wrote in message
news:a82pi5$fcp$1...@dreamland.darkstar.net...


 wrote in message
news:a82pi5$fcp$1...@dreamland.darkstar.net...


...O la tua e' solo una domanda retorica? Fammi sapere che mo sono curioso
Si, l'ASCII in se e' uno standard: nel senso che se uno usa la
codifica ASCII deve attenersi allo standard. Nessuno ti obbliga a
uscare l'ASII pero'. Ci sono altri modi di codifica dei caratteri.
L'unica certezza che hai (a quanto pare) e' che sei sicuro che in
qualsiasi codifica esistente il carattere '0' sara' in una posizione
minore dell' '1' e cosi' via fino al '9'.
Per il resto puo' cambiare a piacimento la disposizione dei caratteri.
C'e' un'interessante discussione a proposito sul [Koenig] se ti
interessa l'argomento.


 13 -> '\r' -> (ritorno carrello)(carriage return)(enter)
Lapsus :p

 Sono inventati da te o esistono in qualche libreria non inserita?
Esistono nel C99, e sono dichiarati nell'header math.h, evidentemente Il
VC++ non li implementa.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La vasca da bagno fu inventata nel 1850, il telefono nel 1875.
Se fossi vissuto nel 1850, avrei potuto restare in vasca per 25 anni
senza sentir squillare il telefono



Lo avete mai visto un file in binario con edit? .-)
13 10 = \n
nei file .txt

 nei file .txt
A costo di ripertermi: e` strettamente dipendente dal sistema in uso. Il
C mette a disposizione il carattere  '\n', che, per gli stream di testo,
verra` espanso nella sequenza opportuna.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"Ci sono le balle , le megaballe e le statistiche".
 Mark Twain

nei file .txt
Si, ma forse tu non hai mai usato un sistema che non fosse prodotto
dalla microsoft :P
Nei sistemi unix il ritorno a capo si indica semplicemente con il
newline.
Nei sistemi Mac il ritorno a capo si indica con carriage return.
Nei sistemi Windows si usano tutti e due.
Il '\n' serve appunto per pararti il fondoschiena quando cerchi di
scrivere codice portabile.


 dalla curiosita' :p
L'OS390, il sistema operativo dei mainframe IBM, usa l'EBCDIC.
-- 
Baci,
Mony

Aggiungo un'altra domanda:
se come risultato di svariate operazioni ottengo un numero (per esempio
25,99) c'č modo per far sě che convertendolo a int, il numero venga
apporssimato (in questo caso 26) invece che semplicemente troncato della
parte decimale?
Grazie
Claudio

 parte decimale?
    float x = 25.99;
    int y = (int)(x + 0.5);
Maurizio.

???????
Non ho capito.
Forse non mi sono spiegato.
Io non so a priori il numero.
Io acquisisco un numero, e devo svolgere delle operazioni prima di mandarlo
ad un altro programma.
Questo numero spesso viene molto vicino all'unità superiore (32585,95 per
esempio), ma io non so a priori in "che modo si avvicini all'unità".
Per cui la domanda è: c'è un'operazione, un'operatore matematico o qualcosa
di simile che approssimi un numero?
Grazie
Claudio

 si avvicini all'unità".
Ribadisco: sommi 0.5 e ne prendi la parte intera. Questo è un procedimento
generale.
La regola per arrotondare un numero è: se la parte decimale del numero è
minore di 0.5 si prende la parte intera, altrimenti si arrotonda all'intero
superiore. Sommando 0.5 al numero, nel primo caso (parte decimale inferiore
a 0.5) la parte intera non cambia, altrimenti (parte decimale maggiore o
uguale a 0.5) la parte intera viene incrementata di 1.
Fai delle prove:
    x = 4.499 che viene approssimato a 4; sommando 0.5 il numero diventa
4.999, la cui parte intera è 4.
    x = 4.501 che viene approssimato a 5; sommando 0.5 il numero diventa
5.001, la cui parte intera è 5.
Puoi costruirti una macro:
    #define round(x) (int)(x + 0.5)
così puoi fare, ad esempio:
    printf("%d\n", round(4.499));
Maurizio.

 parte decimale?
NAME
       ceil,  ceilf,  ceill - ceiling function: smallest integral
       value not less than argument
SYNOPSIS
       #include <math.h>
       double ceil(double x);
       float ceilf(float x);
       long double ceill(long double x);
DESCRIPTION
       These functions round x up to the nearest integer.
RETURN VALUE
       The rounded integer value. If x is integral or infinite, x
       itself is returned.
Se sei sicuro che il valore puo` stare  in un int fai un cast sul valore
di ritorno. Esiste anche floor() (con  le due varianti) che arrotonda al
numero intero piu` grande minore dell'argomento.
Ad esempio  ceil(3.14) restituisce  4.0, mentre  floor(3.14) restituisce
3.0. In  alternativa   puoi  usare   queste  funzioni   per  arrotondare
all'intero piu` vicino.
NAME
       round,  roundf,  roundl  -  round to nearest integer, away
       from zero
SYNOPSIS
       #include <math.h>
       double round(double x);
       float roundf(float x);
       long double roundl(long double x);
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Sono un mirabile incrocio tra Tarzan e Giacomo Leopardi.
In me convivono tutte le doti intelluttuali di Tarzan e
tutta la prestanza fisica di Giacomo Leopardi.
A. Borsani

    #define round(x) (int)(x + 0.5)
Ops, c'e`  una collisione  con il  nome di  una funzione  gia` presente.
Inoltre e` buona cosa mettere  tra parentesi l'argomento della macro, in
modo da evitare problemi di precedenze degli operatori:
#define my_round(x) ((int)((x) + 0.5))
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"Sei l'unica donna della mia vita".
(Adamo)

 Inoltre e` buona cosa mettere  tra parentesi l'argomento della macro
Giusto in generale. In questo caso, forse, qualche parentesi si poteva
risparmiare.
Maurizio.

 Non nel C standard e nemmeno fra le funzioni del mio compilatore.
7.12.9.6 The round functions
1 Synopsis
#include <math.h>
double round(double x);
float roundf(float x);
long double roundl(long double x);
2 Description
The round functions round their argument to the nearest integer value in
floating-point format, rounding halfway cases away from zero, regardless
of the current rounding direction.
3 Returns
The round functions return the rounded integer value.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Runtime error 6D at f000:a12f : user incompetente

 ...
Dove l'hai presa 'sta roba?
Ho spulciato il math.h del mio compilatore (IBM) e ne ve n'è traccia. Forse
queste funzioni sono definite nel C99?
Maurizio.

 Forse queste funzioni sono definite nel C99?
Si`
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
La somma dell'intelligenza sulla terra e` una costante.
La popolazione e` in aumento.