Autor |
Beitrag |
FLuiD
Hält's aus hier
Beiträge: 9
Win 7
Visual C# 2008
|
Verfasst: 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
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Do 14.01.10 12:14
Hallo und herzlich  ,
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
      
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
|
Verfasst: Do 14.01.10 12:56
Hallo und ebenfalls
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):
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?
danielf hat folgendes geschrieben : | 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 
Hält's aus hier
Beiträge: 9
Win 7
Visual C# 2008
|
Verfasst: 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...
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--;
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  ich glaub meine Programmierfähigkeiten haben sich seit dem wechsel zu c# ganz ganz stark rückentwickelt
Viele Grüße
Moderiert von Christian S.: Code- durch C#-Tags ersetzt
|
|
JüTho
      
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
|
Verfasst: 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:
C#-Quelltext
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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Do 14.01.10 13:40
@Jürgen Mein Fehler mit dem String.Reverse, da bin ich über meine eigene Funktion gestoplert:
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 
Hält's aus hier
Beiträge: 9
Win 7
Visual C# 2008
|
Verfasst: Do 14.01.10 15:17
So ich hab das jetzt mal weiter bearbeitet, bis der Compiler keine Fehler mehr anzeigt.
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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Do 14.01.10 15:19
Was willst du den mit Zeile 22 bezwecken? Ist das wegen der Rekursion ?
Nochmal nachdenken bitte ...
|
|
FLuiD 
Hält's aus hier
Beiträge: 9
Win 7
Visual C# 2008
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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 
Hält's aus hier
Beiträge: 9
Win 7
Visual C# 2008
|
Verfasst: 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 
Hält's aus hier
Beiträge: 9
Win 7
Visual C# 2008
|
Verfasst: 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 :
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
      
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
|
Verfasst: Do 14.01.10 16:57
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 14.01.10 21:25
JüTho hat folgendes geschrieben : | danielf hat folgendes geschrieben : | @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:
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
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
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.
_________________ >λ=
|
|