Autor Beitrag
klaus123
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 28.09.07 17:14 
Hallo Leute,

ja ich hab vor kurzem mit delphi angefangen und kenn auch schon ein paar sachen.
ich möchte nun ein programm schreiben,das das hier können sollte.

5
15 (5 = eine 5)
1115 (15 = eine 1 eine 5)
3115 (1115 = drei 1 eine 5)
211315 (3115 = zwei 1 eine 3 eine 5)

usw.....

also es werden die ziffern des vorgängers gezählt und dann nach ihrem wert sortiert.

diese zahlenfolge soll dann solange berechnet werden bis sich die zahlen mind. 2 Mal wiederholen.

ah ich hab wirklich keine ahnung wie ich da vorgehen soll.

es muss kein ganzer quellcode sein, ich möchte nur ein paar hinweise wie ich anfangen soll.

thx für die hilfe im voraus


Zuletzt bearbeitet von klaus123 am Sa 29.09.07 15:42, insgesamt 2-mal bearbeitet
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Fr 28.09.07 17:18 
Hallo und :welcome: hier im Forum!!! :wink2:

bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Denn Hilfe benötigen fast alle hier und meistens handelt es sich dabei auch im ein Problem innerhalb eines (Delphi-)Programms. ;-)


Hier der entsprechende Absatz aus den Richtlinien:
1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. Danke Dir!

Viele Grüße,
Tino
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Fr 28.09.07 17:48 
Nacj 5 minütigem nachdenken hab ich geschnallt was Du möchtest.
Hier meine Hilfe:
Du möchtest einen Algorithmus haben.
Als Eingangsparameter hat er eine Zahl(wahrscheinlich Integer) und als Ausgangsparameter ebenso.
Also sieht der Funktionskopf etwa so aus:
ausblenden Delphi-Quelltext
1:
 function func(Eingangszahl:integer):integer;					


Innerhalb der Function definierst Du ein IntegerFeld der Größe 10.
Jedes Element dieses Feld erhält den Startwert 0.

Nun gehst Du die Eingangszahl schrittweise Ziffer für Ziffer durch. Jenachdem welche Ziffer Du findest wird das entsprechende Element des Feldes um 1 erhöht.

Am Ende das Feld noch in der von dir gewünschten Form ausgegeben.
Als Hilfe: Feld[x] enthält nun die Anzahl der Ziffer x innerhalb der Eingangszahl. falls feld[x]=0 dann nicht ausgeben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 28.09.07 18:26 
Also, ich möchte zwar keinen fertigen Code liefern, andererseits ist es auch nicht ganz so einfach, das möglichst effizient hinzubekommen. Deshalb gebe ich dir zwar das Gerüst bereits fertig, es fehlen aber noch drei Zeilen (die hervorgehoben sind), die du aber nur den Kommentaren entsprechend ergänzen musst:
ausblenden volle Höhe Delphi-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:
procedure TForm9.Button1Click(Sender: TObject);

  function GetCodedString(uNumbers: String): String;
  var
    i, Count: Integer;
    Current: Char;
  begin
    // Alles auf leere Werte initialisieren
    Result := '';
    uNumbers := uNumbers + #0;
    Count := 0;
    Current := #0;
    i := 0;
    // Alle Buchstaben durchgehen
    while i <= Length(uNumbers) do
    begin
      Inc(i);
      if uNumbers[i] = Current then
        // Wenn der Buchstabe immer noch der selbe ist, nur die Anzahl erhöhen
        Inc(Count)
      else
      begin
        // Wenn es ein anderer Buchstabe ist und bereits Buchstaben gezählt
        // wurden, die Werte dem Ergebnis hinzufügen:
        if Count > 0 then
          // 1.
        // Der aktuell gezählte Buchstabe ist jetzt der an Position i:
        // 2.
        // Und der ist bisher einmal vorgekommen:
        // 3.
      end;
    end;
  end;

begin
  Edit1.Text := GetCodedString(Edit1.Text);
end;

@user profile iconTilo:
Ich glaube, das ist nicht gang das, was gemeint ist, ich glaube bei "33433" soll nicht "4314" sondern "231423" herauskommen, und das geht so wie du das meinst glaube ich nicht.
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Fr 28.09.07 20:19 
Titel: Re: Hilfe bei Programm
user profile iconklaus123 hat folgendes geschrieben:


5
15 (5 = eine 5)
1115 (15 = eine 1 eine 5)
3115 (1115 = drei 1 eine 5)
211315 (3115 = zwei 1 eine 3 eine 5)

usw.....



@jaenicke: schau Dir mal den Schritt von 3115 nach 211315.
Ich hatte auch erst so gedacht wie Du aber dieser Schritt beweist Doch was anderes.

