好的,如果我们想进一步了解自己所学的内容,我的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。因此,在这种情况下,您将丢失信息,并且无法取消加密操作。祝您项目顺利,您现在应该可以将更多精力放在实际的加密上。