C# Anfänger sucht Erklärung! C#

Nukamii

Newbie
Registriert
Okt. 2015
Beiträge
4
Hallo Leute,

Da ich hier neu bin stell ich mich erstmal vor. Mein Name ist Raffael und ich bin 15 Jahre alt. Derzeit gehe ich auf eine HTL (Höhere Technische Lehranstalt) in Wien. Der Schwerpunkt liegt bei Programmieren. Derzeit machen wir die Sprache C# und Konsolenanwendungen.

Am Mittwoch haben wir ein Beispiel bekommen, dass wir bis nächsten Mittwoch fertig haben müssen.

Hier die Aufgabenstellung:

Eine Methode, string insert (string text, string wort, int pos) die ein Wort in einen Text einfügen soll. Die Position gibt an, an welcher (Wort-)Position das Wort eingefügt werden soll. Position null bedeutet, dass es am Anfang eingefügt wird, ist die Position zu groß, wird es am Ende angehängt. Zur Trennung der Worte dienen die Leerzeichen.

Beispiele: Eingabeparameter Rückgabewert
„ich bin Tischler“, „ein“, 2 „ich bin ein Tischler“
„Haus“, „hohes“, 0 „hohes Haus“
„ein Tag“, „danach“, 3 „ein Tag danach“

Bitte kann mir jemand erklären, was man hiermit genau meint. Vielleicht könnte mir das auch jemand mit dem Pseudocode erklären. Ich brauche eure Hilfe ich möchte Programmieren wirklich lernen, aber ich tu mir sehr schwer dabei, und wenn ich zuhause das Programm an dem ich sitze nicht schaffe, gebe ich schnell auf, deshalb schreibe ich jetzt hier. Ich weiß ihr werdet denken "Was ist denn das für ein Mickey Mouse Programm" aber ich schaffe es einfach nicht.

Bitte um eure Hilfe, es ist echt dringend!

//Edit: Sry habe was vergessen:

Hinweis: Die Ein- und Ausgaben erfolgen im Hauptprogramm, nicht in den Methoden und es dürfen keine Stringmethoden verwendet werden (.Length ist keine Methode und darf daher verwendet werden).
 
Zuletzt bearbeitet:
siehe Bagbag Beitrag #5.
 
Zuletzt bearbeitet: (Nach Hinweis, dass keine String methoden verwendet werden dürfen)
Es dürfen keine Stringmethoden verwendet werden Oo

also auch kein String.split?

dann bin ich ehrlich gesagt ratlos.
 
Toller Beitrag Themis.

Ich nehme an, dann sollst du eine Methode wie Split selbst bauen.
Also Quasi einfach Zeichen für Zeichen durchgehen und nach x Leerzeichen dein Wort mit einfügen.
 
Als erstes erzeuge einen Leeren String für die Rückgabe,
dann einen Textoffset, dann eine Schleife die bis pos läuft, innerhalb dieser Schleife eine Schleife die Textoffset solange erhöht bis ein Leerzeichen gefunden wurde, jedes Zeichen das bisher gefunde wurde kannst du schonmal an den Rückgabestring anhängen. Beim Leerzeichen brichst du die innerste Schleife ab und erhöhst das Textoffset vorher noch um eins, damit das Leerzeichen nicht zweimal übernommen wird.
Nach diesen beiden Schleifeblöcken prüfen ob der Textoffset größer als 0 ist und ob das letzte Zeichen kein Leerzeichen ist, falls nicht eins anhängen. (Das ist für den Fall das ein Wort am Ende angehängt wird)
Nun das Wort anhängen.
Falls das Textende noch nicht erreicht ist ein Leerzeichen anhängen.
Und die restlichen Zeichen in "Text" an Rückgabestring anhängen.
Rückgabestring zurückgeben.
 
Zuletzt bearbeitet:
Nur eine kleine Optimierung zur Methode von lynxx:
Am Anfang pruefen ob die Position 0 ist. Dann kann man das Wort einfach davor haengen und das Ergebnis ausgeben. Dadurch muessen nicht alle Schleifen durchlaufen werden.

Anmerkung: Die Schleife in der Schleife muss vom Textoffset bis Text.Length zaehlen.
 
Zuletzt bearbeitet:
Ich habe ihm per Teamviewer geholfen, für die die es interessiert, hier der code:

