Autor Beitrag
Webkommissar
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 16.12.02 16:31 
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:
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Mo 16.12.02 16: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

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
Webkommissar Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mo 16.12.02 16: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...

_________________
Bald ist es geschafft - ABI `03 - juuhuuu!!!
Trialtom
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mo 16.12.02 17:42 
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 15



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



Gruss...

_________________
Bald ist es geschafft - ABI `03 - juuhuuu!!!
Webkommissar Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 17.12.02 14:29 
Kann mir denn keiner helfen??? :cry:



Gruss...

_________________
Bald ist es geschafft - ABI `03 - juuhuuu!!!
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Di 17.12.02 15:53 
Hi!

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

Folgender Code berechnet Dir die Anzahl der Periodenstellen:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 17.12.02 19: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...

_________________
Bald ist es geschafft - ABI `03 - juuhuuu!!!
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Di 17.12.02 20: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: www.auq.de/viewtopic.php?t=3642

Gruß,
Markus
Webkommissar Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 17.12.02 20: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...

_________________
Bald ist es geschafft - ABI `03 - juuhuuu!!!
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Di 17.12.02 20:34 
Nachtrag:

Schau mal, ob Du damit was anfangen kannst:

ausblenden volle Höhe 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 17.12.02 21: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...

_________________
Bald ist es geschafft - ABI `03 - juuhuuu!!!
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Di 17.12.02 22: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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 18.12.02 09:55 
Heute! :cry:

_________________
Bald ist es geschafft - ABI `03 - juuhuuu!!!