Создание переводчика азбуки Морзе для моего класса программирования, проблемы с выводом

это мой первый пост на этой платформе, я новичок в этом программировании на Java, а также не очень хорош в английском: p

Мой учитель попросил переводчик азбуки Морзе, который переводит буквы Морзе в буквы и наоборот.

Вот код, который я придумал:

import java.util.Scanner;
public class Morse2 {
    public static void main(String[] args){
 String[] letras = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
                  "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", 
                  "y", "z"};                  
 String[] MORSE = {
 ".-" ,"-...","-.-.","-.." ,"." , 
 "..-.","--." ,"....",".." ,".---", 
 "-.-" ,".-..","--" ,"-." ,"---" , 
 ".--.","--.-",".-." ,"..." ,"-" , 
 "..-" ,"...-",".--", "-..-","-.--", 
 "--.."}; 
System.out.println("Insira uma frase em codigo morse para uma traducao para texto ou vice-versa");
Scanner in=new Scanner(System.in);
String frase =in.nextLine();
String resp="";

frase=frase.toLowerCase();
String[] paraletras=frase.split("");
String[]paraMorse=frase.split(" ");
for(int i=0;i< paraletras.length;i++){
    for(int j=0;j< letras.length ;j++){
     if (paraletras[i].equals(letras[j])){
    resp=resp+ MORSE[j]+" ";}
    }
}
for(int k=0;k<paraMorse.length;k++){
     for (int l=0;l<MORSE.length;l++){
          if(paraMorse[k].equals(MORSE[l])){
    resp=resp+letras[l]+ " ";}}
    }

System.out.print(resp);}

    }

Класс компилируется нормально, но у меня есть некоторые проблемы с моим выводом, в частности с порядком вывода:

например, мой ввод "a b -.- c" Что я хотел ".- -... k -.-." Что я получил ".- -... -.-. k" Я считаю, что это потому, что я использовал 2 для циклов вместо 1, но я действительно не могу сказать, как это сделать. Буду признателен за некоторую помощь. Также, когда пользователь пишет невозможный символ как "*" я должен был поставить "?" в этой позиции, и я также борюсь с этим, я не знаю, должен ли я использовать цикл if else или что

Пожалуйста, помогите мне и спасибо всем ^^


person Joao Barata    schedule 17.11.2017    source источник
comment
Здравствуйте, Жоао, вы разместили свой вопрос на португальском StackOverflow? Кроме того, я рекомендую добавить тег Java, чтобы люди могли помочь вам больше...   -  person joao Beno    schedule 18.11.2017


Ответы (3)


Да вы правы. Это потому, что вы запускаете свои циклы последовательно.

Вам нужен один цикл для вашего ввода, затем проверьте, является ли одна часть ввода буквой - возьмите перевод из массива букв, если это MORSE, возьмите из массива Морзе.

На самом деле массивы - не лучший подход. Гораздо проще использовать одну Карту, где буква будет ключом, а МОРСЕ будет значением.

тогда код может выглядеть так:

 public static void main(String... args) {

    String[] letras = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
            "s", "t", "u", "v", "w", "x", "y", "z" };
    String[] MORSE = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--",
            "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.." };
    System.out.println("Insira uma frase em codigo morse para uma traducao para texto ou vice-versa");


    Map<String, String> decodeMap = new HashMap<String, String>();

    for (int i=0; i< letras.length; i++)
    {
        decodeMap.put(letras[i], MORSE[i]);
    }

    Scanner in=new Scanner(System.in);
    String frase =in.nextLine();
    String resp = "";

    frase = frase.toLowerCase();
    String[] paraletras = frase.split(" ");     
    for (int i = 0; i < paraletras.length; i++) {
        boolean gotValue = false;
        for (Entry<String, String> decodeEntry: decodeMap.entrySet()) {             
          if (decodeEntry.getKey().equals(paraletras[i]))
          {
            // it is a letter print its MORSE
            resp += decodeEntry.getValue();
            gotValue = true;
            break;
          } else if (decodeEntry.getValue().equals(paraletras[i]))
          {             
            // it is a MORSE - print its letter
            resp += decodeEntry.getKey();
            gotValue = true;
            break;
          }
        } 
        if (gotValue)
        {
          resp += " ";
        }
    }
    System.out.print(resp);
}
person Vadim    schedule 17.11.2017

Вы должны оценить каждую группу или символы, чтобы угадать, является ли это Морзе или нет.

Example:
First group: 'a'
  is morse -> no
  is a letter -> yes -> then convert to morse
Second group: 'b' 
  is morse -> no
  is a letter -> yes -> then convert to morse
Third group: '-.-'
  is morse -> yes -> then convert to letter

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

import java.util.Scanner;

public class Morse2 {

    public static void main(String[] args) {

        String[] LETRAS = { 
                "a", "b", "c", "d", "e", "f", 
                "g", "h", "i", "j", "k", "l", 
                "m", "n", "o", "p", "q", "r", 
                "s", "t", "u", "v", "w", "x", 
                "y", "z" };

        String[] MORSE = {
                ".-", "-...", "-.-.", "-..", ".", "..-.", 
                "--.", "....", "..", ".---", "-.-", ".-..", 
                "--", "-.", "---", ".--.", "--.-", ".-.", 
                "...", "-", "..-", "...-", ".--", "-..-", 
                "-.--", "--.." };

        System.out.println("Insira uma frase em codigo morse para uma traducao para texto ou vice-versa");
        Scanner in=new Scanner(System.in);
        String frase =in.nextLine();
        String resp = "";

        frase = frase.trim().toLowerCase();
        String[] chars = frase.split(" ");

        for (int i = 0; i < chars.length; i++) {

            String group = chars[i];

            String newChar = null;

            for (int j = 0; j < LETRAS.length; j++) {
                if (LETRAS[j].equals(group)) {
                    newChar =  MORSE[j];
                    break;
                }
            }   

            if (newChar == null) {
                for (int j = 0; j < MORSE.length; j++) {
                    if (MORSE[j].equals(group)) {
                        newChar =  LETRAS[j];
                        break;
                    }
                }
            }

            if (newChar == null) {
                System.out.println("Group not found: "+group);
                continue;
            }
            resp += newChar + " ";

        }
        System.out.print(resp);
        in.close();
    }

}
person Yeray Rodriguez    schedule 17.11.2017
comment
Извините, что я такой нуб, но, вероятно, это еще и потому, что я был здесь 8 часов назад, но почему этот код пару раз дает мне только азбуку Морзе до буквы «а»? - person Joao Barata; 18.11.2017
comment
Этот код в порядке. Код, который вы изменили, содержит 2 ошибки. Посмотрите на операторы if внутри циклов. Вы закрыли операторы if. Из-за этого петля не работает должным образом. - person Yeray Rodriguez; 18.11.2017

Извините, что я такой нуб, но, вероятно, это еще и потому, что я был здесь 8 часов назад, но почему этот код пару раз дает мне только азбуку Морзе до буквы «а»?

import java.util.Scanner;
public class Morse2 {
    public static void main(String[] args){
 String[] abecedario = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",
                  "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", 
                  "y", "z"};                  
 String[] MORSE = {
 ".-" ,"-...","-.-.","-.." ,"." , 
 "..-.","--." ,"....",".." ,".---", 
 "-.-" ,".-..","--" ,"-." ,"---" , 
 ".--.","--.-",".-." ,"..." ,"-" , 
 "..-" ,"...-",".--", "-..-","-.--", 
 "--.."}; 
System.out.println("Insira uma frase em codigo morse para uma traducao para texto ou vice-versa");
Scanner in=new Scanner(System.in);
String frase =in.nextLine();
String resp="";
frase=frase.toLowerCase();
String[] palavra=frase.split(" ");
for(int i=0;i< palavra.length;i++){
    String letra=palavra[i];
    String novochar="";

    for (int j=0;j<abecedario.length;j++){
        if (abecedario[j].equals(letra));
        novochar=MORSE[j];
        break;

    }
    if(novochar==""){
        for (int j=0;j<MORSE.length;j++){
        if (MORSE[j].equals(letra));
        novochar=abecedario[j];
        break; 
    }
    }

    if(novochar==""){
        novochar="?";
        continue;

    }   
    resp=resp+novochar+" ";
    }
    System.out.println(resp);
    }
}   
person Joao Barata    schedule 18.11.2017
comment
Это потому, что вы не сделали правильно if в петлях с j. Смотри: if (abecedario[j].equals(letra)); - ничего ты не закрыл. Тогда novochar=abecedario[j]; всегда будет abecedario[0], а for сразу после него прерывается. Итак... вы забыли сделать это как: if (abecedario[j].equals(letra)) { novochar=MORSE[j]; break; } - то же самое для if во втором цикле for - person Vadim; 21.11.2017