BlackBoard » Design, Programmierung & Entwicklung » Programmieren » Pascal Stringfunktionen » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Stringfunktionen
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
phoenix
Moderator


Dabei seit: 22.08.2003
Beiträge: 1.157

Stringfunktionen       Zum Anfang der Seite springen

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von phoenix: 12.12.2005 15:38.

12.12.2005 15:37 phoenix ist offline Beiträge von phoenix suchen
LX LX ist männlich
El Comandante en Jefe


images/avatars/avatar-2290.gif

Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx

Achtung       Zum Anfang der Seite springen

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.

__________________
JS-Games.de - Misled Scripting Skills Gone Mad | Meine Filmkritiken | Urban Photography
Kommt mal in den IRC-Channel: irc.eu.freenode.net | Port 6667 | #blackboard

"Ever tried. Ever failed. No matter.
Try again. Fail again. Fail better."
- Samuel Beckett

12.12.2005 15:46 LX ist offline E-Mail an LX senden Homepage von LX Beiträge von LX suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

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).
12.12.2005 23:44 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
Misel Misel ist männlich
Hüter des Kitkat


images/avatars/avatar-2084.png

Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d e

      Zum Anfang der Seite springen

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

__________________
LAUFT! Ich spiele KILLERSPIELE!
13.12.2005 01:34 Misel ist offline E-Mail an Misel senden Homepage von Misel Beiträge von Misel suchen
phoenix
Moderator


Dabei seit: 22.08.2003
Beiträge: 1.157

Themenstarter Thema begonnen von phoenix
      Zum Anfang der Seite springen

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von phoenix: 13.12.2005 09:48.

13.12.2005 09:47 phoenix ist offline Beiträge von phoenix suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » Pascal Stringfunktionen

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH