Hallo Zusammen,
ich versuche gerade eine eigene Aufgabe zu erstellen, die ich für die Schule machen muss. Dabei darf es nur Arrays, GUI, Sub-Klassen (Objektorientiertes Programmieren), Schleifen und Abfragen wie if/switch-case enthalten. Dabei dachte ich an ein Programm, dass bestimme Zahlen in Buchstaben umwandelt. D.h. , die grafische Benutzeroberfläche wird gestartet, es wird eine Zahl eingegeben, die mit einem Klick auf den Button in Buchstaben bzw. Wörter/Sätze umgewandelt wird.
Damit man lange Sätze oder Wörter bilden kann, braucht man lange Zahlen und aus dem Grund habe ich den Datentyp double statt int oder long genommen. Mein Problem ist, dass die grafische Benutzeroberfläche ab 19 Ziffern nicht mehr funktioniert. Die Zahl scheint zu lang zu sein aber genau aus dem Grund habe ich auch double genommen, dessen Maximalwert definitiv über 19 Ziffern geht. Deswegen wollte ich mal hier im Forum fragen, ob mich jemand aufklären kann.
Meine GUI und Sub-Klasse Codes befindet sich ganz unten. Falls etwas nicht verständlich sein sollte, findet ihr vor den Codes noch eine kleine Beschreibung des Programms. Wenn es trotzdem unverständlich ist, dann bitte anschreiben.
Falls die Frage aufkommt, warum ich mit AWT und nicht Swing arbeite: Ich weiß es auch nicht - wir müssen in der Schule mit AWT arbeiten.
Beschreibung:
Mein Array alphabet hat 34 Felder (inkl. Indexwert 0) und die Felder des Arrays sind mit den jeweiligen Buchstaben und Sonderzeichen belegt. Zum Beispiel alphabet[0] wäre dann ein "a".
Mit einem Klick auf den Button "Los!" wird zunächst die Zahl im Numberfield in die Instanzvariable double zahl übernommen. Dann gehts weiter mit der Sub-Klasse "Umwandeln" für die Berechnung und Übersetzung in Buchstaben/Sonderzeichen. Dazu übernehme ich zunächst die Parameterwerte der Variablen double zahl und String ergebnis aus der GUI-Klasse mithilfe eines Konstruktors in meine Instanzvariablen in der Sub-Klasse. Dann startet meine Methode "Start". Zunächst rechne ich den Rest der eingegebenen Zahl aus, indem ich die Zahl mit Modulo(%) durch 100.0 teile. Dann kürze ich die Zahl um 2 Stellen mithilfe des Restwertes. D.h. jedes Mal wird die Zahl um 2 Stellen gekürzt und es entsteht die Möglichkeit die Zahlen nacheinander in Buchstaben/Sonderzeichen umzuwandeln. Nun wird der Restwert mit den Array-Feldern verglichen und wird in den jeweiligen Buchstaben oder Sonderzeichen umgewandelt. Dieser Buchstabe oder Sonderzeichen wird dann an die Stringvariable ergebnis angekettet. Erreicht die Zahl durch die Subtraktionen 0, dann wird die selbe Prozedur durchlaufen, nur dass diesmal der Buchstabe mithilfe von .toUpperCase() großgeschrieben dargestellt wird. Wenn die Schleife beendet ist und die Zahl vollständig umgewandelt wurde, landet der Wert der Stringvariable mithilfe von return ergebnis; wieder in der GUI-Klasse und kann durch ein TextArea ausgegeben werden.
Hinweis:
Es bilden immer zwei Ziffern ein Buchstabe bzw. ein Sonderzeichen - auch einstellige Zahlen müssen als zweistellig eingegeben werden, d.h. statt 4 gibt man 04 ein.
Zum Beispiel:
Der Restwert 10 wäre: alphabet [10] -> "k"
Der Restwert 4 wäre: alphabet[4] -> "e", jedoch tragen wir die 4 mit einer 0 im GUI davor ein.
Also:
Der Restwert 04 wäre: alphabet[4] -> "e"
Das wird so gemacht, da das Programm ständig die eingegebene Zahl durch 100 teilt und dadurch nicht unterscheiden kann, ob dabei eine einstellige oder zweistellige Zahl beabsichtigt wurde. Mit der 0 vor jeder einstelligen Zahl erkennt es jedoch, ob es sich um eine einstellige oder zweistellige Zahl handelt.
Zum Beispiel:
13214 % 100 wäre 14, jedoch war der Code folgendermaßen gedacht: 13|21|4 und nicht 1|32|14.
Also würde das Programm eine andere Reihenfolge eingehen.
Aber:
132104 % 100 wäre 4 und somit würde der Code in der richtigen Reihenfolge (13|21|04) übersetzt werden.
Ich bedanke mich im Voraus und wünsche allen alles Gute für das kommende Jahr.
GUI-Klasse:
Umwandeln (Sub-Klasse):
ich versuche gerade eine eigene Aufgabe zu erstellen, die ich für die Schule machen muss. Dabei darf es nur Arrays, GUI, Sub-Klassen (Objektorientiertes Programmieren), Schleifen und Abfragen wie if/switch-case enthalten. Dabei dachte ich an ein Programm, dass bestimme Zahlen in Buchstaben umwandelt. D.h. , die grafische Benutzeroberfläche wird gestartet, es wird eine Zahl eingegeben, die mit einem Klick auf den Button in Buchstaben bzw. Wörter/Sätze umgewandelt wird.
Damit man lange Sätze oder Wörter bilden kann, braucht man lange Zahlen und aus dem Grund habe ich den Datentyp double statt int oder long genommen. Mein Problem ist, dass die grafische Benutzeroberfläche ab 19 Ziffern nicht mehr funktioniert. Die Zahl scheint zu lang zu sein aber genau aus dem Grund habe ich auch double genommen, dessen Maximalwert definitiv über 19 Ziffern geht. Deswegen wollte ich mal hier im Forum fragen, ob mich jemand aufklären kann.
Meine GUI und Sub-Klasse Codes befindet sich ganz unten. Falls etwas nicht verständlich sein sollte, findet ihr vor den Codes noch eine kleine Beschreibung des Programms. Wenn es trotzdem unverständlich ist, dann bitte anschreiben.
Falls die Frage aufkommt, warum ich mit AWT und nicht Swing arbeite: Ich weiß es auch nicht - wir müssen in der Schule mit AWT arbeiten.
Beschreibung:
Mein Array alphabet hat 34 Felder (inkl. Indexwert 0) und die Felder des Arrays sind mit den jeweiligen Buchstaben und Sonderzeichen belegt. Zum Beispiel alphabet[0] wäre dann ein "a".
Mit einem Klick auf den Button "Los!" wird zunächst die Zahl im Numberfield in die Instanzvariable double zahl übernommen. Dann gehts weiter mit der Sub-Klasse "Umwandeln" für die Berechnung und Übersetzung in Buchstaben/Sonderzeichen. Dazu übernehme ich zunächst die Parameterwerte der Variablen double zahl und String ergebnis aus der GUI-Klasse mithilfe eines Konstruktors in meine Instanzvariablen in der Sub-Klasse. Dann startet meine Methode "Start". Zunächst rechne ich den Rest der eingegebenen Zahl aus, indem ich die Zahl mit Modulo(%) durch 100.0 teile. Dann kürze ich die Zahl um 2 Stellen mithilfe des Restwertes. D.h. jedes Mal wird die Zahl um 2 Stellen gekürzt und es entsteht die Möglichkeit die Zahlen nacheinander in Buchstaben/Sonderzeichen umzuwandeln. Nun wird der Restwert mit den Array-Feldern verglichen und wird in den jeweiligen Buchstaben oder Sonderzeichen umgewandelt. Dieser Buchstabe oder Sonderzeichen wird dann an die Stringvariable ergebnis angekettet. Erreicht die Zahl durch die Subtraktionen 0, dann wird die selbe Prozedur durchlaufen, nur dass diesmal der Buchstabe mithilfe von .toUpperCase() großgeschrieben dargestellt wird. Wenn die Schleife beendet ist und die Zahl vollständig umgewandelt wurde, landet der Wert der Stringvariable mithilfe von return ergebnis; wieder in der GUI-Klasse und kann durch ein TextArea ausgegeben werden.
Hinweis:
Es bilden immer zwei Ziffern ein Buchstabe bzw. ein Sonderzeichen - auch einstellige Zahlen müssen als zweistellig eingegeben werden, d.h. statt 4 gibt man 04 ein.
Zum Beispiel:
Der Restwert 10 wäre: alphabet [10] -> "k"
Der Restwert 4 wäre: alphabet[4] -> "e", jedoch tragen wir die 4 mit einer 0 im GUI davor ein.
Also:
Der Restwert 04 wäre: alphabet[4] -> "e"
Das wird so gemacht, da das Programm ständig die eingegebene Zahl durch 100 teilt und dadurch nicht unterscheiden kann, ob dabei eine einstellige oder zweistellige Zahl beabsichtigt wurde. Mit der 0 vor jeder einstelligen Zahl erkennt es jedoch, ob es sich um eine einstellige oder zweistellige Zahl handelt.
Zum Beispiel:
13214 % 100 wäre 14, jedoch war der Code folgendermaßen gedacht: 13|21|4 und nicht 1|32|14.
Also würde das Programm eine andere Reihenfolge eingehen.
Aber:
132104 % 100 wäre 4 und somit würde der Code in der richtigen Reihenfolge (13|21|04) übersetzt werden.
Ich bedanke mich im Voraus und wünsche allen alles Gute für das kommende Jahr.
GUI-Klasse:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Codieren extends JFrame {
// Anfang Attribute
private Label lbl_Dechiffrieren = new Label();
private Label lbl_Zahl = new Label();
private NumberField nf_Zahl = new NumberField();
private Label lbl_Ergebnis = new Label();
private TextArea txt_Ergebnis = new TextArea("", 1, 1, TextArea.SCROLLBARS_BOTH);
private Button but_Los = new Button();
private Button but_Nochmal = new Button();
private Button but_Beenden = new Button();
String ergebnis = " ";
double zahl;
Umwandeln meineKlasse = new Umwandeln(ergebnis, zahl);
// Ende Attribute
public Codieren(String title) {
// Frame-Initialisierung
super(title);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 530;
int frameHeight = 472;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten
lbl_Dechiffrieren.setBounds(176, 40, 147, 49);
lbl_Dechiffrieren.setText("Dechiffrieren");
lbl_Dechiffrieren.setAlignment(Label.CENTER);
lbl_Dechiffrieren.setFont(new Font("Dialog", Font.BOLD, 16));
cp.add(lbl_Dechiffrieren);
lbl_Zahl.setBounds(24, 112, 123, 33);
lbl_Zahl.setText("Bitte Code eingeben:");
lbl_Zahl.setAlignment(Label.RIGHT);
cp.add(lbl_Zahl);
nf_Zahl.setBounds(160, 112, 337, 33);
nf_Zahl.setText("");
cp.add(nf_Zahl);
lbl_Ergebnis.setBounds(24, 200, 123, 33);
lbl_Ergebnis.setText("Ergebnis:");
lbl_Ergebnis.setAlignment(Label.RIGHT);
cp.add(lbl_Ergebnis);
txt_Ergebnis.setBounds(160, 200, 337, 169);
txt_Ergebnis.setEditable(false);
cp.add(txt_Ergebnis);
but_Los.setBounds(392, 160, 105, 25);
but_Los.setLabel("Los!");
but_Los.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
but_Los_ActionPerformed(evt);
}
});
but_Los.setFont(new Font("Dialog", Font.BOLD, 12));
cp.add(but_Los);
but_Nochmal.setBounds(272, 384, 105, 41);
but_Nochmal.setLabel("Nochmal!");
but_Nochmal.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
but_Nochmal_ActionPerformed(evt);
}
});
but_Nochmal.setFont(new Font("Dialog", Font.BOLD, 12));
cp.add(but_Nochmal);
but_Beenden.setBounds(392, 384, 105, 41);
but_Beenden.setLabel("Beenden");
but_Beenden.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
but_Beenden_ActionPerformed(evt);
}
});
but_Beenden.setFont(new Font("Dialog", Font.BOLD, 12));
cp.add(but_Beenden);
// Ende Komponenten
setVisible(true);
} // end of public Codieren
// Anfang Methoden
public static void main(String[] args) {
new Codieren("Codieren");
} // end of main
public void but_Los_ActionPerformed(ActionEvent evt) {
zahl = nf_Zahl.getDouble();
txt_Ergebnis.setText(ergebnis = meineKlasse.Start(ergebnis, zahl));
nf_Zahl.clear();
zahl = 0.0;
} // end of but_Los_ActionPerformed
public void but_Nochmal_ActionPerformed(ActionEvent evt) {
nf_Zahl.clear();
txt_Ergebnis.setText("");
zahl = 0.0;
ergebnis = "";
} // end of but_Nochmal_ActionPerformed
public void but_Beenden_ActionPerformed(ActionEvent evt) {
System.exit(0);
} // end of but_Beenden_ActionPerformed
// Ende Methoden
} // end of class Codieren
Umwandeln (Sub-Klasse):
Java:
public class Umwandeln{
public double zahl;
public double rest;
public String ergebnis;
public String [] alphabet = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","ß","ö","ü","ä",".",",","?","!"," "};
public Umwandeln(String pergebnis, double pzahl){
ergebnis = pergebnis;
zahl = pzahl;
}
public String Start(String ergebnis, double zahl){
while (zahl >= 0) {
rest = zahl % 100.0;
zahl = (zahl / 100.0) - (rest / 100.0);
if (zahl == 0) {
ergebnis = alphabet[(int)rest].toUpperCase() + ergebnis;
zahl -= 1.0;
}
else {
ergebnis = alphabet[(int)rest] + ergebnis;
}
rest = 0.0;
}
return ergebnis;
}