![]() |
Am meisten vorkommende Zahl
Hallo liebe Delphi-Programmierer,
Is mein erster Post hier, also nicht gleich hauen :P So, hier zu meinem Problem. Ich habe eine Textdatei, die ungefähr folgendermassen aussieht (Muster):
Code:
Wenn man nun die einzelnen Zeilen von Oben nach Unten liest und sich immer das am häufigsten vorkommende Zeichen merkt, kommt man auf die Zahl 85132. Nun möchte ich, dass dies mein Programm auch kann, hab das jetzt schon Stundenlang versucht, aber ich bekomm es nicht gebacken. Wie man das Programm die Liste von oben nach unten lesen lässt ist kein Problem, jedoch soll nun das Programm nach dem am meisten vorkommenden Zeichen davon suchen und hier liegt mein Problem. Hab schon viel von wegen Integer-Arrays gelesen und auch von Sortierfunktionen (ich schein zu dämlich dafür zu sein) und bin langsam etwas demotiviert, da noch weiter zu machen, tja und nun habt ihr mich am Hals ;) Wäre nice wenn mir jemand helfen würde.
8__32
8__32 _ __2 8_ 32 8___2 85__2 85__2 85_32 84_3_ __ 32 84__2 __ _2 8 _2 ____2 8_ 32 8_19_ 8__9_ 8__32 __ 32 ____2 84 _2 _ 32 8____ __ _2 8___7 85__2 ____2 81___ 8_1_2 8____ 8__12 8_1_2 8__32 _5__2 851__ 8_ 2 8__32 ____2 85__2 _"__2 851__ ____2 841_2 85 _2 8_1_2 84__2 85_3_ 8__3_ __ _2 Danke schonmal im Voraus |
Re: Am meisten vorkommende Zahl
Mach Dir ein pro Spalte Array[0..9] of Integer und für jede gefundene Zahl erhöst Du um eins.
|
Re: Am meisten vorkommende Zahl
Warum denn für jede Zeile? Du nimmst ein Array und liest dann etwa so die Zeilen entlang:
DieGanzeDateiDurch: str:= readln(); for i:=0 to high(str) do list[strtoint(str[i]]:=list[strtoint(str[i]]+1; |
Re: Am meisten vorkommende Zahl
Zitat:
Delphi-Quellcode:
index := Ord(str[i]) - Ord('0');
list[index] := list[index] + 1; |
Re: Am meisten vorkommende Zahl
Warum denn nicht?
|
Re: Am meisten vorkommende Zahl
Weil StrToInt wohl die lahmste Methode ist, ein Zeichen, das eine Ziffer ist, in einen Intege umzuwandeln. Und da die Ziffern in den Codepages eh 10 aufeinander folgende Codepunkte belegen, kann man auch einfach direkt den Ordinalwert des Zeichens nehmen und den von 0 abziehen. Damit wird '0' zu 0, '1' zu 1 usw. bis schließlich '9' zu 9.
|
Re: Am meisten vorkommende Zahl
Zitat:
|
Re: Am meisten vorkommende Zahl
@Dax: ok, an Geschwindigkeit habe ich jetzt nicht gedacht.
@Sonneschein: Auch das ist nicht sinnvoll. So wie ich das Problem verstanden habe, ist es egal, an welcher Position in der Zeile eine Zahl steht. Von da her betreibst du zu viel Aufwand, da du später deine Arrays wieder zusammenrechnen müsstest. |
Re: Am meisten vorkommende Zahl
Delphi-Quellcode:
In Count[] findest du dann die Anzhal der Zeichen im File. Mit zb. Count['0'] fragst du die Anzahl für '0' ab.
const
BufferSize = 1024 * 8; var Count: array[char] of Cardinal; Buffer: array of Char; CharsRead,I: Integer; begin FillChar(Count, SizeOf(Count), 0); SetLength(Buffer, BufferSize); with TFileStream.Create('c:\datei.txt', fmOpenRead or fmShareDenyWrite) do try repeat CharsRead := Read(Buffer[0], BufferSize); if CharsRead <= 0 then Break; for I := 0 to CharsRead -1 do Inc(Count[Buffer[I]]); until False; finally Free; end; end; Gruß hagen PS: nichts mit unsauberen TypCast's stattdessen saubere Typdeklarationen, nichts mit langsammen String Konvertierungen ;) |
Re: Am meisten vorkommende Zahl
Herzlich willkommen in der Delphi-PRAXiS, r00t.
Vielleicht habe ich dein Problem ja falsch verstanden, aber wenn jede Zeile das gleiche Muster repräsentiert und jede Stelle über einen voting process festgelegt werden soll, dann braucht es eine frequency table für jede Position der Zeichenkette. Ich könnte mir das dann so vorstellen:
Delphi-Quellcode:
Freundliche Grüße vom marabu
program Muster;
{$APPTYPE CONSOLE} uses Classes, SysUtils; const NCHARS = 5; FILLER = '_'; type TFreq = array [Char] of Integer; TFreqList = array of TFreq; var s: String; i: Integer; fl: TFreqList; function MostFrequentChar(f: TFreq): Char; var c: Char; iMax: Integer; begin iMax := 0; for c := #0 to #255 do if (f[c] > iMax) and (c <> FILLER) then begin Result := c; iMax := f[c]; end; end; begin AssignFile(input, ParamStr(1)); Reset(input); SetLength(fl, NCHARS); while not Eof do begin ReadLn(s); // Das geht auch eleganter - Danke Hagen. // if Length(s) <> NCHARS then // Continue // else if Length(s) = NCHARS then for i := 1 to NCHARS do Inc(fl[Pred(i)][s[i]]); end; CloseFile(input); SetLength(s, NCHARS); for i := 1 to NCHARS do s[i] := MostFrequentChar(fl[Pred(i)]); WriteLn(s); end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 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-2025 by Thomas Breitkreuz