好的,如果我们想进一步了解自己所学的内容,我的CS老师建议this project在课余时间进行课外练习。我几乎已经在课堂外度过了几乎所有的时间来尝试这样做,而且我觉得无论我做什么,最终都会遇到两个新问题。我将要倾销到目前为止的巨额资金,现在它具有完成所有任务的所有部分,但其中一些已损坏。

import java.util.Scanner;

public class Encoderv2 {

    public static int position(String l) {
        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int i = alphabet.indexOf(l) + 1;
        return i;
    }

    public static String back(int x) {
        String alphabet2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String z = alphabet2.substring(x-1, x);
        return z;
    }

    public static String[] charDivider(String l3) {
        String[] characters = new String[l3.length()];
        for (int i = 0; i < l3.length(); i++) {
            characters[i] = l3.substring(i, i + 1);
        }
        return characters;

    }

    public static int[] positionSetter(String[] x, String p) {
        int[] positions = new int[p.length()];
        for (int i = 0; i < p.length(); i++) {
            positions[i] = position(x[i]);
        }
        return positions;
    }

    public static int[] newPosition(int[] x1, String l1) {
        int[] positions2 = new int[l1.length()];
        for (int i = 0; i < l1.length(); i++) {
            if (x1[i] <= 5) {
                positions2[i] = x1[i] * 2;
            } else if (x1[i] > 5 && x1[i] < 11) {
                positions2[i] = (x1[i] % 3) * 5;
            } else if (x1[i] > 10 && x1[i] < 16) {
                positions2[i] = (int) (x1[i] / 4) * 8;
            } else if (x1[i] > 15 && x1[i] < 21) {
                positions2[i] = (((x1[i] % 10) + ((x1[i] / 10) % 10)) * 10) % 26;
            } else if (x1[i] > 20 && x1[i] <= 27) { // U IS 21
                for(int e = 1;e < 14; e++) {
                    int factor = 0;
                    if(x1[i] % e == 0) {
                        factor = e;
                    }
                    positions2[i] = factor;
                }
                                                        // 22-11,23-dne,24-12,25-5,26-13
            }
        }
        return positions2;
    }

    public static String[] backtoLetters(int[] q, String line) {
        String[] letters2 = new String[line.length()];
        for (int i = 0; i < line.length(); i++) {
            letters2[i] = back(q[i]);
        }
        return letters2;
    }

    public static void printCode(String[] x2, String l2) {
        for (int i = 0; i < l2.length(); i++) {
            System.out.println(x2[i]);
        }
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        for (int i = 0; i < 5; i++) {
            System.out.println("Enter any number of letters to be encoded");
            String line = scan.nextLine();
            String[] chars = charDivider(line);
            int[] positions = positionSetter(chars, line);
            int[] newPositions = newPosition(positions, line);
            String[] encodedLine = backtoLetters(newPositions, line);
            printCode(encodedLine, line);

        }

    }

}


因此,我现在遇到的两部分是我的后退方法,这使我对它执行操作得到的数字变成字母。如果我在String字母前放置一个空格并执行indexOf(x,x + 1),那么它的工作原理很好,除了值为0时,它只是返回一个空格。但是,如果我摆脱了空间,它将以某种方式永远不会返回我想要的值,并且现在会返回一些值的错误(我尝试过x + 1。x-1等。)所以我不知道我是什么我做错了

我遇到的第二个困难是找到一个最大的数字,将其乘以12,然后找到循环回到字母(mod 26)的位置,说实话,我只是不知道,这让我头疼。 。

如果您发现我的代码有任何其他问题(不必关联),也许只是可以提高效率/减少混乱的事情,所以当我在该领域找到一份工作时,人们会更讨厌我也:)

最佳答案

我对您的代码进行了一些重构,以展示如何在Java中高效地对此进行编程。这也应该使实用程序功能更易于阅读。我将在下面给您一些有关编码功能的提示。

import java.util.Scanner;

public class EncodervOwl {

    public static int position(char c) {
        if (c < 'A' || c > 'Z') {
            throw new IllegalArgumentException("Character out of range");
        }
        return c - 'A' + 1;
    }

    public static char back(int i) {
        if (i < 1 || i > 'Z' - 'A' + 1) {
            throw new IllegalArgumentException("Character out of range");
        }
        return (char) ('A' + i - 1);
    }

    public static int[] positionSetter(String s) {
        int[] positions = new int[s.length()];
        for (int i = 0; i < s.length(); i++) {
            positions[i] = position(s.charAt(i));
        }
        return positions;
    }

    public static String backtoLetters(int[] p) {
        StringBuilder s = new StringBuilder(p.length);
        for (int i = 0; i < p.length; i++) {
            s.append(back(p[i]));
        }
        return s.toString();
    }

    public static void printCode(int[] positions) {
        System.out.print("Positions: ");
        for (int i = 0; i < positions.length; i++) {
            if (i != 0) {
                System.out.print(", ");
            }
            System.out.print(positions[i]);
        }
        System.out.println();
    }

    public static int[] newPosition(int[] p) {
        int[] p2 = new int[p.length];
        for (int i = 0; i < p.length; i++) {
            if (p[i] <= 5) {
                p2[i] = p[i] * 2;
            } else if (p[i] > 5 && p[i] < 11) {
                // not reversible (6 and 9 map to 0, 7 and 10 to 1 etc)
                p2[i] = (p[i] % 3) * 5;
            } else if (p[i] > 10 && p[i] < 16) {
                p2[i] = (int) (p[i] / 4) * 8;
            } else if (p[i] > 15 && p[i] < 21) {
                // from 1..26 to 0..25
                p2[i] = (((p[i] % 10) + ((p[i] / 10) % 10)) * 10) % 26;
            } else if (p[i] > 20 && p[i] <= 27) { // U IS 21
                for(int e = 1;e < 14; e++) {
                    int factor = 0;
                    if(p[i] % e == 0) {
                        factor = e;
                    }
                    p2[i] = factor;
                }
            }
        }
        return p2;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        for (int i = 0; i < 5; i++) {
            System.out.println("Enter any number of letters to be encoded");
            String line = scan.nextLine();
            int[] positions = positionSetter(line);
            printCode(positions);
            int[] newPositions = newPosition(positions);
            printCode(positions);
            String encodedLine = backtoLetters(newPositions);
            System.out.println(encodedLine);
        }
    }
}


现在看来,您尝试使用1到26之间的范围来执行substitution cipher。请注意,通常在数学中,计算通常以字母大小为模。根据您的情况,该值为26。这会将值映射到一组从0到大小-1(含)的数字。同样,在您的情况下,它是0到25。因此,当您第一次有1..26时,现在是0..25。您应该始终从索引0开始,从不从1开始,这在数学上是不正确的!

此外,您需要认真考虑哪些计算是可逆的,哪些不是可逆的。例如,如果执行x1 % 3,则值6和9都将返回0。因此,在这种情况下,您将丢失信息,并且无法取消加密操作。

祝您项目顺利,您现在应该可以将更多精力放在实际的加密上。

10-02 02:23
查看更多