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
Seite 1 von 2  1 2      
jdiephaus

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

Beginner: Textverarbeitung

  Alt 30. Nov 2016, 15:13
Delphi-Version: 5
Hallo Liebe Community,
ich bin mittlerweile beim Thema Textverarbeitung angekommen. Hier mein Code:

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); REWRITE(textout); //Anfang textin Erzeugt leeres textout
  while not(eof(textin)) do //eof True wenn Dateiende
  begin
    if eoln(textin) then //eoln True wenn Zeilenende
       begin
         writeln(textout); //Schreibt eingelesene Zeile in textout?
         readln(textin) //Liest nächste Zeile ein? Kein Semikolon?
       end //Kein Semikolon?
    else
      begin
         read(textin,ch); //Liest nächstes Zeichen aus textin, schreibt in ch?
         write(textout,ch); //Schreibt Zeichen aus ch in textout?
      end;
  end;
  CloseFile(textout); //Schließt textout
  readln();
  end.
Ich verstehe die Funktionsweise noch nicht ganz Das Programm liest Text aus textin und schreibt ihn in textout. Funktioniert auch soweit.

Die Aufgabe lautet (falls ich den Code endlich genau verstehen würde):
- Es soll die Anzahl der Zeichen inkl. Leerzeichen gezählt werden
- Es soll die Anzahl der Worte gezählt werden

Ich habe jetzt schon einiges zum Thema Textverarbeitung gelesen auch hier im Forum, jedoch ist der Code da immer so fortgeschritten geschrieben das ich schon nicht mehr durchsteige. Procedure hier Procedure da

Meine Idee ist es die Anzahl von ch zu lesen die in textout geschrieben wird. ch in einen String zu schreiben und dann mit inttostr eine Integerzahl mit der Anzahl der geschriebenen Chars zu erzeugen. Klingt das soweit logisch?

Mit dem Zählen der Worte würde ich es dann ähnlich machen. Ich würde versuchen Wörter zu definieren als durch Leerzeichen (' ') oder Zeilenumbruch voneinander getrennte Strings. Macht das Sinn?

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken. Vielen Dank für eure Mühe. Ich weiß das sehr zu schätzen!

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

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

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 15:23
.. Zeilenende erkennst Du wenn ch = Carriage Return ist und das nächste Zeichen ch = Linefeed ist.
Ein Wort erkennst Du wenn einem Zeichen ein oder mehrere Leerzeichen folgen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
jdiephaus

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

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 15: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 15:45 Uhr)
  Mit Zitat antworten Zitat
Klaus01

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

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 15: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.737 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 15: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.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 16: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
$2B or not $2B
  Mit Zitat antworten Zitat
Whookie

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

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 16: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
Whookie

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

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 16: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 16:17 Uhr) Grund: Edit: Verquoted
  Mit Zitat antworten Zitat
jdiephaus

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

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 17: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 17:24 Uhr)
  Mit Zitat antworten Zitat
Ghostwalker

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

AW: Beginner: Textverarbeitung

  Alt 30. Nov 2016, 17: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
Antwort Antwort
Seite 1 von 2  1 2      


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 00:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz