c# errechneter Wert aus einer Klasse soll in einer 2. Klasse verarbeitet werden

Davewy

Grünschnabel
Hallo zusammen,
vorweg bin ich erst seit einer Woche am programmieren!
Ich benutze Visual Studio 2010 Express c#
Betriebssystem Windows 7 64bit

Mein Programm ist folgendermaßen aufgebaut:

Mein Programm hat 3 Klassen.
1.Klasse "HTimeStamp
2.Klasse "HDate"
3.Klasse "mit der MainMethode"

In der 1. Klasse wird die aktuelle Systemzeit ausgelesen und in Dezimalzeit umgerechnet.
Die Variable die diesen Wert beinhaltet heißt DecimalStdMin


In der 2. Klasse wird das Aktuelle Datum ausgelesen und umgerechnet in ein Julianisches Datum mit dem Format YYYYTTT, es wird geprüft ob es sich um ein Schaltjahr handelt etc.
und zusätzlich Soll dann zum schluss Das Julianisches Datum zu der Dezimalzeit dazugerechnet werden, so das man insgesamt das Format YYYYTTT,Dezimalzeit hat.
--------------------------------------------------------------------------------------------------------

Nun zu meinem Problem:

Der Wert in der ersten Klasse HTimeStamp wird dort richtig berechnet. Aber nicht an die 2. Klasse HDate übergeben, Da dachte ich mir ok dann erbt die 2. Klasse halt die Eigenschaften von der ersten Klasse Also ganz oben habe ich dann geschrieben
HDate : HTimeStamp
Sofort wurde es erkannt und der Wert Decimal in der 2. Klasse war nicht mehr rot unterkringelt.
Wenn ich aber nun das programm ausführe gibt er mir alle Werte richtig aus nur zum Schluss wenn er den Wert vom Julianischen Datum (bei mir "temp") mit den DecimalStdMin addieren soll kommt kein Wert durch bzw er zeigt mir im Consolenprogramm 0 an.

Weiß einer von euch warum der Wert mit 0 übergeben wird?

Hier der Quellcode von meinem Programm:

1.Klasse HTimeStamp:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
public class HTimeStamp
{
//--------------------------------------
double dtHour = DateTime.Now.Hour;
double dtMinute = DateTime.Now.Minute;
double dtSecond = DateTime.Now.Second;
public double DecimalMinuten, DecimalStunden, Stunden, DecimalStdMin;

public void holeSystemzeit()
{
Console.WriteLine("Systemzeit:\n"+ dtHour.ToString() + ":" + dtMinute.ToString() + ":" + dtSecond.ToString());
Console.WriteLine("Stunden:\n"+ dtHour.ToString());
Console.WriteLine("Minuten:\n" + dtMinute.ToString());
// Hier werden die Werte per TypCast toString in die jeweiligen Textboxen geschrieben
// Ausgabe Beispiel: 16:11:11
}

public void berechneDecimalMinuten()
{
DecimalMinuten = (dtMinute * 5) / 3;
//Hier werden Minuten in Dezimalminuten umgerechnet
}

public void berechneDecimalStunden()
{
Stunden = dtHour * 60;
DecimalStunden = (Stunden * 5) / 3;
}

public void berechneDecimalStdMin()
{
DecimalStdMin = DecimalStunden + DecimalMinuten;
Console.WriteLine("DezimalStundenMinuten:\n" + DecimalStdMin);
}


}
}



