C
-canu
Gast
Hallo,
ich bin noch ein blutiger Anfänger also bitte nicht lachen,
es geht um eine Aufagbe wo man ein char array ausgeben muss und zwar auf einer Zeichenfläche.
Die selbe Aufagbe sollten wir zuvor nur mit Consolenausgabe programmieren.
Ich weiss einfach nicht wie ich die paint() Methode richtig anwende und es fehlt mir an Vorstellungskraft...
ich poste mal die klassen für ein Punkt :
public class Punkt extends GObj {
public Punkt(int px, int py) {
super(px, py);
}
void show() {
bild.set(x,y,"+");
}
}
-----------------------------------------------------
public abstract class GObj {
protected int x, y;
protected Bild bild ;
public GObj(int px, int py) {
x=px; y=py;
}
abstract void show();
final void setBild( Bild b ){
bild = b ;
}
public String toString() {return "x = " + x + " y = " + y ; }
final void move(int dx,int dy) {
x+=dx; y+=dy;
}
}
----------------------------------------------------
import java.awt.Graphics;
import java.util.*;
class Bild {
int hoehe, breite;
String[][] a ;
ArrayList<GObj> ol ;
Bild(int h,int b) {
ol = new ArrayList<GObj>() ;
hoehe=h ;
breite=b ;
a = new String[breite][hoehe];
new MyFrame("lol");
clear();
}
public void add(GObj g)
{ g.setBild(this);
ol.add( g ) ;
}
public void remove(GObj g)
{ ol.remove( g ) ;
}
public void onTop(GObj g)
{ ol.remove( g ) ;
ol.add( g );
}
public void displayAll()
{ clear();
for( GObj g : ol )
g.show() ;
display() ;
}
protected void display() {
for(int y=0;y<hoehe;y++)
{
for(int x=0;x<breite;x++)
System.out.print(" "+a[x][y]);
System.out.println();
}
}
final private void clear() {
for(int x=0;x<breite;x++)
for(int y=0;y<hoehe;y++)
a[x][y] = "." ;
}
final void set(int x,int y, String c) {
if( 0<=x && x<breite && 0<=y && y<hoehe )
a[x][y] = c ;
}
void drawMe(Graphics g){
for(int x=0;x<breite;x++)
for(int y=0;y<hoehe;y++)
g.drawString(a[x][y] , hoehe, breite);
}
}
--------------------------------------------------------
import javax.swing.JFrame;
class MyFrame extends JFrame
{
MyFrame(String s)
{
super(s);
getContentPane().add(new MyPanel());
setSize(300,300);
setLocation(350, 250);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
-----------------------------------------------------
import java.awt.Graphics;
import javax.swing.JPanel;
class MyPanel extends JPanel {
public void paint (Graphics g)
{ new Bild (20,20).drawMe(g);
}
}
------------------------------------------------------
und schließlich die main mit aufgabe
----------------------------------------------------------package test2;
class p3v2 {
/**
* @param args
*/
public static void main(String[] args) {
Bild b = new Bild(60,30) ; // Höhe (60) x Breite (30)
zeichneAuf( b ) ;
// folgendes soll später in Aufgabe 2.1. auch funktionieren:
// SwingBild sb = new SwingBild(60,30) ;
// zeichneAuf( sb ) ;
}
private static void zeichneAuf( Bild b )
{
Punkt p = new Punkt(7,15) ; // lege einen Punkt an
b.add( p ); // füge den Punkt dem Bild hinzu
b.add( new Punkt(10,20) ); // füge dem Bild noch einen Punkt hinzu
/*b.add( new VLinie(10,15,15) ); // und noch eine vertikale Linie hinzu
Rechteck r = new Rechteck(6,13,5,5) ; // lege ein Rechteck an
b.add( r ) ; // füge das Rechteck dem Bild hinzu
b.add( new HLinie(3,16,15) ); // und noch eine horizontale Linie
Rechteck r2 = new Rechteck(6,13,4,4) ; // lege noch ein Rechteck an
b.add( r2 ) ; // füge das Rechteck dem Bild hinzu
r.move(3,3) ; // verschiebe das untere Rechteck (r)
// um je 3 nach unten und rechts
Rechteck r3 = new Rechteck(4,12,5,5) ; // lege noch ein Rechteck an
b.remove(r3) ; // lösche das Rechteck
b.onTop( p ) ;
**/ // ziehe Obejkt b heraus und hole es nach vorne
b.displayAll(); // zeichne das Bild (in dieser Aufgabe:
// zeichne Zeichen (*,|,-,+) auf System.out)
}
}
/* Aufgabe 1: geometrische Objekten / Grafik
Ziele:
1. Klassenentwurf
2. Minimierung von Code durch maximale Wiederverwendung
3. Kapselung von Code durch maximale Einschränkung der Sichtbarkeit
A1 Entwerfen und programmieren Sie eine Klassenbibliothek für
Fensterobjekte, d.h.
- Rechtecke deren Außenseiten parallel zum Bildschirmrand
liegen
- horizontale und vertikale Linien, die parallel zum
Bildschirmrand liegen
- Punkte
+-------+ |
| | ----------- | *
+-------+ |
sowie eine Klasse Bild, die die im Bild enthaltenen
Fensterobjekte in einer Liste verwaltet und bei Aufruf einer Methode
displayAll() auf der Ausgabe darstellt.
Ihre Grafikbibliothek soll folgende Funktionen anbieten:
1. Neue Objekte definieren (durch Konstruktoraufrufe von Punkt, VLinie,
HLine, Rechteck)
2. Objekte zu einem Bild hinzufügen (=oben auf den Objektstapel legen,
wodurch tiefer liegende Objekte z.T. verdeckt werden können)
3. Objekt löschen
(=ausklinken aus der Liste der sichtbaren Objekte),
4. Objekte verschieben (nach links,rechts,oben,unten),
5. Objekt nach vorne holen
6. alle Objekte anzeigen lassen, dabei sollen neue Objekte
jeweils alte Objekte überlagern, z.B.:
| |
+---|----- + |
| | | |
+---------+ | |
* | |---+ |
+---------+ |
7. Das Bild mit übereinander liegenden Objekten soll intern
in der Klasse Bild in einem Array von Zeichen (char) konstruiert
werden und in dieser Aufgabe bei Aufruf der Methode displayAll()
auf der Konsole ausgegeben werden.
8. Die Klasse Bild soll so entworfen werden,
dass die Ausgabe später auch anders dargestellt werden kann,
z.B. in einem Swing-Fenster
(die Programmierung des Swing-Fensters ist NICHT Teil dieser Aufgabe).
Das unten gegebene Programm soll ohne Änderung korrekt
funktionieren. (Natürlich können und sollen Sie das Programm
zu Testzwecken ändern.)
Prüfen Sie (wie immer beim OOP) zuerst,
was durch Vererbung lösbar ist, d.h.:
1. Welche Klassen gibt es in der Aufgabenstellung ?
2. Welche zusätzlichen abstrakten Klassen fordert das
Single-Source-Prinzip ?
3. Wo werden welche Attribute angesiedelt ?
4. Wo werden welche Methoden angesiedelt ?
5. Wofür braucht man abstrakte Methoden ?
6. Sind die Methoden tatsächlich nach dem
Single-Source-Prinzip entworfen ?
7. Was müssen die Konstruktoren jeder Klasse tun ?
8. Welche Attribute müssen protected sein
und welche können private sein ?
Dann erst anfangen zu codieren!
Hinweis: Der zusätzliche Code der Musterlösung
ist (eng geschrieben) ca. 1 Seite lang.
Bewertung:
0 Punkte für eine Lösung, die nicht vollständig korrekt funktioniert.
12 Punkte für eine Lösung, die mit dem gegebenen Programm und
bei kleinen Änderungen des Programms (z.B. mehr Objekte
anlegen, andere Objekte nach vorne holen, löschen verschieben etc.)
vollständig korrekt funktioniert,
aber Code-Minimierung durch Wiederverwendung
und Geheimnisprinzip nicht vollständig umsetzt
4 Punkte zusätzlich für eine korrekte Lösung, die Code-Minimierung durch
Wiederverwendung optimial umsetzt
4 Punkte zusätzlich für eine korrekte Lösung, die das Geheimnisprinzip
optimal umsetzt.
*/
Ich bitte um Hilfe ,sitze seit ca.7 stds am Probieren.
mfg canu
ich bin noch ein blutiger Anfänger also bitte nicht lachen,
es geht um eine Aufagbe wo man ein char array ausgeben muss und zwar auf einer Zeichenfläche.
Die selbe Aufagbe sollten wir zuvor nur mit Consolenausgabe programmieren.
Ich weiss einfach nicht wie ich die paint() Methode richtig anwende und es fehlt mir an Vorstellungskraft...
ich poste mal die klassen für ein Punkt :
public class Punkt extends GObj {
public Punkt(int px, int py) {
super(px, py);
}
void show() {
bild.set(x,y,"+");
}
}
-----------------------------------------------------
public abstract class GObj {
protected int x, y;
protected Bild bild ;
public GObj(int px, int py) {
x=px; y=py;
}
abstract void show();
final void setBild( Bild b ){
bild = b ;
}
public String toString() {return "x = " + x + " y = " + y ; }
final void move(int dx,int dy) {
x+=dx; y+=dy;
}
}
----------------------------------------------------
import java.awt.Graphics;
import java.util.*;
class Bild {
int hoehe, breite;
String[][] a ;
ArrayList<GObj> ol ;
Bild(int h,int b) {
ol = new ArrayList<GObj>() ;
hoehe=h ;
breite=b ;
a = new String[breite][hoehe];
new MyFrame("lol");
clear();
}
public void add(GObj g)
{ g.setBild(this);
ol.add( g ) ;
}
public void remove(GObj g)
{ ol.remove( g ) ;
}
public void onTop(GObj g)
{ ol.remove( g ) ;
ol.add( g );
}
public void displayAll()
{ clear();
for( GObj g : ol )
g.show() ;
display() ;
}
protected void display() {
for(int y=0;y<hoehe;y++)
{
for(int x=0;x<breite;x++)
System.out.print(" "+a[x][y]);
System.out.println();
}
}
final private void clear() {
for(int x=0;x<breite;x++)
for(int y=0;y<hoehe;y++)
a[x][y] = "." ;
}
final void set(int x,int y, String c) {
if( 0<=x && x<breite && 0<=y && y<hoehe )
a[x][y] = c ;
}
void drawMe(Graphics g){
for(int x=0;x<breite;x++)
for(int y=0;y<hoehe;y++)
g.drawString(a[x][y] , hoehe, breite);
}
}
--------------------------------------------------------
import javax.swing.JFrame;
class MyFrame extends JFrame
{
MyFrame(String s)
{
super(s);
getContentPane().add(new MyPanel());
setSize(300,300);
setLocation(350, 250);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
-----------------------------------------------------
import java.awt.Graphics;
import javax.swing.JPanel;
class MyPanel extends JPanel {
public void paint (Graphics g)
{ new Bild (20,20).drawMe(g);
}
}
------------------------------------------------------
und schließlich die main mit aufgabe
----------------------------------------------------------package test2;
class p3v2 {
/**
* @param args
*/
public static void main(String[] args) {
Bild b = new Bild(60,30) ; // Höhe (60) x Breite (30)
zeichneAuf( b ) ;
// folgendes soll später in Aufgabe 2.1. auch funktionieren:
// SwingBild sb = new SwingBild(60,30) ;
// zeichneAuf( sb ) ;
}
private static void zeichneAuf( Bild b )
{
Punkt p = new Punkt(7,15) ; // lege einen Punkt an
b.add( p ); // füge den Punkt dem Bild hinzu
b.add( new Punkt(10,20) ); // füge dem Bild noch einen Punkt hinzu
/*b.add( new VLinie(10,15,15) ); // und noch eine vertikale Linie hinzu
Rechteck r = new Rechteck(6,13,5,5) ; // lege ein Rechteck an
b.add( r ) ; // füge das Rechteck dem Bild hinzu
b.add( new HLinie(3,16,15) ); // und noch eine horizontale Linie
Rechteck r2 = new Rechteck(6,13,4,4) ; // lege noch ein Rechteck an
b.add( r2 ) ; // füge das Rechteck dem Bild hinzu
r.move(3,3) ; // verschiebe das untere Rechteck (r)
// um je 3 nach unten und rechts
Rechteck r3 = new Rechteck(4,12,5,5) ; // lege noch ein Rechteck an
b.remove(r3) ; // lösche das Rechteck
b.onTop( p ) ;
**/ // ziehe Obejkt b heraus und hole es nach vorne
b.displayAll(); // zeichne das Bild (in dieser Aufgabe:
// zeichne Zeichen (*,|,-,+) auf System.out)
}
}
/* Aufgabe 1: geometrische Objekten / Grafik
Ziele:
1. Klassenentwurf
2. Minimierung von Code durch maximale Wiederverwendung
3. Kapselung von Code durch maximale Einschränkung der Sichtbarkeit
A1 Entwerfen und programmieren Sie eine Klassenbibliothek für
Fensterobjekte, d.h.
- Rechtecke deren Außenseiten parallel zum Bildschirmrand
liegen
- horizontale und vertikale Linien, die parallel zum
Bildschirmrand liegen
- Punkte
+-------+ |
| | ----------- | *
+-------+ |
sowie eine Klasse Bild, die die im Bild enthaltenen
Fensterobjekte in einer Liste verwaltet und bei Aufruf einer Methode
displayAll() auf der Ausgabe darstellt.
Ihre Grafikbibliothek soll folgende Funktionen anbieten:
1. Neue Objekte definieren (durch Konstruktoraufrufe von Punkt, VLinie,
HLine, Rechteck)
2. Objekte zu einem Bild hinzufügen (=oben auf den Objektstapel legen,
wodurch tiefer liegende Objekte z.T. verdeckt werden können)
3. Objekt löschen
(=ausklinken aus der Liste der sichtbaren Objekte),
4. Objekte verschieben (nach links,rechts,oben,unten),
5. Objekt nach vorne holen
6. alle Objekte anzeigen lassen, dabei sollen neue Objekte
jeweils alte Objekte überlagern, z.B.:
| |
+---|----- + |
| | | |
+---------+ | |
* | |---+ |
+---------+ |
7. Das Bild mit übereinander liegenden Objekten soll intern
in der Klasse Bild in einem Array von Zeichen (char) konstruiert
werden und in dieser Aufgabe bei Aufruf der Methode displayAll()
auf der Konsole ausgegeben werden.
8. Die Klasse Bild soll so entworfen werden,
dass die Ausgabe später auch anders dargestellt werden kann,
z.B. in einem Swing-Fenster
(die Programmierung des Swing-Fensters ist NICHT Teil dieser Aufgabe).
Das unten gegebene Programm soll ohne Änderung korrekt
funktionieren. (Natürlich können und sollen Sie das Programm
zu Testzwecken ändern.)
Prüfen Sie (wie immer beim OOP) zuerst,
was durch Vererbung lösbar ist, d.h.:
1. Welche Klassen gibt es in der Aufgabenstellung ?
2. Welche zusätzlichen abstrakten Klassen fordert das
Single-Source-Prinzip ?
3. Wo werden welche Attribute angesiedelt ?
4. Wo werden welche Methoden angesiedelt ?
5. Wofür braucht man abstrakte Methoden ?
6. Sind die Methoden tatsächlich nach dem
Single-Source-Prinzip entworfen ?
7. Was müssen die Konstruktoren jeder Klasse tun ?
8. Welche Attribute müssen protected sein
und welche können private sein ?
Dann erst anfangen zu codieren!
Hinweis: Der zusätzliche Code der Musterlösung
ist (eng geschrieben) ca. 1 Seite lang.
Bewertung:
0 Punkte für eine Lösung, die nicht vollständig korrekt funktioniert.
12 Punkte für eine Lösung, die mit dem gegebenen Programm und
bei kleinen Änderungen des Programms (z.B. mehr Objekte
anlegen, andere Objekte nach vorne holen, löschen verschieben etc.)
vollständig korrekt funktioniert,
aber Code-Minimierung durch Wiederverwendung
und Geheimnisprinzip nicht vollständig umsetzt
4 Punkte zusätzlich für eine korrekte Lösung, die Code-Minimierung durch
Wiederverwendung optimial umsetzt
4 Punkte zusätzlich für eine korrekte Lösung, die das Geheimnisprinzip
optimal umsetzt.
*/
Ich bitte um Hilfe ,sitze seit ca.7 stds am Probieren.
mfg canu