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

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res