Code:
private static string insert(string text, string wort, int pos)
        {
            if (pos == 0)
                return wort + " " + text;

            var newText = "";
            var spaceCount = 0;
            var inserted = false;

            for (var i = 0; i < text.Length; i++)
            {
                newText += text[i];

                if (inserted == false)
                {
                    if (text[i] == ' ')
                    {
                        spaceCount++;
                    }

                    if (spaceCount == pos)
                    {
                        newText += wort + " ";
                        inserted = true;
                    }
                }
            }
            return newText;
        }
Ja, man hätte das noch kürzer und besser lösen können, doch er hat ja erst angefangen..
 
Bagbag schrieb:
Ich habe ihm per Teamviewer geholfen, für die die es interessiert, hier der code:

Code:
private static string insert(string text, string wort, int pos)
        {
            if (pos == 0)
                return wort + " " + text;

            var newText = "";
            var spaceCount = 0;
            var inserted = false;

            for (var i = 0; i < text.Length; i++)
            {
                newText += text[i];

                if (inserted == false)
                {
                    if (text[i] == ' ')
                    {
                        spaceCount++;
                    }

                    if (spaceCount == pos)
                    {
                        newText += wort + " ";
                        inserted = true;
                    }
                }
            }
            return newText;
        }
Ja, man hätte das noch kürzer und besser lösen können, doch er hat ja erst angefangen..

Ja tut mir leid, habe vergessen euch das zu sagen, trotzdem Vielen Dank an alle die geantwortet haben und versucht haben mir zu helfen.
 
Bei dieser Variante funktioniert aber Fall 3 („ein Tag“, „danach“, 3 „ein Tag danach“) nicht.

Edit: Vor "return newText;" folgendes einfuegen. Dann geht auch Fall 3.
Code:
if(pos > spaceCount)
    return text + " " + wort;

Hier die Methode wie lynxx sie beschreibt:
Code:
private string injectLynxxString(string text, string injection, int position)
{
    // erzeuge einen Leeren String für die Rückgabe
    string result = "";
    // dann einen Textoffset
    int textOffset = 0;

    // Wenn Position 0 ist einfach Wort anhängen und Rückgabestring zurückgeben
    if (position == 0)
    {
        return injection + " " + text;
    }

    // dann eine Schleife die bis pos läuft
    for (int i = 0; i <= position - 1; i++)
    {
        // innerhalb dieser Schleife eine Schleife 
        for (int j = textOffset; j <= text.Length - 1; j++)
        {
            // die Textoffset solange erhöht bis ein Leerzeichen gefunden wurde
            textOffset++;
                    
            // jedes Zeichen das bisher gefunde wurde kannst du schonmal an den Rückgabestring anhängen
            result += text[j];

            //  Beim Leerzeichen brichst du die innerste Schleife ab
            if (text[j] == ' ')
            {
                break;
            }
        }
    }

    // Nach diesen beiden Schleifeblöcken prüfen ob der Textoffset größer als 0 ist und ob das letzte Zeichen kein Leerzeichen ist, falls nicht eins anhängen.
    if (textOffset > 0 && result.Last() != ' ')
    {
        result += " ";
    }

    // Nun das Wort anhängen.
    result += injection;

    if (textOffset < text.Length)
    {
        // Falls das Textende noch nicht erreicht ist ein Leerzeichen anhängen.
        result += " ";

        // Und die restlichen Zeichen in "Text" an Rückgabestring anhängen.
        for (int i = textOffset; i <= text.Length - 1; i++)
        {
            result += text[i];
        }
    }

    // Rückgabestring zurückgeben.
    return result;
}
 
Zuletzt bearbeitet: (Fall 3 fix fuer BagBag's Variante)
Sehr nett, danke :) Habe bis jetzt nur 2 Varianten getestet und dachte da die 2 richtig waren, das mein Programm vollständig funktioniert.

Aber auch ein großes Dankeschön an BagBag für seine große Hilfe. Weiß jetzt auch bisschen mehr über das Programmieren :)!
 
Da sieht man wie wichtig unit tests sind...


Code:
private static string insert(string text, string wort, int pos)
        {
            if (pos == 0)
                return wort + " " + text;

            var newText = "";
            var wordCounter = 0;
            var inserted = false;

            for (var i = 0; i < text.Length; i++)
            {
                newText += text[i];

                if (inserted) continue;

                if (text[i] == ' ')
                    wordCounter++;

                if (wordCounter == pos)
                {
                    newText += wort + " ";
                    inserted = true;
                }
            }
            
            if (!inserted)
                newText += " " + wort;

            return newText;
        }
Das if(!inserted) macht die restliche Magie... wenn pos größer als anzahl der Leerzeichen, wird es am ende eingefügt.

Mit einem string.Trim() könnte man Leerzeichen am Anfang und Ende entfernen, der Einfachheit halber und da du keine Methoden nutzen sollst, habe ich das weg gelassen
 
Zuletzt bearbeitet:
Hey irgendwie hab ich jetzt einen Fehler gemacht:

Wenn ich "Ich bin Tischler", "ein", 2 eingebe wird " ein Ich bin Tischler " ausgegeben.

Mein Code:

static string insert(string text, string wort, int pos)
{

if (pos == 0)
{
return wort + " " + text;
}

string newtext = "";
int spacecount = 0;
bool inserted = false;

for (int i = 0; i < text.Length; i++)
{
newtext += text;


if (inserted == false)
{

if(pos > spacecount)
{
return wort + " " + text;
}
if (text == ' ')
{
spacecount++;
}

if (spacecount == pos)
{
newtext += wort + " ";
inserted = true;
}
}

}
return newtext;
}
 
Zuletzt bearbeitet:
Bitte verwende im Forum die Code-Tags [code.][/code.] (Ohne Punkt)
Code:
static string insert(string text, string wort, int pos)
{

    if (pos == 0)
    {
        return wort + " " + text;
    }

    string newtext = "";
    int spacecount = 0;
    bool inserted = false;

    for (int i = 0; i < text.Length; i++)
    {
        newtext += text[i];


        if (inserted == false)
        {

            if (pos > spacecount)
            {
                return wort + " " + text;
            }
            if (text[i] == ' ')
            {
                spacecount++;
            }

            if (spacecount == pos)
            {
                newtext += wort + " ";
                inserted = true;
            }
        }

    }
    return newtext;
}

Code:
if (pos > spacecount)
{
    return wort + " " + text;
}
Zeile 21-24 muss nach unten vor das 'return newtext;'.
Ausserdem haengst du dort den Text an das Wort an. In diesem Fall muss aber das Wort an den Text.

Sollte also ingesamt so aussehen: https://www.diffchecker.com/urc9rodp
Code:
static string insert(string text, string wort, int pos)
{

    if (pos == 0)
    {
        return wort + " " + text;
    }

    string newtext = "";
    int spacecount = 0;
    bool inserted = false;

    for (int i = 0; i < text.Length; i++)
    {
        newtext += text[i];


        if (inserted == false)
        {

            if (text[i] == ' ')
            {
                spacecount++;
            }

            if (spacecount == pos)
            {
                newtext += wort + " ";
                inserted = true;
            }
        }

    }

    if (pos > spacecount)
    {
        return text + " " + wort;
    }

    return newtext;
}
 
Generell würde ich immer Test Driven entwickeln auch als Anfänger.

Du musst dir immer erst die Frage stellen. Was ist mein Ziel? Welche Möglichkeiten gibt es?

z.B.
Code:
insertInTextWordAfterPosition("Ich bin Schreiner", "ein", -1); //fehler
insertInTextWordAfterPosition("Ich bin Schreiner", "ein", 0); //"ein Ich bin Schreiner"
insertInTextWordAfterPosition("Ich bin Schreiner", "ein", 1); //"Ich ein bin Schreiner"
insertInTextWordAfterPosition("Ich bin Schreiner", "ein", 3); //"Ich bin Schreiner ein"
insertInTextWordAfterPosition("Ich bin Schreiner", "ein", 5); //fehler

Davon abgesehen würde ich es in etwa so lösen:

Code:
public string insertInTextWordAfterPosition(string text, string word, int insertPosition)
        {
            if (insertPosition < 0)
            {
                throw new Exception("Negative position values are not allowed");
            }
            char SEPERATOR = ' ';
            int spaceCount = 0;
            string newText = "";
            int currentPosition = 1;
            foreach (char currentChar in text)
            {
                if(insertPosition == 0 && currentPosition == 1)
                {
                    newText += word + SEPERATOR;
                }
                else if (SEPERATOR.Equals(currentChar))
                {
                    spaceCount++;
                    if(spaceCount == insertPosition)
                    {
                        newText += SEPERATOR + word;
                    }
                }
                else if(currentPosition == text.Length && insertPosition > spaceCount)
                {
                    if(insertPosition == spaceCount + 1)
                    {
                        newText += currentChar + SEPERATOR + word;
                        break;
                    }
                    else
                    {
                        throw new Exception("Invalid position parameter!");
                    }
                }
                newText += currentChar;
                currentPosition++;                
            }
            return newText;
        }
 
Zuletzt bearbeitet:
Zurück
Oben