Java-Schulhausaufgabe und 2 Fragen

  • Hallo,

    ich habe nen paar Fragen zu Java, da wir das gerade in der Schule begonnen haben.
    Unsere Hausaufgabe ist es ein Programm zu schreiben, dass in der Console einen Prozentwert einliest und den in eine bestimmte Schulnote umwandelt ( 1 -6 ).
    Dies ist mein Sourcecode dazu:

    Spoiler anzeigen

    import java.io.*;

    class ProzentZuNote
    public static void main( String args[])
    throws IOException
    { BufferedReader br = new BufferedReader
    (new InputStreamReader(System.in));

    String Eingabe;
    double Prozent, Note = -1;
    while ( Note == -1 ) {
    System.out.println("Geben sie die erreichte Prozentzahl ein:");
    Prozent = Double.parseDouble((br.readLine()));

    if ( (Prozent > 0 ) && ( Prozent <= 17 ) ) {
    Note = 6;
    } else if ( (Prozent > 17 ) && ( Prozent <= 34 ) ) {
    Note = 5;
    } else if ( (Prozent > 34 ) && ( Prozent <= 51 ) ) {
    Note = 4;
    } else if ( (Prozent > 51 ) && ( Prozent <= 68 ) ) {
    Note = 3;
    } else if ( (Prozent > 68 ) && ( Prozent <= 85) ) {
    Note = 2;
    } else if ( (Prozent > 85 ) && ( Prozent <= 100 ) ) {
    Note = 1;
    }
    if ( Note > -1 ) {
    System.out.println("Das ergibt folgende Note" + Note );
    } else if ( Note == 1 ) {
    System.out.println("Falsche Eingabe!");
    }
    }
    }
    }

    Dann würde ich die ganze else if Verschachtelung gerne in eine extra funktion packen und per Switch eifnacher zu lesen machen. Auf

    Spoiler anzeigen


    steht zwar, dass Double-Typen nicht genutzt werden können aber evt kann man das auf anderem Wege lösen.

    Und dann weiß ich nicht ob ich die Funktion in die class mitreinschreiben soll also so:

    Spoiler anzeigen

    class test
    public static void main( String args[])
    {
    Bla();
    }
    void Bla()
    {
    // Bla
    }
    }

    Oder dahinter, also so:

    Spoiler anzeigen

    class test
    public static void main( String args[])
    {
    Bla();
    }
    }
    void Bla()
    {
    // Bla
    }

    Ich würds gerne selber testen per JDK, aber den krieg ich bei mir nicht ins laufen, sodass ich in Notepad++ programmiere und da nicht compilieren kann.

    Mfg

    2 Mal editiert, zuletzt von Daniel W. (22. Juni 2007 um 23:14)

  • hi,

    ich habe Dir mal das mit der Funktion eingebaut ... die IF-Abfrage finde ich gar nicht unübersichtlicher als eine Lösung mit switch

    Spoiler anzeigen


    import java.io.*;

    class ProzentZuNote{

    public static void main( String args[]){
    try{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Geben sie die erreichte Prozentzahl ein:");
    String input = br.readLine();
    ProzentZuNote pzn = new ProzentZuNote();
    System.out.println (pzn.getMark(input));
    } catch (IOException ioe){
    System.out.println("Ihre Eingabe konnte nicht verarbeitet werden!");
    }
    }

    private int mark;
    private double percent;


    private int getMark(String input){
    percent = Double.parseDouble (input);
    if (percent > 0.0 && percent <= 17.0)
    mark = 6;
    else if (percent > 17.0 && percent <=34.0)
    mark = 5;
    else if (percent > 34.0 && percent <=51.0)
    mark = 4;
    else if (percent > 51.0 && percent <=68.0)
    mark = 3;
    else if (percent > 68.0 && percent <= 85.0)
    mark = 2;
    else if (percent > 85.0 && percent <= 100.0)
    mark = 1;
    else {
    mark = -1;
    System.out.println ("Bitte geben Sie einen Wert zwischen 0 und 100 Prozent ein");
    }
    return mark;
    }

    }

    um die Klasse zu testen, mußt Du die Datei ProzentZuJava.java erstmal compilieren. Also sowas wie javac pfad\zur\datei\ProzentZuJava.java ausführen. Anschließend kannst Du dann mit java pfad\zur\datei\ProzentZuJava das Programm starten.

  • Hallo,

    erstmal danke für deine Antwort. Leider sind da einige Sachen drin, die ich noch nicht verstehe :P
    Hab das jetzt mal für meine Verhältnisse umgesetzt:

    Spoiler anzeigen

    import java.io.*;

    class ProzentZuNote
    {
    public static void main( String args[])
    throws IOException
    { BufferedReader br = new BufferedReader
    (new InputStreamReader(System.in));

    String Eingabe;
    double Prozent;
    int Note = -1;
    while ( Note == -1 ) {
    System.out.println("Geben sie die erreichte Prozentzahl ein:");
    Prozent = Double.parseDouble((br.readLine()));
    Note = getMark( Prozent );
    if ( Note > -1 ) {
    System.out.println("Das ergibt folgende Note " + Note + "!" );
    } else if ( Note == -1 ) {
    System.out.println("Falsche Eingabe!");
    }
    }
    }

    public static int getMark( double aProzent )
    {
    int lNote = -1;
    if ( (aProzent > 0 ) && ( aProzent <= 17 ) ) {
    lNote = 6;
    } else if ( (aProzent > 17 ) && ( aProzent <= 34 ) ) {
    lNote = 5;
    } else if ( (aProzent > 34 ) && ( aProzent <= 51 ) ) {
    lNote = 4;
    } else if ( (aProzent > 51 ) && ( aProzent <= 68 ) ) {
    lNote = 3;
    } else if ( (aProzent > 68 ) && ( aProzent <= 85) ) {
    lNote = 2;
    } else if ( (aProzent > 85 ) && ( aProzent <= 100 ) ) {
    lNote = 1;
    }
    return lNote;
    }
    }

    Meine Frage ist:
    Warum muss ich die Funktion int getMark() als public static zuweisen?
    Ansonsten gibt der Compiler die Fehlermeldung:
    non-static method getMark(double) cannot be referenced from a static context
    Mfg

    Einmal editiert, zuletzt von Daniel W. (23. Juni 2007 um 20:38)

  • Hi,

    da haben sich ein paar kleine Fehler eingeschlichen ;)

    Spoiler anzeigen

    import java.io.*;

    class ProzentZuNote
    {
    public static void main( String args[]) //mit throws Exception wird die Exception an den aufrufenden Code
    throws IOException //weitergereicht.
    {
    //statt "throws IOException" zu verwenden, kann man die Exception auch mit try-catch-Blöcken direkt in der
    //Klasse abfangen ... siehe mein Beispiel ;)
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    // bei Java ist es üblich die Variablenbezeichner klein zu schreiben ;)
    String eingabe;
    double prozent;
    int note = -1;
    while ( note == -1 ) {
    System.out.println("Geben sie die erreichte Prozentzahl ein:");
    prozent = Double.parseDouble((br.readLine()));
    // note = getMark( prozent ); geht nicht in der Main-Methode
    // Du mußt erst die Klasse instanzieren
    ProzentZuNote pzn = new ProzentZuNote();
    // .. und kannst dann die Methode auf der Instanz aufrufen
    note = pzn.getMark( prozent );
    if ( note > -1 ) {
    System.out.println("Das ergibt folgende Note " + note );
    } else if ( note == 1 ) {
    System.out.println("Falsche Eingabe!");
    }
    }
    }

    // in der Methode kann keine IO-Exception auftreten, deswegen macht
    // throws IOExeption keinen Sinn. Hier werden keine Objekte verwendet
    // die einen entsprechende Ausnahme erzeugen würden
    private int getMark( double aProzent )
    {
    int lNote = -1;
    if ( (aProzent > 0 ) && ( aProzent <= 17 ) ) {
    lNote = 6;
    } else if ( (aProzent > 17 ) && ( aProzent <= 34 ) ) {
    lNote = 5;
    } else if ( (aProzent > 34 ) && ( aProzent <= 51 ) ) {
    lNote = 4;
    } else if ( (aProzent > 51 ) && ( aProzent <= 68 ) ) {
    lNote = 3;
    } else if ( (aProzent > 68 ) && ( aProzent <= 85) ) {
    lNote = 2;
    } else if ( (aProzent > 85 ) && ( aProzent <= 100 ) ) {
    lNote = 1;
    }
    return lNote;
    }
    }

    ohne "public static" hast du eine Instanz-Methode, das heißt jede Instanz des Objektes hat seine eigene Methode "getMark". Mit "public static" gibt es die Methode (Klassen-Methode) nur einmal, und wird von allen Instanzen verwendet. die statische Methode würde mit ProzentZuNote.getMark(prozent) aufgerufen und in dem anderen Fall eben auf einer Instanz (mit new erzeugt).

    EDIT: gespoilert

    2 Mal editiert, zuletzt von jonk (23. Juni 2007 um 21:02)

  • Ich kann meins aber problemlos compilieren und es funktioniert auch so ohne Probleme ....

    Einmal editiert, zuletzt von Daniel W. (23. Juni 2007 um 21:01)

  • hmm, ok .. ich habe jetzt nochmal den kompletten Code aus meiner Datei gelöscht und Deinen reinkopiert. Jetzt bekomme ich auch keine Fehler mehr ... war wahrscheinlich schlampiges Copy/Paste von mir ;).

  • Ok :)
    Ich kenn mich mit dem ganzen class und try zeug noch nicht aus darum lasse ich das erstmal raus ^^