Anzeige

Vergleichen von zwei (aktuellen) Zeichen von zwei im Array gespeichertem Text nicht möglich


#1
Hey Leute,

ich habe gerade ein massives Problem und weiß nicht, wie ich dieses lösen soll. Kommenden Donnerstag haben ich und meine Klasse eine Lernzielkontrolle im Gegenstand Programmieren, in welchem wir C# lernen. Dazu hat unser Lehrer gemeint, dass wir Beispiel 73 aus dem PDF Praxisbeispiele machen sollen, denn dann seien wir vorbereitet. Die Aufgabenstellung lautet wie folgt:

Der Benutzer soll dazu aufgefordert werden, einen beliebigen Text einzugeben.
Ausgabe: Eingegebener Text, Eingegebener Text gespiegelt, kein Palindrom/Palindrom, Unterschied bei ...
Mein Code lautet wie folgt:

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace fünfundsechzig
{
    class Program
    {
        static void Main(string[] args)
        {
            //Array
            string [] txt = new string[2];

            //Deklaration
            string zeichen, zeichen2;
            int i, unterschied = 0;

            //Initialisierung
            Console.WriteLine("Bitte geben Sie einen beliebigen Text ein:");
            txt[0] = Console.ReadLine();
            txt[1] = "";

            //Spiegeln
            for (i = 0; i <= txt[0].Length - 1; i = i + 1)
            {
                zeichen = txt[0].Substring(i, 1);
                txt[1] = zeichen + txt[1];
                zeichen2 = txt[1].Substring(i, 1);

                if (zeichen == zeichen2)
                {
                    unterschied += 1;
                }
            }

            Console.WriteLine(unterschied);

            //Ausgabe
            Console.WriteLine();
            Console.WriteLine("Eingegebener Text: " + txt[0]);
            Console.WriteLine();
            Console.WriteLine("Eingegebener Text gespiegelt: " + txt[1]);
            Console.WriteLine();

            if (txt[0] == txt[1])
            {
                Console.WriteLine("Das ist ein Palindrom.");
            }
            else
            {
                Console.WriteLine("Das ist kein Palindrom.");
            }

            Console.ReadKey();
        }
    }
}
Code ist für eine Consolenanwendung.

Mein Problem ist, dass die Variable Unterschied nie einen höheren Wert als 2 zugewiesen bekommt..
 
Zuletzt bearbeitet:

sheel

I love Asm
#2
Ho

Code:
zeichen = txt[0].Substring(i, 1);
txt[1] = zeichen + txt[1];
zeichen2 = txt[1].Substring(i, 1);
 
if (zeichen == zeichen2)
{
     unterschied += 1;
}
Da du txt[1] (am Anfang leer) in jedem Schleifendurchgang um ein char verlängerst, ist zeichen2 immer der letzte Buchstabe daraus (mit dem selben Wert wie der erste Buchstabe von txt[0], und zwar immer, in jedem Schleifendurchgang). Nur ist mir nicht ganz klar, was du mit zeichen2 und unterschied eigentlich erreichen willst. Um die Stellen zu finden, die das Palindrom-sein verhindern, hilft das nicht viel

Kurz was anderes noch:
Code:
txt[0].Substring(i, 1)
kann auch, einfacher und deutlicher,
Code:
txt[0][i]
sein.

Und zum Stellenfinden: Statt das in der Schleife zu machen würd ich es erstens weiter runter, in den Nicht-Palindrom-Fall, verlagern (im Plaindrom-Fall gibts ja keinen Unterschied). Zu dem Zeitpunkt hat man den Originalstring und den umgedrehten String beide schon komplett, und muss jetzt eigentlich nur noch ermitteln, an welchen Indexen sie nicht gleich sind.
Code:
for (i = 0; i <= txt[0].Length - 1; i = i + 1)
{
    if(txt[0][i] != txt[1][i])
    {
        //Stelle i ist ein Unterschied, ausgeben
    }
}
 
#3
So, mein aktueller Code sieht aus wie folgt:

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _65
{
    class Program
    {
        static void Main(string[] args)
        {
            //Array
            string[] txt = new string[2 + 1];

            //Deklaration
            string zeichen;
            int i;

            //Initialisierung
            Console.WriteLine("Bitte geben Sie einen beliebigen Text ein: ");
            txt[1] = Console.ReadLine();

            txt[2] = "";

            //Eingegebenen Text spiegeln
            for (i = 0; i <= txt[1].Length - 1; i = i + 1)
            {
                zeichen = txt[1].Substring(i, 1);
                txt[2] = zeichen + txt[2];
            }

            //Ausgabe
            Console.WriteLine();
            Console.WriteLine("Eingegebener Text: " + txt[1]);
            Console.WriteLine();
            Console.WriteLine("Eingegebener Text in gespiegelter Form: " + txt[2]);
            Console.WriteLine();

            //Prüfung
            if (txt[2] == txt[1])
            {
                Console.WriteLine("Das ist ein Palindrom.");
            }
            else
            {
                Console.WriteLine("Das ist kein Palindrom.");
                for (i = 0; i <= txt[1].Length - 1; i = i + 1)
                {
                    if (txt[1].Substring(i, 1) != txt[2].Substring(i, 1))
                    {
                        Console.WriteLine("Unterschied bei: " + i);
                    }
                }
            }

            Console.ReadKey();
        }
    }
}
Der Code funktioniert zwar in gewissermaßen, aber:

Es soll nur ein Mal "Unterschied bei: " ausgegeben werden, außerdem ist die Zahl, die dabei ausgegeben wird, um eine Stelle nach hinten versetzt. Weiß vielleicht wer warum?
 

sheel

I love Asm
#4
Um es nur einmal auszugeben, gleich hinter Ausgabe die Schleife mit einem "break;" abbrechen.

Versetzte Zahl: du meinst nicht zufällig, dass es bei 0 statt 1 losgeht?
Vor lauter Bei-Eins-Anfangen scheinst du zu vergessen, dass das eigentlich die normale Variante ist.
Wenn es unbedingt ab 1 sein soll:
Code:
Console.WriteLine("Unterschied bei: " + (i+1));
 
#5
Ob die for-Schleife bei 0 oder 1 beginnt, macht keinen Unterschied. Die Zahl hat trotzdem 1 weniger als sie haben sollte, als würde irgendwo von der Variable 1 abgezogen werden. Danke für deinen Tipp mit
C#:
break;
Wenn ich i + 1 (wie in deinem Vorschlag) mache, dann wird die 1 daneben geschrieben und nicht addiert. Aktueller Code:

C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _65
{
    class Program
    {
        static void Main(string[] args)
        {
            //Array
            string[] txt = new string[2 + 1];

            //Deklaration
            int i;

            //Initialisierung
            Console.WriteLine("Bitte geben Sie einen beliebigen Text ein: ");
            txt[1] = Console.ReadLine();

            txt[2] = "";

            int unterschied = 0;

            //Eingegebenen Text spiegeln
            for (i = 0; i <= txt[1].Length - 1; i = i + 1)
            {
                txt[2] = txt[1].Substring(i, 1) + txt[2];
            }

            //Ausgabe
            Console.WriteLine();
            Console.WriteLine("Eingegebener Text: " + txt[1]);
            Console.WriteLine();
            Console.WriteLine("Eingegebener Text in gespiegelter Form: " + txt[2]);
            Console.WriteLine();

            //Prüfung
            if (txt[2] == txt[1])
            {
                Console.WriteLine("Das ist ein Palindrom.");
            }
            else
            {
                Console.WriteLine("Das ist kein Palindrom.");
                for (i = 0; i <= txt[1].Length - 1; i = i + 1)
                {
                    if (txt[1].Substring(i, 1) != txt[2].Substring(i, 1))
                    {
                        unterschied += 1;
                        Console.WriteLine("Der Unterschied ist bei dem " + unterschied + ". Buchstaben.");
                        break;
                    }
                }
            }

            Console.ReadKey();
        }
    }
}
 
Zuletzt bearbeitet:

Spyke

Capoeirista
Premium-User
#12
Du zählst Unterschied nur dann hoch wenn du einen unterschied findest und brichst dann auch die Schleife ab.
Damit wirst du niemals an die richtige Stelle kommen an dem das erste zeichen abweicht.
Du musst i zurückgeben, das wäre deine wirklich geprüft Stelle/die Stelle des fehlerhaften zeichens.
 
Anzeige
Anzeige