Tommy
Tommy

Reputation: 37

Problem encryption exercise with ASCII table

I have a problem with this exercise.

In this exercise I enter a word and a number. I have to use the ASCII table to encrypt the word.

Another problem is if I use an uppercase letter. If I enter the uppercase letter "Z" I'll still get a symbol.

Another problem is if I use the letters "aB" and the number -2 should come out "yZ", but symbols come out.

This is the exercise:

public static void main(String[] args) {
    Scanner in=new Scanner(System.in);
    String s, n="";
    int N;
    System.out.println("Insert a word");    
    s=in.next();
    System.out.println("Insert a number");
    N=in.nextInt();
    n=uno(s, N);
    System.out.println("That's the encrypted word: " + n);
}
public static String uno (String s, int N) {
    String f, n="";
    int c;
    int length = s.length();
    for (int i=0; i<length; i++) {
        c = s.charAt(i);  
        c=c+N;
        f = Character.toString((char)c);
        n=n+f;
    }
    return n;
}

Upvotes: 1

Views: 89

Answers (1)

Harshal Parekh
Harshal Parekh

Reputation: 6017

ASCII for z is 122. You add 2 to that. The ASCII for 124 is | symbol.

You need to check if your addition is going out of range (i.e. above 122).

Note: this won't work is N is greater than 26. Check the solution just below that implements modulo to handle that.

public static String uno (String s, int N) {
    String f, n = "";
    int c;
    int length = s.length();
    for (int i = 0; i < length; i++) {
        c = s.charAt(i);
        c = c + N;
        if (c >= 122) {
            c -= 26;
        }
        f = Character.toString((char) c);
        n = n + f;
    }
    return n;
}

Side note: Never concatenate a string in a loop using +. It is very inefficient. Using StringBuilder.

Handle case sensitive letters concisely:

public static String uno (String s, int N) {
    StringBuilder n = new StringBuilder();
    int bound = s.length();
    IntStream.range(0, bound).forEach(i -> {
        char c = s.charAt(i);
        n.append(Character.isUpperCase(c) ?
                (char) ((c + N - 'A') % 26 + 'A') :
                (char) ((c + N - 'a') % 26 + 'a'));
    });
    return n.toString();
}

Handling negative numbers:

public static String uno (String s, int N) {
    StringBuilder n = new StringBuilder();
    int bound = s.length();
    IntStream.range(0, bound).forEach(i -> {
        char c = s.charAt(i);
        if (N > 0) {
            n.append(Character.isUpperCase(c) ?
                    (char) ((c + N - 'A') % 26 + 'A') :
                    (char) ((c + N - 'a') % 26 + 'a'));
        } else {
            n.append((char) (c + N % 26 + 26));
        }
    });
    return n.toString();
}

Check this comment for a good point on your naming conventions.

Upvotes: 3

Related Questions