【问题标题】:Compare each character of two strings. New and looking for input比较两个字符串的每个字符。新的并正在寻找输入
【发布时间】:2020-12-29 14:14:09
【问题描述】:

我目前在 WGU 上 C++ 开发课程,我收到了一个基于 Simon Says 的练习。基本上,simonPattern 是一个由 10 个字符(R、G、B、Y)组成的字符串,userInput 将是游戏每一步的输入。这一章是关于breakcontinue 语句的,但练习没有提供关于使用哪种语句的任何输入(ifwhilefor)。我尝试了几种不同的方法来编写它,但本书练习中的编译器不允许更多 #include 语句,我最终通过了以下内容:

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

int main() {
   string simonPattern;
   string userPattern;
   int userScore = 0;
   int i = 0;

   userScore = 0;
   simonPattern = "RRGBRYYBGY";
   userPattern  = "RRGBBRYBGY";
   char simonPattern0 = simonPattern[0];
   char simonPattern1 = simonPattern[1];
   char simonPattern2 = simonPattern[2];
   char simonPattern3 = simonPattern[3];
   char simonPattern4 = simonPattern[4];
   char simonPattern5 = simonPattern[5];
   char simonPattern6 = simonPattern[6];
   char simonPattern7 = simonPattern[7];
   char simonPattern8 = simonPattern[8];
   char simonPattern9 = simonPattern[9];
   char userPattern0 = userPattern[0];
   char userPattern1 = userPattern[1];
   char userPattern2 = userPattern[2];
   char userPattern3 = userPattern[3];
   char userPattern4 = userPattern[4];
   char userPattern5 = userPattern[5];
   char userPattern6 = userPattern[6];
   char userPattern7 = userPattern[7];
   char userPattern8 = userPattern[8];
   char userPattern9 = userPattern[9];

   for (i = 0; i < 2; ++i) {
      if (simonPattern0 == userPattern0) {
         userScore = ++userScore;
      }
      if (simonPattern0 != userPattern0) {
         break;
      }
      if (simonPattern1 == userPattern1) {
         userScore = ++userScore;
      }
      if (simonPattern1 != userPattern1) {
         break;
      }
      if (simonPattern2 == userPattern2) {
         userScore = ++userScore;
      }
      if (simonPattern2 != userPattern2) {
         break;
      }
      if (simonPattern3 == userPattern3) {
         userScore = ++userScore;
      }
      if (simonPattern3 != userPattern3) {
         break;
      }
      if (simonPattern4 == userPattern4) {
         userScore = ++userScore;
      }
      if (simonPattern4 != userPattern4) {
         break;
      }
      if (simonPattern5 == userPattern5) {
         userScore = ++userScore;
      }
      if (simonPattern5 != userPattern5) {
         break;
      }
      if (simonPattern6 == userPattern6) {
         userScore = ++userScore;
      }
      if (simonPattern6 != userPattern6) {
         break;
      }
      if (simonPattern7 == userPattern7) {
         userScore = ++userScore;
      }
      if (simonPattern7 != userPattern7) {
         break;
      }
      if (simonPattern8 == userPattern8) {
         userScore = ++userScore;
      }
      if (simonPattern8 != userPattern8) {
         break;
      }
      if (simonPattern9 == userPattern9) {
         userScore = ++userScore;
      }
      if (simonPattern9 != userPattern9) {
         break;
      }
      
   }

  

   cout << "userScore: " << userScore << endl;

   return 0;
}

虽然这确实通过了对 simonPatternuserPattern 的几个不同分配的测试,但我不禁觉得这是纯粹的蛮力,考虑到只有 @987654332 的限制,本可以用更少的代码编写@ 和 &lt;string&gt;。我也知道if 链,但是当我尝试forwhile 时,它会抛出错误。

【问题讨论】:

  • 如果您每次都运行完全相同的东西,那么将所有这些 if 放入 for 循环有什么意义?我认为你开始尝试迭代字符串,但它没有用,所以你求助于这个。你知道如何用 for 循环遍历字符串吗?
  • 看看 for 循环的行为.. 详细阅读
  • 将所有字符放入自己的变量中是您的第一个错误。在您执行simonPattern0 == userPattern0 之类的操作时,您可以改用simonPattern[0] == userPattern[0]。然后考虑您可以将0 替换为一个变量,该变量可以是for 循环的计数器(例如for(int j = 0; j &lt; simonPattern.size(); ++j))。
  • if(x == y) {} if (x != y) {} 可以只是 if (x == y) {} else {} 如果 xy 在第一个分支中没有被修改。

标签: c++ string string-comparison


【解决方案1】:

您不需要所有这些变量——您已经有了可以使用的数组!数组的美妙之处在于您可以使用其他变量来索引它们,这使您可以将所有重复的逻辑折叠到另一个循环中。

你的程序可以这样写:

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

int main() {
   string simonPattern;
   string userPattern;
   int userScore = 0;
   int i = 0;

   userScore = 0;
   simonPattern = "RRGBRYYBGY";
   userPattern  = "RRGBBRYBGY";

   for (i = 0; i < 2; ++i) {
      bool stop = false;
      for (int j = 0; j < 10; j++) {
         if (simonPattern[j] == userPattern[j]) {
            userScore = ++userScore;
         }
         else {
            stop = true;
            break;
         }
      }
      
      if (stop)
         break;
   }

   cout << "userScore: " << userScore << endl;

   return 0;
}

诚然,不得不引入bool stop 以从内循环中跳出外循环有点令人费解。但是我们可以通过将逻辑分离到一个函数中来解决这个问题,我们可以在需要时简单地return

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

int calculateUserScore(const string& simonPattern, const string& userPattern) {
   int userScore = 0;
   
   for (int i = 0; i < 2; ++i) {
      for (int j = 0; j < 10; j++) {
         if (simonPattern[j] == userPattern[j])
            ++userScore;
         else
            return userScore;
      }
   }

   return userScore;
}

int main() {
   string simonPattern = "RRGBRYYBGY";
   string userPattern  = "RRGBBRYBGY";

   cout << "userScore: " << calculateUserScore(simonPattern, userPattern) << endl;
}

请注意,为了更加简洁,我还将您的初始分配移到了初始化中,并删除了 main 中多余的 return 0userScore = ++userScore 也包含冗余; ++ 已经执行了增量,不需要重新分配执行结果。

最后,我不知道i &lt; 2 循环的目的是什么:为什么要这样做两次?确保你真的打算这样做。

【讨论】:

  • 不知道我是如何完全忘记使用变量来索引的,那样会容易得多。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 2012-08-02
相关资源
最近更新 更多