Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   ungültiger Gleitkommawert? (https://www.delphipraxis.net/172333-ungueltiger-gleitkommawert.html)

Eltonmaster 27. Dez 2012 13:10

ungültiger Gleitkommawert?
 
Hallo Leute,
Ich hoffe das Thema ist hier richtig (Bin neu hier).


Ich beschäftige mich nun schon rund 2 Monate mit Delphi,
deshalb wollte ich mir einen Notenrechner schreiben, der mir meine Zeugnisnoten errechnet.
Ich habe also mehrere Stunden überlegt und geschrieben.
Jetzt wollte ich es testen und da wird mir angezeigt das der Wert ''' kein gültiger Gleidkommawert ist.
Ich kann mir echt nicht mehr weiterhelfen. Vielleicht könnt ihr es ja. Hoffe auf viele Antworten. :-D

PS.: Hier ist mein ganzes Projekt. Wenn Fragen aufkommen, einfach anschreien.
http://rapidshare.com/files/3739377692/Projekt1.rar
Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm3 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Edit9: TEdit;
    Label9: TLabel;
    Edit10: TEdit;
    Edit11: TEdit;
    Label10: TLabel;
    Label11: TLabel;
    Edit12: TEdit;
    Label12: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label13: TLabel;
    Label14: TLabel;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit8: TEdit;
    Edit15: TEdit;
    Label8: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3 : real;
  kkdurchschnitt : real;
  kadurchschnitt : real;
  notendurchschnitt : real;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;
  kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3 : real;
  kkdurchschnitt : real;
  kadurchschnitt : real;
  notendurchschnitt : real;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
begin
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
Edit4.Clear;
Edit5.Clear;
Edit6.Clear;
Edit7.Clear;
Edit8.Clear;
Edit9.Clear;
Edit10.Clear;
Edit11.Clear;
Edit12.Clear;
Edit13.Clear;
Edit14.Clear;
Edit15.Clear;
end;

procedure TForm3.Button2Click(Sender: TObject);
var
  kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3, kas : real;
  kkdurchschnitt : real;
  kadurchschnitt : real;
  notendurchschnitt : real;
begin
if edit1.text='' then edit1.Text:= '0';
if edit2.text='' then edit2.Text:= '0';
if edit3.text='' then edit3.Text:= '0';
if edit4.text='' then edit4.Text:= '0';
if edit5.text='' then edit5.Text:= '0';
if edit6.text='' then edit6.Text:= '0';
if edit7.text='' then edit7.Text:= '0';
if edit8.text='' then edit8.Text:= '0';
if edit15.text='' then edit15.Text:= '0';                                           //

                                            //
if edit15.text='0' then edit13.Text := '8';
if edit8.text='0' then edit13.Text := '7';
if edit7.text='0' then edit13.text := '6';
if edit6.text='0' then edit13.text := '5';
if edit5.text='0' then edit13.text := '4';
if edit4.text='0' then edit13.text := '3';
if edit3.text='0' then edit13.text := '2';
if edit2.text='0' then edit13.text := '1';
if edit1.text='0' then edit13.text := '0';
 kk1 := strtofloat(edit1.text);
 kk2 := strtofloat(edit2.text);
 kk3 := strtofloat(edit3.text);
 kk4 := strtofloat(edit4.text);
 kk5 := strtofloat(edit5.text);
 kk6 := strtofloat(edit6.text);
 kk7 := strtofloat(edit7.text);
 kk8 := strtofloat(edit8.text);
 kk9 := strtofloat(edit15.text);
                                        //
if edit9.text='' then edit9.Text:= '0';
if edit10.text='' then edit10.Text := '0';
if edit11.text='' then edit11.Text := '0';
if edit11.text='0' then edit14.text := '2';
if edit10.text='0' then edit14.text := '1';
if edit9.text='0' then edit14.text := '0';
 ka1 := strtofloat(edit9.text);
 ka2 := strtofloat(edit10.text);
 ka3 := strtofloat(edit11.text);

 kas := ka1 + ka2 + ka3;
 kks := kk1+ kk2+ kk3+ kk4+ kk5+ kk6+ kk7+ kk8+ kk9;   //
 Label13.Caption := floattostr(kks);
 Label14.Caption := floattostr(kas);
 kkdurchschnitt := kks/ strtofloat(edit13.text);
 kadurchschnitt := kas/ strtofloat(edit14.text);

 notendurchschnitt := kkdurchschnitt*(2/3)+kadurchschnitt*(1/3);
 Edit12.Text := floattostr (notendurchschnitt);
end;

end.

Klaus01 27. Dez 2012 13:17

AW: ungültiger Gleitkommawert?
 
Hallo,

tritt das Problem hier auf
Delphi-Quellcode:
 kkdurchschnitt := kks/ strtofloat(edit13.text);
 kadurchschnitt := kas/ strtofloat(edit14.text);
Edit13 wird nur unter bestimmmten Bedingungen ein Wert zugewiesen.
Ansonsten ist Edit13.Text leer und ein leerer Text ist nunmal ein ungültiger Gleitkommawert.

Grüße
Klaus

Bummi 27. Dez 2012 13:18

AW: ungültiger Gleitkommawert?
 
Eines Deiner Editfelder enthält keinen gültigen "Floatwert" ...

mkinzler 27. Dez 2012 13:18

AW: ungültiger Gleitkommawert?
 
Aber auch eine Vorbelegung mit 0, wie bei den anderen Feldern wäre nicht gut ( 1 wäre weniger fehlerträchtig)

Popov 27. Dez 2012 15:57

AW: ungültiger Gleitkommawert?
 
@Eltonmaster

Ohne mir jetzt deinen Code angeguckt zu haben, möchte ich dich mit einer Funktion bekannt machen. Du kennst wohl die Funktion StrToFloat. Diese Funktion ist grundsätzlich fehleranfällig, genau wie StrToInt, denn die Funktionen verlangen gültige Zahlen als String (die eine Real, die andere Integer).

Es gibt zwei Möglichkeiten einer Fehlermeldung vorzubeugen: die eine ist den String vorher auf einen gültigen Wert zu prüfen und notfalls zu reagieren. Diese Methode ist meiner Meinung nach die Bessere. Die zweite Methode ist statt StrToFloat die Funktion StrToFloatDef zu nehmen. Bei StrToFloatDef kann man für den Fall, dass der String kein gültiger Wert ist, einen Default-Wert (Ersatz-Wert) nehmen. Allerdings, auch wenn hier in dem Fall dann keine Fehlermeldung mehr kommt, weiß man nie so genau ob es jetzt mit dem richtigen Wert gerechnet wurde oder Defaultwert. Also mit Bedacht einsetzten.

Delphi-Quellcode:
x := StrToFloatDef('ca. 3,14', 3.1415926);

sx2008 27. Dez 2012 16:23

AW: ungültiger Gleitkommawert?
 
Also ich würde das gesamte Programm komplett neu aufbauen.
Anstatt jede Note in ein Editfeld einzutragen ist es viel einfacher alle Noten
in ein mehrzeiliges Memofeld zu schreiben (jede Note in eine Zeile).

Delphi-Quellcode:
procedure TForm1.BerechneDurchschnitt;
var
  i : integer;
  zeile : string;
  summe,note : double;
  anzahl : integer;
begin
  summe := 0;
  anzahl := 0;

  // Noten aufsummieren
  for i := 0 to Memo1.Lines.Count-1 do
  begin
    zeile := Memo1.Lines[i];
    note := StrToFloatDef(zeile, -1);
    if note > 0.0 then
    begin
      summe := summe + note;
      Inc(anzahl);
    end;
  end;

  // Durchschnitt berechnen und anzeigen
  if anzahl > 0 then
    EditDurchschnitt.Text := FloatToStr(summe / anzahl)
  else
    EditDurchschnitt.Text := 'keine Noten vorh.';
end;

Eltonmaster 27. Dez 2012 18:50

AW: ungültiger Gleitkommawert?
 
Vielen Dank für die Antworten.

Zu Popov. Es dürften ja nur zugelassenen Werte (Zahlen) eingetragen werden, oder nicht? 0-6

Und sonst versuche ich es mal mit dem memofeld (könnt ihr mir mal erklähren wie die Rechnung dann aufgebaut ist, weil nur abkopieren ist ja sinnfrei ;))
Außerdem, muss ich denn keinen Button betätiegen wenn ich diese Variante (memo) verwende?

DeddyH 27. Dez 2012 18:53

AW: ungültiger Gleitkommawert?
 
Ganz anderer Vorschlag: statt der Edits ComboBoxen nehmen, Items zur Designtime eintragen, Style auf z.B. csOwnerDrawFixed und ItemIndex mit 0 vorbelegen. So kann es gar keine Fehleingaben geben.

p80286 27. Dez 2012 23:17

AW: ungültiger Gleitkommawert?
 
Delphi-Quellcode:
  private
  kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3 : real;
  kkdurchschnitt : real;
  kadurchschnitt : real;
  notendurchschnitt : real;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;
  kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3 : real;
  kkdurchschnitt : real;
  kadurchschnitt : real;
  notendurchschnitt : real;

implementation

procedure TForm3.Button2Click(Sender: TObject);
var
  kk1, kk2, kk3, kk4, kk5, kk6, kk7, kk8, kk9, kks, ka1, ka2, ka3, kas : real;
  kkdurchschnitt : real;
  kadurchschnitt : real;
  notendurchschnitt : real;
Ich sehe eigentlich keinen Grund warum Du die Variablen dreimal definiert hast.
Ebenso solltest Du statt real double oder single benutzen.

Gruß
K-H

Eltonmaster 27. Dez 2012 23:42

AW: ungültiger Gleitkommawert?
 
Das wahr ein Fehler von mir ;)

Und ich will nochmal darauf hinweisen: Ich bin ein neuling ;) d.h. Auch die
Methode mit der Box klingt gut, ich weiß aber nicht wie ich sie umsetzen soll.

Ps.: wenn ich double nehme wie heißt das dann (strto...) ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz