卡在 cs50 pset3 频率
Stuck in cs50 pset3 frequency
我已经完成了持续时间和 is_rest,但似乎无法理解我的频率代码有什么问题。
我基本上完成了三个步骤; 1) 由strlen决定区分意外事件和正常事件。 2) 确定钢琴键(第一个字母)。 3)然后确定八度音阶并跟进。我对一个八度的所有 7 个字母重复了一遍。
现在,当我 运行 程序时,无论是意外还是正常,我都会得到相同的答案,即对于 A4 和 A6,它 returns 相同的值 -2147483648。
我花了很多时间来解决它,但无济于事。谁能检查一下我的代码并告诉我哪里出了问题。
int frequency(string note)
{
int a, b, c, d, e, f, g, n, o, p, q, r;
double freq = 440;
// TODO
//if note is XY
if (strlen (note) == 2)
{
if (note[0] == 'A')
{
a = note[1];
if (a < 4)
{
return round ( freq / pow(2,(4 - a)));
}
if (a > 4)
{
return round ( freq * pow(2, (a - 4)));
}
else if (a == 4)
{
return 440;
}
}
问题从这里开始 a = note[1];
。请记住,note[1]
是八度音阶的 ascii 表示。回想一下 pset2 如何将一个字母 "convert" 变成 "alphabetic index"。这是类似的。 (ascii table供参考)
“4”在 ascii 中是 52。所以这个 pow(2, (a - 4));
计算了一个非常非常非常大的数字,有效地 "blows precision"(因为函数 returns 是一个 int)。
这可能不是函数中的唯一问题,但更正它会让事情顺利进行。可能是时候熟悉并熟悉 debug50 了。
我已经完成了持续时间和 is_rest,但似乎无法理解我的频率代码有什么问题。 我基本上完成了三个步骤; 1) 由strlen决定区分意外事件和正常事件。 2) 确定钢琴键(第一个字母)。 3)然后确定八度音阶并跟进。我对一个八度的所有 7 个字母重复了一遍。 现在,当我 运行 程序时,无论是意外还是正常,我都会得到相同的答案,即对于 A4 和 A6,它 returns 相同的值 -2147483648。 我花了很多时间来解决它,但无济于事。谁能检查一下我的代码并告诉我哪里出了问题。
int frequency(string note)
{
int a, b, c, d, e, f, g, n, o, p, q, r;
double freq = 440;
// TODO
//if note is XY
if (strlen (note) == 2)
{
if (note[0] == 'A')
{
a = note[1];
if (a < 4)
{
return round ( freq / pow(2,(4 - a)));
}
if (a > 4)
{
return round ( freq * pow(2, (a - 4)));
}
else if (a == 4)
{
return 440;
}
}
问题从这里开始 a = note[1];
。请记住,note[1]
是八度音阶的 ascii 表示。回想一下 pset2 如何将一个字母 "convert" 变成 "alphabetic index"。这是类似的。 (ascii table供参考)
“4”在 ascii 中是 52。所以这个 pow(2, (a - 4));
计算了一个非常非常非常大的数字,有效地 "blows precision"(因为函数 returns 是一个 int)。
这可能不是函数中的唯一问题,但更正它会让事情顺利进行。可能是时候熟悉并熟悉 debug50 了。