Laden...

String überprüfen, Stelle für stelle

Erstellt von CarnifeX vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.639 Views
C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren
String überprüfen, Stelle für stelle

Hallo Zusammen,

ich bin ganz neu in dem Gebiet der Programmierung und habe ein kleines Problem:
Ich habe eine Eingabefunktion in die der Benutzer folgendes eingeben soll:
z.B. :
abcyqrstik
rhdapbhuev
gfelomwvqc
hostnixagd
ijklmuyplb
kvotayzirs
dgwpxgajce
yihqkntrbm
ofzadbnpxl
mrtcwzfuyb

Jetzt soll meine Konsolenanwendung alle Sequenzen aus dem Alphabet rausschmeisen, so dass nur noch der Rest da steht:

y ik
rh a bh ev
l m qc
ost i agd
u plb
kvotay irs
dgwpxgajce
yihqkntrbm
ofzadbnpxl
mrtcwzfuyb


abcyqrstik
rhdapbhuev
gfelomwvqc
hostnixagd
ijklmuyplb
kvotayzirs
dgwpxgajce
yihqkntrbm
ofzadbnpxl
mrtcwzfuyb

   y    ik
rh a bh ev
   l m  qc
ost i agd
     u plb
kvotay irs
dgwpxgajce
yihqkntrbm
ofzadbnpxl
mrtcwzfuyb

Ich habe mir überlegt dass ich Stelle für Stelle überprüfe also ob jetzt nach a wirklich b kommt, wenn ja dann weg, wenn nicht dann stehen lassen. Jedoch weiß ich nicht den entsprechenden Befehl/Code. Kann man das mit einer Schleife lösen?

Danke schon mal 😃

J
251 Beiträge seit 2012
vor 8 Jahren

Hey,

Kann man das mit einer Schleife lösen?

Bei so einer Frage mit dem Ziel der Zeichenprüfung eines Strings pro Zeichen lautet die Antwort: Ja kann man.

Jedoch weiß ich nicht den entsprechenden Befehl/Code.

[FAQ] Wie finde ich den Einstieg in C#? sollte für dieses elementare Problem theo. reichen.

1.696 Beiträge seit 2006
vor 8 Jahren

Ein String ist auch ein array of char, d.h. du kannst die einzelnen Buchstaben über den Index ansprechen, z.B.

string myString = "CarnifeX"; // myString[0] ergibt 'C', myString[3] ergibt 'n'

Aber wenn du noch nicht mal die elementare Grundlage beherscht, sollst du nicht schon loslegen 😉

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

E
48 Beiträge seit 2009
vor 8 Jahren

Hallo

Also wenn ich es richtig Verstanden habe willst du die zeichen die im Alphabet hintereinander liegen entfernen.
Die Überprüfung ist ganz einfach den du kannst in der "Ascii" Tabelle der chars shiften.


char c = 'a'
char c2 = (char)(c +1);

danach steht in der Variable c2 ein b drinnen. Wenn der nächste Buchstabe dann ein b ist löschst du ihn.

mfg

189 Beiträge seit 2014
vor 8 Jahren

Hallo CarnifeX,

um dein Vorhaben zu lösen, benötigst du Wissen über Schleifen, die Standard-Datentypen und Detailwissen zu strings.
Einen sehr richtungsweisenden Hinweis hat dir EnjoX gegeben, wobei ich es nicht GENAU so machen würde wie er.

Ich denke - auch wenn ich kein Moderator bin - sollten WIR ihm erstmal nicht noch mehr verraten, damit er überhaupt noch einen Lerneffekt hat.

VG Ezio

EDIT: Auf den Moderationshinweis von Abt hin habe ich den betreffenden Teil ausgegraut, um zu verdeutlichen, dass es "nur" ein Hinweis und persönliche Meinung ist..

Hinweis von Abt vor 8 Jahren

Administrativer Hinweis: Im Grundlagenbereich steht es jedem frei jemanden die fertige Lösung zu präsentieren.

Persönlicher Einschub: Ich persönlich würde es aber nicht machen, da die Leute dann i.d.R./m.M. das Forum nur noch als externe Informationsquelle nutzen und oft nicht mehr selbst lernen (wollen).

C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren

Danke EnjoX für den Tipp, ich werde mich jetzt erstmal dran setzen und rumprobieren 😃

C
2.121 Beiträge seit 2010
vor 8 Jahren

Auch wenn es für die Frage evtl. nicht wichtig ist zu verstehen was überhaupt passieren soll, ich habs noch nicht durchschaut.

abcyqrstik => dass abc rausfliegt ist noch ok. qrst sind aufeinanderfolgend, deswegen die auch?

gfelomwvqc => gfe ist eine Folge, wenn auch rückwärts. Deswegen fällt sie raus. Warum fällt das o auch raus?

C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren

@chilic das o kommt weg weil unter dem o ein n ist.
Mir ist gerade erst aufgefallen dass das Ganze wie eine Tabelle aufgebaut ist und die Teilsequenzen des ABC's sowohl senk- als auch Waagerecht beachtet werden müssen -.-. Das macht das ganze noch eine Nummer schwieriger.

4.939 Beiträge seit 2008
vor 8 Jahren

Dann editiere mal deinen ersten Beitrag und packe die Eingabedaten in Code-Tags oder einem nicht-proportionalen Zeichensatz ("Courier New"), damit wir das besser lesen können.

189 Beiträge seit 2014
vor 8 Jahren

Hallo CarnifeX,
entweder hab ich noch nicht ganz verstanden, was deine Regeln für's Berabeiten sind oder du hast uns ein fehlerhaftes Ergebnis gegeben.
Mein Ergebins sähe nämlich so aus:


   y    ik
rh a bh ev
   l m  q 
 o   i ag
     u plb
kvota
dgw xga  e
y   kntr
ofzadbnpx
mrtcwzfuyb

Übrigens: Hast du es schon geschafft?
Ansonsten noch der Tipp, dass du erst probieren solltest, ob du es zeilenweise hinbekommst und dann spaltenweise (oder eben anders herum).
Nur nicht alles auf Einmal!

VG Ezio

C
CarnifeX Themenstarter:in
48 Beiträge seit 2015
vor 8 Jahren

Hey Leute,
aaaalso: Ich habe es geschafft! ICh habe die Aufgabe am Anfang missverstanden: Man muss "eine" Teilsequenz des Alphabetes finden und rauslöschen. (Diese Teilsequenz ist wie ein Labyrinth aufgebaut). Mit dem unten-stehenden Code hat der benutzer die Möglichkeit zeile für Zeile eines "ABC-Labyrinths" einzugeben. z.B:
oiunabcnkl
leknfedlnl
dodhgalskf
addijklmno
lknnnlsrqp
ddnlkntnnd
knlknvuddd
kzzyxwdddd
dagdfgdsgg
sdgrgsrrrr

Nun wird das zusammenstehende Abc aus der Liste gelöscht gelöscht.


