gpt4 book ai didi

C++ 需要一些关于 Pig Latin 字符串的建议

转载 作者:行者123 更新时间:2023-12-05 06:07:28 25 4
gpt4 key购买 nike

我需要用 Pig Latin 形式写一个句子,我几乎成功地完成了,除了 1 个案例,我几乎放弃了例如 :如果我的单词以 a\e\o\u\i 开头,那么单词看起来像 easy -> easyway , apple -> appleway

如果它不是以我上面写的字母开头它看起来像这样: box -> oxbay , king -> ingkay

我在粗体部分取得了成功,但在第一部分开头有一个\e\o\u\i 字母,我不知道把 w 放在哪里,需要一些帮助

这是我的代码,提前致谢

#include <iostream>

//Since those are used in ALL function of program, it wont hurt to set it to global
//Else it is considered EVIL to declare global variables
const int maxLine = 100;
char phraseLine[maxLine] = { '\0' };

void pigLatinString();

using namespace std;


void main()
{
// Displayed heading of program

cout << "* You will be prompted to enter a string of *" << endl;
cout << "* words. The string will be converted into *" << endl;
cout << "* Pig Latin and the results displayed. *" << endl;
cout << "* Enter as many strings as you would like. *" << endl;


//prompt the user for a group of words or press enter to quit
cout << "Please enter a word or group of words. (Press enter to quit)\n";
cin.getline(phraseLine, 100, '\n');
cout << endl;

// This is the main loop. Continue executing until the user hits 'enter' to quit.
while (phraseLine[0] != '\0')
{

// Display the word (s) entered by the user
cout << "You entered the following: " << phraseLine << endl;

// Display the word (s) in Pig Latin
cout << "The same phrase in Pig latin is: ";
pigLatinString();
cout << endl;

//prompt the user for a group of words or press enter to quit
cout << "Please enter a word or group of words. (Press enter to quit)\n";
cin.getline(phraseLine, 100, '\n');
}
return;
}


void pigLatinString() //phraseLine is a cstring for the word, maxline is max length of line
{ //variable declarations
char tempConsonant[10];
tempConsonant[0] = '\0';
int numberOfConsonants = 0;
char previousCharacter = ' ';
char currentCharacter = ' ';
bool isInWord = 0;

// for loop checking each index to the end of whatever is typed in
for (int i = 0; i < maxLine; i++)
{

//checking for the end of the phraseline
if (phraseLine[i] == '\0')
{//checking to see if it's in the word
if (isInWord)
{//checking to see that there wasn't a space ahead of the word and then sending the cstring + ay to the console
if (previousCharacter != ' ')
cout << tempConsonant << "ay" << endl;
}
return;
}

// this covers the end of the word condition
if (isInWord)
{// covers the condition of index [i] being the space at the end of the word
if (phraseLine[i] == ' ')
{
// spits out pig latin word, gets you out of the word, flushes the temp consonants array and resets the # of consonants to 0
cout << tempConsonant << "ay";
isInWord = 0;
tempConsonant[0] = '\0';
numberOfConsonants = 0;
}
cout << phraseLine[i] ;

}
else
{//this covers for the first vowel that makes the switch
if (phraseLine[i] != ' ')
{// sets the c string to what is in the phraseline at the time and makes it capitalized
char currentCharacter = phraseLine[i];
currentCharacter = toupper(currentCharacter);

// this takes care of the condition that currentCharacter is not a vowel
if ((currentCharacter != 'A') && (currentCharacter != 'E') &&
(currentCharacter != 'I') && (currentCharacter != 'O') && (currentCharacter != 'U'))
//this sets the array to temporarily hold the consonants for display before the 'ay'
{//this sets the null operator at the end of the c string and looks for the next consonant
tempConsonant[numberOfConsonants] = phraseLine[i];
tempConsonant[numberOfConsonants + 1] = '\0';
numberOfConsonants++;
}
else
{// this sets the boolean isInWord to true and displays the phraseline
isInWord = 1;
cout << phraseLine[i];
}
}
else
{
cout << phraseLine[i] ;
}
}

previousCharacter = phraseLine[i];
}
return;
}

最佳答案

您有两个条件需要考虑。 if你的单词以元音开头,只需在单词末尾添加“way”,else移动第一个字母并在末尾添加“ay”。

使用 std::string 可以简化这项任务而不是 C 字符串。这是因为您现在不再担心超出长度或丢失空字符。它还允许更轻松地访问标准库算法。

#include <algorithm>
#include <iostream>
#include <string>

std::string make_pig_latin(const std::string& word) {
std::string vowels("aeiou");
std::string newWord(word);

if (newWord.find_first_not_of(vowels) == 0) {
// Word starts with a consanant
std::rotate(newWord.begin(), newWord.begin() + 1, newWord.end());
newWord += "ay";
} else {
newWord += "way";
}

return newWord;
}

int main() {
std::cout << make_pig_latin("apple") << '\n'
<< make_pig_latin("box") << '\n'
<< make_pig_latin("king") << '\n'
<< make_pig_latin("easy") << '\n';
}

上面的函数重点介绍了如何构建转化。您只需要知道您的单词是否以元音开头,并采取适当的行动即可。

输出:

appleway
oxbay
ingkay
easyway

我没有得到你必须关心像“电话”这样的词的印象。

查看您的代码,您应该尝试更好地分离您的关注点。 Pig Latin 一次一个词更容易完成,但是您的 Pig Latin 函数中有字符串拆分代码和大量“非 Pig Latin”代码。您的 main 可以处理获取输入。您可能应该有一个单独的函数来将行分成单个单词,使用 std::vector保留这些词是最好的,因为它可以按需增长并且不必事先知道特定的容量。然后你遍历你的单词数组并单独翻译它们。根据您的实际需求,您可能甚至不必存储翻译后的单词,只需将它们直接打印到屏幕上即可。

这是同一个程序,但现在它可以分隔单词。请注意,pig latin 函数不必更改(很多,我添加大写元音只是因为我不想打扰转换单词)以便添加添加的功能。

#include <algorithm>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>

std::string make_pig_latin(const std::string& word) {
std::string vowels("aeiouAEIOU");
std::string newWord(word);

if (newWord.find_first_not_of(vowels) == 0) {
// Word starts with a consanant
std::rotate(newWord.begin(), newWord.begin() + 1, newWord.end());
newWord += "ay";
} else {
newWord += "way";
}

return newWord;
}

int main() {
std::string phrase(
"A sentence where I say words like apple box easy king and ignore "
"punctuation");

std::istringstream sin(phrase);
std::vector<std::string> words(std::istream_iterator<std::string>(sin), {});

for (auto i : words) {
std::cout << make_pig_latin(i) << ' ';
}
}

输出:

Away entencesay hereway Iway aysay ordsway ikelay appleway oxbay easyway ingkay andway ignoreway unctuationpay

关于C++ 需要一些关于 Pig Latin 字符串的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65411178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com