Hey, habe ein problem, unzwar soll ich nächste woche in informatik eine Caesar verschlüsselung programmieren, aber es funktioniert aus irgendeinen grund nicht?
import java.util.Scanner;
public class Caesar {
public static void main (String[] args) {
Scanner scanner = new Scanner (System.in);
System.out.println("Zu verschlüsselnden Text eingeben:");
String text = scanner.nextLine(); // Text eingeben
System.out.println("Um wieviele Stellen soll verschoben werden? (1-26)");
int offset = scanner.nextInt();
// Offset (Verschiebung) wählen
if (offset >= 1 && offset <= 25) {
char [] meinArray = text.toCharArray();
// den Text in ein Char Array laden
char [] meinNeuesArray = verschluesseln(offset, meinArray);
// mit der Methode (siehe unten) "verschluesseln" ein neues
// Char Array mit dem verschlüsselten Text erstellen
// verschlüsselten Text wieder ausgeben:
System.out.println("\nSo sieht der Text verschlüsselt aus:");
for (int i = 0; i < meinNeuesArray.length; i++) {
System.out.print(meinNeuesArray[i]);
}
System.out.println("\n");
scanner.close();
}
else System.out.println("Die Verschiebung muss zwischen 1 und 127 liegen!");
}
// hier die Methode zum verschlüsseln
public static char[] verschluesseln(int offset, char[] charArray) {
char[] cryptArray = new char[charArray.length];
// erstmal ein leeres Char Array erstellen
for (int i = 0; i < charArray.length; i++) {
int verschiebung = (charArray[i] + offset)%26;
// ursprüngliches Zeichen plus Offset modulo 128
cryptArray[i] = (char) (verschiebung);
}
return cryptArray;
}
}
5 Antworten
ich würds ja so machen
import java.util.Scanner;
public class Caesar_2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Zu verschlüsselnden Text eingeben:");
String text = scanner.nextLine(); // Text eingeben
int offset = 20;
System.out.println(encode(text, offset));
}
public static String encode(String text, int offset) {
String encoded = "";
int ascii;
for (int i = 0; i < text.length(); i++) {
char letter = text.charAt(i);
if(Character.isDigit(letter)){ // skip the letter if it's a digit
encoded+=letter;
continue;
}
ascii = (int) (letter); // get corresponding ascii value for the letter
// if it's an uppercase, the ascii starts at 65, otherwise 97
int asciibegin;
if(Character.isUpperCase(letter)){
asciibegin=65;
}else{
asciibegin=97;
}
// calculate the encoded value >>(ascii-ascibegin) = 1 for a; 2 for b;...<<
ascii = ((ascii-asciibegin+offset) % 26)+asciibegin;
encoded += (char) (ascii);
}
return encoded;
}
}
Nicht exakt Dein Problem, aber eine andere Lösung findest Du hier:
https://programmieraufgaben.ch/aufgabe/caesar-chiffre-bruteforcen/dn5ugt9e
und hier:
hab es nochmal ein wenig bearbeitet, problem bleibt das selbe
import java.util.Scanner;
public class Caesar {
public static void main (String[] args) {
Scanner scanner = new Scanner (System.in);
System.out.println("Zu verschlüsselnden Text eingeben:");
String text = scanner.nextLine(); // Text eingeben
int offset = 3;
// Offset (Verschiebung) wählen
char [] meinArray = text.toCharArray();
// den Text in ein Char Array laden
char [] meinNeuesArray = verschluesseln(offset, meinArray);
// mit der Methode (siehe unten) "verschluesseln" ein neues
// Char Array mit dem verschlüsselten Text erstellen
// verschlüsselten Text wieder ausgeben:
System.out.println("\nSo sieht der Text verschlüsselt aus:");
for (int i = 0; i < meinNeuesArray.length; i++) {
System.out.print(meinNeuesArray[i]);
}
System.out.println("\n");
scanner.close();
}
// hier die Methode zum verschlüsseln
public static char[] verschluesseln(int offset, char[] charArray) {
char[] cryptArray = new char[charArray.length];
// erstmal ein leeres Char Array erstellen
for (int i = 0; i < charArray.length; i++) {
int verschiebung = (charArray[i] + offset)%25;
// ursprüngliches Zeichen plus Offset modulo 26
cryptArray[i] = (char) (verschiebung);
}
return cryptArray;
}
}
int verschiebung = (charArray[i] + offset)%26;
Damit verschiebst du alle chars auf 0 bis 25. Du musst den den offset von A auf das Ergebnis des modulo addieren.
Ausserdem gehst du von 26 Buchstaben aus, garantierst aber nirgends Gross -oder Kleinschreibung. Nimm besser ein Konstantenarray für dein zu verschlüsselnden Zeichenvorrat.
...und noch nen Tip: man erkennt eindeutig, dass du den code kopiert und abgeändert hast. gib den besser nicht so ab.
gruss, dj
zB mit
toUpperCase()
siehe https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#toUpperCase()
wo genau liegt das Problem, also was funktioniert nicht?
wie kann ich denn die groß- bzw. kleinschreibung garantieren ?