C++ 无法获取问题的所需输出

C++ 无法获取问题的所需输出,c++,C++,我想在这里解决一个问题。我有两个数组需要添加并生成所需的输出。{'A','A','A','B','A','X','M'}和{'A','B','A','A','B','B'}。A的值为10,B的值为20 如果连续重复A或B,则加上奖金数字,即10。我需要得到一个总分为90分第一和140分第二的输出。我怎样才能写出完美的代码 我的代码如下:第一个数组的输出应该是90,第二个数组的输出应该是140。X和M的值为0。所以别介意 这里,数组中的第一个字符是A,所以分数是10 第二个对于A也是现在的10,

我想在这里解决一个问题。我有两个数组需要添加并生成所需的输出。{'A','A','A','B','A','X','M'}和{'A','B','A','A','B','B'}。A的值为10,B的值为20

如果连续重复A或B,则加上奖金数字,即10。我需要得到一个总分为90分第一和140分第二的输出。我怎样才能写出完美的代码

我的代码如下:第一个数组的输出应该是90,第二个数组的输出应该是140。X和M的值为0。所以别介意

  • 这里,数组中的第一个字符是A,所以分数是10
  • 第二个对于A也是现在的10,和前一个一样是10+10=20
  • 现在,第三个也是在之前的分数基础上再加10分,即10+20(最后两个也是两个),即30分
  • 现在,数组中的第四个元素是B,所以它不是A,条纹被破坏,所以为B添加分数,设置为20
  • 对于第五个元素,我们有一个,但由于前一个元素是蓝色的,所以没有连胜奖金,A的分数被重置,所以现在添加10
  • 为X和M元素添加0
  • 因此,总分为10+20+30+20+10=90
#包括
int main()
{
int currentEScore=0;
整数总分=0;
字符框[]={A',A',A',B',A',X',M'};
//A B A R A R A A
for(int i=0;istd::cout第一件事:您在第一次迭代中访问数组超出范围(
if(Box[i-1]==Box[i])
)。这是未定义的行为,严格地说,您的所有代码都是无意义的,因为编译器没有义务对无效代码执行任何有意义的操作。这只是碰巧不会影响代码的结果。这是未定义行为最糟糕的体现:它似乎可以工作。您需要修复它

接下来,您的循环读取(int i=0;i
,条件不可能正确。这同样会使您的循环访问数组超出范围。我有点困惑这是如何工作的(我自己首先没有意识到)。这也必须解决!我建议对字符数组使用
std::string
。它不太容易出错,并且有一个
size()
方法来获取其大小

上述问题不会影响输出(但必须修复!),现在让我们看一下代码的逻辑。但首先要声明:我能给你的最好建议是不要继续阅读此答案。你面临的问题是一个学习如何使用调试器的好机会。这是你永远需要的技能。如果你仍然决定阅读以下内容,那么至少你应该尝试忘记这些答案所说的每一件事,你都可以自己进行同样的过程,可以使用调试器,也可以使用一张纸和一支笔

让我们在您的第一个示例中逐步进行
{'A','A','A','B','A','X','M'}

  • 第一个字符是
    A
  • 如果(框[i]=“A”)
    ->条件为真
  • currentEScoe=10;
    ->
    currentEScoe==10
  • (我们暂时忽略了出界)
  • TotalScore=TotalScore+currentscore;
    ->
    TotalScore==10
  • 下一个字符是
    A
  • 如果(框[i]=“A”)
    ->条件为真
  • currentEScore=10;
    ->
    currentEScore==10
  • if(框[i-1]==Box[i])
    ->yes
  • currentEScore+=10;
    ->
    currentEScore==20
  • TotalScore=TotalScore+currentscore;
    ->
    TotalScore==10+20==30
  • 下一个字符是
    A
  • 如果(框[i]=“A”)
    ->条件为真
  • currentEScore=10;
    ->
    currentEScore==10
    ->停止……这是错误的
您正在重置每个角色的奖金分数,然后只检查前一个。其效果是,您的奖金不会超过
20

解决方案:修复越界访问,仅当字符与最后一个字符不同时才重置奖金。此外,代码可以简化一点,因为实现奖金与字符是
a
还是
B
无关。您只需检查它是否与最后一个字符相同,从而计算奖金和附加值
A
B
的ng点可以分别完成:

#include <iostream>
#include <string>
int main()
{
    int bonus_increment = 10;
    int bonus = 0;
    int score_A = 10;
    int score_B = 20;
    int TotalScore = 0;
    std::string Box{"AAABAXM"};
    for (size_t i = 0; i < Box.size(); i++) {
        // determine bonus
        if ( i > 0 && Box[i] == Box[i-1] ) {
            bonus += bonus_increment;
        } else {
            bonus = 0;
        }
        // accumulate score
        if (Box[i] == 'A') {
            TotalScore += score_A + bonus;
        } else if (Box[i] == 'B') {
            TotalScore += score_B + bonus;
        }
    }
    std::cout << TotalScore;
}
#包括
#包括
int main()
{
整数加成增量=10;
整数奖金=0;
积分A=10;
积分B=20;
整数总分=0;
字符串框{“AAABAXM”};
对于(size_t i=0;i0&&Box[i]==Box[i-1]){
奖金+=奖金增量;
}否则{
奖金=0;
}
//累积分数
如果(框[i]=“A”){
总分+=总分+奖金;
}else if(框[i]=“B”){
总分+=总分+奖金;
}
}

std::cout第一件事:在第一次迭代(
if(Box[i-1]==Box[i])
)中,您正在访问超出边界的数组。这是未定义的行为,严格地说,您所有的
#include <iostream>
#include <string>
int main()
{
    int bonus_increment = 10;
    int bonus = 0;
    int score_A = 10;
    int score_B = 20;
    int TotalScore = 0;
    std::string Box{"AAABAXM"};
    for (size_t i = 0; i < Box.size(); i++) {
        // determine bonus
        if ( i > 0 && Box[i] == Box[i-1] ) {
            bonus += bonus_increment;
        } else {
            bonus = 0;
        }
        // accumulate score
        if (Box[i] == 'A') {
            TotalScore += score_A + bonus;
        } else if (Box[i] == 'B') {
            TotalScore += score_B + bonus;
        }
    }
    std::cout << TotalScore;
}
#include <iostream>

int main()
{
  int currentEScore = 0;
  int TotalScore = 0;
  char Box[] = {'A','A','A','B','A','X','M'};
  // A B A R A R A A

  for (int i = 0; i < Box[i]; i++) {
    if (Box[i] == 'A') {                
      if (Box[i - 1] == Box[i]) {
        currentEScore += 10;
      }
      else {
        currentEScore = 10;
      }
    }
    else if (Box[i] == 'B') {
      if (Box[i - 1] == Box[i]) {
        currentEScore += 10;
      }
      else {
        currentEScore = 20;
      }
    }
    else {
      currentEScore = 0;
    }
    TotalScore = TotalScore + currentEScore;
  }

  std::cout << TotalScore;
}