Laden...

Logische Abfolge einer While-Schleife

Erstellt von nytrec vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.180 Views
N
nytrec Themenstarter:in
37 Beiträge seit 2017
vor 6 Jahren
Logische Abfolge einer While-Schleife

Guten Abend zusammen.

Ich benötige unbedingt eure Hilfe. Ich versuche zurzeit einen Code logisch durch den Kopf zu gehen und blicke da bei einer Sache nicht so durch. Zunächst einmal der Code:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            int index = 0;
            int zaehler = 0;
            string zKette;
            char zeichen;

            Console.Write("Geben Sie eine Zeichenkette ein: ");
            zKette = Console.ReadLine();

            Console.Write("Nach welchem Zeichen soll gesucht werden?");
            zeichen = Convert.ToChar(Console.ReadLine());

            index = zKette.IndexOf(zeichen);

            while (index >=0)
            {
                index++;
                zaehler++;
                index = zKette.IndexOf(zeichen,index);
            }
            Console.WriteLine("\nIn der Zeichenkette {0} kommt {1} {2} Mal vor.", zKette, zeichen, zaehler);
        }
    }
}

Durch die Anweisung "index = zKette.IndexOf(zeichen)" wird ja erst einmal überprüft, ob das gesuchte Zeichen vorhanden ist. Nehmen wir mal die Zeichenkette "Otto" und suchen das Zeichen t. Dieser ist vorhanden und es wird die Schleife aktiviert. Da 1 t vorhanden ist, wird **index **und **zaehler **um 1 erhöht. Was mich jetzt irritiert ist die Anweisung
index = zKette.IndexOf(zeichen,index);. In den Klammern ist diesmal ein **Index **vorhanden. Grundsätzlich sucht man ein Zeichen in der **IndexOf **Anweisung. Warum wird in den Klammern nun **Index **ausgeführt? Ich blicke das ganze noch nicht so logisch durch. Könnt ihr mir das ganze Step für Step detailiert erklären? ?(

286 Beiträge seit 2011
vor 6 Jahren

    string zKette="Otto";
    char searchChar = 't';

    var foundIndices = new List<int>();

    for (int i = zKette.IndexOf(searchChar ); i > -1; i = zKette.IndexOf(searchChar , i + 1))
        {
                foundIndices.Add(i);
        }

Edit zur OP-Frage:
IndexOf ist überladen und du kanns ebenfalls einen Startindex vorgeben. D.h. du durchläufst den String und schaust ob der Char deinem gesuchten entspricht. Sagen wir i=1 liefert ein Ergebnis, wenn du jetzt wieder IndexOf aufrufst würdest du wieder i=1 erhalten, darum gibst du den startindex i+1 vor, damit du alle weiteren Ergebnisse erhälst

2+2=5( (für extrem große Werte von 2)

D
985 Beiträge seit 2014
vor 6 Jahren

Besser noch, du folgst dem [Hinweis] Bitte schau in die SDK-/MSDN-Doku

Es ist idR dokumentiert (und oft mit Code-Beispielen)

T
461 Beiträge seit 2013
vor 6 Jahren

Hier noch eine kleine Hilfe:


        static void Main(string[] args)
        {
            Console.Write("Bitte Namen eingeben: ");
            string name = Console.ReadLine();
            Console.Write("Zeichen nach dem gesucht werden soll: ");
            char zeichen = Convert.ToChar(Console.Read());
            Console.WriteLine();

            Console.WriteLine("Indexe des Namens '" + name + "':");
            for (int i = 0; i < name.Length; i++)
            {
                Console.WriteLine("Zeichen: " + name[i] + ", Index: " + i);
            }
            Console.WriteLine();

            int abbruchIndexDaSonstEndloschleife = 0;
            int indexDesZeichens_t = name.IndexOf(zeichen);
            while (indexDesZeichens_t >= 0)
            {
                Console.WriteLine("Das Zeichen '" + zeichen + "' wurde am Index " + indexDesZeichens_t + " gefunden.");
                indexDesZeichens_t = name.IndexOf(zeichen);
                abbruchIndexDaSonstEndloschleife++;
                if (abbruchIndexDaSonstEndloschleife > 9) break;
            }

            Console.WriteLine();
            Console.WriteLine("Das bringt nix... ;)");
            Console.WriteLine();

            int letztePositionDesZeichens_t = indexDesZeichens_t + 1;
            while (indexDesZeichens_t >= 0)
            {
                Console.WriteLine("Das Zeichen '" + zeichen + "' wurde am Index " + indexDesZeichens_t + " gefunden.");
                indexDesZeichens_t = name.IndexOf(zeichen, letztePositionDesZeichens_t);
                letztePositionDesZeichens_t = indexDesZeichens_t + 1;
            }

            Console.WriteLine();
            Console.WriteLine("Fertig...");
            Console.ReadLine(); Console.ReadLine();
        }

Und hier steht es auch einfach beschrieben...

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

N
nytrec Themenstarter:in
37 Beiträge seit 2017
vor 6 Jahren

Habs nun verstanden, vielen Dank. 👍 🙂