Застрял в частоте cs50 pset3 - PullRequest
       6

Застрял в частоте cs50 pset3

0 голосов
/ 25 сентября 2018

Я закончил с длительностью и 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 голосов
/ 08 января 2019

Проблема начинается здесь a = note[1];.Помните, note[1] - это представление ascii октавы.Вспомните из pset2, как «преобразовать» букву в ее «алфавитный указатель».Это аналогично.( таблица ascii для справки)

«4» в ascii равно 52. Так что pow(2, (a - 4)); вычисляет действительно, действительно, действительно большое число, которое эффективно «увеличивает точность» (поскольку функциявозвращает int).

Возможно, это не единственная проблема в функции, но ее исправление заставит все двигаться вперед.Возможно, настало время познакомиться с debug50 и почувствовать себя комфортно.

...