Prüfziffer einer ISBN Nummer herrausfinden.

sserio

Bekanntes Mitglied
[CODE lang="java" title="Java"]import java.util.Scanner;

import static java.lang.Character.getNumericValue;

public class ISBN {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Dein ISBN Code bitte: ");
bildePruefziffer(sc.next());
}

public static void bildePruefziffer(String isbn) {
var temp = 0;
int result = 0;
for (int i = 0; i < isbn.length(); i++) {
if (isbn.charAt(i) != '-') {
temp++;
if ((temp) % 2 == 0) {
result += 3 * getNumericValue(isbn.charAt(i));
} else {
result += getNumericValue(isbn.charAt(i));
}
}
}
if (result % 10 != 0) {
System.out.printf("%1$s%2$d","Deine Prüfziffer ist: ",10 - (result % 10));
}else{
System.out.printf("%1$s%2$d","Deine Prüfziffer ist: ",0);
}
}
}
[/CODE]
Gibt es eine kürzere und schnellere Variante ? Gerne melden.
 
[CODE lang="java" title="Java"]import java.util.Scanner;

import static java.lang.Character.getNumericValue;

public class ISBN {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Dein ISBN Code bitte: ");
bildePruefziffer(sc.next());
}

public static void bildePruefziffer(String isbn) {
var temp = 0;
int result = 0;
for (int i = 0; i < isbn.length(); i++) {
if (isbn.charAt(i) != '-') {
temp++;
if ((temp) % 2 == 0) {
result += 3 * getNumericValue(isbn.charAt(i));
} else {
result += getNumericValue(isbn.charAt(i));
}
}
}
if (result % 10 != 0) {
System.out.printf("%1$s%2$d","Deine Prüfziffer ist: ",10 - (result % 10));
}else{
System.out.printf("%1$s%2$d","Deine Prüfziffer ist: ",0);
}
}
}
[/CODE]
Gibt es eine kürzere und schnellere Variante ? Gerne melden.
Das Programm funktioniert auf jedenfall
 
Java:
import java.util.Scanner;

import static java.lang.Character.getNumericValue;
import static java.lang.Character.isDigit;

public class ISBN {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Dein ISBN Code bitte: ");
        bildePruefziffer(sc.next());
    }

    public static void bildePruefziffer(String isbn) {
        int faktor = 1;
        int result = 0;
        for (char ch : isbn.toCharArray()) {
            if (isDigit(ch)) {
                result += faktor * getNumericValue(ch);
                faktor = faktor == 1 ? 3 : 1;
            }
        }
        System.out.printf("%1$s%2$d","Deine Prüfziffer ist: ", (10 - (result % 10)) % 10);
    }
}
 
Gibt es eine kürzere und schnellere Variante ?
Man könnte faktor auch mit faktor ^= 2 zwischen 1 und 3 alternieren lassen, um den ternären Operator zu beseitigen:
Java:
public static void bildePruefziffer(String isbn) {
    int faktor = 3;
    int result = 0;
    for (char ch : isbn.toCharArray()) {
        if (isDigit(ch)) {
            result += (faktor^=2) * getNumericValue(ch);
        }
    }
    System.out.printf("%1$s%2$d","Deine Prüfziffer ist: ", (10 - (result % 10)) % 10);
}
Allerdings ist das zwar kürzer, aber es ist Bit-Frickelei und somit nicht auf dem angemessenen Abstraktionsniveau. Deshalb würde ich die Lösung von @mihe7 trotzdem vorziehen.
 
Java:
import java.util.Scanner;

import static java.lang.Character.getNumericValue;
import static java.lang.Character.isDigit;

public class ISBN {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Dein ISBN Code bitte: ");
        bildePruefziffer(sc.next());
    }

    public static void bildePruefziffer(String isbn) {
        int faktor = 1;
        int result = 0;
        for (char ch : isbn.toCharArray()) {
            if (isDigit(ch)) {
                result += faktor * getNumericValue(ch);
                faktor = faktor == 1 ? 3 : 1;
            }
        }
        System.out.printf("%1$s%2$d","Deine Prüfziffer ist: ", (10 - (result % 10)) % 10);
    }
}
Also ich habe deinen ganzen Code verstanden. PS: Finde diesen Lambda ausdruck um faktor zu ändern auch ziemlich cool und wäre selbst nie drauf gekommen. Aber... Wieso nimmst du beim sysout das result zwei mal mit dem modulo ?? Also bei mir in der Lösung habe ich es irgendwie mit einem Mal geschafft
 
Finde diesen Lambda ausdruck um faktor zu ändern auch ziemlich cool und wäre selbst nie drauf gekommen.
Das ist kein Lambdaausdruck, das ist einfach der ternäre Operator. Kurz für
Java:
if (faktor == 1) {
    faktor = 3;
} else {
    faktor = 1;
}

Wieso nimmst du beim sysout das result zwei mal mit dem modulo ?? Also bei mir in der Lösung habe ich es irgendwie mit einem Mal geschafft
Weil (10 - 0) == 10 ist und wir an der Stelle eine 0 brauchen. Du hast das mit einem if-else-Konstrukt und zwei Ausgaben gelöst.
 
Also ich habe deinen ganzen Code verstanden. PS: Finde diesen Lambda ausdruck um faktor zu ändern auch ziemlich cool und wäre selbst nie drauf gekommen. Aber... Wieso nimmst du beim sysout das result zwei mal mit dem modulo ?? Also bei mir in der Lösung habe ich es irgendwie mit einem Mal geschafft
ach.. wenn es eine ziffer von 1-9 ist ändert es nix daran... also die zahl %10 ... aber wenn die Ziffer 0 ist dann ist 10%10 0... logisch
 
Das ist kein Lambdaausdruck, das ist einfach der ternäre Operator. Kurz für
Java:
if (faktor == 1) {
    faktor = 3;
} else {
    faktor = 1;
}


Weil (10 - 0) == 10 ist und wir an der Stelle eine 0 brauchen. Du hast das mit einem if-else-Konstrukt und zwei Ausgaben gelöst.
Ist es ok, wenn ich meinem Lehrer sage, dass ich das selbst geschrieben habe xD
 
Man könnte den ternären Operator auch anders loswerden, das ist aber eklig:
Java:
    public static void bildePruefziffer(String isbn) {
        int faktor = 1;
        int sign = 1;
        int result = 0;
        for (char ch : isbn.toCharArray()) {
            if (isDigit(ch)) {
                result += faktor * getNumericValue(ch);
                faktor = faktor + sign * 2;
                sign = -sign;
            }
        }
        System.out.printf("%1$s%2$d","Deine Prüfziffer ist: ", (10 - (result % 10)) % 10);
    }
}
 

Zurück
Oben