Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Bruch einlesen (https://www.delphipraxis.net/93732-bruch-einlesen.html)

PetBurki 10. Jun 2007 16:45


Bruch einlesen
 
in edit2 soll ein Bruch eingegeben werden können. Was muss ich dafür verändern?
Das ist der Quelltext:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var L: real;
begin
L:=StrToInt(edit2.Text);
if (StrToInt(edit1.Text)=H+1) and (L=(F/(H+1))) then
begin
label7.visible:=true;
end;
[edit=Matze][delphi]-Tags gesetzt. Zukünftig bitte selbst erledigen. Mfg, Matze[/edit]

DeddyH 10. Jun 2007 16:47

Re: Bruch einlesen
 
Zitat:

Zitat von PetBurki
Delphi-Quellcode:
L:=StrToInt(edit2.Text);

Sollte das nicht eher heißen
Delphi-Quellcode:
L:=StrToFloat(edit2.Text);

mkinzler 10. Jun 2007 16:48

Re: Bruch einlesen
 
In Welcher Form soll der Bruch eingegeben werden?

PetBurki 10. Jun 2007 16:49

Re: Bruch einlesen
 
der Bruch soll z.B. sein: 1/5
@DaddyH: Kann sein, ich hatte diesen Begriff noch nicht.

DP-Maintenance 10. Jun 2007 16:50

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht um Delphi

PetBurki 10. Jun 2007 16:51

Re: Bruch einlesen
 
ich habs grad ausprobiert: auch StrTo Float funktioniert nicht

Matze 10. Jun 2007 16:53

Re: Bruch einlesen
 
Wenn im Edit etwas steht wie 1/5 dann müsstest du das zuerst manuell zerlegen. Beispielsweise per Delphi-Referenz durchsuchenCopy und Delphi-Referenz durchsuchenPos, dass du getrennt den Zähler und Nenner behandeln kannst.

DeddyH 10. Jun 2007 16:53

Re: Bruch einlesen
 
Das kann so nicht funktionieren. Du brauchst einen Formelparser.

mkinzler 10. Jun 2007 16:53

Re: Bruch einlesen
 
Dann mußt du den String erstmal in Teilen und dann den Wert (als Float) berechnen.

PetBurki 10. Jun 2007 17:05

Re: Bruch einlesen
 
Mein Problem ist halt, das der Benutzer die Möglichkeit haben soll, sowohl eine ganze Zahl als auch einen Bruch einzugeben.

mkinzler 10. Jun 2007 17:06

Re: Bruch einlesen
 
Einfach nach '/' suchen wenn nicht vorhanden Quotient auf 1 setzen.

PetBurki 10. Jun 2007 17:07

Re: Bruch einlesen
 
und wie geht das? Kannst du einfach den oben angegebenen Quelltext so verändern?

Matze 10. Jun 2007 17:09

Re: Bruch einlesen
 
Hier mal schnell runtergetippt eine mögliche Lösung:

Delphi-Quellcode:
var
  PosBruchstrich: Integer;
  EditText: string;

  Zaehler, Nenner: Double;
begin
  EditText := Edit4.Text;
  PosBruchstrich := Pos('/', EditText);

  if PosBruchstrich > 0 then
  begin
    Zaehler := StrToFloat(Copy(EditText, 1, PosBruchstrich - 1));
    Nenner := StrToFloat(Copy(EditText, PosBruchstrich + 1,
      Length(EditText) - PosBruchstrich));
  end else
  begin
    Zaehler := StrToFloat(EditText);
    Nenner := 1;
  end;

  ShowMessage('Zähler: ' + FloatToStr(Zaehler) + #13#10 +
    'Nenner: ' + FloatToStr(Nenner));
end;
Aber Fehleingaben darfst du selbst abfangen. Versuche aber den Code zu verstehen (die OH hilft), sonst lernst du nichts und hast später massive Probleme beim Programmieren.

mkinzler 10. Jun 2007 17:09

Re: Bruch einlesen
 
Einfach mit Pos() die Position des Bruchstriches ermitteln.

r2c2 10. Jun 2007 17:17

Re: Bruch einlesen
 
http://r2c2.weingut-rehn.de/content3...mit_Delphi.htm

mfg

Christian

PetBurki 10. Jun 2007 17:25

Re: Bruch einlesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist jetzt der Komplette Quelltext:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    Label5: TLabel;
    Image1: TImage;
    Label6: TLabel;
    Image2: TImage;
    Label7: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  F, H: integer ;

implementation


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
H:=random(9)+1;
F:=random(9)+1;
label2.Caption:=IntToStr(H);
label3.Caption:=IntToStr(F);

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  PosBruchstrich: Integer;
  EditText: string;

  Zaehler, Nenner: Double;
begin
  EditText := Edit2.Text;
  PosBruchstrich := Pos('/', EditText);

  if PosBruchstrich > 0 then
  begin
    Zaehler := StrToFloat(Copy(EditText, 1, PosBruchstrich - 1));
    Nenner := StrToFloat(Copy(EditText, PosBruchstrich + 1,
      Length(EditText) - PosBruchstrich));
  end else
  begin
    Zaehler := StrToFloat(EditText);
    Nenner := 1;
  end;

  ShowMessage('Zähler: ' + FloatToStr(Zaehler) + #13#10 + 
    'Nenner: ' + FloatToStr(Nenner));
end;


end.
Jetzt öffnet er mir ein Fenster und gibt den Zähler und nenner aus. Das Programm sollte aber eigentlich überprüfen, ob die zufällig erstellte funktion richtig rückwärts abgeleitet worden si (=Stammfunktion erstellen). Wie änder ich es ab, damit es das tut?

Fals es hilft: Ich habe einen screenshot vom Aufbau (Buttons, etc) angehängt

[edit=Matze][delphi]-Tags gesetzt und den doppelten Anhang entfernt. Mfg, Matze[/edit]

Matze 10. Jun 2007 17:35

Re: Bruch einlesen
 
Dann musst du meinen Code natürlich anpassen. Ich habe dir gezeigt, wie man den Zähler und Nenner ermitteln kann, nun bist du dran. Überlege mal, wie es lauten muss. Alles einfach zusammenkopieren bringt nichts, versuche den Code zu verstehen.

PS: Setze zukünftig bitte selbst die [delphi]-Tags.
PPS: Ein 1.75 MB großes Bitmap ist als Anhang auch gänzlich ungeeignet. Ein vielleicht 200 KB kleines JPG- oder GIF-Bild wäre besser.

Edit: Randomize solle nur einmal aufgerufen werden, daher ist dies am Besten im OnCreate des Formulars aufgehoben.

PetBurki 10. Jun 2007 17:44

Re: Bruch einlesen
 
Mein Problem ist, dass ich erst seit anfang de schuljahres (ca3/4 Jahr) Unterricht habe und der Lehrer sehr langsam ist, so dass wir fast nichts lernen. Deßwegen versteh ich manche Ausdrücke noch nicht

r2c2 10. Jun 2007 17:49

Re: Bruch einlesen
 
Sry, aber welche Ausdrücke verstehst du nicht(das kann man normalerweise ändern)?

Ich sehe nicht, was man an den Ausdrücken "Überlege mal", "nur einmal", "versuchen zu verstehen", etc. nicht verstehen kann...

Wenn du konkrete Fragen hast, dann stelle sie. Deine Hausaufgaben werden wir aber nicht machen...

mfg

Christian

PetBurki 10. Jun 2007 17:50

Re: Bruch einlesen
 
das sind keine Hausaufgaben. Das mache ich nur für mich, in der Hoffnung ein bischen mehr zu können als uns der Lehrer beibringt.

DeddyH 10. Jun 2007 17:52

Re: Bruch einlesen
 
Dann schau doch mal in der Hilfe, was "ShowMessage" bewirkt.

PetBurki 10. Jun 2007 17:52

Re: Bruch einlesen
 
ok, konkrete Frage: Was genau macht StrToFloat?

r2c2 10. Jun 2007 17:53

Re: Bruch einlesen
 
Zitat:

Zitat von PetBurki
das sind keine Hausaufgaben. Das mache ich nur für mich, in der Hoffnung ein bischen mehr zu können als uns der Lehrer beibringt.

Und was soll es dir bringen, wenn du die Lösung kennst, aber nicht verstehst, weil du dich selbst nicht damit beschäftigst...? :gruebel:

mfg

Christian

Matze 10. Jun 2007 17:54

Re: Bruch einlesen
 
Setze den Caret (blinkendes Strichlein im Code-Editor) auf diese Funktion und drücke F1. Du wirst wundern, dass du solche Dinge auf die einfache Art und Weise selbst herausbekommen kannst. ;)

r2c2 10. Jun 2007 17:54

Re: Bruch einlesen
 
Zitat:

Zitat von PetBurki
ok, konkrete Frage: Was genau macht StrToFloat?

Weißt du, wie sich die F1-Taste auf deiner Tastatur befindet? Einfach StrToFloat in Delphi eingeben und F1 drücken...

//Edit: 2 Mal hintereinander kein Roter Kasten... :cry:

mfg

Christian

DeddyH 10. Jun 2007 17:56

Re: Bruch einlesen
 
Genau, und das machst Du bei jedem Befehl, den Du nicht kennst. Du wirst Dich wundern, wie schnell Du lernst. :zwinker:

PetBurki 10. Jun 2007 18:00

Re: Bruch einlesen
 
danke, ich wustte nicht, dass das geht!

DeddyH 10. Jun 2007 18:04

Re: Bruch einlesen
 
Nun weißt Du es. Meinst Du denn, irgendjemand hier hätte alle Methoden der VCL samt Win32-API mit allen Parametern im Kopf? Den möchte ich sehen. :zwinker:

cruiser 10. Jun 2007 19:32

Re: Bruch einlesen
 
mh... mal eine Funktion, die einen String in eine Extended (Floatingpoint) Variable wandelt.

sollte die Eingabe ungültig sein gibt die Funktion NaN zurück

Beispieleingaben sind: '1,34', '-1,34', '2/3', '-2/3', '1 4/5', '-1 4/5'

Delphi-Quellcode:
function TextToFloat(const s: string): Extended;
const
  NaN = 0.0 / 0.0;
var
  allowed: set of Char;
  decpos,l,i: Integer;
  m, g, z, n: Extended;
  pc: ^Char;
  aftercomma, evalz, evaln: Boolean;

  // Hilfsfunktion fuer 10er Potenz
  function decposmul: Extended;
  begin
    Result := Exp(decpos * Ln(10));
  end;
begin
  // Ergebnis ist noch keine Zahl
  Result := NaN;

  // laenge ermitteln, bei bedarf rausgehn
  l := Length(s);
  if l = 0 then Exit;

  // Stati setzen
  allowed := ['0'..'9', ' ', '/'];
  aftercomma := False;
  evalz := False;
  evaln := False;

  // Position + Pointer auf Start setzen
  i := 1;
  pc := @s[i];

  // Positiv/Negativ Auswertung
  if pc^ = '-' then begin
    m := -1.0;
    Inc(pc);
    Inc(i);
  end else if pc^ = '+' then begin
    m := 1.0;
    Inc(pc);
    Inc(i);
  end else begin
    m := 1.0;
  end;

  // Werte setzen
  decpos := 0;
  g := 0.0;
  z := 0.0;
  n := 0.0;

  // Ganzzahl/Dezimalzal (X)
  while i <= l do begin
    // Zeichen nicht erlaubt -> Funktion beenden
    if not((pc^ in allowed) or (pc^ = DecimalSeparator)) then Exit;
    // Leerzeichen trennt ganze Zahl von Bruch
    if pc^ = ' ' then begin
      // Komma wurde vorher gefunden -> ungueltig
      if aftercomma then Exit;
      Inc(pc);
      Inc(i);
      evalz := True;
      Break;
    end;
    // Schraegstrich trennt Zaehler und Nenner
    if pc^ = '/' then begin
      // Komma wurde vorher gefunden -> ungueltig
      if aftercomma then Exit;
      z := g;
      g := 0.0;
      evaln := True;
      Inc(pc);
      Inc(i);
      Break;
    end;
    // Komma (oder Punkt) fuer Dezimalzahlen
    if pc^ = DecimalSeparator then begin
      aftercomma := True;
      Inc(pc);
      Inc(i);
      Continue;
    end;
    // Zahlen auswerten
    if aftercomma then begin
      Dec(decpos);
      g := decposmul * (Ord(pc^) - 48) + g;
    end else begin
      g := g * 10 + (Ord(pc^) - 48);
    end;
    Inc(i);
    Inc(pc);
  end;

  allowed := ['0'..'9', '/'];

  if evalz then begin
    while i <= l do begin
      // Zeichen nicht erlaubt -> Funktion beenden
      if not(pc^ in allowed) then Exit;
      if pc^ = '/' then begin
        if i = l then Exit;
        evaln := True;
        Inc(pc);
        Inc(i);
        Break;
      end;
      z := z * 10 + (Ord(pc^) - 48);
      Inc(decpos);
      Inc(pc);
      Inc(i);
    end;
  end;

  allowed := ['0'..'9'];

  if evaln then begin
    decpos := 0;
    while i <= l do begin
      // Zeichen nicht erlaubt -> Funktion beenden
      if not(pc^ in allowed) then Exit;
      n := n * 10 + (Ord(pc^) - 48);
      Inc(decpos);
      Inc(pc);
      Inc(i);
    end;
  end;

  if evalz and evaln then
    Result := m * (g + (z / n))
  else
    Result := m * g;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 Uhr.

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