2013-07-24 2 views
-5

Я работаю над этим Pig Latin Translator, и я просто готов, за исключением того факта, что эти два (одинаковых) цикла не работают должным образом. Когда я пытаюсь включить фразу для перевода, например «Мое имя», оно должно появиться как «yMay amenay isway». Проблема в том, что указанные циклы выполняются бесконечно по той причине, о которой я не знаю. В противном случае я проверил, чтобы этот код работал правильно. Я не уверен, как заставить его работать. Есть предположения? Большое спасибо!Pig Latin Translator Бесконечная петля

import java.io.*; 
import java.util.*; 
import java.util.Arrays; 

public class PigLatin 
{ 
    public static void main (String[] args) 
    { 
    System.out.print("Please enter a phrase to translate: "); 
    Scanner scan = new Scanner(System.in); 
    String str = scan.nextLine(); 
    String[] words = str.split("\\s+"); 
    int period = words.length; 
    int spaces = (period - 1); 
    String[] word = Arrays.copyOfRange(words,0,spaces); 
    for (int i = 0; i < word.length; i++) 
    { 
     String a = word[i].substring(0,1); 
     int b = a.length(); 
     int c = word[i].length(); 
     while (b <= 4) //start of thought problem 
     { 
      if (!(a.contains("a") || a.contains("e") || a.contains("i") || a.contains("o") || a.contains("u"))) 
      { 
       a = word[i].substring(0,b); 
       b = b + 1; 
       } 
      } // end of thought problem 
     if (word[i].startsWith("a") || word[i].startsWith("e") || word[i].startsWith("i") || word[i].startsWith("o") || word[i].startsWith("u")) 
     { 
      System.out.print(word[i] + "way"); 
      } 
     else if (!(a.contains("a") || a.contains("e") || a.contains("i") || a.contains("o") || a.contains("u"))) 
     { 
      String answer = word[i].substring(b,c); 
      System.out.print(answer + a + "ay"); 
      } 
     System.out.print(" "); 
     } 
    String end = ""; 
    for (String endArray: Arrays.copyOfRange(words,spaces,period)) 
    { 
     end = end + endArray; 
     } 
    String z = end.substring(0,1); 
    int x = z.length(); 
    int y = end.length(); 
    while (x <= 4) //start of thought problem 
    { 
     if (!(z.contains("a") || z.contains("e") || z.contains("i") || z.contains("o") || z.contains("u"))) 
     { 
      z = end.substring(0,x); 
      x = x + 1; 
      } 
     } //end of thought problem 
    if (end.startsWith("a") || end.startsWith("e") || end.startsWith("i") || end.startsWith("o") || end.startsWith("u")) 
    { 
     System.out.print(end + "way"); 
     } 
    else if (!(z.contains("a") || z.contains("e") || z.contains("i") || z.contains("o") || z.contains("u"))) 
    { 
     String answer = end.substring(x,y); 
     System.out.print(answer + z + "ay"); 
     } 
    System.out.print("."); 
    } 
} 
+11

Что не так? Что ожидается и текущий результат? –

+0

Ожидаемый результат - перевод на Pig Latin. То, что я хочу от этих циклов, - это присвоить && z согласной или согласной группе каждого отдельного слова. Текущий выход ничего, просто бесконечное исполнение. – Gihadi

+0

LOL, я думаю, @AdamSiemion может читать;). Он просит вас предоставить пример ввода (например, «мое имя - adam») и то, что вы ожидаете в качестве вывода (например, «y-may ame-nay is-way»). – davidfmatheson

ответ

0

Это помогает при форматировании кода

while (b <= 4) //start of thought problem 
{ 
    System.out.println("Watch this never end"); //Add this print line 
    if (!(a.contains("a") || a.contains("e") || a.contains("i") || a.contains("o") || a.contains("u"))) 
    { 
     a = word[i].substring(0,b); 
     b = b + 1; 
    } 
} 

То же самое касается

while (x <= 4) //start of thought problem 
{ 
    if (!(z.contains("a") || z.contains("e") || z.contains("i") || z.contains("o") || z.contains("u"))) 
    { 
     z = end.substring(0,x); 
     x = x + 1; 
    } 
} 

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

for(int b = a.length(); b <=4; b++) 
+0

Что здесь отличает от того, что у меня было? – Gihadi

+0

Абсолютно ничего ... но вы должны уметь видеть, что из кода, который никогда не попадает внутрь операторов if, значение b или x никогда не увеличивается таким образом в бесконечном цикле – orangegoat

+0

Хорошо, как бы исправить этот бесконечный цикл? – Gihadi

1

Ваш код ужасно отформатирован, здесь он извлекается в методы и с некоторыми переименованными переменными. Я все еще не исправил ошибок, и переименование может быть расширено.

import java.io.*; 
import java.util.*; 
import java.util.Arrays; 

public class PigLatin 
{ 
    String[] GetWords() 
    { 
    System.out.print("Please enter a phrase to translate: "); 
    Scanner scan = new Scanner(System.in); 
    String str = scan.nextLine(); 
    String[] words = str.split("\\s+"); 
    int period = words.length; 
    int spaces = (period - 1); 
    return Arrays.copyOfRange(words,0,spaces); 
    } 

    bool ContainsVowel(String text) 
    { 
    return text.contains("a") || text.contains("e") || text.contains("i") || text.contains("o") || text .contains("u") 
    } 

    bool StartsWithVowel(String text) 
    { 
    return text.startsWith("a") || text.startsWith("e") || text.startsWith("i") || text.startsWith("o") || text.startsWith("u") 
    } 

    String PigLatin(String text) 
    { 
    String prefix = text.substring(0,1); 
    int b = a.length(); 
    int c = text.length(); 
    while (b <= 4) //start of thought problem 
    { 
     if (!ContainsVowel(prefix)) 
     { 
      prefix= text.substring(0,b); 
      b = b + 1; 
     } 
    } // end of thought problem 
    if (StartsWithVowel(text) 
    { 
     return text + "way"; 
    } 
    else if (!ContainsVowel(prefix)) 
    { 
     String answer = text.substring(b,c); 
     return answer + prefix + "ay"; 
    } 
    return " "; 
    } 

    public static void main (String[] args) 
    { 
    String[] words = GetWords(); 
    for (int i = 0; i < words.length; i++) 
    { 
     String translation = PigLatin(words[i]); 
     System.out.print(translation + " "); 
    } 

    String end = ""; 
    for (String endArray: Arrays.copyOfRange(words,spaces,period)) 
    { 
     end = end + endArray; 
    } 

    String z = end.substring(0,1); 
    int x = z.length(); 
    int y = end.length(); 
    while (x <= 4) //start of thought problem 
    { 
     if (!ContainsVowel(z)) 
     { 
      z = end.substring(0,x); 
      x = x + 1; 
     } 
    } //end of thought problem 

    if (StartsWithVowel(end)) 
    { 
     System.out.print(end + "way"); 
    } 
    else if (!ContainsVowel(z)) 
    { 
     String answer = end.substring(x,y); 
     System.out.print(answer + z + "ay"); 
    } 
    System.out.print("."); 
    } 
} 

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

Существует много возможностей, которые вы можете улучшить. Первое, что я сделал бы, это переместить if (StartsWithVowel(end)) в начало метода PigLatin(String text). Таким образом, вы не выполняете дополнительную работу или не вводите петли на основе ошибочных предположений.