Methoden Methode die eine Eingabe auf Korrektheit überprüft

Eggsit

Mitglied
Hi leute,

ich habe hier eine kleine Aufgabe, bei der ich festhänge und etwas Hilfe bräuchte.

Schreiben Sie eine Klassenmethode, die eine also argument übergebene Matrikelnummer vom typ int auf Korrektheit überprüft und einen booleschen Wert liefert.
  • Matrikelnummern sind sechstellig und fangen mit der Ziffer 9 an.
  • Die Matrikelnummer wird in ihre Ziffern Z0, Z1, Z2, Z3, Z4, Z5 aufgeteilt(Bsp.: Z0=9, Z1=4, Z2=5, Z3=6, Z4=7, Z5=8).
  • Es soll nun eine spzielle "gewichtete Quersumme" GQ gebildet werden, für die gilt:
  • GQ = Z0*2 + Z1*1 + Z2*4 + Z3*3 + Z4*2 + Z5*1.
Die Matrikelnummer ist genau dann gültig wenn die letzte Ziffer der Matrikelnummer (also Z5) mit der letzten Ziffer der Quersumme übereinstimmt.

Legen Sie in der Methode ein Feld "faktor" an, dessen Elemente Sie mit den zur Ermittlung von GQ benötigten Faktoren initialisieren. Die einzelnen Ziffern der Matrikelnummer sollen ein einem Feld "ziffer" notiert werden. Beide Felder sollen vom Typ "int" sein.

Das hier ist mein bisheriges Ergebnis.
Ich weiß aber nicht wie ich am besten die "gewichtete Quersumme" bilden soll und diese dann mit der Matrikelnummer vergleiche und ob mein Code soweit überhaupt halbwegs richtig ist.

Java:
public class Matrikelnummer {

    public static boolean pruefen(int Matrikelnummer) {

        int[] faktor = { 2, 1, 4, 3, 2, 1 };
        int[] ziffer = { 9, 4, 5, 6, 7, 8 };
        int[] GQ = new int[6];
       
        if (ziffer[0] == 9 && ziffer.length == 6) {
            for (int i = 0; i <= 6; i++) {
                GQ[i] = faktor[i] * ziffer[i];
                }
            if(GQ[5] == ziffer[5]){
                return true;
            }
            else{
                return false;
            }
        }

    }

}
 

Flown

Administrator
Mitarbeiter
Also das Grundgerüst um etwas zu summieren sieht so aus:
Java:
int sum = 0;
for(int i = 0; i < 10; i++) {
  sum += i;
}

Deine Überprüfung auf die erste Regel sollte umgedreht werden:
Java:
if(ziffer.length != 6 || ziffer[0] != 9) {
  return false;
}

Was du noch benötigen wirst ist dann der Modulo oder Restoperator (%), damit du die Einerstelle bei deiner Summe herausfindest:
Java:
int test = 123;
int t = test % 10; // Was wird da wohl rauskommen?
 

strußi

Top Contributor
du musst die matrikelnummer zerlegen duzu musst du den umweg über
den String gehen, diesen zerlegen und anschließend wieder in einen int parsen
dann kannst du deine Anforderungen abarbeiten
Java:
int mnr = 984352;
        int[] zX =new int[6];
        String s =Integer.toString( mnr);
        for( int i =0; i <zX.length; i++){
            zX[ i] =Integer.parseInt( s.substring( i, i+1));
        }
        //Berechnungen

       //Abfragen
        if( zX[0] !=9){
            return false;
        }
        //weitere Abfragen
 

Flown

Administrator
Mitarbeiter
@strußi das geht auch anders ohne String hin und her Wandlerei!
Java:
int mnr = 984352;
int[] digits = new int[6];
for(int i = digits.length-1, number = mnr; i >= 0; i--, number /= 10) {
  digits[i] = number % 10;
}
System.out.println(Arrays.toString(digits));
 

Eggsit

Mitglied
Okay, shonmal danke für die Antworten. Ich habe den Code mal angepasst.

Code:
public class Matrikelnummer {

    public static boolean pruefen(int Matrikelnummer) {

        int[] faktor = { 2, 1, 4, 3, 2, 1 };
        int[] ziffer = { 9, 4, 5, 6, 7, 8 };
        int GQ = 0;
     
        if (ziffer.length != 6 || ziffer[0] !=9) {
            return false;
        }

        for(int i = 0; i <= ziffer.length-1; i++){
         
            GQ += ziffer[i]*faktor[i];
         
            if(GQ%10 == ziffer[5]){
                return true;
            }
        }
     
    }

}

Sieht das so besser aus?
 

Flown

Administrator
Mitarbeiter
Code kann meines Erachtens nicht gut aussehen, sondern gut funktionieren und leselich sein.
Leselich ist dein Code, nur er funktioniert nicht!

Du musst die Summe erst bilden, bevor du die Einerstelle überprüfst!
 

Eggsit

Mitglied
Oh, ich habe die Abprüfung mit in die for-Schleife geschrieben, die muss ja außerhalb hin.

Code:
public class Matrikelnummer {

    public static boolean pruefen(int Matrikelnummer) {

        int[] faktor = { 2, 1, 4, 3, 2, 1 };
        int[] ziffer = { 9, 4, 5, 6, 7, 8 };
        int GQ = 0;
  
        if (ziffer.length != 6 || ziffer[0] !=9) {
            return false;
        }

        for(int i = 0; i <= ziffer.length-1; i++){
      
            GQ += ziffer[i]*faktor[i];
        }

        if(GQ%10 == ziffer[5]){
                return true;
        }
    }

}
 

Flown

Administrator
Mitarbeiter
Und hast du deine Methode schon mal selbst ausprobiert?
Das musst du schon selbst machen. Die einzelnen Komponenten wurden dir präsentiert und du musst sie nur noch zusammenfriemeln.

Wenn konkrete Fragen bestehen, dann her damit!
 

Eggsit

Mitglied
Okay, wenn ich das ganze als Main Methode schreibe funktioniert er. In meinem Beispiel wäre die Matrikelnummer halt falsch (955345 wäre zb korrekt).

Code:
public class Matrikelnummer {

    public static boolean pruefen(int Matrikelnummer) {

        int[] faktor = { 2, 1, 4, 3, 2, 1 };
        int[] ziffer = { 9, 5, 5, 3, 4, 5 };
        int GQ = 0;

        if (ziffer.length == 6 && ziffer[0] == 9) {

            for (int i = 0; i <= 5; i++) {

                GQ += ziffer[i] * faktor[i];

            }
            if (GQ % 10 == ziffer[5]) {

                return true;
            } else {
                return false;
            }

        }
    }

}

Als Klassenmethode brauche ich allerdings einen booleschen Rückgabewerte. Da bin ich mir nicht sicher wie ich diesen am besten implementiere ohne die ganze Methode direkt false oder true zu machen.
 

Neue Themen


Oben