Principiante em C

Ola galera, por favor me ajudem nessa questão:

Saiba que o valor aproximado da raiz quadrada de um número real N qualquer pode ser calculado tão precisamente quanto se queira conforme segue:
R0 = N; R1 = (R0 + N / R0) / 2; R2 = (R1 + N / R1) / 2; R3 = (R2 + N / R2) / 2; …
Em outras palavras, o primeiro termo da seqüência vale N; todos os demais termos podem ser obtidos pela soma do termo anterior da seqüência com N dividido pelo termo anterior da seqüência.
Faça um programa em C que solicita a digitação de um número real, calcula pelo método acima exposto sua raiz quadrada, escrevendo-a na tela.
Naturalmente não poderemos calcular todos os infinitos termos da série acima. Seu programa deverá limitar-se aos 1000 primeiro termos. :P :|

Obrigado gente.
 
Aqui ninguém faz código para outras pessoas. Se quiseres tentar fazer, estamos aqui para ajudar, se não queres fazer nem vale a pena vires aqui pedir código porque ninguém te vai dar. Já te dei uma ajuda ao dar o link com a lógica bem explicada. Isso é um programa bem simples.
 
Como eu disse sou principiante e estou disposto a aprender, olha o que eu tentei fazer e não rodou.

int main()
{
float R, N;

printf("Por favor digite um numero real: ");
fflush(stdout);

scanf("%f", &N);
fflush(stdin);

R = N;
for (i=0; i<1000, R>0; i++)

R = (R + N/R) / 2;
printf("\nRaiz de %f = %f", N, R);
fflush(stdout);

return 0;
}
 
Esse programa está quase quase a funcionar. Só duas coisas.

1 - Não declaraste a variável i

2 - No for, na condição de paragem basta i<1000

Como o que fizeste está quase correcto deixo aqui um feito por mim

Código:
[COLOR=#7f4726]#include [COLOR=#e20300]<stdio.h>[/COLOR][/COLOR]


[COLOR=#7f4726]#define LIMITE [COLOR=#3d00db]1001[/COLOR][/COLOR]


[COLOR=#cc00a2]float[/COLOR] raiz([COLOR=#cc00a2]int[/COLOR] numero){
    
    [COLOR=#cc00a2]int[/COLOR] indice = [COLOR=#3d00db]0[/COLOR];
    [COLOR=#cc00a2]float[/COLOR] aux[LIMITE];
        
    aux[indice]=numero;
    printf([COLOR=#e20300]"R0=%d\n"[/COLOR], numero);
    [COLOR=#cc00a2]for[/COLOR](indice = [COLOR=#3d00db]1[/COLOR]; indice < LIMITE; indice++){
        aux[indice]=((aux[indice-[COLOR=#3d00db]1[/COLOR]]+(numero/aux[indice-[COLOR=#3d00db]1[/COLOR]]))/[COLOR=#3d00db]2[/COLOR]);
        printf([COLOR=#e20300]"R%d=%f\n"[/COLOR],indice, aux[indice]);
    }
    
    [COLOR=#cc00a2]return[/COLOR] aux[indice-[COLOR=#3d00db]1[/COLOR]];


}


[COLOR=#cc00a2]int[/COLOR] main(){
    
    [COLOR=#cc00a2]int[/COLOR] numero;
    [COLOR=#cc00a2]float[/COLOR] calculado;
    
[COLOR=#e20300][COLOR=#000000]    printf([/COLOR]"Introduza o número para calcular a raiz quadrada\n"[COLOR=#000000]);[/COLOR][/COLOR]
    scanf([COLOR=#e20300]"%d"[/COLOR], &numero);
    
    calculado=raiz(numero);
    
    printf([COLOR=#e20300]"A raiz quadrada de %d é %f\n"[/COLOR], numero, calculado);
    
    [COLOR=#cc00a2]return[/COLOR] [COLOR=#3d00db]0[/COLOR];
}

Como é óbvio há aí coisas que podem ser comentadas/apagadas, nomeadamente o facto de estar a imprimir todos os R para confirmar os valores
 
Última edição:
Claro que sim. Fazer com while ou for é a mesma coisa.

Código:
//while

int i;
i=0;
while(i<1001){
//código
i++;
}

//for
int i;
for(i=0; i<1001; i++){
//codigo
}

no for tens a inicialização da variável, a condição da variável e o incremento/decremento

no while só tens a condição de paragem, como tal, dentro do while tens de incrementar/decrementar a variável e antes do while tens de inicializar a variável
 
acho que com while fica mais enxutão não fica não?

O que você fez achei meio grande , acho que dá pra simplificar. tornar mais fácil entendimento não dá.

Obrigado por tudo.
 
O que eu fiz está grande porque está a imprimir o valor de R em todos os passos, no entanto isso para o resultado final não interessa portanto pode-se comentar/apagar. Apenas pus para conferir os resultados que estavam a ser calculados em cada passo.

Podes usar o teu, corrigindo os 2 erros que te apontei fica correcto, além de que está mais compacto. Mas convém começar a aprender a não fazer tudo na main e a ter uma função para cada coisa.

De nada, alguma dúvida já sabes ;)
 
Boas,
uma vez que és principiante em C um conceito fácil de explicar, mas não tão fácil de implementar, é o conceito de recursividade. Fica aqui a função raiz() para pensares e entenderes:

#include <stdio.h>


float raiz(float Numero, float Raiz, int precisao){

if (precisao>0)
Raiz=(Raiz+Numero/Raiz)/2;
if (precisao==0)
return Raiz;
return (raiz(Numero,Raiz,precisao-1));
}


main(){
float N;
scanf("%f",&N);
printf("Araiz quadrada de %.2f é %.2f.\n",N,raiz(N,N,1000));
}

Cumps,
 
Exatamente o que você fez, uma função, você colocou o int mail no final justamente para rodar essa função.
Estou começando agora a ver subprogramas.
 
Tu nem sequer declaraste a variável i. Sabes como funciona um for e que parâmetros tem um for?

o i=0 antes do while serve precisamente para fazer o mesmo que o i=0 que puseste dentro do for
 
Entendi.
Eu estou bem no começo e não entendo muito de termos técnicos, aos poucos vou me familiarizando com esses termos e o ambiente.
É o que eu disse, os códigos acima são de subprogramas, funções, isso aí eu ja não sei.
Pena que o meu não roda...:(
 
Back
Topo