Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Bereinigen des Records (https://www.delphipraxis.net/61350-bereinigen-des-records.html)

phobosx112 20. Jan 2006 10:22

Datenbank: kp wie das heißt • Version: 1.0.1 • Zugriff über: ...

Bereinigen des Records
 
Moin Moin
ich bin grad dabei für die schule ein programm zu schreiben mit dem man die relativen häufigkeiten von zeichen in einer zeichenkette feststellt. das programm funktioniert auch beim ersten mal gut aber beim zweiten mal kombiniert das programm das was ich eingegeben hab mit dem vorigen Datensatz
ich benutz diese datenbank, keine ahnung wie man die nennt
type
tdatensatz = record
zeichen:char;
anzahl:integer;
haeufig:real;
end;
:ein beispiel was das programm ausspuckt:
1. eigegeben: alles klar
Gesamtlänge: 10
Zeichen Anzahl Häufigkeit
a 2 0,2
l 3 0,3
e 1 0,1
s 1 0,1
1 0,1
k 1 0,1
r 1 0,1
2. eingegeben: dummbeutel
Gesamtlänge: 10
Zeichen Anzahl Häufigkeit
a 2 0,2
l 3 0,3
e 3 0,3
s 1 0,1
1 0,1
k 1 0,1
r 1 0,1
d 1 0,1
u 2 0,2
m 2 0,2
b 1 0,1
t 1 0,1
l 1 0,1


also brauch ich einen befehl der nach der berechnung der häufigkeiten die datensätze bereinigt.

vielen dank im voraus
greeeetz
B1

dfried 20. Jan 2006 10:25

Re: Problem *g*
 
Hallo,

erst mal willkommen in der DP!

1. Kannst du bitte den Titel deines Posts ändern? "Probleme" haben hier viele...
2. Kannst du ein bisschen SourceCode posten wie du den Record befüllst bzw. was du mit dem Record machst? Dann wird es einfacher dir zu helfen.

tomsel 20. Jan 2006 10:28

Re: Problem *g*
 
Und es unterschlägt auch noch Zeichen! : :stupid:

s.h.a.r.k 20. Jan 2006 10:28

Re: Problem *g*
 
Mahlzeit :wink:

1. Dein Thread-Titel ist ja mal wirklich toll gewählt. Wer weiß denn da was für ein Problem du hast?!
2. Was meinst du mit "Datenbank"?! Deinen record oder wie?!
3. Wie gibts du die relative Häufigkeit denn aus?! In einem Memo oder in einer ListBox?! Wenn ja, dann solltest vielleicht mal das probieren:
Delphi-Quellcode:
Memo1.Lines.Clear;
//oder
ListBox1.Items.Clear;
4. Es gibt extra ein BBCode, sodass dein geposteter Code im Delphi-Highlightning erscheint!!! Musst mal schauen wenn du einen Post schreibst ist drüber eine Auswahlleiste!

[Edit]Jetzt war doch jemand schneller als ich :cry: [/Edit]

mfg shark

RavenIV 20. Jan 2006 10:52

Re: Problem *g*
 
Zitat:

Zitat von dfried
1. Kannst du bitte den Titel deines Posts ändern? "Probleme" haben hier viele...

nur nochmal zur Erinnerung:
Bitte Titel ändern, sodass er dein Problem beschreibt.

phobosx112 20. Jan 2006 10:54

Re: Bereinigen des Records
 
okey ich versuch das problem noch etwas genauer zu beschreiben
wenn ich nach der ersten eingabe die zweite mache, vergleicht das programm die zeichenkette auch mit den records der ersten eingabe, was er nicht soll!!!
ich brauch einen befehl der den record bereinigt sodass nichts mehr in ihm enthalten ist

ich hoffe das es klar genug ist .....
grüße nochmal
B1

phobosx112 20. Jan 2006 11:02

Re: Bereinigen des Records
 
Delphi-Quellcode:
type
    tdatensatz = record
                 zeichen:char;
                 anzahl:integer;
                 haeufig:real;
                 end;
const
     maxzahl = 40;
var
   datensatz: array[1..maxzahl] of tdatensatz;
   zahl: integer;
   satz: string;


procedure TForm1.Button1Click(Sender: TObject);
var laenge,a,c,d,g,e:integer;
    b,f:char;
    h:real;
begin
satz:=edit1.text;
memo.Clear;
laenge:=length(satz);
a:=0;             //wir sind beim a-ten zeichen
memo.lines.add('Gesamtlänge: ' + inttostr(laenge));

while a<laenge do
      begin
      a:=a+1;
      b:=satz[a]; //b ist das aktuelle zeichen
      c:=laenge;  // einfacher
      d:=0;
      e:=zahl;
      while c>0 do
            begin
            if b=datensatz[e].zeichen then
               begin
               datensatz[e].anzahl:=datensatz[e].anzahl+1;
               c:=0;
               d:=1;     // d gibt an ob der buchstabe schon zugeordnet wurde
               end
            else
                begin
                c:=c-1; //c geht alle buchstaben durch
                e:=e-1; // e ist hier der zähler um alle datensätze abzuklappern
                end;
            end;
      if d=0 then
         begin
         zahl:=zahl+1;
         datensatz[zahl].zeichen:=b;
         datensatz[zahl].anzahl:=1
         end;

      end;
e:=0; //hier ist e der zähler um alle datensätze auszugeben
memo.lines.add('Zeichen Anzahl Häufigkeit');
while e<zahl do
      begin
      e:=e+1;
      f:=datensatz[e].zeichen;
      g:=datensatz[e].anzahl;
      h:=(g/laenge);
      memo.lines.add(f + '              ' + inttostr(g) + '              ' + floattostr(h))
      end;
end;

inahurry 20. Jan 2006 11:27

Re: Bereinigen des Records
 
Hi,

normalerweise solltest du as Array "Datensatz" bereits vor dem ersten Start initialisiert haben. Vor einem erneuten Berechnen der Werte muss das nur erneut geschehen...
Versuch's man mit fillchar(...) oder mit einer For-Next Schleife, in der du definierte Ausgangswerte für "Datensatz" festlegt.

dfried 20. Jan 2006 11:28

Re: Bereinigen des Records, bis jetzt noch ungelöst "!&
 
Mach in deinem OnButtonClick einfach folgendes:

Delphi-Quellcode:
var i : Integer;

for i := 1 to maxzahl do begin
  datensatz[i].zeichen := '';
  datensatz[i].anzahl:= 0;
  datensatz[i].haeufig:= 0;
end;
Damit initialisierst du den Record mit "leeren Werten", dann muesste es klappen.

phobosx112 20. Jan 2006 11:32

Re: Bereinigen des Records, bis jetzt noch ungelöst "!&
 
Leider funktioniert das nich,
das programm erzähl mir dann, dass die typen char und string inkompatibel sind

wenn ich es umändere von
Delphi-Quellcode:
datensatz[i].zeichen := '';
in
Delphi-Quellcode:
datensatz[i].zeichen := ' ';
dann gibt er die häufigkeit des leerzeichens aus ...

wie folgt:
Gesamtlänge: 14

Zeichen Anzahl Häufigkeit
0 0
0 0
0 0
0 0
0 0
u 5 0,357142857142857
j 5 0,357142857142857
f 4 0,285714285714286




-->
Zitat:

Zitat von inahurry
Versuch's man mit fillchar(...) oder mit einer For-Next Schleife, in der du definierte Ausgangswerte für "Datensatz" festlegt.

ich kann damit nichts anfangen, bin anfänger

inahurry 20. Jan 2006 11:36

Re: Bereinigen des Records, bis jetzt noch ungelöst "!&
 
Hi,

nachdem datensatz.zeichen ein char ist kann man nicht '' zuweisen, sondern nur ein char ;)
versuchs entweder mitt fillchar (s.o.) oder nimm statt '' #0

