PDA

Visualizza la versione completa : [C] scrivere double su file senza zeri meno significativi


jeremyj
24-01-2013, 17:59
Ciao a tutti,
dovrei acquisire da tastiera una serie di numeri (interi e double) e trascriverli su file. Fino a qui tutto bene, però nel file i numeri dovrebbero essere trascritti esattamente come sono, cioè, per esempio se l'utente insersce 2 nel file devo trascrivere 2 e non 2.000000, allo stesso modo se viene inserito 2.55 devo trascrivere 2.55 e non 2.550000.
Ho già risolto il problema quando il numero è intero:


double numero;
FILE *finput; //puntatore al file

for(i = 0; i < n; i++)
{
printf("Inserire un numero: ");
scanf("%lf", &numero);
if(numero == (double)(int)numero) //controllo se il numero inserito è un intero
fprintf(finput, "%d ", (int)numero); //se il numero è intero viene scritto su file con %d
else
fprintf(finput, "%lf ", numero); //altrimenti viene scritto usando %lf
}


Con il controllo dell'if sono riuscito a rosolvere il problema quando viene inserito un numero intero, ma come posso fare per ottenere un risultato simile anche dentro l'else, cioè quando viene inserito un double?
Non posso usare una cosa del tipo:
fprintf(finput, "%.2lf ", numero);
perchè così facendo otterrei un risultato ottimale solo per i numeri che hanno due cifre decimali, mentre riamrrebbe uno zero se il numero ha una sola cifra decimale oppure verrebbe troncato se ha più di due cifre decimali.
Grazie

oregon
24-01-2013, 19:43
La richiesta è bizzarra e l'unico modo è fare l'input in una stringa.

jeremyj
25-01-2013, 03:02
ovviamente questa cosa fa parte di un programma più esteso e ovviamente funziona tutto anche lasciando gli zeri, è solo una mia fissa per rendere più "elegante" il file.
Quindi dovendo utilizare una stringa io dovrei:
1) acuisire il valore double;
2) convertirlo in tipo stringa (array di char);
3) effettuare un controllo sui caratteri eliminando gli zeri meno significativi;
4) riconvertire la stringa in double;

giusto?

MegaAlchimista
25-01-2013, 09:53
Originariamente inviato da jeremyj
ovviamente questa cosa fa parte di un programma più esteso e ovviamente funziona tutto anche lasciando gli zeri, è solo una mia fissa per rendere più "elegante" il file.
Quindi dovendo utilizare una stringa io dovrei:
1) acuisire il valore double;
2) convertirlo in tipo stringa (array di char);
3) effettuare un controllo sui caratteri eliminando gli zeri meno significativi;
4) riconvertire la stringa in double;

giusto?
puoi saltare l'ultimo passaggio e scrivere sul file direttamente la stringa.
Fra l'altro se invece di usare un array di char usi std::string ci sono dei metodi comodi per il punto (2) senza che debba scriverli tu

jeremyj
25-01-2013, 15:34
ok perfetto, scusate la sbadataggine, in effetti per fare ciò che mi serve basta semplicemente acquisire il valore come una stringa e trascriverlo su file.
Vorrei chiedervi anche un'altra cosa:
è possibile fare in modo che i valori vengano allineati verticalmente all'interno del file?
Per esempio:


0.12 0.3 1.2
1.4 0.2 3.7
4.1 1.1 3.2
3.2 1.1 8.6
2.45 4 0.18


So che anche questa può sembrare una richiesta strana e inutile ai fini dello svolgimento del programma, ma sto preparando un lavoro per scopo didattico e al professore potrebbe far piacere questa cosa.
Grazie a tutti.

MegaAlchimista
27-01-2013, 11:10
ti devi contare la lunghezza della stringa, in questo modo poi puoi allinearle come vuoi

oregon
27-01-2013, 11:19
Ma allinearle a destra avrebbe senso?

jeremyj
27-01-2013, 17:36
Originariamente inviato da MegaAlchimista
ti devi contare la lunghezza della stringa, in questo modo poi puoi allinearle come vuoi
Però, per come ho strutturato la funzione di acquisizione dei valori, per "calcolare" l'allineamento mi devo basare sulla stringa più lunga, e finchè l'utente non ha inserito l'ultimo valore non posso stabilire qual è la più lunga.
Potrei usare una qualche struttura di appoggio oppure un qualche metodo più efficiente?



Originariamente inviato da oregon
Ma allinearle a destra avrebbe senso?
No, mi servirebbe allineare a sinistra come nell'esempio postato in precedenza.

Grazie.

oregon
27-01-2013, 17:39
In poche parole, per capirci, tu vuoi tutti gli elementi in modo che il punto decimale sia incolonnato?

jeremyj
27-01-2013, 20:42
Originariamente inviato da oregon
In poche parole, per capirci, tu vuoi tutti gli elementi in modo che il punto decimale sia incolonnato?

In pratica io devo acuisire un numero n di punti (specificabile dall'utente) rappresentabili in uno spazio k-dimensionale (k specificabile dall'utente), perciò ogni punto deve venire rappresentato da k coordinate.
Le coordinate devono essere inserite dall'utente poi il programma deve calcolare la distanza euclidea tra tutte le coppie di punti e stampare a video tali distanze in ordine crescente. Essendo però un compito a scopo didattico il professore vuole che trascrivaimo le coordinate inserite dall'utente su file e poi le ripreleviamo dal file al momento di calcolare la distanza euclidea (il prof. chiede questo per farci lavorare con i file).
Il programma l'ho già realizzato e testato e funziona perfettamente, volevo solo sistemare il particolare dell'allineamento nel file perchè potrebbe piacere al prof.
In pratica il file viene strutturato in modo che ogni riga rappresenta un punto e tutti i valori sulla stessa riga rappresentano le coordinate di quel punto (ad esmpio se k=2 siamo in uno spazio bidimensionale perciò in ogni riga saranno presenti due valori che rappresentano le due coordinate del punto, analogamente se k=3 siamo in uno spazio tridimensionale quindi saranno presenti tre valori per ogni riga).
Io vorrei allineare quei valori allineando verticalmente la prima cifra di ogni numero (e non allineando il punto decimale)

Loading