| Autor |
Beitrag |
klaus123
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Fr 28.09.07 17:18
Hallo und  hier im Forum!!!
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  oder  klicken und den Titel ändern. Danke Dir!
Viele Grüße,
Tino
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: 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:
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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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:
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 Result := ''; uNumbers := uNumbers + #0; Count := 0; Current := #0; i := 0; while i <= Length(uNumbers) do begin Inc(i); if uNumbers[i] = Current then Inc(Count) else begin if Count > 0 then end; end; end;
begin Edit1.Text := GetCodedString(Edit1.Text); end; |
@ Tilo:
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
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Fr 28.09.07 20:19
Titel: Re: Hilfe bei Programm
klaus123 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: 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:
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;Ziff:byte; El:integer; begin for a:=0 to 9 do intfeld[a]:=0; try Ezahl:=eedit.Text; El:=..; for a:=1 to El do begin ziff:=...; inc(...); end; EEdit.Text:=buildoutput(intfeld);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:
Delphi-Quelltext 1:
| type TIntfeld=array[0..9] of integer; |
Falls das Prog im Anhang nicht der Lösung entspricht, diesen Post ignorieren.
Einloggen, um Attachments anzusehen!
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 29.09.07 18:24
klaus123 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.
klaus123 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: 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 Result := ''; uNumbers := uNumbers + #0; Count := 0; Current := #0; i := 0; while i <= Length(uNumbers) do begin Inc(i); if uNumbers[i] = Current then Inc(Count) else begin if Count > 0 then Result := Result + Current := Count := end; end; end;
begin Edit1.Text := GetCodedString(Edit1.Text); end; | Damit musst du es aber eigentlich hinbekommen...
Bis wann ist denn die Hausaufgabe?^^
klaus123 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 
Hält's aus hier
Beiträge: 4
|
Verfasst: 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.
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..9] of 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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 04.10.07 21:30
Eine Frage: Was soll bei 2334223 herauskommen (so wie du es haben willst)?
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Do 04.10.07 21:46
Änder mal
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:
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:
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 
Hält's aus hier
Beiträge: 4
|
Verfasst: Fr 05.10.07 14:21
hi,
also das programm funktioniert endlich so wie es soll.
danke nochmal an alle die mir geholfen haben.
|
|