einfach berechnung einer onlinezeit

  • Themenstarter Themenstarter DNAofDeath
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

DNAofDeath

Gast
Ich möchte einen UserLevel berechnen und auch ausgeben lassen.
Anhand von drei werten:
1. OnlineMinuten
2. Registrierungsdatum
3. Heutiges datum


ich komm net klar, immer wenn ich ne zahl eingebe kommt 0,0 % raus ,wenn ich jedoch die zeile mit

Code:
//double onMin = 1386996 ;

benutze dann kommt das ergebnis 48,0 % raus welches auch richtig ist

hier mal der gesamte bisherige code, ich arbeite mich langsam vorran, vorerst mit festen werten für die zeit zwischen den daten, da ich noch nicht weiß wie ich das umsetzen soll, hab also erstmal mit der berechnung angefangen.

Code:
 public static void main(String[] args) throws IOException {
        
        //Eingabe
        
        
        System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
        double onMin = System.in.read();
        
        
        //Rechenweg
        
        
        
        double min = 2854080 ;
        
        //double onMin = 1386996 ;
        double viel = 10 ;
        double eingabezahl ;
        double pro = 100 ;
        double onMinRounded ;
        
        double erg = (pro / min) * onMin ;
        erg = Math.round( erg * 100. ) / 100.;
        
        
        
        
        
        erg = (int) erg;
        
        if (erg > viel ) {
            System.out.println("Ziemlich viel!!!");
        }
        System.out.println("Du warst " + erg  + " % Deines Lebens hier Online seit Du dich registriert hast");
        
        
    }
    
}
 
Code:
erg = (int) erg;
<~~~~hab ich natürlich auch auskommentiert
 
Debuggen!
Oder wenigstens ausgeben lassen was eingegeben wurde.
Code:
double onMin = System.in.read();
System.out.println(onMin);
Ich bin mir recht sicher dass dir das schon helfen wird (oder zumindest verwundern ;-) ).
Sogleich wird die Frage aufkommen, was da wohl passiert. Erklärung: klick
Lösung: nimm Scanner oder einen Reader (BufferedReader z.B.). Die Forensuche oder ein Java-Buch sollten dir helfen.
 
also ich hab die forensuche benutzt, google 5 - 6 stunden lang gequält, meine E-Book sammlung durchgeschaut, und mein Video2Brain auseinandergenommen, ich scheine einfach nicht den nötigen IQ zu haben >_<

ich habs auch schon so versucht:

Code:
 InputStreamReader isr = new InputStreamReader (System.in );
        BufferedReader bReader = new BufferedReader ( isr ) ;
        String onMin = bReader.readLine ();
        
        double onMinD = Double.parseDouble( onMin ) ;

oder so:


Code:
       double onMin ;
       Scanner input = new Scanner(System.in);
       onMin = input.nextDouble();


weder mit dem ISR noch mit dem Scanner komme ich weiter, kann mir einer helfen?
 
DNAofDeath hat gesagt.:
Code:
 InputStreamReader isr = new InputStreamReader (System.in );
        BufferedReader bReader = new BufferedReader ( isr ) ;
        String onMin = bReader.readLine ();
        
        double onMinD = Double.parseDouble( onMin ) ;

Das klappt doch?
Musst nur aufpassen, dass du einen Punkt eingibst also "1.12" und nicht "1,12"

Am Schluß sollte aber noch der Reader geschlossen werden mit
Code:
bReader.close();


Falls etwas nicht "klappt" bitte beschreiben, was schief läuft bzw. was passiert und was du erwartest und was für Fehler angezeigt werden.
 
WOW danke für die schnelle antwort =)

das problem ist das ich eine ganzzahl eingebe und keine fließkommazahl, ach was solls ich poste nochmal das ganze
script,


Code:
public static void main(String[] args) throws IOException {
        
        //Eingabe
               
        System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
        
        InputStreamReader isr = new InputStreamReader (System.in );
        BufferedReader bReader = new BufferedReader ( isr ) ;
        String onMin = bReader.readLine ();
        
        Double onMinD = Double.parseDouble( onMin ) ;
        
        //Rechenweg
        
        double min =  1923840;
        
        //double onMin = 967748; <----------hier habe ich den wert der eingegeben werden soll anfangs festegelegt, so klappts ja dann auch
        
        int viel = 10 ;
        double eingabezahl ;
        double pro = 100 ;
        
        
        double erg = (pro / min) * (double) onMinD ;
        erg = Math.round( erg * 100. ) / 100.;
        
        //Ausgabe
        
        if (erg > viel ) {
            System.out.println("Ziemlich viel!!!");
        }
        System.out.println("Du warst " + erg  + " % Deines Lebens hier Online seit Du dich registriert hast");
        
        bReader.close();
    }

ich bekomme immer den fehler
Code:
Exception in thread "main" java.lang.NullPointerException
        at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:991)
        at java.lang.Double.parseDouble(Double.java:510)
        at DNA.java.Berechnung.main(Berechnung.java:39)
Java Result: 1

wenn ich die zahl ohne . eigebe, aber so soll das ja später sein, ich kann aber keinen integer parsen udn dann nachher in einen double umwandeln, oder ich habs falsch versucht >-<
 
ich verstehe irgenwie nicht, wo das Problem ist. Bei mir kommt keine Exception (bzw. ne andere).
Gib bitte mal so an was genau du machst:
Code:
Bitte eingeben wieviele OnlineMinuten du hast
0.1
Du warst 0.0 % Deines Lebens hier Online seit Du dich registriert hast

Bitte eingeben wieviele OnlineMinuten du hast
1000
Du warst 0.05 % Deines Lebens hier Online seit Du dich registriert hast

Bitte eingeben wieviele OnlineMinuten du hast
10,0
Exception in thread "main" java.lang.NumberFormatException: For input string: "10,0"
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
	at java.lang.Double.parseDouble(Double.java:482)
	at TestClass.main(TestClass.java:24)
 
Das problem ist irgendwie komisch,

wenn ich beim ersten mal zb 123.456 eigebe dann klappt alles, wenn ich es jedoch beim nächsten mal wieder eingebe dann bekomme ich nen fehler gemeldet, wenn ich beim nächsten mal jeodch 123 ,also eine ganzzahl eingebe dann kommt wieder kein fehler, aber wenn ich danach nochmal eine ganzzahl eigebe dann kommt wieder ein fehler, dh ich muss immer abwechselnd eine fließkommazahl eingeben und dann eine ganzzahl, wer weiß waoran das liegt?
 
Poste doch bitte mal das komplette Programm was du aktuell hast. Dazu die genauen Eingaben und was dann ausgegeben wird.
 
Code:
/*
 * Berechnung.java
 *
 * Created on 23. November 2007, 15:05
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package DNA.java;

import java.text.*;
import java.io.* ;
import java.util.*;
import java.lang.*;
/**
 *
 * @author Administrator
 */
public class Berechnung {
    
    /** Creates a new instance of Berechnung */
    public Berechnung() {
        
        
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        
        
        
            //Eingabe der OnlineMinuten 
        
            System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");

            InputStreamReader isrOnMin = new InputStreamReader(System.in );
             BufferedReader bReaderOnMin = new BufferedReader( isrOnMin ) ;
             String onMin = bReaderOnMin.readLine();
            
             Double onMinD = Double.parseDouble( onMin ) ;

//            //Eingabe des Registrierungsdatums (soll nachher in Date from eingesetzt werden)
             
//            System.out.println("Bitte eingeben seit wann du registriert bist (TT.MM.YYYY)");
//
//            InputStreamReader isrDate = new InputStreamReader(System.in );
//            BufferedReader bReaderDate = new BufferedReader( isrDate ) ;
//            String regDate = bReaderDate.readLine();
        
        
        //Rechenweg für die Prozent.
        
        double min =  2450880; //soll später durch diffMins ersetzt werden
        //double onMinD = 2848; // wird durch die eingabe vom user ersetzt
        int viel = 10 ;
        double pro = 100 ;
        
        
        double erg = (pro / min ) * (double) onMinD ;
        erg = Math.round( erg * 100. ) / 100.;
        
        //Berechnung der Differenz zwischen Anmeldedatum und heutigem Datum in Minuten
       
        
        try {
            DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
            Date from = df.parse("26.09.2003"); //soll später durch eine eingabe vom user ersetzt werden
            Date to = df.parse("24.11.2007");
            double diffMillis = to.getTime() - from.getTime();
            double diffMins =  diffMillis / (1000 * 60 ); //diffMins kann ich nicht in die berechnung einfügen als min, muss ich aber ,ist ja die differenz
            System.out.println("Die Differenz in Minuten ist " + diffMins + " Minuten");
            System.out.println("Du hast dich am " + df.format(from) + " hier registriert");
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        
        //Ausgabe
        
        if (erg > viel ) {
            System.out.println("Ziemlich viel!!!");
        }
        System.out.println("Du warst " + erg  + " % Deines Lebens hier Online seit Du dich registriert hast");
        //bReaderDate.close(); //schließt nachher den bufferedreader für die datumseingabe wieder.
        bReaderOnMin.close();
        
        
    }
    
}
 
genaue eingaben gibt es nicht, da die onlineminuten immer verschieden sind, daher sind die ausgaben auch immer anders

aber die eingabe ist immer eine ganzzahl, wobei aber nachher beim ausrechnen der % eine fließkommazahl benötigt wird
 
DNAofDeath hat gesagt.:
wenn ich beim ersten mal zb 123.456 eigebe dann klappt alles, wenn ich es jedoch beim nächsten mal wieder eingebe dann bekomme ich nen fehler gemeldet, wenn ich beim nächsten mal jeodch 123 ,also eine ganzzahl eingebe dann kommt wieder kein fehler, aber wenn ich danach nochmal eine ganzzahl eigebe dann kommt wieder ein fehler, dh ich muss immer abwechselnd eine fließkommazahl eingeben und dann eine ganzzahl, wer weiß waoran das liegt?
DNAofDeath hat gesagt.:
genaue eingaben gibt es nicht, da die onlineminuten immer verschieden sind, daher sind die ausgaben auch immer anders
:bahnhof:

DNAofDeath hat gesagt.:
aber die eingabe ist immer eine ganzzahl, wobei aber nachher beim ausrechnen der % eine fließkommazahl benötigt wird
Die Eingabe ist erst mal ein String. Der wird dann in ein double umgewandelt und dem double ist das egal, ob du Nachkommastellen im String hattest oder nicht.

Ich kann dir nur sagen: bei mir funktioniert das. Folge: du machst was anderes als ich :wink:
">" ist der Prompt auf der Kommandozeile.
Code:
> javac Berechnung.java

> java Berechnung
Bitte eingeben wieviele OnlineMinuten du hast
123.456
Die Differenz in Minuten ist 2188860.0 Minuten
Du hast dich am 26.09.2003 hier registriert
Du warst 0.01 % Deines Lebens hier Online seit Du dich registriert hast

> java Berechnung
Bitte eingeben wieviele OnlineMinuten du hast
123
Die Differenz in Minuten ist 2188860.0 Minuten
Du hast dich am 26.09.2003 hier registriert
Du warst 0.01 % Deines Lebens hier Online seit Du dich registriert hast

Eins noch:
Code:
//nicht so schön:
Double onMinD = Double.parseDouble( onMin ) ;
...
double erg = (pro / min ) * (double) onMinD ;
...

//schöner:
double onMinD = Double.parseDouble( onMin ) ;
...
double erg = (pro / min ) * onMinD ;
...
 
haha das mit dem (double) hab ich inzwischen schon gemacht, ich weiß auch wo mein (äusserst blöder) anfängerfehler war, wenn ich in der IDE die ich benutze etwas in die eingabe zeile schriebe beim ausführen, und dann später das prog nochmal ausführen lasse dann steht zwar die eingabe die ich beim letzten mal hab immernoch in der zeile, wenn ich jedoch dann einfach enter drücke, dann hab ich in wirklichkeit garnichts eingegeben und es wir dann halt als NIX interpretiert und ich bekomme den fehler,

kannst du mir zufällig noch sagen wie ich es mache das man noch ein datum eingeben kann, das wäre sehr nett,
ich denke man muss dann einen string eingeben und den in ein datum umwandeln, aber die syntax dafür kenn ich nicht
 
Hier ist der Code schon:
Code:
Date from = df.parse("26.09.2003"); //soll später durch eine eingabe vom user ersetzt werden

So oder so ähnlich würd ich das machen:
Code:
InputStreamReader isrOnMin = new InputStreamReader(System.in ); 
             BufferedReader bReaderOnMin = new BufferedReader( isrOnMin ) ; 
             System.out.println("Bitte eingeben wieviele OnlineMinuten du hast"); 
             String onMin = bReaderOnMin.readLine(); 
             Double onMinD = Double.parseDouble( onMin ) ;

             System.out.println("Registrierungsdatum"); 
             String regDate = bReaderOnMin.readLine(); 
...
Date from = df.parse(regDate);
Dann natürlich noch Fehlerbehandlung. Wenn ein Benutzer z.B. "asdf" eingibt, das abfangen und nochmal eingeben lassen.
Grundsätzlich sollte man immer alle Benutzereingaben checken :wink:
 
dankeschön, ich werde mich jetrzt erstmal wieder versuchen selbst zu versorgen xD
 
na das war wohl nix, ich bekomme jetzt IMMER eine nullpointerexception

ich versteh nur net warum ?

ich mache alles so wie vorher nur das ich halt noch deinen code eingegeben hab

als grund für die exception nennt er mir die zeile

Code:
        Double onMinD = Double.parseDouble( onMin ) ;
 
Der fehler ist mal wieder einfach verschwunden 0o
mein programm funzt jetzt soweit, man kann also ein datum eingeben, dann wieviele minuten man dort verbracht hat seit man reg ist, und den rest ermittelt das programm, ich werde noch ne ausgabe machen wievielen stunden am tag die % sind, damit man sich auch etwas darunter vorstellen kann

hier mal der code, ich muss nur noch die usereingaben überprüfen und gegebenenfalls exeptions werfen


Code:
/*
 * Berechnung.java
 *
 * Created on 23. November 2007, 15:05
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package DNA.java;

import java.text.*;
import java.io.* ;
import java.util.*;
import java.lang.*;
/**
 *
 * @author Administrator
 */
public class Berechnung {
    
    /** Creates a new instance of Berechnung */
    public Berechnung() {
        
        
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        
        
        
        //Eingabe der OnlineMinuten
        
        System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
        
        InputStreamReader isrOnMin = new InputStreamReader(System.in );
        BufferedReader bReaderOnMin = new BufferedReader( isrOnMin ) ;
        String onMin = bReaderOnMin.readLine();
        
        Double onMinD = Double.parseDouble( onMin ) ;
        
            //Eingabe des Registrierungsdatums (soll nachher in Date from eingesetzt werden)
        
            System.out.println("Bitte eingeben seit wann du registriert bist (TT.MM.YYYY)");

            InputStreamReader isrRegDate = new InputStreamReader(System.in );
            BufferedReader bReaderRegDate = new BufferedReader( isrRegDate ) ;
            String regDate = bReaderRegDate.readLine();
            
            //System.out.println("Registrierungsdatum");
            
            
                       
        //Berechnung der Differenz zwischen Anmeldedatum und heutigem Datum in Minuten
        
        
        try {
            DateFormat defaultDate = DateFormat.getDateInstance();
            String datum = defaultDate.format(new java.util.Date());
            
            
            DateFormat df = new SimpleDateFormat("dd.MM.yyyy");
            Date from = df.parse(regDate); 
            
            //Date from = df.parse("26.09.2003"); //soll später durch eine eingabe vom user ersetzt werden
            
            Date to = df.parse(datum);
            double diffMillis = to.getTime() - from.getTime();
            
            double diffMins =  diffMillis / (1000 * 60 ); 
            
            System.out.println("Die Differenz in Minuten ist " + diffMins + " Minuten");
            System.out.println("Du hast dich am " + df.format(from) + " hier registriert");
            
            
            
            double min =  diffMins  ;
            int viel = 10 ;
            double pro = 100 ;
        
        
            double erg = (pro / min ) * (double) onMinD ;
            erg = Math.round( erg * 100. ) / 100.;
            
            
            //Ausgabe
        
        if (erg > viel ) {
            System.out.println("Ziemlich viel!!!");
        }
        System.out.println("Du warst " + erg  + " % Deines Lebens hier Online seit Du dich registriert hast");
        bReaderRegDate.close(); 
        bReaderOnMin.close();
        
        
        
        
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
            
            
        
        
            
            
        
        
        
    }
    
}
 
ja ich bin noch unerfahren xD

wie bekomme ich es hin das ich nen fehler auffange und dann ne relevante ausgabe bekomme?

zb wenn jemand anstatt eine zahl einen string eingibt , das das prog dann ausgibt

"du hast buchstaben eingegeben das ist falsch!"

ich habs noch net so mit Exception Handling, wäre lieb wenn mir da einer mal helfen könnte =)

der madboy war ja bei den anderen sachen auch sehr nett
 
Ich würde das nicht mit Exceptions machen (geht zwar auch aber ist nicht so "elegant") sondern mit einem regulären Ausdruck (regex).

Such am besten mal hier im Forum oder im Netz nach regex, da findet sich recht viel zum Thema.
Beispiel:
Code:
//Eingabe besteht nur aus Ziffern
String ziffern = "12345";
if( ziffern.matches("[0-9]+") ) {
  //Eingabe ok
} else {
  //nicht nur Ziffern im String
}

//Eingabe ist ein Datum, kein Check auf gültiges Datum! Hier würde z.B. auch 99.00.9999 akzeptiert werden.
String datum = "02.03.2005";
if( datum.matches("[0-9]{2}\\.[0-9]{2}\\.[0-9]{4}") ) {
  //Eingabe ok
} else {
  //kein gültiges Datum
}
 
ich will dir nicht unrecht geben, zu regex findet sich sogar extrem viel im internet (google und so) und auch viele pdfs und die java doc nicht zu vergessen (die ich mit eh nur selten angucken weils alles in englisch ist und manchmal nicht so verständlich wie ein ausformulierter deutscher text )

aber das ist

ZUVIEL für mich kleinen anfänger, das mit regex schein mir genauso kompliziert zu sein wie java oder c++ SELBST, so viele dinge es dort zu beachten gibt.

muss ich mich jetzt erst noch 3 wochen mit regulären ausdrücken beschäftigen oder gibt es eine einfachere methode um die eingaben zu überprüfen und gegebenenfalls einen fehler auszugeben ?

bitte nicht falsch verstehn, ich weiß das irgendwann die zeit kommt in der ich mich intensiver mit regex beschäftigen muss, aber im für den moment möchte ich erstmal die grundsyntax von java verinnerlichen, und nicht gleich mit etwas eigenständigem neuen anfangen.
 
Regex sind nicht sooo schwierig zu verstehen wie es den Anschein hat. Zumindest die Grundlagen sind nicht so kompliziert. Aber ok, ich kann das nachvollziehen dass man am Anfang recht schnell überfordert ist.

Wie schon geschrieben, gibt es eine andere (evtl. einfachere) Möglichkeit, nämlich Exceptions auszunutzen.


Code:
       //Ein Reader und ein InputStream reichen
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader bReader = new BufferedReader(isr);

        Double onMinD;
        Date from;

        try {
            System.out.println("Bitte eingeben wieviele OnlineMinuten du hast");
            String onMin = bReader.readLine();

            //so lange wiederholen bis Benutzer eine gültige Zahl eingibt.
            while (true) {

                try {
                    onMinD = Double.parseDouble(onMin);
                    break; //verlasse die while(true) Schleife

                } catch (NumberFormatException n) {
                    //neu einlesen und weiter in der while() Schleife
                    System.out.println("keine korrekte Eingabe, bitte nochmal");
                    onMin = bReader.readLine();
                }
            }

            DateFormat df = new SimpleDateFormat("dd.MM.yyyy");

            // Eingabe des Registrierungsdatums (soll nachher in Date from
            // eingesetzt werden)
            System.out.println("Bitte eingeben seit wann du registriert bist (TT.MM.YYYY)");
            String regDate = bReader.readLine();
       
            //so lange wiederholen bis Benutzer ein gültiges Datum eingibt.
            //Gültig ist hier allerdings auch 00.99.9999!
            while (true) {

                try {
                    from = df.parse(regDate);
                    break; //verlasse die while(true) Schleife

                } catch (ParseException p) {
                    //neu einlesen und weiter in der while() Schleife
                    System.out.println("keine korrekte Eingabe, bitte nochmal");
                    regDate = bReader.readLine();
                }
            }

            bReader.close();

           //jetzt hast du in from das eingegebene Datum und in onMinD die eingegebenen Onlineminuten.

        } catch (IOException i) {
            i.printStackTrace();
        }
 
jetzt bekomme ich immer eine illegal start of type nachricht angezeigt

beim ersten try
 
sorry hab den fehler behoben ist schon okay, danke für den codesnippet xDD

dann mach ich mich mal an die swing dran, ist ja auch noch ein buch mit sieben siegeln für mich, aber ich will ja eine GUI haben , ich hoffe ich kann wenigstens große teile meines programms übernehmen, und muss net alles komplett umschreiben
 
warum verschwindet der string level nach der if else verzweigung immer im nirvana und ist nachher nicht mehr initialized und kann somit auch nicht mehr ausgegeben werden? ich will das programm ein wenig kompakter und übersichtlicher gestalten.

Code:
                String level;
                
                if (erg <= selten ) {
                    level = "Das ist selten!!";
                }else
                     if  (erg <= wenig )                   {
                    level = "Du bist wenig Online!!";
                    
                    }
                if (erg <= normal )                   
                    {
                    level = "Das ist normal!!";                    
                    }
                if (erg <= schonMehr )                
                    {
                    level = "Du bist Viel Online!!";                    
                    }
                if (erg <= oft )                      
                    {
                    level = "Du bist zu oft Online!!";                    
                    }
                if (erg <= sehrOft )                  
                    {
                    level = "Du bist s\u00fcchtig !!";                    
                    }
                if (erg >= extrem )                   
                    {
                    level = "Du bist einer der absoluten Obersuchtys!!";
                    }
                
               System.out.println(level);
 
warum hast du da ein else drin? entweder alle mit else oder besser gar keins,
falls nicht gerade nur die ersten beiden sich gegenseitig ausschließen,

auf jeden Fall ist es für den Compiler nicht ersichtlich,
dass garantiert einer der ifs durchlaufen wird
->
level ist potentiell nicht initialisiert
 
man ey, ihr seid aber echt schnell hier, klasse forum, und so hilfsbereit, hab das jetzt so gelöst:

Code:
                String level ="ich werde noch gebraucht xD";
                
                if  (erg <= selten ) 
                   {
                    level = "Das ist selten!!";
                    }
                if  (erg <= wenig )                   
                    {
                    level = "Du bist wenig Online!!";
                    }
                if (erg <= normal )                   
                    {
                    level = "Das ist normal!!";                    
                    }
                if (erg <= schonMehr )                
                    {
                    level = "Du bist Viel Online!!";                    
                    }
                if (erg <= oft )                      
                    {
                    level = "Du bist zu oft Online!!";                    
                    }
                if (erg <= sehrOft )                  
                    {
                    level = "Du bist s\u00fcchtig !!";                    
                    }
                if (erg >= extrem )                   
                    {
                    level = "Du bist einer der absoluten Obersuchtys!!";
                    }
                
               System.out.println(level);
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben