AGB  ·  Datenschutz  ·  Impressum  







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

Ich scheitere grade an simpler Mathematik

Ein Thema von hansklok · begonnen am 26. Mär 2017 · letzter Beitrag vom 28. Mär 2017
Antwort Antwort
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#1

Ich scheitere grade an simpler Mathematik

  Alt 26. Mär 2017, 18:47
Hallo an alle,

eines Vorweg, Mathematik war nie meins

Es geht um folgendes. Ich möchte einen Text beliebiger Länge formatiert als String ausgeben. Nehmen wir diesen String als Beispiel:
Code:
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
Lorem ipsum do
Er hat eine Länge von genau 310 Zeichen. Dieser soll nun in die folgende Struktur umgewandelt werden:
Code:
NOTE Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea t
CONC akimata sanctus est Lorem ipsum dolor sit amet.
CONT Lorem ipsum do
Was sehen wir? Also jede Zeile darf eine maximale Textlänge von 248 Zeichen, ohne die vorangestellten Tags (NOTE, CONC, CONT), haben. Die erste Zeile beginnt immer mit dem Tag NOTE. Gibt es einen Zeilenumbruch, so beginnt die neue Zeile mit CONT, muss die Zeile automatisch umgebrochen werden, weil der Text der Zeile zu lang ist (aktuelle Zeilenlänge > 248 Zeichen), so beginnt die Folgezeile mit CONC.

Wie lässt sich das programmiertechnisch umsetzen?

Besten Dank im Voraus.

Geändert von hansklok (26. Mär 2017 um 18:51 Uhr)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Ich scheitere grade an simpler Mathematik

  Alt 26. Mär 2017, 19:01
Fehlende mathematische Begabung ist hier kein Hindernis, denn mit Mathematik hat das nicht sonderlich viel zu tun.

Am besten ist es, Du extrahierst immer das entsprechende Anfangsteil dieses Strings und baust in einem neuen String (Anfangslänge 0) dann wieder alles auf, das geht mit simpler "+"-Addition. Zuvor aber Note, Cont und Conc an diesen neuen String anhängen. Das ist m.E. am übersichtlichsten. Etwas komplizierter wird es, wenn Du das alles in den schon vorhanden String integrieren möchtest: Die Zeilenumbrüche und ggf. die Zeilenumbrüche. Dann mußt Du mit einem Integerwert für den laufenden Index arbeiten.

Geändert von Delphi-Laie (26. Mär 2017 um 21:26 Uhr)
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#3

AW: Ich scheitere grade an simpler Mathematik

  Alt 26. Mär 2017, 19:05
Fehlende mathematische Begabung ist hier kein Hindernis, den mit Mathematik hat das nicht sonderlich viel zu tun.

Am besten ist es, Du extrahierst immer das entsprechende Anfangsteil dieses Strings und baust in einem neuen String (Anfangslänge 0) dann wieder alles auf, das geht mit simpler "+"-Addition. Zuvor aber Note, Cont und Conc an diesen neuen String anhängen. Das ist m.E. am übersichtlichsten. Etwas komplizierter wird es, wenn Du das alles in den schon vorhanden String integrieren möchtest: Die Zeilenumbrüche und ggf. die Zeilenumbrüche. Dann mußt Du mit einem Integerwert für den laufenden Index arbeiten.
Danke für den ersten Input.

Also ich würde ja erstmal alles in eine Lines-Array splitten (Linebreak). Dann habe ich die Zeilen und diese müssen ja irgendwie nach länge durchlaufen werden und dann u.U. für CONC umgebrochen werden.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Ich scheitere grade an simpler Mathematik

  Alt 26. Mär 2017, 19:33
Ungetestet hingedaddelt:
Delphi-Quellcode:
const
   ciMaxLineLength = 248;
var
  slIn : TStringList;
  slOut : TStringList;
  i : Integer;
  sLine : String;
