Problem mit Java-Programm
Moin Moin,
wir sollen für den Info-Unterricht in der Schule eine "Jojo-Animation" mit Java erstellen.
Es geht darum, dass ein Kreis halt auf einer Schnur auf- und absteigen soll..
Wir arbeiten mit BlueJ und den Biblitheken sum.kern und sum.werkzeuge .
Erstmal der Code der Klasse Jojo:
So und nun der Code der Klasse JojoFilm
Soo. Wenn ich nun die Klasse Jojo Kompilieren will sagt BlueJ folgendes:
Ich verstehe es aber nicht, warum er die Variable nicht findet, da ich diese extra vor der Schleife deklariert habe.
Ich hoffe Ihr könnt mir helfen, denn entweder übersehe ich etwas oder ich habe irgendwie alles falsch gemacht.
Das das Programm vermutlich noch nicht so läuft (von den Höhen her) wie es soll ist mir klar.
Vielen Dank
Beste Grüße,
Mckbrother
wir sollen für den Info-Unterricht in der Schule eine "Jojo-Animation" mit Java erstellen.
Es geht darum, dass ein Kreis halt auf einer Schnur auf- und absteigen soll..
Wir arbeiten mit BlueJ und den Biblitheken sum.kern und sum.werkzeuge .
Erstmal der Code der Klasse Jojo:
|
|
Java-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
import sum.kern.*; import sum.werkzeuge.*; /** * @Autor * @Name * @Beginn: * @Fertig: */ public class Jojo //Klasse { // Objekte Buntstift zeichenStift; private Uhr computerUhr; int punktX, punktY; // Konstruktor public Jojo(int pX,int pY) //Parameter aus der anderen Klasse { punktX=pX; punktY=pY; //Übergeben der Parameter auf Variablen zeichenStift=new Buntstift(); computerUhr=new Uhr(); this.zeichneSchnur(); //Direkter Sprung auf zeichneSchnur() } //Methoden public void zeichneSchnur() { zeichenStift.bewegeBis(punktX,punktY); //Anfangspunkt der Schnur zeichenStift.dreheUm(-90); zeichenStift.runter(); zeichenStift.bewegeUm(500); zeichenStift.hoch(); zeichenStift.bewegeBis(punktX,punktY); zeichenStift.dreheUm(-90); zeichenStift.runter(); zeichenStift.bewegeUm(50); zeichenStift.dreheUm(90); zeichenStift.bewegeUm(50); zeichenStift.dreheUm(90); zeichenStift.bewegeUm(50); zeichenStift.hoch(); zeichenStift.bewegeBis(punktX,punktY+450); zeichenStift.runter(); zeichenStift.zeichneKreis(5); zeichenStift.hoch(); } public void zeichneJojoRunter() { zeichenStift.bewegeBis(punktX,punktY+150+zaehlerRunter); zeichenStift.setzeFuellMuster(Muster.GEFUELLT); zeichenStift.setzeFarbe(Farbe.BLAU); zeichenStift.runter(); zeichenStift.zeichneKreis(100); zeichenStift.hoch(); } public void loescheJojoRunter() { zeichenStift.bewegeBis(punktX,punktY+150+zaehlerRunter); zeichenStift.setzeFuellMuster(Muster.GEFUELLT); zeichenStift.setzeFarbe(Farbe.WEIß); zeichenStift.runter(); zeichenStift.zeichneKreis(100); zeichenStift.hoch(); } public void zeichneJojoHoch() { zeichenStift.bewegeBis(punktX,punktY+100+zaehlerRauf); zeichenStift.setzeFuellMuster(Muster.GEFUELLT); zeichenStift.setzeFarbe(Farbe.BLAU); zeichenStift.runter(); zeichenStift.zeichneKreis(100); zeichenStift.hoch(); } public void loescheJojoHoch() { zeichenStift.bewegeBis(punktX,punktY+100+zaehlerRauf); zeichenStift.setzeFuellMuster(Muster.GEFUELLT); zeichenStift.setzeFarbe(Farbe.WEIß); zeichenStift.runter(); zeichenStift.zeichneKreis(100); zeichenStift.hoch(); } public void bewegeJojo() { for(int i=150; i<401; i++) { int zaehlerRunter=0; while(zaehlerRunter<250) { zaehlerRunter++; this.zeichneJojoRunter(); computerUhr.warte(25); this.loescheJojoRunter(); this.zeichneSchnur(); } } for(int j=401; j>150; j--) { int zaehlerRauf=250; while(zaehlerRauf>0) { zaehlerRauf--; this.zeichneJojoRauf(); computerUhr.warte(25); this.loescheJojoRauf(); this.zeichneSchnur(); } } } } |
So und nun der Code der Klasse JojoFilm
|
|
Java-Quelltext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import sum.kern.*; import sum.werkzeuge.*; /** * @Autor * @Name * @Beginn: * @Fertig: */ //Klasse public class JojoFilm { // Objekte private Bildschirm fenster; private Maus mickeyMouse; private Jojo jojo1,jojo2; //Verweis auf Klasse Jojo // Konstruktor public JojoFilm() { fenster=new Bildschirm(800,800); mickeyMouse=new Maus(); jojo1=new Jojo(200,100); //Verweis auf Klasse Jojo mit Parametern jojo2=new Jojo(600,100); //Verweis auf Klasse Jojo mit Parametern } // Dienste public void fuehreAus() { while(mickeyMouse.istGedrueckt()) { jojo1.bewegeJojo(); jojo2.bewegeJojo(); } } } |
Soo. Wenn ich nun die Klasse Jojo Kompilieren will sagt BlueJ folgendes:
und markiert die erste Zeile der Methode zeichneJojoRunter(), Zeile 50.
Zitat
cannot find symbol - variable zaehlerRunter
Ich verstehe es aber nicht, warum er die Variable nicht findet, da ich diese extra vor der Schleife deklariert habe.
Ich hoffe Ihr könnt mir helfen, denn entweder übersehe ich etwas oder ich habe irgendwie alles falsch gemacht.
Das das Programm vermutlich noch nicht so läuft (von den Höhen her) wie es soll ist mir klar.
Vielen Dank
Beste Grüße,
Mckbrother
Wo kämen wir hin,
wenn jeder sagen würde:
"wo kämen wir hin",
und niemand ginge um zu schauen,
wohin wir kämen,
wenn wir gingen.
wenn jeder sagen würde:
"wo kämen wir hin",
und niemand ginge um zu schauen,
wohin wir kämen,
wenn wir gingen.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mckbrother« (10. Dezember 2010, 11:46)
Ganz klar: die zeile 93 muss weg und in die Zeile 15.
Dafür muss in zeile 93
zaehlerRunter=0;
Was hast du falsch gemacht?
Du kannst Methoden nicht verschachteln!
Primitive Variablen können nur innerhalb ihrer Methode verwendet werden.
D.H die variable lebt nur in den Zeilen 93 bis 102.
Dafür muss in zeile 93
zaehlerRunter=0;
Was hast du falsch gemacht?
Du kannst Methoden nicht verschachteln!
Primitive Variablen können nur innerhalb ihrer Methode verwendet werden.
D.H die variable lebt nur in den Zeilen 93 bis 102.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (10. Dezember 2010, 11:57)
Super es geht. Sieht zwar nicht besonders aus, aber es geht ums Prinzip.
Nochmal als Versicherung, ich lerne ja Java noch im Anfangsstadium:
Wenn ich Variablen in der ganzen Klasse nutzen will, muss ich diese oben, bei den Objekten deklarieren?
Danke, Gruß,
Mckbrother
Nochmal als Versicherung, ich lerne ja Java noch im Anfangsstadium:
Wenn ich Variablen in der ganzen Klasse nutzen will, muss ich diese oben, bei den Objekten deklarieren?
Danke, Gruß,
Mckbrother
Wo kämen wir hin,
wenn jeder sagen würde:
"wo kämen wir hin",
und niemand ginge um zu schauen,
wohin wir kämen,
wenn wir gingen.
wenn jeder sagen würde:
"wo kämen wir hin",
und niemand ginge um zu schauen,
wohin wir kämen,
wenn wir gingen.
Die Variablen die du meinst werden "Instanzvariablen" oder "Klassenvariablen" genannt. Mit einer solchen Begriffsführung wirst du schnell eine Ausbildung finden.Super es geht. Sieht zwar nicht besonders aus, aber es geht ums Prinzip.
Nochmal als Versicherung, ich lerne ja Java noch im Anfangsstadium:
Wenn ich Variablen in der ganzen Klasse nutzen will, muss ich diese oben, bei den Objekten deklarieren?
Danke, Gruß,
Mckbrother
Der schlauberger ergänzt:
Man kannst die Instanzvariablen auch in der vorletzten Zeile deklarieren. Hauptsache: Sie liegt im Linkage-Bereich '{' und '}' der Klassendeklaration.
Wenn ich Variablen in der ganzen Klasse nutzen will, muss ich diese oben, bei den Objekten deklarieren?
Wie nocturn schon erwähnt hat, geht es hier um die Sichtbarkeit und die Lebenszeit der Variablen.
Da, wo du sie deklariert hattest, war ihre Lebenszeit nur innerhalb der Schleife und die Sichtbarkeit auch nur innerhalb der Schleife, aber die Methode wurde logischer ausserhalb der Schleife deklariert also innerhalb der Methode nicht sichtbar.
@nocturn; Wenn du schachteln meinst mit innerhalb einer Methoder eine innere Methode zu deklarieren, dann ist es korrekt. Dies ist typische in den C-Sprachen.
Man kann aber rekursiv programmieren, das wäre dann etwas anderes.
Ein Lehrbeispiel für rekurive Programmierung ist die Berechnung der Fakultät:
a) Definition der Fakultat:
Fakultat(n) wird definiert als die Multiplikation der Zahlen von 1 bis n, also 1*2*3*...*n
Berechnung mittels rekursiver Funktion:
Obige Funktion ist nicht zu 100% korrekt, da hier als Beispiel angenommen wird, dass man nur ganzzahlige positive Zahlen eingibt.
Der Ablauf funktioniert ungefähr so (abhängig vom Compiier):
a) Es wird übrprüft, ob die übergebene Zahl kleiner oder gleich als 1 ist.
Wenn ja, wird 1 als Resultat zurückgegeben.
b) Bei nein wird n mit der Fakultat von n-1 multipliziert und zurückgegeben.
Hier wird im Zwischenspeicher die Fakultat von n-1 berechnet und diese mit n multiplitziert.
Durch die Berechnung mittels der gleichen funktion wird folgendes ausgeführt:
es wird überprüft, ob n-1 <=1 ist und bei ja, dieser Wert zurückgegeben:
Bei nein, wird n-1 mit der Fakultät von n-2 multipliziert.
Das ganze geht dann so weiter, bis die übergebene Zahl kleiner oder gleich 1 ist.
Aufrufe von fak(5) z.B.
Fak(5) =>
5*Fak(4) =>
5*Fak(4)*Fak(3) =>
5*Fak(4)*Fak(3)*Fak(2) =>
5*Fak(4)*Fak(3)*Fak(2)*Fak(1) =>
5*Fak(4)*Fak(3)*Fak(2)*1 =>
5*Fak(4)*Fak(3)*2 ==>
5*Fak(4)*6 =>
5*24 =>
120
a) Definition der Fakultat:
Fakultat(n) wird definiert als die Multiplikation der Zahlen von 1 bis n, also 1*2*3*...*n
Berechnung mittels rekursiver Funktion:
|
|
Quellcode |
1 2 3 4 |
function fak(n) {
if (n<=1) return 1; // Abbruchbedingung
return n*fak(n-1);
}
|
Obige Funktion ist nicht zu 100% korrekt, da hier als Beispiel angenommen wird, dass man nur ganzzahlige positive Zahlen eingibt.
Der Ablauf funktioniert ungefähr so (abhängig vom Compiier):
a) Es wird übrprüft, ob die übergebene Zahl kleiner oder gleich als 1 ist.
Wenn ja, wird 1 als Resultat zurückgegeben.
b) Bei nein wird n mit der Fakultat von n-1 multipliziert und zurückgegeben.
Hier wird im Zwischenspeicher die Fakultat von n-1 berechnet und diese mit n multiplitziert.
Durch die Berechnung mittels der gleichen funktion wird folgendes ausgeführt:
es wird überprüft, ob n-1 <=1 ist und bei ja, dieser Wert zurückgegeben:
Bei nein, wird n-1 mit der Fakultät von n-2 multipliziert.
Das ganze geht dann so weiter, bis die übergebene Zahl kleiner oder gleich 1 ist.
Aufrufe von fak(5) z.B.
Fak(5) =>
5*Fak(4) =>
5*Fak(4)*Fak(3) =>
5*Fak(4)*Fak(3)*Fak(2) =>
5*Fak(4)*Fak(3)*Fak(2)*Fak(1) =>
5*Fak(4)*Fak(3)*Fak(2)*1 =>
5*Fak(4)*Fak(3)*2 ==>
5*Fak(4)*6 =>
5*24 =>
120
Man kann aber rekursiv programmieren, das wäre dann etwas anderes.
Auch in deinem Beispiel hat die variable n seinen linkage nur zwischen Zeile 1 und 4 und wird nur einmal deklariert.
Instanziiert wird die Variable mehrfach, das lenkt jedoch vom Thema ab.
Auch die Methode wird nur einmal deklariert. Die Ausführung jedoch ist verschachtelt.
Haben wir uns geeinigt?
Auch die Methode wird nur einmal deklariert. Die Ausführung jedoch ist verschachtelt.
Haben wir uns geeinigt?
Bei einer rekursion wird immer geschachtelt aufgerufen.
Bei verschachtelter Programmierung Wird die Funktion normalerweise weder direkt noch indirekt SELBST aufgerufen.
Stattdessen ist dies meist eibne Vereinfachung der Aufgabenstellung und/oder bei mehrerer Ausführung Einsparung von Implementation.
Aber natürlich nicht nur.
Mfg
Ich fürchte du kommst mit den Begriffen durcheinander.
Nein. Mit den Begriffen nicht.
Du erklärst es zwar richtig, aber mit falscher Definition:
Z.B.:
Man kann Methoden nicht schachteln.
Nicht richtig. Man kann die Methoden schachteln, aber nicht geschachtelt implementieren.
Nr. 2. Die Variable lebt nur in den Zeilen 98 bis 102.
Nicht ganz richtig. Nur, weil es zufällig eine lokale NICHT statische Variable ist, lebt sie nur im Bereich der Zeilen 98 bis 102.
Würde man die Variable jedoch statisch definieren, so lebt sie ständig.
Aber hier muss man die SICHTBARKEIT betrachten. Die Variable ist nur in den Zeilen 98 bis 102 sichtbar.
Ist ein kleiner aber feiner Unterschied.
Rekursion != Verschachteln.
Wie du Rekursion in das Thema einbringst ist mir nicht klar.
Ein Methode besteht immer aus Deklaration und Definition und damit immer Implementiert.
Wie kommst du darauf das ich nur die Definition meinen könnte?
Warum also die überflüssige Auseinandersetzung? Wir sind uns doch einig!
Ein Beispiel einer Deklaration ist:
function void tachchen(int n);
Also die Festlegung von Dimension, Bezeichner, Datentyp.
Diese Deklaration kann auch in der rekursiven Programmierung wirklich "nicht" verschachtelt werden.
Du schrobest:
@nocturn; Wenn du schachteln meinst mit innerhalb einer Methoder eine innere Methode zu deklarieren, dann ist es korrekt. [...] aber rekursiv programmieren, das wäre dann etwas anderes.
Etwas anderes? Du kannst bei einer Rekursion innere Methoden deklarieren? Cool!
Wie du Rekursion in das Thema einbringst ist mir nicht klar.
Ein Methode besteht immer aus Deklaration und Definition und damit immer Implementiert.
Wie kommst du darauf das ich nur die Definition meinen könnte?
Warum also die überflüssige Auseinandersetzung? Wir sind uns doch einig!
Ein Beispiel einer Deklaration ist:
function void tachchen(int n);
Also die Festlegung von Dimension, Bezeichner, Datentyp.
Diese Deklaration kann auch in der rekursiven Programmierung wirklich "nicht" verschachtelt werden.
Du schrobest:
@nocturn; Wenn du schachteln meinst mit innerhalb einer Methoder eine innere Methode zu deklarieren, dann ist es korrekt. [...] aber rekursiv programmieren, das wäre dann etwas anderes.
Etwas anderes? Du kannst bei einer Rekursion innere Methoden deklarieren? Cool!
Ähnliche Themen
-
Flash »-
Java Programm
(7. August 2010, 20:38)
-
Sonstige Programmiersprachen »-
Java Programmierung für Symbian Handys
(7. Juni 2009, 12:48)
-
(X)HTML & CSS & DHTML & Javascript »-
HILFE !!! Java prob.
(10. August 2003, 23:36)
-
(X)HTML & CSS & DHTML & Javascript »-
Parser 0.13 <- Bitte testen!
(1. März 2003, 08:52)


