BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- Pascal Stringfunktionen (http://www.black-board.net/thread.php?threadid=21617)


Geschrieben von phoenix am 12.12.2005 um 15:37:

  Stringfunktionen

Hi Habe folgendes Problem und zwar, soll bei ein Programm die Wörter und Buchstaben eines satzes Zählen. Aber irgendwie wird immer eine Leerstelle vergessen. Hier mal den mal den quelltext.



program lern1;

uses
crt;

VAR
satz1 : string;
satz2 : string;
laenge : integer;
leerstellen : string;
buchstaben : integer;
woerter : integer;
satzkurz : string;
saiten : string;

BEGIN

clrscr;

satz1 := 'Ein Anf„nger der Gittare hat Eifer.';
satz2 := 'Die Gitarrensaite klingen also in E-A-D-g-h-e.';


GotoXY(2,10); Write('Satz1 = ',satz1);
GotoXY(2,12); Write('Satz2 = ',satz2);

GotoXY(2,14); Write('-----------------------------------------------------------');

GotoXY(2,16); Write('1. Satzlänge');
GotoXY(2,17); Write('2. Anzahl der Buchstaben');
GotoXY(2,18); Write('3. Anzahl der Wörter');
GotoXY(2,19); Write('4. Gitarrensaiten');
GotoXY(2,20); Write('5. Verkürzter Satz');

laenge := length(satz1);

buchstaben := laenge - pos(' ',satz1) -1;

{hier oben muss ich noch zusätzlich -1 machen. warum?}

woerter := pos(' ',satz1) + 2;

{hier muss ich +2 statt +1 machen. warum?}

saiten := copy(satz2,35,41);
Delete(saiten,2,1);
Delete(saiten,3,1);
Delete(saiten,4,1);
Delete(saiten,5,1);
Delete(saiten,6,1);
Delete(saiten,7,1);

satzkurz := copy(satz2,1,25);

GotoXY(40,16); Write('= ',laenge:2,' Zeichen');
GotoXY(40,17); Write('= ',buchstaben:2);
GotoXY(40,18); Write('= ',woerter:2);
GotoXY(40,19); Write('= ',saiten);
GotoXY(40,20); Write('= ',satzkurz);



readkey;


End.


greatz



Geschrieben von LX am 12.12.2005 um 15:46:

Achtung

1. "Gitarre" mit einem T und 2 R *scnr*

2. Mal versucht, ob er die Buchstabenanzahl korrekt ausgibt, wenn du keine Umlaute in dem Satz verwendest (also ae statt ä)? Je nach Zeichensatz, in dem ein String verarbeitet wird, könnten Sonderzeichen multibyte characters sein, also 2 statt nur 1 Byte an Daten fressen. Normale Stringfunktionen zählen aber nur die Bytes, berücksichtigen aber Multibyte Characters nicht. Zumindest ist das bei einigen Programmiersprachen so, wie's da konkret bei PASCAL (wie fühlt sich's eigentlich an, in einer Programmiersprache zu coden die so heißt wie man selber? *g) aussieht, weiß ich net. Mir wurde damals antrainiert, in PASCAL keine Umlaute zu verwenden Augenzwinkern

3. Warum das mit dem Zählen der Worte nicht hinhaut, weiß ich aber im Moment auch net.



Geschrieben von CDW am 12.12.2005 um 23:44:

 

Zitat:
buchstaben := laenge - pos(' ',satz1) -1;


Du willst also die Anzahl der Buchstaben zählen, in dem Du von der Länge die Postion des ersten Leerzeichens subtrahierst ? Augenzwinkern
irgendwie ein sehr komischer algorithmus, aber dafür wohl relativ schnell *g*

stattdessen:
code:
1:
2:
3:
4:
5:
6:
7:
 buchstaben:=0;
 for i:=0 to laenge do
   begin
      if satz1[i] in ['a'..'z','A'..'Z'] then inc(buchstaben);
   end;

liefert die "richtige" Anzahl:28
Idee ist hier: man geht durch den Satz und schaut sich alles an, was ein Buchstabe ist - und macht "buchstaben=buchstaben+1" (oder inc(buchstaben) )

Die IN Anweisung in Pascal kannst Du auch durch:
if (satz1[i]>='a' AND satz1[i]<='z') OR (satz1[i]>='A' AND satz1[i]<='Z')
ersetzen (ist eben länger zu schreiben). Wenn Du Dir die Asciitabelle anschaust, siehst Du auch, warum man das so machen kann.



genau dasselbe mit den Wörtern:
Zitat:
woerter := pos(' ',satz1) + 2;

die Position der ersten Leerstelle ist 4, du addierst 2 (also so dass es passt Augenzwinkern )

eher:

code:
1:
2:
3:
4:
5:
6:
 woerter:=1;
 for i:=0 to laenge do
   begin
     if satz1[i] =' ' then inc(woerter);
   end;

Hier zählt man einfach die Leerzeichen und addiert eins dazu (Woerter:=1),
weil der Satzt ja mit einem Wort anfängt und aufhört.

*nur zum Verständis*
Pos liefert Dir nur die erste Position des gesuchten Zeichen:
satz:="Hallo ich bin ein Satz";
pos(' ',satz);
hier liefert pos eine 6, weil das Leerzeichen an der 6 Stelle ist.

Und bitte: gewöhne Dir Einrückungen an: es hilft später ungemein (wenn die Projekte größer werden). Genauso wie die ganze Ausgabe und den eigentlichen Code trennen (ihr werdet bald wahrscheinlich eher noch Prozeduren kennenlernen).



Geschrieben von Misel am 13.12.2005 um 01:34:

 

sorry, dass es ein bisschen Off-Topic ist. Aber Pascal kennt Ranges :o

Die Sprache ist doch noch cooler als ich dachte fröhlich

Die Zeile
code:
1:
2:
3:
if satz1[i] in ['a'..'z','A'..'Z'] then inc(buchstaben);

liest sich schon fast wie normales Englisch und sieht fast so aus wie Ruby großes Grinsen



Geschrieben von phoenix am 13.12.2005 um 09:47:

 

Moin!

Zitat:
Orginal von CDW Du willst also die Anzahl der Buchstaben zählen, in dem Du von der Länge die Postion des ersten Leerzeichens subtrahierst ?
irgendwie ein sehr komischer algorithmus, aber dafür wohl relativ schnell *g*


Ja nun is mir auch klar was "pos" macht. Ich hab gedacht der sucht alle Leerzeichen, aber er macht ja nur das erste.

Zitat:
Orginal von CDW Und bitte: gewöhne Dir Einrückungen an: es hilft später ungemein (wenn die Projekte größer werden). Genauso wie die ganze Ausgabe und den eigentlichen Code trennen (ihr werdet bald wahrscheinlich eher noch Prozeduren kennenlernen).


Ja normal sieht das ja bei mir anders aus aber leider hat der die code funktion bei mir als Fließtext eingefügt und ich war bischen zu faul den Code wieder mit Leerstellen auseinanderzupflücken. Werd ich aber dann nächstes mal machen damit es etwas übersichtlicher ist.

Vielen dank , Problem gelöst...mfg


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH