如何解决C++ 需要一些关于 Pig Latin 字符串的建议
我需要用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,'\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
来保存单词是最好的,因为它可以按需增长并且不必预先知道特定的容量。然后您遍历您的单词数组并单独翻译它们。根据您的实际需求,您甚至可以不必存储翻译的单词,只需将它们直接打印到屏幕上即可。
这是同一个程序,但现在它可以分隔单词了。请注意,猪拉丁函数不必更改(很多,我添加大写元音只是因为我不想打扰转换单词)以便添加添加的功能。
#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.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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。