我正在尝试理解为什么我对此Pset的频率部分的最终计算没有正确计算。我正在检查调试器,它显示“步骤”计数正确,但计算不起作用。
#include <cs50.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
string note = get_string("note:");
{
if (strlen(note) == 2)
{
int key = note[0];
int octave = atoi(¬e[1]);
int steps = 0;
if(key == 'A')
{
steps = (key - 65) + ((octave - 4) * 12);
}
float frequencyf = (440 * (pow(2, (steps / 12))));
int frequency = (round(frequencyf));
printf("%i", frequency);
}
else if (strlen(note) == 3)
{
int key = note[0];
int accidental = note[1];
int octave = atoi(¬e[2]);
int steps = 0;
if(accidental == '#')
{
if(key == 'A')
{
steps = ((key - 65) + ((octave - 4) * 12) + 1);
}
}
else if(accidental == 'b')
{
if(key == 'A')
{
steps = ((key - 65) + ((octave - 4) * 12) - 1);
}
}
float frequencyf = (440 * (pow(2, (steps / 12))));
int frequency = (round(frequencyf));
printf("%i", frequency);
}
}
}发布于 2018-09-27 08:29:15
在这个问题中,A4的标准音调是440 Hz。由于我们从ASCII键开始,我们创建了一个半音数组,并从A4中找到音调值:
A B C D E F G
0 2 -9 -7 -5 -4 -2
int semitones[] = {0, 2, -9, -7, -5, -4, -2};
float tone = semitones[note[0] - 'A'];意外音符#或b将音符升高或降低一个半音。但我们不确定八度在音符中的位置,我们还需要找出它与第四个八度的区别。有不同的场景,所以switch语句可以很好地工作:
int octave;
switch(note[1])
{
case '#':
tone++;
octave = note[2];
break;
case 'b':
tone--;
octave = note[2];
break;
default:
octave = note[1];
break;
}
octave -= '4';一个倍频程的频率是2的倍数,A3是220 Hz,而A5是880 Hz。所以
if (octave > 0)
hz *= octave * 2;
else if (octave < 0)
hz /= abs(octave * 2);最后,音符的频率是2^(n/12),其中n是来自A4的半音的数量:
if (tone < 0)
{
tone *= -1;
hz /= pow(2, tone / 12);
}
else if (tone > 0)
hz *= pow(2, tone / 12);https://stackoverflow.com/questions/52501881
复制相似问题