OK, dann fange ich einmal an.
Ich hatte gehofft, dass Du den
gravierenden Fehler selbst suchst und findest, aber bitte:
Geniuzz hat folgendes geschrieben: |
ich soll ein kleines Programm schreiben, dass vom gesamten Jahr 2007 jeden ersten Dienstag im Monat heraus findet! |
Nach dieser Aufstellung sollte klar sein, dass Du für jeden Monat genau ein Datum suchst; dieses muss innerhalb der ersten 7 Tage liegen (DaysInMonth ist also überflüssig, sondern der Schlusswert der zweiten Schleife lautet 7); insgesamt gibt es also
12 Ergebnisse. Es gibt keinen Grund, das Array ausgerechnet auf 20 Werte auszurichten.
Grundsätzliche Empfehlung: Gehe in die
SDK-Doku und suche nach passenden Stichworten. Für jede Eigenschaft, Methode oder Ereignis werden die Parameter und Datentypen aufgeführt. Beispielsweise liefert
Console.ReadLine() einen String zurück; ein zusätzliches Convert.ToString ist also überflüssig.
Benutze immer den
passenden Datentyp und vermeide unnötige Konvertierungen. Konkret: Ausgabe-Array für DateTime, newDate und lastDate (hast Du schon richtig vorgesehen, nur die Namen sind nicht einheitlich), DayOfWeek als Enum-Member vergleichen (nicht als String).
Was innerhalb einer
Schleife mehrfach zugewiesen wird, kann bereits außerhalb deklariert werden - hier "int x" und Console.ForegroundColor. (Dann braucht NET nur eine Initialisierung insgesamt statt eine in jedem Durchlauf; das spart bei int natürlich nicht nennenswert.)
Arrays und Listen: Du hast ja selbst schon gemerkt, dass Arrays wegen der festen Größe unpraktisch sind. Unter NET 1.1 steht für variable Arrays die
ArrayList-Klasse zur Verfügung. Unter NET 2.0 sind meistens generische Listen
List<T> zu empfehlen.
Für
Konvertierungen, die auch "schief" gehen können, sind - soweit vorhanden - Methoden mit
TryParse/Parse/ParseExact vorzuziehen, andernfalls try-catch-Konstruktionen.
Dein
Versuch mit String.Replace führt sehr oft nicht weiter, weil Du dann bestimmte Schreibweisen in die Prüfung aufnehmen musst. Andererseits schreibst Du bereits bei der Eingabe die deutsche Art vor, kannst das also auch beim Convert voraussetzen. Für die Konvertierung String => DateTime gibt es übrigens auch die
XmlConvert.ToDateTime-Methode(String, String), bei der das Format genau angegeben werden kann.
Grundsätzlich sind
englischsprachige Bezeichner zu empfehlen. Ich bin zwar auch ein Befürworter der eigenen Sprache; aber deutsche Bezeichner führen sehr schnell zu einem grausamen Mischmasch. Also doch lieber konsequent Englisch nutzen!
Damit ergibt sich etwa folgende Version:
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: 40:
| List<DateTime> myArr = new List<DateTime>();
Console.Write("Geben Sie das Startdatum "); Console.Write("im Format tt.mm.jjjj ein: "); string strDate = Console.ReadLine(); IFormatProvider culture = new CultureInfo("de-DE"); DateTime firstDate = DateTime.ParseExact(strDate, "d", culture);
Console.Write("Geben Sie das Enddatum "); Console.Write("im Format tt.mm.jjjj ein: "); string endDate = Console.ReadLine(); DateTime lastDate = DateTime.ParseExact(endDate, "d", culture);
int start = firstDate.Month; int end = lastDate.Month; DateTime currentDate; for (int month = start; month < ende; month++) { for (int y = 1; y <= 7; y++) { currentDate = new DateTime(newDate.Year, month, y); if (currentDate.DayOfWeek == DayOfWeek.Tuesday) { myArr.Add(currentDate); break; } } } Console.ForegroundColor = ConsoleColor.Blue; foreach(DateTime day in myArr) { Console.WriteLine(day.ToLongDateString()); } Console.ReadKey(); |
Wenn Dir etwas unklar ist: zuerst nachlesen in
OpenBook C# und
OpenBook Visual C# sowie in der SDK-Doku, dann nachfragen.
Gruß und viel Erfolg! Jürgen