Autor Beitrag
DarthBane9955
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 21.06.11 21:09 
Ich habe folgendes Problem: Wir sollen für die Schule einen Text in ein Memo-Feld eingeben und dann die relative Häufigkeit der einzelnen Buchstaben ausrechnen. Ich habe nun folgendes Programm erstellt, es enthält zum einen das Memo MText, das StringGrid SG und den Button BZ.
Hier ist mein Quelltext:
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:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
unit ZaehlerV2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    MText: TMemo;
    BZ: TButton;
    SG: TStringGrid;
    procedure BZClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BZClick(Sender: TObject);
var i, j, k : integer;
    b : char;
    a : array [1..26of string;

begin
SG.Cells [0,0] := 'Buchstabe';
SG.cells [1,0] := 'Häufigkeit';
Text := MText.Text ;
for  k := 1 to 26 do
  begin
    j := 0;
    b := char (64+k) ;
        SG.cells [0,k] := char (64+k);
    
    for i := 1 to Length (Text) do
    if Text[i] = b
      then
      begin
      j := j + 1 ;
      a[k] := b + '=' +  floattostr( (j / Length (Text)) * 100) + '%' ;
      end
      else
      begin
      a[k] := b + '=' +  floattostr( (j / Length (Text)) * 100) + '%' ;
      end ;
    if b = 'z'
      then if i = Length (Text)
            then SG.cells [1,k] := a[k];
  end
end;

procedure TForm1.FormActivate(Sender: TObject);
begin

MText.text := '';
end;

end.
Wobei ich folgenden fehler erhalte:
Zitat:
[Hinweis] ZaehlerV2.pas(44): Auf 'i' zugewiesener Wert wird niemals benutzt

Desweiteren erscheinen in der StringGrid keine Werte bei der Häufigkeit! -.-
Könnt Ihr mir da weiter helfen?
Danke im vorraus und mfG
Mirko

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Zuletzt bearbeitet von DarthBane9955 am Di 21.06.11 22:00, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 21.06.11 21:28 
Moin und :welcome: im Forum!

Bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. 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 unten in deinem ersten Beitrag auf user defined image klicken und den Titel ändern. Danke Dir!

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 21.06.11 22:16 
Ich formatiere den Quelltext erst einmal...
user profile iconDarthBane9955 hat folgendes geschrieben Zum zitierten Posting springen:
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:
procedure TForm79.Button1Click(Sender: TObject);
var
  i, j, k: Integer;
  b: Char;
  a: array [1 .. 26of string;
begin
  SG.Cells[00] := 'Buchstabe';
  SG.Cells[10] := 'Häufigkeit';
  Text := mmoInput.Text;
  for k := 1 to 26 do
  begin
    j := 0;
    b := Char(64 + k); // in b stehen also Großbuchstaben
    SG.Cells[0, k] := Char(64 + k);

    for i := 1 to Length(Text) do
      if Text[i] = b then
      begin
        j := j + 1;
        a[k] := b + '=' + floattostr((j / Length(Text)) * 100) + '%';
      end
      else
      begin
        a[k] := b + '=' + floattostr((j / Length(Text)) * 100) + '%';
      end;

    if b = 'z' then // in b stehen Großbuchstaben, das kann nie wahr sein
      if i = Length(Text) then // du bist schon nach der Schleife mit i, i ist hier undefiniert
        SG.Cells[1, k] := a[k];
  end
end;
Ein Tipp noch:
Wozu denn die markierten Abfragen überhaupt? Überlege einmal: Du bist die innere Schleife durchgegangen, also bist du am Ende des Textes. Und willst du wirklich nur bei z etwas ausgeben? Du willst doch wohl eher für jeden Buchstaben das Ergebnis ausgeben, oder?

Also nimm die beiden if-Abfragen einfach weg, dann klappt das auch. ;-)

Hier übrigens nur als Anregung einmal eine alternative Umsetzung mit einem Memo und einer ListView als Ausgabe, hier werden nur Kleinbuchstaben gezählt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var
  CurrentChar: Char;
  CharCount: array['a'..'z'of Integer;
  NewItem: TListItem;
begin
  // Alles löschen
  lvCharCount.Items.Clear;
  FillMemory(@CharCount, SizeOf(CharCount), 0);
  // Buchstaben durchgehen
  for CurrentChar in mmoInput.Text do
    if CurrentChar in ['a'..'z'then
      Inc(CharCount[CurrentChar]);
  // Anzahlen ausgeben
  for CurrentChar := Low(CharCount) to High(CharCount) do
  begin
    NewItem := lvCharCount.Items.Add;
    NewItem.Caption := CurrentChar;
    NewItem.SubItems.Add(IntToStr(CharCount[CurrentChar]))
  end;
DarthBane9955
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 21.06.11 22:19 
1. danke nun werden die ergebnisse angezeigt
2. leider betragen die häufigkeiten bei allen buchstaben 0%, warum?
mfg
Mirko
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 21.06.11 23:59 
user profile iconDarthBane9955 hat folgendes geschrieben Zum zitierten Posting springen:
2. leider betragen die häufigkeiten bei allen buchstaben 0%, warum?
Sind denn genug Großbuchstaben in deinem Testtext drin, dass es mehr als 0,x% sind (denn Kleinbuchstaben zählst du ja nicht)? Bei mir funktioniert das so. :nixweiss:

// EDIT:
Nebenbei kannst du das auch so kurz schreiben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var
  i, j, k: Integer;
  b: Char;
begin
  SG.Cells[00] := 'Buchstabe';
  SG.Cells[10] := 'Häufigkeit';
  Text := mmoInput.Text;
  for k := 1 to 26 do
  begin
    j := 0;
    b := Char(64 + k);
    SG.Cells[0, k] := Char(64 + k);

    for i := 1 to Length(Text) do
      if Text[i] = b then
        j := j + 1;
    SG.Cells[1, k] := b + '=' + floattostr((j / Length(Text)) * 100) + '%';
  end
Das macht das gleiche, nur etwas schneller.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mi 22.06.11 04:14 
Habe mal ein kleines Testprogramm dafür erstellt. Die Komponenten haben die gleiche Bezeichnung wie bei Dir.

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:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
unit ZaehlenUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, StdCtrls;

const AnzahlBuchstaben = 30;

type
  TForm1 = class(TForm)
    MTEXT: TMemo;
    BZ: TButton;
    SG: TStringGrid;
    procedure BZClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function BuchstabenWert(c : char) : integer;  // siehe 3.
begin
  case c of
    'A'..'Z' : result := ord(c)-64;
    'a'..'z' : result := ord(c)-96;
    'ä','Ä'  : result := 27;
    'ö','Ö'  : result := 28;
    'ü','Ü'  : result := 29;
    'ß'      : result := 30;
  else
    result := AnzahlBuchstaben + 1;
  end;
end;

function WertBuchstabe(i : integer) : char;   // siehe 4.
begin
  case i of
    1 .. 26 : result := char(i + 64);
    27 : result := 'Ä';
    28 : result := 'Ö';
    29 : result := 'Ü';
    30 : result := 'ß';
    else
      Result := '?';
  end;
end;

procedure TForm1.BZClick(Sender: TObject);
var
  i, j, k: integer;
  b: char;
  a: array[1..AnzahlBuchstaben] of longint;

begin
  SG.Cells[00] := 'Buchstabe';
  SG.cells[10] := 'Häufigkeit';
  SG.RowCount := AnzahlBuchstaben + 1;        // siehe 1.
  j := 0;
  for k := 1 to AnzahlBuchtaben do begin    // siehe 2.
    SG.Cells[0,k] := Wertbuchstabe(k);    
    a[k] := 0;
  end;    
  for i := 1 to Length(MText.Text) do
  begin
    b := MText.Text[i];
    k := BuchstabenWert(b);
    if k in [1..AnzahlBuchstaben] then begin
      inc(j);
      inc(a[k]);
    end;
  end;
  if j>0 then begin
  for k := 1 to AnzahlBuchstaben do begin
    SG.Cells[1,k] := FormatFloat('0.00',100*a[k]/j);
  end;
  end else begin
    MessageDlg('Kein Text auswertbar.',mtInformation,[mbOK], 0);
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 MText.Text := '';
end;

end.


Was passiert bei der Auswertung:

1. Die Zellanzahl wird auf 31 Zeilen gesetzt.
2. Die Anfangsdaten werden erst mal genullt.
3. es gibt eine Funktion, welche den "Wert" eines Zeichens ausgibt (A=1,B=2 ...Z=26,Ä=27,ß=30)
4. Es gibt eine Funktion, welche zu einem Wert einen Buchstaben ausgibt. (1='A',2='B',...26='Z',27='Ä')

Es werden damit alle Buchstaben des deutschen Alphabets erfasst (beliebig erweiterbar, z.B. Accente) Die Buchstaben werden auch ohne Umwandlung als Großbuchstaben interpretiert. Es ist ja wohl nicht sinnvoll, zwischen Groß- und Kleinbuchstaben zu unterscheiden.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
DarthBane9955
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 23.06.11 08:50 
vielen dank an euch beide nun geht es :)