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。所以别介意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,所以分数是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;i std::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;
}