Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
vermutlich ist es recht simpel.. allerdings bekomme ich es einfach nicht hin. Wie schon geschrieben, muss ich eine Variable aus einer Private-Methode in eine andere Klasse bekommen.. und von dort wieder in die alte Klasse in eine andere Methode zurück bekommen..
Sieht in etwas so aus..
Java:
class einlesen{
public static void main(String[] args)
{
einlesen();
//hier muesste jetzt noch eine Ausgabe hin..:)
}
private void einlesen()
{
Veraendern veraendern= new Veraendern();
int zahl = System.in.readline("Geben sie eine Zahl ein");
}
veraendern.gibZahlZurueck(zahl);
}
und die zweite Klasse
Java:
class Veraendern
{
public int gibZahlZurueck(int zZahl)
{
return zZahl
}
}
Vielen dank schonmal.. vielleicht kann man es auch Allgemein erklären und nicht an dem Beispiel danke
muss ich eine Variable aus einer Private-Methode in eine andere Klasse bekommen.. und von dort wieder in die alte Klasse in eine andere Methode zurück bekommen..
Ähm ich verstehe dein Problem nicht ganz. Folgendes Codebeispiel sollte dein Problem aber lösen. Wenn du der Methode einlesen einen Rückgabetyp gibts, kannst du den Wert direkt mit System.out.println() ausgeben lassen.
Java:
class einlesen{
public static void main(String[] args)
{
einlesen();
System.out.println(einlesen());
}
private int einlesen() {
Veraendern veraendern= new Veraendern();
int zahl = System.in.readline("Geben sie eine Zahl ein");
return veraendern.gibZahlZurueck(zahl);
}
}
Wozu.. weiss ich auch nicht.. so steht es in der Aufgabe.. und ich verzweifel daran..
Ach was ich vergessen habe.. das veraendern.gibZahlZurueck(zZahl) steht noch in einer anderen private methode..
Java:
class einlesen{
public static void main(String[] args)
{
einlesen();
//hier muesste jetzt noch eine Ausgabe hin..:)
}
private void einlesen()
{
Veraendern veraendern= new Veraendern();
int zahl = System.in.readline("Geben sie eine Zahl ein");
}
private void blub()
{
veraendern.gibZahlZurueck(zahl);
}
}
Das Ganze wäre dann wieder zu lösen wenn du blub den Rückgabetyp int gibts, ein return vor den Ausdruck schreibst und das ganze dann ausgibst. Oder machs wies der Vorposter schon gesagt hat, poste einfach mal die Aufgabenstellung^^
Hier die Aufgabenstellung + meine 4 Klassen
Dabei geht es mir um gibAnzahlZuTippenderZahlen(Zahlen) in [Tipp] / konfigurationsInteraktion anzahlZuTippenderZahlen in [Lottospiel]...
Also wenn ich das jetzt richtig gesehen habe, sollte dein ursprüngliches Beispiel so aussehen. Bedenke dass die Konfigurations-Methode in der Aufgabe zwei Parameter braucht. Die Variablen / Methodennamen stimmen vielleicht nicht zu 100% überein, da ichs nur überflogen bin Generell finde ich deutsche Namen übel in der Programmierung.
Java:
public class Lottospiel{
private Tip tip;
public static void main(String[] args){
new Lottospiel();
}
public Lottospiel(){
tip = new Tip();
konfigurationsInteraktion();
}
private void konfigurationsInteraktion(){
int anzahl = 6; // normalerweise Benutzereingabe
int maxzahl = 49; // normalerweise Benutzereingage
tip.setzeModus(anzahl, maxzahl);
}
}
public class Tip{
private int anzahlZuTippenderZahlen;
private int groessteZahl;
public void setzeModus(int anzahl, int max){
anzahlZuTippenderZahlen = anzahl;
groessteZahl = max;
}
public int getAnzahlZuTippenderZahlen(){
return anzahlZuTippenderZahlen;
}
}
Also wenn ich das jetzt richtig gesehen habe, sollte dein ursprüngliches Beispiel so aussehen. Bedenke dass die Konfigurations-Methode in der Aufgabe zwei Parameter braucht. Die Variablen / Methodennamen stimmen vielleicht nicht zu 100% überein, da ichs nur überflogen bin Generell finde ich deutsche Namen übel in der Programmierung.
Java:
public class Lottospiel{
private Tip tip;
public static void main(String[] args){
new Lottospiel(); // Quasi Punkt 1?
}
public Lottospiel(){ /* Das verstehe ich nicht,;( du erzeugst Quasi jedesmal ein neues Lottospiel in der main und rufst aber in der der Methode Lottospiel die anderen methoden auf? --Quasi Punkt2??*/
tip = new Tip(); // Neues Objekt tip wird erstellt?
konfigurationsInteraktion();
//ziehung = new Ziehung(); ??!
}
private void konfigurationsInteraktion(){
int anzahl = 6; // normalerweise Benutzereingabe
int maxzahl = 49; // normalerweise Benutzereingage
tip.setzeModus(anzahl, maxzahl);
}
}
public class Tip{
private int anzahlZuTippenderZahlen;
private int groessteZahl;
public void setzeModus(int anzahl, int max){
anzahlZuTippenderZahlen = anzahl;
groessteZahl = max;
}
public int getAnzahlZuTippenderZahlen(){
return anzahlZuTippenderZahlen;
}
}
Ich schreib das mal in zwei Antworten, da es sonst für mich zu unübersichtlich wird.
Java:
class einlesen{
public static void main(String[] args)
{
einlesen();
//hier muesste jetzt noch eine Ausgabe hin..:)
}
private void einlesen()
{
Veraendern veraendern= new Veraendern();
int zahl = System.in.readline("Geben sie eine Zahl ein");
}
private void blub()
{
veraendern.gibZahlZurueck(zahl);
}
}
Hier erzeugst du *jedesmal* wenn du einlesen aufrufst ein neues Objekt vom Typ Veraendern und übergibst dem Objekt
eine Zahl. Nachdem die Methode verlassen wird, ist sowohl deine Zahl, wie auch das eben erzeugt Objekt ungültig.
In blub versuchst du nun zum einen die Variable zahl (die der Methode weder bekannt gemacht worden ist, noch eine Klassenvariable ist) zu verwenden, und das mit einem Objekt das ebenfalls nicht bekannt ist (da es nur in einlesen() existierte).
Das war dein Fehler *g*
Entsprechend wurde auch nie irgendwo etwas gespeichert um später darauf zugreifen zu können.
>> new Lottospiel(); // Quasi Punkt 1?
Ja, ein neues Lottospiel-Objekt wird hier erzeugt
>> public Lottospiel(){ /* Das verstehe ich nicht,;( du erzeugst Quasi jedesmal ein neues Lottospiel in der main und rufst aber in der der Methode Lottospiel die anderen methoden auf? --Quasi Punkt2??*/
Nein, ich erzeuge genau *ein einziges* Lottospiel-Objekt, denn mehr braucht es nicht. Alles andere wird dann von diesem Objekt aus erledigt.
>>tip = new Tip(); // Neues Objekt tip wird erstellt?
konfigurationsInteraktion();
//ziehung = new Ziehung(); ??!
Denke, habs mir jetzt nicht nochmal angeschaut, aber im Konstruktor erstellt man i.d.R. das was man benötigt. Also ja...
Gegensatz:
Ich erstelle von allem genau *ein* Objekt, und fülle ihre Eigenschaften mit Werten. Du hast in jeder Methode ein neues Objekt erstellt, eine Methode aufgerufen und das Objekt beim Verlassen der Methode wieder weggeschmissen.
Naja, wenn du n konkretes Problem hast, kannst ja weiter fragen.
Wollte nur nicht das ganze Programm schreiben (auch wenn ich sagen muss dass 3 Wochen Zeit sehr großzügig ist *g*) sondern vielmehr dein Problem lösen, bzw. den Weg zeigen, denn es fehlt imho ziemlich an der Basis.
das gibt keinen Sinn. Also die Abfrage. Du vergleichst die Anzahl einzugebener Zahlen mit der Größten erlaubten Nummer...
int[] lottozahlen hast du noch keine größe zugewiesen. muss in der konfig-methode stehen:
lottozahlen = new Int[anzahlZuTippenderZahlen];
dann kannst du es erst nutzen.
Ansonsten, was heisst, es wird keine Zahl ausgegeben?
Fehlermeldungen genau lesen, die sagen i.d.R. genau was kaputt ist *g* bzw. wenn das nicht hilft sie auf jedenfall hier posten.
Methode hast dann ist die wie der name schon sagt Private , also nichts was nicht in derselben Klasse ist kennt diese Methode. Wenndu nu von der gleichen klasse aus zugreifen willst könntest du einfach die Variable aufrufen. Wenn du aus einer anderen Klasse die Variable auslesen willst dann gehstu einfach hin und machst eine Getter Methode. Diese gibt den Wert zurück , aber die andere Klasse hat keinen direkten zugriff auf die variable
habe nochmal ein Problem..
und zwar muss ich schauen, dass er in der Klasse Ziehung nicht mehrmals die selbe randomzahl zieht... ich habe schon versucht es irgendwie zu regeln.. allerdings klappt es nicht so wie ich mir das Vorstelle..
Java:
import java.util.Random;
import unidue.ecg.java.ss2010.graphic.io.GraphicIO;
public class Ziehung
{
private int[] lottoZahlen;
private int anzahlZuZiehenderZahlen;
private int groessteZahl;
public boolean setzeModus(int zuTippen, int groessteNummer)
{
anzahlZuZiehenderZahlen= zuTippen;
groessteZahl=groessteNummer;
lottoZahlen= new int [anzahlZuZiehenderZahlen];
if (zuTippen<groessteZahl)
{
return true;
}
else
{
return false;
}
}
public int[] neueZiehung()
{
Random zufall = new Random();
for (int k = 0; k <anzahlZuZiehenderZahlen; k++)
{
lottoZahlen[k]= zufall.nextInt(groessteZahl);
if (zahlBereitsGezogen(k)==true)
{
GraphicIO.print("Kontrolle"); //Wenn die zahl schon gezogen wurde, soll er k um eins verringern, damit er nochmal zieht...
k--;
}
else
{
//hier muss noch irgendwas hin;) nur was:D
}
}
return lottoZahlen;
}
public int[] gibGezogeneZahlen()
{
return lottoZahlen;
}
private boolean zahlBereitsGezogen(int zahl)
{
for (int p:lottoZahlen)
{
if (zahl == lottoZahlen[p])
{
return true; //Hier schaue ich ja, ob die Zahl schon gezogen wurde
}
else
{
return false;
}
}
return false;
}
}
Hier is die lottoklasse: Ob sie wirklich notwendig ist um den fehler zu finden bezweifel ich.
Lieben dank.. ;(
Java:
public class Lottospiel
{
private Tipp tipp;
private Ziehung ziehung;
private Auswertung auswertung;
public static void main(String[] args)
{
new Lottospiel();
}
public Lottospiel()
{
tipp = new Tipp();
ziehung = new Ziehung();
auswertung = new Auswertung();
konfigurationsInteraktion();
tippInteraktion();
ziehungsInteraktion();
auswertungsInteraktion();
}
private void konfigurationsInteraktion()
{
GraphicIO.output("Hallo Spieler");
int anzahlZuTippenderZahlen=GraphicIO.readInt("Geben Sie x von x aus y ein");
int groessteZahl=GraphicIO.readInt("Geben sie y von x aus y ein");
if(anzahlZuTippenderZahlen>groessteZahl){
GraphicIO.print("Groesste zu tippende Zahl kleiner als die Anzahl zu tippender Zahlen");
konfigurationsInteraktion();
}
tipp.setzeModus(anzahlZuTippenderZahlen, groessteZahl);
ziehung.setzeModus(anzahlZuTippenderZahlen, groessteZahl);
}
private void tippInteraktion()
{
int position=1;
for (int i=1;i<=tipp.gibAnzahlZuTippenderZahlen();i++)
{
int zahl=GraphicIO.readInt("Geben sie die " + position + " Zahl ein!");
if (tipp.zahlGueltig(zahl)==true)
{
tipp.tippeZahl(zahl, position);
position++;
}
else
{
GraphicIO.output("Zahl ist ungültig");
i--;
}
}
for (int k : tipp.gibGetippteZahlen())
{
GraphicIO.output(k + " ");
}
}
/* Hier werden die Zahlen ausgegeben, allerdings denke ich ist es ueberfluessig die lottozahl klasse zu posten */
private void ziehungsInteraktion()
{
ziehung.neueZiehung();
for(int h : ziehung.gibGezogeneZahlen())
{
GraphicIO.output(h + " ");
}
}
private void auswertungsInteraktion()
{
auswertung.werteAus(tipp, ziehung);
GraphicIO.print("Sie haben: " + auswertung.treffer + " richtige!" );
}
}
Du könntest eine Liste mit den Zahlen 1-49 machen. Daraus ziehst du jetzt zufällig ein Element. Wurde eins gezogen, nimmst du es aus der Liste. Wenn er jetzt ein Element aus der Liste ziehen will, dass dort nicht mehr vorhanden ist, soll er einfach neu ziehen.
habe nochmal ein Problem..
und zwar muss ich schauen, dass er in der Klasse Ziehung nicht mehrmals die selbe randomzahl zieht... ich habe schon versucht es irgendwie zu regeln.. allerdings klappt es nicht so wie ich mir das Vorstelle..
Lustigerweise stehe ich gerade vor dem gleichen Problem wie mein Komilitone und versuchs mal näher zu beschreiben:
Durch die Methode neueZiehung() wird das vorhandene Array lottoZahlen nach und nach mit Zufallszahlen (java.util.Random -> nextInt) gefüllt. Das ganze läuft auch soweit.
Nun sollen wir mit der Methode zahlGueltig(int zahl) prüfen, ob die Zufallszahl schon im Array lottoZahlen vorhanden ist und gegebenenfalls solange weiterziehen lassen, bis keine Zahl doppelt vorkommt. Beide Methoden befinden sich in der Klasse Ziehung
Nun mal zu meinem Code:
neueZiehung();
Java:
public int[] neueZiehung () {
Random random = new Random();
for (int i = 0; i < anzahlZuZiehenderZahlen; i++){
while (zahlGueltig(lottoZahlen[i])== false) {
lottoZahlen[i] = random.nextInt(groessteZahl+1);
}
}
return lottoZahlen;
}
und hier die zahlGueltig(int zahl)
Java:
private boolean zahlGueltig (int zahl) {
for (int x : lottoZahlen) {
if (zahl == x) {
return false;
}
}
return true;
}
Nehme ich die while-schleife in der neueZiehung() raus und befülle die jewelige Position einfach per
Java:
lottoZahlen[i] = random.nextInt(groessteZahl+1);
läuft alles wunderbar, nur dass natürlich auch Zahlen doppelt gezogen werden können. Mit While-Schleife werden gar keine gezogenen Zahlen ausgeliefert (daher denke ich dass das Array aus welchem Grund auch immer leer bleibt). Ich sehe meinen Denkfehler nicht und bitte um Hilfe.
Jetzt noch eine Antwort hierzu: Du überprüfst ja in zahlGültig immer eine Zahl, die schon im Array steht, daher wird Dir das immer false liefern und nie weiter gehen. Also eine Zahl wählen, überprüfen und erst danach in das Array legen.
Ok. Ich habe es jetzt mal korrigiert. ich speichere die zufallszahl zwischen, dann kommt die while-schleife, die mit der methode zahlGueltig überprüft, ob die zufallszahl schon im array ist und im zweifelsfall weiterziehen lässt. danach folgt dann erst die zuweisung der zufallszahl ins array.
ich habe das nun schon einige mal durchlaufen lassen und nie wurde eine zahl doppelt gezogen. trotzdem wollte ich mal fragen, ob jemand von euch noch mal kurz drüber gucken kann, ob der gedankengang und die ausführung nun so korrekt sind, denn dummerweise lässt sich das ja durch testläufe nicht absolut sagen.
neueZiehung():
Java:
public int[] neueZiehung () {
Random random = new Random();
for (int i = 0; i < anzahlZuZiehenderZahlen; i++){
int zufall = random.nextInt(groessteZahl+1);
while (zahlGueltig(zufall) == false)
{
zufall = random.nextInt(groessteZahl+1);
}
lottoZahlen[i] = zufall;
}
return lottoZahlen;
}
zahlGueltig(int zahl):
Java:
private boolean zahlGueltig (int zahl) {
for (int i = 0; i < anzahlZuZiehenderZahlen; i++ ) {
if (zahl == lottoZahlen[i]) {
return false;
}
}
return true;
}
p.s.: die variable anzahlZuZiehenderZahlen entspricht "lottoZahlen.length - 1"
Sieht so weit gut und korrekt aus. Kannst ja mal groessteZahl gleich anzahlZuZiehenderZahlen setzen. Das würde die Wahrscheinlichkeit fehlerhaftes Verhalten zu erzeugen erhöhen, oder gar kleiner setzen, dann sollte es nicht terminieren. Ist aber imo unnötig.
2 Sachen noch:
[Java]while (zahlGueltig(zufall) == false)[/Java] <=> [Java]while (!zahlGueltig(zufall))[/Java]
und [Java]for (int i = 0; i < anzahlZuZiehenderZahlen; i++ ) {
if (zahl == lottoZahlen)
...}[/Java] <=> [Java]for (int eintrag : lottoZahlen) {
if(zahl == eintrag)
...}[/code]
Die "Abkürzungen" für die Schleife hab ich mittlerweile auch schon drinnen, aber danke nochmal für den Hinweis
und groessteZahl und anzahlZuZiehenderZahlen sind nie gleichgroß. Die groessteZahl bleibt auch immer größer als die anzahlZuZiehenderZahlen. Das wird durch eine andere Methode überprüft und evtl. vorher abgefangen. sonst würde das ganze spiel ja keinen sinn machen^^
Danke nochmal an alle, die mir so schnell und gut geholfen haben