![]() |
AW: Programm Hilfe
Ich geb zu das es nicht schön ist, aber es tut's:
Delphi-Quellcode:
Das geht ganz gut ohne mod und div und kann ach mit 2,3,4,5,... stelligen Zahlen umgehen.
var
i : integer; liste: tstringlist; zahl1,zahl2,tmpzahl : string; zahlgros, zahlklein, differenz, altdifferenz : integer; cnt : integer; begin liste:=tstringlist.Create; tmpzahl:=edit1.Text; differenz:=0; cnt:=0; repeat altdifferenz:=differenz; (* ** ) liste.clear; ( * ************* *) for i:=1 to length(tmpzahl) do dummy1.add(tmpzahl[i]); dummy1.Sort; zahl1:=''; zahl2:=''; for i:=0 to liste.Count-1 do begin zahl1:=zahl1+dummy1[i]; zahl2:=dummy1[i]+zahl2; end; zahlgros:=strtoint(zahl2); zahlklein:=strtoint(zahl1); differenz:=zahlgros-zahlklein; memo1.Lines.Add(tmpzahl+' / '+zahl2+'-'+zahl1+' = '+inttostr(differenz)); tmpzahl:=inttostr(differenz); inc(cnt); until (altdifferenz=differenz) or (cnt >20); liste.Free; end; Gruß K-H |
AW: Programm Hilfe
@p80286:
Zitat:
So, wie der Code in deinem Beitrag steht, wird er nicht funktionieren. Warum?: Weil du auf eine StringList "dummy1" zugreifst, die nicht deklariert ist. Ich hab das ganze auch mal durchgespielt und bemerkt, daß bei allen 4-stelligen Zahlen 6174 als sich wiederholende Differenz herauskommt. Also hab ich mal Tante Google bemüht und bin auf diesen Link gestoßen. ![]() So sieht mein Code aus: (das in meinem Code angesprochene "meResult" ist ein TMemo)
Delphi-Quellcode:
PROCEDURE TForm1.Work(ss:string);
var r,s,t:string; len,i,j,res,old:integer; h:char; begin res:=-1; len:=Length(ss); SetLength(t,len); repeat old:=res; s:=ss; // s sortieren for i:=1 to len-1 do for j:=i+1 to len do if s[i]>s[j] then begin h:=s[i]; s[i]:=s[j]; s[j]:=h; end; // s reverse in t stellen for i:=1 to len do t[len+1-i]:=s[i]; res:=StrToInt(t)-StrToInt(s); // res als String mit führenden Nullen in r Str(res:len,r); for i:=1 to len do if r[i]=' ' then r[i]:='0' else break; meResult.Lines.Add(ss+' : '+t+' - '+s+' = '+r); ss:=r; until (res=old) or (meResult.lines.count>30); end; |
AW: Programm Hilfe
Jo da hast Du recht,
mit copy und paste bekommst Du den nicht zum laufen. Aber jeder der ein wenig mit Pascal umgehen kann findet den Fehler sofort. Gruß K-H Edith: interessant, der Link, wenn man's mit 5stelligen Zahlen macht hast Du eine Endlosschleife die sich um drei Werte bewegt. |
AW: Programm Hilfe
Closed
|
AW: Programm Hilfe
Mach doch mal einen
![]() [edit] Kleiner Tipp: man kann ja auch von hinten nach vorn kopieren, wenn man schon unbedingt Strings verwenden will. [/edit] |
AW: Programm Hilfe
Was ergibt hier kein sinn?
Delphi-Quellcode:
var
Form1: TForm1; i,j,zahl1,zahl2,differenz:integer; park,zahltext,zahltexteins,zahltextzwei:string; doppelt:boolean; a,b:array[1..4] of string; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin zahltext:=edit1.text; for i:=1 to 4 do begin //zerlegung a[i]:=copy(zahltext,i,1); b[i]:=copy(zahltext,i,1); end; // aufsteigend sortieren for j:=1 to 4 do if a[i]>=a[j] then begin park:=a[i];a[i]:=a[j];a[j]:=park; zahltexteins:=zahltext;// was in zahltext steht in zahltexteins speichern end; // absteigend sortieren if b[i]<=b[j] then begin park:=b[i];b[i]:=b[j];b[j]:=park; zahltextzwei:=zahltext; // was in zahltext steht in zahltextzwei speichern end; differenz:=Strtoint(zahltexteins)-Strtoint(zahltextzwei);// differenz der beiden zahlen edit2.text:=inttostr(differenz);// ausgabe end; end. |
AW: Programm Hilfe
Was ist für dich der Sinn?
Bzw., wo ist das Problem? Schonmal etwas von Codeformatierung/Codeausrichtung gehört? Dabei würde dir auffallen, daß dir absteigende sortierung nicht sortieren kann, da sie sich nicht innerhalb der Schleife befindet. Und wozu
Delphi-Quellcode:
und das Andere innerhalb der Schleife?
zahltexteins:=zahltext
Es verändert sich darin doch garnicht. Was machst du mit den Werten in a und b? (nach der Sortierung) Und warum die globalen Variablen, wo sie doch nur lokal (innerhalb der Prozedur) gnutzt werden |
AW: Programm Hilfe
Ich denke es gibt kein problem in dem quelltext, aber wenn ich starte und eine 4stellige zahl im edit fenster eingebe, dann kommt project1 fehler oder so.
ich habe es mir so vorgestellt, wenn er was in zahltext drin ist geordnet hat,das soll er in zahltexteins speichern. |
AW: Programm Hilfe
Hast Du Dir einmal angeschaut, welchen Wert i nach der ersten Schleife hat?
|
AW: Programm Hilfe
ah ja ihn wurde noch kein wert zugewiesen
|
AW: Programm Hilfe
Das bedeutet also, dass Dein Vergleich falsch ist.
|
AW: Programm Hilfe
Mit "oder so" können wir nichts anfangen. :warn:
Eine ordentliche Fehlermeldung wäre schon angebracht. Zitat:
Und mit einer ordentlichen Codeausrichtung sagt es eigentlich auch schon alles. |
AW: Programm Hilfe
Ich empfehle folgende Lektüre:
![]() |
AW: Programm Hilfe
Hab‘s mal durchgespielt. Das wird so nicht funktionieren, da du die Differenz in einer repeat until Schleife immer neu berechnen und sortieren mußt und diese auch mal nur eine dreistellige Zahl sein kann. Die mod div Variante war da eleganter (speichert z.B. 483 als 0483) oder du überprüfst die Länge von Differenz selbst und füllst entsprechend mit Nullen auf.
|
AW: Programm Hilfe
ich versteh eins nicht wir wissen ja das ist eine 4stellige zahl ist. Wieso also repeat machen wir das doch mit der for schleife
|
AW: Programm Hilfe
Hast du doch in #1 geschrieben, so oft wiederholen bis das Ergebnis der vorletzten Iteration dem Ergebnis der letzten Iteration entsprich (also 6174).
Delphi-Quellcode:
function GetFirstKaprekarsConstant(const Value: int64): int64;
var T, MinValue, MaxValue, PrevResult: int64; Number: array [1..10] of int64; I, J, N, Count: integer; begin Result:= 0; N:= Length(IntToStr(Value)); if (N in [3, 4, 6, 8, 9, 10]) and (Value > 0) then begin Result:= Value; Count:= 0; repeat PrevResult:= Result; for I:= 1 to N do begin *** Number[I] berechnen; end; *** Number sortieren *** MinValue und MaxValue berechnen Result:= MaxValue-MinValue; until (Result = PrevResult) or (Count > 1000); if Count > 1000 then Result:= 0; // Kein Ergebnis gefunden end; end; procedure TForm1.Button3Click(Sender: TObject); var Value: int64; begin Edit2.Text:= ''; if TryStrToInt64(Trim(Edit1.Text), Value) then Edit2.Text:= IntToStr(GetFirstKaprekarsConstant(Value)); end; |
AW: Programm Hilfe
Nein, nicht bis zum letzten, sondern nur einmal also. Delphi
Also ich muss ein Programm schreiben. Das Programm soll, 2 Edit Fenster 1 Button Also wenn man eine 4 stellige Zahl im edit fenster eingegeben hat und dann auf den Button klickt soll er folgendes machen, also er soll z.b 4123 einmal nach der größe und einmal nach der kleinsten ordnen Größte: 4321 Kleinste: 1234 Und von den beiden die Differenz bilden. 4321-1234=3087 Und diese Zahl soll er im 2.Edit Fenster ausgeben. edit: sorry |
AW: Programm Hilfe
Das hättest Du aber auch sagen können, dass die Aufgabenstellung mittlerweile vereinfacht wurde.
[edit] Trotzdem bleibe ich dabei: Das mit String-Operationen lösen zu wollen ist in meinen Augen suboptimal. [/edit] [edit2] Fassen wir das noch einmal zusammen: - 4-stellige Zahl wird eingegeben (als String, klar) - dieser String/diese Zahl muss nun in 4 Einzelteile gesplittet werden - nun werden die Teile sortiert (aufsteigend für Minimum, absteigend für Maximum) - anschließend wird das Minimum vom Maximum subtrahiert und dieses Ergebnis ausgegeben Das sollte sich doch mit den geposteten Hilfestellungen bewerkstelligen lassen. P.S.: Wenn man das Maximum oder Minimum bereits ermittelt hat, kann man das ja auch "umdrehen", um das Gegenteil zu ermitteln, ohne neu sortieren zu müssen. [/edit2] |
AW: Programm Hilfe
ER zerlegt die zahl.
Also wie soll ich fortsetzen, das mit dem ordnen. Bubblesort. Ich weiß das es eine 4Stellige zahl ist. Also d.h. for i:= 1 to 4 do
Delphi-Quellcode:
edit so?
var
Form1: TForm1; i,j,zahl1,zahl2,differenz:integer; park,spielplatz,zahltext,zahltexteins,zahltextzwei:string; doppelt:boolean; a,b:array[1..4] of string; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin zahltext:=edit1.text; for i:=1 to 4 do begin //zerlegung a[i]:=copy(zahltext,i,1); b[i]:=copy(zahltext,i,1); end; repeat for i:=1 to 4-1 do for j:=i+1 to 4 do if a[i] > a[i+1] then begin park:=a[i];a[i]:=a[i+1];a[i+1]:=park; until park=i>1 end; |
AW: Programm Hilfe
Nein, da Du bei einem Wert von i = 4 hinter dem Array liest. Außerdem brauchst Du mehrere Durchläufe, einer allein setzt ja nur den größten Wert ans Ende. Schau Dir doch den Wikipedia-Artikel noch einmal an.
|
AW: Programm Hilfe
genau da weiß ich nicht mehr weiter vielleicht eine hilfestellung
|
AW: Programm Hilfe
Delphi-Quellcode:
[edit] P.S.: Das ist aufsteigende Sortierung, für absteigende muss der Vergleich genau anders herum sein. [/edit]
Durchlauf := 1;
repeat //wir sagen mal von vornherein: wir sind fertig done := true; for i := Low(DeinArray) to High(DeinArray) - Durchlauf do if DeinArray[i] > DeinArray[i + 1] then begin //tauschen (selbst implementieren) //wir mussten tauschen, also doch nicht fertig done := false; end; Durchlauf := Durchlauf + 1; until done; //nix mehr getauscht -> fertig |
AW: Programm Hilfe
jetzt aber oder?
|
AW: Programm Hilfe
Es ist nicht sehr zielführend, wenn Du "alte" Posts editierst und man erst suchen muss, wo der geänderte Code jetzt steht. Außerdem subtrahierst Du ja jetzt fix immer 1, im Gegensatz zu mir. Und ein wenig Formatierung und Einrückung täte Deinem Code gut. Versuch doch erst einmal, den Bubblesort zu begreifen, dann siehst Du auch, wie Du ihn implementieren musst.
|
AW: Programm Hilfe
Delphi-Quellcode:
so?
doppelt:=true;
for i:= Low(a) to High(a) - Strtoint(park) do if a[i] > a[i+1] then begin park:=a[i];a[i]:=a[i+1];a[i+1]:=park; doppelt:= false; end; park :=strtoint(park) +1; until doppelt; |
AW: Programm Hilfe
Zitat:
Edit: Und aus dem park ein integer und aus a, b array [1..4] of integer statt string und StrToInt(Copy(.. |
AW: Programm Hilfe
Was willst Du denn jetzt mit diesem komischen "park" (und dann noch String als Integer samt Umwandlung)? Deklarier doch einfach eine Integer-Variable (in meinem Fall "Durchlauf"), dann kannst Du meinen Code fast 1:1 übernehmen.
|
AW: Programm Hilfe
Delphi-Quellcode:
so?
Form1: TForm1;
i,j,zahl1,zahl2,differenz,durchlauf,park:integer; spielplatz,zahltext,zahltexteins,zahltextzwei:string; doppelt:boolean; a,b:array[1..4] of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin zahltext:=edit1.text; for i:=1 to 4 do begin //zerlegung a[i]:=copy(Strtoint(zahltext),i,1); b[i]:=copy(Strtoint(zahltext),i,1); end; durchlauf:=1; repeat doppelt:=true; for i:= Low(a) to High(a) - durchlauf do if a[i] > a[i+1] then begin park:=a[i];a[i]:=a[i+1];a[i+1]:=park; doppelt:= false; end; durchlauf :=durchlauf +1; until doppelt; wie so? |
AW: Programm Hilfe
In dieser Variante gibt es kein J.
|
AW: Programm Hilfe
das mit copy ist schwer dann
|
AW: Programm Hilfe
Wenn Du jetzt noch die ganzen globalen Variablen (bis auf Form1) rauswirfst und stattdessen als lokale deklarierst, dann sollte das Ganze funktionieren. Und wenn Du dann auch noch endlich ordentlich einrückst, wird das sogar lesbar.
|
AW: Programm Hilfe
wie soll ich jetzt die differenz bilden.
Delphi-Quellcode:
Form1: TForm1;
i,j,zahl1,zahl2,differenz,durchlauf,park:integer; spielplatz,zahltext,zahltexteins,zahltextzwei:string; doppelt:boolean; a,b:array[1..4] of integer; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin zahltext:=edit1.text; for i:=1 to 4 do begin a[i]:=copy(zahltext,i,1); b[i]:=copy(zahltext,i,1); end; durchlauf:=1; repeat doppelt:=true; for i:= Low(a) to High(a) - durchlauf do if a[i] > a[i+1] then begin park:=a[i];a[i]:=a[i+1];a[i+1]:=park; doppelt:= false; end; durchlauf :=durchlauf +1; until doppelt; differenz:= Strtoint(park)-durchlauf; edit2.text:=durchlauf(differenz); |
AW: Programm Hilfe
aber es muss doch im edit 2 erscheinen ^^:gruebel:
|
AW: Programm Hilfe
Indem Du Deine Strings (die Du ja unbedingt haben wolltest) in Zahlen umwandelst und subtrahierst.
|
AW: Programm Hilfe
aber welche im algho steht nicht wo ich z.b die größte zahl gespeichert habe u.s.w
|
AW: Programm Hilfe
Ich frag mal ganz dumm: verstehst Du eigentlich, was Du da tust? Wenn nicht, dann löse die Aufgabe doch erst einmal mit Papier und Stift (Schreibtischtest hatte ich ja schon einmal angesprochen).
|
AW: Programm Hilfe
ich verstehe alles auser das mit der differenz und wie man das alles in edit 2 fenster ausgibt also das ergebnis
|
AW: Programm Hilfe
|
AW: Programm Hilfe
Delphi-Quellcode:
wie so
Differenz:=Strtoint(..)-Strtoint(..); Edit2.text:=InTtoStr(..); |
AW: Programm Hilfe
Genauso.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz