Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
06.01.2007, 18:09
BloodySlash



Hallo,

ich studiere jetzt im 1. Semester Wirtschaftsinformatik und komme bei meiner dritten Aufgabe in Programmieren I nicht weiter. (Jaja habe einfach zu viele Vorlesungen geschwänzt)

Die Aufgabe lautet so:
Quellcode:Entwickeln Sie eine Java-Klasse Tag, die einen Kalendertag nach dem
1.Januar 1601 repräsentiert (vgl.Aufgabe13). Die Klasse soll die Attribute Tag, Monat, Jahr und Wochentag enthalten.
Statten Sie die Klasse mit einem Konstruktor Tag(int tag,int monat,int jahr)
sowie mit sinnvollen Methoden zum Setzen und Abfragen der Attribute aus.Darüber hinaus soll Ihre Klasse die Methode String toString() überlagern.Schreiben Sie auch eine Methode zur Berechnung des Wochentags. Sie können die Lösung von Aufgabe 13 verwenden .Weitere Attribute und Methoden sind erlaubt.
Die Get-und Set-Methoden so wie die toString-Methode sollen mit dem Modifikator public versehen werden,die Attribute mit dem Modifikator private.
Schreiben Sie weiter eine Klasse TagTest, die die main-Methode zum Testen der Klasse Tag enthält.
Hier mein Programm "nicht objektorientiert" (Aufgabe 13)
Nun meine erste Frage:
Ich versteh den Sinn von dem Konstruktor (den wir einfügen MÜSSEN) nicht ganz. Dann gibt es die Variablen doch doppelt?
Ich verzweifel noch. Muss die Kacke am Sonntag abgeben.
Und wo soll ich die String toString() Methode einfügen? Zu welchem Sinn? Und Get- und SetMethoden? auch schwachfug

--

[ portfolio ] [ deviantart ]
[ we can make you ]


Dieser Beitrag wurde am 06.01.2007 um 18:12 von BloodySlash bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
06.01.2007, 18:29
Master Pegasus



Erst mal vorweg: Ich hab von Java keine Ahnung, aber ich versuch mal zu erklären, was die meiner Meinung nach von dir haben wollen.

1. Man soll eine Klasse zur Speicherung und Verwaltung eines Datums (Kalendertag) implementieren
2. Diese Klasse soll einen Konstruktur haben, der die verwendeten Variablen Tag, Monat und Jahr setzt. (in C++ wohl sowas wie foo = new Tag(6,1,2007);)
3. Die Get- und Set-Methoden dienen dazu eine einzelne Komponente des Datums auszulesen oder zu verändern, wobei die anderen ignoriert oder beibehalten werden. Beispielsweise foo.setTag(7);
4. Die toString Methode soll einfach das Datum als String zurückgeben, also sowas wie printf("%s", foo.toString());
5. Als nette Zusatzaufgabe soll deine Klasse auch eine Methode zur Rückgabe des Wochentags des in ihr gespeicherten Datums haben. Diese Methode ist wahrscheinlich eine 1:1 Kopie deines Aufgabe 13 Programms, nur ohne die Ein- und Ausgaben.

Ich hoffe das Hilft dir etwas, auch wenn das jetzt ne bunte Mischung aus C und C++ ist, aber Java hat ja ne ähnliche Syntax.

--

Was immer auch geschieht: Nie sollt Ihr so tief sinken, von dem Kakao, durch den man Euch zieht, auch noch zu trinken! -- Erich Kästner

zum Seitenanfang zum Seitenende Profil || Suche
002
06.01.2007, 18:30
feigling



http://www.google.de/search?hl=de&q=java+turorial&btnG=Google-Suche&meta=

Viel Spass. Dir scheinen jegliche Grundlagen zu Java zu fehlen, daher würde es auch nix bringen, dir den Quellcode zu zeigen. Lern Java von Anfang an, Stück für Stück und versuche, den Stoff von der Vorlesung wieder aufzuholen.

--

zum Seitenanfang zum Seitenende Profil || Suche
003
06.01.2007, 18:46
BloodySlash



@feigling
sorry hilft mir nicht weiter. die grundlagen kenn ich soweit

@Master Pegasus
Danke hilft mir auf jedenfall etwas weiter.
zu 2.
joa so hab ich es auch gemacht. aber foo = new Tag(6,1,2007); in java: Tag t1 = new Tag(6,1,2007);
bringt mir nix, weil das datum (hier 6.1.2007) nicht fest sein soll, sondern beim laufen des programmes eingefügt werden soll.
mit doppelt mein ich dass tag,monat,jahr schon attribute der klasse sind aber auch im konstruktor auftauchen. das ist es was ich nicht ganz verstehe.
d.h. wenn ich t1 = new Tag(6,1,2007); benutzte ich es völlig wumpe was ich da reinschreibe, weil die ja sowieso eingelesen werden Quellcode:tag = IOTools.readInteger();
System.out.print("Monat: ");
monat = IOTools.readInteger();
System.out.print("Jahr: ");
jahr = IOTools.readInteger();
hier nämlich.
was soll als toString ausgeben werden? der Wochentag (muss ja ein string sein) oder das datum was eingebene wird? also eine zusammensetzung aus den einzelnen integern tag,monat,jahr?

*edit*
ok die toString nache habe ich erledigt.

--

[ portfolio ] [ deviantart ]
[ we can make you ]


Dieser Beitrag wurde am 06.01.2007 um 18:52 von BloodySlash bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
06.01.2007, 19:14
HammerBlade



BloodySlash, du hast das nicht doppelt, das ist hier nur zufällig so weil du das von der nicht-OOP Version weiter entwickelst.

Wenn du die Tag Klasse hast schrumpft der ganze Code der nicht-OOP Version zu

Quellcode:import Prog1Tools.IOTools;

public class PflichtEins {
    public static void main (String[] args) {
        int tag, monat, jahr;
        
        tag = IOTools.readInteger();
        monat = IOTools.readInteger();
        jahr = IOTools.readInteger();
        
        // Wenn ungültige Eingabe dann Abbruch - wenn Eingabe vor 1601
        if (jahr < 1601) {
            System.out.println("Bitte geben Sie ein Jahr nach 1601 ein!");
            System.exit(1);
        }
        
        Tag t1 = new Tag(tag, monat, jahr);
        
        System.out.println("Der " + t1 + " ist ein " + t1.getWochentag());
    }
}
Und wenn man die Jahresprüfung auch noch in den Konstruktor von Tag verschiebt und vor mir aus eine Exception wirft wenn das Jahr < 1601 ist wird es noch kürzer:

Quellcode:import Prog1Tools.IOTools;

public class PflichtEins {
    public static void main(String[] args) {      
        Tag t1 = new Tag(IOTools.readInteger(), IOTools.readInteger(), IOTools.readInteger());
        
        System.out.println("Der " + t1 + " ist ein " + t1.getWochentag());
    }
}
Die Aufgabe des Konstruktors ist es grundsätzlich erstmal eine neue Instanz deiner Klasse zu erstellen. Und bei dir hier wird die Instanz dann auch noch gleich mit den Daten initialisiert, die sie benötigt um etwas sinnvolles zu tun.

Edit:
Ich hab da was benutzt was du noch nicht zu kennen scheinst, wenn man deinen Javacode sieht:

Quellcode:System.out.println("Der " + t1 + " ist ein " + t1.getWochentag()); Dabei wird automatisch aus "Der " + t1 + " ist ein " das hier: "Der " + t1.toString() + " ist ein ". Der Compiler benutzt automatisch .toString() und wandelt Basisdatentypen wie int, float, char in Strings um, wenn man sie mit Strings wie "Der " konkateniert durch den + Operator.

D.h. bei deinem nicht-OOP Code zu Aufgabe 13 kannst du auch

Quellcode:System.out.println(tagt + "." + monatt + "." + jahrt + " ein " + wochentag); statt 7 System.out.print's schreiben.

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way


Dieser Beitrag wurde am 06.01.2007 um 19:31 von HammerBlade bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
07.01.2007, 16:59
BloodySlash



@HammerBlade

Quellcode:public class PflichtEins {
    public static void main (String[] args) {
        int tag, monat, jahr;
so sollte das aber nicht sein. die attribute tag, monat, jahr sollen in der klasse Tag sein!
das ist es ja was mich so total verwundert. einmal als attribute in der klasse und dazu noch im konstruktor.
oder versteh ich die aufgabe falsch?

Tag t1 = new Tag(tag, monat, jahr);
das geht nicht.
Tag t1 = new Tag(IOTools.readInteger(), IOTools.readInteger(), IOTools.readInteger());
das auch nicht.
da sagt er:
tag cannot be resolved etc. was ja klar ist, weil tag in der main funktion noch garnicht existiert.
d.h. ich könnte es so machen wie du es meinst. in dem ich das einlesen in die main funktion packe. aber laut der aufgabe soll das ja in die klasse. das verwirrt mich.

*edit*
ich denke mal das das so gemeint ist.
also dass das einlesen in der main methode passiert.
also erst einlesen
dann
Tag t1 = new Tag(tag, monat, jahr);
und der konstruktor schreibt das dann in die klassenattribute!
Quellcode:Tag(int tag, int monat, int jahr) {
        this.tag = tag;
        this.monat = monat;
        this.jahr = jahr;
    }
naja ist immer noch ziemlich bekloppt, aber ich denke mal das gemacht werden damit man das lernt! gut
ich denke ich bin, bis auf diese set get methoden fertig.

--

[ portfolio ] [ deviantart ]
[ we can make you ]


Dieser Beitrag wurde am 07.01.2007 um 17:32 von BloodySlash bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
07.01.2007, 17:30
dp
Administrator


Zitat:
feigling postete
http://www.google.de/search?hl=de&q=java+turorial&btnG=Google-Suche&meta=

Viel Spass. Dir scheinen jegliche Grundlagen zu Java zu fehlen, daher würde es auch nix bringen, dir den Quellcode zu zeigen. Lern Java von Anfang an, Stück für Stück und versuche, den Stoff von der Vorlesung wieder aufzuholen.

und das naechste mal die sprechstunde nutzen.

--

zum Seitenanfang zum Seitenende Profil || Suche
007
07.01.2007, 17:58
theDon



Quellcode:MODULE mt
  PRIVATE
  PUBLIC :: makedatum, gettag, getmonat, getjahr, &
          & tostring, settag, setmonat, setjahr, &
          & datum

  TYPE datum
    PRIVATE
    INTEGER :: tag, monat, jahr
  END TYPE

  INTERFACE tostring
    MODULE PROCEDURE datumtostring
  END INTERFACE

CONTAINS
  TYPE(datum) ELEMENTAL FUNCTION makedatum(t, m, j)
    INTEGER, INTENT(IN) :: t, m, j

    makedatum = datum(t, m, j)
  END FUNCTION

  INTEGER ELEMENTAL FUNCTION gettag(d)
    TYPE(datum), INTENT(IN) :: d

    gettag = d%tag
  END FUNCTION

  INTEGER ELEMENTAL FUNCTION getmonat(d)
    TYPE(datum), INTENT(IN) :: d

    getmonat = d%monat
  END FUNCTION

  INTEGER ELEMENTAL FUNCTION getjahr(d)
    TYPE(datum), INTENT(IN) :: d

    getjahr = d%jahr
  END FUNCTION

  ELEMENTAL SUBROUTINE settag(d, t)
    TYPE(datum), INTENT(OUT) :: d
    INTEGER, INTENT(IN) :: t

    d%tag = t
  END SUBROUTINE

  ELEMENTAL SUBROUTINE setmonat(d, m)
    TYPE(datum), INTENT(OUT) :: d
    INTEGER, INTENT(IN) :: m

    d%monat = m
  END SUBROUTINE

  ELEMENTAL SUBROUTINE setjahr(d, j)
    TYPE(datum), INTENT(OUT) :: d
    INTEGER, INTENT(IN) :: j

    d%jahr = j
  END SUBROUTINE

  ELEMENTAL FUNCTION datumtostring(d)
    CHARACTER(LEN=10) :: datumtostring
    TYPE(DATUM), INTENT(IN) :: d

    WRITE(UNIT=datumtostring, FMT="(I4.4A1I2.2A1I2.2)") &
              & d%jahr, '-', d%monat, '-', d%tag
  END FUNCTION
END MODULE

PROGRAM pt
  USE mt

  TYPE(datum) :: d

  d = makedatum(1, 1, 1970)

  WRITE(*, *) tostring(d)

  CALL settag(d, 31)
  CALL setmonat(d, 12)

  WRITE(*, *) tostring(d)
END PROGRAM
Quellcode:mmarx@korenchkin ~ $ gfortran tag.f95
mmarx@korenchkin ~ $ !.
./a.out
1970-01-01
1970-12-31
Genau dafuer braucht man die get/set-Methoden.

Wie das jetzt in Java aussieht, sollte nicht mehr allzuschwer herauszufinden zu sein...

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before


Dieser Beitrag wurde am 07.01.2007 um 18:02 von theDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
07.01.2007, 19:51
HammerBlade



BloodySlash, ist Java deine erste Programmiersprache? Mir kommt es so vor. Du scheinst Basiskenntnisse über Java zu haben, aber dir fehlt einfach Wissen über OOP Konzepte wie Klassen, deshalb hast du auch Probleme mit dem Konstruktur.

Zitat:
BloodySlash postete
Quellcode:public class PflichtEins {
    public static void main (String[] args) {
        int tag, monat, jahr;
so sollte das aber nicht sein. die attribute tag, monat, jahr sollen in der klasse Tag sein!
Und die kommen die Daten dann "in" die Instanz der Klasse? Irgendwo muss man die mal einlesen und wenn man die dann zufällig noch mal zwsichenspeichert (Tag t1 = new Tag(tag, monat, jahr);) anstatt die direkt zu übergeben (Tag t1 = new Tag(IOTools.readInteger(), IOTools.readInteger(), IOTools.readInteger());), was unschön ist, macht kozeptionell keinen Unterschied.

Zitat:
BloodySlash postete
das ist es ja was mich so total verwundert. einmal als attribute in der klasse und dazu noch im konstruktor.
oder versteh ich die aufgabe falsch?
Das sind Variabeln, einmal Klassenvariabeln in Tag und einmal lokale Variabeln in main.

Wie siehst du das denn wenn du in der Klasse PflichtEins, in der auch die Methode main ist noch ein Methode 'String getWochentag(int tag, int monat, int jahr)' hättest, in der dann die ganze Berechnung stattfindet? Dort hast du die Daten int tag, int monat, int jahr dann auch doppelt (in main und getWochentag), weil du sie in main einliest und dann an getWochentag(...) übergibts.

Ähnlich ist das bei der Klasse Tag, sie stellt das Konzept eines Tages da, der über sich selbst weiss (berechnen kann) welcher Wochentag er ist. Dazu muss man ihm aber sagen welches Datum er ist, es ihm also im Konstruktor sagen, damit er es sie merken kann. Dadurch kannst du diesen Tag (die Instanz t1 der Klasse Tag) dann nachher fragen (mit getWochentag()) welcher Wochentag er ist.

Zitat:
BloodySlash postete
Tag t1 = new Tag(tag, monat, jahr);
das geht nicht.
Tag t1 = new Tag(IOTools.readInteger(), IOTools.readInteger(), IOTools.readInteger());
das auch nicht.
da sagt er:
tag cannot be resolved etc. was ja klar ist, weil tag in der main funktion noch garnicht existiert.
d.h. ich könnte es so machen wie du es meinst. in dem ich das einlesen in die main funktion packe. aber laut der aufgabe soll das ja in die klasse. das verwirrt mich.
Die Klasse Tag an sich muss entweder neben der public Klasse PflichtEins in PflichtEins.java definiert werden, also 'class Tag {...}' in PflichtEins.java, oder als public Klasse Tag 'public class Tag {...}' in Tag.java. Dann muss du allerdings Tag.java vor PflichtEins.java kompilieren. Falls das nicht hilft ist ein 'import Tag;' in PflichtEins.java nötig, das dürfte aber nicht nötig sein, da sich beide Klassen im default Package befinden.

Zitat:
BloodySlash postete
ich denke mal das das so gemeint ist.
also dass das einlesen in der main methode passiert.
also erst einlesen
dann
Tag t1 = new Tag(tag, monat, jahr);
und der konstruktor schreibt das dann in die klassenattribute!
Quellcode:Tag(int tag, int monat, int jahr) {
        this.tag = tag;
        this.monat = monat;
        this.jahr = jahr;
    }
naja ist immer noch ziemlich bekloppt, aber ich denke mal das gemacht werden damit man das lernt! gut
ich denke ich bin, bis auf diese set get methoden fertig.
Das ist nicht bekloppt, euer Beispiel ist einfach nur schlecht um OOP zu lernen, wenn man nicht weiss was das ist.

Für gewöhnlich (ich hab noch nie was anderes gesehen) lernt man Java mit Turtlegrafik (weil man damit schnelle, sichtbare Erfolge hat) an einem gegebenen Framework dafür, um die Basics der Sprache zu lernen, also die einfache Syntax. Dann geht man von dort weiter zum Konzept der Klassen, meist an Tieren oder geometrischen Formen verdeutlicht.

Mir kommt es so vor, dass du starke Probleme mit dem Klassenkonzept hast und/oder die Vorlesung, die du zu Java hörst einfach schlecht gemacht ist, oder du einfach mal mehr da sein solltest.

Ich kann dazu nur soviel sagen, dass ich vorm Studium schon C++ und Java konnte und daher die Javaeinführung uninteresannt war. Die Leute die aber ohne Vorwissen zu Java angefangen haben mussten sich echt reinhängen, denn die Vorlesung zu Java in meinem ersten Semster war schlecht. Ohne eine Menge eigene Arbeit über die Vorlesung und Übung hinaus wird das nichts.

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way


Dieser Beitrag wurde am 07.01.2007 um 19:54 von HammerBlade bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
08.01.2007, 14:37
Sir_Prize



also ich hab auch java gehabt im ertsen semester und ohne vorwissen wär ich genau wie hammerblades komillitonen (und auch vielen von meinen) total abgekackt. und das problem liegt darin, dass nie einer wirklich erklärt, was 'objekte' denn nun sind.
Wenn mir einer von anfang an gesagt hätte, das es sich bei objekten um nichts anderes als neue (komplexere) variablen handelt (zum beispiel vektoren oso), hätt ichs auch schneller begriffen.

was zusätzlich noch verwirrt, ist, dass man in einer klasse eine variable definiert bzw. definiern kann und es gleichzeitig als ausführende klasse bzw. als programm benutzen kann.

beispielsweise kannst du ne klasse Vektor3.java schreiben, in der du neue Variable definierst, nämlich vektoren im 3 dimensionalen raum. jetzt musst natürlich einige methoden dazu schreiben, die mit diesen vektoren umgehen können: addition, multiplikation, betragsfunktion usw., denn java weiss ja nicht einfach so wie es 2 objekte x=(2,3,4) und y=(1,2,3) addieren soll.
und jetzt kannst du ausserdem noch die methode main implementieren, die dann das 'eigentliche' programm enthält. da kannst du dann den benutzer 6 werte eintippen lassen, die in 2 vektoren gespeichert werden und bspw. die ergebnisse von addition, multiplikation und betrag ausgeben.

ich hoffe du bist nicht auf dem kriegspfad mit mathe und das ganze war etwas anschaulich. wenn du willst schreib ich dir auch gerne das beschriebene programm mal auf, aber ich mach mir nicht die mühe wenns für dich gar nicht nötig ist. und wenn doch, einfach kurz sagen.

--

"Herr Keuner sagte: «Schwierig ist, diejenigen zu belehren, auf die man zornig ist. Es ist aber besonders nötig, denn sie brauchen es besonders.»" - Bertolt Brecht
-
"Hier gibt's was auf die Ohren" - Thewall.de bei last.fm (Was ist last.fm?)


Dieser Beitrag wurde am 08.01.2007 um 14:40 von Sir_Prize bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
08.01.2007, 16:13
BloodySlash



jau danke jungs.
habs jetzt soweit noch gepackt.
vor allem danke HammerBlade. hat mir echt geholfen!
wenn keiner mehr was zu sagen hat, kanns zu!

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche