Objektorientiert - KgV

Hallo liebe Programmiere :slight_smile:

ich studiere momentan Wirtschaftsinformatik im 1. Semester und wir haben vor kurzem mit Java angefangen und ich befinde mich jetzt in der Prüfungsvorbereitung und hänge an einer Aufgabe fest :confused:
Aufgabe:
Programmieren Sie eine Klasse namens Zahl.
• Die Klasse soll über eine Instanzvariable meinWert vom Typ int verfügen,
welche die vom Objekt repräsentierte ganze Zahl als Wert aufnehmen kann.
• Desweiteren soll die Klasse eine Konstruktor-Methode besitzen, der man als
Parameter einen int-Wert übergeben kann, der dem erzeugten Zahl-Objekt
sagt, welche ganze Zahl es repräsentieren soll – dieser Wert ist folglich in der
Variablen meinWert abzuspeichern.
• Außerdem soll die Klasse über eine Instanzethode getMeinWert verfügen, die
als Rückgabewert den Inhalt der Variablen meinWert zur Verfügung stellt.
• Schließlich soll die Klasse über eine Instanzmethode teilstDu verfügen, der
eine ganze Zahl als Parameter übergeben werden kann und die true zurückgibt,
wenn die von dem Objekt repräsentierte ganze Zahl ein Teiler der als
Parameter übergebenen Zahl ist, false sonst.
• Schreiben Sie außerdem eine main-Methode, mit der ein Test der vorgenannten
Methoden durchgeführt werden kann.
Fügen Sie Ihrer Klasse Zahl eine Instanzmethode suchtKgV hinzu.
• Der Methode suchtKgV soll ein anderes Zahl-Objekt als Parameter
übergeben werden.
• Aufgabe der Methode suchtKgV ist es, mit Hilfe der Methode teilstDu des
anderen Objekts das kleinste gemeinsame Vielfache der von den zwei
beteiligten Zahl-Objekte repräsentierten Zahlen zu ermitteln und das
Ergebnis als int-Wert zurückzugeben.

Tut mir leid, dass das so viel Text ist, aber sonst kann ich schlecht erklären, was genau ich machen muss und einen Großteil habe ich ja schon gemacht, bzw. versucht.

	
	public int meinWert;
	
	public Zahl(int gz){
		gz = meinWert;
	}
	
	public double getMeinWert(){
		return meinWert;	
	}
	
	public void teilstDu(int ganz){
		if (meinWert%ganz == 0){
			System.out.println("true");
		}else{
			System.out.println("false");
		}		
	}
	
	 public static void main(String[] args){
		 System.out.println("Bitte eine Zahl eingeben");
		 
	 }
	 
	 public suchtKgV(int zahl2){
		 stepA = teilstDu;
		 stepB = zahl2;
		 for(int i = 1; teilstDu != zahl2; i++) {
		   if(teilstDu) 
			   teilstDu = teilstDu + stepA;
		   	else if(teilstDu > zahl2) 
		   		zahl2 = zahl2 + stepB;
		   System.out.println(teilstDu + " " + "<>" + " " + zahl2);
	 }
	 }
	 
	 
}

So das ist mein momentaner Erfolgsfortschritt und bei dem KgV werden mir lauter rote Kreuze angezeigt und der Rest klappt irgendwie auch nicht so, wie es soll :frowning:

Passt.

Passt auch.

[quote=hornhauer;107280]• Außerdem soll die Klasse über eine Instanzethode getMeinWert verfügen, die
als Rückgabewert den Inhalt der Variablen meinWert zur Verfügung stellt.[/QUOTE]
Ja, das tut deine Methode.

Das passt nicht. Deine Methode hast du als void deklariert. Es wird aber eine Methode mit boolean Rückgabewert gefordert.
Die Methode müsste also so lauten:

  return meinWert % zahl == 0;
}```

[quote=hornhauer;107280]
• Schreiben Sie außerdem eine main-Methode, mit der ein Test der vorgenannten
Methoden durchgeführt werden kann.[/QUOTE]
Seh ich bei dir noch gar nicht.

[quote=hornhauer;107280]
• Der Methode suchtKgV soll ein anderes Zahl-Objekt als Parameter
übergeben werden.[/QUOTE]
Ist bei dir so nicht richtig, neben falscher Syntax (Kein Rückgabewert) hast du nicht den geforderten Parameter. Die Methodensignatur sollte also so aussehen:
```public int suchtKgV(Zahl andereZahl) {
  [...]
}```
Die Implemementierung der Methode ist auch noch nicht richtig. Du verwendest teilstDu wie eine Variable, es ist aber eine Methode.

Löse zunächst mal den ersten Teil der Aufgabe. teilstDu implementieren und in Main-Methode nutzen.
Falls du noch Probleme hast sag Bescheid.

• Desweiteren soll die Klasse eine Konstruktor-Methode besitzen, der man als
Parameter einen int-Wert übergeben kann, der dem erzeugten Zahl-Objekt
sagt, welche ganze Zahl es repräsentieren soll – dieser Wert ist folglich in der
Variablen meinWert abzuspeichern.

Hm, Du solltest als erstes mal solche Dinge wie Wertezuweisung begreifen. Schau Dir mal deinen Konstruktor an, das kann so nicht funktionieren. Du weist dem übergebenen Argument den Defaultwert (nämlich 0) deiner Instanzvariablen meinWert zu.

Also muss ich das einfach nur umdrehen? Damit ich “meinWert” den Wert “gz” zuweise? ( meinWert = gz; )
Und zu der Main Methode, wie teste ich das denn? Vorher hatten wir immer vorgegeben Main Methoden. Muss ich jetzt einfach ein System.out.println() machen um Zahlen einzugeben und diese dann speichern und dann einfach die Methode teilstDu aufrufen? :ka:

Habe Main Methode nun versucht so zu lösen, bzw einen Teil hingeschrieben, wo ich hoffe das es richtig ist, nachdem ich in meine Unterlagen geschaut habe…

		 Zahl zahl_eins = new Zahl(meinWert);	
		 zahl_eins.Zahl();
		 zahl_eins.getMeinWert();
		 zahl_eins.teilstDu(zahl);
	 }```

[quote=hornhauer]Also muss ich das einfach nur umdrehen? Damit ich “meinWert” den Wert “gz” zuweise? (meinWert = gz[/quote]Ja.
Wie in den meisten Programmiersprachen funktionieren Wertzuweisungen auch in Java immer von rechts nach links (der Variablen links wird der Wert des Ausdrucks rechts zugewiesen).

[quote=hornhauer;107287]Zahlen einzugeben und diese dann speichern und dann einfach die Methode teilstDu aufrufen?[/quote]Tatsächliche Ein- und Ausgabe (also Benutzer_nteraktion) ist ja gar nicht gefordert.
Gefordert ist, dass Du aus der main-Methode heraus ein oder mehrere Objekte Deiner Klasse erzeugts und die Methoden der Objekte mit womöglich verschiedenen Werten aufrufst. Die Main-Methode soll als Test fuktionieren. Bei einem Test vergleicht man das erwartete Ergebnis mit den tatsächlichen. Für Deine Aufgabe bedeutet dass, dass Du diese Beiden Werte (den erwarteten und den tatsächlichen) mit einem System.out.println() auf der Kommandozeile ausgibst, etwa so:```Zahl meineZahl = new MeineZahl(3);

// erster Testfall
boolean istTeilerVon6 = meineZahl.istTeilerVon(6);
System.out.println("3 ist Teiler von 6: "+istTeilerVon6);

// zweiter Testfall
boolean istTeilerVon7 = meineZahl.istTeilerVon(7);
System.out.println("3 ist Teiler von 7: "+istTeilerVon7);```

[quote=hornhauer;107287] Vorher hatten wir immer vorgegeben Main Methoden.[/quote]Dann kopiere den “Rahmen” und schreibe darin die Test.

bye
TT

*** Edit ***

[quote=hornhauer;107287]Habe Main Methode nun versucht so zu lösen, bzw einen Teil hingeschrieben, wo ich hoffe das es richtig ist, nachdem ich in meine Unterlagen geschaut habe…public static void main(String[] args){ Zahl zahl_eins = new Zahl(meinWert); zahl_eins.Zahl(); zahl_eins.getMeinWert(); zahl_eins.teilstDu(zahl); }[/quote]
Als aller erstes: Bitte gewöhne Dich schnellstens an die in Java üblichen Konventionen für Bezeichner: Klassennamen beginnen groß, Variablen und Methoden klein, Wortbestandteile beginnen mit großem Buchstaben ohne “Trennzeichen”.
zahl_eins -> zahlEins oder besser ersteZahl

Zeile 2:
Zahl zahl_eins = new Zahl(meinWert);
Die Objekt-Variable meinWert ist im Kontext der statischen Methode main nicht bekannt, was zu einem Kompile-Fehler führt. Selbst wenn wäre sie immer 0. Was Du hier übergeben solltest ist ein sogenanntes Literal, ein von Dir (mehr oder weniger) willkührlich gewählter Wert.

Zeile 3:
Das funtioniert auch nicht, weil Deine Klasse[ol]
[li]keinen Konstruktor ohne Parameter hat und
[/li][li]ein Konstruktoraufruf nicht auf einer Variablen erfolgen kann.
[/li][/ol]

Zeile 4 und 5:
Diese Anweisungen funtionieren zwar, sind aber sinnlos. Diese Methoden haben keine Seiteneffekte (verändern also keine Variablen in dem Objekt) und ihre Rückgabe-Werte werden nicht weiter verarbeitet.

bye
TT

[quote=hornhauer]```public class Zahl {

public int meinWert;

public Zahl(int gz){
    gz = meinWert;
}```[/quote]

das sieht nicht so brauchbar aus im Konstruktor. Besser wäre

        meinWert = gz;
    }```

und noch besser

```    public Zahl(final int meinWert){
        this.meinWert = meinWert;
    }```

Das mit dem meinWert = gz; hatte ich oben schon verbessert :smiley: Aber das mit dem final und so kenne ich nicht, bzw. hatten wir noch nicht :o
Main Methode habe ich jetzt probiert für mein Beispiel, aber der zeigt immer false an :o

		 
		 Zahl meinWert = new Zahl(3);
		 // Fall 1
		boolean teiler1 = Zahl.teilstDu(6);
		System.out.println("3 ist Teiler von 6: "+ teiler1);
		// Fall 2
		boolean teiler2 = Zahl.teilstDu(7);
		System.out.println("3 ist Teiler von 7: "+ teiler2);```

[quote=hornhauer]aber der zeigt immer false an[/quote]Schau mal im Posting #1 die Zeile 14 im Code ganz genau an.

bye
TT

@hornhauer

[quote=Timothy_Truckle]```Zahl meineZahl = new MeineZahl(3);

// erster Testfall
boolean istTeilerVon6 = meineZahl.istTeilerVon(6);```[/quote]
vs.

[quote=hornhauer;107336]Zahl meinWert = new Zahl(3); // Fall 1 boolean teiler1 = Zahl.teilstDu(6);[/quote]

fällt dir ein Unterschied auf?
ist teilstDu() auf einmal eine statische Methode? sonst wäre Aufruf an der Klasse gar nicht möglich,

wenn aber static, wovon bisher außer für main-Methode gar nicht die Rede war,
dann ist der Wert 3 für ein bestimmtes von beliebig vielen Objekten doch irrelevant,
bzw. sollte so sein, man kann natürlich auch anderes krummes falsches bauen, der Wert eines Objektes in statischer Variable abgelegt…

wie sieht die Methode aktuell aus?
wenn if (meinWert%ganz == 0) noch vorkommt, dann gib doch aus, was meinWert gerade ist
→ immer Programme genauer anschauen, nebem Quellcode die aktuellen Werte im Programmverlauf,

was ist meinWert für eine Variable, static?
besser mal vollständigen Code posten

*** Edit ***

teilstDu() oder istTeilerVon() wären verschiedene Methoden,
edit: aber stimmt, da ist noch was zu tun

Das mit meinWert hatte ich auch schon probiert, aber dann kommt das rote Kreuz und er sagt mir, ich soll es in Zahl ändern.

public class Zahl {
	
	public static int meinWert;
	
	public Zahl(int gz){
		meinWert = gz;
	}
	
	public double getMeinWert(){
		return meinWert;	
	}
	
	public static boolean teilstDu(int zahl){
		  return meinWert % zahl == 0;
		}
	
	 public static void main(String[] args){
		 
		 Zahl meinWert = new Zahl(3);
		 // Fall 1
		boolean teiler1 = Zahl.teilstDu(6);
		System.out.println("3 ist Teiler von 6: "+ teiler1);
		// Fall 2
		boolean teiler2 = Zahl.teilstDu(7);
		System.out.println("3 ist Teiler von 7: "+ teiler2);
	 
}
	 
	 public int suchtKgV(Zahl andereZahl) {
		 
	 }

}```

[quote=hornhauer]ich soll es in Zahl ändern.[/quote]Die Ursache sind die static-Schlüsselwörter. Schmeiss die raus.

bye
TT

nun denn, dann nimm es als eine menschliche Weisheit, mehr wert als vom Computer, auf, Wichtigkeit vielleicht nicht zu beurteilen:
etwas static zu machen ist eine dramatische Sache, mach das nicht einfach so, mach es nicht ohne es dann wenigstens dem Forum gegenüber genau zu erwähnen

bis auf main-Methode darf es vorerst kein static geben,
was am Aufruf der Methode teilstDu() dann anders wird ist entweder offensichtlich oder schon gepostet:
dort musst du dich auf das zuvor erzeugte Objekt, auf die Variable meinWert, beziehen,
siehe auch das von mir zitierte fertige Beispiel (!) von Timothy_Truckle

und die Rechnung dann nochmal manuell nachrechnen, ist dir Modulo bekannt? was kommt bei 3 % 6 sowie 3 % 7 heraus?

Hab static nun überall weggemacht, außer natürlich bei der Main Methode, aber er will immer, dass ich die 1. Zeile der Main Methode in Zahl änder, auch wenn ich dort meinWert eintragen will. Und ja Modulo ist mir bekannt :wink: Bei 3 ist Teiler von 6 sollte ja wahr rauskommen :wink:

Moment :o wenn ich 3 eingebe kommt falsch raus, obwohl 3 doch ein Teiler von 6 ist? Aber gebe ich 12 ein kommt true raus…aber 12 ist doch keiner Teiler von 6, sondern 6 ist ein Teiler von 12? Bringe ich gerade was durcheinander?

public static void main(String[] args){
         
         Zahl meinWert = new Zahl(3);
         // Fall 1
        boolean teiler1 = meinWert.teilstDu(6);
        System.out.println("3 ist Teiler von 6: "+ teiler1);
        // Fall 2
        boolean teiler2 = meinWert.teilstDu(7);
        System.out.println("3 ist Teiler von 7: "+ teiler2);

Du hast es auch so dastehen?
Habe es einfach mal von deinem letzten Beitrag kopiert und geändert wie es da stehen sollte.

PS: Du solltest natürlich auch die Variable ‘meinWert’ in der Klasse ‘Zahl’ ohne static erstellen.

Merke:
Instanzvariable/Objektvariable (bzw. -methode) = ohne static
Klassenvariable/-methode = mit static

Ja, genau so stand es bei mir und bei beidem kam False raus, jetzt habe ich es folgendermaßen geändert:

		 
		 Zahl meinWert = new Zahl(21);
		 
		// erster Testfall
		boolean teiler = meinWert.teilstDu(2);
		System.out.println("2 ist Teiler von 21: "+teiler);
		 
		// zweiter Testfall
		boolean teiler1 = meinWert.teilstDu(3);
		System.out.println("3 ist Teiler von 21: "+teiler1);```

Und beim ersten kommt false raus und beim 2. kommt true raus, was ja jetzt eigentlich dann richtig ist.

Wie gesagt, das static habe ich nun überall entfernt, außer aus der Main Methode

Merkst du was, wenn du das oben und unten mal vergleichst bzgl. der Teiler-Stellungen? :wink:
Schau dir auch deine Ausgaben an, ob da steht was wirklich gemacht wird…

PS: Da sieht man mal was copy&paste anrichtet :smiley:

ja, bei dem oberen war es genau falsch herum und das unten passt jetzt, wie es aussieht. :slight_smile:

Edit: Dann werde ich mich jetzt an den letzten Teil der Aufgabe dransetzten und herausfinden, was man noch so für Fehler machen kann, bei Fragen melde ich mich nochmal, aber vielen Dank erst einmal an alle, die so viel Geduld für mich aufgebracht haben :slight_smile:

*** Edit ***

*** Edit ***

Oh man :frowning: Ich werde mir jetzt als erstes neben den Uni Unterlagen noch ein Java Buch bestellen. Bin jetzt bei der Aufgabe mit dem suchtKgV. Wie ich das KgV berechne weiß ich auch

stepA = a;
		 stepB = b;
		 for(int i = 1; a != b; i++) {
			 if(a < b) 
				 a = a + stepA;
		   	 else if(a > b) 
		   		 b = b + stepB;
		 System.out.println(a + " " + "<>" + " " + b);```

Das ist ja erstmal allgemein, wie man das KgV ermittelt, das habe ich hinbekommen :D
Aber jetzt bin ich direkt wieder überfragt, wie bzw. wo ich dort jetzt meine Methoden unterbringen muss. Habe eben versucht dort mit "meinWert" zu arbeiten, dann will er aber gleich wieder alles zu Static machen. By The Way, ich möchte keinen kompletten Code, nur Ansätze, bzw Hilfestellungen :), damit ich es auch selber lernen und verstehen kann.

Habe versucht die Methoden so hier einzubringen:
``` int zahl1 = meinWert;
		 int zahl2 =  teilstDu();```

ob static oder nicht bei einem bestimmten Problem wird dir ein Java-Buch kaum erklären können,
auch sonst hast du alles aktuell wissenswerte wie Schleifen, if, Variablen, Modulo, Klassen und ein Objekt usw. anscheinend schon gesehen

natürlich hilft es immer auch andere Anwendungsbeispiele nachzuvollziehen, hauptsächlich ist es nun aber normale Arbeit,
sich hinter fehlenden Java-Wissen zu verstecken (manche gar: war 2 Wochen krank, Stoff nachholen usw.) ist verbreitet, aber davon nicht richtiger :wink:


was ist denn hier stepA, stepB, a und b? lokale Variablen (noch nicht mit Typ deklariert), Attribute der Klasse (wie int meinWert)?
vom Parameter andereZahl fragst du gar nichts ab,

der Code ist rudimentär, aber so entfernt dass kaum etwas mit anzufangen ist,
atme doch durch und arbeite Schritt für Schritt,

int x = andereZahl.getMeinWert();
wäre ein sinnvoller Anfang jeder Berechnungsmethode mit einem Zahl-Objekt als Parameter,
gar nicht schwer drauf zu kommen

wenn was static gemacht werden soll, dann weiter Widerstand aufrecht erhalten,
und evtl. hier im Forum genaue Zeile usw. nennen,
womöglich wieder mit neuen kompletten Klassencode

[QUOTE=hornhauer]
Habe versucht die Methoden so hier einzubringen:

		 int zahl2 =  teilstDu();
```[/QUOTE]
Die Methode `teilstDu();` gibt es doch so gar nicht! (ohne Parameter und mit Rückgabetyp int)
[Java Blog Buch : 04.03.03 Methoden](http://www.java-blog-buch.de/040303-methoden/)

Zu dem Rest hat SlaterB schon alles gesagt :)

Wo du auf Krankheit kommst, ich hätte hiermit auch früher angefangen, weil ich es Morgen Nachmittag abgeben muss, lag aber bis Gestern mit Grippe im Bett :smiley: Aber das spielt ja keine Rolle, bzw. soll keine Ausrede sein :wink:
Deswegen bin ich jetzt etwas im Stress und probiere den ganzen Tag rum.

int x = andereZahl.getMeinWert(); ist ja jetzt sozusagen, die erste Zahl?
Jetzt muss ich dann noch z. B. int y machen für den 2. Wert oder? Und dann die Schleife mit der if Verzweigung, wie ich eben schon hatte, ne?