![]() |
Bruch einlesen
in edit2 soll ein Bruch eingegeben werden können. Was muss ich dafür verändern?
Das ist der Quelltext:
Delphi-Quellcode:
[edit=Matze][delphi]-Tags gesetzt. Zukünftig bitte selbst erledigen. Mfg, Matze[/edit]
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; |
Re: Bruch einlesen
Zitat:
Delphi-Quellcode:
L:=StrToFloat(edit2.Text);
|
Re: Bruch einlesen
In Welcher Form soll der Bruch eingegeben werden?
|
Re: Bruch einlesen
der Bruch soll z.B. sein: 1/5
@DaddyH: Kann sein, ich hatte diesen Begriff noch nicht. |
DP-Maintenance
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht um Delphi |
Re: Bruch einlesen
ich habs grad ausprobiert: auch StrTo Float funktioniert nicht
|
Re: Bruch einlesen
|
Re: Bruch einlesen
Das kann so nicht funktionieren. Du brauchst einen Formelparser.
|
Re: Bruch einlesen
Dann mußt du den String erstmal in Teilen und dann den Wert (als Float) berechnen.
|
Re: Bruch einlesen
Mein Problem ist halt, das der Benutzer die Möglichkeit haben soll, sowohl eine ganze Zahl als auch einen Bruch einzugeben.
|
Re: Bruch einlesen
Einfach nach '/' suchen wenn nicht vorhanden Quotient auf 1 setzen.
|
Re: Bruch einlesen
und wie geht das? Kannst du einfach den oben angegebenen Quelltext so verändern?
|
Re: Bruch einlesen
Hier mal schnell runtergetippt eine mögliche Lösung:
Delphi-Quellcode:
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.
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; |
Re: Bruch einlesen
Einfach mit Pos() die Position des Bruchstriches ermitteln.
|
Re: Bruch einlesen
|
Re: Bruch einlesen
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist jetzt der Komplette Quelltext:
Delphi-Quellcode:
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?
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. 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] |
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. |
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
|
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 |
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.
|
Re: Bruch einlesen
Dann schau doch mal in der Hilfe, was "ShowMessage" bewirkt.
|
Re: Bruch einlesen
ok, konkrete Frage: Was genau macht StrToFloat?
|
Re: Bruch einlesen
Zitat:
mfg Christian |
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. ;)
|
Re: Bruch einlesen
Zitat:
//Edit: 2 Mal hintereinander kein Roter Kasten... :cry: mfg Christian |
Re: Bruch einlesen
Genau, und das machst Du bei jedem Befehl, den Du nicht kennst. Du wirst Dich wundern, wie schnell Du lernst. :zwinker:
|
Re: Bruch einlesen
danke, ich wustte nicht, dass das geht!
|
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:
|
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 11:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz