1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

[Anfänger] Arg Array...Ich brauche Hilfe

  • CrazyInu
  • 7. Juni 2006 um 19:04
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • CrazyInu
    Punkte
    45
    Beiträge
    8
    • 7. Juni 2006 um 19:04
    • #1
    Zitat

    Schreib ein Programm, das 100 Mal eine Zufallszahl zwischen 1 und 100 würfelt. Gib alle 100 Zahlen aus (wobei jede Zahl darf nur 1 Mal vorkommen)



    Helft mir bitte dieses Beispiel zu lösen :rolleyes: Danke im Voraus :)

  • Wings-of-Glory
    Punkte
    8.305
    Beiträge
    1.573
    • 7. Juni 2006 um 19:12
    • #2

    gern, aber... wo liegt dein problem?

  • CrazyInu
    Punkte
    45
    Beiträge
    8
    • 7. Juni 2006 um 19:25
    • #3
    Zitat

    wobei jede Zahl darf nur 1 Mal vorkommen



    das ist das Problem :(

  • Wings-of-Glory
    Punkte
    8.305
    Beiträge
    1.573
    • 7. Juni 2006 um 19:29
    • #4

    speichere die zahlen, die gekommen sind, in ein Array. dann prüfst du, ob deine gezogene zahl nicht schon gekommen ist. falls doch, läßt du nochmal eine zufallszahl ziehen. :)

  • CrazyInu
    Punkte
    45
    Beiträge
    8
    • 7. Juni 2006 um 19:31
    • #5

    ja, logisch denken kann ich auch :) leider weiß ich nicht, wie man das anstellen soll :|

  • Wings-of-Glory
    Punkte
    8.305
    Beiträge
    1.573
    • 7. Juni 2006 um 19:39
    • #6

    weißt du

    * was ein Array ist,
    * wie man werte zuweist und vergleicht
    * wie schleifen funktionieren?

  • CrazyInu
    Punkte
    45
    Beiträge
    8
    • 7. Juni 2006 um 19:48
    • #7

    Werte von zwei Arrays mit einander vergleichen hab ich noch nicht gelernt.

    das ist alles, was ich bis jetzt geschrieben hab

    Zitat

    public class test {
    public static void main(String[] args) {
    int [] a = new int[100];
    Random zahl = new Random();
    for(int i=0; i<a.length; i++){
    a[i] = 1+zahl.nextInt(100);
    System.out.println(a);
    }
    }
    }

    Alles anzeigen



    wie prüfe ich denn eine Zahl, um zu schauen ob sie schon gekommen ist?

  • Wings-of-Glory
    Punkte
    8.305
    Beiträge
    1.573
    • 7. Juni 2006 um 20:56
    • #8
    Zitat von CrazyInu

    Werte von zwei Arrays mit einander vergleichen hab ich noch nicht gelernt.

    vergleiche führst du mit dem == operator durch:

    Code
    int [] a = new int[1];
    a [0] = 10; a [1] = 4;
    int b = 4;
    
    
    for (int i=0;i<a.length<i++) {
    
    
    if (b==a[1]) {
    System.out.println("a['+i+'] == " + b);
    }
    
    
    }
    Alles anzeigen
    Zitat



    das ist alles, was ich bis jetzt geschrieben hab

    schaut gut aus.

    ich hab es etwas umgeschrieben.
    falls etwas unklar sein sollte, frag ruhig.

    Java
    import java.util.*;
    
    
    public class test {
    	public static void main(String[] args) {
    		int [] a = new int[100];
    		Random zahl = new Random();
    		a[0] = 1+zahl.nextInt(100); // erster zufallswert wird a zugewiesen.
    									// da es d. erste zahl ist, ist d. gezogene zahl einzigartig
    		int b=0;
    		int count=1; // zählt wieviele werte du im array a schon gespeichert hast.
    		for(int i=1; i<a.length; i++){ // läuft das array a.length mal durch. i ist eins, da du schon den ersten wert vor der schleife zugwieesen hast.
    			boolean flag = false; // flag wird true, wenn die gezogene zahl schon vorhanden ist
    			do  { // durchlaufe diese schleife, solange flag true ist. dh. d. zahl wurde schon gezogen
    				b=1+zahl.nextInt(100); // b ist ein zwischenspeicher für d. neu-gezogene zahl.
    				for(int j=0; j<count; j++){
    //					System.out.println("arge schleife");
    					if (a[j] == b) { // wenn d. zahl schon gezogen wurde
    						flag=true; // setze flag auf true
    						System.out.println("zahl " + b + " bereits vorhanden. ziehe neue zahl");
    
    					}
    				} 
    			} while(flag); // eine neue zahl wurde gefunden, die sicher nur 1x vorhanden ist
    			a[i]=b; // weise zahl b dem array an der stelle i zu
    			count++; // erhöhe counter um 1.
    			System.out.println(a[i]);
    		}
    	}
    }
    Alles anzeigen
  • CrazyInu
    Punkte
    45
    Beiträge
    8
    • 7. Juni 2006 um 21:09
    • #9

    bei zeile 5 erkennt java die variable i nicht, weil du i vorher noch nicht definiert hast. Soll ich eine for-Schleife davor schreiben? Darf man das überhaupt?

    übrigens, vielen Dank für deine Geduld und Hilfe :)

  • CrazyInu
    Punkte
    45
    Beiträge
    8
    • 7. Juni 2006 um 21:23
    • #10

    Der Vergleich-Code funktioniert :)

    Zitat

    public class test {
    public static void main(String[] args) {
    int [] a = new int[2];
    a[0] = 10;
    a[1] = 4;
    int b = 4;
    for (int i=0; i<a.length; i++) {
    if (b == a[i]) {
    System.out.println("a['+i+'] == " + b);
    }
    } }}

    Alles anzeigen



    der andere leider nicht :( es zeigt zwar keinen fehler an, aber es gibt auch nichts gescheites raus

  • Wings-of-Glory
    Punkte
    8.305
    Beiträge
    1.573
    • 7. Juni 2006 um 23:09
    • #11
    Zitat von CrazyInu

    bei zeile 5 erkennt java die variable i nicht, weil du i vorher noch nicht definiert hast.


    entschuldigung. das war ein typischer copy&paste fehler. ersetz das i durch 0, ich habs oben schon ausgebessert.

    Zitat

    Soll ich eine for-Schleife davor schreiben? Darf man das überhaupt?


    darfst du zwar, aber nur wegen EINEM wert zahlt sich das nicht aus.

    Zitat

    übrigens, vielen Dank für deine Geduld und Hilfe :)

    bitte gerne. ich hab morgen prüfung und bin daher heute unregelmäßig online.


    Zitat von CrazyInu

    Der Vergleich-Code funktioniert :)

    der andere leider nicht :( es zeigt zwar keinen fehler an, aber es gibt auch nichts gescheites raus

    das kommt daher, dass kein fall definiert wurde, falls der wert doch gleich ist. es fehlt ein else und ein System.out.println

    Code
    public class test {
    	public static void main(String[] args) {
    		int [] a = new int[2];
    		a[0] = 10;
    		a[1] = 4;
    		int b = 4;
    		for (int i=0; i<a.length; i++) {
    			if (b == a[i]) {
    				System.out.println("a['+i+'] == " + b);
    			}
    			else {
    				System.out.println("a['+i+'] != " + b);
    			}
    		}
    	}
    }
    Alles anzeigen
  • Wings-of-Glory
    Punkte
    8.305
    Beiträge
    1.573
    • 7. Juni 2006 um 23:16
    • #12
    Zitat von CrazyInu

    Der Vergleich-Code funktioniert :)

    der andere leider nicht :( es zeigt zwar keinen fehler an, aber es gibt auch nichts gescheites raus

    ich glaube, ich hab dich missverstanden. welcher code geht nicht?

    edit: ich hatte paar schlampigkeitsfehler im programm. jetzt sollte es gehen. blöderweise wiederholen sich d. zufallszahlen sehr häufig, wodurch quasi eine "endlosschleife entsteht. da hilft nur mehr STRG+C

  • CrazyInu
    Punkte
    45
    Beiträge
    8
    • 15. Juni 2006 um 18:42
    • #13

    Der Code, den du für mich geschrieben hast, passt leider nicht zu meinem kleinen Programm. Also habe ich mich bei ein paar Klassenkameraden erkundigt und sie haben mir dann erklärt, wie es geht. Folgende Codezeilen sollen richtig sein, allerdings stimmt irgendwas nicht mit Ausgabe.

    Code
    public class einmalVorkommen {
      public static void main(String[] args) {
        boolean [] b = new boolean[11];
        Random r = new Random();
    
        for(int i=0; i<11; i++){
          int zahl = 1+r.nextInt(10);
        while(b[zahl]){
          zahl = 1+r.nextInt(10);
        }
        if(b[zahl] = true){
          System.out.println(b);
        }
         }
      }
    }
    Alles anzeigen



    weißt du vielleicht woran es liegt?

    Folgendes kommt raus: [Z@10b62c9

  • JohnFoo
    Punkte
    4.231
    Beiträge
    761
    • 15. Juni 2006 um 19:17
    • #14
    Zitat von CrazyInu
    Code
    public class einmalVorkommen {
      public static void main(String[] args) {
        boolean [] b = new boolean[11];
        Random r = new Random();
    
        for(int i=0; i<11; i++){
          int zahl = 1+r.nextInt(10);
        while(b[zahl]){
          zahl = 1+r.nextInt(10);
        }
        if(b[zahl] = true){
          System.out.println(b);
        }
         }
      }
    }
    Alles anzeigen


    Na des schaut ma reichlich komisch aus .. vor allem "b[zahl] = true" (das ist eine Zuweisung, keine Überprüfung), danach gibst du nicht ein Element aus (b[zahl]) sondern das ganze Array b ..

  • CrazyInu
    Punkte
    45
    Beiträge
    8
    • 15. Juni 2006 um 19:26
    • #15

    bei while(b[zahl]) wird die Zahl überprüft, ob es bereits gewürfelt ist.

    Zitat

    danach gibst du nicht ein Element aus (b[zahl]) sondern das ganze Array b ..



    ich will das ganze Array mit 10 Elemente, spricht 10 Zahlen ausgeben

  • JohnFoo
    Punkte
    4.231
    Beiträge
    761
    • 15. Juni 2006 um 19:30
    • #16

    Fehlerhaften Code mag' ich nicht .. hab's neu geschrieben:

    Code
    public class UniqueRandomNumbers {
    
    
    	public static void main(String[] args) {
    		// array mit 100 elementen erstellen
    		int[] numbers = new int[100];
    		// array mit zahlen füllen. index läuft von 0 bis 99 durch i + 1 wird
    		// das array mit zahlen von 1 bis 100 befüllt
    		for (int i = 0; i < numbers.length; i++) {
    			numbers[i] = i + 1;
    		}
    
    
    		// nun die ausgabe .. in folgender variable merken wir uns wieviel
    		// zahlen schon ausgegeben worden sind
    		int numbersWritten = 0;
    
    
    		// so lange wir nicht 100 zahlen ausgegeben haben (also alle)
    		// wiederholen wir folgenden vorgang:
    		while (numbersWritten < 100) {
    			// zuerst wird eine zufallsposition im index-bereich des arrays
    			// bestimmt:
    			int randomIndex = (int) (Math.random() * numbers.length);
    			if (numbers[randomIndex] != 0) {
    				// falls der wert an dieser stelle nicht 0 ist wird sie
    				// ausgegeben ..
    				System.out.print(numbers[randomIndex] + " ");
    				// .. und auf 0 gesetzt
    				numbers[randomIndex] = 0;
    				// eine zahl mehr wurde geschrieben, der zähler wird erhöht
    				numbersWritten++;
    
    
    				// nur für die optik: alle 10 ausgegebenen zahlen wird ein
    				// zeilenumbruch eingefügt
    				if (numbersWritten % 10 == 0) {
    					System.out.println();
    				}
    			}
    		}
    	}
    }
    Alles anzeigen

    Der Code funkt aber nur wenn das Array mindestens so groß ist wie die Anzahl der Zahlen die ausgegeben werden sollen.

    Die Sache könnte man noch auf etliche andere Arten lösen, das is eben eine davon ..

  • Wings-of-Glory
    Punkte
    8.305
    Beiträge
    1.573
    • 15. Juni 2006 um 19:37
    • #17

    und wo behandelst du den fall, dass die gezogene zahl schon einmal gezogen wurde?
    überseh ich da was?
    edit: schon gefunden! :distur:

  • leadpen
    Punkte
    782
    Beiträge
    142
    • 8. Juli 2006 um 20:27
    • #18

    Sorry, kommt ein bisschen spät; hier meine Minimal-Version (konnte einfach nicht die Finger davon lassen ;) )

    Code
    public class makeRandom {
    
    
    
    
      public static void main(String[] args) {
    
    
        int counter = 0;
        int zahl = 0;
        int[] gezogeneNummern = new int[101];
    
    
        for (int i = 0; i < 101; i++){                         //Initialisierung des gesamten Array-Inhalts mit 0.
          gezogeneNummern[i] = 0;
        }
    
    
        while (counter < 100) {                                 //Solange noch nicht 100 verschiedene Zahlen gefunden wurden
          zahl = 1 + (int)(Math.random() * (100));              //Ziehe Zahl zwischen 1 und 100.
          if (gezogeneNummern[zahl] == 0) {                     //Falls Zahl vorher noch nicht gezogen
            gezogeneNummern[zahl] = 1;                          //Markiere Zahl als gezogen.
            System.out.println("Gefundene Zahl " + counter + " : " + zahl);
            counter++;                                          //Erhöhe den Counter um 1.
          }
        }
      }
    Alles anzeigen
  • sauzachn
    Punkte
    3.101
    Beiträge
    606
    • 8. Juli 2006 um 21:20
    • #19
    Zitat von leadpen
    Code
    counter++;            //Erhöhe den Counter um 1.


    ROFL - ein Klassiker.

  • leadpen
    Punkte
    782
    Beiträge
    142
    • 8. Juli 2006 um 22:08
    • #20
    Zitat von sauzachn

    ROFL - ein Klassiker.

    Was willst denn hören :) - inkrementieren, i = i + 1 ...

  1. Datenschutzerklärung
  2. Impressum