[C/C++] [Problem] C# Datum auf mehrere arten einlesen und ausgeben

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von pneum0re, 24. Januar 2008 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 24. Januar 2008
    [Problem] C# Datum auf mehrere arten einlesen und ausgeben

    Hab für die Schule ein Programm schreiben müssen das noch kleine Mäkel aufweist, aber grundsätzlich einwandfrei funktioniert.
    Gleich am Anfang, fragt mich bitte nicht wieso ich z.B.: keine arrays verwende etc. -> wir dürfen genau die befehle verwenden die im code vorhanden sind

    Mein Problem ist eigentlich dass, das ich nicht genau weiß wie ich am besten in einer if verschachtelung prüfe ob eine jahreszahl ein schaltjahr ist. ich zeig euch einfach mal den code^^

    Code:
    //***********************************************
    //Autor: **********
    //Datum: 22.Jänner.2008
    //Klasse: 1AHDV
    //***********************************************
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Schaltjahr
    {
     class Schaltjahr
     {
     static void Main(string[] args)
     {
     new Schaltjahr();
     }
     public Schaltjahr()
     {
     Int32 Monat, Tag, Auswahl, TagAusgabe, Neustart, JahresTag;
     Int64 Jahr;
     bool MenueGueltig, SchaltJahr, ProgNeustart, GueltigesDatum;
    
     Jahr = 0;
     Monat = 0;
     Tag = 0;
     Neustart = 0;
     SchaltJahr = false;
     Auswahl = 0;
     MenueGueltig = false;
     TagAusgabe = 0;
     ProgNeustart = false;
     GueltigesDatum = false;
     JahresTag = 0;
     while (!ProgNeustart)
     {
     //Liest das eingegebene Datum ein
     Console.Write("Geben Sie das Jahr ein: ");
     if (Int64.TryParse(Console.ReadLine(), out Jahr))
     {
     Console.Write("Geben Sie das Monat ein: ");
     if (Int32.TryParse(Console.ReadLine(), out Monat))
     {
     Console.Write("Geben Sie den Tag ein: ");
     if (Int32.TryParse(Console.ReadLine(), out Tag))
     {
     //Ruft das Menü auf. Man kann nur fortfahren falls man eine gültige Auswahl zwischen 1-4 getroffen hat
     while (!MenueGueltig)
     {
     Auswahl = Menue();
     if (Auswahl > 0 && Auswahl < 5)
     {
     MenueGueltig = true;
     }
     }
     // Hier wird je nach Auswahl im Menü die Funktion aufgerufen
     switch (Auswahl)
     {
     case 1:
     SchaltJahr = SchaltjahrPruefen(Jahr);
     if (SchaltJahr)
     {
     Console.WriteLine("\nDas angegebene Jahr ist ein Schaltjahr.");
     }
     else
     {
     Console.WriteLine("\nDas angegebene Jahr ist kein Schaltjahr.");
     }
     break;
     case 2:
     GueltigesDatum = DatumPruefen(Monat, Tag, Jahr);
     if (GueltigesDatum)
     {
     Console.WriteLine("\nDas Datum ist gültig.");
     }
     else
     {
     Console.WriteLine("\nDas Datum ist nicht gültig.");
     }
     break;
     case 3:
     TagAusgabe = TageImMonat(Monat, Jahr);
     Console.WriteLine("\nDer Monat hat {0} Tage.", TagAusgabe);
     break;
     case 4:
     JahresTag = TageImJahr(Jahr, Monat, Tag);
     Console.WriteLine("\nEs ist der {0}. Tag im Jahr.", JahresTag);
     break;
     default:
     break;
     }
     }
     //Sind die Else Zweige beim einlesen des Datums.
     else
     {
     Console.WriteLine("\nSie müssen eine TagesZAHL eingeben!");
     }
     }
     else
     {
     Console.WriteLine("\nSie müssen eine MonatsZAHL eingeben!");
     }
     }
     else
     {
     Console.WriteLine("\nSie müssen eine JahresZAHL eingeben!");
     }
     //Fragt ob das Programm neugestartet werden soll
     Console.WriteLine("\nUm das Programm zu beenden geben Sie 5 ein.");
     Console.Write("Ansonsten bitte 1: ");
     if (Int32.TryParse(Console.ReadLine(), out Neustart))
     {
     if (Neustart == 5)
     {
     ProgNeustart = true;
     }
     }
     //Bei ungültiger Eingabe wird einfach neugestartet
     else
     {
     Console.WriteLine("\nDas Programm wird neugestartet.");
     }
     }
     }
     Int32 Menue()
     {
     //Zeigt das Menü an und nimmt die Auswahl auf
     Int32 Auswahl;
    
     Console.WriteLine("\n1. Überprüfen ob das Jahr ein Schaltjahr ist.");
     Console.WriteLine("2. Überprüfen ob das Jahr, Monat und Tag ein gültiges Datum sind.");
     Console.WriteLine("3. Anzeigen wieviele Tage der Monat hat.");
     Console.WriteLine("4. Anzeigen welcher Tag des Jahres das angegebene Datum ist.");
     Console.Write("\nGeben Sie ihre Auswahl an: ");
     if (!Int32.TryParse(Console.ReadLine(), out Auswahl))
     {
     Console.WriteLine("\nSie müssen eine ZAHL eingeben!");
     }
     return Auswahl;
     }
     [COLOR="Red"]Boolean SchaltjahrPruefen(Int64 Jahr)
     {
     //Prüft ob das Jahr ein Schaltjahr ist.
     Int64 HilfsJahr;
     bool SchaltJahr;
    
     HilfsJahr = 0;
     HilfsJahr = Jahr % 400;
     if (HilfsJahr == 0)
     {
     SchaltJahr = true;
     }
     else
     {
     HilfsJahr = Jahr % 4;
     if (HilfsJahr == 0)
     {
     SchaltJahr = true;
     }
     else
     {
     SchaltJahr = false;
     }
     }
     return SchaltJahr;
     }[/COLOR]
     Int32 TageImMonat(Int32 Monat, Int64 Jahr)
     {
     //Übergibt wieviele Tage das Monat hat.
     Int32 Tage;
     bool SchaltJahr;
    
     Tage = 0;
     SchaltJahr = SchaltjahrPruefen(Jahr);
     switch (Monat)
     {
     case 1:
     case 3:
     case 5:
     case 7:
     case 9:
     case 11:
     Tage = 30;
     break;
     }
     switch (Monat)
     {
     case 2:
     if (SchaltJahr)
     {
     Tage = 29;
     }
     else
     {
     Tage = 28;
     }
     break;
     case 4:
     case 6:
     case 8:
     case 10:
     case 12:
     Tage = 31;
     break;
     }
     return Tage;
     }
     Boolean DatumPruefen(Int32 Monat, Int32 Tag, Int64 Jahr)
     {
     //Prüft ob das eingegebene Datum auch gültig ist.
     Int32 TagImMonat;
     bool Gueltig;
    
     Gueltig = false;
     if (Jahr > 1600)
     {
     if (Monat > 0 && Monat < 13)
     {
     TagImMonat = TageImMonat(Monat, Jahr);
     if (Tag > 0 && Tag <= TagImMonat)
     {
     Gueltig = true;
     }
     }
     }
     else
     {
     Gueltig = false;
     }
     return Gueltig;
     }
     [COLOR="Red"]Int32 TageImJahr(Int64 Jahr, Int32 Monat, Int32 Tag)
     {
     //Berechnet welcher Tag im Jahr ist.
     Int32 TagImJahr, MonatsTage, HilfsMonat;
    
     TagImJahr = 1;
     HilfsMonat = Monat;
     Monat--;
     while (Monat != 0)
     {
     MonatsTage = TageImMonat(HilfsMonat, Jahr);
     TagImJahr = TagImJahr + MonatsTage;
     Monat--;
     HilfsMonat--;
     }
     TagImJahr = Tag + TagImJahr;
     return TagImJahr;
     }[/COLOR]
     }
    }
    
    Der erste rote Teil ist eben das Schaltjahr.
    Regeln der Angabe: Alle Jahre, die durch 4 teilbar sind Schaltjahre. Jahrhunderte sind aber nur dann Schaltjahre, wenn sie durch 400 teilbar sind.

    Ich rechne zuerst das Jahr modulo durch 400. Wenn 0 rest rauskommt ist es ein schaltjahr.^^ im else if (welches gar keines ist sehe ich gerade ^^) rechne ich das jahr durch 4 und wenn wieder 0 rest rauskommt ist es wieder ein schaltjahr. wenn nicht dann ist es kein schaltjahr^^

    so hier ist das problem -> alles funktioniert wunderbar bis zu z.B.: jahrhundert wie 1700. das ist zwar nicht durch 400 teilbar dafür aber durch 4 und wird somit als schaltjahr angegeben obwohl es keines ist^^

    das 2te rot markierte ist nicht wirklich ein fehler sondern eher umständlich programmiert von meiner seite her denke ich^^ wenn ihr nicht schlau daraus werdet ist es nicht so schlimm

    seid bitte nicht zu streng mit mir ich lern c# erst seit einem halben jahr
    und danke für das lesen des ganzen texts^^
     
  2. 24. Januar 2008
    AW: [Problem] C# Datum auf mehrere arten einlesen und ausgeben

    Also das sagt Wikipedia als Beispielcode zur Schaltjahresberechnung:

    Code:
    bool istSchaltjahr = ((jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0);
    
    Schaltjahr – Wikipedia

    MfG
    Bernie
     
  3. 24. Januar 2008
    AW: [Problem] C# Datum auf mehrere arten einlesen und ausgeben

    danke für die schnelle antwort natürlich bw
    dann kann ich ja closen
    ty =)
     
  4. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.