Sandhaufenmodell

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!

Ich habe ein kleines Sandhaufenmodell geschrieben, aber es funktioniert nicht ganz wie es sollte:
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Sandhaufenmodell {
	
	static int sizeX,sizeY,maxGrains,numberOfGrains,toNumber,yfall,zfall;
	static int array[][];
    static int time=0;
    static int x = 10;
	
	public static void main(String[] args) throws NumberFormatException, IOException 
	{
		// TODO Auto-generated method stub
		BufferedReader dIn = new BufferedReader(
				new InputStreamReader(System.in));

		System.out.println("Bitte geben Sie Breite und Höhe ein:");
		sizeX = Integer.parseInt(dIn.readLine());
		sizeY = Integer.parseInt(dIn.readLine());
		System.out.println("Bitte geben Sie das max. Fassungsvermögen einer Zelle ein ");
		maxGrains = Integer.parseInt(dIn.readLine());
		System.out.println("Wieviele Sandkörner wollen sie max. auf einmal eingeben? ");
		toNumber = Integer.parseInt(dIn.readLine());
		sandHaufenmodell();
		for (int i=0; i<100; i++){//100 mal Schleife
			kornPlazierung();
			verteilung();	
			ausgabe();
			}
		}
	private static void sandHaufenmodell() {
		array = new int[sizeX][sizeY];
	}
	
	private static void kornPlazierung() {
		numberOfGrains = (int) (Math.random() * (toNumber)+1);
    	yfall= (int) (Math.random() * (sizeX));
    	zfall= (int) (Math.random() * (sizeY));
    	for (int i=0; i<1; i++){//100 mal Schleife
    		array[yfall][zfall] = array[yfall][zfall]+numberOfGrains;}	
    
	}
	
	private static void ausgabe() {
			for (int i = 0; i < x; i++) {
				for (int j = 0; j < x; j++) {
					System.out.print(array[i][j] + "+");
				}
				System.out.println();
			}
			System.out.println("Zum Zeitpunkt: " + time + "n");
			time++;
		}
	private static void verteilung() {
		boolean aenderung = true;
		while (aenderung) {
			aenderung = false;
			for (int i = 0; i < x; i++) {
				for (int j = 0; j < x; j++) {
					if (array[i][j] > 3) {
						array[i][j] -= 3;
						aenderung = true;
						if ((j - 1) >= 0) {
							array[i][j - 1]++;
						}
						if ((j + 1) < x) {
							array[i][j + 1]++;
						}
						if ((i + 1) < x) {
							array[i + 1][j]++;
						}
						System.out.println("Sandkörner auf: " + (i + 1) + ", "
								+ (j + 1) + " wurden instabil!");
					}
				}
			}
		}
	}
}


Was ist falsch daran?
Wenn ich bei der Aufforderung zur Zahleneingab immer 1 drücke, kommt folgende Fehlermeldung :
Bitte geben Sie Breite und Höhe ein:
1
1
Bitte geben Sie das max. Fassungsvermögen einer Zelle ein
1
Wieviele Sandkörner wollen sie max. auf einmal eingeben?
1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Sandhaufenmodell.verteilung(Sandhaufenmodell.java:62)
at Sandhaufenmodell.main(Sandhaufenmodell.java:29)



Wie kann ich das umgehen?
Was muss ich umändern, um auch mit einem array, der nur 1*1 groß ist, ein erebnis zu erziehlen??


Weiters würde ich gerne in Exel ein Funktion erstellen, bei welcher die x-Achse Die Zeit und die y-Achse die dazu gehörige Menge der gesamten "Sandkörner" auf dem Gitter(array) darstellt, wie kann ich das bewerkstelligen?

Danke für die Hilfe!
 
M

Michael...

Gast
Anonymous hat gesagt.:
Was muss ich umändern, um auch mit einem array, der nur 1*1 groß ist, ein erebnis zu erziehlen?/quote]
Ich würde sagen der Fehler tritt bei allen Arrays kleiner 10x10 auf. Da in Zeile 11 x=10 gesetzt ist und sämtliche Schleifen gegen x laufen.
 
G

Guest

Gast
ah, alles klar, Dankeschön!

Weiters würde ich gerne in Exel ein Funktion erstellen, bei welcher die x-Achse Die Zeit und die y-Achse die dazu gehörige Menge der gesamten "Sandkörner" auf dem Gitter(array) darstellt, wie kann ich das bewerkstelligen?
gibts da irgendeinen Trick?
Kenne mich mit exel überhaupt nicht aus;-)
 

0x7F800000

Top Contributor
1) vertreibe mal die ganzen sinnfreien variablen wie "x" aus dem quellcode. Wenn du die breite des feldes brauchst gehst du zum feld und fragst nach breite, statt dich auf irgendwelche mysteriösen "Ikse" zu verlassen.
Code:
array.length

2) excel? wieso willst du dich mit diesem folterwerkzeug rumquälen, wo du schon nen javacompiler da hast...? ich weiß es nicht. Es würde jedenfalls ziemlich ätzend werden.
Ich wüsste nicht einmal, wie man das passende 2D-histogramm in excel zeichnen sollte, da kann man doch nur aus wenigen vorgefertigten (selten brauchbaren) sachen auswählen und nix selbst definieren. Zum anderen ist das eine qual, von java aus excel irgendwie anzuzapfen, kA wie das gehen soll, aber eine qual ist das sicherlich^^

Nimm einfach ein swing fensterchen, pack da ein component rein, das dir das feld ein wenig umskaliert, als farbwerte interpretiert, in bild umwandelt und hinmalt, und freu dich. Dürften insgesamt (grob geschätzt) keine dreißig zeilen werden...
 
G

Guest

Gast
Hi!

Danke für die Antwort, ich habs jz a bissal anders gemacht, aber es läuft aufs selbe raus;-)
Danke für die Hilfe..


ja, ich weiß, ne qual wirds, aber eher weil ich so ein "exel"-Experte bin *gg*
nunja, danke für den tipp, werde es versuchen, und vl. schaff ich es in exel auch irgendwie;-)

mfg danke;-)
 

didjitalist

Bekanntes Mitglied
dein modell hat nen seitwärtsdrall. mit jedem durchgang schwappen die körner schon aktiv über und können felder beeinflussen, die im aktuellen zustand noch gar nicht kritisch waren, sondern es erst im nächsten hätten werden sollen. das wird allerdings erst dann problematisch, wenn du das modell statistisch auswerten willst. um das zu verhindern, müsstest du immer ersteinmal alle kritischen zellen einsammeln und erst in einem zweiten durchgang auch manipulieren.
 
Status
Nicht offen für weitere Antworten.

Oben