Autor Beitrag
Geniuzz
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 14.09.07 09:28 
Moin,

ich soll ein kleines Programm schreiben, dass vom gesamten Jahr 2007 jeden ersten Dienstag im Monat heraus findet!
Über ein paar Infos, wie ich überhaupt anfangen kann wäre ich sehr froh.
Also irgendwie mit DateTime und schleifen..? oder


Greez
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: Fr 14.09.07 10:08 
Schleifen hast Du richtig erkannt. Fang doch erst einmal mit Pseudo-Code an, der die Aufgabenstellung einfach strukturiert übersetzt:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
für jeden Monat von ... bis
  prüfe die ersten Tage von ... bis
    handelt es sich um einen Dienstag?
    ja => in Zwischenspeicher eintragen, 
          dann Abbruch in diesem Monat, weiter mit dem nächsten Monat
    nein => nächsten Tag prüfen
  Ende
Ende
//  Ausgabe des Zwischenspeichers
für jeden Monat von ... bis
  Schreibe eine Zeile mit dem Inhalt des Zwischenspeichers

Damit merkst Du außerdem: der Zwischenspeicher, der benötigt wird, muss am Anfang erstellt werden. Wichtige Überlegung dabei: in welchem Bereich "Tage von/bis" liegt wohl der erste Sonntag/Montag/Dienstag usw.?

Optimierung: Wenn Du weißt, welcher Wochentag der Monatserste ist, kannst Du einfach ausrechnen, welches der erste Dienstag ist. Das erspart 6/7 aller Prüfungen.

DateTime hast Du richtig erkannt. Schau selbst in die SDK-Doku: zum einen musst Du Dir einen (für Deinen Zweck!) passenden Konstruktor aussuchen; außerdem musst Du nachschauen, welche Methode Dir den Wochentag liefert.

Viel Erfolg! Jürgen

PS. Natürlich gibt es andere Möglichkeiten. Mir ging es vor allem darum zu zeigen, wie Du aus Deiner Aufgabenstellung möglichst direkt zu Code kommst.
Geniuzz Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 14.09.07 16:08 
Danke,

ich habe es hinbekommen... :)

Hier nun der Code:

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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
using System;
using System.Collections.Generic;
using System.Text;

namespace DateTimeTester
{
    class Program
    {

        static void Main(string[] args)
        {
            string[] myArr = new string[20];

            Console.Write("Geben Sie das Startdatum ");
            Console.Write("im Format tt.mm.jjjj ein:  ");
            string strDate = Convert.ToString(Console.ReadLine());
            strDate = strDate.Replace('.''/');
            DateTime newDate = Convert.ToDateTime(strDate);


            Console.Write("Geben Sie das Enddatum ");
            Console.Write("im Format tt.mm.jjjj ein:  ");
            string endDate = Convert.ToString(Console.ReadLine());
            endDate = endDate.Replace('.''/');
            DateTime lastDate = Convert.ToDateTime(endDate);

            int start = newDate.Month;
            int ende = lastDate.Month;

            for (int Monate = start; Monate < ende; Monate++)
            {
                int x = DateTime.DaysInMonth(newDate.Year, Monate);

                for (int y = 1; y <= x; y++)
                {
                    DateTime g = new DateTime(newDate.Year, Monate, y);
                    if (g.DayOfWeek.ToString() == "Tuesday")
                    {
                        myArr[Monate] = g.ToLongDateString();
                    }
                }
                
            }
            foreach (string tag in myArr)
            {
                Console.ForegroundColor = ConsoleColor.Blue;
                Console.WriteLine(tag);
            }
            Console.ReadLine();
        }
    }
}



MfG

und vielen dank

Moderiert von user profile iconUGrohne: Quote- 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: Fr 14.09.07 17:14 
Hallo,

nach meiner Einschätzung (keine genaue Prüfung, nur Lesen) enthält Dein Code einen gravierenden Fehler (der einen meiner Vorschläge missachtet) und mehrere Punkte, die (teilweise stark) verbessert werden können. Bitte lass mich/uns wissen, wofür und wie lange Du Dich mit C# befassen willst/musst, d.h. ob es Sinn macht, Dir "zukunftsweisende" Tipps zu geben.

Gruß Jürgen
Geniuzz Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 17.09.07 17:41 
Hallo,

ja ich mache seit dem 01.08 eine Ausbildung zum Fachinformatiker/Anwendungsentwicklung, wir Arbeiten mir c#...
Es wäre klasse wenn irh mir zukunftsweisende Tipps geben könntet!

Vielen Dank
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 17.09.07 19:25 
Hallo,

bitte ändere den Titel des Topics, da er wenig über das eigentlich Thema verrät. Hier der entsprechende Absatz aus den Richtlinien:

1.2 Beiträge:
Bitte formuliere den Betreff Deiner Beiträge so, dass andere Mitglieder anhand dieser bereits das eigentliche Thema festmachen können. Beiträge wie etwa "Eine Anfängerfrage" oder "Weiß jemand, wie das geht?" lassen den Leser im Unklaren darüber, was das Thema der Diskussion ist.[...]


Einfach oben bei Deinem ersten Beitrag auf user defined image oder user defined image klicken und den Titel ändern. Danke Dir!

Viele Grüße,
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
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: Mo 17.09.07 21:11 
OK, dann fange ich einmal an.

Ich hatte gehofft, dass Du den gravierenden Fehler selbst suchst und findest, aber bitte:
user profile iconGeniuzz 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:
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:
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;
//  für die Aufgabenstellung wäre start=1 / ende=12 ausreichend,
//  aber das ist eine sinnvolle Erweiterung und Verallgemeinerung;
for (int month = start; month < ende; month++)   {
    //  auf meine Idee zur Optimierung als Ersatz für die folgende
    //  Schleife verzichte ich jetzt
    for (int y = 1; y <= 7; y++)       {
        //  hier hast Du die Verallgemeinerung nicht beachtet; du setzt
        //  voraus, dass das Jahr einheitlich bleibt
        currentDate = new DateTime(newDate.Year, month, y);
        if (currentDate.DayOfWeek == DayOfWeek.Tuesday)   {
            myArr.Add(currentDate);
            //  ein weiteres Datum kann es in der inneren Schleife nicht mehr geben
            break;
        }
    }
}                
//  Ausgabe
Console.ForegroundColor = ConsoleColor.Blue;
foreach(DateTime day in myArr)   {
    //  hier spielt das Ausgabeformat eine Rolle
    Console.WriteLine(day.ToLongDateString());
}
//  anstelle von Enter genügt die Eingabe eines Zeichens
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