Sandhaufen

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!

Ich muss für die Schule ein Programm schreiben, das sich Sandhaufen-modell nennt,
ist angeblich standart 7.Klasse Htl....
Naja, ich weiß zwar was das sein soll, doch wie schreibe ich das nun?

Soll ich mir zuerst eine main Methode anlegen, dann darin einen Array,
dann eine Schleife , welche über den index zufällig ein "Kästchen" im Array
um 2 erhöht, mit einer begrenzung von 10 (also wenn in einem 10 drinn sind,
gehen die 10 in die "Kästchen" daneben)-> allerdings nur nach unten-wie mach ich denn das?.

Wars das dann?
Funktioniert das?
Ich bin total übervordert;-)

mfg Ma :D
 

Marco13

Top Contributor
Poste notfalls mal die genaue Aufgabenstellung, und stell präzise Fragen, und zeig' was du bisher gemacht hast...
 
G

Guest

Gast
Danke für den Link!
Hat mir etwas geholfen :D

__________________________________________________________
die aufgebanstellung:

Schreibt ein Programm namens Sandhaufenmodell 8entw. von nach Bak, Tang und Wiesenfeld).

Das Sandhaufenmodell:
In einem quadratisches Gitter(5*5) , wird eine Zelle durch Zufall augewählt.
In diese Zelle kommen dann entweder 2 oder 3 Sandkörner ( Zufall).

Das Fassungsvermögen einer Zelle beträgt aber nur 9 Sandkörner.
Sobald das zehnte Sandkorn in die Zelle kommt, wird diese komplett entleert.
Dies geschieht, indem die Zelle die in ihr enthaltenen Sandkörner in die Nachbarzellen (O,S,W)
"schupft"(in alle Zellen in der direkten Nachbarschaft ausser die im Norden").
Dieser Vorgang wird dann x mal wiederhohlt(x = eingabe Programmbenutzer).

____________________________________________________________

Ich habe auf der http://geol43.uni-graz.at/07S/646802/abschlussaufgaben.pdf
unter Aufgabe 11 eine ähnliche Angabe gefunden, leider keine Lösung!


Der Info Lehrer meinte wir sollen einfach mal surfen, dann finden wir schon eine Art "Aufbauplan" für das Modell.
Doch da ist nix!
Jedenfalls nix was mir wircklich etwas nutzt :cry:

aber meine Info 1 hängt von dem Programm ab, deshalb will ich es unbeding schaffen!!

Mein Problem ist, ich weiß nicht wie ich das aufbauen soll!
rein von der Strucktur, soll ich eine Klasse oder 2 machen, was soll ich in Methoden fassen?
Und überhaupt.... :roll:

Danke schon für die Hilfe!
mfg Ma :D
 

Marco13

Top Contributor
Ja, es gibt 1000 Möglichkeiten, wie man sowas umsetzen kann. Du hast leider nicht gepostet, was du bisher hast. Wie viele Klassen es geben soll usw. ergibt sich aus der Modellierung. Vermutlich brauchst du nur eine (wo auch gleich die main drin liegen kann). Und der Rest ergibt sich, wenn man die Aufgabenstellung aufdröselt....

In einem quadratisches Gitter(5*5) , ...
-> könnte z.B. durch einen int[][] repräsentiert sein. Die tatsächliche Größe ist hier zwar fest vorgegeben, sollte in der eigentlichen Implementierung aber variabel sein.

wird eine Zelle durch Zufall augewählt. In diese Zelle kommen dann entweder 2 oder 3 Sandkörner ( Zufall).

Hier ist nicht klar, ob die zufällige Auswahl "von außen" statttfinden soll, ist aber nicht so wichtig. Man braucht wohl Methoden wie
public void putGrainsAtRandomPosition(int numberOfGrains)
und
public (oder private) void putGrainsAt(int x, int y, int numberOfGrains)


Das Fassungsvermögen einer Zelle beträgt aber nur 9 Sandkörner.
Diese Zahl sollte idealerweise auch von außen angegeben werden können.


[...] Dieser Vorgang wird dann x mal wiederhohlt(x = eingabe Programmbenutzer).
Aha, noch ein Parameter.... Auf welchen "Vorgang" sich der bezieht, ist zwar unklar, aber .. nobody is perfect - nichtmal dein Lehrer :wink:


Daraus ergibt sich ja schonmal einiges, was man unmittelbar hinschreiben kann
Code:
class Pile 
{
    // Erstelle einen Sandhaufen der Größe sizeX*sizeY (z.B. 5*5), wo in ein 
    // Feld maximal maxGrains Sandkörner passen (z.B. 9) 
    public Pile(int sizeX, int sizeY, int maxGrains)
    {
        ...
    }

    // Lege eine gewisse Anzahl Sandkörner an eine zufällige Position
    public void putGrainsAtRandomPosition(int numberOfGrains)
    {
        ...
    }

    // Lege eine gewisse Anzahl Sandkörner an die Position x,y (könnte ggf. private sein)
    public void putGrainsAt(int x, int y, int numberOfGrains)
    {
        ...
    }

}

Viel mehr "public" gibt's dann eigentlich nicht. Jetzt muss fast nurnoch die "putGrainsAt"-Methode implementiert werden.... Beachte dabei, dass durch das "schupfen" von einer Zelle in die andere vielleicht in der anderen die maximale Anzahl Sandkörner überschritten wird. Das kann man aber leicht lösen, indem "putGrainsAt" sich unter bestimmten Bedingungen selbst aufruft.
 
G

Guest

Gast
hallo!

Danke für diesen Leitfaden!
Hab grade begonnen,steht jetzt aber leider vor einem kleinem Problem :?

Hier ist mal mein code:
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class SandhaufenmodellMarkus {

	 
	  
	  
	  
	private static int sizeX,sizeY,maxGrains,numberOfGrains,x,toNumber,yfall,zfall;
	
	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());
	}
	
	 public void putGrainsAtRandomPosition()
	    { 
	    	numberOfGrains = (int) (Math.random() * (toNumber));
	    	yfall= (int) (Math.random() * (sizeX));
	    	zfall= (int) (Math.random() * (sizeY));
	    	for (int i=0; i<5; i++){
	    		array[yfall][zfall] +=  numberOfGrains;}
	    } 
	  
	  public SandhaufenmodellMarkus() 
	    { 
		  int[][] array = new int[sizeX][sizeY];
	    } 
	  
	  public void putGrainsAt(int a, int b) 
	    { 
	    } 
	  
}

Allerdings wird das Wort array in der Zeile 34 schon rot markiert,warum??



Meine Hauptfraeg:
Jetzt muss fast nurnoch die "putGrainsAt"-Methode implementiert werden.... Beachte dabei, dass durch das "schupfen" von einer Zelle in die andere vielleicht in der anderen die maximale Anzahl Sandkörner überschritten wird. Das kann man aber leicht lösen, indem "putGrainsAt" sich unter bestimmten Bedingungen selbst aufruft

Wie schaffe ich es , dass wenn meine Zelle voll ist , (maxGrains überschritten wurde) dass sie die int werte an die Zellen im Söden Osten un Westen weitergibt,und dass die dann auch gleich darauf überprüft werden ob sie dadurch voll sind und der selbe schritt wiederhohlt wird????


BITTE HILFE!
 
G

Guest

Gast
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class SandhaufenmodellMarkus {
	
	static int sizeX,sizeY,maxGrains,numberOfGrains,toNumber,yfall,zfall;
	static int array[][];
    static int time=0;
    static int x = 0;
	
	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());
		SandhaufenmodellMarkus();
		print();
		for (int i=0; i<100; i++){//100 mal Schleife
			putGrainsAtRandomPosition();
			controll();	
			print();
			}
		}
	private static void SandhaufenmodellMarkus() {
		array = new int[sizeX][sizeY];
	}
	
	private static void putGrainsAtRandomPosition() {
		numberOfGrains = (int) (Math.random() * (toNumber));
    	yfall= (int) (Math.random() * (5));
    	zfall= (int) (Math.random() * (5));
    	for (int i=0; i<1; i++){//100 mal Schleife
    		array[yfall][zfall] += numberOfGrains;}	
	}
	
	private static void print() {
			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 controll() {
		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!");
					}
				}
			}
		}
	}
}

Es hilft nix, irgendwas stimmt da nicht!
Es wird zwar nix mehr von eclipse rot unterwellt, aber es wirft folgende Fehlermeldung aus:

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
Zum Zeitpunkt: 0n
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at SandhaufenmodellMarkus.putGrainsAtRandomPosition(SandhaufenmodellMarkus.java:43)
at SandhaufenmodellMarkus.main(SandhaufenmodellMarkus.java:29)



Bitte helft mir!
 
S

SlaterB

Gast
du gibst 1 und 1 ein, daraufhin wird ein Array der Länge und Breite 1 erzeugt,

dann kommt putGrainsAtRandomPosition() dran,
dort wird yfall und zfall zufällig erzeugt, mit Werten bis zu 5 oder zumindest 4,

theorerisch wird also auf array[3][4] zugegriffen während du vorher nur Länge und Breite 1 angegeben hast,


-------

für diese einfachen Gedankengänge braucht es wirklich ein Forum?
 
G

Guest

Gast
Dankeschön!!!!!!!!!! :D
Vielen vielen DANK!
Ich bin jz fast ausgerasted!
 

Templon

Bekanntes Mitglied
Code:
 yfall= (int) (Math.random() * (5));
       zfall= (int) (Math.random() * (5));

Diese 5 hier stimmt nicht. Sollte wohl eher sizeX, und sizeY sein.

Edit: Viiiiel zu langsam :( ^^
 
G

Guest

Gast
Dankeschön für die Antworten !

Habt mir sehr weitergeholfen!
´
Die 5er habe ich durch sizeX&Y erstezt, das stimmt, aber beim debuggen, wurden sizeX&Y (da nicht static ) immer als Fehler angezeigt.
Mittlerweile habe ich das behoben;-)

Jedenfalls Dankeschön SlaterB&Templon&Marco13!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Sandhaufen Rechnung mit Schubkarre Java Basics - Anfänger-Themen 9

Ähnliche Java Themen


Oben