Метод для возврата строки - PullRequest
4 голосов
/ 09 января 2012

Итак, я делаю простую программу шифрования на Java. Пользователь вводит строку (strTarget), а затем эта строка переносится в эту функцию. В цикле for он должен принять значение ASCII символа, уменьшить его на 4, а затем вернуть его в строку (делая это для всех символов в строке). Как видите, мои друзья уже сделали это, однако я не уверен, как восстановить строку, которую я хочу вернуть (например, если пользователь вводит 'efg', возвращаемая строка должна быть 'abc')

Итак, вот результат, который я получил с предложениями. Я явно делаю что-то не так в классе Menu, не уверен, что это такое. Он перестает работать, когда я ввожу строку для шифрования.

import java.util.Scanner;

public class Menu {

public static String strTarget;

public static void main(String[] args) {


    Scanner in = new Scanner(System.in);

    System.out
            .println("Welcome to the encr/decr program");
    System.out
            .println("To encrypt a string, press 1, to decrypt a string, press 2");
    int choice = in.nextInt();
    if (choice == 1) {
        System.out.println("Type the string you want to encrypt.");
        strTarget = in.next();
        System.out.println(Encrypt(strTarget));
    }
    if (choice == 2) {
        System.out.println("Enter the string you want to decrypt.");
    }

}

private static String Encrypt(String strTarget) {
    // TODO Auto-generated method stub
    int len = strTarget.length()-1;

    String destination = "";

    for (int i = 0; i<len; i++)
    {

        if (strTarget.charAt(i) != ' ')
        {
            char a = strTarget.charAt(i);
            int b = (int) a;
            b = strTarget.charAt(i)-4;
            a = (char) b;
            if ( b<70 && b>64)
            {
                b = strTarget.charAt(i)+26;
                a = (char) b;

                destination += a;
            }
        }


    }
    return destination; 

} }

РЕДАКТИРОВАТЬ: Добавлена ​​полная программа.

import java.util.Scanner;

public class Menu {

public static String strTarget;

public static String destination = "";

public static void main(String[] args) {


Scanner in = new Scanner(System.in);

System.out.println("Welcome to the encr/decr program");

System.out.println("To encrypt a string, press 1, to decrypt a string, press 2");



int choice = in.nextInt();

if (choice == 1) {
    System.out.println("Type the string you want to encrypt.");

    strTarget = in.next();

    StringBuilder zomg = new StringBuilder(strTarget);

    System.out.println(Encrypt(zomg));


}

if (choice == 2) {
    System.out.println("Enter the string you want to decrypt.");
}

}

 private static String Encrypt(StringBuilder zomg) {
// TODO Auto-generated method stub

int len = strTarget.length()-1;

for (int i = 0; i<len; i++)
{

    if (strTarget.charAt(i) != ' ')
    {
        char a = strTarget.charAt(i);
        int b = (int) a;
        b = strTarget.charAt(i)-4;
        a = (char) b;
        destination += a;
        if ( b<70 && b>65)
        {
            b = strTarget.charAt(i)+26;
            a = (char) b;
            destination += a;
        }
    }


}
System.out.println(destination);
return destination; 

}}

Я внес изменения, которые вы сказали (я думаю), и он начал работать, но он не работает, как положено. Дает некоторые результаты, которые, кажется, не имеют смысла (для 'A' он возвращает =, для 'V' он возвращает 'V'). Есть предложения?

Ответы [ 6 ]

2 голосов
/ 09 января 2012

Вот рекурсивное решение:

Вы хотите вызвать его с помощью Encrypt(string,0)

private static String Encrypt(String strTarget, int place) {
// TODO Auto-generated method stub
    if (place==strTarget.length()) {
        return strTarget;
    }
    if (strTarget.charAt(place) != ' ')
    {
        char a = strTarget.charAt(place);
        int b = (int) a;
        b = strTarget.charAt(place)-4;
        a = (char) b;
        if ( b<70 && b>64)
        {
            b = strTarget.charAt(place)+26;
            a = (char) b;
        }
        return Encrypt(strTarget.substring(0,place)+a+strTarget.substring(place+1,strTarget.length()),place+1);
    }
    return null;
}
2 голосов
/ 09 января 2012

Просто добавьте каждый преобразованный символ в StringBuilder или StringBuffer.

0 голосов
/ 09 января 2012

Читаемая, более объектно-ориентированная версия, использующая магию некоторых символов:

private static final int MOD_ALPHABET = 'Z' - 'A' + 1;

private static String rot(int rot, String toEncrypt) {

    int rangedRot = rot % MOD_ALPHABET;
    if (rangedRot < 0) {
        rangedRot = MOD_ALPHABET + rangedRot;
    }

    final StringBuilder sb = new StringBuilder(toEncrypt);
    for (int i = 0; i < sb.length(); i++) {
        final char plainChar = sb.charAt(i);
        final char startChar;
        if (plainChar >= 'A' && plainChar <= 'Z') {
            startChar = 'A';
        } else if (plainChar >= 'a' && plainChar <= 'z') {
            startChar = 'a';
        } else {
            continue;
        }

        char cryptChar = (char) (plainChar - startChar);
        cryptChar += rangedRot;
        cryptChar %= MOD_ALPHABET;
        cryptChar += startChar;
        sb.setCharAt(i, cryptChar);
    }
    return sb.toString();
}
0 голосов
/ 09 января 2012

Вы можете попробовать что-то вроде следующего:

private static String encrypt(String strTarget) {
    char[] chars = strTarget.toCharArray();
    for(int i=0; i<chars.length; i++) {
        if(chars[i] != ' ') {
            int asciiVal = chars[i];
            asciiVal -= 4;
            if(asciiVal < 70 && asciiVal > 64) {
                asciiVal += 26;                    
            }
            chars[i] = (char) asciiVal;
        }
    }
    return String.valueOf(chars);
}
0 голосов
/ 09 января 2012
private static String Encrypt(String strTarget) {
    // TODO Auto-generated method stub
    int len = strTarget.length()-1;

    String destination = "";

    for (int i = 0; i<len; i++)
    {

        if (strTarget.charAt(i) != ' ')
        {
            char a = strTarget.charAt(i);
            int b = (int) a;
            b = strTarget.charAt(i)-4;
            a = (char) b;
            if ( b<70 && b>64)
            {
                b = strTarget.charAt(i)+26;
                a = (char) b;

                destination += a;
            }
        }

    return destination;
    }

Я добавил новую строку с именем destination, добавил к ней символы и возвратил ее.

EDIT

Однако, похоже, чтовы можете захотеть изменить фактические String, strTarget.

. Для этого не следует передавать strTarget в качестве параметра, поскольку передает его по значению, а не по ссылке.

Чтобы действительно изменить строку, передайте StringBuilder, как указано здесь .(Кстати, здесь есть ссылка.)

РЕДАКТИРОВАТЬ # 2

Скажем, у вас есть метод.Назовите это foo.Foo принимает int в качестве параметра и устанавливает его в 1:

public static void foo(int i) {
    i = 1;
}

Теперь вы хотите проверить свой метод:

public static void main(String[] args) {

    int i = 0;
    foo(i);
    System.out.println(i);
}

Это должно вывести 1, верно? NO .Это не так.Это печатает "0".Вы можете проверить это, если хотите.Это потому, что целое число «передано по значению» .Когда что-то передается по значению, виртуальная машина обычно делает его копию и передает копию в метод.

Поэтому, когда вы выполняете i=1 в вашем методе foo, вы фактически устанавливаетекопия от i до 1, а не i.Таким образом, i остается неизменным.

Существует другой тип передачи параметров, который называется передача по ссылке .Когда что-то передается по ссылке, метод изменяет фактическую переменную.

Массивы, например, передаются по ссылке.Возьмите этот код, например:

public static void foo(int[] i) {
    i[0] = 1; // i must have at least one element.
}


public static void main(String[] args) {

    int[] i = new int[1];
    foo(i);
    System.out.println(i[0]);
}

В этом примере i изменяется в foo, так как он передается по ссылке.

В исходном методе вы вводитетип возврата как void.С типом возврата void вы не можете вернуть зашифрованный String.Поэтому мне пришло в голову, что, возможно, вы захотите передать по ссылке и изменить strTarget.

Для этого вместо передачи strTarget вы должны передать StringBuilder.,Вы можете создать его с помощью new StringBuilder(strTarget), и он будет автоматически pass by reference.Если бы вы хотели этого, то я бы сгенерировал destination String (как указано выше), а затем изменил StringBuilder, чтобы изменить strTarget на destination String.

Надеюсь, это помогло.

0 голосов
/ 09 января 2012

Инициализировать пустую строку перед циклом for:

String target = "";

Во внутреннем, если сделать это:

target += a;

Это должно сделать!

return target;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...