Archiv verlassen und diese Seite im Standarddesign anzeigen : Java (Problem mit einfachem Programm)
Also ich muss für die Uni die folgende Aufgabe lösen: http://www.angewandteinformatik.de/servlet/de.otris.portal.util.LinkServ?id=swt000896
Also brauche ich eine Fachkonzeptklasse und eine GUI die darauf zugreift.
Der nächste Schritt wäre dann eine lesende Operation in der Form, das man als Eingangsatribute X und Y wählt und jeweils die Zeilen abrastert und die Atributwerte abfragt. Diese sollen in die Textarea der GUI rein. Wie gebe ich denn in der Textarea an, das er in die nächste Zeile springen soll, damit ich die zweite Zeile schreiben kann ?
Also ich denke mal ich gehe die Zeilen von 1 bis n und dann jeweils die Spalten von 1 bis n durch und lasse nacheinander die Zahlen von 1 bis n*n eintragen. Dazu nehme ich das schreiben natürlich ins Applett und die Lesende Operation welche Zahl an der zweiten Stelle steht natürlich aus der Fachkonzeptklasse.
Denke mal das muss so laufen:
- while (n*n <= laufn)
- wert = lese (zeile 1,spalte 1)
- setze laufn = laufn+1
- schreibe wert + " "
Und dann muss er aber den nächsten Wert dahinter schreiben. Macht er das oder löscht er das Feld ?
- Und wenn die mit den Spalten bei n bin, muss er umschalten auf Zeile 2, also in die nächste Zeile des TextBereichs springen.
Wie macht man das ?
Die GUI muss auch noch prüfen ob die Zahl n ungerade ist. Wie frage ich das denn ab ? if (n ungerade) {...}
Wie gebe ich das an ?
Hier mal meine Fachkonzeptklasse (erst mal nur mit der Matrixberechnung):
public class magischesQuadrat
{
int n;
int laufn = 1;
int [][]Matrix;
public void berechneQuadrat(int zahl)
{
int MerkeSpalte;
int MerkeZeile;
int halbn;
n = zahl;
halbn = n/2;
Matrix = new int [n][n];
MerkeSpalte = halbn;
MerkeZeile = 1;
Matrix[MerkeSpalte][MerkeZeile] = 1;
while (laufn <= n)
{
{if (MerkeZeile == 1)
MerkeZeile = n;
else
MerkeZeile = MerkeZeile - 1;}
{if (MerkeSpalte == n)
MerkeSpalte = 1;
else
MerkeSpalte = MerkeSpalte + 1;}
{if ((Matrix[MerkeSpalte][MerkeZeile]) == 0)
{if (MerkeZeile == n)
MerkeZeile = 1;
else
MerkeZeile = MerkeZeile - 1;}
Matrix[MerkeSpalte][MerkeZeile] = laufn;}
}
}
}
Hoffe das ist in Ordnung so.
Da ist mir noch was eingefallen:
halbn = n/2;
Beispiel:
n = 5
Da kämen 5 / 2 = 2,5 raus. Dieses Feld gibt es aber nicht, also muss es aufgerundet werden zu 3.
Macht er das automatisch, da halbn als int deklariert ist oder muss ich da noch was machen ?
Hi,
irgendwie komme ich nicht auf die Page und deine Beschreibung habe ich nicht wirklich kapiert...zu den verschiendenen Problemen:
Gerade/Ungerade: Dazu kannst du Modulo verwenden. Also:
if (5%2 != 0)
{
System.out.println("ungerade!");
}
Runden: Ich glaube Java rundet .5er Werte automatisch ab. 5/2 gibt also 2.
Ich werde mich später noch einmal melden. Muss jetzt erst mal was arbeiten! ;)
peschmae
23-04-2003, 12:08
zum runden musst du perfiderweise
int i = java.lang.Math.round(Double d); verwenden...
ein expliziter Cast von Double nach Int (oder auch nach Long) schneidet einfach die Nachkommastellen ab
MfG Peschmä
Danke.
Der Link den ich da angebe ist eine PDF Datei. Man braucht also ein entsprechendes Browser Plugin.
Habe jetzt weiter geschrieben und so sieht das nun aus (unten erkläre ich was noch Probleme macht):
public class magischesQuadrat
{
int n;
int laufn = 1;
int [][]Matrix;
int MerkeSpalte;
int MerkeZeile;
int MerkeWert;
public void berechneQuadrat(int zahl)
{
int halbn;
n = zahl;
halbn = n/2;
Matrix = new int [n][n];
MerkeSpalte = halbn;
MerkeZeile = 1;
Matrix[MerkeSpalte][MerkeZeile] = 1;
while (laufn < n)
{
{if (MerkeZeile == 1)
MerkeZeile = n;
else
MerkeZeile = MerkeZeile - 1;}
{if (MerkeSpalte == n)
MerkeSpalte = 1;
else
MerkeSpalte = MerkeSpalte + 1;}
{if ((Matrix[MerkeSpalte][MerkeZeile]) == 0)
{if (MerkeZeile == n)
MerkeZeile = 1;
else
MerkeZeile = MerkeZeile - 1;}
Matrix[MerkeSpalte][MerkeZeile] = laufn;}
laufn = laufn + 1;
}
}
int Matrixwert(int Zeilex, int Spaltex)
{
MerkeZeile = Zeilex;
MerkeSpalte = Spaltex;
MerkeWert = Matrix[MerkeSpalte][MerkeZeile];
return MerkeWert;
}
}
Oben seht ihr noch immer halbn = n/2, das muss ich noch korregieren.
Habe dann ein Applet mit Textarea ("Textbereich") ein Eingabe Feld und einen Button generiert. Das Button Klick Ereignis macht folgendes:
private void button1ActionPerformed(java.awt.event.ActionEvent evt) {
Integer i1 = Integer.valueOf(textField1.getText());
int n = i1.intValue();
{if (n < 0)
{Textbereich.setText("");
Textbereich.setText("n muss positiv sein !!");}
else
{if (n % 2 == 0)
{Textbereich.setText("");
Textbereich.setText("n muss ungerade sein !!");}
else
{int Spalte = 0;
int Zeile = 0;
int Wert;
while(Zeile < n)
{
while(Spalte < n)
{
{Wert = Matrixwert(Zeile,Spalte);
Textbereich.append(Wert + " ");
Spalte = Spalte + 1;}
Zeile = Zeile + 1;
Spalte = 0;
Textbereich.append("/n");
}
}
}
}
}
}
Ich weiß das noch ein Fehler drin ist. Und zwar muss Wert (der aus Matrixwert kommen sollte) zuerst in String umgewandelt werden damit das Textbereich.append überhaupt funktioniert.
Aber vorher habe ich ein anderes Problem:
magischesQuadratGUI.java [79:1] cannot resolve symbol
symbol : method Matrixwert (int,int)
location: class magischesQuadratGUI
{Wert = Matrixwert(Zeile,Spalte);
^
1 error
Errors compiling Project magischesQuadrat.
Könnt ihr mir bitte erklären was das Problem ist ? Er müsste die Operation jedenfalls kennen, da sie zu einem Projekt gehören und ich auch gleich das ganze Projekt compiliere.
Und die Werte für Zeile und Spalte sind Integer und vorher festgelegt.
Ich habe das Gefühl, dass da eine Klammer ({) zu viel ist:
{Wert = Matrixwert(Zeile,Spalte);
Weitere Fehlermöglichkeiten:
- Ist die Klasse magischesQuadrat bereits kompiliert?
- Ist sie im gleichen Verzeichnis wie das Applet?
MfG Bischi
Also das dieser PFeil auf die Klammer zeigt liegt nur am Forum. Der compiler meint das Matrix.
Ich hab jetzt noch mal was geändert:
public class magischesQuadrat
{
int n;
int laufn;
int [][]Matrix;
int MerkeSpalte;
int MerkeZeile;
int MerkeWert;
public void berechneQuadrat(int zahl)
{
n = zahl;
double i = java.lang.Math.round((double) (n/2));
int halbn = (int) i;
Matrix = new int [n][n];
MerkeSpalte = halbn;
MerkeZeile = 0;
Matrix[MerkeSpalte][MerkeZeile] = 1;
laufn = 0;
while (laufn < n)
{
{if (MerkeZeile == 1)
MerkeZeile = n;
else
MerkeZeile = MerkeZeile - 1;}
{if (MerkeSpalte == n)
MerkeSpalte = 1;
else
MerkeSpalte = MerkeSpalte + 1;}
{if ((Matrix[MerkeSpalte][MerkeZeile]) == 0)
{if (MerkeZeile == n)
MerkeZeile = 1;
else
MerkeZeile = MerkeZeile - 1;}
Matrix[MerkeSpalte][MerkeZeile] = laufn;}
laufn = laufn + 1;
}
}
public int getMatrixwert(int Zeile, int Spalte)
{
MerkeZeile = Zeile;
MerkeSpalte = Spalte;
MerkeWert = Matrix[MerkeSpalte][MerkeZeile];
return MerkeWert;
}
}
private void button1ActionPerformed(java.awt.event.ActionEvent evt) {
berechneQuadrat(Integer.valueOf(textField1));
Integer i1 = Integer.valueOf(textField1.getText());
int n = i1.intValue();
{if (n < 0)
{Textbereich.setText("");
Textbereich.setText("n muss positiv sein !!");}
else
{if (n % 2 == 0)
{Textbereich.setText("");
Textbereich.setText("n muss ungerade sein !!");}
else
{int Spalte = 0;
int Zeile = 0;
int Wert;
while(Zeile < n)
{
while(Spalte < n)
{
{Wert = getMatrixwert(Zeile,Spalte);
Textbereich.append(String.valueOf(Wert) + " ");
Spalte = Spalte + 1;}
Zeile = Zeile + 1;
Spalte = 0;
Textbereich.append("/n");
}
}
}
}
}
}
Fehlermeldungen:
magischesQuadratGUI.java [60:1] cannot resolve symbol
symbol : method valueOf (java.awt.TextField)
location: class java.lang.Integer
berechneQuadrat(Integer.valueOf(textField1));
^
magischesQuadratGUI.java [81:1] cannot resolve symbol
symbol : method getMatrixwert (int,int)
location: class magischesQuadratGUI
{Wert = getMatrixwert(Zeile,Spalte);
^
2 errors
Errors compiling Project magischesQuadrat.
Warum zur kann ich diese beiden Methoden denn nun nicht so verwenden ?
Kannst du bitte mal das ganze Programm hochladen? Wäre viel einfacher den Fehler zu finden. Ach ja, um den Text eines Textfeldes auszulesen kannst du die getText() eigenschaft benutzen. Wenn du einfach nur das Objekt angibts bekommst du auch das Objekt.
peschmae
24-04-2003, 12:01
nochwas, code bitte entweder mit codetags [#] oder als textfiles hochladen
MfG Peschmä
Ich habe es jetzt hinbekommen. Der Fehler war das ich in der einen Klasse zwar ein Matrix Objekt erzeuge, dies aber dann nicht in der GUI verwenden kann. Also muss ich es dort noch mal als eigenes Objekt deklarieren auf das dann die Methoden zugreifen können.
Hänge das Spaßeshalber mal an. Dann könnt ihr einfache magische Quadrate damit ausrechnen lassen.
ACHTUNG: Die Endung .zip ist nach .tar.gz umzubennenen (lies sich sonst nicht hochladen)
Scheint mehr oder weniger zu funktionieren:
Jedoch: ist es Absicht, dass keine geraden Zahlen eingegeben werden können und wenn ja, doch bitte richtig beschriften!!!
Zusätzlich kam bei mir eine relativ spezielle Anzeige zustande, deren Schuld jedoch wohl mehr bei meinem Browser liegen wird:
Bild einfach mal anschauen:
Hmm. Welchen Browser und welche Java Version hast du denn ?
Der Algorythmus funktioniert so:
- erste Zeile, mittleres Feld: 1 setzen
- ein Feld hoch und eins nach rechts gehen
-- wenn schon in Zeile 0, dann in n-1 springen
-- wenn schon in Spalte n-1, dann in 0 springen
- wenn angesprungenes Feld schon eine Zahl hat, dann genau eine Zeile unter dem letzten Feld die nächste schreiben
Das ganze dann mit den Zahlen von 1 bis n^2 durchlaufen, da es ja ein nxn Quadrat ist.
Ein Quadrat kann nicht negative Zeilen oder Spalten haben, weshalb nur n > 0 erlaubt ist. Desweiteren haben gerade Zahlen keine mittlere ganze Zahl.
3 = 1 2 3 -> Mitte: 2
4 = 1 2 3 4 -> Mitte: zwischen 2 und 3, also 2,5 was bei einer Matrix nicht geht
Daher der Hinweis das man ein ungerades und positives n eingeben muss. Außerdem würde er bei geraden und negativen Zahlen eine Fehlermeldung ausgeben.
Insofern ist es doch richtig beschriftet.
Bei mir steht im Programm:
Bitte ein gerades und positives n angeben:
Wenn ich nun die 4 eingebe, so kommt die Fehlermeldung:
n muss ungerade sein !!
Dies ist doch wohl ein Wiederspruch?!
Und zu Browser und Java:
-IE 5.5
-Java 1.4.1.02
Normalerweise funktioniert alles richtig, fand nur gerade dieses eine Mal die Anzeige lustig und habe Screenshot gemacht!
MfG Bischi
Huups. Da ist das Label falsch beschriftet. Naja, Praktikum ist vorbei und das ist so durchgegangen.
Also ich habe Java 1.4.1, Firebird 0.5 Nighly unter Mandrake 9.0. Und da sieht alles normal und richtig aus.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.