Autor Beitrag
acer5672
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Fr 16.11.07 17:10 
Hi,

ich habe eine Aufgabe aufbekommen, aber ich versteh die Struktur der Aufgabe nich, besser gesagt den Sinn bzw. die Logik.
Könnte jemand die Aufgabe so fomulieren das ich auch anfangen kann zu programmieren?
Link zur Aufgabe: img123.imageshack.us...?image=img004xo9.jpg


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Fr 16.11.2007 um 16:12
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 16.11.07 17:16 
Hallo und :welcome:!

Ihre Mission - sollten Sie sie annehmen - ist folgende:

Schreibe ein Programm, welches berechnet wieviele Tage zwischen dem 1.Januar eines Jahres und einem beliebigen anderen Datum im selben Jahr liegen. Also z.B. gibt der Nutzer den 8.5.308 ein und Dein Programm berechnet, wieviel Tage zwischen dem 1.1.308 und dem 8.5.308 liegen. Dabei musst Du aufpassen, weil in manchen Jahren der Februar 29 Tage hat. Die Regel steht ja in der Aufgabenstellung.

Diese Nachricht zerstört sich nicht in 5 Sekunden selbst. ;-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: storestore
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 16.11.07 17:16 
Den Sinn der Aufgabe unter C# verstehe ich auch nicht; dazu gibt es schließlich DateTime.DayOfYear :D

Ich vermute deshalb, Du sollst eine solche Funktionalität selbst entwickeln: Eingabe eines Datums mit Tag, Monat, Jahr; Schleife über alle vollständigen Monate; Anzahl der Tage innerhalb eines einzelnen Monats (28 oder 29 im Schaltjahr, 30, 31), Anzahl der restlichen Tage.

Ist sonst noch etwas unklar? Jürgen
acer5672 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Fr 16.11.07 17:36 
Danke für eure schnellen Antworten ich versuche das Programm zu schreiben und leg ihn zur Kontrolle hier rein
acer5672 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Fr 16.11.07 18:32 
Ich versuche Anzufangen aber ich brauch irgendwie einen Gedankenschubs um vorwärts zu kommen .
Bitte um Hilfe,ich weiß nicht wie der die Tage zwischen eingebenem Datum und vorhandem Datum rechnen soll
habe bis jetzt

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
int Jahr, Tag, Monat, Tageszahl, Monatszahl, Jahreszahl;
            Tageszahl = 0;
            Monatszahl = 1;


            Console.Write("Geben Sie ein Jahr ein: ");
            Jahr = Convert.ToInt32(Console.ReadLine());

            Console.Write("Geben Sie ein Tage ein :  ");
            Tag = Convert.ToInt32(Console.ReadLine());

            Console.Write("Geben Sie einen Monat ein: ");
            Monat = Convert.ToInt32(Console.ReadLine());
            Jahreszahl = Jahr;

            Console.WriteLine(Tag + "." + Monat + "." + Jahr);
            Console.ReadLine();


Moderiert von user profile iconChristian S.: Color- durch C#-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 16.11.07 18:55 
Jürgen hat Dir doch schon geschrieben, wie man's macht. Und bisher sieht man in Deinem Quellcode ja noch nichtmal den Versuch die Anzahl selber rauszufinden. :?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
acer5672 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Fr 16.11.07 19:07 
Ich habe es weiter versucht, bitte um Hilfe .

Soviel hab ich schob ;

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:
using System;
using System.Collections.Generic;
using System.Text;

namespace Aufgabe_11
{
    class Program
    {
        static void Main(string[] args)
        {
         

            Console.Write("Geben Sie Tag ein :");
            int tag = Convert.ToInt16(Console.ReadLine());
            Console.Write("Geben Sie Monat ein :");
            int monat = Convert.ToInt16(Console.ReadLine());
            Console.Write("Geben Sie Jahr ein :");
            int Jahr = Convert.ToInt16(Console.ReadLine());
            int SummeTage = 0;
            if (Jahr % 4 == 0)
            {
                    for (int i = 0; i < monat - 1; i++)
                    {
                        SummeTage = SummeTage + i;
                    }
                    SummeTage = SummeTage + tag - 1;
                }
            
            else
            {
                
                
                    for (int i = 0; i < monat - 1; i++)
                    {
                        SummeTage = SummeTage + i;
                    }
                    SummeTage = SummeTage + tag - 1;
                    Console.WriteLine(SummeTage);

                    Console.ReadLine();

                
            }
        }
    }
}


Moderiert von user profile iconChristian S.: "color" durch "cs" ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 16.11.07 19:30 
Für die Zukunft:
(1) Bitte benutze C#-Tags für Deinen Sourcecode
(2) Wenn etwas nicht funktinioniert, dann schreibe auch, was nicht funktioniert. Also welches Ergebnis Du erwartest und was stattdessen kommt

Hier fällt mir auf:

- Wieso addierst Du pro Monat nur einen Tag?
- Ausgabe und der Aufruf von ReadLine erfolgt nur in einem Zweig der if-Anweisung
- Die Berechnung der Tage wird in beiden Zweigen identisch durchgeführt

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Fr 16.11.07 23:15 
Was mir zusätzlich auffällt zu dem was Christian bereits erwähnt hat
Du berechnest das Schaltjahr falsch.
Lies die Anleitung genauer.
acer5672 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Sa 17.11.07 00:29 
Habe es erweitert,ich möchte das er die Tage zwischen dem 1.Januar xxx und dem Datum das der Benutzer eingibt ausgerechnet wird.
Ich hab zwar das Programm angefangen zu schreiben, irgendwie ist da ein Logikfehler.
Bitte um Hilfe!!!


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:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
           double tageszahl = 0;
           double monatszahl = 0;
           Console.Write("Tag: ");
           double Tag = Convert.ToDouble(Console.ReadLine());
           Console.Write("Monat: ");
           double Monat = Convert.ToDouble(Console.ReadLine());
           Console.Write("Jahr: ");
           double Jahr = Convert.ToDouble(Console.ReadLine());

           if (monatszahl < 12)
           {
               monatszahl = monatszahl % 2;

           }

           if (monatszahl == 0 || monatszahl == 0)
           {
               tageszahl = tageszahl + 30;
               monatszahl = monatszahl++;
           }
           else

               tageszahl = tageszahl + 31;
                monatszahl = monatszahl + 1;


                if (Monat > 2)
                {
                    Jahr = Jahr % 4;
                }

                if (Jahr == 0)
                {
                    tageszahl=tageszahl - 1;
                    tageszahl=tageszahl + Tag;
                }
                else
                {
                    tageszahl = tageszahl - 2;
                    tageszahl = tageszahl + Tag;
                }

                Console.WriteLine(tageszahl);
                Console.ReadLine();









          
         
            

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

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 17.11.07 00:40 
user profile iconacer5672 hat folgendes geschrieben:
Ich hab zwar das Programm angefangen zu schreiben, irgendwie ist da ein Logikfehler.
Wie ich weiter oben schrieb: Bitte sage, was nicht funktioniert! Diesmal versuche ich nicht, es zu erraten ....

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
O5IRI5
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 36
Erhaltene Danke: 2

XP/Vista
C# (VS 2005) , eclipse
BeitragVerfasst: Sa 17.11.07 11:23 
Ich persönlich würde dir raten, dass Ganze neu zu überdenken.
Probiere es mit einem neuen Konzept.
Hab mir obigen Code kurz durchgelesen und verstehe deinen Algorithmus nicht.

if (monatszahl < 12)
wolltest du hiermit ausschließen, dass jemand z.b. das "13te Monat" eingibt?
korr: if(monatszahl<=12)


monatszahl = monatszahl++;
identisch
monatszahl = monatszahl + 1;


if (monatszahl == 0 || monatszahl == 0)
hmmm

.
.
.

Wie gesagt, noch mal überdenken.
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Sa 17.11.07 12:06 
ich glaub bei der if( monatsanzahl < 12 ) will er intern ausrechnen ob das monat gerade/ungerade für 30 oder 31 tage ist.
allerdings gibts hier wieder einen Denkfehler.
Juli == 7 == ungerade -> aber trotzdem 31 Tage
Außerdem beachtest du dieses mal überhaupt keine Schaltjahre
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 17.11.07 13:24 
user profile iconO5IRI5 hat folgendes geschrieben:
monatszahl = monatszahl++;
identisch
monatszahl = monatszahl + 1;
Nope, Ersteres ist identisch mit
ausblenden C#-Quelltext
1:
monatszahl = monatszahl;					

also nicht gerade sehr hilfreich ;) . Einfach nur monatszahl++; benutzen.
O5IRI5
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 36
Erhaltene Danke: 2

XP/Vista
C# (VS 2005) , eclipse
BeitragVerfasst: Sa 17.11.07 16:13 
Muss ich dir recht geben.

i++ identisch mit i=i+1;

;)
acer5672 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Sa 17.11.07 16:25 
Hi ich hab endlich einen vernünftigeren logischeren code, bitte gebt eure Meinungen ab:
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:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            int Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember;
            int schaltjahr;
            Januar = 1;
            Februar = 28;
            März = 31;
            April = 30;
            Mai = 31;
            Juni = 30;
            Juli = 31;
            August = 31;
            September = 30;
            Oktober = 31;
            November = 30;
            Dezember = 31;


            int Tag, Monat, Jahr;
            int Jahreszahl = 0;
            Console.Write("Geben Sie bitte eine Tageszahl ein : ");
            Tag = Convert.ToInt16(Console.ReadLine());
            Console.Write("Geben Sie bitte eine Monatszahl ein: ");
            Monat = Convert.ToInt16(Console.ReadLine());
            Console.Write("Geben Sie bitte eine Jahreszahl ein: ");
            Jahr = Convert.ToInt16(Console.ReadLine());

          
            if (Jahr % 4 == 0)
            {
                if (Jahr % 100 != 0)
                {
                    if (Jahr % 400 == 0)
                    {
                        schaltjahr = 1;
                    }
                    else
                        schaltjahr = 0;
                }
                else
                    schaltjahr = 0;
            }
            else
                schaltjahr = 0;

            if (schaltjahr == 1)
                Februar = Februar + 1;

            if (Monat == 1)
                Jahreszahl = Tag- Januar;

            if (Monat == 2)
                Jahreszahl = 30 + Tag;

            if (Monat == 3)
                Jahreszahl = 30 + Februar + Tag;

            if (Monat == 4)
                Jahreszahl = 30 + Februar + März + Tag;

            if (Monat == 5)
                Jahreszahl = 30 + Februar + März + April + Tag;

            if (Monat == 6)
                Jahreszahl = 30 + Februar + März + April + Mai + Tag;

            if (Monat == 7)
                Jahreszahl = 30 + Februar + März + April + Mai + Juni + Tag;

            if (Monat == 8)
                Jahreszahl = 30 + Februar + März + April + Mai + Juni + Juli + Tag;

            if (Monat == 9)
                Jahreszahl = 30 + Februar + März + April + Mai + Juni + Juli + August + Tag;

            if (Monat == 10)
                Jahreszahl = 30 + Februar + März + April + Mai + Juni + Juli + August + September + Tag;

            if (Monat == 11)
                Jahreszahl = 30 + Februar + März + April + Mai + Juni + Juli + August + September + Oktober + Tag;

            if (Monat == 12)
                Jahreszahl = 30 + Februar + März + April + Mai + Juni + Juli + August + September + Oktober + November + Tag;


            Console.WriteLine(Jahreszahl);
        Console.ReadLine();
        }
       
    }
}
O5IRI5
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 36
Erhaltene Danke: 2

XP/Vista
C# (VS 2005) , eclipse
BeitragVerfasst: Sa 17.11.07 17:38 
Deine Schaltjahrabfrage ist falsch.

Schaltjahrabfrage:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if ((Jahr % 4 == 0 && Jahr % 100 != 0) || Jahr % 400 == 0)
            {
                schaltjahr = 1;
            }
            else
            {
                schaltjahr = 0;
            }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
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: Sa 17.11.07 20:19 
Hallo acer5672,

merkst Du nicht, dass Dein Code ziemlich umständlich ist? Deine Abfrage auf den aktuellen Monat wiederholt sich mehrfach. In allen diesen Fällen sind Schleifen vernünftig; deshalb habe ich das ganz am Anfang vorgeschlagen, und Christian hat es bestätigt.

Für die Prüfung, wie viele Tage ein Monat hat, gibt es mehrere Möglichkeiten. Deine ist vermutlich die umständlichste. Ich würde folgende verwenden (mit 13 Elementen, damit die Monatszahl direkt als Index verwendet werden kann):
ausblenden C#-Quelltext
1:
int[] TageProMonat = new int[13] { 031283130 ... 31 };					

Noch besser/einfacher wäre natürlich die Abfrage nach DateTime.DaysInMonth; aber das sollst Du vermutlich auch nicht verwenden.

Also reduziert sich die eigentliche Berechnung auf folgendes Verfahren (damit Du es nicht einfach kopieren kannst, verwende ich Pseudo-Code):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
//  setze die Tage pro Monat fest
int[] TageProMonat = ...
//  prüfe, ob es ein Schaltjahr ist; wichtiger Hinweis: es gibt nur die Auswahl ja/nein,
//  und dafür verwendet man den Datentyp bool/boolean
bool schaltjahr =   // korrekte Festlegung berücksichtigen
//  in einem Schaltjahr ist der Februar zu ändern:
if (schaltjahr)
  TageProMonat[2] = 29;
//  der Tag des Datums ist immer zu übernehmen, kann also als Anfangswert genommen werden:
Jahreszahl = Tag;

//  Schleife:
für(jeden int-Wert von Januar bis zum letzten Vormonat) {
  addiere zur Jahreszahl die Tage des betreffenden Monats
}

Ich hoffe aber, Du prüfst alles nach (dazu gibt es übrigens auch einen Debugger); denn es ist sehr wahrscheinlich, dass ich mich verschreibe.

Statt 12 if-Abfragen mit 1 bis 12 Additionen reduziert sich alles auf eine Schleife mit einer einzigen Addition. Was ist wohl besser?

Gruß Jürgen


Zuletzt bearbeitet von JüTho am Sa 17.11.07 22:10, insgesamt 2-mal bearbeitet
acer5672 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Sa 17.11.07 21:09 
Ich bin ein Anfänger was c# angeht deswegen versteh ich nicht was du meinst außerdem gibt es bei deinem Code Syntax-Fehler
Nur zur Info : Konsolenausgabe ist mein Thema nicht GUI soweit bin ich noch nicht.
Die Mengenangabe für die Variable TageProMonat wird nicht akzeptiert.
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: Sa 17.11.07 22:02 
user profile iconacer5672 hat folgendes geschrieben:
Ich bin ein Anfänger was c# angeht deswegen versteh ich nicht was du meinst

Was genau verstehst Du denn nicht?

user profile iconacer5672 hat folgendes geschrieben:
außerdem gibt es bei deinem Code Syntax-Fehler

Ich habe es doch nicht als richtigen Code geschrieben, sondern als Pseudo-Code. Welchen Syntaxfehler hast Du denn festgestellt?

user profile iconacer5672 hat folgendes geschrieben:
Nur zur Info : Konsolenausgabe ist mein Thema nicht GUI soweit bin ich noch nicht.

Nichts, was ich geschrieben habe, bezieht sich auf Formulare. Ich habe nur grundlegende Elemente von C# verwendet; lediglich meine Hinweise auf Elemente der Klasse DateTime gehen eine Winzigkeit weiter.

user profile iconacer5672 hat folgendes geschrieben:
Die Mengenangabe für die Variable TageProMonat wird nicht akzeptiert.

Beziehst Du Dich auf die drei Punkte? Ich war doch nur zu faul, alle 12 Werte einzeln aufzuführen.

Weil Deine Version nicht zum Ziel kommt, habe ich mir mal schnell eine Anwendung geschrieben; und sie hat sofort funktioniert (lediglich die Ende-Bedingung bei der Schleife musste ich noch korrigieren, aber das passiert häufiger). Also kannst Du davon ausgehen, dass Du mit meinen Lösungsvorschlägen erfolgreich sein wirst.

Außerdem kannst Du Deine Rechnung von NET prüfen lassen und zum Schluss folgende Zeile einfügen:
ausblenden C#-Quelltext
1:
2:
Console.WriteLine("Kontrollwert: " + 
  (new DateTime(Jahr, Monat, Tag)).DayOfYear.ToString());

Etwas mehr Mitdenken bitte! Jürgen

Ergänzende Hinweise, die nichts mit den Problemen zu tun haben, sondern Dir in der Zukunft helfen sollen:

1. In der Regel sind int-Werte vorzuziehen (statt short), auch wenn kleinere Werte ausreichen würden. Der Computer rechnet intern sowieso mit 32-bit-Werten (also int) und muss bei short ständig umrechnen. Das hast Du also "richtig" gemacht. Dann benötigst Du aber die richtige Convertierung, nämlich Convert.ToInt32().

2. Besser für die Konvertierung sind TryParse() und TryParseExact(), weil damit Exceptions vermieden werden. Einzelheiten dazu siehe in der SDK-Doku.

3. Bisher fehlen sämtliche Eingabeprüfungen, damit Werte wie "32.0.99999" verhindert werden. Bei einem "richtigen" Programm ist das fast noch wichtiger als die eigentliche Rechnung.