Aber mit den Strings hast Du recht. Bei string ist die Bearbeitung einfacher.
klaus123 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 29.09.07 15:40 
hi,

@jaenicke: danke füer den quellcode...aber ich hab noch ein paar probs weil ich den code nicht so ganz verstehe.
Zitat:
if uNumbers[i] = Current then
Inc(Count)
else

was wird hier gemacht??

Zitat:

if Count > 0 then
// 1.
// Der aktuell gezählte Buchstabe ist jetzt der an Position i:
// 2.
// Und der ist bisher einmal vorgekommen.


was muss ich hier einfügen?

sry aber der code ist zu kompliziert für mich.

eine frage noch: wie oder wo gebe ich dann das ergebnis aus?

thx
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Sa 29.09.07 17:01 
Hallo zusammen, ich habe mich mal selbst an das Problem gewandt.
Im Anhang ist ein Programm welches die Problemstellung so löst wie ich es verstanden habe.
Der entscheidene Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var
intfeld:TIntfeld;
a:integer;
Ezahl:string;// Als String behandelt es sich schneller und hat keine Begrenzung
Ziff:byte;
El:integer; //Länge der zahl welche als String in Ezahl steckt
begin
for a:=0 to 9 do intfeld[a]:=0;
try
 Ezahl:=eedit.Text;
 El:=..;//Länge der Zahl ermitteln die in Ezahl steckt.
 for a:=1 to El do
 begin
  ziff:=...;//ziffer an Position a ermitteln
  inc(...);
 end;
 EEdit.Text:=buildoutput(intfeld);//Fies von mir, selbst geschrieben, verrate ich nicht
except
 Showmessage('Vermutlich keine Zahl eingegeben');
end;


Die entscheidenen Stellen verrate ich nicht da Du es ja selbst schreiben möchtest.

Hier noch die Definition von TIntfeld:
ausblenden Delphi-Quelltext
1:
type TIntfeld=array[0..9of integer;					

Falls das Prog im Anhang nicht der Lösung entspricht, diesen Post ignorieren.
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 29.09.07 18:24 
user profile iconklaus123 hat folgendes geschrieben:
@jaenicke: danke füer den quellcode...aber ich hab noch ein paar probs weil ich den code nicht so ganz verstehe.
Zitat:
if uNumbers[i] = Current then
Inc(Count)
else

was wird hier gemacht??
Aaalso:
In den Variablen steht folgendes:
i ist die Position des gerade betrachteten Buchstabens
Current ist der zuletzt vorgekommene (und gerade gezählte) Buchstabe
Count ist die Anzahl dieses Buchstabens

In der Schleife gehe ich nacheinander alle Buchstaben durch. i gibt dabei an, welcher Buchstabe gerade dran ist. Am Anfang ist i eins und Current ist #0, was kein Buchstabe ist, sondern Null sozusagen. Beim ersten Vergleich ist Numbers[i] also nicht gleich Current.
Also gehts in else rein. Count ist 0, also werden nur die letzten beiden Befehle ausgeführt. Diese dienen dazu den aktuell gezählten Buchstaben (also den an der i-ten Stelle in Current) zu speichern und zweitens Count auf die bisherige Anzahl von Vorkommen dieses Buchstabens zu setzen (also 1, weil er ja nur an der aktuellen Stelle gerade steht und das vorher nicht dazu zählt, weil der vorherige Buchstabe ein anderer war.)

Beim nächsten Duchlauf wieder dasselbe: Ist der Buchstabe der selbe muss nur dessen Anzahl erhöht werden. Wenn nicht, dann müssen die bisher gezählten ausgegeben werden, Count und Current also einfach hintereinander ans Ergebnis angehängt werden.

user profile iconklaus123 hat folgendes geschrieben:
Zitat:

if Count > 0 then
// 1.
// Der aktuell gezählte Buchstabe ist jetzt der an Position i:
// 2.
// Und der ist bisher einmal vorgekommen.


was muss ich hier einfügen?
Nochmal ein wenig mehr Hilfe:
ausblenden volle Höhe Delphi-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:
procedure TForm9.Button1Click(Sender: TObject);

  function GetCodedString(uNumbers: String): String;
  var
    i, Count: Integer;
    Current: Char;
  begin
    // Alles auf leere Werte initialisieren
    Result := '';
    uNumbers := uNumbers + #0;
    Count := 0;
    Current := #0;
    i := 0;
    // Alle Buchstaben durchgehen
    while i <= Length(uNumbers) do
    begin
      Inc(i);
      if uNumbers[i] = Current then
        // Wenn der Buchstabe immer noch der selbe ist, nur die Anzahl erhöhen
        Inc(Count)
      else
      begin
        // Wenn es ein anderer Buchstabe ist und bereits Buchstaben gezählt
        // wurden, die Werte dem Ergebnis hinzufügen:
        if Count > 0 then
          Result := Result + // Count und Current sind ja die beiden Zahlen, die du willst
        // Der aktuell gezählte Buchstabe ist jetzt der an Position i:
        Current := 
        // Und der ist bisher einmal vorgekommen:
        Count := 
      end;
    end;
  end;

begin
  Edit1.Text := GetCodedString(Edit1.Text);
end;
Damit musst du es aber eigentlich hinbekommen...
Bis wann ist denn die Hausaufgabe?^^

user profile iconklaus123 hat folgendes geschrieben:
eine frage noch: wie oder wo gebe ich dann das ergebnis aus?
Naja, ich übergebe den Inhalt von Edit1 an die Funktion GetCodedString und packe das Ergebnis wieder in Edit1 rein. Du brauchst also nur ein Edit-Feld und einen Button.
klaus123 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 04.10.07 20:21 
hi,

ich hab mal den code von tilo genommen und es dann vervollständigt.

aber das programm rechnet manchmal das falsche ergebnis.

also wenn ich zb. "2244" eingebe dann kommt als ergebnis "2224", was ja auch richtig ist.
gebe ich aber das gleiche nochmal ein, nur in einer anderen reihenfolge so z.b. "2424" dann bekomme ich als ergebnis "2424".

jetzt bitte ich um eure hilfe, weil ich delphi nicht so ganz verstehe.
hier der quellcode, das programm habe ich auch angehängt.

ausblenden volle Höhe Delphi-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:
type TIntfeld=array[0..9of Integer;

procedure TForm1.Button2Click(Sender: TObject);
begin
close();
end;

procedure TForm1.Button1Click(Sender: TObject);
var
intfeld:TIntfeld;
a,i:Integer;
Ezahl,buffstring,teilstring:String;
Ziff:Byte;
El:Integer;
begin
buffstring:='';
teilstring:='';

for a:=0 to 9 do intfeld[a]:=0;

Ezahl:=Edit1.Text;
El:=Length(Ezahl);
if Edit1.Text='' then Showmessage('keine zahl eingegeben')
else
  for a:=1 to El do
  begin
  ziff:=StrToInt(Ezahl[a]);//
  inc(intfeld[ziff]);//
  end;

  for i:=0 to 9 do

  begin
  if intfeld[i]=0 then
  begin
  buffstring:=buffstring
  end
  else
  begin
  teilstring:=IntToStr(intfeld[i])+ezahl[i];
  buffstring:=buffstring+teilstring;
  end;
  Edit1.Text:=buffstring;
  Memo1.Text:=buffstring;
  end;


end;

end.
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 04.10.07 21:30 
Eine Frage: Was soll bei 2334223 herauskommen (so wie du es haben willst)?
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: Do 04.10.07 21:46 
Änder mal
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
for i:=0 to 9 do
begin
 if intfeld[i]=0 then
 begin
  buffstring:=buffstring
 end
 else
 begin
  teilstring:=IntToStr(intfeld[i])+ezahl[i];
  buffstring:=buffstring+teilstring;
 end;
 Edit1.Text:=buffstring;
 Memo1.Text:=buffstring;
end;


in:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
for i:=0 to 9 do
begin
 if intfeld[i]=0 then
 begin
  buffstring:=buffstring
 end
 else
 begin
  teilstring:=IntToStr(intfeld[i])+inttostr(i);
  buffstring:=buffstring+teilstring;
 end;
 Edit1.Text:=buffstring;
 Memo1.Text:=buffstring;
end;


oder beeser gleich in:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
for i:=0 to 9 do
 if intfeld[i]<>0 then
 begin
  teilstring:=IntToStr(intfeld[i])+inttostr(i);
  buffstring:=buffstring+teilstring;
 end;
Edit1.Text:=buffstring;
Memo1.Text:=buffstring;


Sinn der Änderung:
a) unnütze Anweisung buffstring:=buffstring; vermieden, denn es bringt nur mehr Zeilen aber keine echte Funktion
b) VCL ist träge und solange wie Du dich in einer Schleife befindest in der keine Rechenzeit abgegeben wird(z.B. mit application.ProcessMessages) wird die grafische Anzeige nicht aktualisiert -> also macht eine ständige Aktualiesierung in jedem Schleifendurchlauf keinen Sinn.

//inline Edit
aus 2334223 wird 323314 : dreimal 2, dreimal 3, einmal 4
klaus123 Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 05.10.07 14:21 
hi,

also das programm funktioniert endlich so wie es soll.

danke nochmal an alle die mir geholfen haben.