Laden...

Lauftextes erzeugen

Erstellt von ImpliziteKonvertierung vor 16 Jahren Letzter Beitrag vor 16 Jahren 5.576 Views
I
ImpliziteKonvertierung Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren
Lauftextes erzeugen

Guten Tag zusammen 🙂

Ich hoffe, ich habe hier das richtige Forum erwischt, also fange ich einfach mal an, mein Problem zu beschreiben.

Ich mache derzeit mein Fachabitur als informationstechnischer Assistent und stehe vor einem vielleicht gar nicht so schwerem Problem. Die Lösung ist für mich jedenfalls nicht offensichtlich.
Es geht um ein Programm, welches aus einem Text, der beliebig lang ist, einen Lauftext machen soll (Konsole). Wie das vom Grundsatz her funktioniert, weiß ich auch schon (Thread.Sleep, \r etc.). Die Buchstaben müssen einzelnt versetzt werden, um eine "Illusion" eines Lauftextes zu erzeugen.


Thread.Sleep(300);
Console.Write ("Hallo\r");
Thread.Sleep(300);
Console.Write ("alloH\r");
Thread.Sleep(300);
Console.Write ("lloHa\r");
Thread.Sleep(300);
Console.Write ("loHal\r");
Thread.Sleep(300);
Console.Write ("oHall\r");
Thread.Sleep(300);
Console.Write ("Hallo\r");

Mein Problem ist Folgendes:

Der Text, den der Nutzer eingibt, muss beliebig lang sein. Also habe ich den


string eingabe

in einen substring (eingabe.Substring) umgewandelt. Hat der Text nun 4 Buchstaben, kann das ganze so aussehen:


Console.Write(eingabep.Substring(0,1) + "\r");
Thread.Sleep(300);
Console.Write(eingabep.Substring(1,1) + eingabep.Substring(eingabep.Length - 3,1) + eingabep.Substring(eingabep.Length - 3,1) + eingabep.Substring(4) + eingabep.Substring(0,1) + "\r");
Thread.Sleep(300);
Console.Write(eingabep.Substring(eingabep.Length - 3,1) eingabep.Substring(eingabep.Length - 3,1) + eingabep.Substring(4) + eingabep.Substring(0,1) + eingabep.Substring(1,1) + "\r");
Thread.Sleep(300);
Console.Write(eingabep.Substring(eingabep.Length - 3,1) + eingabep.Substring(4) + eingabep.Substring(0,1) + eingabep.Substring(1,1) + eingabep.Substring(eingabep.Length - 3,1) + "\r");
Thread.Sleep(300);
Console.Write(eingabep.Substring(4) + eingabep.Substring(0,1) + eingabep.Substring(1,1) + eingabep.Substring(eingabep.Length - 3,1) + eingabep.Substring(eingabep.Length - 3,1) + "\r");
Thread.Sleep(300);
Console.Write(eingabep.Substring(0,1) + eingabep.Substring(1,1) + eingabep.Substring(eingabep.Length - 3,1) + eingabep.Substring(eingabep.Length - 3,1) + eingabep.Substring(4) + "\r");

Allerdings könnte der Text auch 4000 Zeichen haben, wenn man so will. Ich könnte durch string.Length die Anzahl der Buchstaben zwar zählen, jedoch weiß ich immernoch nicht genau, wie viele Zeichen der Nutzer nun eingegeben hat. Das weiß ich erst bei Benutzung des Programms. Theoretisch müsse ich für 4000 Zeichen nun einen switch mit 4000 Möglichkeiten schreiben, aber es gibt doch mit Sicherheit noch eine andere Möglichkeit oder?

Ich bitte um Hilfe!

2.223 Beiträge seit 2005
vor 16 Jahren

Hallo ImpliziteKonvertierung und HErzlich Willkommen,

Eine kleine For Schleife würde dein Problem doch Perfekt lösen

mfg

K
124 Beiträge seit 2006
vor 16 Jahren

Hallo ImpliziteKonvertierung,

du soltest das ganze in eine Schleife packen:
etwa so:


int i = 0;
string str = "blabla";
while(true)
{
 Console.WriteLine(str.Substring(i, str.length - i) + str.Substring(0,i));
 ++i;
 if(i>=str.Length)
  i=0;
 Thread.Sleep(300);
}

Edit: sry, das Schleifenkonstrukt war wirklich sehr abenteuerlich, thx für den Hinweis talla 🙂

lg
kaloon

6.862 Beiträge seit 2003
vor 16 Jahren

Hallo,

Das Thread.Sleep würde ich weglassen, lieber nen Timer verwenden.

Prinzipiell ist die Überlegung mit Substring gar net schlecht, auch wenn du es arg verkomplizierst. Wenn du mal überlegst was du manuell machst kommst du auf ne prima kurze Lösung. Du nimmst doch praktisch den ersten Buchstaben. Nimmst ab dem zweiten Buchstaben alles bis hinten und schiebst es nach vorn und hängst den vormals ersten Buchstaben ran. Des nach vorn Schieben kann man sich sparen weil man des ja einfach so schreiben kann:

neuerstring = alterstring.Substring(1,alterstring.Length) + alterstring[0];

Und das machst einfach jedes mal und immer "rotiert" der String ein nach vorn.

EDIT: Mist, kaloon war schneller, auch wenn das Schleifenkonstrukt abenteuerlich aussieht 😉

Baka wa shinanakya naoranai.

Mein XING Profil.

I
ImpliziteKonvertierung Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

Vielen Dank für Eure Antworten. Super, dass man hier gleich nicht abweisend auf die Suche verwiesen wird. Generell weiß ich, wie ich mit Suchfunktionen umgehen kann, nur hier war ich irgendwie ratlos..

Original von talla
Das Thread.Sleep würde ich weglassen, lieber nen Timer verwenden.

Ich hätte in C# gerne vieles Bisherige gerne anders umgesetzt, allerdings muss man sich an Schulen und Berufsfachschulen an bestimmte Dinge halten. So muss ich mich hier auch an das Thread.Sleep halten.. Wobei ich selbst i.d.F. nicht auf die Timer-Lösung zurückgegriffen hätte , was daran liegt, dass ich zwar von dem Timer gehört habe, aber den Syntax gar nicht kenne 😄.

Ich gehe die Lösungsmöglichkeiten später durch, hab jetzt noch was zu erledigen. Herzlichen Dank nochmal! 🙂

//edit

Jetzt habe ich ein neues Problem: Wie kann ich die Richtung verändern? Von Links nach Rechts statt von Rechts nach Links. Ich versuche weiter, dahinterzukommen - Schließlich muss ich auch mal wieder was alleine lösen können. Hilfsansätze zur Logik dahint wären aber super! 😉

6.862 Beiträge seit 2003
vor 16 Jahren

Original von ImpliziteKonvertierung
Super, dass man hier gleich nicht abweisend auf die Suche verwiesen wird.

Hättest du was geschrieben von wegen

ich will nen lauftext darstellen, bin hilflos, schreibt mir den code , am liebsten noch fett, großgeschrieben und mit 10 ausrufezeichen, dann wäre die Antwort ganz anders ausgefallen 😄.

Aber du hast dir doch selbst Gedanken gemacht und eine Lösung deinerseits vorgestellt - so hat man es gerne da man auf eine ganz konkrete Frage antworten kann und nicht ewig rumraten muss etc. Wäre schön wenn mehr Fragen so wären 🙂

Baka wa shinanakya naoranai.

Mein XING Profil.

I
ImpliziteKonvertierung Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

Ich kenn das Problem aus anderen Foren. Da nervt es mich auch tierisch 🙂

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo ImpliziteKonvertierung,

Wie kann ich die Richtung verändern?

naja, egal ob für rechts oder links, es bleibt bei String.Substring. Es ist nur die Frage, ob du den Buchstaben am Anfang oder am Ende nimmst und ob ihn vorne oder hinten anhängst.

herbivore

165 Beiträge seit 2007
vor 16 Jahren

Hallo, ich hab das ganze mal mit einen Char-Array und einem Timer realisiert.
Dann werden pro Intervall in einer for schleife die einzelnen Chars in ein Label/TextBox geschrieben(angehängt) mit einer int-Variable setze ich dann immer noch den offset hoch, d.h., dass er dann nachher auch weiß, wo er im array anfangen soll. Und dann muss man halt noch überprüfen, ob er über das array hinausgeht und im entsprechenden fall, wieder von vorna anfangen.

Visit my Blog: http://michael.barz.de

I
ImpliziteKonvertierung Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

Auch Danke dafür, denn das Umsetzen mittels chararray() ist die nächste Aufgabe, an die ich heran muss.

I
ImpliziteKonvertierung Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

Original von herbivore
Hallo ImpliziteKonvertierung,

Wie kann ich die Richtung verändern?
naja, egal ob für rechts oder links, es bleibt bei String.Substring. Es ist nur die Frage, ob du den Buchstaben am Anfang oder am Ende nimmst und ob ihn vorne oder hinten anhängst.

herbivore

Grundsätzlich funktionierts nun, danke 🙂

Das Einzige, was noch stört, ist, dass es nicht richtig funktioniert. Die Schrift läuft zwar, nur.. Naja, nicht so, wie sie es soll. Schwer zu beschreiben. Entweder läuft die Schrift durch, überschreibt die alte Schrift allerdings nicht, sondern das Feld, auf dem sie läuft, bleibt leer oder.. Naja, das ist die zu schwer beschreibende Variante.


onsole.Write(str.Substring(0,i) + str.Substring(0, str.Length) + " \r");

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo ImpliziteKonvertierung,

ich weiß nicht genau, ob ich dich verstanden habe. Suchst du vielleicht nach Console.CursorLeft/CursorTop?

