String Methode C#

KingLz schrieb:
...
Da aber in functionS("Cod") s="Code" gesetzt wird, so wie beim 1. Mal auch, kommt wieder return functionS("ode") + "C".
...
hmmh...:confused_alt:

Sorry hat sich erledigt, kurz etwas durcheinander gebracht. Ich fange nämlich peu à peu an in C# einzutauchen.
Du meinst wohl, dass ab der Stelle wo functionS("e") + "d" erreicht wird, greift die if-Bedingung, da s.Length ==1 und damit return s; und damit wiederum s = "Code" ==> unendliche Schleife!

Ich schreibe nochmal zusammengefasst alles in Zeilen.

else-Teil

1. Durchlauf ==> functionS("ode") + "C"
2. Durchlauf ==> functionS("de") + "o"
3. Durchlauf ==> functionS("e") + "d" ==> ab hier greift if-Bedingung (s.Length == 1) und damit return s; ==>

1. Durchlauf ...
.
.
.
 
Zuletzt bearbeitet:
gamma_matrices schrieb:
Was genau verstehst du denn an der Zuweisung der Variable s an dem Punkt nicht? Wenn du nicht beschreibst wo es hapert, sondern nur "hmmh" schreibst, kann dir schlecht geholfen werden.
 
gamma_matrices schrieb:
hmmh...:confused_alt:

Sorry hat sich erledigt, kurz etwas durcheinander gebracht. Ich fange nämlich peu à peu an in C# einzutauchen.
Du meinst wohl, dass ab der Stelle wo functionS("e") + "d" erreicht wird, greift die if-Bedingung, da s.Length ==1 und damit return s; und damit wiederum s = "Code" ==> unendliche Schleife!

Ich schreibe nochmal zusammengefasst alles in Zeilen.

else-Teil

1. Durchlauf ==> functionS("ode") + "C"
2. Durchlauf ==> functionS("de") + "o"
3. Durchlauf ==> functionS("e") + "d" ==> ab hier greift if-Bedingung (s.Length == 1) und damit return s; ==>

1. Durchlauf ...
.
.
.
Nein das meint er nicht und Du kannst es noch so oft aufschreiben es wird nicht richtiger. Es wird immer "ode" übergeben und direkt durch "Code" ersetzt, dadurch entsteht eine Endlosschleife bis zum Stackoverflow. Wenn Du das nicht lesen/einsehen/verstehen kannst oder willst, ist hier Ende für Dich...

Edit: Bzw es wird "odeC" übergeben wenn ich das richtig sehe, aber es ändert nichts an Sachverhalt, auch das wird direkt wieder durch "Code" ersetzt.
 
  • Falls du noch kein Debugging kannst, würde ich das an deiner Stelle an dem Beispiel lernen und üben. Ein sehr wichtiger Programmierskill.
  • Alternativ, vor allem wenn C# deine erste Programmiersprache ist, würde ich mir überlegen ein anderes, leichteres Beispiel zu machen, das mehr auf die Grundlagen eingeht. Rekursion kann man in den meisten Programmiersprachen machen und das schon eins der schwereren Sachen. Das würde ich eher später lernen, wenn die Grundlagen noch nicht sitzen. Andererseits kann man daran einiges lernen und verstehen wenn man sich durchbeißt.
  • Alternativ zu Debugging kann man sich auch aufmalen was wann in welcher Variablen bzw. an welchem Ort steht. Ich nehme da auch gerne ein Blatt Papier zur Hand. Da kann es auch helfen Zwischenvariablen einzuführen, die zum Beispiel die Werte mit denen die Funktion später aufgerufen wird speichern.
 
Drexel schrieb:
Nein das meint er nicht und Du kannst es noch so oft aufschreiben es wird nicht richtiger. Es wird immer "ode" übergeben und direkt durch "Code" ersetzt, dadurch entsteht eine Endlosschleife bis zum Stackoverflow. Wenn Du das nicht lesen/einsehen/verstehen kannst oder willst, ist hier Ende für Dich...

Edit: Bzw es wird "odeC" übergeben wenn ich das richtig sehe, aber es ändert nichts an Sachverhalt, auch das wird direkt wieder durch "Code" ersetzt.

Ich versuche doch nur nachzuvollziehen, wann hier die Endlosschleife greift und warum? Ich bin gerade dabei mich neu in diesem Terrain (Programmierung - hier C#) zu orientieren.
Dann solche aus der arroganten Kiste daher geholten Kommentare wie nach dem Motto "wenn du das nicht kapierst ist es dein Pech", zeugt jetzt nicht gerade einer konstruktiven Unterstützung.
Ich zwinge niemanden dazu mich zu unterstützen und weiß, dass alles ja aus absoluten freien Willen erfolgt, aber erspare mir bitte solche Art von Kommentaren.
 
  • Gefällt mir
Reaktionen: Drexel
Dann noch mal zur Klarstellung. Du überschreibst den Wert durch die Zeile
C#:
s = "Code"
den du an die Funktion übergeben hast.
Dementsprechend wird immer die Funktion im else-Pfad landen und wie folgt enden:

1. Durchlauf ==> functionS("ode") + "C"
2. Durchlauf ==> functionS("ode") + "C"
3. Durchlauf ==> functionS("ode") + "C"
4. Durchlauf ==> functionS("ode") + "C"
5. Durchlauf ==> functionS("ode") + "C"
...
4711. Durchlauf ==> functionS("ode") + "C"

Du darfst den übergebenen Wert nicht überschreiben!
 
  • Gefällt mir
Reaktionen: gamma_matrices und Raijin
Myron schrieb:
Dann noch mal zur Klarstellung. Du überschreibst den Wert durch die Zeile
C#:
s = "Code"
den du an die Funktion übergeben hast.
Dementsprechend wird immer die Funktion im else-Pfad landen und wie folgt enden:

1. Durchlauf ==> functionS("ode") + "C"
2. Durchlauf ==> functionS("ode") + "C"
3. Durchlauf ==> functionS("ode") + "C"
4. Durchlauf ==> functionS("ode") + "C"
5. Durchlauf ==> functionS("ode") + "C"
...
4711. Durchlauf ==> functionS("ode") + "C"

Du darfst den übergebenen Wert nicht überschreiben!

Ah ok, jetzt verstehe ich. Also wird aus odeC immer wieder Code und dann wieder...usw.
Es war mir nicht sofort nicht plausibel, warum der Wert sofort wieder überschrieben wird.
Hat das Überschreiben damit zu tun, dass in else-Anweisung die Fkt. mit functionS(s.Substring(1)) selbst explizit vorkommt und die Fkt. wiederum bereits oben fest mit dem Parameter s vom Typ String definiert ist?
 
Die functionS soll doch mit dem String s arbeiten, ihn auswerten und dann weiterverarbeiten - in einem rekursiven Klon derselben functionS. Es ist aber vollkommen egal womit functionS aufgerufen wird, weil der übergebene String immer sofort überschrieben wird. D.h. functionS ignoriert in der jetzigen Form alles was an s beim Aufruf übergeben wurde.

Das ist so als wenn du eine Anleitung zum Falten eines Papierfliegers hast und in jedem Schritt steht gleich als erste Anweisung: "Nimm dir ein neues Blatt Papier". Glaubst du, dass im x. Schritt dann ein fertiger Papierflieger rauskommt? Nein, weil du ja nicht mit dem bereits gefalteten Papier weitergemacht, sondern immer neu angefangen hast.

Woher auch immer die Zeile s = "Code" herkommt, entweder hast du in irgendeiner Form die Vorlage oder woher auch immer das nu stammt falsch übernommen/interpretiert oder du hast einfach blind Copy&Paste einer anderen Funktion gemacht, die aber etwas vollkommen anderes tut und an dieser Stelle die Zeile vielleicht sogar Sinn ergibt - zB wenn drumherum eine IF-Anweisung steht, die s in irgendeiner Form beim ersten Aufruf einmalig initialisiert.
 
  • Gefällt mir
Reaktionen: gamma_matrices
@Myron und alle:
Hat man eigentlich noch die Möglichkeit mit diesem Code (vllt. durch etwas umbasteln) ein Resultat zu erzeugen, dass man sich ein String s komplett reverse ausgeben zulassen, so dass aus Code ==> edoC wird?
 
Zuletzt bearbeitet:
Ja hat man, die Zuweisung s = "Code" weglassen...
Ist zwar keine schöne Variante, weil Rekursion hier unnötig ist und eine normale Schleife mindestens genauso gut ans Ziel führen würde, aber ist ja nur zur Übung.

Dass die Zuweisung falsch ist stand schon sehr früh im Thread.
 
Genau, nimm die Zeile einfach raus und versuch mal den Ablauf im Debugger Schritt für Schritt durchzugehen. Man kann auch zwischendrin mit Debug.WriteLine arbeiten und sich die Zwischenergebnisse zur Veranschaulichung auf der Debug-Konsole ausgeben lassen. So kann man buchstäblich sehen wie die Rekursion arbeitet und den String umdreht.
 
C#:
namespace StringMethodeReverse
{
    class Program
    {
        static void Main(string[] args)
        {

        }
            public string functionS(String s)
            {
              
                if (s == "1" || s.Length == 1 || s == "0")
                {
                    return s;
                }
                else
                {
                    return functionS(s.Substring(1)) + s.Substring(0, 1);
                }
          
            }   
      
    }

}

Ich setze den Breakpoint bei Zeile 18, aber Debugger hängt in Zeile 6 in der Main-Methoden-Anweisung fest.
Wenn ich dann meinen Codeabschnitt in den Codeblock der Main-Methode reinnehme, bekomme ich die Fehlermeldung der public-Modifizierer ist für dieses Element nicht gültig ist.
 
Zum einen muss eine Funktion natürlich auch aufgerufen werden (also in main einen Aufruf von functionS reinnehmen) und zum anderen muss functionS mit public static definiert werden.
 
Raijin schrieb:
Zum einen muss eine Funktion natürlich auch aufgerufen werden (also in main einen Aufruf von functionS reinnehmen) ...
Main kommt doch aber vor der Definition der Fkt., wie kann ich sie dann vorher schon aufrufen?
 
Die Methoden-Reihenfolge spielt in C# keine Rolle.
Ein wenig Eigeninitiative, Neugier, Experimentierfreude wären sicher nicht verkehrt, wenn du wirklich programmieren lernen willst.
 
tollertyp schrieb:
Die Methoden-Reihenfolge spielt in C# keine Rolle.
Ein wenig Eigeninitiative, Neugier, Experimentierfreude wären sicher nicht verkehrt, wenn du wirklich programmieren lernen willst.
Ich struggle schon ganze Zeit damit und bekomme die Fehlermeldungen:

1. "string" ist "Typ" und im angegebenen Kontext nicht gültig
2. Der Name "s" ist im aktuellen Kontext nicht vorhanden

Ich habe den Aufruf an die folgende Position platziert:

C#:
static void Main(string[] args)
        {
            functionS(String s); 
        }
 
gamma_matrices schrieb:
Main kommt doch aber vor der Definition der Fkt., wie kann ich sie dann vorher schon aufrufen?
Selbst wenn das ein Argument wäre, könntest du dann ja functionS einfach über die main setzen. Da das aber wie @tollertyp schon schreibt bei C# keine Rolle spielt, ist das hinfällig.


Sorry, versteh mich nicht falsch, aber ich bin mir nicht sicher ob du für Rekursion überhaupt schon die notwendigen Basics hast. Wenn es schon an der main, Funktionsaufrufen und Dingen wie static hapert, ist Rekursion gefühlt 20 Kapitel weiter als dein jetziger Wissensstand. Das ist nicht böse gemeint, aber ich denke, dass du dich mehr mit den Grundlagen beschäftigen solltest bevor du "fortgeschrittene" Techniken wie Rekursion anwendest. Das heißt also Themen wie sie in jedem Einsteiger-C#-Buch auf den Seiten 1-50 zu finden sind.


*edit
Na klar funktioniert das nicht, weil du der Funktion einen WERT übergeben musst, also eine INSTANZ eines Strings, sowas wie "Hallo Welt!". Ein Grund mehr warum du bitte beim nächstbesten Buch bei Seite 1 anfangen solltest.
 
  • Gefällt mir
Reaktionen: tollertyp
Darf ich fragen, was du als Autor denn erwarten würdest, was hier passiert:
Code:
static void Main(string[] args)
        {
            functionS(String s); 
        }

Dass es "Code" zu "edoC" umdreht ja wohl kaum?
 
  • Gefällt mir
Reaktionen: mental.dIseASe
gamma_matrices schrieb:
Ich versuche doch nur nachzuvollziehen, wann hier die Endlosschleife greift und warum? Ich bin gerade dabei mich neu in diesem Terrain (Programmierung - hier C#) zu orientieren.
Dann solche aus der arroganten Kiste daher geholten Kommentare wie nach dem Motto "wenn du das nicht kapierst ist es dein Pech", zeugt jetzt nicht gerade einer konstruktiven Unterstützung.
Ich zwinge niemanden dazu mich zu unterstützen und weiß, dass alles ja aus absoluten freien Willen erfolgt, aber erspare mir bitte solche Art von Kommentaren.
tollertyp schrieb:
Ja hat man, die Zuweisung s = "Code" weglassen...
Ist zwar keine schöne Variante, weil Rekursion hier unnötig ist und eine normale Schleife mindestens genauso gut ans Ziel führen würde, aber ist ja nur zur Übung.

Dass die Zuweisung falsch ist stand schon sehr früh im Thread.

Genau das. Sorry wenn das Arrogant rüberkam, aber es stand schon mehrfach hier, was das Problem ist und Du bist immer wieder drüber hinweg gegangen und hast falsche Dingen gebetsmühlenartig wiederholt. Da muss manchmal eine harsche Ansprache zum wachrütteln her, wenn das man Dich schon nicht persönlich schütteln kann. =)
 
tollertyp schrieb:
Darf ich fragen, was du als Autor denn erwarten würdest, was hier passiert:
Code:
static void Main(string[] args)
        {
            functionS(String s);
        }

Dass es "Code" zu "edoC" umdreht ja wohl kaum?

Nein, das natürlich nicht...ich hatte nur versucht gehabt bzgl. Debuggings Raijins Beitrag #33 umzusetzen. Ich habe mir schon gedacht, dass es bestimmt nonsense ist. Ich probiere alles mögliche um und komme leider noch nicht richtig weiter. Ein weiterer Tipp evt.?
Ergänzung ()

Ich habs Leute...meine Güte.:D
C#:
static void Main(string[] args)
        {
           
            string s = functionS("Code");
            Console.WriteLine(s);
            Console.ReadLine();
           
        }
Daraufhin bekomme ich über die Konsole edoC editiert.
Tja, wie heisst es so schön, probieren geht über studieren.
Danke für eure Mühe und Geduld!

Edit: Ich bin mir natürlich absolut im Klaren, dass ich die elementaren Grundlagen komplett intus haben muss!
 
Zuletzt bearbeitet:
Zurück
Oben