Autor Beitrag
FLuiD
Hält's aus hier
Beiträge: 9

Win 7
Visual C# 2008
BeitragVerfasst: Do 14.01.10 11:49 
Hi,

ich möchte/soll ein Programm zum Erstellen eines Palindroms programmieren.
Meine Idee ist, er die Länge des Strings herauszufinden und dann von hinten nach vorne jeweils den letzten Buchstaben in ein character zu casten und den dann in den neuen String zu packen.

Was haltet ihr von diesem Lösungsansatz? Welche Methoden könnte ich nutzen?

In c# gibt es ja jetzt doch einige Unterschiede zu Java. Gibt es für c# auch sowas wie dies hier für java?
java.sun.com/javase/6/docs/api/

Danke im voraus und beste Grüße
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Do 14.01.10 12:04 
Hi,

warum nicht einfach ein String.Reverse? Ansonsten einfach den String durchlaufen und jedes Zeichen einzeln in einen neuen String schreiben. Dafür brauchst du aber eigentlich keinen Cast.

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 14.01.10 12:14 
Hallo und herzlich :welcome:,

so was hässliches wie bei Java gibt es nicht ;), aber ein bisschen moderner die .NET-Framework Dokumentation. Alternativ leitet dich auch Visual Studio mit einem Klick auf F1 zu der passenden Dokumentation.

Der Lösungsansatz ist bis zum "in den neuen String zu packen" für mich logisch, da hörts allerdings auf :)

Die Länge eines Palindroms muss ja gerade sein ( Modulo % Hilft). Falls dies der Fall ist den string in Charakters umwandeln (siehe Methoden der string-Klassen) und dann in einer Schleife das erste Zeichen mit dem letzten Zeichen usw. vergleichen.

Gruß Daniel
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 14.01.10 12:56 
Hallo und ebenfalls :welcome:

ene hat folgendes geschrieben:
warum nicht einfach ein String.Reverse?

Gibt es diese Methode in 3.5 wirklich?

Ich verstehe die Aufgabenstellung nicht. Es ist doch ein einfaches Verfahren, an einen beliebigen String alle Zeichen in umgekehrter Reihenfolge anzuhängen. Über Array.Reverse geht das auch in wenigen Schritten (hier aufgeteilt, damit man das Vorgehen sieht):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
string source = "irgendwas";
char[] temp = source.Chars;
Array.Reverse(temp);
StringBuilder sb = new StringBuilder();
sb.Append(temp);
string result = source + sb.ToString();

Das kann man auch in eine Zeile zusammenziehen, aber dann ist es nicht so offensichtlich.

Das ist dann natürlich kein sinnvolles Wort bzw. Satz. Wie soll geprüft werden, ob es ein sinnvoller Begriff/Satz ist? Oder worin soll deine Aufgabe bestehen?

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Die Länge eines Palindroms muss ja gerade sein ( Modulo % Hilft).

Stimmt nicht, siehe unter Wikipedia: Palindrom das Beispiel "Reliefpfeiler".

Also wozu soll diese Aufgabe dienen? Jürgen
FLuiD Threadstarter
Hält's aus hier
Beiträge: 9

Win 7
Visual C# 2008
BeitragVerfasst: Do 14.01.10 13:22 
Hallo nochmal und vielen Dank für den herzlichen Empfang :-),

ich habe die Aufgabe nochmal genau nachgeschaut und gesehen, dass ich die Aufgabe rekursiv lösen soll.;)
Wäre wohl sonst auch zu einfach gewesen...

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
static void Main(string[] args)
        {
            String wort, palindrom;
            int x;

            Console.Write("Gib ein Wort ein, dessen Palindrom erstellt werden soll: ");
            wort = Console.ReadLine();

            x = wort.Length;
            if (x % 2)
            {
                palindrom = umdrehen(wort);
            }

            Console.WriteLine("Das Palindrom hiervon ist : " + palindrom);
        }

        String umdrehenRek(string wort)
        {
            String palindrom = "";
            while (x > 0)
            {
                x--;

                //  Hier soll dem palindrom der Buchstabe von wort an der Stelle x zugefügt werden
                //  palindrom += wort.charAt(x) -> gibt es wohl nur in java...
                
                umdrehenRek(wort);
            }
            return palindrom;
        }


bin noch ein bischen zu sehr an java gewohnt... aber müsste glaub ich eigentlich fast so funktionieren.
Zumindest wenn es in c# ein zu dem javabefehl "charAt(x)" equivalenten Befehl gibt, den ich bis jetzt nicht finden konnte.

Es sei denn, es gibt ein Problem damit, einzelne Buchstaben nacheinander einem String zuzufügen.
Ein anderer Lösungsweg fällt mir aber im Moment nicht ein.

Zerfetzt mich ruhig :D ich glaub meine Programmierfähigkeiten haben sich seit dem wechsel zu c# ganz ganz stark rückentwickelt

Viele Grüße

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 14.01.10 13:29 
Hallo,

es geht einfacher. Die Buchstaben eines Strings s unter C# können sowohl über das Array s.Chars als auch direkt über s[x] angesprochen werden. Die betreffende Zeile kann also verkürzt werden zu:
ausblenden C#-Quelltext
1:
palindrom += wort[x];					

Aber vom Sinn eines Palindroms her kann ich darin überhaupt keinen Sinn erkennen. Und wieso ausgerechnet diese Aufgabe per Rekursion gelöst werden soll, ist mir erst recht schleierhaft; da gibt es bessere Beispiele. Aber vielleicht kann jemand anderes die Beziehung zu einer Rekursion besser erkennen.

Gruß Jürgen
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 14.01.10 13:39 
naja.. Sinn oder Unsinn von solchen Übungsaufgaben ist wohl öfters fraglich ;)

Hatte das "Erstellen" überlesen und bin davon ausgegangen, dass überprüft werden soll, ob eine Eingabe ein Palindrom ist oder nicht. Und stimmt, gibt auch ungerade Palindrome, dann wird der mittlere Buchstabe von beiden Seiten verwendet.

Dennoch finde ich es nicht schlecht die Methode rekursiv zu implementieren. Man soll ja lernen, wie Abbruchbedingungen und Rückgabewerte in der Rekursion zusammenspielen bis man es "blind" runterprogrammiert.

Gruß Daniel
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Do 14.01.10 13:40 
@Jürgen Mein Fehler mit dem String.Reverse, da bin ich über meine eigene Funktion gestoplert:

ausblenden C#-Quelltext
1:
string reversed = new String(strInput.ToCharArray().Reverse().ToArray());					


Und dort gehts ja auch über das Array.

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
FLuiD Threadstarter
Hält's aus hier
Beiträge: 9

Win 7
Visual C# 2008
BeitragVerfasst: Do 14.01.10 15:17 
So ich hab das jetzt mal weiter bearbeitet, bis der Compiler keine Fehler mehr anzeigt.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
static void Main(string[] args)
        {
            String wort, palindrom = "";
   Console.Write("Gib ein Wort ein, dessen Palindrom erstellt werden soll: ");
            wort = Console.ReadLine();

            palindrom = umdrehenRek(wort);
            Console.WriteLine("Das Palindrom hiervon ist : " + palindrom);

        }

        static string umdrehenRek(string wort)
        {
            int x = wort.Length ;

            String palindrom = "";
            while (x > 0)
            {
                palindrom += wort[x-1];
                x--;

                umdrehenRek(wort);
            }
            return palindrom;
        }



ich bekomme dafür jetzt eine StackOverflowException(endlosschleife?). Ich kann nur leider nicht erkennen, wo diese entsteht. X sollte ja bspw. bei "forum" den Wert 5 bekommen, da das array ja typischerweise mit 0 beginnt hab ich den index um 1 reduziert. und die Schleife soll ja nur ausgeführt werden, falls x > 0.
Seht ihr hier irgendwo den Fehler? - Die exception entseht bei :

"palindrom += wort[x-1]"


Wie kann ich eigentlich ein SourceCode als csharp code klassifizieren und anfänglich schließen? in der hilfe habe ich da nur etwas über den SourceCode für Delphi gefunden.

Viele Grüße
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 14.01.10 15:19 
Was willst du den mit Zeile 22 bezwecken? Ist das wegen der Rekursion ? ;)
Nochmal nachdenken bitte ...
FLuiD Threadstarter
Hält's aus hier
Beiträge: 9

Win 7
Visual C# 2008
BeitragVerfasst: Do 14.01.10 15:35 
Ok, habe den Fehler entdeckt :)
Dadurch, dass ich in Zeile 14 X jedes mal neu definiere kommt die Endlosschleife zustande.
Wenn ich aber X in der Main-Methode definiere, bekomme ich in der Rekursionsmethode die Fehlermeldung X sei im aktuellen Kontext nicht vorhanden.
Ich möchte/soll X jedoch nicht der Funktion als Parameter übergeben.

Zeile 16 würde dann aber denk ich auch ein Problem ergeben.
Kann mir da vielleicht jemand helfen?


Zuletzt bearbeitet von FLuiD am Do 14.01.10 15:43, insgesamt 1-mal bearbeitet
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 14.01.10 15:43 
@JüTho: Siehst du, deshalb sind solche Aufgaben Lehrreich ;)

Nun ja, das hat mit den Sichtbarkeit zu tun (OO). Du könntest das X in der Klasse als Klassenmember definieren, was aber sehr sehr hässlich wäre!

Bei Rekursion solltest du solche Felder als Parameter mitliefern. Lese gerade das du dies nicht willst - WIESO??

Gruß Daniel

PS: Es liegt nicht an der Zeile 14, sondern dass du bei Zeile 22 jedes mal die gleiche Funktion aufrufst und die sich dann wieder Aufruf und immer nur "wieder" bis Zeile 22 kommt...
FLuiD Threadstarter
Hält's aus hier
Beiträge: 9

Win 7
Visual C# 2008
BeitragVerfasst: Do 14.01.10 15:46 
Nun mir persönlich wäre das ziemlich egal solange das Programm korrekt und zuverlässig läuft :)
Wir haben nur in der Aufgabenstellung die Signatur der Methode vorgegeben gekriegt - eben nur diesem einen Parameter.
FLuiD Threadstarter
Hält's aus hier
Beiträge: 9

Win 7
Visual C# 2008
BeitragVerfasst: Do 14.01.10 15:56 
Danke für den Tip.
Der Vollständigkeit halber hier meine Lösung - vielleicht nicht die eleganteste, aber die Aufgabenstellung war ja mit vorgegebener Rekursion und Funktionssignatur in diesem Kontext alles andere als sinnvoll :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
class Program
    {
        static int x = 0;
        static String palindrom = "";

        static void Main(string[] args)
        {
            String wort, palindrom = "";
            Console.Write("Gib ein Wort ein, dessen Palindrom erstellt werden soll: ");
            wort = Console.ReadLine();
            x = wort.Length;

            palindrom = umdrehenRek(wort);
            Console.WriteLine("Das Palindrom hiervon ist : " + palindrom);

        }

        static string umdrehenRek(string wort)
        {
            
            while (x > 0)
            {
                palindrom += wort[x-1];
                x--;

                umdrehenRek(wort);
            }
            return palindrom;
        }  
    }
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 14.01.10 16:57 
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
@JüTho: Siehst du, deshalb sind solche Aufgaben Lehrreich ;)

Stimmt, aber trotz der ganzen Quelltexte verstehe ich immer noch nicht, wie daraus rekursiv ein Palindrom gebastelt wird. Vielleicht bin ich zu primitiv gestrickt, dass ich mir nur die einfachen Lösungen (vom Anfang der Diskussion) vorstellen kann.

user profile iconFLuiD hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich eigentlich ein SourceCode als csharp code klassifizieren und anfänglich schließen? in der hilfe habe ich da nur etwas über den SourceCode für Delphi gefunden.

Über dem Editor-Fenster gibt es "Bereiche". Dort ist eine ComboBox zur Auswahl der Sprache; dort kann C# ausgewählt und mit dem Plus-Button zugewiesen werden. Danach siehst du, dass es auch mit einem einfachen [ cs]...[/cs](ohne Leerzeichen) manuell möglich ist.

Gruß Jürgen
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 14.01.10 21:25 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
@JüTho: Siehst du, deshalb sind solche Aufgaben Lehrreich ;)

Stimmt, aber trotz der ganzen Quelltexte verstehe ich immer noch nicht, wie daraus rekursiv ein Palindrom gebastelt wird.
Hilft dir die Info, dass die Schleife unnötig ist ;) ?
Konkret wird nur folgender Quelltext ausgeführt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
            x = wort.Length;

            palindrom = umdrehenRek(wort);

...

        static string umdrehenRek(string wort)
        {
            
            if (x > 0)
            {
                palindrom += wort[x-1];
                x--;

                umdrehenRek(wort);
            }
            return palindrom;
        }  
    }
Das ist nur eine unschöne[*] Variante von
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
static string umdrehenRek(string wort)
{
  return umdrehenRek(wort, wort.Length);
}

static string umdrehenRek(string wort, int x)
{      
  if (x > 0)
    return wort[x-1] + umdrehenRek(wort, x-1);
  else

    return "";
}

Was wiederum die rekursive Variante von
ausblenden C#-Quelltext
1:
2:
for (int x = wort.Length - 1; x >= 0; x--)
  wort += wort[x];
ist.

[*]Rekursive Funktionen sollten nun einmal möglichst funktional sein.

_________________
>λ=