1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
program Fractions;
{$FRAME_WIDTH 400}
{$FRAME_HEIGHT 240}
uses
Flash8;
function StrToFloat(expression: string): Number external 'parseFloat';
type
tFraction = record
n: integer; // numérateur
d: integer; // dénominateur
end;
const
dmax = 10000; // borne supérieure pour la recherche du dénominateur
function Fraction(nombre: number): tFraction;
var
d: integer;
e: number; // erreur
m: number; // moindre erreur
begin
for d := 1 to dmax do
begin
e := Abs(nombre * d - Trunc(Math.Round(nombre * d)));
if d = 1 then
m := e
else
if e < m then
m := e;
end;
for d := 1 to dmax do
begin
e := Abs(nombre * d - Trunc(Math.Round(nombre * d)));
if e = m then
begin
Result.d := d;
Result.n := Trunc(Math.Round(nombre * d));
Exit;
end;
end;
end;
type
tEditBox = class(textField)
procedure onKeyDown;
end;
var
e: tEditBox;
t: textField;
procedure tEditBox.onKeyDown;
var
f: tFraction;
begin
if key.getAscii = 13 then
begin
f := Fraction(StrToFloat(e.text));
t.text := "Meilleur résultat: " + IntToStr(f.n) + "/" + IntToStr(f.d);
end;
end;
begin
with textField.Create(_root, 'label', 0, 0, 0, stage.width - 1, 4 * 16 + 4) do
begin
SetNewTextFormat(textFormat.Create('Courier New', 12));
text := "FlashPascal 2."#13
+ "Conversion d'un nombre décimal en fraction."#13
+ "Veuillez saisir un nombre décimal:";
end;
e := tEditBox.Create(_root, 'input', 1, 0, 3 * 16 + 4, stage.width - 1, 16 + 4);
e.setNewTextFormat(textFormat.Create('Courier New', 12));
e.type := 'input';
e.border := TRUE;
e.borderColor := $e0e0e0;
selection.setFocus(e);
key.addListener(e);
t := textField.Create(_root, 'output', 2, 0, 3 * 16 + 4 + 16 + 4, stage.Width - 1, stage.height - (3 * 16 + 4 + 16 + 4));
t.SetNewTextFormat(textFormat.Create('Courier New', 12));
stage.scaleMode := 'noScale';
end. |
Partager