Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
2. Beim Umstellen des Codes auf BigInteger habe ich Probleme. Abhilfe täte gut. Kannst Du mir einen Tipp geben. Ich bekomme lauter Fehlermeldungen. Das sind zu viele um Sie hier zu posten.
import java.math.BigInteger;
import java.util.Scanner;
public class StartCombineSymbols {
private final static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
String symbols = "012"; // definiert die verwendeten Symbole
String label = "Bitte die Anzahl der Stellen\nfuer die Kombinationen\nder Symbole ( " + symbols
+ " ) eingeben?\n";
int numDigits = inputInt(label, 2, 10); // liest ein Zahl von 2 - 10 ein
BigInteger numCombination = new BigInteger(Integer.toString((int) Math.pow(symbols.length(), numDigits)));
System.out.println("Anzahl der Kombinationen = " + numCombination);
for (BigInteger num = BigInteger.ZERO; num.compareTo(numCombination) < 0; num = num.add(BigInteger.ONE))
System.out.println(convertIntDigitsToSymbols(num, symbols.toCharArray(), numDigits));
}
public static String convertIntDigitsToSymbols(BigInteger number, char[] symbols, int minLenght) {
StringBuilder result = new StringBuilder();
BigInteger base = new BigInteger(Integer.toString(symbols.length));
while (minLenght-- > 0 || !number.equals(BigInteger.ZERO)) {
result.append(symbols[number.mod(base).intValue()]);
number = number.divide(base);
}
return result.reverse().toString();
}
private static int inputInt(String label, int min, int max) {
boolean ok = false;
int value = 0;
do {
System.out.print(label + "-> ");
try {
value = Integer.parseInt(input.next());
if (value < min || value > max)
System.out.println("Wert muss im Bereich [" + min + "-" + max + "] liegen");
else
ok = true;
} catch (NumberFormatException e) {
System.out.println("Bitte eine Zahl eingeben!");
}
} while (!ok);
return value;
}
}
Aber ich sehe immer noch nicht, wo das hin führen soll. Wenn man Java lernen möchte, dann sollte man ggf. einem konkreten Weg folgen. Also ein Kurs oder ein Buch (wie z.B. Java von Kopf bis Fuss oder Schödinger lernt Java).
Dann wird man nach und nach an alle wichtigen Elemente von Java heran geführt. Ich habe schlicht das Gefühl, dass wir hier Code liefern, der weit über dem Verständnis ist und Änderungsversuche scheitern daher natürlich auch. Mir kann es prinzipiell egal sein, aber ich finde es extrem schade: Da scheint jemand Interesse zu haben und das hat so ja nicht nur wenig Lernerfolg sondern ich vermute, dass dies auch einiges an Frust mit sich bringt. Damit ist das gute Interesse auch früher oder später weg....
Ich gebe Dir Recht, dass die entworfenen Codes für mich schwierig zu verstehen sind.
Kannst Du mir ein Buch empfehlen, dass auch für Anfänger geeignet ist? Ich würde es mir natürlich kaufen und damit üben. Das Interesse werde ich schon nicht verlieren, da ich mich in der Zukunft arbeitstechnisch auf dem Gebiet der Informatik sehe.
In Sachen Bücher einfach mal eine Reihe von Amazon Links. (Alle Links ohne /ref=... und so - Ich verdiene da nichts dran und ich hoffe, dass es nicht als Spam interpretiert wird. Die Bücher gibt es natürlich auch über die Buchhandlung und ich kann nur empfehlen, die Bücher über eine Buchhandlung in der Nähe zu beziehen!)
Sehr gut für Anfänger / zum Selbststudium geeignet sind die Bücher:
Eins von den beiden Büchern. Das Erste ist das, was hier am bekanntesten ist und stammt aus der "Head first" Reihe. Das Zweite habe ich für C++ und macht auch einen sehr guten Eindruck.
==> Schau Dir von Beiden die Leseproben an! Entscheide, was Dir mehr zusagt bzw. ob es Dir zusagt!
Clean Code - hier ist das Buch mit gleichem Namen sowie alle Bücher von Uncle Bob (Robert C. Martins) zu nennen. Aber es gibt da auch viele gute Videos von ihm - Ich habe da mal was auf YT gesammelt: Uncle Bob - Clean Code - YouTube (Sind auf Englisch, aber ein sehr gut verständliches Englisch!)
Das wären so die Empfehlungen von meiner Seite aus.
Und meine Hinweise nicht falsch verstehen: Du bist mit Deinen Fragen immer herzlich willkommen und wir beantworten gerne alle Fragen. Nur manche Dinge sprengen leider das Forum, wenn man das wirklich gut beantworten will.
Also auf keinen Fall zögern, wenn Du irgendwelche Probleme hast oder etwas nicht verstehst oder so!
1. Wieso kann ich hier nicht einfach anstelle von BigInteger.Zero eine Zahl eingeben? Z.B. 0. Wieso brauche ich den Ausdruck BigInteger.Zero?
2. Wieso ist num.compareTo(numCombination)<0?
Als es noch eine Interger-For-Schleife war wurde dort die Grenze eingegeben.
Java:
for (BigInteger num = BigInteger.ZERO; num.compareTo(numCombination) < 0; num = num.add(BigInteger.ONE))
zu 1: Du brauchst eine BigInteger instanz. 0 wäre ein Integer Literal, Du musst also immer auf die Typen achten. Wenn Du eine BigInteger Variable hast, dann kannst Du da kein int oder Integer zuweisen.
Du musst in Java zwischen zwei grundlegenden Arten von Datentypen unterscheiden.
Primitiven Typen wie int oder double enthalten einfach den entsprechenden Wert, welchen du ihnen zuweist, wie int zero = 0;
Alle weiteren Typen sind Referenztypen, d. h. sie enthalten die Referenz auf die Instanz einer Klasse. Du kannst ihnen demnach auch nur eine Referenz zuweisen. BigInteger.ZERO ist eine Konstante auf eine Instanz von BigInteger (siehe auch in der oben verlinkten Dokumentation zu BigInteger unter "Fields"), die einen Wert von 0 repräsentiert. Hier ein Auszug aus dem Quellcode der Klasse BigInteger:
Java:
public static final BigInteger ZERO = new BigInteger(new int[0], 0);
In deinem Code weist du demnach die Instanz, die in der Variablen (Konstante) "ZERO" gespeichert ist, deiner Variablen "num" zu.
Meine letzte Frage zu diesem Programm, weil ich tatsächlich ein Programm benötige, dass leichter zu verstehen ist, um in JAVA einzusteigen. Sobald das Lehrbuch da ist, werde ich mit dem Fragen weiter machen. Vorerst aber dieses "Rätsel".
Neue Frage:
Beim Anpassen des Codes mit BigInteger.pow(int) habe ich ein Problem.
Java:
BigInteger numCombination = new BigInteger(Integer.toString((int) Math.pow(symbols.length(), numDigits)));
Die Syntax lautet ja: BigInteger.pow(int exponent)
zu: BigInteger.pow(numDigits)
Aber wo bringe ich symbols.length unter?
Kann ich einfach z.B. BigInteger1=symbols.length(); deklarieren? Das klappt aber nicht.
Du musst die Methode BigInteger.pow verstehen. Du hast einen BigInteger und rechnest dann diese Zahl hoch einen int, den Du übergibst.
Wenn Du also symbol.length() hoch numDigits rechnen willst, dann brauchst Du:
a) symbol.length() als BigInteger -> Dazu mal die Dokumentation anschauen, was Du dazu findest
b) dann rufst Du auf dem BigInteger von a) pow(numDigits) auf und erhältst einen BigInteger
Wie Konrad schon geschrieben hat, repräsentiert eine Instanz von BigInteger eine (große) Ganzzahl. Du musst also eine entsprechende Instanz erzeugen und danach kannst du damit rechnen. Möchtest du z.B. 5 + 5 rechnen, dann geht das möglicherweise so:
Ich verstehe was @temi in #64 macht. Das ist einfach nachzuvollziehen. Er addiert zwei Zahlen zu einer. So weit so gut. Aber @KonradN wie soll es mir helfen?
Ich habe symbols.length() und muss dies eben zum Exponenten numDigits nehmen. Wie mache ich aus symbols.length ein BigInteger?
Zu ungenau. Wir können helfen, haben aber keine Lust zu raten. In dem Fall kann die zweite Zeile nicht funktionieren, denn es gibt keinen Konstruktor für BigInteger, der einen BigInteger als Parameter nimmt. Siehe Doku!
Und weiterhin: Was hast du genau vor? Was bedeutet "zum Exponenten nehmen"?
BigInteger numCombination = new BigInteger(Integer.toString((int) Math.pow(symbols.length(), numDigits)));
Aus Math.pow(symbols.length(), numDigits) muss mit Hilfe von BigInteger.pow(int) --> symbols.lenght^numDigits genommen werden. Siehe bitte Beitrag #51. Da ist der Code. Er liefert im Moment ein falsches x^y aus... Wie mache ich aus symbols.length nun eine BigInteger Zahl und binde es in die BigInteger.pow(int) Funktion ein.
Du möchtest also symbols.length "hoch" numDigits rechnen?
Du weißt bereits alles, was du dazu benötigst. Du musst ein BigInteger aus symbols.length erzeugen (hast du bereits gemacht) und dessen pow()-Methode mit dem Parameter "numDigits" verwenden.
Schau dir dazu noch mal das Beispiel aus #64 an. Da wird die add()-Methode von val1 verwendet, um val2 zu addieren.
Da auch immer die Fehlermeldung mitgeben. Dann muss man nicht raten.
Wobei es hier auf der Hand liegt: BigInteger numCombination = length.pow(numDigits);
Die Methode pow gibt einen BigInteger zurück. Da musst Du also nicht mehr mit machen. Und die Fehlermeldung wird einfach gewesen sein, dass es keinen Konstruktor von BigInteger gibt, der einen BigInteger als Parameter entgegen nimmt.
Da auch immer die Fehlermeldung mitgeben. Dann muss man nicht raten.
Wobei es hier auf der Hand liegt: BigInteger numCombination = length.pow(numDigits);
Die Methode pow gibt einen BigInteger zurück. Da musst Du also nicht mehr mit machen. Und die Fehlermeldung wird einfach gewesen sein, dass es keinen Konstruktor von BigInteger gibt, der einen BigInteger als Parameter entgegen nimmt.
Das möchte ich noch einmal betonen (Sorry, Konrad ): Die Methode BigInteger.pow() liefert als Ergebnis bereits einen "neuen" BigInteger (siehe Doku). Es gibt also keinen Grund für "new BigInteger()" (=> Konstruktoraufruf).
EDIT:
@Hansi2245 Die Dokumentation ist für einen Anfänger etwas wie ein Buch mit sieben Siegeln. Mit der Zeit lernt man, damit umzugehen und es ist immens wichtig, das zu tun. Mach dir also keinen Kopf deswegen, aber versuche sie auf jeden Fall zu nutzen!
ich habe zu diesem Code-Abschnitt eine Frage. Kann mir jemand in Worten sagen, wie die Konverierung von Ziffern (Digits) zu Symbolen abläuft? Und wie kommt die Ordnung der Ziffern bei der Ausgabe zustande?
Java:
public static String convertIntDigitsToSymbols(BigInteger number, char[] symbols, int minLenght) {
StringBuilder result = new StringBuilder();
BigInteger base = new BigInteger(Integer.toString(symbols.length));
while (minLenght-- > 0 || !number.equals(BigInteger.ZERO)) {
result.append(symbols[number.mod(base).intValue()]);
number = number.divide(base);
}
return result.reverse().toString();
ich habe zu diesem Code-Abschnitt eine Frage. Kann mir jemand in Worten sagen, wie die Konverierung von Ziffern (Digits) zu Symbolen abläuft? Und wie kommt die Ordnung der Ziffern bei der Ausgabe zustande?
Also setzen wir beim Funktionsaufruf folgende Parameter voraus.
symbols = [ a,b,c ]
number = 14
minLenght = 4
Zeile 5 -> base = 3 weil symbols 3 Elemente beinhaltet
Bedingung für die Schleife solange minLenght größer 0 oder number ungleich 0 Durchlauf 1 14 modulo 3 = 2
Zeile 8 -> füge zu result symbols[2] hinzu also result = "c";
Zeile 9 -> number = 14 dividiert durch 3 = 4 Durchlauf 2 4 modulo 3 = 1
Zeile 8 -> füge zu result symbols[1] hinzu also result = "cb";
Zeile 9 -> number = 4 dividiert durch 3 = 1 Durchlauf 3 1 modulo 3 = 1
Zeile 8 -> füge zu result symbols[1] hinzu also result = "cbb";
Zeile 9 -> number = 1 dividiert durch 3 = 0
An dieser Stelle ist die Zahl bereits vollständig konvertiert da number = 0 . Die Schleife wird aber noch nicht abgebrochen da in der Bedingung auch steht minLenght > 0
minLenght wird bei jedem Schleifendurchlauf um 1 reduziert ( Zeile 7) . wir hatten bisher 3 Durchläufe --> minLenght = 1 Durchlauf 4 0 modulo 3 = 0
Zeile 8 -> füge zu result symbols[0] hinzu also result = "cbba";
Zeile 9 -> number = 0 dividiert durch 3 = 0
Zeile 9 -> number = 1 dividiert durch 3 = 0
Jetzt minLenght = 0 und number = 0 --> Schleifenabruch
Zeile 11 Rückgabe wird umgedreht --> "abbc"
ich verstehe nicht woher der für number und minLength kommt? Also ich verstehe, dass Du 14 und 4 für dieses Beispiel ausgewählt hast, aber wenn ich das Programm durchgehe, sehe ich weder die Übergabe der Werte noch eine Zuordnung der Werte.
minLength entspricht ja der Kombinationsanzahl der Buchstaben a,b,c zu z.B. aaaa. Aber ich erkenne nicht wie der Wert der eingelesen wird an minLength übergeben wird?
Dasselbe auch mit number. Wie wird dieser Wert bestimmt, wenn er weder manuel erstellt wird noch automatisiert übergeben wird?
Bei Base gibt es Deklarierung
Java:
BigInteger base = new BigInteger(Integer.toString(symbols.length));
ich verstehe nicht woher der für number und minLength kommt? Also ich verstehe, dass Du 14 und 4 für dieses Beispiel ausgewählt hast, aber wenn ich das Programm durchgehe, sehe ich weder die Übergabe der Werte noch eine Zuordnung der Werte.
Er hat den Ablauf der Methode beschrieben. Die Methode hat Parameter und er hat dann einfach mal ein paar Werte angenommen um dann mit diesen Werten die Methode durchzuspielen. Und in der Methode gibt es nur die Berechnung. Daher wird da nichts eingelesen.
Bei dem Code: BigInteger base = new BigInteger(Integer.toString(symbols.length));
stellen sich mir die Nackenhaare auf. Es gibt die Methode valueOf bei BigInteger. Wenn man die nimmt, dann muss man die Zahl nicht erst in einen String umwandeln um diesen dann sofort wieder zu parsen.
(Ich weiss jetzt nicht, wann wer mit dem Code um die Ecke gekommen ist, da ich mir den Code im Thread nicht wirklich immer genau angesehen habe...)
Aber der Hintergrund ist, dass Symbols ja für jedes Zeichen ein Element haben muss. Daher ist base in Symbols also bereits enthalten. Das muss nicht separat angegeben werden. Der Code liest also schlicht die Base aus den Symbols aus (und die base ist genau ie Anzahl der Symbole).