Entwickler-Ecke

Sonstiges (Delphi) - Perioden von Divisionen darstellen


Webkommissar - Mo 16.12.02 17:31
Titel: Perioden von Divisionen darstellen
Und zwar soll ich in der Schule ein Programm basteln, dass Perioden von Divisionen darstellt. Normale Perioden kann ich jetzt schon darstellen, aber die unreinen noch nicht. Weiß auch gar nicht wie ich da ran soll. Unreine Perioden sind z.B. das Ergebnis aus 1/6. da kommt 0,16666 raus. Das Prog soll mir aber als Periode nur die 6 ausgeben. Aber wie?? HIer mein bisheriger Quelltext:

Quelltext
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:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    ListBox1: TListBox;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
VAR a,b,c,d,e,fe:integer;                 //Deklarierung
    c_str,erg_str:string;
begin
Edit3.Clear;
Label2.visible:=false;
Label3.visible:=false;
Label4.Visible:=false;
Edit3.visible:=false;
val(Edit1.Text,a,fe);
val(Edit2.Text,b,fe);
If a > b then
  Begin
   Label2.visible:=true;                  //bei unechtem Bruch
   Edit3.Visible:=false;
   Beep;
  End
Else
  Begin                                   //erster Durchgang
        a:=a*10;
        c:=a div b;
        d:=a mod b;                       //d ist Rest der Teilung
        a:=d*10;
        str(c,erg_str);                   //Umwandlung in String
        Edit3.Text:=erg_str;              //Ausgabe des Ergebnisses in Edit3
        If d = 0 Then
         Begin
          Label3.Visible:=true;            //wenn kein Rest, für z.B.: 3 / 3
          Edit3.Visible:=false;
         End
        Else
         While (d <> e) and (e > 0) do         //Beginn der Schleife
           Begin
             c:=a div b;
             e:=a mod b;                       //e ist Rest in der Schleife
             If e = d then
               Begin
                Edit3.Visible:=true;          //gleicher Rest->Ende der Periode
                Label4.Visible:=true;
               End
             Else
               If e = 0 Then
                Begin
                  Label3.Visible:=true;        //kein Rest -> Keine Periode
                  Edit3.Visible:=false;
                End
               Else
                 Begin
                  a:=e*10;
                  str(c,c_str);
                  erg_str:=erg_str + c_str;
                  Label4.Visible:=true;
                  Edit3.visible:=true;
                  Edit3.Text:=erg_str;
                 End;
             End;
         End;

End;

procedure TForm1.Button2Click(Sender: TObject);
VAR z1,z2,fe:integer;
    z1_str,z2_str:string;
begin                                          
z1:=random(100);
z2:=random(100);
str(z1,z1_str);
str(z2,z2_str);
Edit1.Text:=z1_str;
Edit2.Text:=z2_str;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Randomize;
end;

procedure TForm1.Button3Click(Sender: TObject);
VAR erg,fe:integer;
    erg_str:string;
begin
val(Edit3.Text,erg,fe);
str(erg,erg_str);
Listbox1.Items.Add(erg_str);
ListBox1.Sorted := not ListBox1.Sorted;
end;

end.


Hoffe ihr könnt mir helfen!

Gruss...

(16.12. 16:55 Tino) Titel geändert.


foxy - Mo 16.12.02 17:41

sersen du willst nur die 6 haben und nicht 0,166666 ???
mach einfach ne abfrage, wieviel zeichen in dem string enthalten sind, -3 dann haste es.
Fals es kein String ist sonder integer dann wandle das um mit IintToStr();
Genauere Bsp. findeste hier im Forum wenn du suchst


Webkommissar - Mo 16.12.02 17:49

Aber wenn ich ein Ergbnis habe, das 0,24898989898989 lautet, soll das Prog mir 89 ausgeben. Ich glaube, sofern ich Deine Antwort richtig verstanden habe, dass Du das nciht bedacht hast... :D

Gruss...


Trialtom - Mo 16.12.02 18:42


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
begin
a:=floattostr(1/6);
delete(a,1,10);
delete(a,3,20);
if a[1]=a[2] then
delete(a,1,1);
end;


a sei die rationale zahl (in einem string gespeichert), die am anfang definiert wird --> hier a:=floattostr(1/6).
am schluss hat a den Wert 6.
Bei zum Beispiel 5/11, wäre am Schluss der Wert 45.

eigentlich gefällt mir dieser weg nicht sehr gut, weil es perioden vertauschen können (statt 45, halt 54), und es geht auch nicht für perioden, bestehend aus mehr als 2 zahlen.


Webkommissar - Mo 16.12.02 18:47

Das ist doch schon ein Ansatz! Ich brauch leider etwas, was wirklich auch 10stellige Perioden berechnet! :cry:



Gruss...


Webkommissar - Di 17.12.02 15:29

Kann mir denn keiner helfen??? :cry:



Gruss...


DaFox - Di 17.12.02 16:53

Hi!

Nicht ganz mein Themengebiet, aber interessantes Problem. Ich versuche mal zu helfen:

Folgender Code berechnet Dir die Anzahl der Periodenstellen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);
var
  n: Integer;
  t: Integer;
  k: Integer;
begin
  n := StrToInt(Edit1.Text); // -> (1 / Edit1.Text)
  t := 10 mod n;
  k := 1;
  while (t <> 1) do
  begin
    t := (t * 10) mod n;
    k := k + 1;
  end;
  Label1.Caption := 'Anzahl der Periodenziffern: ' + IntToStr(k);
end;


Problem dabei ist, dass dieser Algorithmus nur funktioniert, wenn keine Vorperiode existiert und der Bruch periodisch ist (logisch :wink: ). Anderenfalls gibt's 'ne Endlosschleife :(

Um zu bestimmen wie viele Stellen die Vorperiode hat (also z.B. 2 in Deinem Bsp. 0,24898989898989):
- Primfaktorzerlegung von n
- a und b sind Exponenten von 2 und 5 in der PFZ von n
- max(a, b) entspricht der Länge der Vorperiode

Alle Angaben ohne Gewähr :P

Gruß,
Markus


Webkommissar - Di 17.12.02 20:54

Hey DaFox!

Danke, aber denn Code, den Du mir gibst, hab ich ähnlich schon. Die normalen Perioden hab ich ja sleber, wie Du in meinem Vode sehen kannst. Das mit der Primfaktorzahlzerlegung versteh ich net. Was ist das?? Kannst Du mir das nochmal näher erklären, vielleicht hilft es mir ja weiter...


Gruss...


DaFox - Di 17.12.02 21:06

Hi!

Das ist Mathe.
Der Hintergrund ist eben, dass sich jede natürliche Zahl aus Primzahlfaktoren zusammensetzen lässt!

Probier' mal das hier aus:
:arrow: http://www.auq.de/viewtopic.php?t=3642

Gruß,
Markus


Webkommissar - Di 17.12.02 21:15

Und mit dieser PFZ bekomm ich die unreinen Perioden bzw. die reinen aus den unreinen raus??? Wäre cool! Das Problem ist nur, dass ich jetzt überhaupt nicht wüsste, wie ich das in mein oben stehenden Code einbinde... :? :(



Gruss...


DaFox - Di 17.12.02 21:34

Nachtrag:

Schau mal, ob Du damit was anfangen kannst:


Quelltext
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:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
  public
    Remainders: String;
    function FindRemainder(rem: Integer): Integer;
  end;

...

function TForm1.FindRemainder(rem: Integer): Integer;
var
  NextComma: Integer;
  Temp, CurDigit: String;
begin
  Temp := Remainders;
  if (Length(Temp) = 0) then
  begin
    result := -1;
    exit;
  end;
  result := 0;
  while (Pos(',', Temp) > 0) do
  begin
    NextComma := Pos(',', Temp);
    CurDigit := Copy(Temp, 1, NextComma - 1);
    if (StrToInt(CurDigit) = rem) then exit;
    Temp := Copy(Temp, NextComma + 1, Length(Temp));
    Inc(result);
  end;
  result := -1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Remainder, Digit, x: Integer;
  Numerator, Denominator: Integer;
  FormattedResult: String;
  WholePart: String;
  Digits: String;
begin
  Remainders := '';
  Numerator := StrToInt(Edit1.Text);
  Denominator := StrToInt(Edit2.Text);
  WholePart := IntToStr(Numerator div Denominator);
  Remainder := Numerator mod Denominator;
  while (FindRemainder(Remainder) < 0) do
  begin
    Digit := (Remainder * 10) div Denominator;
    Digits := Digits + IntToStr(Digit);
    Remainders := Remainders + IntToStr(Remainder) + ',';
    Remainder := (Remainder * 10) mod Denominator;
  end;
  x := FindRemainder(Remainder);
  FormattedResult := WholePart + '.';
  FormattedResult := FormattedResult + Copy(Digits, 1, x);
  FormattedResult := FormattedResult + '(';
  FormattedResult := FormattedResult + Copy(Digits, x+1, Length(Digits) - x) + ')';
  Edit3.Text := FormattedResult;
end;


Viel Spaß,
Markus


Webkommissar - Di 17.12.02 22:30

Ich bin Dir echt dankbar für Deine Hilfe und fühle mich voll schlecht, wenn ich was bemängeln muss, aber leider hab ich keine andere Wahl. :(
Und zwar hab ich mit der Lösung noch zwei Probleme:

1. Gibt er mir das Ergbnis ja ganz aus und die Periode steht nur in der Klammer.
2. Benutzt Du da Sachen, die ich nicht kenne und wir somit die auch nicht im Unterricht gelernt haben. Klar können wir paar neue Befehle reinnehmen, die wir irgendwo nachlesen, aber halt nicht so viele. Das gilt dann leider als Täuschungsversuch.

Trotzdem super dollen Dank an Dich, vielleicht fällt Dir ja noch was ein...

Gruss...


DaFox - Di 17.12.02 23:09

Hi!

Kannst Du das nicht alleine, sonst mache ich Dir ja die ganzen Hausaufgaben. In anderen Foren wird man in solchen Fällen ausgebuht (wenn man anderen bei Hausaufgaben hilft)!!!

1. Das sollte das kleinere Problem sein
2. Was gefällt Dir denn genau nicht daran. Procedures verwendest du auch, Funktionen setze ich mal voraus, die arithmetischen Operatoren div und mod hast Du oben auch verwendet. Also fehlt nur noch IntToStr und StrToInt, wobei diese auch in Deinem Quellcode vorkommen. Alles andere sind Variablen, normale Schleifen usw.

Gruß,
Markus

PS: Wann ist denn Abgabe? :lol:


Webkommissar - Mi 18.12.02 10:55

Heute! :cry: