Stehe auf dem Schlauch.

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Guten Morgen!

Ich stehe wie gesagt gerade auf dem Schlauch und habe nur eine ganz kurze Frage:
Was muss ich nochmal mit "nums" und "addinum" machen, damit die main-Methode sie als Variablen der anderen Klasse Numbers in der Methode createNumbers erkannt wird? 😳
Code:
class Lotto{

    public static void main(String[] args){

	System.out.println("Zahlen: ");
	for (int i = 0; i < 6; ++i){
	    System.out.print([u]nums[/u][i] + " ");
	}
	System.out.println();
	System.out.println("Zusatzzahl: " + [u]addinum)[/u];

    }
}
:autsch:
Danke..
 
Am besten legst du dir ein Objekt der Klasse Numbers an.

Über dieses Objekt kannst du dann mit Hilfe von Getter-Methoden wie getNums() und getAddinum() auf deine Zahlen/Felder zurgreigefen

PS
Code:
Numbers number = new Numbers();

number.getNums()[i];

number.getAddinum();

Code:
public int[] getNums(){
    return nums;
}

public int getAddinum(){
    return addinum;
}
 
Wie sieht denn die Klasse Numbers genau aus?
Du musst irgendwie auf die Klasse Numbers zugreifen. Entweder über statische Methoden oder Du erzeugst Dir ein Objekt:
Code:
Numbers numbers = new Numbers();
und holst Dir dann über Methoden, wie z.B. getAddInum Deine Nummern...
Mehr Code hilft manchmal mehr.
 
(wird ein Lotto-Programm)
Code:
public class Numbers {
	
public static int[] createNumbers() {	
	int count = 0;
	int[] nums = new int[6];

	while (count < 6){
		int num = (int)Math.random() * 49 + 1;

		boolean newNum = true;						//Zahlen nicht doppelt
		for (int i = 0; i < count; ++i){
			if (nums[i] == num){
				newNum = false;
			}
		}

		if (newNum){
			nums[count++] = num;
		}
	}
	
	nums = Sort.sort(nums);

	int addinum = 0;								//Zusatzzahl
	boolean newNum = false;

	while (!newNum){
		addinum = (int)Math.random() * 49 + 1;

		newNum = true;
		for (int i = 0; i < 6; ++i){
			if (nums[i] == addinum){
				newNum = false;
			}
		}
	}
	return nums;
}
}
Wo genau muss ich denn das Objekt erzeugen?
 
Hallo!


Bitte lese die Benutzung von Methoden von anderen Klassen nach!

siehe auch:

http://www.galileocomputing.de/openbook/javainsel6/javainsel_03_001.htm


Nun die Anwendung:

Änderungen an der Klasse Number:


Code:
public class Numbers {
   
public static int[] createNumbers() {   
   int count = 0;
   int[] nums = new int[6];

   while (count < 6){
      int num = (int)Math.random() * 49 + 1;

      boolean newNum = true;                  //Zahlen nicht doppelt
      for (int i = 0; i < count; ++i){
         if (nums[i] == num){
            newNum = false;
         }
      }

      if (newNum){
         nums[count++] = num;
      }
   }
   
   nums = Sort.sort(nums);

   return nums;
}

public static int createAdditionNumber(int[] nums) {
   int addinum = 0;                        //Zusatzzahl
   boolean newNum = false;

   while (!newNum){
      addinum = (int)Math.random() * 49 + 1;

      newNum = true;
      for (int i = 0; i < 6; ++i){
         if (nums[i] == addinum){
            newNum = false;
         }
      }
   }
   
   return addinum;
}
}


Und hier die Hauptklasse:

Code:
class Lotto{

    public static void main(String[] args){

   int[] numbers =  Number.createNumbers();

   System.out.println("Zahlen: ");
   for (int i = 0; i < 6; ++i){
       System.out.print(numbers[i] + " ");
   }
   System.out.println();
   System.out.println("Zusatzzahl: " + Numbers.createAdditionNumber(numbers) );

    }
}

:wink:
 
Danke schonmal! Allerdings geht es trotzdem noch nicht..
Code:
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	The method createNumbers() is undefined for the type Number
	The method createAdditionNumber(int[]) is undefined for the type Numbers

	at Lotto.main(Lotto.java:5)

Code:
class Lotto{

    public static void main(String[] args){

   int[] numbers =  Number.[u]createNumbers[/u]();

   System.out.println("Zahlen: ");
   for (int i = 0; i < 6; ++i){
       System.out.print(numbers[i] + " ");
   }
   System.out.println();
   System.out.println("Zusatzzahl: " + Numbers.[u]createAdditionNumber[/u](numbers) );

    }
}
(Das Unterstrichene ist auch in Eclipse rot unterstrichen.)
 
Ok, das mit dem Unterstreichen hat nicht geklappt.

Habe den kleinen Vertipper bei createNumberS() ...entdeckt, müsste jetzt gehen, allerdings tut die createAdditionNumber() immernoch nicht:
"The method createAdditionNumber(int[]) in the type Numbers is not applicable for the arguments ()".
 
Hallo!

Sorry ein kleiner Verschereiber:

Code:
class Lotto{

    public static void main(String[] args){

   int[] numbers =  Numbers.createNumbers(); // war vorher Number

   System.out.println("Zahlen: ");
   for (int i = 0; i < 6; ++i){
       System.out.print(numbers[i] + " ");
   }
   System.out.println();
   System.out.println("Zusatzzahl: " + Numbers.createAdditionNumbers(numbers) );

    }
}

Hast Du die Klasse Numbers entsprechent geändert?
Und nochmals das Projekt gecleant?




:bahnhof:
 
Aaaah, das hat noch gefehlt! :idea:

Okay, jetzt sollte es eigentlich laufen, aber das tuts irgendwie nicht.. Es rechnet und rechnet und es kommt kein Ergebnis. Warum das??
 
Hehe, schau Dir nochmal die While Schleife und den Inhalt in folgendem Fall an:

1. Du erzeugst eine neue Zufallsnummer (diese ist schon im Array vorhanden)
2. Du setzt newNum auf true
3. Er geht in die for Schleife
4. Irgendwann geht er in das if und setzt newNum auf false.
Und dann?
 
Hallo!

ich habe mir die Klasse Numbers noch einmal angesehen:

Code:
int num = (int)Math.random() * 49 + 1;

erzeugt immer die Zahl 1

richtig ist

Code:
int num = (int)(Math.random() * 49 + 1); // Bitte die Klammern beachten!


:wink:
 
Ok, aber damit ist trotzdem nicht der von mir geschilderte Fall behoben, dass er in einer Endlosschleife landet. Von daher ist es gar nicht schlecht, erstmal dabei zu bleiben, dass immer die gleiche Zahl erzeugt wird 🙂
 
Boah! Es geht!
Danke!
I love you!
Blumen an alle!
:applaus:

Es ist getan. Ich habe fertig! (Jede Wahrheit braucht einen Mutigen, der sie ausspricht. BILD, oh du Bibel..!)
 
NTB hat gesagt.:
Ok, aber damit ist trotzdem nicht der von mir geschilderte Fall behoben, dass er in einer Endlosschleife landet. Von daher ist es gar nicht schlecht, erstmal dabei zu bleiben, dass immer die gleiche Zahl erzeugt wird 🙂

Also das stimmt schon so.
Klappt jetzt prima. Der Fehler war nur noch das mit den Klammern.
 
ach stimmt, hast recht. irgendwie dachte ich, dass dann keine neue zufallszahl generiert wird.
 
Hab noch ne Frage:
Wie bekomm ich denn meine Zahlen umgekehrt sortiert?
Code:
public class Sort {

    public static int[] sort(int[] numbers){
    	int n = numbers.length;
    	int[] result = new int[n];

    	int max_pos = 0;
    	for (int i = 0; i < n; ++i){

    		int pos = 0;
    		while (pos < max_pos && numbers[i] > result[pos]){
    			pos++;
    		}

    		for (int j = max_pos; j > pos; --j){
    			result[j] = result[j - 1];
    		}
    		max_pos++;

    		result[pos] = numbers[i];
    	}

    	return result;
    }
}
Muss ich dazu in die while oder in die for danach eingreifen? Ich muss nämlich zugeben, den Algoritmus nicht 100%ig zu verstehen..
 
anstatt das Rad neu zu erfinden könntest Du das hier nutzen:
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Arrays.html#sort(T[],%20java.util.Comparator)
und dir dafür einen Comparator schreiben.
 
Danke für den Hinweis, aber ich möchte schon dabei bleiben. Es geht ja hauptsächlich drum, den Algoritmus besser zu verstehen
 
Hallo!

Ich habe die Klasse bei mir ausprobiert.

Die Sortierung erfolgt wie erwartet.

Im Ergebnisarray ist der kleinste int Wert bei Index 0 und der größte Wert bei Index (lenght - 1)?!

Welche Funktionalität hast Du denn erwartet?


???:L
 
Ja klar, er funktioniert so wie er soll, Zahlen von klein nach groß ausgeben. Jetzt möchte ich einfach die Zahlen in umgekehrter Reihenfolge sortieren, von groß nach klein.
 
Lauf das Array doch einfach rückwärts durch....

for(int i = array.length-1; i >= 0; i--)
{
System.out.println(array);
}
 
Anonymous hat gesagt.:
Muss ich dazu in die while oder in die for danach eingreifen? Ich muss nämlich zugeben, den Algoritmus nicht 100%ig zu verstehen..

Also ich versteh Dich nicht. Du wartest hier jetzt seit drei Stunden sehnsüchtig auf eine Antwort, denn sobald eine Antwort kommt, beantwortest Du sie wieder.
In der Zeit hättest Du erstens einfach mal die obige Frage durch ausprobieren beantworten könne und Dir zweitens auch den Algorithmus Schritt für Schritt anschauen können.

Nun gut, ich habe den Algorithmus auch auf anhieb nicht so ganz im Detail verstanden. Musste ich aber auch nicht: Ich habe mir einfach Deinen Code kopiert, ein Zeichen umgedreht und hatte das Array abwärts sortiert... das hat mit kopieren Deines Codes, erstellen eines kleinen Testarrays und ausführen etwa 60 Sekunden gedauert.

/Edit: Das soll jetzt nicht heissen, dass ich der Überchecker bin, sondern einfach nur, dass Du doch ganz offensichtlich schon die richtige Idee hattest und dann einfach nur noch kurz ausprobieren müsstest, stattdessen aber drei Stunden lang darauf wartest, dass sich jemand anders in Dein Problem hineindenkt. Und das versteh ich einfach nicht...
 
Tut mir leid, wenn ich zu dumm bin, aber ich habe das richtige Zeichen wohl noch nicht bekommen.
Und um mich mal zu rechtfertigen, wann und wie oft ich hier reinschaue: Ich mache auch noch andere Dinge nebenher und aktualisiere einfach meinen Java-Foren-Tab immer mal wieder.
 
auf und ab

Code:
while (pos < max_pos && numbers[i] > result[pos])


Code:
while (pos < max_pos && numbers[i] < result[pos])
 
Dein Sortierungsalgorithmus funktioniert folgendermassen:

erst wird ein result-array erzeugt.
dann wird die erste/nächste zahl aus dem numbers-array genommen, und in der while-schleife geschaut, an welcher stelle sie in dem result array stehen müsste.

daraufhin werden, wenn nötig, in der for-schleife alle zahlen im result-array soweit nach unten/oben verschoben, bis die aktuelle zahl an der entsprechenden stelle eingefügt werden kann.


übertragen kann man sich das vielleicht wie einen stapel t-shirts vorstellen, der nach farben sortiert werden soll:
ich nehme von meinem originalstapel das erste t-shirt und lege es auf den neuen stapel. dann nehme ich das zweite und lege es nach sortierreihenfolge oben oder unten auf den neuen stapel.
die nächsten t-shirts schiebe ich dann an der nach Sortierung entsprechenden Stelle in den Stapel rein. Angenommen ich habe auf dem neuen Stapel jetzt 7 T-Shirts liegen, dann suche ich die Stelle, wo mein aktuelles T-Shirt reinpasst und schiebe es da auch rein. Unten drunter sind immer noch die gleichen T-Shirts, aber der ganze Stapel wird um ein T-Shirt nach oben geschoben.


/Edit:
Ich habe mir das einfach im Debugger von Eclipse angeschaut. Einen Breakpoint am Anfang der Methode setzen und das Result-Array aufgeklappt. Dann Schritt für Schritt mit F6 ausgeführt und geschaut, was passiert. Dazu den Code hinterher ein bischen anschauen und eins und eins zusammenzählen.
Besonders performant ist dieser Algorithmus nicht. Ich bin jetzt kein Mathespezialist, aber ich habe das Gefühl, dass selbst ein Bubblesort da im Mittel schneller sein müsste.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben