Переводчик текста в свинью латинский вставляет повторяющиеся символы - PullRequest
0 голосов
/ 22 марта 2019

Я создаю c # приложение Windows Forms для преобразования английского текста в Pig Latin, но программа вставляет первую букву (если она согласную) пять раз в конце, вместо одной.

Мне удалось вставить «путь» в конце текста с помощью оператора if, который проверяет, является ли первая буква гласной. Однако моя проблема начинается с проверки, не является ли слово гласным.

string[] vowels =  new string[5] { "a", "e", "i", "o", "u" };     

private void BtnTranslate_Click(object sender, EventArgs e)
{
    string TextEnglish = txtEnglish.Text;
    for (int i = 0; i < vowels.Length; i++)
    {
        if (TextEnglish.StartsWith(vowels[i]))
        {
            TextEnglish = TextEnglish.Insert(TextEnglish.Length, "way");
        }
        else if(!TextEnglish.StartsWith(vowels[i]))
        {
            string TextEnglishSubstring = TextEnglish.Substring(0, 1);
            TextEnglish = TextEnglish.Insert(TextEnglish.Length, TextEnglishSubstring);
            TextEnglish = TextEnglish.Insert(TextEnglish.Length, "ay");
        }

        //string substringToInsert = TextEnglish.Substring(0, 1);
        //TextEnglish = TextEnglish.Insert(TextEnglish.Length, "c");
        txtPigLatin.Text = TextEnglish;
    }
}

Ответы [ 2 ]

1 голос
/ 23 марта 2019

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

Проблема в том, что вы перебираете все элементы в массиве гласных и меняете текст для каждой итерации. Вместо этого вам нужно просто определить, начинается ли слово с гласного или нет. Опять же, это может быть написано в другом методе (больше инкапсуляции кода, что означает, что это также может быть повторно использовано в другом месте, если это необходимо).

Обратите внимание, что я написал гласные как string, но могу трактовать его как char[] (потому что это действительно то, чем на самом деле являются строки), и хитрость здесь заключается в том, чтобы увидеть, является ли массив Contains первый символ входной строки:

public static bool BeginsWithAVowel(string input)
{
    if (string.IsNullOrWhiteSpace(input)) return false;
    var vowels = "AaEeIiOoUu";
    return vowels.Contains(input.Substring(0, 1));
}

Теперь мы можем использовать этот метод для проверки нашей строки в нашем методе преобразования латиноамериканских символов:

public static string ConvertToPigLatin(string input)
{
    if (string.IsNullOrWhiteSpace(input)) return input;

    if (BeginsWithAVowel(input))
    {
        // Add "way" to the end of the string and return it
        return input + "way";
    }

    // Remove the first character and add it, plus "ay", to the end and return it
    return input.Substring(1) + input.Substring(0, 1) + "ay";
}

Теперь в событии нажатия кнопки все, что нам нужно сделать, чтобы преобразовать текст, - это вызвать наш метод с исходным текстом, а затем установить свойство Text для результата:

private void BtnTranslate_Click(object sender, EventArgs e)
{
    txtPigLatin.Text = ConvertToPigLatin(txtEnglish.Text);
}
1 голос
/ 22 марта 2019

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

Вместо этого выследует проверить, является ли это гласным, установить флаг, а затем выполнить логику преобразования.Есть несколько способов справиться с этим, вот пример:

string TextEnglish = txtEnglish.Text;
bool startsWithVowel = vowels.Any(v => TextEnglish.StartsWith(v));
if(startsWithVowel)
{
    // Do vowel logic
}
else
{
    // Do consonant logic
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...