Deklaration und Initialisierung bei Method Erstellung

Hallo, ich habe eine Aufgabe in der ich das Erstellen von Method üben soll. Habe dazu ein Rahmenprogramm bekommen, welches die Kreise eine Spirographs berechnet. Dazu soll ich jetzt die noch fehlenden Method-Anweisungen (wenn man das so nennen kann) einfügen. Bin allerdings verwirrt weil mir der Compiler jedesmal die fehlermeldung ausgibt, dass innerhalb der Method-Anweisung irgendwo ne Variable fehlt. Die Deklaration und Initialisierung der Variablen habe ich schon an allen möglihen Stellen probiert, immer das gleiche 🙁

Hier zunächst das Rahmenprogramm welches ich bekomen habe:

Java:
// OOP - Hausaufgabe 6: Hypozykloide
// Name:

import java.awt.*;
import java.awt.event.*;

class Kurve extends Frame implements WindowListener {

	// Fenster-Groesse:
	private static final int X_SIZE = 500;
	private static final int Y_SIZE = 500;

	// Maximale Kooridinaten (positiv und negativ):
	private static final int XY_MAX = 200;

	// Anzahl Punkte:
	private static final int POINTS = 1000;

	// Konstruktor (erzeugt Fenster-Objekt):
	public Kurve(int[] xArr, int[] yArr, int cycles) {
		super("Hypozykloide (" + cycles + " Zyklen)");
		xCoords = xArr;
		yCoords = yArr;
		setBackground(Color.WHITE);
		setSize(X_SIZE, Y_SIZE);
		setVisible(true);
		addWindowListener(this);
	}

	// Verschiedene Fenster_Ereignisse (ohne Reaktion):
	public void windowActivated(WindowEvent e) {}
	public void windowDeactivated(WindowEvent e) {}
	public void windowIconified(WindowEvent e) {}
	public void windowDeiconified(WindowEvent e) {}
	public void windowOpened(WindowEvent e) {}

	// Benutzer will Fenster schliessen:
	public void windowClosing(WindowEvent e) {
		e.getWindow().setVisible(false);
		e.getWindow().dispose();
	}
	// Wenn Fenster geloescht ist, endet das Programm:
	public void windowClosed(WindowEvent e) {
		System.exit(0);
	}

	// Attribute fuer zu zeichnende Koordinaten:
	private int xCoords[];
	private int yCoords[];

	// Fehlermeldung und Schluss:
	private static void error(String msg) {
		System.out.println("Fehler: " + msg);
		System.exit(1);
	}

	// Hier wird gezeichnet:
	@Override public void paint(Graphics g) {

		// Fensterrahmen beruecksichtigen:
		int left = getInsets().left;
		int right = getInsets().right;
		int xCenter = (X_SIZE - left - right) / 2 + left;
		int top = getInsets().top;
		int bottom = getInsets().bottom;
		int yCenter = (Y_SIZE - top - bottom) / 2 + top;

		// Farbe des Zeichenstifts:
		g.setColor(Color.red);

		// Linienzug zeichnen:
		for(int i = 1; i < xCoords.length; i++) {
			int x_von = xCoords[i-1] + xCenter;
			int y_von = yCoords[i-1] + yCenter;
			int x_bis = xCoords[i]   + xCenter;
			int y_bis = yCoords[i]   + yCenter;
			g.drawLine(x_von, y_von, x_bis, y_bis);
		}
	}

	// Hauptprogramm:
	public static void main(String[] args) {
		// Default-Werte fuer Parameter:
		int R = 5;
		int r = 1;
		int a = 4;

		// Argumente aus der Kommandozeile:
		if(args.length > 3)
			error("Zu viele Argumente!");
		try {
			if(args.length >= 1)
				R = Integer.parseInt(args[0]);
			if(args.length >= 2)
				r = Integer.parseInt(args[1]);
			if(args.length >= 3)
				a = Integer.parseInt(args[2]);
		}
		catch(Exception e) {
			error("Argument keine ganze Zahl!");
		}
		if(R <= 0 || r <= 0)
			error("R und r muessen positiv sein!");
		if(a < 0)
			error("a darf nicht negativ sein!");
		if(r > R)
			error("Es muss r <= R gelten!");
		if(R == r && a == 0)
			error("Argumente liefern nur Punkt!");

		// Schlaufen/Zyklen berechnen:
		int n = zyklen(R, r);

		// Koordinaten berechnen und pruefen:
		int[] xArr = new int[POINTS];
		int[] yArr = new int[POINTS];
		hypozykloide(R, r, a, xArr, yArr);
		for(int i = 0; i < POINTS; i++) {
			if(xArr[i] < -XY_MAX || xArr[i] > XY_MAX)
				error("xArr[" + i + "] = " + xArr[i]);
			if(yArr[i] < -XY_MAX || yArr[i] > XY_MAX)
				error("yArr[" + i + "] = " + yArr[i]);
		}

		// Ergebnisse anzeigen:
		new Kurve(xArr, yArr, n);
	}

	// Hier Ihre Methode zur Berechnung der Anzahl Zyklen:

	// Hier Ihre Prozedur zur Berechnung der Koordinaten:

}

Soweit ich gesehen habe muss ich für die Zyklen und für Hypozykloide ne Method-Anweisung erstellen. Habe mich zunächst auf die zyklen fokusiert und zweiteres ignoriert.
Hier was ich probiert habe:

Java:
// OOP - Hausaufgabe 6: Hypozykloide
// Name: 

import java.awt.*;
import java.awt.event.*;

class Kurve extends Frame implements WindowListener {

	// Fenster-Groesse:
	private static final int X_SIZE = 500;
	private static final int Y_SIZE = 500;
	static int zyklen (int R, int r) {return double n=R/ggT;}
	// Maximale Kooridinaten (positiv und negativ):
	private static final int XY_MAX = 200;

	// Anzahl Punkte:
	private static final int POINTS = 1000;

	// Konstruktor (erzeugt Fenster-Objekt):
	public Kurve(int[] xArr, int[] yArr, int cycles) {
		super("Hypozykloide (" + cycles + " Zyklen)");
		xCoords = xArr;
		yCoords = yArr;
		setBackground(Color.WHITE);
		setSize(X_SIZE, Y_SIZE);
		setVisible(true);
		addWindowListener(this);
	}

	// Verschiedene Fenster_Ereignisse (ohne Reaktion):
	public void windowActivated(WindowEvent e) {}
	public void windowDeactivated(WindowEvent e) {}
	public void windowIconified(WindowEvent e) {}
	public void windowDeiconified(WindowEvent e) {}
	public void windowOpened(WindowEvent e) {}

	// Benutzer will Fenster schliessen:
	public void windowClosing(WindowEvent e) {
		e.getWindow().setVisible(false);
		e.getWindow().dispose();
	}
	// Wenn Fenster geloescht ist, endet das Programm:
	public void windowClosed(WindowEvent e) {
		System.exit(0);
	}

	// Attribute fuer zu zeichnende Koordinaten:
	private int xCoords[];
	private int yCoords[];

	// Fehlermeldung und Schluss:
	private static void error(String msg) {
		System.out.println("Fehler: " + msg);
		System.exit(1);
	}

	// Hier wird gezeichnet:
	@Override public void paint(Graphics g) {

		// Fensterrahmen beruecksichtigen:
		int left = getInsets().left;
		int right = getInsets().right;
		int xCenter = (X_SIZE - left - right) / 2 + left;
		int top = getInsets().top;
		int bottom = getInsets().bottom;
		int yCenter = (Y_SIZE - top - bottom) / 2 + top;

		// Farbe des Zeichenstifts:
		g.setColor(Color.red);

		// Linienzug zeichnen:
		for(int i = 1; i < xCoords.length; i++) {
			int x_von = xCoords[i-1] + xCenter;
			int y_von = yCoords[i-1] + yCenter;
			int x_bis = xCoords[i]   + xCenter;
			int y_bis = yCoords[i]   + yCenter;
			g.drawLine(x_von, y_von, x_bis, y_bis);
		}
	}

	// Hauptprogramm:
	public static void main(String[] args) {
		// Default-Werte fuer Parameter:
		int R = 5;
		int r = 1;
		int a = 4;
		for (int ggT=0;R==r;ggT++) {
			R=R-r;
		}
		// Argumente aus der Kommandozeile:
		if(args.length > 3)
			error("Zu viele Argumente!");
		try {
			if(args.length >= 1)
				R = Integer.parseInt(args[0]);
			if(args.length >= 2)
				r = Integer.parseInt(args[1]);
			if(args.length >= 3)
				a = Integer.parseInt(args[2]);
		}
		catch(Exception e) {
			error("Argument keine ganze Zahl!");
		}
		if(R <= 0 || r <= 0)
			error("R und r muessen positiv sein!");
		if(a < 0)
			error("a darf nicht negativ sein!");
		if(r > R)
			error("Es muss r <= R gelten!");
		if(R == r && a == 0)
			error("Argumente liefern nur Punkt!");

		// Schlaufen/Zyklen berechnen:
		int n = zyklen(R, r);

		// Koordinaten berechnen und pruefen:
		int[] xArr = new int[POINTS];
		int[] yArr = new int[POINTS];
		hypozykloide(R, r, a, xArr, yArr);
		for(int i = 0; i < POINTS; i++) {
			if(xArr[i] < -XY_MAX || xArr[i] > XY_MAX)
				error("xArr[" + i + "] = " + xArr[i]);
			if(yArr[i] < -XY_MAX || yArr[i] > XY_MAX)
				error("yArr[" + i + "] = " + yArr[i]);
		}

		// Ergebnisse anzeigen:
		new Kurve(xArr, yArr, n);
	}

	// Hier Ihre Methode zur Berechnung der Anzahl Zyklen:

	// Hier Ihre Prozedur zur Berechnung der Koordinaten:

}

Hoffe hier blickt jemand durch?
 
Naja, du postest zweimal nahezu den gleichen Code und fragst nur "Kann mir da jemand helfen?". Was soll man denn dazu deiner Meinung nach groß sagen?
 
du könntest zB damit anfangen mir zu sagen warum die for-schleife sinnlos ist, weil ich davon ausgegangen bin das ich diese dazu verwenden kann um ggT zu initialisieren welches oben widerrum in der Zyklus method benutzt wird.
 
Deine for-Schleife läuft solange die Bedingung "R==r" erfüllt ist.
Das ist sie zu Beginn aber natürlich nicht, also wird der Code in der for-Schleife niemals ausgeführt.
 
okay stimmt, jetzt hab ich das auch gemerkt. Ich wollte So lange R-r rechnen lassen, bis R=r ist. Die Anzahl der nötigen Subtraktionen wollte ich in ggT speichern. Hoffe diesmal stimmt es, an der Fehlermeldung ändert es trotzdem leider nichts.

Java:
// OOP - Hausaufgabe 6: Hypozykloide
// Name: Nico Siegert 

import java.awt.*;
import java.awt.event.*;

class Kurve extends Frame implements WindowListener {

	// Fenster-Groesse:
	private static final int X_SIZE = 500;
	private static final int Y_SIZE = 500;
	static int zyklen (int R, int r) {return double n=R/ggT;}
	// Maximale Kooridinaten (positiv und negativ):
	private static final int XY_MAX = 200;

	// Anzahl Punkte:
	private static final int POINTS = 1000;

	// Konstruktor (erzeugt Fenster-Objekt):
	public Kurve(int[] xArr, int[] yArr, int cycles) {
		super("Hypozykloide (" + cycles + " Zyklen)");
		xCoords = xArr;
		yCoords = yArr;
		setBackground(Color.WHITE);
		setSize(X_SIZE, Y_SIZE);
		setVisible(true);
		addWindowListener(this);
	}

	// Verschiedene Fenster_Ereignisse (ohne Reaktion):
	public void windowActivated(WindowEvent e) {}
	public void windowDeactivated(WindowEvent e) {}
	public void windowIconified(WindowEvent e) {}
	public void windowDeiconified(WindowEvent e) {}
	public void windowOpened(WindowEvent e) {}

	// Benutzer will Fenster schliessen:
	public void windowClosing(WindowEvent e) {
		e.getWindow().setVisible(false);
		e.getWindow().dispose();
	}
	// Wenn Fenster geloescht ist, endet das Programm:
	public void windowClosed(WindowEvent e) {
		System.exit(0);
	}

	// Attribute fuer zu zeichnende Koordinaten:
	private int xCoords[];
	private int yCoords[];

	// Fehlermeldung und Schluss:
	private static void error(String msg) {
		System.out.println("Fehler: " + msg);
		System.exit(1);
	}

	// Hier wird gezeichnet:
	@Override public void paint(Graphics g) {

		// Fensterrahmen beruecksichtigen:
		int left = getInsets().left;
		int right = getInsets().right;
		int xCenter = (X_SIZE - left - right) / 2 + left;
		int top = getInsets().top;
		int bottom = getInsets().bottom;
		int yCenter = (Y_SIZE - top - bottom) / 2 + top;

		// Farbe des Zeichenstifts:
		g.setColor(Color.red);

		// Linienzug zeichnen:
		for(int i = 1; i < xCoords.length; i++) {
			int x_von = xCoords[i-1] + xCenter;
			int y_von = yCoords[i-1] + yCenter;
			int x_bis = xCoords[i]   + xCenter;
			int y_bis = yCoords[i]   + yCenter;
			g.drawLine(x_von, y_von, x_bis, y_bis);
		}
	}

	// Hauptprogramm:
	public static void main(String[] args) {
		// Default-Werte fuer Parameter:
		int R = 5;
		int r = 1;
		int a = 4;
		for (int ggT=0;ggT<=r;ggT++) {
			R=R-r;
			if (R==r)
			break;
		}
		// Argumente aus der Kommandozeile:
		if(args.length > 3)
			error("Zu viele Argumente!");
		try {
			if(args.length >= 1)
				R = Integer.parseInt(args[0]);
			if(args.length >= 2)
				r = Integer.parseInt(args[1]);
			if(args.length >= 3)
				a = Integer.parseInt(args[2]);
		}
		catch(Exception e) {
			error("Argument keine ganze Zahl!");
		}
		if(R <= 0 || r <= 0)
			error("R und r muessen positiv sein!");
		if(a < 0)
			error("a darf nicht negativ sein!");
		if(r > R)
			error("Es muss r <= R gelten!");
		if(R == r && a == 0)
			error("Argumente liefern nur Punkt!");

		// Schlaufen/Zyklen berechnen:
		int n = zyklen(R, r);

		// Koordinaten berechnen und pruefen:
		int[] xArr = new int[POINTS];
		int[] yArr = new int[POINTS];
		hypozykloide(R, r, a, xArr, yArr);
		for(int i = 0; i < POINTS; i++) {
			if(xArr[i] < -XY_MAX || xArr[i] > XY_MAX)
				error("xArr[" + i + "] = " + xArr[i]);
			if(yArr[i] < -XY_MAX || yArr[i] > XY_MAX)
				error("yArr[" + i + "] = " + yArr[i]);
		}

		// Ergebnisse anzeigen:
		new Kurve(xArr, yArr, n);
	}

	// Hier Ihre Methode zur Berechnung der Anzahl Zyklen:

	// Hier Ihre Prozedur zur Berechnung der Koordinaten:

}
 
Habe die Zyklus method oben wie folgt abgeändert:

static int zyklen (int R, int r) {return R/ggT;}
scheint mir so richtiger, aber ggT ist dem Compiler immernoch ein Fremdwort
 
Zuletzt bearbeitet:
Die Variable ggt gibt es bei dir auch im Moment nur lokal innerhalb der besagten for-Schleife, Außerhalb kannst du diese dann natürlich nicht verwenden.
 
Dazu fällt mir jetzt keine Lösung ein, letztens in der Vorlesung wurde mir zwar gesagt, dass man lokale Variablen nur in der entsprechenden schleife o.Ä. nutzen kann, allerdings brauche ich ja die Schleife um irgendwie an diesen Wert zu kommen. Gibt es also irgendwie eine Möglichkeit wie ich diesen Wert jetzt in das globale bringe?

Edit:
Mir fällt gerade ein: man könnte doch sicherlich den wert in einem Array speichern und diesen dann außerhalb wieder abrufen?
 
Zuletzt bearbeitet:
Keine Ahnung, was du da genau zusammenschustern willst.

Wenn du den ggt von zwei Zahlen a und b benötigst, dann schreibe dir dafür eine Methode
int ggt(int a, int b) { ... }
die dir den ggt von a und b berechnet.
 
das hatte ich schonmal versucht, aber dann brauche ich doch innerhalb der method wieder die for schleife, welches die variable dann wieder zu einer lokalen werden lässt oder?

Java:
	private static teiler (int R, int r) { 	for (int ggT=0;ggT<=r;ggT++) {
							R=R-r;
							if (R==r) 
								break;  }

							return ggT;
 
Zuletzt bearbeitet:
Du solltest nochmal in deine Vorlesungsunterlagen schauen bzgl. Gültigkeitsbereich einer Variable. Auch Wikipedia erklärt es.

Anschließend überlegst du, WO ggT im jew. Fall deklariert werden müsste (
int ggT;
). Eines hast du ja schon erkannt: Wenn du ggT erst in der Schleife/im Schleifenkopf deklarierst, ist sein Gültigkeitsbereich auf die Schleife beschränkt.
 
Zuletzt bearbeitet:

Zurück
Oben