gpt4 book ai didi

java - 基于移位方向和空格数的凯撒密码移位Java

转载 作者:行者123 更新时间:2023-12-02 05:19:51 26 4
gpt4 key购买 nike

我对 java(以及一般的编程)相对较新,并且我正在努力改进。我正在尝试做一个项目(与学校无关),该项目要求根据他们输入的字符串、他们希望移动的方向以及他们希望的字母表中的位置数来创建凯撒密码转变。一个例子如下:

普通字母:A B C D E F G H

右移 2:Y Z A B C D E F

左移 3:D E F G H I J K

问题是,如果它只是一个字符,那么做起来很简单,但我不知道如何在不使用数组的情况下继续,我不喜欢数组。有什么建议吗?

更新

我已经成功地将一些代码(经过数小时的帮助)编译为以下内容,但是我的 main.c 文件遇到了两个错误。这是我的方法文件:

import java.util.Scanner;

public class HW4Methods
{
public static String readString(Scanner kb)
{

Scanner kbTwo = new Scanner(System.in);

System.out.print("Please Enter A String: ");
String userString = kbTwo.nextLine();

while(userString.equals(null) || (userString.isEmpty()))
{
System.out.print("Field Cannot Be Empty. Please Re-Enter: ");
userString = kbTwo.nextLine();
}
return userString;
}

public static int readAmountToShift(Scanner kb)
{
int amountToShift;

Scanner kbThree = new Scanner(System.in);

System.out.print("Please Enter the Amount You Wish To Shift: ");
amountToShift = kb.nextInt();

while((amountToShift < 0) || (amountToShift > 2000000000))
{
System.out.print("Number Not Within Specified Parameters. Please Re-Enter: ");
amountToShift = kb.nextInt();
}

return amountToShift;
}

public static String readDirection(Scanner kb)
{

Scanner kbFour = new Scanner(System.in);

System.out.print("Enter the Direction You Wish to Shift (Left or Right): ");
String shiftD = kb.next();

while(!shiftD.equalsIgnoreCase("left") && (!shiftD.equalsIgnoreCase("right")))
{
System.out.print("Invalid Direction. Enter the Direction You Wish to Shift (Left or Right): ");
shiftD = kbFour.next();
}

return shiftD;
}

public static int menu(Scanner kb)
{
int userChoice;
Scanner kbFive = new Scanner(System.in);

System.out.println("Please Choose From the Following:");
System.out.println("1. Enter New String.");
System.out.println("2. Encrypt String.");
System.out.println("3. Decrypt String.");
System.out.println("4. Quit.");
System.out.println("Please Enter Your Choice: ");
userChoice = kbFive.nextInt();

while((userChoice < 1)||(userChoice > 4))
{
System.out.print("Invalid Menu Choice. Please Try Again.");
userChoice = kbFive.nextInt();
}
return userChoice;
}
public static String encryptString(String origString, int amount, String direction)
{
origString = "";
for(int i=0;i < origString.length();i++)
{
char a = origString.charAt(i);
if(direction.equalsIgnoreCase("right"))
{
if(a + amount > 122)
{
origString += 97 +(a + amount - 123);
}
else if(a + amount > 90)
{
origString += 65+(a + amount - 91);
}
else if(a + amount > 97 && a + amount <= 122)
{
origString += (char)(a + amount);
}
else if(a + amount > 65 && a + amount <= 90)
{
origString += (char)(a + amount);
}
}
if(direction.equalsIgnoreCase("left"))
{
if(a+ amount < 65)
{
origString += (char)(90);
}
else if(a - amount < 91)
{
origString += 113 +(a - amount + 91);
}
else if(a + amount >= 97 && a + amount <= 122)
{
origString += (char)(a - amount);
}
else if(a + amount <= 65 && a + amount >= 91)
{
origString += (char)(a - amount);
}
}
}
return origString;

}

public static String decryptString(String encryptedString, int amount, String direction)
{
String decrypt = "";
for(int i=0;i < encryptedString.length();i++)
{
char a = encryptedString.charAt(i);
if(direction.equals("right"))
{
if(a - amount < 97)
{
decrypt += (char)(122) - (a - amount - 123);
}
else if(a - amount < 65)
{
decrypt += 90 - ((char)(a + amount) - 91);
}
else if(a - amount >= 97 && a - amount <= 122)
{
decrypt += (char)(a - amount);
}
else if(a - amount >= 65 && a - amount <= 90)
{
decrypt += (char)(a - amount);
}

}
if(direction.equals("left"))
{
if(a + amount > 90)
{
decrypt += 65 +((char)(a - amount) - 64);
}
else if(a + amount > 122)
{
decrypt += 97 + ((char)(a + amount) - 97);
}
else if(a + amount >= 65 && a + amount <= 91)
{
decrypt += (char)(a + amount);
}
else if(a + amount >= 97 && a + amount <= 122)
{
decrypt += (char)(a + amount);
}
}
}
return decrypt;

}
public static void display(String stringOne, String stringTwo)
{
System.out.println(stringOne + stringTwo);
}



}

这是我的主目录(在不同的文件夹中):

导入java.util.Scanner;

public class CSCD210HW4
{
public static void main(String [] args)
{
int choice, amount;
Scanner kb = new Scanner(System.in);
String direction, origString, encryptedString, decryptedString;

origString = HW4Methods.readString(kb);
amount = HW4Methods.readAmountToShift(kb);
direction = HW4Methods.readDirection(kb);
encryptedString = HW4Methods.encryptString(origString, amount, direction);
HW4Methods.display("Your encrypted string is ", encryptedString);

do
{
choice = HW4Methods.menu(kb);

switch(choice)
{
case 1: origString = HW4Methods.readString(kb);
break;

case 2: amount = HW4Methods.readAmountToShift(kb);
direction = HW4Methods.readDirection(kb);
encryptedString = HW4Methods.encryptString(origString, amount, direction);
HW4Methods.display("Your encrypted string is ", encryptedString);
break;

case 3: direction = HW4Methods.readDirection(encryptedString);
amount = HW4Methods.readAmountToShift(encryptedString);
decryptedString = HW4Methods.decryptString(encryptedString, amount, direction);
HW4Methods.display("Your decrypted string is ", decryptedString);
break;

case 4: System.out.println("Thanks for playing");

}// end switch

}while(choice != 4);

}// end main
}// end class

我在 main 中遇到两个错误,如下所示:

CSCD210HW4.java:33: error: incompatible types: String cannot be converted to Scanner
amount = HW4Methods.readAmountToShift(encryptedString);
^
CSCD210HW4.java:32: error: incompatible types: String cannot be converted to Scanner
case 3: direction = HW4Methods.readDirection(encryptedString);
^

我不知道为什么会出现这些错误,这让我发疯。

最佳答案

每个character is associated with a number 。检查this查看如何将 char 转换为 java 字符串。想法是,您可以获取数字形式的范围,而无需创建数组。

如果你知道它们的界限,你可以使用 mod (%) 来环绕。例如:

如果我们有 B = 66。索引(B) - 64 = 2。(这是从 1 - 26 的数字列表中的顺序)。

平移=-5。所以答案应该是:W(23rd)

(索引(B)-64-5)%26 = 23。

只需确保 A 从 1 或 0 开始。如果 A 从 1 开始,则需要添加 1。

更新

由于您在这方面花费了大量时间,所以让我给您一个简单的示例来说明它的样子。这没有良好的代码应具有的所有异常检查和验证:

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Enter the string to encrypt: ");
String string = scanner.nextLine().toUpperCase();
System.out.println("Enter offset");
int offset = Integer.parseInt(scanner.nextLine());

System.out.println("Encrypting " + string + " with offset: " + offset);
StringBuilder sb = new StringBuilder();

for (char c : string.toCharArray())
{
//broken down for clarity
int order = ((int)c) - 65 + offset;
//that strange addition is to force negative modulo to the answer that we want.
int newOrder = (order % 26) + ((order < 0) ? 26 : 0);
int backToAscii = newOrder + 65;

sb.append(Character.toString((char)backToAscii));
}
System.out.println(sb.toString());
}

用法示例:

Enter the string to encrypt: 
Bulka
Enter offset
-5
Encrypting BULKA with offset: -5
WPGFV

或者

Enter the string to encrypt: 
Bulka
Enter offset
5
Encrypting BULKA with offset: 5
GZQPF

关于java - 基于移位方向和空格数的凯撒密码移位Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26597152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com