Autor |
Beitrag |
ridderle
      
Beiträge: 33
|
Verfasst: Do 08.05.08 14:45
Guten tag,
ich brauche eine Idee, wie ich von einem Text, den ich einlese, einzelne Buchstaben löschen kann, die ich vorher bestimmen kann.
Also zB..
eingelesener_Text: Hello World
löschen_Buchstaben: l
-> dann kommt raus: Heo Word
Gibt es da einen speziellen Befehl?
Oder kann man das auch durch eine Schleife lösen?
Ein String ist ja eig ein Array, ein Array aus verschiedenen Chars, oder?
Wäre nett, wenn mir jmd helfen könnte.
MfG
|
|
arj
      
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: Do 08.05.08 14:50
Tipp:
C#-Quelltext
> Oder kann man das auch durch eine Schleife lösen?
Ja könnte man auch. Aber mit dem Befehl oben gehts wahrscheinlich schöner.
> Ein String ist ja eig ein Array, ein Array aus verschiedenen Chars, oder?
Das war früher einmal so. Mittlerweile stimmt das im Prinzip auch noch,
in C# ist es allerdings so, dass ein String und ein Char-Array verschiedene Objekte sind.
Es gibt aber immer noch ein String.ToCharArray.
|
|
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 08.05.08 15:09
Ergänzend zu Roberts Erläuterungen gilt außerdem: Ein Array hat (grundsätzlich) eine unveränderliche Größe! Etwas wie CharArray.Remove(7) zum Löschen des Zeichens an Position 7 gibt es nicht. Wenn man so etwas braucht, muss man über Alternativen nachdenken. Für Änderungen eines Strings gibt es den StringBuilder, als Ersatz für Arrays ist List<> fast immer besser.
Jürgen
|
|
ridderle 
      
Beiträge: 33
|
Verfasst: Do 08.05.08 18:54
|
|
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 08.05.08 19:18
|
|
ridderle 
      
Beiträge: 33
|
Verfasst: So 11.05.08 16:57
also irgendwie geht das programm nicht bei mir....
sicher, dass der quellcode stimmt?
|
|
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: So 11.05.08 18:23
ridderle hat folgendes geschrieben: | also irgendwie geht das programm nicht bei mir.... |
Und was geht nicht? Welche Fehler meldet der Compiler, welche Fehler gibt es zur Laufzeit?
ridderle hat folgendes geschrieben: | sicher, dass der quellcode stimmt? |
Nein, ganz und gar nicht. Ich habe es einfach so aufgeschrieben. Du willst etwas lernen, sollst also die Vorschläge selbst umsetzen, dabei verstehen, was gemacht wird, und Problemstellen selbst untersuchen.
Hilfe bekommst Du von der SDK-Doku, vom Compiler oder aus der Literatur, z.B. OpenBook C#.
Jürgen
|
|
ridderle 
      
Beiträge: 33
|
Verfasst: Mi 14.05.08 10:45
Also hier ist mal mein Quelltext:
habe es in einer Funktion gemacht:
aber das Problem funktioniert noch nicht wirklich :-/
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: 32: 33: 34: 35: 36: 37: 38: 39:
| using System; using System.Collections.Generic; using System.Text;
namespace Hausaufgaben_2 { class Program {
public static string BuchstabenLöschen(string s1, string rausDamit) {
s1 = Console.ReadLine(); int length = s1.Length; rausDamit = String.Empty; for (int no = 0; no < length; no++) { if (s1[no] != 'l') rausDamit += s1[no]; }
return s1; }
static void Main(string[] args) { Console.WriteLine("Buchstaben löschen"); Console.WriteLine("Geben Sie einen Satz ein"); string s1 = Console.ReadLine();
Console.WriteLine("Welche Wörter möchten Sie löschen?"); string s2 = Console.ReadLine();
BuchstabenLöschen(s1, s2);
Console.ReadKey(); } } } |
|
|
arj
      
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: Mi 14.05.08 11:38
Also zum einen hast du oben von Buchstaben löschen gesprochen.
Im aktuellen Quelltext willst du jetzt aber Wörter löschen! (das ist doch bisschen was anderes).
Wieso nimmst du nicht einfach das String.Replace das ich genannt habe, damit würde sogar beides funktionieren.
Der Grund warum bei dir der Quelltext nicht funktioniert ist der folgende:
Du testest in Zeile 18 immer auf 'l', es werden also nur ls rausgeschmissen und
nicht das was du der Funtion als Parameter übergibst.
Zum anderen übergibst du der Funktion den Parameter s1, in der Text steht aus dem gelöscht werden soll.
Jetzt machst du aber nochmals ein ReadLine von der Konsole und ließt erneut ein?!?
Außerdem belegst du mehrere Variablen mit unterschiedlichen Funktionen (rausdamit, s1).
Versuchs dochmal so (ungetestet!):
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: 32: 33: 34: 35: 36: 37:
| using System; using System.Collections.Generic; using System.Text;
namespace Hausaufgaben_2 { class Program {
public static string BuchstabenLöschen(string s1, char rausDamit) { int length = s1.Length; string result = String.Empty; for (int no = 0; no < length; no++) { if (s1[no] != rausDamit) result += s1[no]; }
return result; }
static void Main(string[] args) { Console.WriteLine("Buchstaben löschen"); Console.WriteLine("Geben Sie einen Satz ein"); string s1 = Console.ReadLine();
Console.WriteLine("Welchen Buchstaben möchten Sie löschen?"); string s2 = Console.ReadLine();
Console.WriteLine(BuchstabenLöschen(s1, s2));
Console.ReadKey(); } } } |
viel kürzer und einfacher wäre jedoch:
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:
| using System; using System.Collections.Generic; using System.Text;
namespace Hausaufgaben_2 { class Program {
static void Main(string[] args) { Console.WriteLine("Buchstaben löschen"); Console.WriteLine("Geben Sie einen Satz ein"); string s1 = Console.ReadLine();
Console.WriteLine("Welchen Buchstaben möchten Sie löschen?"); string s2 = Console.ReadLine();
Console.WriteLine(s1.Replace(s2));
Console.ReadKey(); } } } |
|
|
ridderle 
      
Beiträge: 33
|
Verfasst: Mi 14.05.08 11:44
ne, ich möchte buchstaben aus wörter löschen 
|
|
ridderle 
      
Beiträge: 33
|
Verfasst: Mi 14.05.08 12:37
ne, ich möchte buchstaben aus wörter löschen
C#-Quelltext 1:
| if (s1[no] != rausDamit) |
das geht doch nicht, oder ? also der operator bei strings und chars ?
|
|
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: Mi 14.05.08 13:40
Du solltest Dir klar werden, was Du willst, und das dann umsetzen.
Wenn Du schreibst "ich möchte buchstaben aus wörter löschen", dann passt die Methode BuchstabenLöschen nicht, wenn sie als rausDamit einen String erwartet. Buchstabe entspricht Char! Bei C# musst Du genau auf die Typen achten; deshalb klappt der Vergleich natürlich nicht. Andererseits gibt es auch String.IndexOf() und Alternativen zum Vergleich von Strings.
Wie wäre es mit Console.ReadKey() statt Console.ReadLine() für die Abfrage eines Zeichens?
In Deinem Code sind mehrere Fallen enthalten, wodurch ich Zweifel bekomme, ob Du wirklich das meinst, was Du versuchst. Beispiel:
C#-Quelltext
Der String rausDamit hat in der Methode einen Startwert, bekommt hier zusätzliche Zeichen angehängt und wird am Ende der Methode ganz vergessen.
Auf weitere Schwachpunkte Deines Vorgehens hat arj hingewiesen.
Du solltest Dein Gesamtkonzept nochmals genau prüfen. Anders als arj beharre ich nicht auf String.Replace(), auch wenn das deutlich einfacher wäre, und lehne die Lösung mit Schleife nicht ab, weil sie zum mehrfachen Verständnis nützlich ist und auch für andere Verfahren geeignet sein kann. Wenn ich aber feststelle, dass Du nicht wirklich mitdenkst, werde ich auch darauf verzichten.
Gruß Jürgen
|
|
arj
      
Beiträge: 378
Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
|
Verfasst: Mi 14.05.08 13:52
s[5] ist ein Char! (siehe auch MSDN, oder IntelliSense)
Es muss allerdings im Quelltext folgendermaßen heißen:
C#-Quelltext 1:
| Console.WriteLine(BuchstabenLöschen(s1, s2[0])); |
anstatt
C#-Quelltext 1:
| Console.WriteLine(BuchstabenLöschen(s1, s2)); |
@JüTho:
Ich beharre nicht auf String.Replace. Prinzipiell find ich auch gut wenn man das selbst mit Schleifen implementiert
um zu verstehen wie sowas abläuft.
Andererseits ist es auch wichtig, dass Rad nicht neu zu erfinden.
Wenn wir alle in größeren Projekten anstatt Funktionalitäten aus der Standardbibliothek zu nutzen alles
selbst implementieren würden, würde das zu extrem komplexen und schwer verständlichen Projekten führen.
KISS
(Aber dass muss ich dir wahscheinlich nicht sagen  )
|
|
ridderle 
      
Beiträge: 33
|
Verfasst: Mi 14.05.08 14:55
naja also das Problem ist allerdings, dass ich bei dieser Aufgabe den Methodenkopf vorgegeben habe,
und der ist eben
public static string BuchstabenLöschen(string text, string BuchstabenLöschen)
Dass ich einen char nehmen kann, ich mir natürlich auch klar, aber ein String geht ja auch...
Ich möchte ja nicht nur einen einzelnen Buchstaben rauswerfen, sondern es können ja auch mehrere sein.
Wie gesagt ich möchte es lieber über eine Schleife lösen, um es wie mein Vorredner gesagt hat zu verstehen.
Aber wie das nun genau geht, steht mir noch in den Sternen....
Ich muss ja praktisch eine Schleife machen, die eine Abfrage hat, ob der zu löschende Buchstabe in meinem vorher eingegebenen Wort / Satz ist, wenn ja, dann wird er gelöscht.
Mir fehlen leider nur die Kenntnisse wie ich Buchstabe für Buchstabe abfrage....
Zuletzt bearbeitet von ridderle am Mi 21.05.08 14:32, insgesamt 1-mal bearbeitet
|
|
qwertzqwertyqwertzqwerty
      
Beiträge: 21
Win XP
C# VS 2008
|
Verfasst: Mi 14.05.08 21:09
|
|
ridderle 
      
Beiträge: 33
|
Verfasst: Mi 14.05.08 21:48
naja mag ja schön und gut sein....
Aber wir haben bisher noch nie solche Sachen durchgenommen:
StringSplitOptions.RemoveEmptyEntries)
und so...
Das ganze sollte durch eine Schleife doch auch machbar sein, ohne solche vorinstallierte Funktionen zu verwenden?!
|
|
ridderle 
      
Beiträge: 33
|
Verfasst: Mi 21.05.08 14:31
ridderle hat folgendes geschrieben: | naja also das Problem ist allerdings, dass ich bei dieser Aufgabe den Methodenkopf vorgegeben habe,
und der ist eben
public static string BuchstabenLöschen(string text, string BuchstabenLöschen)
Dass ich einen char nehmen kann, ich mir natürlich auch klar, aber ein String geht ja auch...
Ich möchte ja nicht nur einen einzelnen Buchstaben rauswerfen, sondern es können ja auch mehrere sein.
Wie gesagt ich möchte es lieber über eine Schleife lösen, um es wie mein Vorredner gesagt hat zu verstehen.
Aber wie das nun genau geht, steht mir noch in den Sternen....
Ich muss ja praktisch eine Schleife machen, die eine Abfrage hat, ob der zu löschende Buchstabe in meinem vorher eingegebenen Wort / Satz ist, wenn ja, dann wird er gelöscht.
Mir fehlen leider nur die Kenntnisse wie ich Buchstabe für Buchstabe abfrage.... |
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 21.05.08 14:34
Welche eigenen Ansätze hast Du denn bisher verfolgt? Bzw. wie weit bist Du? Du wirst in der einen Woche ja sicherlich auch selber noch an dem Problem gearbeitet haben, denn einige Ansätze die Du selber weiterverfolgen kannst, wurden Dir ja hier im Thread gegeben.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
ridderle 
      
Beiträge: 33
|
Verfasst: Do 22.05.08 17:50
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| string[] abc = { rausDamit }; string[] def = s1.Split(abc, StringSplitOptions.RemoveEmptyEntries); string endergebnis = ""; int i = 0; for (int z = 0; z < 1; ) { try { endergebnis += def[i]; i = i + 1; } catch (IndexOutOfRangeException) { z = 2; } } Console.Writeline(endergebnis); |
Bei dem hier geht es nun zwar.... aber er löscht dann komplett alle Buchstaben, die nach dem Buchstaben, der raus gelöscht werden soll, das sollte natürlich auch nicht sein, also es soll nur der Buchstabe gelöscht werden, der auch eingetippt wird, nicht der rest dahinter auch...
Wie ist das lösbar ?
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 22.05.08 18:41
Guck Dir nochmal ganz scharf Deine Schleife an und überlege, welche Variable als Zählvariable Sinn macht 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
|