AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Beginner: Textverarbeitung

Ein Thema von jdiephaus · begonnen am 30. Nov 2016 · letzter Beitrag vom 1. Dez 2016
Antwort Antwort
jdiephaus

Registriert seit: 29. Nov 2016
15 Beiträge
 
#1

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 14:32
Okay vielen Dank erstmal Klaus!

Wie kann ich den Status Carriage Return oder Linefeed aus ch auslesen?

Habe ich den Code (so wie ich ihn kommentiert habe) richtig verstanden?

Edit: Kann ich dafür ord(ch) nutzen? 32 ist in dem Fall ein Leerzeichen.

Geändert von jdiephaus (30. Nov 2016 um 14:45 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 14:44
Hallo,

in einer Ascii Tabelle nachschauen -> http://www.torsten-horn.de/techdocs/ascii.htm
LF = #10
CR = #13

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 14:49
So wie du den Code planst brauchst du das mMn gar nicht wissen. Immer wenn ein eoln war, ausser beim letzten mal, müsste doch ein neues Wort sein, wenn man jetzt mal davon ausgeht, dass es keine Silbentrennung im Text gibt und Worte die ohne Silbentrennung in der nächsten Zeile weiter gehen.

Dann bräuchtest du nur 2 Zählvariablen. Eine für AnzZeichen und eine Für AnzWort. Am Anfang beide 0.
im else zweig steigt jedes mal AnzZeichen und wenn ch=' ' dann auch AnzWort. Hier evtl. Sonderfall mehrerer Leerzeichen hintereinander betrachten, z.B. durch speichern des vorherigen Zeichens.
Und dann "könnte" sich bei jedem eoln auch die Wortzahl erhöhen (wenn nicht gleich auch eof ist).
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.549 Beiträge
 
Delphi 12 Athens
 
#4

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 15:05
Zitat:
Delphi-Quellcode:
       end //Kein Semikolon?
    else
      begin
Nein, wegen dem ELSE.
Zitat:
Delphi-Quellcode:
         readln(textin) //Kein Semikolon?
       end
Man könnte es weglassen, weil danach ein END folgt, aber besser immer machen, da der Befehl ja zuende ist.

Fazit: Semikolon immer, außer vor ELSE, da dort der Gesamt-Befehl (inkl. IF) noch nicht endet.


Zitat:
Delphi-Quellcode:
         writeln(textout); //Schreibt eingelesene Zeile in textout?
         readln(textin) //Liest nächste Zeile ein? Kein Semikolon?
Variable vergessen. (string)
Und wäre es nicht besser erst einzulesen und dann zu Gelesene speichern?

PS: Delphi-Referenz durchsuchenTStringList
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
454 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 15:16

Zitat:
Delphi-Quellcode:
         writeln(textout); //Schreibt eingelesene Zeile in textout?
         readln(textin) //Liest nächste Zeile ein? Kein Semikolon?
Variable vergessen. (string)
Und wäre es nicht besser erst einzulesen und dann zu Gelesene speichern?
Nein das passt schon so
Es wird das Zeilenende erkannt und danach in die Ausgangsdatei geschrieben. Es muss natürlich dann auch noch von der Eingangsdatei entfernt werden.
Whookie

Software isn't released ... it is allowed to escape!

Geändert von Whookie (30. Nov 2016 um 15:17 Uhr) Grund: Edit: Verquoted
  Mit Zitat antworten Zitat
jdiephaus

Registriert seit: 29. Nov 2016
15 Beiträge
 
#6

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 16:07
Delphi-Quellcode:
program Textverarbeitung;
{$APPTYPE CONSOLE} uses sysutils;
var textout,textin: Text;
    ch: Char;
    AnzZeichen: Integer;
    AnzWort: Integer;
begin
  Assignfile(textin,'test.in');
  Assignfile(textout,'test.out');
  RESET(textin); // Datei textin öffnen
  REWRITE(textout); // Datei textout zum überschreiben öffnen
  AnzZeichen:=0; // Startwert AnzZeichen
  AnzWort:=0; // Startwert AnzWort
  while not(eof(textin)) do // eof True wenn Dateiende
  begin
    if eoln(textin) then // eoln True wenn Zeilenende
    begin
      writeln(textout); // Schreibt <cr><lf> in die textout Datei
      readln(textin); // Liest <cr><lf> aus der textin Datei (und verwirft es)
    end
    else
    begin
      read(textin,ch); // Liest ein Zeichen aus der textin - Datei
      write(textout,ch); // Schreibt das soeben gelesene Zeichen in die textout - Datei
       Inc(AnzZeichen,1); // Zählt die Anzahl der Zeichen inkl. Leerzeichen
       If eoln(textin) then
          Inc(AnzWort,1); // Zählt die Anzahl der Zeilenumbrüche
       If ch=' then
          Inc(AnzWort,1); // Zählt die Anzahl der Leerzeichen
    end;
  end;
  CloseFile(textout); //Schließt textout
  CloseFile(textin); //Schließt textin
  writeln('Anzahl der Zeichen: ',AnzZeichen); // Gibt Anzahl der Zeichen aus
  writeln('Anzahl der Worte: ',AnzWort); // Gibt Anzahl der Worte aus
  readln();
end.
Vielen Dank Whookie für diese ausführliche und hilfreiche Antwort. Jetzt bin ich schon etwas schlauer.
Wie muss ich es genau verstehen, dass writeln(textout) cr und lf schreibt und readln(textin) cr und lf ausliest und verwirft? Fungiert die Funktion als Indikator in welcher Zeile man sich gerade befindet?
Wie kann ich in einem If Statement zwei Faktoren prüfen lassen bevor ich z.B. AnzWort erhöhe? Meine Lösung ist ziemlich unschön.

Geändert von jdiephaus (30. Nov 2016 um 16:24 Uhr)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 16:24
writeln -> Write Line -> Schreibt eine ganze Zeile. Zeilenende wird automatisch angefügt.
readln -> Read Line -> Ließt eine ganze Zeile. Das Zeilenende wird automatisch verworfen.

Analog dazu gibts auch

write -> Schreibt n Zeichen in die Datei. Zeilenende muss selbst gehandhabt werden.
read -> Ließt n Zeichen aus der Datei. Zeilende muss selbst gehandhabt werden.


vgl. dazu auch die Ausführungen in der Delphi-Hilfe
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 18:03
Wie kann ich in einem If Statement zwei Faktoren prüfen lassen bevor ich z.B. AnzWort erhöhe? Meine Lösung ist ziemlich unschön.
Mehrere Bedingungen kann man mit "and" oder "or" verknüpfen, hier "or":

Delphi-Quellcode:
If eoln(textin) or (ch=' ') then
          Inc(AnzWort,1); // Zählt die Anzahl der Zeilenumbrüche bzw. Leerzeichen

Hier kannst du wie schon erwähnt aber Probleme kriegen, bei zwei oder mehr Leerzeichen hintereinander, oder wie sieht es bei einer leeren Zeile aus, hier muss man evtl. auch noch mal überlegen was dann passiert.

Ach ja, das ",1" bei Inc könntest du auch weglassen, da die 1 der Standardparameter ist oder so, d.h. Inc(AnzWort) geht auch.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 17:51
Nee, er muß noch lernen. Kannst Du Dich nicht mehr an diese Sourcen erinnern, die formal vollkommen richtig waren, die aber praktisch keiner je genutzt hat?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
454 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 15:08
Delphi-Quellcode:
program Textverarbeitung;
{$APPTYPE CONSOLE} uses sysutils;
var textout,textin: Text;
    ch: Char;
begin
  Assignfile(textin,'test.in');
  Assignfile(textout,'test.out');
  RESET(textin); // Datei textin öffnen
  REWRITE(textout); // Datei textout zum überschreiben öffnen
  while not(eof(textin)) do //eof True wenn Dateiende
  begin
    if eoln(textin) then //eoln True wenn Zeilenende
    begin
      writeln(textout); // Schreibt <cr><lf> in die textout Datei
      readln(textin); // Liest <cr><lf> aus der textin Datei (und verwirft es) <- Kein Semikolon nötig (es ist aber auch nicht verboten eins zu machen!!)
    end // kein Semikolon, weil der block mit "else" weiter geht
    else
    begin
      read(textin,ch); // Liest ein Zeichen aus der textin - Datei
      write(textout,ch); // schreibt das soeben gelesene Zeichen in die textout - Datei
      // hier kann einfach ein Zeichenzähler geführt werden.
      // platz für den Wortzähler...
    end;
  end;
  CloseFile(textout); //Schließt textout
  CloseFile(textin); //Schließt textin
  readln();
end.

Schreib stets nur eine Anweisung pro Zeile, das ist dann auch besser zu kommentieren (und später auch zu debuggen).
Das erste Semikolon "kann" weggelassen werden, weil es die letzte Anweisung vor dem "End" ist - "muss" aber nicht, ich empfehle dir es immer zu setzen.
Das zweite Semikolon ist nicht erlaubt, weil der begin/end-Block über das "else" noch nicht abgeschlossen ist.
Dateien die du öffnest solltest du auch wieder schließen, das gilt auch für textin.

Zum Zählen gibts hier ohnehin schon Hinweise und selber lösen macht bekanntlich schlauer
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz