卡在 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 了。