AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Am meisten vorkommende Zahl

Ein Thema von r00t · begonnen am 28. Sep 2006 · letzter Beitrag vom 29. Sep 2006
Antwort Antwort
Seite 1 von 2  1 2      
r00t

Registriert seit: 12. Aug 2006
2 Beiträge
 
#1

Am meisten vorkommende Zahl

  Alt 28. Sep 2006, 22:04
Hallo liebe Delphi-Programmierer,

Is mein erster Post hier, also nicht gleich hauen

So, hier zu meinem Problem. Ich habe eine Textdatei, die ungefähr folgendermassen aussieht (Muster):
Code:
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
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.

Danke schonmal im Voraus
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#2

Re: Am meisten vorkommende Zahl

  Alt 28. Sep 2006, 22:07
Mach Dir ein pro Spalte Array[0..9] of Integer und für jede gefundene Zahl erhöst Du um eins.
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Am meisten vorkommende Zahl

  Alt 28. Sep 2006, 22:30
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;
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Am meisten vorkommende Zahl

  Alt 28. Sep 2006, 22:32
Zitat von Nikolas:
list[strtoint(str[i]]:=list[strtoint(str[i]]+1;
Oh, bitte nicht!
Delphi-Quellcode:
index := Ord(str[i]) - Ord('0');
list[index] := list[index] + 1;
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Am meisten vorkommende Zahl

  Alt 28. Sep 2006, 22:51
Warum denn nicht?
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Am meisten vorkommende Zahl

  Alt 28. Sep 2006, 22:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#7

Re: Am meisten vorkommende Zahl

  Alt 28. Sep 2006, 23:01
Zitat von Nikolas:
Warum denn für jede Zeile?
Da steht doch Spalte
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Am meisten vorkommende Zahl

  Alt 28. Sep 2006, 23:06
@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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#9

Re: Am meisten vorkommende Zahl

  Alt 29. Sep 2006, 00:18
Delphi-Quellcode:
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;
In Count[] findest du dann die Anzhal der Zeichen im File. Mit zb. Count['0'] fragst du die Anzahl für '0' ab.

Gruß hagen

PS: nichts mit unsauberen TypCast's stattdessen saubere Typdeklarationen, nichts mit langsammen String Konvertierungen
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Am meisten vorkommende Zahl

  Alt 29. Sep 2006, 07:24
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:
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.
Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:56 Uhr.
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