# ISBN Prüfziffer berechnen



## fluxinello (21. Nov 2016)

Hi,
Ich soll von einer ISBN Nummer die Prüfziffer, also die letzte Zahl berechnen.
In der Aufgabenstellung steht auch wie man sie berechnet:
10 = (∑ ∙ 9 =1 ) 11 = (1 ∙ 1 + 2 ∙ 2 + ⋯ + 9 ∙ 9 ) 11

Jetzt soll ich das ganze zusätzlich in einer Klasse machen zum testen via Schnittstelle.

Da ich euch aber nicht wieder nach der verdammten Lösung fragen will, würde ich gerne wissen in wiefern ich mir das ganze klarer machen kann also anhand von Tutorials oder Videos.
Denn ich habe einfach keinen Ansatz wie ich das ganze angehen kann und das wiederholen der letzten Vorlesungen hilft mir ehrlich gesagt nicht so gut weiter.

Kennt jemand eventuell einen guten Java Youtube Kanal wo alles gut erklärt wird oder hat andere Wege wie ich besser verstehe solche Aufgaben anzugehen?


----------



## mrBrown (21. Nov 2016)

Zwar kein Video oä, aber vllt kann man ja einen Ansatz erarbeiten 

Wie würdest du denn von "1 23123 123" Schritt für Schritt per Hand die Prüfziffer berechnen?


----------



## fluxinello (21. Nov 2016)

1*2 + 2*2 + 3*3 + 1*4 + 2*5 + 3*6 + 1*7 + 2*8 + 3*9 = Ergebnis mod 11
Aber ich komme trotzdem nicht drauf.
Mir ist klar, dass ich wohl die ISBN Zahlen alle mit einer Zahl, immer +1 aufsteigend multiplizieren muss, wie oben eben. Und dann das Ergebnis also die Summe modulo 11, wahrscheinlich in einer Schleife?


----------



## mrBrown (21. Nov 2016)

Schleife ist schon mal der richtige Weg 
Was müsste da denn in einer Schleife laufen?


----------



## fhoffmann (22. Nov 2016)

Hallo fluxinello,

du musst für deine Aufgabe zwei Probleme lösen:
1. Berechnung der Prüfziffer,
2. eine eigene Klasse schreiben und die Berechnung testen.
Obwohl es in diesem Forum nicht gerne gesehen ist, wenn fertige Lösungen präsentiert werden, schenke ich dir den zweiten Teil der Aufgabe. Ich gehe in meiner Lösung davon aus, dass dir die ersten 9 Ziffern als int[] vorliegen (das ist die einfachste Version und du hast uns darüber keine Informationen gegeben). Sollten sie jedoch als String (mit Leerzeichen oder Bindestrichen) oder als long vorliegen, ist weitere Arbeit notwendig.
Die Berechnung der Prüfziffer musst du dann selber erledigen. Wenn dabei konkrete Probleme auftreten, kannst du natürlich gerne fragen (am liebsten mit dem bisherigen Code, den du erstellt hast).

```
public class Isbn {

    public static int berechnePruefziffer(int[] ziffern) {
        int pruefziffer = -999;
        // berechne pruefziffer
        return pruefziffer;
    }

    public static void main(String[] args) {
        int[] testarray = {1, 2, 3, 1, 2, 3 ,1, 2, 3};
        int pruefziffer = berechnePruefziffer(testarray);
        System.out.println(pruefziffer);
    }
}
```

Gruß
Fritz


----------



## fluxinello (22. Nov 2016)

mrBrown hat gesagt.:


> Schleife ist schon mal der richtige Weg
> Was müsste da denn in einer Schleife laufen?


Ich hätte eventuell 2 Schleifen gemacht, in der ersten Schleife werden alle 9 Zahlen abgefragt. 
In der zweiten Schleife werden dann die eingegebenen Zahlen mit den entsprechenden Zahlen von 1-9 multipliziert.
Dann eventuell ein Assert, welches festsetzt, dass wenn 10 als Prüfziffer rauskommt, es als X dargestellt wird (teil der aufgabenstellung die ich nicht erwähnt habe).
Habe außerdem noch nicht ganz verstanden, was ein- und auslesen bedeutet.

Meine grobe Vermutung wäre einfach mal, dass ich meiner Klasse eine Zahl oder etwas ähnliches mitteile, die dann innerhalb oder außerhalb der Klasse (z.B. von ner anderen Klasse) verarbeitet wird.
Auslesen würde ich sagen, wäre dass wenn ich ne Eingabe mache bei z.B. Wie ist dein Name? ich mit "Anton" antworte, und er dieses "Anton" dann quasi ausgibt.

@fritz: Ich danke dir, aber wie schon gesagt, mich pisst es selber an, dass ich nichts gebacken bekomme. Daher will ichs lieber ohne Ergebnis lösen, und lieber mit Erklärungen was ich machen muss z.B.


----------



## mrBrown (22. Nov 2016)

fluxinello hat gesagt.:


> Ich hätte eventuell 2 Schleifen gemacht, in der ersten Schleife werden alle 9 Zahlen abgefragt.


Meinst du zum einlesen der Zahlen? Wenn ja, lass das erstmal außen vor, das ganze soll ja über eine Schnittstelle passieren. Deine Funktion zum Berechnen erwartete einfach nur die ISBN in einem dir passenden Format (sein es String, Array, Liste, etc), wo das herkommt kann dir egal sein.



fluxinello hat gesagt.:


> In der zweiten Schleife werden dann die eingegebenen Zahlen mit den entsprechenden Zahlen von 1-9 multipliziert.


Das klingt richtig 


fluxinello hat gesagt.:


> Dann eventuell ein Assert, welches festsetzt, dass wenn 10 als Prüfziffer rauskommt, es als X dargestellt wird (teil der aufgabenstellung die ich nicht erwähnt habe).


Das klingt auch passend 



fluxinello hat gesagt.:


> Meine grobe Vermutung wäre einfach mal, dass ich meiner Klasse eine Zahl oder etwas ähnliches mitteile, die dann innerhalb oder außerhalb der Klasse (z.B. von ner anderen Klasse) verarbeitet wird.


Jein, erstmal brauchst du nur eine Klasse mit der Funktion zum berechnen.



fluxinello hat gesagt.:


> Habe außerdem noch nicht ganz verstanden, was ein- und auslesen bedeutet.





fluxinello hat gesagt.:


> Auslesen würde ich sagen, wäre dass wenn ich ne Eingabe mache bei z.B. Wie ist dein Name? ich mit "Anton" antworte, und er dieses "Anton" dann quasi ausgibt.



Ist Einlesen/Ausgeben Teil der Aufgabenstellung? Wenn ja, verschieb es auf später 
Wenn nein, dann ist's ja egal


----------



## fluxinello (22. Nov 2016)

Ok danke dir schonmal.
Ich hab mich jetzt mal in das Thema Arrays und Schleifen eingelesen und habe jetzt mal selbstständig ohne copy & paste oder ablesen nen kleinen Code geschrieben der NUR die Funktion umfasst, die Pruefziffer zu berechnen. Dass ich die Funktion über das Interface bzw. der Schnittstelle aufrufe werde ich noch machen wenn die Funktion in Ordnung ist.


```
public static long buildIsbn(long i) {
      long ergebnis;
      long pruefziffer;
  long[]isbnArray = {1,2,3,4,5,6,7,8,9};
  for(long i=1; i<=9, i++) {
  if (i * zahl1 +
      i * zahl2 +
      i * zahl3 +
      i * zahl4 +
      i * zahl5 +
      i * zahl6 +
      i * zahl7 +
      i * zahl8 +
      i * zahl9)
      ergebnis = i * zahl1 + i * zahl2 + i * zahl3 + i * zahl4 + i * zahl5 + i * zahl6 + i * zahl 7 + i * zahl8 + i * zahl9);
      pruefziffer = ergebnis % 11;
      return pruefziffer;
    }
}
```

Hoffe auf Verbesserungsvorschläge von denen ich was lernen kann! 
Danke schonmal im Vorraus!
Achja, bitte geht nicht zu hart mit mir um, stehe noch ganz am Anfang


----------



## mrBrown (22. Nov 2016)

Was soll denn der Parameter `long i` sein?

Und was das `long[]isbnArray`?

Und was sind `zahl1`-`zahl9`, die fallen da vom Himmel...

Und was willst du mit dem `if (...)` testen?


----------



## fluxinello (22. Nov 2016)

das long i sollten eigtl die Zahlen 1-9 im Array sein und das zweite ein Array mit den Zahlen von 1-9 welche man mit den 9 eingegebenen Zahlen multipliziert.
Zahl1 - zahl9 sind die zahlen die man später eingbit, welche mit den zahlen aus dem array multipliziert werden.

ja das mit dem if ist quatsch merke ich auch gerade


----------



## fluxinello (22. Nov 2016)

Kann gelöscht werden


----------



## mrBrown (22. Nov 2016)

fluxinello hat gesagt.:


> das long i sollten eigtl die Zahlen 1-9 im Array sein und das zweite ein Array mit den Zahlen von 1-9 welche man mit den 9 eingegebenen Zahlen multipliziert.


Du hast dann 3 mal die Zahlen 1-9, einmal in `i`, in `isbnArray` und in dem for-loop

Deine Rechnung im for-Loop wird jetzt auch 9 mal ausgeführt 



fluxinello hat gesagt.:


> Zahl1 - zahl9 sind die zahlen die man später eingbit, welche mit den zahlen aus dem array multipliziert werden.


Eingelesen werden müssen keine Zahlen, zumindest nicht in der Funktion, die eingelesen Werte werden der Funktion als Parameter übergeben


----------



## fluxinello (22. Nov 2016)

```
public static long buildIsbn(long i) {
      long ergebnis;
      long pruefziffer;
      long[]i = {1,2,3,4,5,6,7,8,9};
      for(long i=1; i <=9, i++) {
      ergebnis = i * zahl1 + i * zahl2 + i * zahl3 + i * zahl4 + i * zahl5 + i * zahl6 + i * zahl 7 + i * zahl8 + i * zahl9);
      pruefziffer = ergebnis % 11;
      return pruefziffer;
    }
```
So besser?


----------



## mrBrown (22. Nov 2016)

Naja, deine zahl1-zahl9 fallen immer noch vom Himmel, dein i ist drei mal definiert (einmal als array, zweimal als long), und deine Rechnung wird immer noch 9 mal ausgeführt 


Um das mal andersrum zu versuchen, was wäre denn ein Sinnvoller Parameter für eine Funktion `berechnePruefziffer`?


----------



## fluxinello (22. Nov 2016)

long ergebnis?
naja ich weiß nicht wie ich die zahlen 1-9 deifinieren soll? Gibt doch bestimmt ne andere Möglichkeit als 9x long zahl1 usw zu schreiben.
weiß nicht ganz was ich anders machen soll damit es wenigstens formal richtig ist und i nicht 3x definiert ist


----------



## mrBrown (22. Nov 2016)

naja, du erzeugst sie zb durch den for-loop, anders musst du sie gar nicht definieren


----------



## fluxinello (22. Nov 2016)

Ok also hab ich im endeffekt nichts. Jetzt bin ich wieder an dem Punkt wo ich einfach komplett verzweifle. toller kreislauf


----------



## VfL_Freak (22. Nov 2016)

Moin,



mrBrown hat gesagt.:


> ...deine Rechnung wird immer noch 9 mal ausgeführt


na, das nun nicht gerade 
Es dürfte wegen der öffnenden Klammer hinter dem Kopf der for-Schleife gar nicht erst compilieren ....



fluxinello hat gesagt.:


> *public* *static* *long* buildIsbn(*long* i) {
> *long* ergebnis;
> *long* pruefziffer;
> *long*[]i = {1,2,3,4,5,6,7,8,9};
> ...



Gruß Klaus


----------

