Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

Mckbrother

Haudegen

Dabei seit: 04.02.2010

Beiträge: 515

 

1 Zum Seitenanfang

Freitag, 10. Dezember 2010, 11:46

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:

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:

Zitat

cannot find symbol - variable zaehlerRunter
und markiert die erste Zeile der Methode zeichneJojoRunter(), Zeile 50.
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.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Mckbrother« (10. Dezember 2010, 11:46)

 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

2 Zum Seitenanfang

Freitag, 10. Dezember 2010, 11:57

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.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (10. Dezember 2010, 11:57)

 

Mckbrother

Haudegen

Dabei seit: 04.02.2010

Beiträge: 515

 

3 Zum Seitenanfang

Freitag, 10. Dezember 2010, 21:37

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
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.
 

delta

Tripel-As

Dabei seit: 15.06.2009

Beiträge: 228

 

4 Zum Seitenanfang

Samstag, 11. Dezember 2010, 17:32

am besten immer ganz oben deklarieren.

Quellcode

1
2
3
4
public class test{
        private int zahl;
...
}
 

Mckbrother

Haudegen

Dabei seit: 04.02.2010

Beiträge: 515

 

5 Zum Seitenanfang

Samstag, 11. Dezember 2010, 18:55

Ok vielen Dank.
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.
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

6 Zum Seitenanfang

Sonntag, 12. Dezember 2010, 11:46

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
Die Variablen die du meinst werden "Instanzvariablen" oder "Klassenvariablen" genannt. Mit einer solchen Begriffsführung wirst du schnell eine Ausbildung finden.

Der schlauberger ergänzt:
Man kannst die Instanzvariablen auch in der vorletzten Zeile deklarieren. Hauptsache: Sie liegt im Linkage-Bereich '{' und '}' der Klassendeklaration.
 

Mckbrother

Haudegen

Dabei seit: 04.02.2010

Beiträge: 515

 

7 Zum Seitenanfang

Sonntag, 12. Dezember 2010, 17:26

Danke für den Tipp :)
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.
 

stfschaefer

Routinier

Dabei seit: 21.08.2010

Beiträge: 251

 

8 Zum Seitenanfang

Dienstag, 14. Dezember 2010, 22:19


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.
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

9 Zum Seitenanfang

Mittwoch, 15. Dezember 2010, 12:13

Ich komm gerade nciht mit, kannst du mir ein konkretes Beispiel coden?

LG
 

stfschaefer

Routinier

Dabei seit: 21.08.2010

Beiträge: 251

 

10 Zum Seitenanfang

Mittwoch, 15. Dezember 2010, 15:59

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:

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
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

11 Zum Seitenanfang

Mittwoch, 15. Dezember 2010, 16:17

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?
 

stfschaefer

Routinier

Dabei seit: 21.08.2010

Beiträge: 251

 

12 Zum Seitenanfang

Mittwoch, 15. Dezember 2010, 16:39



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
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

13 Zum Seitenanfang

Donnerstag, 16. Dezember 2010, 07:49

Ich fürchte du kommst mit den Begriffen durcheinander.
 

stfschaefer

Routinier

Dabei seit: 21.08.2010

Beiträge: 251

 

14 Zum Seitenanfang

Donnerstag, 16. Dezember 2010, 11:46

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.
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

15 Zum Seitenanfang

Donnerstag, 16. Dezember 2010, 13:40

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!