Я создал алгоритм, который возвращает квадратный корень. Почему это не работает?

#c #square-root

Вопрос:

Мой код для работы. Я создал алгоритм, который берет число, обнаруживает основание и крышу квадратного корня из этого числа( например, если я хочу найти квадратный корень из 5, то база будет равна 2, а крыша-5. Это означает, что квадратный корень из 5 находится между этими числами. Но мой код переходит в цикл, когда я ввожу числа, такие как 5 или 5. Почему?

     int raiz_inteira(int valor)
    {
    int impar = 1, cont = 0;
    while(valor >= impar)
    {
       valor = valor - impar;
       cont   ;
       impar =2;
    }
    return cont;
    }


float raiz_exata(float valor, int base, int teto)
{
    float media = (base teto)/2.0;
    float erro = media*media-valor;
    printf("%fn",media);
    if(erro < 0)
    {
        erro *=-1;
    }
    else if(erro == 0)
    {
        return media;
    }
   
    while(erro >0.1)
    {
        printf("%f",media);
        if(media*media >valor)
        {
            teto = media;
        }
        else
        {
            base = media;
        }
        media = (base teto)/2.0;
        erro = media*media-valor;
        if(erro < 0)
        {
            erro *=-1;
        }
    }
}

void main()
{
    int teto, base, raiz;
    printf("Type a number:n");
    scanf("%d",amp;raiz);
    base = raiz_inteira(raiz);
    teto = base 1;
    raiz_exata(raiz,base,teto);
}

 

Комментарии:

1. Следуйте логике. Что происходит в вашей программе, когда вы вводите 5?

2. Было бы проще, если бы вы перевели код на английский. Я понятия не имею, что должны означать raiz_exata, teto или медиа.

3. «когда я ввожу цифры, такие как 5 или 5» — В чем разница между 5 и 5?

4. @klutt, вероятно, teto -это верхняя или верхняя граница, база -минимальная граница, а среда -среднее или среднее значение.

Ответ №1:

Ваш код, очищенный для более легкого чтения:

 #include <stdio.h>

int raiz_inteira(int valor) {
    int impar = 1, cont = 0;

    while (valor >= impar) {
        valor -= impar;
        cont  ;
        impar  = 2;
    }

    return cont;
}

float raiz_exata(float valor, int base, int teto) {
    float media = (base   teto) / 2.0;
    float erro = media * media - valor;

    printf("%fn", media);

    if (erro < 0) {
        erro *= -1;
    }
    else if (erro == 0) {
        return media;
    }

    while (erro > 0.1) {
        printf("%f", media);

        if (media * media > valor) {
            teto = media;
        }
        else {
            base = media;
        }

        media = (base   teto) / 2.0;
        erro = media * media - valor;

        if (erro < 0) {
            erro *= -1;
        }
    }
}

void main() {
    int teto, base, raiz;
    printf("Type a number:n");
    scanf("%d", amp;raiz);
    base = raiz_inteira(raiz);

    // printf("base: %dn", base);

    teto = base   1;

    // printf("teto: %dn", teto);

    raiz_exata(raiz, base, teto);
}
 

Теперь давайте запустим это, введя 5.

Когда мы начинаем, raiz это 5, base это raiz_inteira(5) то , что соответствует 2 и teto есть 3 .

Итак, мы входим raize_exata с raiz_exata(5.0, 2, 3) .

Внутри этой функции есть, media есть 2.5 то , erro 2.5 * 2.5 - 5.0 что равно 1.25 . Имейте в виду, что поплавки не всегда являются точными значениями.

2.5 Значение выводится на печать.

1.25 не меньше 0 и не равно 0 , поэтому условные обозначения пропускаются.

Войдя в цикл while, мы снова печатаем 2.5 . Потому 2.5 * 2.5 что больше , чем 5.0 teto установлено 2 , потому teto что является int .

Затем мы обновляем media , чтобы снова быть base teto / 2.0 тем, что есть 2.5 , так что это не изменилось. Потому что там нет никаких изменений, error ничего не изменилось. Поскольку это не меньше 0 , условное условие пропускается.

При следующем обходе цикла while ничего не изменилось, поэтому он повторяется вечно.

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

Этот вывод, по-видимому, происходит для любого числа, большего, чем 2 . Возможно, вам захочется изучить, как переходы от int к поплавкам влияют на вашу математику.

Комментарии:

1. Спасибо. Проблема заключалась в том, что я использовал int вместо float. Когда я это изменил, это сработало. Тето и основание-это крыша и пол моего квадратного корня. Я из Бразилии, поэтому некоторые части моего кода были на португальском языке, и я забыл изменить. Спасибо.