Mehrere Probleme im Code

Diskutiere Mehrere Probleme im Code im Java Basics - Anfänger-Themen Bereich.
S

sgtKami

Hey,
ich und ein Kumpel schreiben einen Code zum Thema affine Chiffre.
Wir sind auf folgenden code gekommen:
Java:
import java.util.Scanner;
public class Crypto
{
 
    
    public static void main(String[] args)
    {
        int i = 1;
        Scanner scanner = new Scanner (System.in);

        System.out.print("Geben Sie a ein: ");
        int a = scanner.nextInt();

        System.out.print("Geben Sie b ein: ");
        int b = scanner.nextInt();

        while(i>0)
        {
        System.out.print("Geben Sie den zu verschlüsselenden Buchstaben ein: ");
        String str = scanner.next();
        char z = str.charAt(0);
        if (z == 'a') {
            int x = 0;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'b') {
            int x = 1;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'c') {
            int x = 2;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'd') {
            int x = 3;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'e') {
            int x = 4;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'f') {
            int x = 5;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'g') {
            int x = 6;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'h') {
            int x = 7;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'i') {
            int x = 8;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'j') {
            int x = 9;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'k') {
            int x = 10;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'l') {
            int x = 11;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'm') {
            int x = 12;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'n') {
            int x = 13;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'o') {
            int x = 14;
            int y = a * x + b %26;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'q') {
            int x = 16;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'r') {
            int x = 17;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 's') {
            int x = 18;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 't') {
            int x = 19;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'u') {
            int x = 20;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'v') {
            int x = 21;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'w') {
            int x = 22;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'x') {
            int x = 23;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'y') {
            int x = 24;
            int y = a * x + b %26;
            System.out.println(y);
        }
        else if (z == 'z') {
            int x = 25;
            int y = a * x + b %26;
        }
    
     
        }
    

    }
}
wir wollen:
1. von den If schleifen los kommen da die schon sehr unpraktisch und hässlich sind.
2. wenn wir die Rechnung int y = a * x + b %26; außerhalb der If schleifen schreiben wird der fehler: x cannot be resolved to a variable gegeben
3. wie wir Großbuchstaben mit einbeziehen können
MfG Kami
 
Zuletzt bearbeitet von einem Moderator:
Cromewell

Cromewell

Hey!

1. Hört sich für mich nach einem Fall für einen switch-Block an (siehe z.B. hier).
2. Die Rechung könnt ihr eigentlich quasi direkt printen, ohne x und y Variable zu gebrauchen (x scheint ja in jedem einzelnen Fall immer fix zu sein).
3. Naja, bei switch dann einfach:
Java:
case 'A': ...
, oder wie meinst du?
 
J

JustNobody

Also um aus den Zeichen 'a' - 'z' die Zahlen ab 0 zu bekommen braucht man kein switch oder so. Da reicht ein z - 'a', denn ein char ist nur eine 16 Bit Zahl.

Somit reicht maximal ein Gültigkeitscheck, also ob z um Bereich von a bis z ist (mit>= und <= prüfbar)
 
L

lennero

Ich würde für das Alphabet eine Liste verwenden. Quasi eine List<Character> mit Elementen von a-z. Um an das nächste Zeichen zu kommen (jetztiges Zeichen + shift) kannst du einfach moduloarithmetik verwenden.

Hatte einen Solver vor einiger Zeit selbst geschrieben, kannst du dir bei Interesse anschauen.

Java:
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Decrypts a ciphertext with either given parameters a and b or brute forces
 * the solution with a given alphabet
 *
 */
public class AffineCipherSolver {
    private int[] encryptedData;
    private List<Character> alphabet;
    private Integer a;
    private Integer b;

    // constructor with known key parameters and alphabet size (assumed 26)
    public AffineCipherSolver(String encryptedData, int a, int b) {
        this.encryptedData = encryptedData.chars().toArray();
        this.a = a;
        this.b = b;
        alphabet = StatisticUtils.alphabet;
    }

    // unknown key parameters but known alphabet size (assumed 26)
    public AffineCipherSolver(String encryptedData) {
        this.encryptedData = encryptedData.chars().toArray();
        alphabet = StatisticUtils.alphabet;
    }

    // known key parameters with custom alphabet
    public AffineCipherSolver(String encryptedData, int a, int b, List<Character> alphabet) {
        this.encryptedData = encryptedData.chars().toArray();
        this.a = a;
        this.b = b;
        this.alphabet = alphabet;
    }

    // unknown key parameters with custom alphabet
    public AffineCipherSolver(String encryptedData, List<Character> alphabet) {
        this.encryptedData = encryptedData.chars().toArray();
        this.alphabet = alphabet;
    }

    public String decrypt() {
        // key supplied, no need to brute force
        if (a != null) {
            String decryptedData = decrypt(encryptedData, a, b, alphabet);
            return decryptedData;
        }
        // brute force solution
        else {
            Set<Integer> possibleValsA = new HashSet<>();
            int alphabetLen = alphabet.size();
            // get all possible values for a (all nums < alphabetLen coprime with
            // alphabetLen)
            for (int i = 0; i < alphabetLen; i++) {
            if (MathUtils.gcd(i, alphabetLen) == 1)
                 possibleValsA.add(i);
            }

            double maxScore = 0;
            String bestText = null;
            for (Integer a : possibleValsA) {
                for (int b = 0; b < alphabetLen; b++) {
                    String decryptedData = decrypt(encryptedData, a, b, alphabet);
                    double currentScore = StatisticUtils.scoreText(decryptedData);

                    if (currentScore > maxScore) {
                    maxScore = currentScore;
                    bestText = decryptedData;
                    }
                }
            }
            return bestText;
        }
    }

    private String decrypt(int[] encryptedData, int a, int b, List<Character> alphabet) {
        //modular multiplicative inverse of a
        int ainv = MathUtils.invA(a, alphabet.size());
        int dataLen = encryptedData.length;
        int[] decryptedData = new int[dataLen];
        for (int i = 0; i < dataLen; i++) {
            // decrypt using the affine cipher formula 1/a * (y - b) mod alphabet size
            decryptedData[i] = ((int) alphabet
                .get(Math.floorMod(ainv * (alphabet.indexOf((char) encryptedData[i]) - b), alphabet.size())));
        }
        return Arrays.stream(decryptedData).mapToObj(n -> (char) n).map(n -> Character.toString(n)).collect(Collectors.joining());
    }

    public static void main(String[] args) {
        String test = "ÄUßWß";
        AffineCipherSolver solver = new AffineCipherSolver(test, 17, 1, StatisticUtils.germanAlphabet());
        System.out.println(solver.decrypt());
    }
}
 
S

sgtKami

Hey!

1. Hört sich für mich nach einem Fall für einen switch-Block an (siehe z.B. hier).
2. Die Rechung könnt ihr eigentlich quasi direkt printen, ohne x und y Variable zu gebrauchen (x scheint ja in jedem einzelnen Fall immer fix zu sein).
3. Naja, bei switch dann einfach:
Java:
case 'A': ...
, oder wie meinst du?
x ist eine zahl zwischen 0-25, a = 0 b = 1, usw., da es um eine Rechnung geht bei der eine Buchstabe in einen anderen umgewandelt wird, also wie gesagt eine Chiffre
 
S

sgtKami

Ich würde für das Alphabet eine Liste verwenden. Quasi eine List<Character> mit Elementen von a-z. Um an das nächste Zeichen zu kommen (jetztiges Zeichen + shift) kannst du einfach moduloarithmetik verwenden.

Hatte einen Solver vor einiger Zeit selbst geschrieben, kannst du dir bei Interesse anschauen.

Java:
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
* Decrypts a ciphertext with either given parameters a and b or brute forces
* the solution with a given alphabet
*
*/
public class AffineCipherSolver {
    private int[] encryptedData;
    private List<Character> alphabet;
    private Integer a;
    private Integer b;

    // constructor with known key parameters and alphabet size (assumed 26)
    public AffineCipherSolver(String encryptedData, int a, int b) {
        this.encryptedData = encryptedData.chars().toArray();
        this.a = a;
        this.b = b;
        alphabet = StatisticUtils.alphabet;
    }

    // unknown key parameters but known alphabet size (assumed 26)
    public AffineCipherSolver(String encryptedData) {
        this.encryptedData = encryptedData.chars().toArray();
        alphabet = StatisticUtils.alphabet;
    }

    // known key parameters with custom alphabet
    public AffineCipherSolver(String encryptedData, int a, int b, List<Character> alphabet) {
        this.encryptedData = encryptedData.chars().toArray();
        this.a = a;
        this.b = b;
        this.alphabet = alphabet;
    }

    // unknown key parameters with custom alphabet
    public AffineCipherSolver(String encryptedData, List<Character> alphabet) {
        this.encryptedData = encryptedData.chars().toArray();
        this.alphabet = alphabet;
    }

    public String decrypt() {
        // key supplied, no need to brute force
        if (a != null) {
            String decryptedData = decrypt(encryptedData, a, b, alphabet);
            return decryptedData;
        }
        // brute force solution
        else {
            Set<Integer> possibleValsA = new HashSet<>();
            int alphabetLen = alphabet.size();
            // get all possible values for a (all nums < alphabetLen coprime with
            // alphabetLen)
            for (int i = 0; i < alphabetLen; i++) {
            if (MathUtils.gcd(i, alphabetLen) == 1)
                 possibleValsA.add(i);
            }

            double maxScore = 0;
            String bestText = null;
            for (Integer a : possibleValsA) {
                for (int b = 0; b < alphabetLen; b++) {
                    String decryptedData = decrypt(encryptedData, a, b, alphabet);
                    double currentScore = StatisticUtils.scoreText(decryptedData);

                    if (currentScore > maxScore) {
                    maxScore = currentScore;
                    bestText = decryptedData;
                    }
                }
            }
            return bestText;
        }
    }

    private String decrypt(int[] encryptedData, int a, int b, List<Character> alphabet) {
        //modular multiplicative inverse of a
        int ainv = MathUtils.invA(a, alphabet.size());
        int dataLen = encryptedData.length;
        int[] decryptedData = new int[dataLen];
        for (int i = 0; i < dataLen; i++) {
            // decrypt using the affine cipher formula 1/a * (y - b) mod alphabet size
            decryptedData[i] = ((int) alphabet
                .get(Math.floorMod(ainv * (alphabet.indexOf((char) encryptedData[i]) - b), alphabet.size())));
        }
        return Arrays.stream(decryptedData).mapToObj(n -> (char) n).map(n -> Character.toString(n)).collect(Collectors.joining());
    }

    public static void main(String[] args) {
        String test = "ÄUßWß";
        AffineCipherSolver solver = new AffineCipherSolver(test, 17, 1, StatisticUtils.germanAlphabet());
        System.out.println(solver.decrypt());
    }
}
Danke aber das ist uns zu hoch. Auch wenn es die vieleicht bessere Lösung ist, wollen wir eine "simple" Lösung, was ja nicht so schwer sein kann.
 
S

sgtKami

Hey,
also wir haben ein update:

import java.util.Scanner;
public class Crypto
{


public static void main(String[] args)
{
int i = 1;
Scanner scanner = new Scanner (System.in);

System.out.print("Geben Sie a ein: ");
int a = scanner.nextInt();

System.out.print("Geben Sie b ein: ");
int b = scanner.nextInt();

while(i>0)
{
System.out.print("Geben Sie den zu verschlüsselenden Buchstaben ein: ");
String str = scanner.next();
char z = str.charAt(0);
int y = (a * ((int)z-97) + b)%26;
System.out.println(y);
}
}
}

wir haben das ganze mit einer simplen Ascii Umrechnung gelöst.
falls wir weitere Probleme haben sollten, melde ich mich hier wieder zu wort.
 
Thema: 

Mehrere Probleme im Code

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben