Autor |
Beitrag |
DarthBane9955
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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:
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 public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BZClick(Sender: TObject); var i, j, k : integer; b : char; a : array [1..26] of 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 Narses: Delphi-Tags hinzugefügt
Zuletzt bearbeitet von DarthBane9955 am Di 21.06.11 22:00, insgesamt 1-mal bearbeitet
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 21.06.11 21:28
Moin und  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  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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 21.06.11 22:16
Ich formatiere den Quelltext erst einmal... DarthBane9955 hat folgendes geschrieben : | 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 .. 26] of string; begin SG.Cells[0, 0] := 'Buchstabe'; SG.Cells[1, 0] := '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 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; | |
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: 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 lvCharCount.Items.Clear; FillMemory(@CharCount, SizeOf(CharCount), 0); for CurrentChar in mmoInput.Text do if CurrentChar in ['a'..'z'] then Inc(CharCount[CurrentChar]); 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
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 21.06.11 23:59
DarthBane9955 hat folgendes geschrieben : | 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.
// EDIT:
Nebenbei kannst du das auch so kurz schreiben: 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[0, 0] := 'Buchstabe'; SG.Cells[1, 0] := '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
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mi 22.06.11 04:14
Habe mal ein kleines Testprogramm dafür erstellt. Die Komponenten haben die gleiche Bezeichnung wie bei Dir.
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 public end;
var Form1: TForm1;
implementation
{$R *.DFM}
function BuchstabenWert(c : char) : integer; 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; 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[0, 0] := 'Buchstabe'; SG.cells[1, 0] := 'Häufigkeit'; SG.RowCount := AnzahlBuchstaben + 1; j := 0; for k := 1 to AnzahlBuchtaben do begin 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
|
Verfasst: Do 23.06.11 08:50
vielen dank an euch beide nun geht es 
|
|
|