herbivore

I
ImpliziteKonvertierung Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

Nein nein, das suche ich nicht...

Ich versuche mal, es grundsätzlich zu erklären:
Der Lauftext von den oben genannten Beispielen lässt den Text von Rechts nach Links laufen. Er läuft aneinandergekettet nach Links, ohne Stellen, die nicht im String leer (Leerzeichen) sind, frei zu lassen.
Nun möchte oder muss den Text viel mehr entgegengesetzt laufen lassen.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo ImpliziteKonvertierung,

das habe ich ja schon beschrieben, wie das geht.

herbivore

I
ImpliziteKonvertierung Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

Richtig, und daran hänge ich gerade. Reiner logischer Denkfehler, glaube ich. Möchte ich auch selbst lösen - Bin ja schon nah dran 🙂

Danke für Dein Interesse an meinem Problem =)

//edit
Ich frag mich, wieso ich so lange gebraucht habe, um dahinter zu kommen. Hab's jedenfalls geschafft - Vielen Dank nochmals!

A
266 Beiträge seit 2007
vor 16 Jahren

wie wärs damit ?( ?( ?(


string alterstring = new string('a', 0);
            alterstring = Console.ReadLine();
            Console.Clear();
            while (true)
            {
                alterstring = alterstring.Substring(1) + alterstring[0];
                Console.Write(alterstring + "\r");
                Thread.Sleep(300);
            }

und andersrum...

alterstring = alterstring[alterstring.Length-1] + alterstring.Substring(0,alterstring.Length-1);

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

A
266 Beiträge seit 2007
vor 16 Jahren

Achso und zu dem abenteuerlichen Schleifenkonstrukt:

Das Ding kann man einfach durch drücken des X-Knopfes abbrechen also denk ich egal... und ausserdem läuft es so unendlich lange 😁

Von all den Sachen, die mir verloren gegangen, hab ich am meisten an meinem Verstand gehangen... MfG...

I
ImpliziteKonvertierung Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

Es soll eine Endlosschleife bleiben 🙂

Nun habe ich allerdings ein neues Problem, diesmal mit der charArray-Methode:

int i = 0;
string str;
str = "Nüx";
Console.WriteLine("Geben Sie die Zeichenkette ein, welche in der Laufschrift laufen soll.");
str = Console.ReadLine();
int izwei = (str.Length - 1);
char[] chr = str.ToCharArray(0, izwei);

while(true)
{
int lool = (izwei - i);
Console.Write(chr[i].ToString() + chr[izwei].ToString() + chr[lool].ToString() + "\r");
++i;
if(i>=izwei)
{
  i=0;
}
Thread.Sleep(300);
}
}

Das Problem ist diesmal nicht, dass der Lauftext nicht erscheint, sondern dass ich es nicht hinbekomme, alle Zeichen darzustellen. Mit der obrigen Lösung springt der CharArray aus dem Index.
Der Code, den ich gepostet habe, entspricht der Substring-Lösung von kaloon.

int i = 0;
string str = "blabla";
while(true)
{
Console.WriteLine(str.Substring(i, str.length - i) + str.Substring(0,i));
++i;
if(i>=str.Length)
  i=0;
Thread.Sleep(300);
}

Ich denke, ich habe da keinen logischen Denkfehler eingebaut, sondern irgendwas im Syntax ist falsch. Weder bei MSDN, Google noch bei myCSharp.de konnte ich irgendetwas finden, was mich weiterbringt.
Würde da nochmal um Hilfe bitten.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo ImpliziteKonvertierung,

sondern irgendwas im Syntax ist falsch.

dann müsste ja ein Syntaxfehler ausgegeben werden. Siehe [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).

In der Schleife solltest du pro Schleifendurchlauf immer nur ein Zeichen ausgeben, dann wird es vermutlich alles klarer.

herbivore

I
ImpliziteKonvertierung Themenstarter:in
9 Beiträge seit 2007
vor 16 Jahren

Hallo,

nachdem ich eine lange Zeit, vielen Zigaretten und mehreren verzweifelten Wutanfällen endlich auf eine Lösung für links nach rechts mittels CharArray gekommen bin


						for (int i = 1; i < laenge; i++)
						{
							betw[i - 1] = chr[i - 1];
						}
						betwb = chr[laenge - 1];
						chr[0] = betwb;
						for (int i = 1; i < laenge; i++)
						{
							chr[i] = betw[i - 1];
						} 
				
						//Ausgabe
						str = \\\"\\\";
						for (int i = 0; i < laenge; i++)
						{
							str = str + Convert.ToString(chr[i]);
						}

hänge ich nun an der Lösung für den umgekehrten Weg. Egal, welchen Weg ich gehe - Er springt immer aus dem Index heraus.

Ich bitte da um ein letztes Mal um Hilfe.. Langsam verzweifle ich echt wieder.