| Autor |
Beitrag |
Webkommissar
Hält's aus hier
Beiträge: 15
|
Verfasst: 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: 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
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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...
Gruss...
_________________ Bald ist es geschafft - ABI `03 - juuhuuu!!!
|
|
Trialtom
      
Beiträge: 38
|
Verfasst: Mo 16.12.02 17: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 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mo 16.12.02 17:47
Das ist doch schon ein Ansatz! Ich brauch leider etwas, was wirklich auch 10stellige Perioden berechnet!
Gruss...
_________________ Bald ist es geschafft - ABI `03 - juuhuuu!!!
|
|
Webkommissar 
Hält's aus hier
Beiträge: 15
|
Verfasst: Di 17.12.02 14:29
Kann mir denn keiner helfen???
Gruss...
_________________ Bald ist es geschafft - ABI `03 - juuhuuu!!!
|
|
DaFox
      
Beiträge: 189
|
Verfasst: 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:
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  ). 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
Gruß,
Markus
|
|
Webkommissar 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 189
|
Verfasst: 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:
www.auq.de/viewtopic.php?t=3642
Gruß,
Markus
|
|
Webkommissar 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 189
|
Verfasst: Di 17.12.02 20:34
Nachtrag:
Schau mal, ob Du damit was anfangen kannst:
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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 189
|
Verfasst: 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? 
|
|
Webkommissar 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 18.12.02 09:55
Heute! 
_________________ Bald ist es geschafft - ABI `03 - juuhuuu!!!
|
|
|