dfried 20. Jan 2006 11:37

Re: Bereinigen des Records, bis jetzt noch ungelöst "!&
 
dann mach statt

datensatz[i].zeichen := '';

einfach

datensatz[i].zeichen := #0;

EDIT: war mal wieder einer schneller :mrgreen:

phobosx112 20. Jan 2006 11:45

Re: Bereinigen des Records, bis jetzt noch ungelöst "!&
 
okey vielen dank es funktioniert jetzt perfekt, wobei mir noch nicht ganz klar ist wieso er nach
der umänderung zu #0 den char komplett übersieht, wo doch in anzahl und haefig noch zahlen enthalten sind


vielen vielen dank
B1

inahurry 20. Jan 2006 11:55

Re: Bereinigen des Records, bis jetzt noch ungelöst "!&
 
Hi,

Zitat:

...wobei mir noch nicht ganz klar ist wieso er nach
der umänderung zu #0 den char komplett übersieht, wo doch in anzahl und haefig noch zahlen enthalten sind
nun, zuerst setzt du mit

Delphi-Quellcode:
d:=0;
dein Flag auf 0. Es wird später nur dann auf 1 gestezt, wenn in datensatz.zeichen der aktuelle Buchstabe gefunden wurde:

Delphi-Quellcode:
            if b=datensatz[e].zeichen then
               begin
               datensatz[e].anzahl:=datensatz[e].anzahl+1;
               c:=0;
               d:=1;     // d gibt an ob der buchstabe schon zugeordnet wurde
               end
            else
                begin
                c:=c-1; //c geht alle buchstaben durch
                e:=e-1; // e ist hier der zähler um alle datensätze abzuklappern
                end;
            end;
und dann prüfst du dein Flag auf 0, also ob der aktuelle Buchstabe NICHT gefunden wurde. Nur dann initialisierst du die restlichen Datensatz-Felder mit den passenden Werten:

Delphi-Quellcode:
      if d=0 then
         begin
         zahl:=zahl+1;
         datensatz[zahl].zeichen:=b;
         datensatz[zahl].anzahl:=1
         end;
Habe ich dein Programm richtig verstanden :)

ibp 20. Jan 2006 12:15

Re: Bereinigen des Records
 
mal meine lösung...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  anz:integer;
  atext:string;
  zeichen:char;
begin
  atext:=edit1.Text;
  if atext='' then exit;

  ValueListEditor1.Strings.Clear;

  for i:=1 to length(atext) do
  begin
    zeichen:=atext[i];
    if ValueListEditor1.Values[zeichen]='' then
    begin
      anz:=1
    end
    else
    begin
      anz:=strtoint(ValueListEditor1.Values[zeichen]);
      inc(anz);
    end;

    ValueListEditor1.Values[zeichen]:=inttostr(anz);
  end;
end;

als tipp: wenn es nur die buchstaben sein sollen, dann reicht ja auch ein array mit 26 elementen (a..z) schau dir dazu mal die funktionen chr und ord an, damit kannst du einiges vereinfachen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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