контроль может достигать конца не пустой функции. частота - PullRequest
0 голосов
/ 01 мая 2018

Я не знаю, почему эта программа не скомпилируется. Это говорит мне, что есть проблема, но я просто не знаю, что не так с этим кодом.

Я прохожу вводный курс CS50 для Гарварда онлайн, и у меня возникают проблемы с записью этой частоты функций. Я знаю, что это можно запрограммировать гораздо проще, но у меня просто нет опыта, чтобы сделать это намного более плавным и элегантным в программировании. Проблема, похоже, в самом конце функции. Я предполагаю, что забыл вернуть значение, но я не знаю, что происходит.

//Calculates frequency (in Hz) of a note

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

int frequency(string note);

int main(void)
{
string note = get_string();
printf("Piano Note: ");
frequency(note);
return 0;
}

int frequency(string note)
{
char key = note[0];
char accidental;
int octave;

int counter = 0;

while (note != '\0')
{
    counter++;
}

if(counter == 3)
    accidental = note[1];
    octave = note[2];
if(counter == 2)
    octave = note[1];

if (counter == 3)
{
    if (key == 'A')
    {
        if (accidental == '#')
        {
                if(octave == 4)
                {
                    return 466;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 * pow((double)2, (double)1/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 * pow((double)2, (double)1/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }
        }

        else if (accidental == 'b')
        {
            if(octave == 4)
                {
                    return 415;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)1/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)1/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }
        }
    }

    else if (key == 'B')
    {
        if (accidental == '#')
        {
            if(octave == 4)
                {
                    return 523;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 * pow((double)2, (double)3/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 * pow((double)2, (double)3/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
        }

        else if (accidental == 'b')
        {
            if(octave == 4)
                {
                    return 466;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 * pow((double)2, (double)1/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 * pow((double)2, (double)1/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
        }
    }

    else if (key == 'C')
    {
        if (accidental == '#')
        {
             if(octave == 4)
                {
                    return 277;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)8/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if (octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)8/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }

        else if (accidental == 'b')
        {
             if(octave == 4)
                {
                    return 247;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)10/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if (octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)10/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }
    }

    else if (key == 'D')
    {
        if (accidental == '#')
        {
            if(octave == 4)
                {
                    return 311;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)6/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)6/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }

        else if (accidental == 'b')
        {
            if(octave == 4)
                {
                    return 277;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)8/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)8/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }
    }

    else if (key == 'E')
    {
        if (accidental == '#')
        {
            if(octave == 4)
                {
                    return 349;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)4/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)4/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }

        else if (accidental == 'b')
        {
            if(octave == 4)
                {
                    return 311;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)6/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)6/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }
    }

    else if (key == 'F')
    {
        if (accidental == '#')
        {
             if(octave == 4)
                {
                    return 370;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)3/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)3/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }}

        else if (accidental == 'b')
        {
             if(octave == 4)
                {
                    return 330;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)5/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)5/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }
    }

    else if (key == 'G')
    {
        if (accidental == '#')
        {
             if(octave == 4)
                {
                    return 415;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)1/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)1/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }

        else if (accidental == 'b')
        {
             if(octave == 4)
                {
                    return 370;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)3/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)3/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
        }
    }
}

    if (counter == 2)
    {
            if(key == 'A')
            {

                if(octave == 4)
                {
                    return 440;
                }

                else if(octave < 4)
                {
                    int count = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int divisor = 0, hertz = 440;
                    while(divisor != count)
                    {
                        hertz /= 2;
                        divisor++;
                    }
                    return hertz;
                }

                else if(octave > 4)
                {
                    int count = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int divisor = 0, hertz = 440;
                    while(divisor != count)
                    {
                        hertz *= 2;
                        divisor++;
                    }
                    return hertz;
                }
            }

            else if(key == 'B')
            {

                if(octave == 4)
                {
                    return 494;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 * pow((double)2, (double)2/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 * pow((double)2, (double)2/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }
            }


            else if(key == 'C')
            {
                if(octave == 4)
                {
                    return 262;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)9/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if (octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)9/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }
            }

            else if(key == 'D')
            {
                if(octave == 4)
                {
                    return 294;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)7/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)7/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }
            }

            else if(key == 'E')
            {
                if(octave == 4)
                {
                    return 330;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)5/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)5/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }
            }

            else if(key == 'F')
            {
                if(octave == 4)
                {
                    return 349;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)3/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)3/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }
            }

            else if(key == 'G')
            {
                if(octave == 4)
                {
                    return 392;
                }

                else if(octave > 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i < octave; i++)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)2/12));
                    while(shade != count)
                    {
                        answer *= 2;
                        shade++;
                    }
                    return answer;
                }

                else if(octave < 4)
                {
                    int count = 0, shade = 0;
                    for(int i = 4; i > octave; i--)
                    {
                        count++;
                    }
                    int answer = (440 / pow((double)2, (double)2/12));
                    while(shade != count)
                    {
                        answer /= 2;
                        shade++;
                    }
                    return answer;
                }

            }
    }
}}}}}}}}}}}}

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вам нужно fflush(stdout); после printf("Piano Note: "); в основная функция. stdout может быть буферизованной строкой и без трейлинга символ новой строки, выходные данные не могут быть отправлены туда, где находится стандартный вывод собирается, вероятно, ваш экран.

Что еще более важно, следующий цикл никогда не прекратится (при условии, это примечание! = '\ 0',

while (note != '\0')
{
    counter++;
}

если note! = 0, цикл будет введен, но внутри цикла ничего нет обновляет примечание, поэтому условие все равно будет выполнено, и цикл будет переоформить.

Я нигде не вижу определения «строки». Если это typedef для 'char *' это ужасная идея, скрывая указатель приведет к путанице. Если это что-то еще, то трудно скажи, какое поведение должно быть. Вы сравниваете это с символом, подразумевая эта строка является typedef для char, но это не очень полезно, если вы пытаетесь получить строку.

Так что вы должны потерять typedef, а get_string () должна вернуть символ *, а не «строка». Я подозреваю, что цикл while пытается вычислить длину строки. Для этого используйте strlen (3).

Я их не считал, но, похоже, у вас слишком много тесных скобок в конце. Конечно, не совпадают с тем, что облегчить визуальную проверку.

0 голосов
/ 01 мая 2018

Хотя этот код выглядит довольно плохо для чтения, ошибка компиляции говорит о том, что у вашей функции есть ветвь, которая достигнет конца функции без оператора return. Если кажется, что это работает, добавьте возвращаемое значение по умолчанию в функцию, скажем, int retVal = 0; затем прямо перед завершением вашей функции вставьте строку return retVal;

Я не прочитал весь пример исходного кода. У вас может быть if / elseif / elseif / etc без регистра else, который также должен возвращать значение по умолчанию, которое могло бы привести к этой ошибке типа компиляции.

Если вы не хотите возвращать значение по умолчанию, верните код ошибки и попросите вызывающего проверить его, чтобы убедиться, что он делает то, что, по вашему мнению, делает.

edit, если, например, counter == 1, ваша функция ничего не вернет. Это один из примеров того, что компилятор пытается вам рассказать, и, возможно, есть еще.

...