Ir ao conteúdo
  • Cadastre-se

C exercicio de programacao em C


HeisenbergII
Ir à solução Resolvido por arfneto,

Posts recomendados

Faça um programa que leia um número inteiro N maior ou igual a um (o programa deverá pedir um novo número caso o usuário digite um número menor ou igual a zero). Quando o usuário digitar um número válido, o programa deve calcular e imprimir N+1 aproximações do número pi utilizando a fórmula abaixo (calculada para K começando em 1 e pulando de 10 em 10, isto é, K = 1, 11, 21, 31, ...10*N+1).

Observações:

Neste exercício, deve-se usar o comando "for".

  • Triste 1
Link para o comentário
Compartilhar em outros sites

1 minuto atrás, HeisenbergII disse:

bom, eu preciso criar um laco com o comando for, porém é o usuario que informa o numero N de vezes em que o laco deve se repetir, n consigo vizualizar uma forma de informar a parada do laco depois das N repeticoes

 

 

Trata-se do segundo dos 3 parâmetros do for, o teste de saída...

 

	for( int x = 0, x <= N; x = x + 1)
    {
        // calcula f(K) para K = (x + 1) * 10
    };	// for()

 

De 0 a N são N+1 valores, cada um vale K = (x+1)*10, se eu li direito

Link para o comentário
Compartilhar em outros sites

36 minutos atrás, HeisenbergII disse:

ok, acho que entendi, mas ai meu proximo for seria para realizar o calculo da aproximacao de pi que nao inclui na questao quando mandei mas é sqrt(6/k*k), certo?

 

nos parametros do for novamente n consigo enxergar o que devo usar :(

 

Não existe "um próximo for" 

 

deve usar como eu mostrei:
 

1 hora atrás, arfneto disse:

// calcula f(K) para K = (x + 1) * 10

 

K = (x + 1) * 10

 

que é o que está no enunciado...

Link para o comentário
Compartilhar em outros sites

26 minutos atrás, HeisenbergII disse:

sim entendi que para aquela parte é isso mesmo que me disse, porém esse é o inicio do problema, esqueci de anexar aqui a parte principal da questao, perdao.

meu programa precisa ficar nesse formato, somando as N vezes o (K*10)+1 como no exemplo do programa abaixo

 

Eu entendi. A fórmula não faz diferença. Basta o loop como eu te mostrei

Esse não é o início do problema: é o problema todo

53 minutos atrás, arfneto disse:

deve usar como eu mostrei:
 

1 hora atrás, arfneto disse:

// calcula f(K) para K = (x + 1) * 10

 

K = (x + 1) * 10

 

Claro que eu escrevi errado na pressa :( e deve usar
 


K = 1 + 10 * x

 

E dentro do loop você soma a série com o número certo de termos

Link para o comentário
Compartilhar em outros sites

@Midori, minha ideia estava sendo usar dois loops porém n sei se estou escrevendo-os certo

atualmente o codigo está assim, e nao está funcionando, consegue apontar meu erro?  

 

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

int main(){
    float p,soma;
    int i,n,k;

    do {printf("defina o valor de n: ");
    scanf("%d", &n);}
    while (n<=0);

    for (i=1; i<=n*10+1; i=i+10){
    for (k=1; k<=i; soma=6/(k*k)){
        soma=sqrt(soma);}
    printf("\no valor de pi eh: %f",soma);
    }

return 0;}

Link para o comentário
Compartilhar em outros sites

@Midori FUNCIONOU!!!!!!

O único detalhe é que os parametros de K estão iniciando em 2, sei que é um detalhe minimo, pois as aproximacoes dao praticamente a mesma coisa, porém sabe me dizer se de alguma forma tenho como ajustar isso?

Tentei mudar o valor inicial do primeiro loop para i=0 porém minha primeira aproximacao para pi resultou em 0

 

Caso nao tenha como TUDO BEM sua ajuda ja foi excelente, muitíssimo obrigado ❤️

Link para o comentário
Compartilhar em outros sites

  • Solução

Se não vai usar uma função para calcular a soma --- clássico :) --- pode ser mais compacto escrever como a fórmula simplesmente:
 

include    <math.h>
#include    <stdio.h>
#include    <stdlib.h>

int main(int argc, char** argv)
{
    int N = 9;
    if ( argc > 1 )
    {   N = atoi(argv[1]);
        if ( N < 1 ) N = 9;
    }
    printf( "Definido o valor de N: %d\n", N );
    for( int x = 0, K = 1; x<=N; x = x + 1, K = K + 10)
    {   double PI = 0.;
        for ( int i = 1; i<=K; i+=1 )  PI += ( 6. / (double)(i * i) );
        printf( "Para K = %3d temos pi ~= %18.15f\n", K, sqrt(PI) );
    };
};

 

Note que nessa versão se você digitar simplesmente o nome do programa ele assume nove para ficar igualzinho ao seu exemplo, mas pode digitar o valor que preferir, direto na linha de comando.

 

EXEMPLOS usando o programa como acima
 

PS C:\src\CPP\flt> 
PS C:\src\CPP\flt> gcc -o tst -Wall -std=c17 pi.c
PS C:\src\CPP\flt> 
PS C:\src\CPP\flt> ./tst 1
Definido o valor de N: 1
Para K =   1 temos pi ~=  2.449489742783178
Para K =  11 temos pi ~=  3.057481506707563
PS C:\src\CPP\flt> 

 

tst 1 roda duas vezes, como previsto

 

PS C:\src\CPP\flt> ./tst
Definido o valor de N: 9
Para K =   1 temos pi ~=  2.449489742783178
Para K =  11 temos pi ~=  3.057481506707563
Para K =  21 temos pi ~=  3.096866949943929
Para K =  31 temos pi ~=  3.111132302228169
Para K =  41 temos pi ~=  3.118498530066566
Para K =  51 temos pi ~=  3.122995870443019
Para K =  61 temos pi ~=  3.126027123173503
Para K =  71 temos pi ~=  3.128208702272254
Para K =  81 temos pi ~=  3.129853941123618
Para K =  91 temos pi ~=  3.131138975398556
PS C:\src\CPP\flt> 

 

Sem parâmetros assume 9 para ficar igual ao exemplo

 


PS C:\src\CPP\flt> ./tst 5000 
...
...
Para K = 49971 temos pi ~=  3.141570286351500
Para K = 49981 temos pi ~=  3.141570281038376
Para K = 49991 temos pi ~=  3.141570275722297
Para K = 50001 temos pi ~=  3.141570270403256
PS C:\src\CPP\flt> 

 

Para 5000 escreve um monte mas termina mais perto de PI. O valor para 15 dígitos é  com 3.141592653589793 e essa série converge bem devagar

 

Se quiser ir um pouco mais longe com a série use double para o cálculo do quadrado de i e veja até onde 6/(i*i) é um valor válido...

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Mudando 4 linhas no programa de teste dá pra ir mais longe com a série, trocando int por unsigned long long int e usando um typedef para não ter que escrever tanto ;) 


 

#include    <math.h>
#include    <stdio.h>
#include    <stdlib.h>

typedef unsigned long long int Ullint;
int main(int argc, char** argv)
{
    int N = 9;
    if ( argc > 1 )
    {   N = atoi(argv[1]);
        if ( N < 1 ) N = 9;
    }
    printf( "Definido o valor de N: %d\n", N );
    for( Ullint x = 0, K = 1; x<=N; x = x + 1, K = K + 10)
    {   double PI = 0.;
        for ( Ullint i = 1; i<=K; i+=1 )  PI += ( 6. / (double)(i * i) );
        printf( "Para K = %3llu temos pi ~= %18.15f\n", K, sqrt(PI) );
    };
};

 

PS C:\src\CPP\flt> ./tst 10000

// ..

Para K = 99971 temos pi ~=  3.141583101556356
Para K = 99981 temos pi ~=  3.141583102511738
Para K = 99991 temos pi ~=  3.141583103466929
Para K = 100001 temos pi ~=  3.141583104421928

 

Tentou o método de Monte Carlo? Acho que converge mais rápido.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!