class Program
    {
        public static char[,] eingabe = new char[100,10];
        
        public static void Main(string[] args)
        {
            Console.WriteLine("Bitte geben sie die Buchstaben ein:");
            string[] eingabeString = userEingabe();
            Console.Write("\n"); //geht in eine neue Zeile damit die Eingabe und die Ausgabe nicht als eines gesehen werden
            stringsInCharArraySpeichern(eingabeString);
            findeDenAnfang(eingabeString);
            anzeige(eingabeString);
            Console.ReadLine();                         //lässt die Konsole offen bei einer Eingabe schließt die Anwendung

        }

        private static string[] userEingabe()
        {
            string[] eingabeString = { Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Console.ReadLine(),
                                     Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), Console.ReadLine(), };
            return eingabeString;
        }

        private static void stringsInCharArraySpeichern(string[] eingabeString)
        {
            for (int y = 0; y < eingabeString.Length; y++)  //iteriert durch die spalten
            {
                for (int x = 0; x < eingabeString[y].Length; x++) // iteriert durch die zeilen
                {
                    eingabe[x, y] = eingabeString[y].ElementAt(x);
                }
            }
        }

        private static void findeDenAnfang(string[] eingabeString)
        {
            for (int y = 0; y < eingabeString.Length; y++)  //iteriert durch die spalten
            {
                for (int x = 0; x < eingabeString[y].Length; x++) // iteriert durch die zeilen
                {
                    if (eingabe[x, y] == 97 || eingabe[x, y] == 65)
                    {
                        bool hatAnfangenGefunden = nachbarbuchstabeIstSequenziell(x, y, 97);
                        if (hatAnfangenGefunden == true)
                        {
                            break;
                        }
                    }
                }
            }
        }

        private static bool nachbarbuchstabeIstSequenziell(int x, int y, int ascii)
        {
            int asciiGroß = ascii - 32;
            if ((x >= 0) && (y >= 0) && (x < (eingabe.GetLength(0) - 1)) && (y < (eingabe.GetLength(1) - 1)) && (ascii <= 122) && (asciiGroß <= 90))
            {
                if (eingabe[x, y] == ascii || eingabe[x, y] == asciiGroß)
                {
                    if (eingabe[(x + 1), y] == (ascii + 1) || eingabe[(x + 1), y] == (asciiGroß + 1))
                    {
                        löscheVorherigesFeld(x, y, ascii);
                        löscheVorherigesFeld(x, y, asciiGroß);
                        x += 1;
                        ascii += 1;
                        asciiGroß += 1;
                        nachbarbuchstabeIstSequenziell(x, y, ascii);
                        return true;
                    }
                    if ((x - 1 >= 0))
                    {
                        if (eingabe[(x - 1), y] == (ascii + 1) || eingabe[(x - 1), y] == (asciiGroß + 1))
                        {
                            löscheVorherigesFeld(x, y, ascii);
                            löscheVorherigesFeld(x, y, asciiGroß);
                            x -= 1;
                            ascii += 1;
                            asciiGroß += 1;
                            nachbarbuchstabeIstSequenziell(x, y, ascii);
                            return true;
                        }
                    }

                    if (eingabe[x, (y + 1)] == (ascii + 1) || eingabe[x, (y + 1)] == (asciiGroß + 1))
                    {
                        löscheVorherigesFeld(x, y, ascii);
                        löscheVorherigesFeld(x, y, asciiGroß);
                        y += 1;
                        ascii += 1;
                        asciiGroß += 1;
                        nachbarbuchstabeIstSequenziell(x, y, ascii);
                        return true;
                    }
                    if ((y - 1 >= 0))
                    {
                        if (eingabe[x, (y - 1)] == (ascii + 1) || eingabe[x, (y - 1)] == (asciiGroß + 1))
                        {
                            löscheVorherigesFeld(x, y, ascii);
                            löscheVorherigesFeld(x, y, asciiGroß);
                            y -= 1;
                            ascii += 1;
                            asciiGroß += 1;
                            nachbarbuchstabeIstSequenziell(x, y, ascii);
                            return true;
                        }
                    }
                    if ((eingabe[x, y] == 97 || eingabe[x, y] == 65) == false)
                    {
                        eingabe[x, y] = ' ';
                    }
                }
            }
            return false;
        }

        private static void löscheVorherigesFeld(int x, int y, int ascii)
        {
            if (eingabe[x, y] == ascii || eingabe[x, y] == ascii)
            {
                eingabe[x, y] = ' ';
            }
        }
      
        private static void anzeige(string[] eingabeString)
        {
            for (int y = 0; y < eingabeString.Length; y++)  //iteriert durch die spalten
            {
                for (int x = 0; x < eingabeString[y].Length; x++) // iteriert durch die zeilen
                {
                    Console.Write(eingabe[x, y]);            //zeigt jeden Buchstaben vom char array an
                }
               Console.Write("\n");              //geht in eine neue Zeile damit char arrays einzeln angezeigt werden    
            }
             
        }
        
    }
}

Der Code hat bestimmt ein paar macken, aber er funktioniert!

16.835 Beiträge seit 2008
vor 8 Jahren

Du solltest Dir relativ dringend anschauen, wie man Code schreibt.
Codekonventionen für C# (C#-Programmierhandbuch)

Auch Deine Bezeichnungen stimmen nicht.
Zum Beispiel ist eingabeString kein String, sondern ein Array.