Hier ist meine 2. Klasse :



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
public class HDate : HTimeStamp
{
//---------------------------------------
double dtday, dtMonth, dtYear;

DateTime currentDate = DateTime.Now;

public void holeAktuelllenTag()
{
dtday= DateTime.Now.Day;
Console.WriteLine("Aktueller Tag:\n" + dtday.ToString());
}

public void holeAktuelllenMonat()
{
dtMonth = DateTime.Now.Month;
Console.WriteLine("Aktueller Monat:\n" + dtMonth.ToString());
}

public void holeAktuelllesJahr()
{
dtYear = DateTime.Now.Year;
Console.WriteLine("Aktuelles Jahr:\n" + dtYear.ToString());
}

public void SchreibeSystemDatum(int dtMonth, int dtYear)
{
Console.WriteLine("Systemdatum:\n"+dtday.ToString() + "." + dtMonth.ToString() + "." + dtYear);

}

public double temp = 0;
double Januar = 31,Februar = 28,Maerz = 31,April = 30,Mai = 31,Juni = 30;
double Juli = 31,August = 31, September = 30,Oktober = 31, November = 30,Dezember = 31;


public void pruefeJahr()
{
if (dtYear % 4 == 0)
Februar = 29;
}
// Mit dieser Methode wird überprüft ob es sich in diesem Jahr um ein Schaltjahr handelt
public void pruefeMonat()
{
if(dtMonth == 1)
{temp = Januar-Januar ;}
if(dtMonth==2)
{temp = Januar+Februar-Februar;}
if(dtMonth==3)
{temp =Januar+Februar+Maerz-Maerz;}
if(dtMonth==4)
{ temp = Januar + Februar + Maerz+ April-April; }
if(dtMonth==5)
{ temp = Januar + Februar + Maerz + April+Mai-Mai; }
if(dtMonth==6)
{ temp = Januar + Februar + Maerz + April + Mai+ Juni-Juni; }
if(dtMonth==7)
{ temp = Januar + Februar + Maerz + April + Mai + Juni+Juli-Juli; }
if(dtMonth==8)
{ temp = Januar + Februar + Maerz + April + Mai + Juni + Juli+August-August; }
if (dtMonth == 9)
{ temp = Januar + Februar + Maerz + April + Mai + Juni + Juli + August+September-September; }
if(dtMonth==10)
{ temp = Januar + Februar + Maerz + April + Mai + Juni + Juli + August + September+Oktober-Oktober; }
if(dtMonth==11)
{ temp = Januar + Februar + Maerz + April + Mai + Juni + Juli + August + September + Oktober+November-November; }
if(dtMonth==12)
{ temp = Januar + Februar + Maerz + April + Mai + Juni + Juli + August + September + Oktober + November+Dezember-Dezember; }

//Abfrage in welchem Monat Monat man sich befindet und der Wie vielte Tag es dann ist minus den Aktuellen Monat

}

public void erstelleJulianischesDatum()
{
temp += dtday + dtYear * 1000;
Console.WriteLine("Julianisches Datum:\n" + temp.ToString());
}


public double schreibeZeitdatum()
{

temp = (temp * 10000 + DecimalStdMin)/10000;
Console.WriteLine("Julianisches Datum mit Dezimalzeit:\n" + temp + "," + DecimalStdMin);
return temp;

// Console.WriteLine("Julianisches Datum mit Dezimalzeit:\n" + temp);
}


}
}

Und nun hier meine letzte Klasse mit der Mainmethode:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
public abstract class Program : HDate
{
static void Main(string[] args)
{
HDate Test = new HDate();
HTimeStamp Test1 = new HTimeStamp();


Test1.holeSystemzeit();
Test1.berechneDecimalMinuten();
Test1.berechneDecimalStunden();
Test1.berechneDecimalStdMin();
Test.holeAktuelllenTag();
Test.holeAktuelllenMonat();
Test.holeAktuelllesJahr();
Test.pruefeJahr();
Test.pruefeMonat();
Test.erstelleJulianischesDatum();
Test.schreibeZeitdatum();
//Test1.gebeDecimalStdMin(12.0);



Console.ReadLine();
}

}
}


Hier seht ihr nochmal was herauskommt , wenn ich das programm debugge:

siehe Anhang




Ich hoffe das ihr mir weiterhelfen könnt, wenn euch meine Informationen zu ungenau sind bitte eben melden.
 

Anhänge

  • Console.JPG
    Console.JPG
    32 KB · Aufrufe: 17
Hi und Willkommen bei tutorials.de :)

Zuerst zwei Tipps zum Forum:
1) C#-Code schreib bitte das nächste Mal zwischen [code=csharp]...[/code] statt quote. Dann bleiben auch die Einrückungen, Highlighting etc.
2) C# passt nicht wirklich zu C und C++. Weitere Fragen zu der Sprache bitte hier stellen:
http://www.tutorials.de/net

Zum Code:
Ein paar Punkte, die mir generell auffallen:
Main:
-Die ganzen Methodenaufrufe im Main sind nicht wirklich im Sinn der Objektorientierung. Das könnte man doch so umbauen, das man vom main aus nur eine Methode pro Klasse aufrufen muss, die sich bei den anderen bedient.
-Warum ist die Program-Klasse von HDate abgeleitet? :suspekt:

HTimeStamp:
-Wenns schon ein holeSystemzeit gibt, hol doch erst dort die Werte aus DateTime.Now.
-Auch nicht wirklich sinnvoll ist es, in der Berechnen-Methode eine Ausgabe auf die Konsole zu machen. Eher als Rückgabewert ins Main liefern und dort ausgeben. Und um auf den Punkt zurückzukommen, dass nur ein Auruf im main sein sollte: Dann sparst du dir alle Variablen und "Zwischenmethoden" in der Klasse.

