C# Run Length Verfahren Codierung

Madagaska

Cadet 3rd Year
Registriert
Jan. 2011
Beiträge
36
Hallo,

ich möchte ein C# Programm schreiben das einen text mittels Run Length Verfahren codiert.
In der Theorie würde das so aussehen
Ausgangstext: aaaaabcuuUUlDg
Codierter Text: #5abc2u2UlDg
Also der wenn ein Buchstabe öfter hintereinander vorkommt wird die Zahl, wie oft er vorkommt davor geschrieben, und wenn die Zahl höher als 3 ist wird noch ein Trennzeichen vor der Zahl hingeschrieben (#).
Code:
string kontrollzeichen = "#";
            ///char buchstabe;///stellt die Zeichen in "string text" dar
string text = "aaaaabcuuUUlDg"
            int zähler = 1;

            Console.WriteLine("ENCODING");
            Console.WriteLine("Ausgangs Text: {0}", text);
            Console.Write("Codierter Text: ");

            using (StreamWriter sw = new StreamWriter(Pfad_Codiert, false))///false = text wird jedes mal überschrieben
              {
                for (int i = 0; i < text.Length -1; i++)
                {
                    text = text[i];

                    if (text[i + 1] == text)///Ist Wert i und i+1 gleich, wird der Zähler erhöht
                    {
                        zähler++;
                    }
                    else if (zähler == 1)///Steht der Buchstabe allein, Buchstabe einmal ausgeben
                    {
                        sw.Write(text);
                        Console.Write(text);
                    }
                    else if (zähler <= 3)///Kommt der Buchstabe 2 bis 3 mal vor, wird der Zähler + Buchstabe ausgegeben
                    {
                        sw.Write(zähler);
                        sw.Write(text);
                        Console.Write(zähler);
                        Console.Write(text);
                        zähler = 1;
                    }
                    else if (zähler > 3)///Kommt der Buchstabe öfter als 3 vor, wird das Kontrollzechen + Zähler + Buchstabe ausgegeben
                    {
                        sw.Write(kontrollzeichen);
                        sw.Write(zähler);
                        sw.Write(text);
                        Console.Write(kontrollzeichen);
                        Console.Write(zähler);
                        Console.Write(text);
                        zähler = 1;
                    }
                }
           
        }

Das ist mein Code zurzeit geht bei meiner Codierung noch der letzte Buchstabe verloren.

Ich hoffe ihr könnt mir helfen

mfg
Madagaska
 
Hi,

wenn der letzte Buchstabe verloren geht wird die Schleife offensichtlich nicht der tatsächlichen Buchstabenanzahl gerecht würde ich sagen. Was passiert wenn du einen Durchlauf mehr einbaust? Also entweder du schreibst "i < text.Length;" oder "i <= text.Length -1;" ;)

VG,
Mad
 
Mist, wenn ich das mache codiert wer wieder bis auf den letzten Buchstaben und danach kommt die Fehlermeldung, das der Index außerhalb des Arraybereichs ist.

bei
Code:
if (text[i + 1] == buchstabe)
wo ich abfrage ob i +1 gleich ist wie i
 
Die schnellste Lösung wäre wohl eine zusätzliche Abbruchbedingung vor dem Ende der Schleife:

Code:
// Die Schleife inklusive des letzten Zeichens durchgehen.
for (int i = 0; i <= text.Length -1; i++)
{
    (... Dein bisheriger Code hier ...)
    
    //Abbruchbedingung wenn das Ende erreicht wurde.
    if (i == text.Length - 1)
    {
        break;
    }
}
 
Um auf eine zusätzliche Abfrage zu verzichten, würde ich das letzte Zeichen außerhalb der Schleife verarbeiten...
 
Hi,

genau das was die Vorredner sagen: Verarbeitung ausserhalb der Schleife oder prüfen, ob "i+1" größer als die Länge ist und ggf. dann Abbruch.

VG,
Mad
 
also der code ist so erst einmal falsch. den fehler hast du eigentlich auch schon selbst gefunden:
du hast ne for schleife über deinen text mit der laufwvariable i. aber du benutzt i+1 was dein array text anspricht und folglich einen out of bound Fehler verursacht.

ein tip wie du dein programm generell besser strukturieren kannst und damit besser die übersicht behälst:
du hast viel zu viel in einer einzigen funktion programmiert. spalte was du da machst auf in kleine funktionen. funktionen die einem bestimmten abgegrenzten zweck dienen. dann wird deine for-schelife schnell übersichtlicher und du erkennst viel einfacher was du da (ggf. falsch) machst.

generell solltest du beim programmieren dein problem in viele kleine teilprobleme zerlegen dun diese individuell lösen.
 
Zurück
Oben