Английский на свинью латынь в C ++ с использованием специальных функций - PullRequest
0 голосов
/ 13 октября 2018

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

Это должно присутствовать в моем исходном коде:

struct Word
{
    string english;
    string pigLatin;
};

Функция 1: Word * splitSentence(const string words, int &size); ~ Принимает английское предложение в виде 1 строки

Функция 2: void convertToPigLatin(Word [] wordArr, int size); ~ Преобразует английский язык в Pig Latin

Функция 3: void convertToPigLatin(Word [] wordArr, int size); ~ Дисплей

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

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

struct Word
{
    string english;
    string pigLatin;
};

Word * splitSentence(wordArr&; int &);
void convertToPigLatin (Word[], int);
void displayPigLatin (Word[], int);

int main()
{
    string userInput;
    int size;

    cout <<"This is an English to Pig Latin translator.\n";
    cout <<"Enter a sentance that you want to translate.\n";
    getline(cin, userInput);

    Word *wordArr = convertToPigLatin(userInput, size); 
    displayPigLatin(wordArr, size);

return 0;
}

Word * splitSentence(const Word [] wordArr, int &size)
{

    int num = 0;
    int phraseLength = userInput.length();

    for (int i = 0; i < size; i++)
    {
        if (isspace(userInput[i]))
        {
            if (isspace(userInput[ i - 1]))
            {
                num--;
            }
            num++;
        }
    }

    if (ispunct(userInput[i]))
    {
        if (i != (phraseLength - 1))
        {
            userInput.erase(1--, 1)
        }
    }
}

void convertToPigLatin(Word wordArr[], int size)
{
    for (int i = 0; i < size; i++)
    {
        int stringLength;

        if (i == (size - 1))
            {
                stringLength = wordArr[i].userInput.length();
            }

        else
            {
                stringLength = wordArr[i].userInput.length() - 1;
            }

        string vowel, way;
        vowel = wordArr[i].userInput.at(stringLength - stringLength);
        way = wordArr[i].userInput.at(stringLength - 3);
        bool markV = ((vowel == 'A') || (vowel == 'a') (vowel == 'E') || (vowel == 'e')
        (vowel == 'I') || (vowel == 'i') (vowel == 'O') || (vowel == 'o') 
        (vowel == 'U') || (vowel == 'u'));

        wordArr[i].userInput.erase(stringLength - 3, 3);

        if (!(markV && (way == 'w')))
        {
            wordArr[i].english = way + wordArr[i].userInput;
        }
    }

    displayPigLatin(wordArr, stringLength);
}

void displayPigLatin(const Word wordArr[], int size);
{
    cout << "\nHere is your phrase in PigLatin: ";
    for (int i = 0 i < size; i++)
    {
        cout << wordArr[i].userInput << " ";
    }
}

1 Ответ

0 голосов
/ 13 октября 2018

Важное примечание: Вы можете использовать только для циклов for-range в C ++ 11 или выше , если ваш компилятор не поддерживает C ++ 11 или выше, используйте обычный цикл for ...

Учитывая ваш вопрос, у вас есть для использованияэта структура (эквивалентна той, что в вопросе):

typedef struct
{
    std::string english;
    std::string pig_latin;
} Word;

Это макрос, который будет использоваться для проверки, является ли первая буква гласной или согласный (следовательно, !IS_VOWEL(some_char)) ...

#define IS_VOWEL(x) ((x) == 'A' || (x) == 'E' || (x) == 'I' || (x) == 'O' || (x) == 'U' || \
    (x) == 'a' || (x) == 'e' || (x) == 'i' || (x) == 'o' || (x) == 'u')

Еще одна функция, которая нам нужна для получения только той части слова, которая имеет буквы (не символы и цифры):

std::pair<unsigned, unsigned> GetWord(std::string word)
{
    auto start = word.end();
    for (auto it = word.begin(); it != word.end(); ++it)
        if (tolower(*it) >= 'a' && tolower(*it) <= 'z' && start == word.end())
            start = it;
        else if (start != word.end() && !(tolower(*it) >= 'a' && tolower(*it) <= 'z'))
            return std::make_pair(std::distance(word.begin(), start), std::distance(word.begin(), it));
    return std::make_pair(start == word.end() ? 0 : std::distance(word.begin(), start), std::distance(word.begin(), word.end()));
}

И, наконец, не в последнюю очередь, функция для преобразования английского языка в Pig-Latin (я знаю, это огромная):

std::vector<Word> CreatePigLatinWordsFromEnglish(std::string english, bool sentence_case = true)
{
    // You can break it from here to use inside another function (viz., splitSentence)
    std::transform(english.begin(), english.end(), english.begin(), ::tolower);
    std::stringstream english_stream(english);
    std::vector<Word> words;
    std::string temporary;
    while (std::getline(english_stream, temporary, ' '))
        words.emplace_back(Word({ temporary, "" }));
    // Till here...
    // From here the conversion starts...
    for (auto &word : words)
    {
        auto const word_it = GetWord(word.english);
        if (!IS_VOWEL(word.english[word_it.first]) && !std::string(std::next(word.english.begin(), word_it.first),
            std::next(word.english.begin(), word_it.second)).empty())
        {
            word.pig_latin.append(std::string(word.english.begin(), std::next(word.english.begin(), word_it.first)));
            word.pig_latin.append(std::string(std::next(word.english.begin(), word_it.first + 1), std::next(word.english.begin(), word_it.second)));
            word.pig_latin.append(1, word.english[word_it.first]);
            word.pig_latin.append(std::string("ay"));
            word.pig_latin.append(std::next(word.english.begin(), word_it.second), word.english.end());
        }
        else
            word.pig_latin = std::string(word.english.begin(), std::next(word.english.begin(), word_it.second)) + "way"
                + std::string(std::next(word.english.begin(), word_it.second), word.english.end());
    }
    // Conversion ends here...
    // Changing the case from lower case to sentence case if needed...
    if (sentence_case)
    {
        words[0].english[0] = toupper(words[0].english[0]);
        words[0].pig_latin[0] = toupper(words[0].pig_latin[0]);
    }
    return words; // Returning the list of words we got...
}

Ну, пример, чтобы продемонстрировать этоМетод:

int main()
{
    auto const test = "An apple a day keeps the doctor away!";
    for (auto word : CreatePigLatinWordsFromEnglish(test))
        std::cout << word.pig_latin << " ";
    return 0;
}

Вывод:

В любом случае, Appleway Away Day Eepskay Hetay Octorday Вдали!

Попробуйте и посмотрите,дает вам необходимый результат ...

С уважением,

Ruks.

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