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:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!