myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

Java: Währungsrechner

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 26.11.13, 20:41   #1
D4r14n
Anfänger
 
Registriert seit: Nov 2013
Ort: Wesel
Beiträge: 2
Bedankt: 0
D4r14n ist noch neu hier! | 0 Respekt Punkte
Standard Java: Währungsrechner

Wunderschönen guten Abend,
ich wollte mal wissen was ihr von meinem Programm für die Schule haltet. Ich bin mir das nicht so ganz sicher ob das so gut ist wie es ist. :/
Und um es nebenbei zu erwähnen wir arbeiten mit der basis.jar von unserer Schule.
PHP-Code:
import basis.*;
public class 
Umrechner
{
    private 
Fenster fenster;
    
// RechenFelder
    
private ZahlenFeld feld1,feld2;
    
// Währungen
    
private WahlBoxGruppe von,zu;
    private 
WahlBox euro,dm,usd,euro1,dm1,usd1;
    
// Umrechnen & Beenden
    
private Knopf ende,umr;
    
// Namen
    
private BeschriftungsFeld bfeld1,bfeld2;   
    
// Namenvariablen
    
private String a,b;
    private 
double ergebnis;
    public 
Umrechner()
    {
        
// Window Size etc.
        
fenster = new Fenster("Umrechner",300,200);
        
// RechenFelder
        
feld1 = new ZahlenFeld(20,20,80,20);
        
feld2 = new ZahlenFeld(20,50,80,20);
        
// NamensFelder
        
bfeld1 = new BeschriftungsFeld(a,110,20,40,20);
        
bfeld2 = new BeschriftungsFeld(b,110,50,40,20);
        
// WahlFelder von zu
        
von = new WahlBoxGruppe();
        
euro = new WahlBox("€",150,20,40,20);
        
dm = new WahlBox("DM",150,40,40,20);
        
usd = new WahlBox("$",150,60,40,20);
        
// WahlFelder zu von        
        
zu = new WahlBoxGruppe();
        
euro1 = new WahlBox("€",190,20,40,20);
        
dm1 = new WahlBox("DM",190,40,40,20);
        
usd1 = new WahlBox("$",190,60,40,20);     
        
// Knopjes
        
ende = new Knopf("Ende",fenster.breite()-50,fenster.hoehe()-50,50,50);
        
umr = new Knopf(" in " b,0,fenster.hoehe()-50,80,50);
    }

    public 
void fuehreAus()
    {   

        
// Von-zu-Gruppen zuordnung
        
von.fuegeEin(euro);
        
von.fuegeEin(dm);
        
von.fuegeEin(usd);
        
// Zu-von-Gruppen zuordnung
        
zu.fuegeEin(euro1);
        
zu.fuegeEin(dm1);
        
zu.fuegeEin(usd1);
        
// Presets
        
von.setSelectedCheckbox(euro);
        
zu.setSelectedCheckbox(dm1);
        
feld2.setEditable(false);
        while(!
ende.wurdeGedrueckt())
        {   
            
// Aktion auf UmrechenKnopf
            
if(umr.wurdeGedrueckt())
            {
                
// Euro zu XX 
                
if(euro.istGewaehlt())
                {
                    if(
dm1.istGewaehlt())
                    {
                        
// Original
                        // feld2.setzeZahl(feld1.zahl() * (double)1.95583);
                        // 2 Nachkommastellen
                        
ergebnis feld1.zahl() * (double)1.95583
                        
ergebnis ergebnis 100;
                        
ergebnis Math.round(ergebnis);
                        
ergebnis ergebnis 100;
                        
feld2.setzeZahl(ergebnis);                       
                    }
                    if(
usd1.istGewaehlt())
                    {
                        
// Original
                        //feld2.setzeZahl(feld1.zahl() / (double)0.738171);
                        // 2 Nachkommastelllen
                        
ergebnis feld1.zahl() / (double)0.738171
                        
ergebnis ergebnis 100;
                        
ergebnis Math.round(ergebnis);
                        
ergebnis ergebnis 100;
                        
feld2.setzeZahl(ergebnis);       
                    }
                    if(
euro1.istGewaehlt())
                    {
                        
feld2.setzeZahl(feld1.zahl());
                    }
                }
                
// DM zu XX
                
if(dm.istGewaehlt())
                {
                    if(
dm1.istGewaehlt())
                    {
                        
feld2.setzeZahl(feld1.zahl());
                    }
                    if(
usd1.istGewaehlt())
                    {
                        
//feld2.setzeZahl(feld1.zahl() / (double)1.44374);
                        
ergebnis feld1.zahl() / (double)1.44374
                        
ergebnis ergebnis 100;
                        
ergebnis Math.round(ergebnis);
                        
ergebnis ergebnis 100;
                        
feld2.setzeZahl(ergebnis);
                    }
                    if(
euro1.istGewaehlt())
                    {
                        
//feld2.setzeZahl(feld1.zahl() / (double)1.95583);
                        
ergebnis feld1.zahl() / (double)1.95583
                        
ergebnis ergebnis 100;
                        
ergebnis Math.round(ergebnis);
                        
ergebnis ergebnis 100;
                        
feld2.setzeZahl(ergebnis);
                    }
                }
                
// USD zu XX
                
if(usd.istGewaehlt())
                {
                    if(
dm1.istGewaehlt())
                    {
                        
//feld2.setzeZahl(feld1.zahl() * (double)1.44374);
                        
ergebnis feld1.zahl() * (double)1.44374
                        
ergebnis ergebnis 100;
                        
ergebnis Math.round(ergebnis);
                        
ergebnis ergebnis 100;
                        
feld2.setzeZahl(ergebnis);
                    }
                    if(
usd1.istGewaehlt())
                    {
                        
feld2.setzeZahl(feld1.zahl());
                    }
                    if(
euro1.istGewaehlt())
                    {
                        
//feld2.setzeZahl(feld1.zahl() * (double)0.738171);
                        
ergebnis feld1.zahl() * (double)0.738171
                        
ergebnis ergebnis 100;
                        
ergebnis Math.round(ergebnis);
                        
ergebnis ergebnis 100;
                        
feld2.setzeZahl(ergebnis);
                    }
                }                
            }
            
currentName();            
            
Hilfe.kurzePause();
        }
        
fenster.gibFrei();
    }

    public 
void currentName()
    {
        
// Namesgebung Var1
        
if(euro.istGewaehlt())
        {
            
"€";
        }
        if(
dm.istGewaehlt())
        {
            
"DM";
        }
        if(
usd.istGewaehlt())
        {
            
"$";
        }
        
// Namesgebung Var2
        
if(euro1.istGewaehlt())
        {
            
"€";
        }
        if(
dm1.istGewaehlt())
        {
            
"DM";
        }
        if(
usd1.istGewaehlt())
        {
            
"$";
        }
        
// Var1 + Var2 (& BeschriftungsFeldNamen)
        
bfeld1.setzeText(a);
        
bfeld2.setzeText(b);
        
umr.setzeText(" in " b);
    }

Ich bin offen für alle Verbesserungen und Ratschläge.
Danke im Vorraus,
D4r14n
D4r14n ist offline   Mit Zitat antworten
Ungelesen 26.11.13, 22:11   #2
NetWebs
Banned
 
Registriert seit: Aug 2012
Beiträge: 223
Bedankt: 68
NetWebs ist noch neu hier! | 0 Respekt Punkte
Standard

Hi...

.. das ist so schwer zu sagen.
Der Code ist - um es kurz und knapp zu sagen - ziemlich schlecht.
Schlecht, da zu viele Abhängigkeiten existieren und nahe zu jede Zeile gegen OOP-Grundsätze verstößt.

Andererseits kannst du von diesen OOP-Grundsätzen in der Schule mit Sicherheit nie etwas gehört haben. Ich bin mir auch sicher, dass euer Lehrer keine Ahnung hat, was OOP, OOAD etc. wirklich bedeuten.

Du solltest Dir mal die Designfragen durch den Kopf gehen:
- Warum hat dein Umrechner ein Fenster? Der Währungsumrechner soll Währungen umrechnen! Wozu braucht er ein Fenster?

- Warum kann dein Währungsumrechner KEINE Währung umrechnen? Genau das ist doch seine Aufgabe... der Umrechner hat aber lediglich die Methode "currentName" und "fuehreAus"?

- Wo kann man dem Währungsrechner denn mitteilen, welche Währung und welcher Betrag umgerechnet werden soll?


Das macht so doch keinen Sinn.
Des Weiteren ist der Code an vielen Stellen kopiert und nicht in Methoden ausgelagert.
NetWebs ist offline   Mit Zitat antworten
Ungelesen 26.11.13, 22:27   #3
D4r14n
Anfänger
 
Registriert seit: Nov 2013
Ort: Wesel
Beiträge: 2
Bedankt: 0
D4r14n ist noch neu hier! | 0 Respekt Punkte
Standard

So sollte das ganze aussehen, deswegen auch das Fenster.
Wir Arbeiten in BlueJ.

Und so sieht mein Programm aus, wenns läuft:
D4r14n ist offline   Mit Zitat antworten
Ungelesen 27.11.13, 06:41   #4
ProgMaster
Banned
 
Registriert seit: Mar 2012
Beiträge: 337
Bedankt: 93
ProgMaster ist noch neu hier! | 0 Respekt Punkte
Standard

Du hast ihn wohl nicht ganz verstanden.
Stell dir vor Du kaufst einen Taschenrechner für die Schule. Dann willst du den Taschenrechner während einer Klausur verwenden...plötzlich steht auf dem Display: "Taschenrechner funktioniert nicht ohne Monitor"...man muss einen Monitor anschließen damit der Taschenrechner funktioniert. Das wäre doch Unsinn.

Dann fehlen dem Taschenrechner sogar noch die + und - Tasten...stattdessen hat er die Tasten OK und JETZT. Und zuallerletzt fehlen dem Taschenrechner noch die Zahlen.

So ein Taschenrechner macht keinen Sinn, oder?
Leider macht es dein Währungsrechner nicht besser.

Ich hoffe Du verstehst jetzt...
ProgMaster ist offline   Mit Zitat antworten
Ungelesen 27.11.13, 20:51   #5
mrburns
Newbie
 
Registriert seit: Dec 2009
Beiträge: 50
Bedankt: 28
mrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punkte
Standard

Was dir ProgMaster zu verklickern versucht ist, dass man, besonders im OO-Programmiersprachen (aber eigentlich in allen anderen auch) versucht, GUI-, Verarbeitungs- und Datenebene zu trennen.
Die Objektorientierung ist dahingehend modern, dass sich dies durch verschiedene Klassen sehr angenehm regeln lässt.
Bei deinem Programm jedoch werden jedoch alle Ebenen vollkommen durcheinander geworfen.

Und nochmal ganz einfach gesagt: ihr benutzt eine Objektorientierte Sprache, schreibt aber im schlechten Stil einer imperativen Programmiersprache. Das kann allerdings an deinen Lehrer liegen, vielleicht wollte er euch das später beibringen, wenn nicht, ist zweifel an seiner Lehrfähigkeit angebracht.

Zudem befinden sich in deinem Programm sehr viele Stellen, an denen sich sehr ähnlicher Code wiederholt. Dass sich sowas in Funktionen auslagern lässt, solltet ihr allerdings schon gelernt haben.
Was auch noch auffällt ist das verwendete 'Denglisch' in deinem Code und ein paar Variablen, deren Bezeichner ziemlich undurchsichtig sind (a, b, feld1, feld 2), sowas führt ganz schnell zu Augenkrebs und Undurchsichtigkeit, wenn man den Code später nochmal nachbessern oder allgemein verstehen möchte (in deinem Fall noch nicht, da die Menge noch sehr überschaubar ist).

Verbesserungsvorschläge meinerseits:

- eine Klasse für den eingegebenen Betrag
* entscheide dich für eine Basiswährung mit der du rechnest, z.B. USD
* mit deiner Eingabe legst du ein neues Objekt des Betrages an, als Übergabeparameter des Konstruktors einmal den Betrag und die eingegebene Währung
* mit dem Konstruktor rechnest du den Betrag sofort in die Basiswährung um
* die Betragsklasse hat min eine weitere Methode, die den Betrag in anderen Währungen zurückgibt, als Übergabeparameter dient hier wieder die Währung

- eine Enumeration für die Währung, also einfach nur eine Aufzählung aller unterstützter Wärungen, die (Java macht's möglich) mit dem Verhältnis von Basiswährung / Währung bestückt sind

- deine GUI-Klasse bildet die Radiobuttons für die Währungen auf die Objekte der Enumeration ab


Das ganze mit möglichst vielsagenden, englischen Bezeichnern und es hat die Bezeichnung 'Programm' verdient.

Grüße und viel Spaß beim lernen
mrburns ist offline   Mit Zitat antworten
Ungelesen 27.11.13, 21:24   #6
ProgMaster
Banned
 
Registriert seit: Mar 2012
Beiträge: 337
Bedankt: 93
ProgMaster ist noch neu hier! | 0 Respekt Punkte
Standard

Ich bin mir ziemlich sicher, dass sein Lehrer OOP etc. nicht kennt und/oder versteht. Ich habe schon Entwickler kennengelernt, die mit 15 Jahren Berufserfahrung, das nicht verstanden haben.

Ich dachte ich versuche es eher bildlich zu erklären, da meiner Meinung nach es besonders für Anfänger sehr schwer zu verstehen warum oder wie man zu abstrahieren hat. Ich denke der einfachste Einstieg ist zunächst eine Formalisierung der Ziele.

In diesem Falle wäre das:
Was ist ein Währungsrechner?
"Ein Währungsrechner kann einen Betrag einer Währung in den Betrag einer anderen Währung umrechnen."


Formalisiere ich nun den hier vorgestellten Code so kommt dies raus:
Was ist ein Währungsrechner?
"Ein Währungsrechner kann ausgeführt werden kann und den aktuellen Namen.
Währungen und Betrag können dem Währungsrechner nicht übergeben werden.
Ein Währungsrechner gibt auch kein Ergebnis aus.
Ein Währungsrechner muss ein Fenster haben, Knöpfe und Eingabefelder.
Beim Ausführen wird solange bis der Ende-Knopf nicht gedrückt wurde, überprüft, ob welche Checkboxen ausgewählt wurden.
Ist die USD- und die DM-Checkbox ausgewählt so wird ein Währungsrechner den Betrag aus der Textbox Zahl1 ermitteln und diesen mit 1,xxx multiplizieren und diesen Betrag in die Textbox Zahl2 schreiben.
Ist die USD- und die EUR-Checkbox ausgewählt so wird ein Währungsrechner den Betrag aus der Textbox Zahl1 ermitteln und diesen mit 1,xxx multiplizieren und diesen Betrag in die Textbox Zahl2 schreiben.
Ist die USD- und die USD-Checkbox ausgewählt so wird ein Währungsrechner den Betrag aus der Textbox Zahl1 ermitteln und diesen mit 1,xxx multiplizieren und diesen Betrag in die Textbox Zahl2 schreiben.
Ist die DM- und die DM-Checkbox ausgewählt so wird ein Währungsrechner den Betrag aus der Textbox Zahl1 ermitteln und diesen mit 1,xxx multiplizieren und diesen Betrag in die Textbox Zahl2 schreiben.
Ist die DM- und die EUR-Checkbox ausgewählt so wird ein Währungsrechner den Betrag aus der Textbox Zahl1 ermitteln und diesen mit 1,xxx multiplizieren und diesen Betrag in die Textbox Zahl2 schreiben.
Ist die DM- und die USD-Checkbox ausgewählt so wird ein Währungsrechner den Betrag aus der Textbox Zahl1 ermitteln und diesen mit 1,xxx multiplizieren und diesen Betrag in die Textbox Zahl2 schreiben.
Ist die EUR- und die DM-Checkbox ausgewählt so wird ein Währungsrechner den Betrag aus der Textbox Zahl1 ermitteln und diesen mit 1,xxx multiplizieren und diesen Betrag in die Textbox Zahl2 schreiben.
Ist die EUR- und die EUR-Checkbox ausgewählt so wird ein Währungsrechner den Betrag aus der Textbox Zahl1 ermitteln und diesen mit 1,xxx multiplizieren und diesen Betrag in die Textbox Zahl2 schreiben.
Ist die EUR- und die USD-Checkbox ausgewählt so wird ein Währungsrechner den Betrag aus der Textbox Zahl1 ermitteln und diesen mit 1,xxx multiplizieren und diesen Betrag in die Textbox Zahl2 schreiben.
Danach wird aktueller Name und das Fenster frei gegeben.
Wenn aktueller Name, dann wird überprüft welche Checkbox ausgewählt wurde.
Ist die EUR-Checkbox ausgwählt, so erhält eine Zeichenkette a den Wert "EUR".
Ist die USD-Checkbox ausgwählt, so erhält eine Zeichenkette a den Wert "USD".
Ist die DM-Checkbox ausgwählt, so erhält eine Zeichenkette a den Wert "DM".
Ist die EUR-Checkbox ausgwählt, so erhält eine Zeichenkette b den Wert "EUR".
Ist die USD-Checkbox ausgwählt, so erhält eine Zeichenkette b den Wert "USD".
Ist die DM-Checkbox ausgwählt, so erhält eine Zeichenkette b den Wert "DM".
Zuletzt wird der graphischen Komponente umr der Text zugewiesen, der sich aus a und b ergibt."
ProgMaster ist offline   Mit Zitat antworten
Ungelesen 29.12.13, 21:09   #7
prince_pika
Anfänger
 
Benutzerbild von prince_pika
 
Registriert seit: Jul 2013
Beiträge: 35
Bedankt: 7
prince_pika ist noch neu hier! | 0 Respekt Punkte
Standard

Komme zwar eigentlich eher aus der .NET Ecke aber habe mich einfach mal damit beschäftigt. Muss sagen das es eigentlich geht vom Aufwand etc und sehr an C erinnert was ich dank µController auch schon gemacht habe.
Falls du noch Hilfe brauchst oder so könnte ich dir mein Übungsprgramm geben

[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]


//Edit

Um dir Hilfe zu geben:

Die Währungen einfach in ne Array packen und mit dem Index die Typennummer festlegen. Genauso in die Comboboxen laden die dann den selben Index haben. Mit Index 1 und 2 weißt dann von wo nach wo gerechnet werden soll. Einfach noch eine Funktion schreiben und die werte dann von GUI in die Funktion geben und die entsprechend rechnen lassen.
Die ist eigentlich die meiste Arbeit wert wenn man die Umrechnungen nicht aus dem kopf weiß
__________________
Alone in a world - With millions of souls -Walking in Circles
Trapped in their dreams- Unhealthy, unclean -Walking in Circles, now - Do not disturb - Scream in silence - Everyone's sleeping ...
prince_pika ist offline   Mit Zitat antworten
Ungelesen 29.12.13, 22:09   #8
prince_pika
Anfänger
 
Benutzerbild von prince_pika
 
Registriert seit: Jul 2013
Beiträge: 35
Bedankt: 7
prince_pika ist noch neu hier! | 0 Respekt Punkte
Standard

Ich lege nicht in der Array etwas fest, ich nehme nur dessen Index oder Feldanzahl sprich die Reihenfolge und übertrage diese auf die Comboboxen. Die entsprechende Funktion bekommt einfach die Zahlen zum Fressen sprich mit einem Aufruf Von 1 zu 3 mit dem Wert 5 wird umgerechnet. Hätte sicherlich auch ein Enum nehmen können aber das kam mir eben als erstes in den Sinn
Ich selber achte nur immer darauf Code Teile später weiter verwenden zu können, wäre bei der Funktion kein Problem.
Ansonsten werde ich es mir mal anschauen mehr OO zu progen auch wenn ichs nur Hobbymäßig mache und sonst alles immer lief


Ps. GUI und Vearbeitung sind natürlich strikt getrennt
__________________
Alone in a world - With millions of souls -Walking in Circles
Trapped in their dreams- Unhealthy, unclean -Walking in Circles, now - Do not disturb - Scream in silence - Everyone's sleeping ...
prince_pika ist offline   Mit Zitat antworten
Ungelesen 31.12.13, 11:18   #9
mrburns
Newbie
 
Registriert seit: Dec 2009
Beiträge: 50
Bedankt: 28
mrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punktemrburns putzt sich die Zähne mit Knoblauch. | 2787 Respekt Punkte
Standard

Guten Morgen,

Mit einem Array? ...das klingt schon wieder so undynamisch, wie es nur sein kann.
Ich hab anscheinend zu viel Langeweile, also hab ich mich mal rangesetzt und was zusammengeschustert: wie in meinem letzten Beitrag beschrieben funktioniert alles über eine Enumeration für die Währungen und eine Klasse, die den Wert darstellt. Hinzu kommt natürlich noch eine Klasse für das JFrame, welche gleich noch die main-Methode enthält.
Neue Währungen lassen sich recht schnell in der Enumeration mit ihrem Verhältnis zum USD hinzufügen und werden damit schon komplett ins restliche Programm integriert.

Hier das Projekt: [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
und nur die .jar : [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]

Der Code mag in der Klasse für das JFrame etwas ungeordnet wirken, aber ich hab schon lange nichts mehr mit swing gemacht, deshalb entschuldigt mich.

Viel Spaß damit und schönen Tag
mrburns ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 Uhr.


Sitemap

().