cs50 pset3,频率功能不起作用

标签 c cs50

我对 C 语言完全陌生,这门类(class)是我第一次尝试 C。

该问题要求计算并返回音符的频率。频率是根据 A4 中音符的相对位置计算的。 Here是完整的问题。

使用调试器后,我发现 freq 变量的值在 switch 语句内没有更新,我不知道为什么。

#include <math.h>
#include <stdio.h>
#include <cs50.h>

int frequency(string note)
{


    char n = note[0]; //first character is a note 'A, B..'
    float freq = 0.0;

    //second character can be an accidental or an octave
    if (note[1] == '#' || note[1] == 'b')
    {
        int octave = note[2] - '0';
        freq = 440 * powf(2, octave - 4); //frequency of note 'A' taken as base

        switch (n) // changing frequency depending upon the relative position of note from A
        {
            case 'C':
                freq = freq / powf(2, 9/12); //C is 9 semitones away from A
                break;

            case 'D':
                freq = freq / powf(2, 7/12);
                break;

            case 'E':
                freq = freq / powf(2, 5/12);
                break;

            case 'F':
                freq = freq / powf(2, 4/12);
                break;

            case 'G':
                freq = freq / powf(2, 2/12);
                break;

            case 'B':
                freq = freq * powf(2, 4/12);
                break;
        }

        //changing frequency depending upon # of b
        if (note[1] == '#')
        {
            freq = round(freq * powf(2, 1/12));
        }
        else
        {
            freq =  round(freq / powf(2, 1/12));
        }

    }
    else
    {
        int octave = note[1] - '0';
        freq = 440 * powf(2, octave - 4);//frequency of note A taken as base

        switch (n) // changing frequency depending upon the relative position of note from A
        {
            case 'C':
                freq  = round(freq / powf(2, 9/12));
                break;

            case 'D':
                freq  = round(freq / powf(2, 7/12));
                break;

            case 'E':
                freq  = round(freq / powf(2, 5/12));
                break;

            case 'F':
                freq  = round(freq / powf(2, 4/12));
                break;

            case 'G':
                freq  = round(freq / powf(2, 2/12));
                break;

            case 'A':
                freq  = round(freq);
                break;

            case 'B':
                freq  = round(freq * powf(2, 4/12));
                break;
        }
    }

    return freq;

}

int main(void)
{
    printf("%i\n", frequency("C5"));
    printf("%i\n", frequency("C#5"));

}

上述代码的输出

880
880

预期输出

523
554

880是A5的频率。

最佳答案

powf(2, 9/12)

将给出结果 1,因为 9/12使用整数计算。

即:powf(2, 9/12)powf(2, 0) 相同

尝试

powf(2, 9.0/12)

而是强制使用浮点来完成 9 除以 12 的计算。

关于cs50 pset3,频率功能不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50965687/

相关文章:

c - 拼写器适用于某些单词,不适用于其他单词。不知道问题出在哪里

c - 调整大小程序适用于某些人,但不适用于其他人

c 的 sprintf 改变我的计数器

c - 如何修复我的 cs50 pset 1 mario 不太舒服的代码

c - c中是否有一个函数可以返回char数组中char的索引?

c - 在 C 中使用结构时的内存分配

c - 编写一个C程序来交换大小为32字节的内存块的内容

c - C 中的贪心算法不返回任何值?

c - 为什么带有 %.2g 的 printf 在点后不显示两位数?

c++ - 如何在 C/C++ 中填充结构填充?