Wie kann ich meinen Code optimieren?

Lukasbsc

Mitglied
Ich wollte Fragen, wie ich folgenden Coe zur Berechnung von Notendurchschnitten effizienter und kürzer, allerdings mit den gleichen Funktionen, machen kann. Das ist mein erstes Programm in Java.
[CODE lang="java" title="Main"]package core;

import java.util.Scanner;

public class main {

String Name = null;

public static void main(String[] args) {
getName();
System.out.println("Der Notendurchschnitt aus ihren Werten beträgt: " + (Math.round(getAverage()*100)/100.0));
}

public static String getName () {
Scanner scanner = new Scanner(System.in);
System.out.println("Bitte tragen Sie ihren Namen ein!");
String Name = scanner.next();
System.out.println("Hallo " + Name + " bitte folge den folgenden Anweisungen!");
return Name;
}
public static double getAverage ( ){
int[] n = new int[6];
int counter = 0;
int ncount;
Scanner scan = new Scanner(System.in);

System.out.println("Wie viele Noten: 1 gab es?");
n[0] = scan.nextInt();
counter = n[0]+counter;
n[0] = n[0] * 1;

System.out.println("Wie viele Noten: 2 gab es?");
n[1] = scan.nextInt();
counter = n[1]+counter;
n[1] = n[1] * 2;

System.out.println("Wie viele Noten: 3 gab es?");
n[2] = scan.nextInt();
counter = n[2]+counter;
n[2] = n[2] * 3;

System.out.println("Wie viele Noten: 4 gab es?");
n[3] = scan.nextInt();
counter = n[3]+counter;
n[3] = n[3] * 4;

System.out.println("Wie viele Noten: 5 gab es?");
n[4] = scan.nextInt();
counter = n[4]+counter;
n[4] = n[4] * 5;

System.out.println("Wie viele Noten: 6 gab es?");
n[5] = scan.nextInt();
counter = n[5]+counter;
n[5] = n[5] * 6;

ncount = n[0] + n[1] + n[2] + n[3] + n[4] + n[5];
return(double) ncount/counter;


}
}
[/CODE]
 
Beste Antwort
Man kann den Spaß auch etwas anders angehen: statt jede Notenstufe abzufragen, kannst Du es auch dem Anwender überlassen, welche Notenstufe er erfassen möchte. Um den Durchschnitt zu berechnen, brauchst Du auch nicht über die Eingaben Buch zu führen, vielmehr reicht es, sich die laufende Summe und Anzahl zu merken.

Noch ein Hinweis: in Java gibt es Benennungskonventionen, an die man sich möglichst halten sollte. So schreibt man Bezeichner von Variablen und Parametern in lowerCamelCase, während Typnamen (Klassen, etc.) in UpperCamelCase geschrieben werden.

Hier mal Dein Code, ein klein wenig angepasst:

Java:
import java.util.Scanner;

public class Main {

    private static final Scanner scanner = new Scanner(System.in);

    public...
Du hast doch offensichtlich einen Teil des Codes sechs mal kopiert und dann geändert:
Java:
        System.out.println("Wie viele Noten: 3 gab es?");
        n[2] = scan.nextInt();
        counter = n[2]+counter;
        n[2] = n[2] * 3;
Das schreit doch danach, daraus eine Funktion zu machen.

Und folgender Code
Java:
     ncount = n[0] + n[1] + n[2] + n[3] + n[4] + n[5];
scheint besser in einer for-Schleife untergebracht zu sein.
 
Zuletzt bearbeitet:
Ich wollte Fragen, wie ich folgenden Coe zur Berechnung von Notendurchschnitten effizienter und kürzer
[CODE lang="java" title="Code etwas anders"]import java.util.Scanner;

public class StartAverage {
private static Scanner input = new Scanner(System.in);

public static void main(String[] args) {
String name = getName();
System.out.println("Hallo " + name.toUpperCase() + " bitte folge den Anweisungen!");
int[] grades = getGradesCount();
printGradeCounts(grades);
System.out.println("Der Notendurchschnitt beträgt: " + (Math.round(getAverage(grades) * 100) / 100.0));
input.close();
}

public static double getAverage(int[] grades) {
double sum = 0;
for (int count : grades)
sum += count;
return sum / grades.length;
}

public static int[] getGradesCount() {
int[] grades = new int[6];
for (int i = 0; i < grades.length; i++)
grades = getSingleGradeCount(i + 1);
return grades;
}

public static String getName() {
System.out.println("Bitte tragen Sie ihren Namen ein!");
String Name = input.next();
return Name;
}

public static int getSingleGradeCount(int grade) {
boolean ok = false;
int cnt = 0;
do {
System.out.println("Wie viele Noten: " + grade + " gab es?");
String num = input.next();
try {
cnt = Integer.parseInt(num);
if (cnt < 0) {
if (cnt < 0)
System.err.println("Bitte nur Zahlen grösser 0 eingeben!");
} else
ok = true;
ok = true;

} catch (NumberFormatException e) {
System.err.println("Bitte nur Zahlen eingeben!");
}
} while (!ok);
return cnt;
}

public static void printGradeCounts(int[] grades) {
System.out.println("Notentabelle:");
System.out.println("*******************");
for (int i = 0; i < grades.length; i++)
System.out.println(grades + "\t|\t" + (i + 1) + "er");
}

}[/CODE]
 
Man kann den Spaß auch etwas anders angehen: statt jede Notenstufe abzufragen, kannst Du es auch dem Anwender überlassen, welche Notenstufe er erfassen möchte. Um den Durchschnitt zu berechnen, brauchst Du auch nicht über die Eingaben Buch zu führen, vielmehr reicht es, sich die laufende Summe und Anzahl zu merken.

Noch ein Hinweis: in Java gibt es Benennungskonventionen, an die man sich möglichst halten sollte. So schreibt man Bezeichner von Variablen und Parametern in lowerCamelCase, während Typnamen (Klassen, etc.) in UpperCamelCase geschrieben werden.

Hier mal Dein Code, ein klein wenig angepasst:

Java:
import java.util.Scanner;

public class Main {

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        String name = getName();
        System.out.println("Hallo " + name + " bitte folge den folgenden Anweisungen!");

        System.out.println("Der Notendurchschnitt aus ihren Werten beträgt: " +
                (Math.round(getAverage()*100)/100.0));
    }

    public static String getName () {
        System.out.println("Bitte tragen Sie ihren Namen ein!");
        return scanner.next();
    }

    public static double getAverage ( ){
        int counter = 0;
        int sum = 0;
        int grade;
        do {
            System.out.print("Welche Notenstufe soll erfasst werden (0 = ENDE)? ");
            grade = scanner.nextInt();
            if (grade > 0 && grade < 7) {
                System.out.printf("Wie viele %der gab es? ", grade);
                int count = scanner.nextInt();
                if (count > 0) {
                    sum += grade * count;
                    counter += count;
                }
            }
        } while (grade != 0);

        if (counter == 0) {
            return 0;
        }
        return (double)sum/counter;
    }
}
 
Beste Antwort
Man kann den Spaß auch etwas anders angehen: statt jede Notenstufe abzufragen, kannst Du es auch dem Anwender überlassen, welche Notenstufe er erfassen möchte. Um den Durchschnitt zu berechnen, brauchst Du auch nicht über die Eingaben Buch zu führen, vielmehr reicht es, sich die laufende Summe und Anzahl zu merken.

Noch ein Hinweis: in Java gibt es Benennungskonventionen, an die man sich möglichst halten sollte. So schreibt man Bezeichner von Variablen und Parametern in lowerCamelCase, während Typnamen (Klassen, etc.) in UpperCamelCase geschrieben werden.

Hier mal Dein Code, ein klein wenig angepasst:

Java:
import java.util.Scanner;

public class Main {

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        String name = getName();
        System.out.println("Hallo " + name + " bitte folge den folgenden Anweisungen!");

        System.out.println("Der Notendurchschnitt aus ihren Werten beträgt: " +
                (Math.round(getAverage()*100)/100.0));
    }

    public static String getName () {
        System.out.println("Bitte tragen Sie ihren Namen ein!");
        return scanner.next();
    }

    public static double getAverage ( ){
        int counter = 0;
        int sum = 0;
        int grade;
        do {
            System.out.print("Welche Notenstufe soll erfasst werden (0 = ENDE)? ");
            grade = scanner.nextInt();
            if (grade > 0 && grade < 7) {
                System.out.printf("Wie viele %der gab es? ", grade);
                int count = scanner.nextInt();
                if (count > 0) {
                    sum += grade * count;
                    counter += count;
                }
            }
        } while (grade != 0);

        if (counter == 0) {
            return 0;
        }
        return (double)sum/counter;
    }
}
Danke für die netten Hinweise 😀
 

Neue Themen


Zurück
Oben