HDate:
-Die Ableitung von HTimeStamp ist sinnlos. Seit wann ist jedes Datum auch eine Uhrzeit?
-Für die drei holeAktuell... gilt das gleiche wie holeSystemzeit beim HTimestamp. Erst da die Zeit abfragen.
-pruefeJahr, pruefeMonat und Januar, Februar etc: Das könnte man alles mit ein paar if wesentlich kürzer erledigen.
-Du rechnest hier doch nach dem heute gültigen Kalendersystem, denk ich? Das ist aber der gregorianische Kalender. Julianisch war zu Cäsar-Zeiten.

Und dein Hauptproblem: Durch die (nicht sinnvolle Ableitung) von HTimeStamp hast du in schreibeZeitDatum ein DecimalStdMin.
Solange du aber nicht holeSystemzeit usw. aufrufst, steht da nichts drin.
Die genannte Methode rufst du im main bei test1 auf und erwartest dann, das sich das Ganze auf test übertragt?
Du kannst dir das HTimeStamp-Objekt im main ganz sparen.
Soll doch schreibeZeitDatum ein HTimeStamp machen und sich den Wert holen. Objektorientierung.

Ich schreib den Code vielleicht noch passend um, kommt dann noch.

Gruß
 
Zuletzt bearbeitet:
Hey,
danke für deine ausführliche und schnelle Antwort, wie gesagt bin Neuling in den Sachen.
Ich habe mein Problem gefunden, habe eine weitere Methode geschrieben:
in HTimeStamp
C#:
public int getDecimalStdMin()
        {
            return this.DecimalStdMin;
        }

und dann in der Klasse HDate:
C#:
        public void schreibeZeitdatum(int DecimalStdMin)
        {
            temp = temp * 10000 + DecimalStdMin;
            Console.WriteLine("Julianisches Datum mit Dezimalzeit:\n" + temp);
        }

in der Main sieht das dann so aus:

C#:
Test.schreibeZeitdatum(Test1.getDecimalStdMin());

damit wäre mein Problem erst einmal gelöst , aber ich werde mich jetzt nochmal dran machen und das versuchen so umzusetzen wie du das geschrieben hast. Das klingt sehr gut,logisch und leuchtet mir ein!

Allerbesten Dank du hast mir sehr weitergeholfen******

Gruß David
 
Noch was ist mir aufgefallen: Deine Schaltjarüberprüfung ist falsch bzw. unvollständig.
-Wenn durch 400 teilbar: Ja.
-Sonst: Wenn durch 100 teilbar: Nein
-Sonst: Wenn durch 4 Teilbar: Ja
-Sonst: Nein
Und du arbeitest etwas viel mit double. Warum? Da reichen int auch.

Jetzt der Code.
HTimeStamp habe ich - da es nur noch aus einer einzigen Methode bestanden hätte - ganz eingespart und die Methode zu HDate reingepackt.

Main:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
	public class Program
	{
		static void Main(string[] args)
		{
			HDate hd = new HDate();

			Console.WriteLine(String.Format("{0:0000}{1:000} {2:00}{3:00}", hd.GetYYYY(), hd.GetTTT(), hd.GetHH(), hd.GetDezMM()));

			Console.ReadLine();
		}
	}
}

HDate:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
	public class HDate
	{
		int yyyy, ttt, hh, dezmm;
		public HDate()
		{
			int i;

			yyyy = DateTime.Now.Year;

			ttt = DateTime.Now.Day;
			for(i = DateTime.Now.Month; i > 0; i--)
				ttt += tageImMonat(i);

			hh = DateTime.Now.Hour;

			dezmm = DateTime.Now.Minute;
			dezmm *= 5; dezmm /= 3;
		}

		protected int tageImMonat(int monat, int jahr)
		{
			if(monat == 2)
			{
				if((jahr % 400) == 0) return 29;
				if((jahr % 100) == 0) return 28;
				if((jahr % 4) == 0) return 29;
				return 28;
			}
			if(monat < 8) return (((monat % 2) == 1) ? 31 : 30);
			return (((monat % 2) == 1) ? 30 : 31);
		}

		public int GetYYYY() { return yyyy; }
		public int GetTTT() { return ttt; }
		public int GetHH() { return hh; }
		public int GetDezMM() { return dezmm; }
	}
}

Ungetestet.

Gruß
 

Neue Beiträge

Zurück