比较两个字符串的每个字符。新的和寻找输入

Compare each character of two strings. New and looking for input

我目前在 WGU 参加 class 的 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 的几个不同分配的测试,但我不禁觉得这是纯粹的蛮力,考虑到可以用更少的代码编写只有 <iostream><string> 的限制。我也知道 if 链,但是当我尝试 forwhile 时它会抛出错误。

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

你的程序可以这样写:

#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 < 2 循环的目的是什么:为什么要执行两次?确保你真的打算这样做。