begin
  slIn := TStringList.Create;
  slOut := TStringList.Create;
  slIn.LoadFromFile('Eingabe.txt');
  for i := 0 to slIn.Count - 1 do begin
    sLine := slIn[i];
    if i = 0 then slOut.Add('NOTE ' + Copy(sLine,1,ciMaxLineLength)
    else slOut.Add('CONC ' + Copy(sLine,1,ciMaxLineLength);
    while Length(sLine > ciMaxLineLength do begin
      sLine := Copy(sLine,ciMaxLineLength + 1,Length(sLine));
      slOut.Add('CONT ' + Copy(sLine,1,ciMaxLineLength));
    end;
  end;
  slOut.SaveToFile('Ausgabe.txt');
  slOut.Free;
  slIn.Free;
end;
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#5

AW: Ich scheitere grade an simpler Mathematik

  Alt 28. Mär 2017, 13:34
Vielen lieben Dank, ich habe es mittlerweile hinbekommen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Ich scheitere grade an simpler Mathematik

  Alt 28. Mär 2017, 14:03
Immer schön, wenn dann nicht die Lösung genannt wird.
Da freut sich jeder mit dem gleichen oder einem änlichen Problem, wenn er irgendwann diesen Thread findet.

Zur Aufgabenstellung passend auch eine Lösung mit etwas mehr Mathematik drin.
Delphi-Quellcode:
SL := TStringList.Create;
SL.LoadFromFile('Eingabe.txt');
for i := SL.Count - 1 downto 0 do begin
  SL[i] := IfThen(i = 0, 'NOTE ' , 'CONC ') + SL[i];
  for i2 := (Length(SL[i]) - 1) div 248 downto 1 do
    SL[i] := Copy(SL[i], 1, i2 * 248) + sLineBreak + 'CONT ' + Copy(SL[i], i2 * 248 + 1);
end;
SL.SaveToFile('Ausgabe.txt');
SL.Free;
Angaben ohne Waffe, aber mein verdrehtes Hirn meint es könnt stimmen, was es mal schnell hingetippen lies und nicht getestet hat.

Mit einer Funktion ala SplittString, die aber nach Länge trennt, lässt sich die Schleife auf einen Zweizeiler kürzen.
$2B or not $2B

Geändert von himitsu (28. Mär 2017 um 14:08 Uhr)
  Mit Zitat antworten Zitat
hansklok

Registriert seit: 14. Apr 2004
Ort: Karlsruhe
318 Beiträge
 
Delphi 2010 Architect
 
#7

AW: Ich scheitere grade an simpler Mathematik

  Alt 28. Mär 2017, 19:22
Immer schön, wenn dann nicht die Lösung genannt wird.
Da freut sich jeder mit dem gleichen oder einem änlichen Problem, wenn er irgendwann diesen Thread findet.

Delphi-Quellcode:
Const
  MAX_LENGTH = 248;
Var
  result[]: String;
  lines[]: String = Split(Value, #13#10);
  line: String;
  count, pos, rest: Integer;
  levelStart, levelContinued, levelConcatenate: String;
Begin

  levelStart = IfThen(reference <> "", Join(Array(startLevel, reference, startTag), SPACE), Join(Array(startLevel, startTag), " "));
  levelContinued = Join(Array(Integer(startLevel + 1).ToString, "CONT "), " ");
  levelConcatenate = Join(Array(Integer(startLevel + 1).ToString, "CONC "), " ");

  For i As Integer = 0 To lines.Count Do
  
    pos = 0;
    line= lines[I];
    rest = Lenght(line);
  
    count = Min(MAX_LENGTH, Length(line));
    result.Add(Join(Array(IfThen(i = 0, levelStart, levelContinued), Copy(line, pos, count)), " "));
    rest = rest - count;
  
    While rest > 0 Do Begin
    
      pos = pos + count;
      count = Min(MAX_LENGTH, rest);
      result.Add(Join(Array(levelConcatenate, Copy(line, pos, count)), " "));
      rest = rest - count;
    
    End;
  
  End;

  Return Join(result, #13#10);

End;
  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 04:45 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