Neue Klassenmethode implementieren..

wiz

Mitglied
Hallo ich habe da ein Verständnisproblem.

Ich möchte gerne zu dem folgenden Programm, welches die eingegebene Nummer mit Hilfe von 2 Methoden überprüft und bestätigt ob die Nummer gültig ist oder nicht, eine weitere Klassenmethode hinzufügen.

Folgendes soll die Methode machen:

- Den String in einen Integer umwandeln. Dafür würde ich wie zuvor parsen.
- eine kleine Rechnung durchführen, wie in der Methode "checkNummer13", nur soll die Methode dann einen Int zurückliefern, damit ich diesen ausgeben kann.

So sieht das Programm aus, ganz unten befindet sich die 3. Methode, die ich versuche zu implementieren. .

Hoffe jemand kann mir da weiterhelfen.

Java:
import java.util.Scanner;

public class klassenName {
    public static void main(String[] args) {      
        // initialisieren
        Scanner sc = new Scanner(System.in);
        String a;
      
        //Eingabe
        System.out.print("Geben Sie eine Nummer ein: ");
        a = sc.nextLine();
        sc.close();
      
        // Alle Leerzeichen und Bindestriche entfernen
        a = a.replaceAll("( |-)", "");
       
        // Auf die Länge der Nummer überprüfen
        boolean istGueltig;
        if (a.length() == 10) {
            istGueltig = checkNummer10(a);
        } else if (a.length() == 13  &&
                    (a.charAt(0) == '9' &&
                        (a.charAt(1) == '7' &&
                            (a.charAt(2) == '8' || (a.charAt(2) == '9'))))) {
            istGueltig = checkNummer13(a);
        } else {
            istGueltig = false;
        }
      
        // Ausgabe, ob die Nummer richtig oder falsch ist
        if (istGueltig) {
            System.out.println(a + " ist gültig " );
        } else {
            System.out.println(a + " ist nicht gültig ");
        }
    }
   
    private static boolean checkNummer10(String a) {
        int summe = 0;
        String dStr;
        for (int i = 0; i < 10; ++i){
            dStr = a.substring(i, i + 1);
            if (i < 9 || dStr != "X") {
                summe += Integer.parseInt(dStr) * (10-i);
            } else {
                summe += 10;
            }
        }      
        return (summe % 11 == 0);      
    }
  
    private static boolean checkNummer13(String a) {      
        // Erste 12 Ziffern werden abwechselnd mit 1 und 3 multipliziert
        int summe = 0;
        int dVal;
        for (int i = 0; i < 13; i++) {
            dVal = Integer.parseInt(a.substring(i, i+1));
        if (i % 2 == 0) { // Falls eine gerade Zahl rauskommt mit 1 multiplizieren
                summe += dVal * 1;
            } else {
                summe += dVal * 3; // Sonst mit 3 multiplizieren
            }
        }      
        return (summe % 10 == 0);      
    }
  
    private static String checkNummer13(String a){
        int summe = 0;
        int dVal;

        klassenName.a = Integer.parseInt(a.substring(i, i+1));
      
        int summe = 0;
        int dVal;
        for (int i = 0; i < 13; i++) {
            dVal = Integer.parseInt(a.substring(i, i+1));
        if (i % 2 == 0) { // Falls eine gerade Zahl rauskommt mit 1 multiplizieren
                summe += dVal * 1;
            } else {
                summe += dVal * 3; // Sonst mit 3 multiplizieren
            }
        }      
        return (summe);
}
 
Zuletzt bearbeitet von einem Moderator:
Problem 1: Laut Rückgabetyp willst du einen String zurückgeben, die Methode gibt aber ein int zurück.
Problem 2: Du hast 2 Methoden mit der gleichen Signatur, der Compiler weiß daher nicht welche der beiden er denn nun aufrufen soll.
Zur Signatur einer Methode gehört der Name sowie die Parameter. Der Rückgabetyp ist nicht teil der Signatur!

Auch sehe ich nicht den Sinn hinter deiner 2.Methode check13. Die Methode schaut genauso aus wie die andere, einzig eine zusätzliche Zeile wurde hinzugefügt.
Vielleicht solltest du genauer beschreiben was die einzelnen Methoden machen sollen und was dein Ziel ist.
 
Hallo, ja Problem 1 und 2 sind mir bewusst. Ich komme nicht drauf wie ich die umgehen kann.

Die 2. und 3. Methode sind gleich weil die 2. Methode einen Wahrheitswert zurückliefert. Die 3. Methode soll die selbe Rechnung machen aber hier soll das was dort gerechnet wird ausgegeben werden.

Ich hoffe mein Ziel ist klar. Mir fällt jetzt nur ein eine komplett neue Methode zu erstellen, weil ich nicht drauf komme wie ich die 2. Methode überladen kann, wegen dem selben Parameter. Aber in der neuen Methode kann ich nicht auf die String-Variable "a" zugreifen um diese in in int zu verwandeln. Fehler "cannot be resolved or is not a field
 
Dann benenne eine der Methoden um! Die Methode sollte schon anhand des Namen beschreiben was sie macht. Bei "checkNummer13" ist es mir klar(er) das ich ein boolean zurück bekomme.
Aber bei "checkNummer13" ist es eigentlich komisch wenn man ein "int" zurück bekommt, vor allem wenn die Methode etwas berechnen sollt. Daher wäre "calculateNummer13" die bessere Wahl.

Und damit du doppelten Code vermeidest sollte "checkNummer13" einfach die "calculateNummer13" aufrufen. 😉
Java:
private static boolean checkNummer13(String a) {
   // Erste 12 Ziffern werden abwechselnd mit 1 und 3 multipliziert
   int summe = calculateNummer13(a);
   return summe % 10 == 0;
}

private static int calculateNummer13(String a) {
   int summe = 0;
   int dVal;
   for (int i = 0; i < 13; i++) {
     dVal = Integer.parseInt(a.substring(i, i+1));
     if (i % 2 == 0) { // Falls eine gerade Zahl rauskommt mit 1 multiplizieren
       summe += dVal * 1;
     } else {
       summe += dVal * 3; // Sonst mit 3 multiplizieren
     }
   }
   return summe;
}

public static void printNummer13(String a) {
   System.out.println("Result Nummer13: " + calculateNummer13);
}

... soll die selbe Rechnung machen ....
Wenn etwas das selbe machen soll zeigt das schon das man doppelten Code erzeugen wird.
Diesen sollte man aber vermeiden und entsprechenden Code in eine eigene Methode auslagern.

... hier soll das was dort gerechnet wird ausgegeben werden.
Eine Methode sollte auch immer nur eine Tätigkeit zuständig sein, entweder berechnen ODER ausgeben.

... weil ich nicht drauf komme wie ich die 2. Methode überladen kann, wegen dem selben Parameter.
Eine Methode kann man auch nur überladen indem man die Parameter ändert 😉

Aber in der neuen Methode kann ich nicht auf die String-Variable "a" zugreifen um diese in in int zu verwandeln. Fehler "cannot be resolved or is not a field
Logisch, die Klasse hat keine statische Variable "a" auf welche du zugreifen könntest.
In der main-Methode hast du eine Variable "a" diese ist aber eben nur lokal in der main-Methode verfügbar, nicht in der ganzen Klasse. (Hierzu ein Link: http://www.java-made-easy.com/variable-scope.html)
 
Zuletzt bearbeitet:
ok super vielen Dank! Eine Frage noch.

Ich möchte der 3. Methode noch eine while-Schleife hinzufügen. Diese soll die Zahl bis zur nächsten 10er Stelle ausgeben.

Ein Beispiel:
In der 3. Methode kommt am Ende die Zahl 135 raus. Nun soll er mit der while-Schleife herausfinden, wieviel bis zur nächsten 10er Stelle fehlt. In diesem Fall wäre es die 5.

Folgenden Code habe ich probiert, aber leider gibt er nichts aus. Nichtmal den vorgegeben Text:...." ist (nicht) gültig".

PS: + klassenName.calculateNummer13(a)); Habe ich erstmal so gelöst um zu sehen ob alles soweit klappt. Wird dann am Ende schön gemacht.


Java:
import java.util.Scanner;

public class klassenName {
    public static void main(String[] args) {    
        // initialisieren
        Scanner sc = new Scanner(System.in);
        String a;
   
        //Eingabe
        System.out.print("Geben Sie eine Nummer ein: ");
        a = sc.nextLine();
        sc.close();
   
        // Alle Leerzeichen und Bindestriche entfernen
        a = a.replaceAll("( |-)", "");
     
        // Auf die Länge der Nummer überprüfen
        boolean istGueltig;
        if (a.length() == 10) {
            istGueltig = checkNummer10(a);
        } else if (a.length() == 13  || (a.length() == 12 &&
                    (a.charAt(0) == '9' &&
                        (a.charAt(1) == '7' &&
                            (a.charAt(2) == '8' || (a.charAt(2) == '9'))))) {
            istGueltig = checkNummer13(a);
        } else {
            istGueltig = false;
        }
   
        // Ausgabe, ob die Nummer richtig oder falsch ist
        if (istGueltig) {
            System.out.println(a + " ist gültig " + klassenName.calculateNummer13(a)); 
        } else {
            System.out.println(a + " ist nicht gültig " +  klassenName.calculateNummer13(a));
        }
    }
 
    private static boolean checkNummer10(String a) {
        int summe = 0;
        String dStr;
        for (int i = 0; i < 10; ++i){
            dStr = a.substring(i, i + 1);
            if (i < 9 || dStr != "X") {
                summe += Integer.parseInt(dStr) * (10-i);
            } else {
                summe += 10;
            }
        }    
        return (summe % 11 == 0);    
    }
    private static boolean checkNummer13(String a) {    
        // Erste 12 Ziffern werden abwechselnd mit 1 und 3 multipliziert
        int summe = 0;
        int dVal;
        for (int i = 0; i < 13; i++) {
            dVal = Integer.parseInt(a.substring(i, i+1));
        if (i % 2 == 0) { // Falls eine gerade Zahl rauskommt mit 1 multiplizieren
                summe += dVal * 1;
            } else {
                summe += dVal * 3; // Sonst mit 3 multiplizieren
            }
        }    
        return (summe % 10 == 0);    
    }
    private static String checkNummer13(String a){
        int summe = 0;
        int dVal;

        klassenName.a = Integer.parseInt(a.substring(i, i+1));
        int ziffer = 0;
        int summe = 0;
        int dVal;
        for (int i = 0; i < 13; i++) {
            dVal = Integer.parseInt(a.substring(i, i+1));
        if (i % 2 == 0) { // Falls eine gerade Zahl rauskommt mit 1 multiplizieren
                summe += dVal * 1;
            } else {
                summe += dVal * 3; // Sonst mit 3 multiplizieren
            }
        }    
       while( summe % 10!= 0) {
                ziffer++;
           }
           return  ziffer;

public static void printNummer13(String a) {
           System.out.println("Result Nummer13: " + klassenName.calculateNummer13(a));
}



Eine andere Möglichkeit könnte so gehen:
Code:
10 - summe.charAt(2);

Aber das setzt voraus, dass immer nur 3 Stellige Zahlen rauskommen. Gibt es hier so was wie

Code:
10 - summe.charAt(max-1);
Also die letzte Zahl genommen wird
 
Ich möchte der 3. Methode noch eine while-Schleife hinzufügen. Diese soll die Zahl bis zur nächsten 10er Stelle ausgeben.

Ein Beispiel:
In der 3. Methode kommt am Ende die Zahl 135 raus. Nun soll er mit der while-Schleife herausfinden, wieviel bis zur nächsten 10er Stelle fehlt. In diesem Fall wäre es die 5.

Folgenden Code habe ich probiert, aber leider gibt er nichts aus. Nichtmal den vorgegeben Text:...." ist (nicht) gültig".

Java:
       while( summe % 10!= 0) {
                ziffer++;
           }
           return  ziffer;

Sicher das du den richtigen Code gepostet hast? Dein Code enthält wieder 2 Methoden mit der gleichen Signatur.

Das Problem das es nicht funktioniert und du auch keine Ausgabe bekommst ist: du hast dir eine klassische Endlosschleife gebaut 😉
Überleg doch mal: Du prüfst ob "summe" durch 10 geteilt einen Rest hast. Wenn das zutrifft dann erhöhst du Ziffer, danach prüfst du wieder dasselbe .... logische Schlussfolgerung?

Tipp: Du musst die Summe von "summe" und ______ überprüfen.


Eine andere Möglichkeit könnte so gehen:
Code:
10 - summe.charAt(2);

Aber das setzt voraus, dass immer nur 3 Stellige Zahlen rauskommen. Gibt es hier so was wie

Code:
10 - summe.charAt(max-1);
Also die letzte Zahl genommen wird
Würde ebenfalls funktionieren, wäre auch logischer, aber vielleicht komplizierter umzusetzen.
Den oberen Ansatz mit der Schleife finde ich in Ordnung.
 
Hallo, danke für die Hilfe. Hätte drauf kommen können, dass es eine Endlosschleife ist.

Bei der 3. Methode hab ich was falsches kopiert, sorry. Es tut.

Die while schleife habe ich jetzt so gemacht.

Java:
while( summe % 10 != 0) {
                summe = summe +1;
                ziffer = ziffer +1;
           }
           return ziffer ;

Scheint jetzt zu funktionieren.

Danke für deine Hilfe!

Edit: Eine Frage möchte ich noch hinterherwerfen. Dieses Programm ist ja nun nicht wirklich Objektorientiert. Wie sinnvoll ist es jetzt, dies Objektorientiert zu machen, mit Konstruktor und Objekten, mit Access Modifier usw. ?
 
Zuletzt bearbeitet:

Zurück
Oben