Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Simon75 - Febbraio 08, 2013, 02:17:57 pm

Titolo: Calcoli errati
Inserito da: Simon75 - Febbraio 08, 2013, 02:17:57 pm
Ciao,

Quando premo sul pulsante calcola e le caselle sono tutte vuote in totale rimborsi leggo: 6,20261617855015E-307
in spese auto: 0
e in Totale: 2,67149116420932E-297
Non so dove pesca questi numeri se nelle edit non inserisco nulla.
Forse devo inizializzare le variabili poichè pescano sporcizia?
invece quando scrivo in tutte le caselle i risultati non sono giusti.
Ringrazio

Codice: [Seleziona]
procedure TForm1.BCalcolaClick(Sender: TObject);
var
  n1, n2, n3, n4, n5, n6, n7, n8, c, a, b: real;

begin

  try
    n1 := strtoFloat(Km_Percorsi.Text);    //converto da stringa a real
  except
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;
  try
    n2 := strtoFloat(Consumo_Auto.Text);
  except
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;
  try
    n3 := strtoFloat(Costo_Carburante.Text);
  except
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;
  try
    n4 := strtofloat(Spese_Viaggio.Text);
  except
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;
  try
    n5 := strtofloat(ristorante.Text);
  except
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;
  try
    n6 := strtofloat(albergo.Text);
  except
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;
  try
    n7 := strtofloat(totale_rimborsi.Text);
  except
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;
  try
    n8 := strtofloat(Spese_auto.Text);
  except
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;
  try

    c := ((n1 / n2) * n3) + n4 + n6 + n5 + n7 + n8;


  except

    on EDivByZero do
      ShowMessage('Attenzione stai dividendo per zero!');
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;
  try
    a := (n1 / n2) * n3;
  except
    on EDivByZero do
      ShowMessage('Attenzione stai dividendo per zero!');
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;

  try
    b := n5 + n6 + n4;
  except
    on ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori');
  end;


  //scrivo nella casella di testo e riconverto la variabile
  Spese_Auto.Text := Floattostr(a);
  //scrivo nella casella di testo e riconverto la variabile
  totale_rimborsi.Text := Floattostr(b);
  //scrivo nella casella di testo e riconverto la variabile
  Totale.Text := Floattostr(c);

end;


Titolo: Re:Calcoli errati
Inserito da: nomorelogic - Febbraio 08, 2013, 03:32:32 pm
ciao Simon
prova così:
Codice: [Seleziona]
procedure TForm1.BCalcolaClick(Sender: TObject);
var
  n1, n2, n3, n4, n5, n6, n7, n8, c, a, b: real;

begin
  // inizializzazione
  n1 := 0;
  n2 := 0;
  n3 := 0;
  n4 := 0;
  n5 := 0;
  n6 := 0;
  n7 := 0;
  n8 := 0;

  try
    if Trim(Km_Percorsi.Text) <> '' then
       n1 := strtoFloat(Km_Percorsi.Text);    //converto da stringa a real
    if Trim(Consumo_Auto.Text) <> '' then
       n2 := strtoFloat(Consumo_Auto.Text);
    if Trim(Costo_Carburante.Text) <> '' then
       n3 := strtoFloat(Costo_Carburante.Text);
    if Trim(Spese_Viaggio.Text) <> '' then
       n4 := strtofloat(Spese_Viaggio.Text);
    if Trim(ristorante.Text) <> '' then
       n5 := strtofloat(ristorante.Text);
    if Trim(albergo.Text) <> '' then
       n6 := strtofloat(albergo.Text);
    if Trim(totale_rimborsi.Text) <> '' then
       n7 := strtofloat(totale_rimborsi.Text);
    if Trim(Spese_auto.Text) <> '' then
       n8 := strtofloat(Spese_auto.Text);

  except
    on e: ECONVERTERROR do
      ShowMessage('Assicurarsi di aver inserito correttamente i valori' + #10 + e.Message);
  end;

  [...]

Titolo: Re:Calcoli errati
Inserito da: Simon75 - Febbraio 08, 2013, 04:09:46 pm
Ciao nomore

Quando premo su Calcola senza scrivere nelle edit mi genera l'errore : invalid floating point operation.....
invece quando metto nelle edit per es: spese viaggio= 50 albergo=50 ristorante=50 kmpercorsi=50 consumo auto=50 costo carburante=50 lui mi esegue il calcolo giusto alla prima pressione del tasto calcola (200), poi se premo ancora 1 volta il tasto calcola mi aggiunge nel totale 400  :o

Grazie
Titolo: Re:Calcoli errati
Inserito da: Stilgar - Febbraio 08, 2013, 05:15:51 pm
Sicuro di usare variabili inizializzate? Il comportamento che descrivi è tipico di quando di va a "campi" con i puntatori.
Stilgar
Titolo: Re:Calcoli errati
Inserito da: Simon75 - Febbraio 08, 2013, 09:59:27 pm
Ok sembra risolto, ho dovuto inizializzare anche le variabili: a, b, c;
Pazzescoooooo  :)

// inizializzazione
  n1 := 0;
  n2 := 0;
  n3 := 0;
  n4 := 0;
  n5 := 0;
  n6 := 0;
  n7 := 0;
  n8 := 0;
  c := 0;
  a := 0;
  b := 0;

Ora il calcolo è giusto, ma rimane il problema che quando non scrivo dentro le caselle mi genera l'errore:  invalid floating point operation.....
Titolo: Re:Calcoli errati
Inserito da: Stilgar - Febbraio 08, 2013, 10:05:56 pm
Ma cosa hai dentro le variabili quando non metti nessun valore?
Non è che ti trovi a fare operazioni del tipo 0/0 ?

Stilgar
Titolo: Re:Calcoli errati
Inserito da: Simon75 - Febbraio 09, 2013, 09:46:30 am
Come mai devo premere 2 volte il tasto calcola per avere il risultato?
Alla prima pressione ho un risultato, alla seconda un altro che non neanche giusto.

Citazione

Ma cosa hai dentro le variabili quando non metti nessun valore?

Penso 0 poiché le ho inizializzate a 0.

Vi ringrazio ciao
Titolo: Re:Calcoli errati
Inserito da: Simon75 - Febbraio 11, 2013, 02:04:58 pm
Ciao ho risolto così:  ;)

Codice: [Seleziona]
procedure TForm1.BCalcolaClick(Sender: TObject);

var
  n1, n2, n3, n4, n5, n6, n7, n8, n9, c, a, b: real;

begin
  //---------------------------inizializzo--------------------------------
  n1 := 0;
  n2 := 0;
  n3 := 0;
  n4 := 0;
  n5 := 0;
  n6 := 0;
  n7 := 0;
  n8 := 0;
  a := 0;
  b := 0;


  //-------------------------------- totale rimborsi---------------------

  try
    if Trim(ristorante.Text) <> '' then
      n5 := strtofloat(ristorante.Text);
    if Trim(albergo.Text) <> '' then
      n6 := strtofloat(albergo.Text);
    if Trim(Spese_Viaggio.Text) <> '' then
      n4 := strtofloat(Spese_Viaggio.Text);


    b := n5 + n6 + n4;

    //scrivo nella casella di testo e riconverto la variabile
    totale_rimborsi.Text := Floattostr(b);

  except

    ON ECONVERTERROR do
      MESSAGEDLG('Assicurarsi di aver inserito correttamente i valori!',
        mtError, [mbOK], 0)
    else
    begin    // In tutti gli altri casi di errore
      MessageDlg('Prestare Attenzione!', mtError, [mbOK], 0);

      Ristorante.Text := ''; //n5         // ripulisce le caselle
      Albergo.Text := '';      //n6
      spese_viaggio.Text := '';  //n4
    end;
  end;

  //-----------------------------spese auto e totale ---------------------

  try

    if Trim(Km_Percorsi.Text) <> '' then
      n1 := strtoFloat(Km_Percorsi.Text);
    if Trim(Consumo_Auto.Text) <> '' then
      n2 := strtoFloat(Consumo_Auto.Text);
    if Trim(Costo_Carburante.Text) <> '' then
      n3 := strtoFloat(Costo_Carburante.Text);

    a := (n1 / n2) * n3;
    //scrivo nella casella di testo e riconverto la variabile
    Spese_Auto.Text := Floattostr(a);
    //eseguo il totale
    Totale.Text := Floattostr(a + b);

  except
    ON EZERODIVIDE do
      MESSAGEDLG('Divisore nullo!', mtError, [mbOK], 0);
    ON ECONVERTERROR do
      MESSAGEDLG('Assicurarsi di aver inserito correttamente i valori!',
        mtError, [mbOK], 0)
    else
    begin      // In tutti gli altri casi di errore
      MessageDlg('Inserisci i valori!', mtError, [mbOK], 0);

      Km_Percorsi.Text := '';  // n1    // ripulisce le caselle
      Consumo_Auto.Text := ''; // n2
      Costo_Carburante.Text := '';  //n3

      Totale_Rimborsi.Text := ''; // n7
      Spese_Auto.Text := '';     //  n8
      Spese_Viaggio.Text := '';   // n4

      Totale.Text := '';       //n9
      Albergo.Text := '';      //n6
      Ristorante.Text := '';   //n5

    end;

  end;

end;




Vi saluto