#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. Когда я это изменил, это сработало. Тето и основание-это крыша и пол моего квадратного корня. Я из Бразилии, поэтому некоторые части моего кода были на португальском языке, и я забыл изменить. Спасибо.