卡在CS50 PSET3频率中

时间:2018-09-25 12:51:42

标签: cs50

我已经忍受了持续时间和is_rest,但似乎无法理解我的频率代码出了什么问题。 我基本上已经完成了三个步骤; 1)确定由strlen区分偶然性和正常性。 2)确定钢琴键(首字母)。 3)然后确定八度,然后继续。我将所有7个字母重复八度。 现在,当我运行该程序时,无论是偶然还是正常,我都会得到相同的答案,即 A4和A6会返回相同的值-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;
       }
   }

1 个答案:

答案 0 :(得分:0)

问题从a = note[1];开始。请记住,note[1]是八度的 ascii表示。回忆一下pset2如何将一个字母“转换”为它的“字母索引”。这是无聊的。 (ascii table供参考)

ascii中的“ 4”为52。因此,此pow(2, (a - 4));计算出一个非常非常大的数字,有效地“降低了精度”(因为该函数返回一个int)。

这可能不是函数中的唯一问题,但是更正它会使事情进展。现在可能是时候熟悉并熟悉debug50了。