Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Programm Hilfe (https://www.delphipraxis.net/163840-programm-hilfe.html)

p80286 20. Okt 2011 10:07

AW: Programm Hilfe
 
Ich geb zu das es nicht schön ist, aber es tut's:
Delphi-Quellcode:
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;
Das geht ganz gut ohne mod und div und kann ach mit 2,3,4,5,... stelligen Zahlen umgehen.

Gruß
K-H

Amateurprofi 20. Okt 2011 12:30

AW: Programm Hilfe
 
@p80286:
Zitat:

Das geht ganz gut ohne mod und div und kann ach mit 2,3,4,5,... stelligen Zahlen umgehen.
Hast du das denn wirklich mal probiert.
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.
http://en.wikipedia.org/wiki/6174_(number)

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;

p80286 20. Okt 2011 13:02

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.

boxer123 20. Okt 2011 13:56

AW: Programm Hilfe
 
Closed

DeddyH 20. Okt 2011 14:00

AW: Programm Hilfe
 
Mach doch mal einen Schreibtischtest.

[edit] Kleiner Tipp: man kann ja auch von hinten nach vorn kopieren, wenn man schon unbedingt Strings verwenden will. [/edit]

boxer123 23. Okt 2011 11:00

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.

himitsu 23. Okt 2011 11:09

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:
zahltexteins:=zahltext
und das Andere innerhalb der Schleife?
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

boxer123 23. Okt 2011 11:11

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.

DeddyH 23. Okt 2011 11:16

AW: Programm Hilfe
 
Hast Du Dir einmal angeschaut, welchen Wert i nach der ersten Schleife hat?

boxer123 23. Okt 2011 11:19

AW: Programm Hilfe
 
ah ja ihn wurde noch kein wert zugewiesen

DeddyH 23. Okt 2011 11:21

AW: Programm Hilfe
 
Das bedeutet also, dass Dein Vergleich falsch ist.

himitsu 23. Okt 2011 11:25

AW: Programm Hilfe
 
Mit "oder so" können wir nichts anfangen. :warn:

Eine ordentliche Fehlermeldung wäre schon angebracht.


Zitat:

Das bedeutet also, dass Dein Vergleich falsch ist.
Man könnte ja mal im Debugger das Ganze Schritt für Schritt durchgehen.
Und mit einer ordentlichen Codeausrichtung sagt es eigentlich auch schon alles.

DeddyH 23. Okt 2011 11:29

AW: Programm Hilfe
 
Ich empfehle folgende Lektüre: http://de.wikipedia.org/wiki/Bubblesort. Da ist sogar eine kleine Animation zum Nachvollziehen dabei. Alternativ gibt es auch in der DP entsprechende Codes/Tutorials zum Thema Sortieren.

Bjoerk 23. Okt 2011 11:53

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.

boxer123 23. Okt 2011 11:55

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

Bjoerk 23. Okt 2011 12:15

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;

boxer123 23. Okt 2011 12:19

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

DeddyH 23. Okt 2011 12:21

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]

boxer123 23. Okt 2011 13:31

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:
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;
edit so?

DeddyH 23. Okt 2011 13:37

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.

boxer123 23. Okt 2011 13:38

AW: Programm Hilfe
 
genau da weiß ich nicht mehr weiter vielleicht eine hilfestellung

DeddyH 23. Okt 2011 13:45

AW: Programm Hilfe
 
Delphi-Quellcode:
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
[edit] P.S.: Das ist aufsteigende Sortierung, für absteigende muss der Vergleich genau anders herum sein. [/edit]

boxer123 23. Okt 2011 13:49

AW: Programm Hilfe
 
jetzt aber oder?

DeddyH 23. Okt 2011 13:54

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.

boxer123 23. Okt 2011 13:59

AW: Programm Hilfe
 
Delphi-Quellcode:
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;
so?

Bjoerk 23. Okt 2011 14:02

AW: Programm Hilfe
 
Zitat:

Zitat von boxer123 (Beitrag 1131993)
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:
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;
edit so?

Das ist doch schon mal ganz gut. Schmeiß das repeat until raus und mach aus den a[i+1] a[j], dann hast du den Selectionsort.

Edit: Und aus dem park ein integer und aus a, b array [1..4] of integer statt string und StrToInt(Copy(..

DeddyH 23. Okt 2011 14:03

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.

boxer123 23. Okt 2011 14:09

AW: Programm Hilfe
 
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
//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;
so?

wie so?

Bjoerk 23. Okt 2011 14:28

AW: Programm Hilfe
 
In dieser Variante gibt es kein J.

boxer123 23. Okt 2011 14:35

AW: Programm Hilfe
 
das mit copy ist schwer dann

DeddyH 23. Okt 2011 14:47

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.

boxer123 23. Okt 2011 14:48

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);

boxer123 23. Okt 2011 14:50

AW: Programm Hilfe
 
aber es muss doch im edit 2 erscheinen ^^:gruebel:

DeddyH 23. Okt 2011 14:50

AW: Programm Hilfe
 
Indem Du Deine Strings (die Du ja unbedingt haben wolltest) in Zahlen umwandelst und subtrahierst.

boxer123 23. Okt 2011 14:55

AW: Programm Hilfe
 
aber welche im algho steht nicht wo ich z.b die größte zahl gespeichert habe u.s.w

DeddyH 23. Okt 2011 14:56

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).

boxer123 23. Okt 2011 14:58

AW: Programm Hilfe
 
ich verstehe alles auser das mit der differenz und wie man das alles in edit 2 fenster ausgibt also das ergebnis

DeddyH 23. Okt 2011 15:00

AW: Programm Hilfe
 
Delphi-Referenz durchsuchenStrToInt und Delphi-Referenz durchsuchenIntToStr, mehr brauchst Du dafür nicht.

boxer123 23. Okt 2011 15:02

AW: Programm Hilfe
 
Delphi-Quellcode:
wie so

Differenz:=Strtoint(..)-Strtoint(..);
Edit2.text:=InTtoStr(..);

DeddyH 23. Okt 2011 15:08

AW: Programm Hilfe
 
Genauso.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 Uhr.
Seite 2 von 5     12 34     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz