PDA

Visualizza la versione completa : Programma non riesce a lavorare sui numeri con la virgola


playbasfa
11-01-2008, 20:09
Ciao a tutti ragazzi ho fatto un porgramma con le conoscenze che ho (poche) in grado di calcolare le tarife ebay;
Qualora l'importo su cui voglio calcolare le tariffe sia con la virgola, questo non funziona, o meglio le calcola annulando la parte decimale;
Ad es. se io voglio calcolare la tariffa di euro 65,5 questa è identica a quella di 65,00 euro..

Ecco il sorgente:


#include <stdio.h>
int getline(char []);
double atof (char[]);
main()
{
int c;
double k,a,b,x,s,t,q,z;

char vettore[1000];
printf("Premi a per un oggetto venduto come asta online");
printf("\nPremi b per un oggetto venduto a compralo subito su ebay.it");
printf("\nPremi c per un oggetto venduto come oggetto del negozio\n\n");

while((c=getchar())=='a'||c=='b'||c=='c'){
if (c=='a'){
printf("La tua selezione e' stata a\n\n");
printf("inserisci il prezzo di vendita non comprensivo di spese di spedizione; \nEuro: \n");
fflush(stdin);
getline(vettore);
k=atof(vettore);

if (k >= 50){
a=k-2.625;
b=a/100;
x=b*3.5;
s=k-x-2.625-5-2.5;
printf("\nLa tua parte e': %.2f\n", s);
}
if (k<50 ){
a=k/100;
b=a*5.25;
s=k-b-5-2.5;
printf("\nla tua parte e': %.2f\n", s);
}
}
if (c=='b'){
printf("La tua selezione e' stata b\n\n");
printf("inserisci il prezzo di vendita non comprensivo di spese di spedizione; \nEuro: \n");
fflush(stdin);
getline(vettore);
k=atof(vettore);

if (k >= 50){
a=k-2.625;
b=a/100;
x=b*3.5;
s=k-x-2.625-5-3;
printf("\nLa tua parte e': %.2f\n", s);
}
if (k<50 ){
a=k/100;
b=a*5.25;
s=k-b-5-3;
printf("\nla tua parte e': %.2f\n", s);
}
}

if (c=='c'){
printf("La tua selezione e' stata c\n\n");
printf("inserisci il prezzo di vendita non comprensivo di spese di spedizione; \nEuro: \n");
fflush(stdin);
getline(vettore);
k=atof(vettore);

if (k >= 50){
a=k-0.50;
b=a/100;
x=b*2.0;
s=k-x-0.5-5;
printf("\nLa tua parte e': %.2f\n", s);
}
if (k<50 ){
a=k-0.25;
b=a/100;
x=b*2.0;
s=k-x-0.25-5;
}
}


}
}
int getline (char vettore[]){
int c,i=0;
while((c=getchar())!= '\n')
vettore [i++]=c;
if (c=='\n')
vettore[i++]=c;

vettore[i]= '\0';
return i;
}

double atof (char vettore[]){
double val, power;
int i, sign;
for (i=0; isspace (vettore[i]); i++)
;
sign = (vettore[i] == '-')? -1 : 1;
if (vettore[i] == '+' || vettore[i] == '-')
i++;
for (val = 0.0; isdigit(vettore[i]); i++)
val = 10.0 * val + (vettore[i] - '0');
if (vettore[i] == '.')
;
for (power = 1.0; isdigit (vettore[i]); i++)
{
val = 10.0 * val + (vettore[i] - '0');
power *= 10.0;
}

return sign * val / power;
}

oregon
11-01-2008, 20:27
I valori decimali vanno inseriti con il punto (.) decimale.

playbasfa
11-01-2008, 20:28
L'ho fatto.. ma non funziona ugualmente.

oregon
11-01-2008, 20:33
Fai un esempio pratico una volta che esegui il tuo programma e vediamo se il problema si verifica anche nel mio caso ...

EDIT: a prima vista il problema e' nella tua funzione

atof

... controllala ...

playbasfa
11-01-2008, 21:00
Ad es. con la selezione a, se calcolo la tariffa di 22,50 euro e di 22,00 euro mi viene semre 13.35 euro, che è la tariffa di 22 e non di 22.50.
Per quanto riguarda atof, l'ho presa dal libro.

Originariamente inviato da oregon
Fai un esempio pratico una volta che esegui il tuo programma e vediamo se il problema si verifica anche nel mio caso ...

EDIT: a prima vista il problema e' nella tua funzione

atof

... controllala ...

oregon
11-01-2008, 21:01
Non so se l'hai copiata bene ma il problema e' nella atof ...

playbasfa
11-01-2008, 21:04
per averla copiata bene, ne sono sicuro, perchè l'ho contrllata piu' volte..
Casomai o problema potrebe essere che questa funzioe non è adatta a questo tipo di programma..
Come posso aggiustarlo?
Non è un esercizio questo, miservirebbe davvero questo programma, quindi magari accetterei anche un'altra soluzione purchè funzioni..

oregon
11-01-2008, 21:23
Scusa ... ma se la funzione si chiama

atof

e serve a convertire una stringa in un valore in virgola mobile e l'hai trovata nel libro, deve funzionare ... probabilmente non e' stata copiata bene ...

Comunque, se non vuoi usare la tua atof, usa quella di libreria ...

Ovvero, elimina la tua atof dal tuo sorgente e ricompila.

playbasfa
11-01-2008, 21:24
in che libreria si trova?
E devo cancellare sia il corpo sia la dichiarazione?

oregon
11-01-2008, 21:25
Sì ...

Loading