|
|
|
|
Stringfunktionen |
phoenix
Moderator
Dabei seit: 22.08.2003
Beiträge: 1.157
|
|
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von phoenix: 12.12.2005 15:38.
|
|
12.12.2005 15:37 |
|
|
LX
El Comandante en Jefe
Dabei seit: 25.11.2001
Beiträge: 5.372
Herkunft: Berliner Bronx
|
|
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
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 |
|
|
CDW
eine Simulation
Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread
|
|
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 ?
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
)
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 |
|
|
Misel
Hüter des Kitkat
Dabei seit: 02.11.2002
Beiträge: 1.203
Herkunft: live://home.berlin.d
e
|
|
sorry, dass es ein bisschen Off-Topic ist. Aber Pascal kennt Ranges :o
Die Sprache ist doch noch cooler als ich dachte
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
__________________ LAUFT! Ich spiele KILLERSPIELE!
|
|
13.12.2005 01:34 |
|
|
|
|
|
|