Newsgroup: it.comp.lang.c
Titolo: Cosa non va in questo codice ?.grazie

Salve a tutti .
L'esecuzione del codice sottoriportato produce output non corretti .
Il file txt da acquisire contiene solo numeri pari e dovrebbe produrre
in uscita un file txt con i risultati della
computazione .
Mi vengono risultati non corretti...in cosa sbaglio ?.Grazie molte.
* Mediante acquisizione da tastiera tutto funziona bene , e' solo
l'acquisizione da file e output su file che mi
da errori nei risultati *
...
#include<stdio.h>
int main (void)
{
	float var1 = 1.0;
	float var2 = 2.0;
	float costante = 3.0;
	int   i = 0;
	int   t ; /* numero pari */
	FILE *inp;
	FILE *outp;
    inp = fopen ("numeri_pari.txt","r");
    outp = fopen ("risultato.txt","w");
    while(fscanf(inp,"%d",&t)!= EOF) {
    do
    {
        var1 +=costante;
	    var2 +=costante;
	     ++i;
	    if (i==t/2)
        costante = costante*2;
    }
    while (i<t);
    fprintf(outp,"t = %d    var1 =  %.1f   var2 =  %.1f
\n",t,var1,var2);
 }
   fclose (inp);
   fclose (outp);
   return(0);
}
...

 da errori nei risultati *
[CUT]
comincierei a fare un po' di debugging, tipo: il file in ingresso lo
legge giusto? i calcoli che fa li fa giusti (o meglio fa quello che ti
aspetti)? varie ed eventuali...
Ciao Jack


Se il file in ingresso contiene un solo numero ad esempio 10
produce il seguente risultato:
t = 10    var1 =  46.0   var2 =  47.0
che e' corretto.
Se il file numeri_pari.txt contiene piu' di un numero , allora
vi sono errori.

 vi sono errori.
ciao.
Purtroppo "vi sono errori" e' un po' vago: bisogna che ci spieghi cosa
ti da il programma e cosa invece ti aspettavi tu. Se ci dici che 
mettendo un solo numero va tutto bene non ci aiuti gran che, o no? ;)
Comincia con mandarci un esempio di file di input e di output corretto e 
errato partendo dallo stesso input.
Viste le dimensioni ridotte del programma potresti postare entrambe le 
versioni, quella che legge da file e quella che legge da tastiera in 
modo da vedere se il problema e' nato nel passaggio tra le due versioni.
ciao
Giacomo

On 2 Ott, 19:31, Giacomo Degli Esposti

Per il file di ingresso numeri_pari.txt e' semplicemente una lista da
10 a 1000
di numeri pari.
Dovrebbe scrivere sul file risultato.txt il frutto della computazione
dell'algoritmo.
Cioe' :
t = 10    var1 =  46.0   var2 =  47.0
t = 12    var1 =  55.0   var2 =  56.0
t = 14    var1 =  64.0   var2 =  65.0
e cosi via con t che vale 1000.
Invece da questi risultati errati ( tranne il primo ) :
t = 10    var1 =  46.0   var2 =  47.0
t = 12    var1 =  58.0   var2 =  59.0
t = 14    var1 =  70.0   var2 =  71.0
e cosi via sino a 1000.
Grazie per l'aiuto.

 e cosi via con t che vale 1000.
[..]
basandomi su quel campione di risultati corretti direi che un codice adatto
allo scopo potrebbe essere questo..
#include <stdio.h>
int main (void)
{
 float var1;
 int t;
 FILE *inp, *outp;
 inp = fopen("numeri_pari.txt", "r");
 outp = fopen("risultato.txt", "w");
 while(fscanf(inp, "%d", &t) != EOF) {
  var1 = (t / 2 - 1) * 9 + 10;
  fprintf(outp, "t = %d var1 = %.1f var2 = %.1f\n", t, var1, var1 + 1);
 }
 fclose(inp);
 fclose(outp);
 return 0;
}
-- 
www.iuz-lab.info
 - 
www.php-faq.org


Ringrazio infinitamente.Il codice postato funziona.
Mi sorge un forte dubbio riguardo al fatto che il codice originario
e' stato modificato in maniera consistente per ottenere un giusto
risultato.
Il nucleo originale era :
do
{
var1 +=costante;
var2 +=costante;
     ++i;
if (i==t/2)
costante = costante*2;
}
 while (i<t);
Mi viene spontaneo chiedermi perche' la semplice aggiunta
di fscanf ed fprintf hanno prodotto un comportamento "anomalo"
dell'algoritmo?
Il codice proposto produce risultati corretti ma e' differente da
quello di
partenza.
Grazie di nuovo

 Grazie di nuovo
non e' stata colpa ne di fscanf ne di fprintf..
il problema e' che per il primo valore in ingresso lavori con valori di
partenza corretti.. var1 = 1.0, var2 = 2.0, etc.. ma per gli altri valori
il ciclo continua con i valori sporcati dalla computazione immediatamente
precedente.. per far funzionare il tuo codice bastava aggiungere subito
dopo il while(fscanf... qualcosa del tipo..
var1 = 1.0;
var2 = 2.0;
costante = 3.0;
ma con quella semplice espressione ottieni il medesimo risultato :-P
comunque ti consiglio di non chiamare "costante" una variabile, e' un'po'
fuorviante :-)
-- 
www.iuz-lab.info
 - 
www.php-faq.org


metti un po' di  printf() e vedi dove e' il problema.
Ciao Jack

 - Mostra testo tra virgolette -
Come vedo nessuno vuole affrontare il problema,
specifico vuole poiche' ne sapete piu di me di linguaggio C e
sareste in grado di dirmi subilto cosa non andava nel codice
originariamente postato.
Apprezzo l'alternativa ma non e' cosi che si affrontano i problemi.
Sottolineo quello proposto e' funzionante ma il
codice viene stravolto.
Grazie a coloro che mi aiuteranno a dissipare un dubbio "atroce" per
me.

1124 ha scritto:

<premessa>
Il pc è stupido, fa quello che gli diciamo di fare e non necessariamente 
ciò che vorremmo facesse
</premessa>
Il tuo non è un problema di linguaggio, con qualunque linguaggio avresti 
lo stesso risultato.
Senza conoscere le specifiche non si può dare una risposta e, per quel 
che vedo, il programma è perfettamente funzionante (compila e dato un 
input produce un risultato).
Presumo cosa vorresti che facesse, ma ti sono state fornite indicazioni 
(che o non hai capito o hai ignorato) su dove sbagli l'algoritmo.
E ti è stata suggerita una via (debug passo passo o usa serie di printf) 
per verificare cosa succede e ovviare al tuo problema.
Volevi la pappa pronta? Paga uno specialista e fatti fare il programma :-)
<inciso>
l'alternativa che ti è stata suggerita si basa sull'output desiderato, 
ma andrebbe considerata una soluzione da adattare al problema, non 
all'output.
es. per calcolare la somma di N numeri naturali (da 1 a N) puoi usare un 
ciclo in cui esegui la somma, ma basterebbe una semplice espressione
R = (N * (N + 1)) / 2
per avere lo stesso risultato.
Non so se sei lo stesso che voleva informazioni sul unrolling (il codice 
è lo stesso), ma lì avevo suggerito una soluzione, non per il tuo 
problema attuale ma per eliminare l'inutile ciclo.
</inciso>
Ciao