* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 23, 2024, 08:52:35 am

Inserisci il nome utente, la password e la durata della sessione.

56 Visitatori, 1 Utente
 

Autore Topic: Calcoli errati  (Letto 4873 volte)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Calcoli errati
« il: 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;


A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2921
  • Karma: +20/-4
Re:Calcoli errati
« Risposta #1 il: 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;

  [...]

Imagination is more important than knowledge (A.Einstein)

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:Calcoli errati
« Risposta #2 il: 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
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Calcoli errati
« Risposta #3 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:Calcoli errati
« Risposta #4 il: 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.....
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Calcoli errati
« Risposta #5 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:Calcoli errati
« Risposta #6 il: 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
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

Simon75

  • Full Member
  • ***
  • Post: 139
  • Karma: +0/-0
Re:Calcoli errati
« Risposta #7 il: 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
A volte bisogna commettere errori per capire qual è la cosa giusta da fare...

Const
Errori=Esperienza

 

Recenti

How To

Utenti
  • Utenti in totale: 803
  • Latest: maXim.FI
Stats
  • Post in totale: 19173
  • Topic in totale: 2287
  • Online Today: 102
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 1
Guests: 56
Total: 57

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.