我试图检查字符串是否有一个基于给定测试用例的字母。但是,字母a有例外情况,每一个字母都将被计算为值的一半。例如,字母a值300,但我们想除以2,而每个字母将值150分。
UnitTest:
[TestCase("software", 'w', 250, 250)]
[TestCase("craftmanship", 'a', 300, 300)]
public void WheelofFortune(string secretWord, char letterGuess, int pointValue, int expected)
{
var actual = warmups.WheelofFortune(secretWord, letterGuess, pointValue);
Assert.AreEqual(expected, actual);
}单元:
//Given a target word, a letter guess by a customer, and a point value.
//Return the number of points earned.
public int WheelofFortune(string secretWord, char letterGuess, int pointValue)
{
int sum = 0;
int pointValue2 = (pointValue / 2);
for (int i = 0; i < secretWord.Length; i++)
{
if (secretWord[i] == letterGuess)
sum += pointValue;
if (secretWord[i] == letterGuess && letterGuess == 'a')
sum += pointValue2;
if (secretWord[i] == secretWord.Length - 1)
return sum;
}
return sum;
}问题在于工艺:信息:预期: 300,但曾经: 900。
为什么我得到的是900而不是300?
发布于 2019-06-07 01:33:35
这是因为您的逻辑在简单调试时是不正确的,它建议,当您找到字母a时,这两个逻辑都会执行,因此,而不是每次迭代150,您的值将变为450,因此450*2 = 900。
if (secretWord[i] == letterGuess)
sum += pointValue;
if (secretWord[i] == letterGuess && letterGuess == 'a')
sum += pointValue2;使用开关的修复1:
public int WheelofFortune(string secretWord, char letterGuess, int pointValue)
{
int sum = 0;
for (int i = 0; i < secretWord.Length; i++)
{
switch(secretWord[i])
{
case 'a':
sum += pointValue/2;
break;
default:
if (secretWord[i] == letterGuess)
sum += pointValue;
break;
}
}
return sum;
}Fix 2:一个更好的设计,使用字典(只需在字典中添加另一个键,它将根据新的逻辑自动计算)
public static Dictionary<char,double> sampleData = new Dictionary<char, double>
{
['a'] = 0.5
};
public int WheelofFortune(string secretWord, char letterGuess, int pointValue)
{
int sum = 0;
for (int i = 0; i < secretWord.Length; i++)
if(sampleData.ContainsKey(secretWord[i]))
sum += (int)(pointValue * sampleData[letterGuess]);
return sum;
}发布于 2019-06-07 02:04:32
本和先生已经给你展示了代码中的直接问题。我将更多地关注代码的结构。
从你的问题听起来你想要这样的东西:
给定一个单词、一个猜测字符和一个分数,将分数乘以匹配字符的数目。如果猜到的字符是
'a',那么它的分数是一半。
在这种情况下,代码可以大大简化为:
public int WheelofFortune(string secretWord, char letterGuess, int pointValue)
{
int count = secretWord.Count(letter => letter == letterGuess);
int sum = pointValue * count;
if (letterGuess == 'a')
sum /= 2;
return sum;
}这会给出您正在测试的值,抽象出循环,并读取更多类似于描述的内容。它还简化了逻辑,使您不太可能错过类似的双重匹配。
不确定为什么您的代码包含一个测试,测试的字符是否等于字符串长度小于1,因为这似乎与问题无关。如果需要的话很乐意纠正。
发布于 2019-06-07 01:33:46
您要同时执行两个if子句,所以:
if (secretWord[i] == letterGuess)
sum += pointValue;您需要匹配两次a,以便将2x300 = 600相加到总和中。然后
if (secretWord[i] == letterGuess && letterGuess == 'a')
sum += pointValue2;这也是匹配的,所以将2*150 = 300相加到总和中。600 + 300 = 900
您需要使用if else或case语句。所以,就像:
for (int i = 0; i < secretWord.Length; i++)
{
if (secretWord[i] == letterGuess && letterGuess == 'a')
{
sum += pointValue2;
}
else if (secretWord[i] == letterGuess)
{
sum += pointValue;
}
//if (secretWord[i] == secretWord.Length - 1)
//{
// return sum;
//}
}这样,一旦满足了一个if子句,它就会忽略其余的子句。
https://stackoverflow.com/questions/56486892
复制相似问题