Ir ao conteúdo

C exercicio de programacao em C


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

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
Postado

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

 

Postado
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

Postado

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 :(

Postado
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...

Postado

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

Captura de Tela 2021-03-09 às 11.23.39.png

Postado
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

Postado

Use dois loops.

 

O externo pode ter incremento de 10 (i += 10) de 1 até i <= N * 10 + 1, e o loop interno só da soma (soma += 6/(k*k)) de 1 até k <= i.

 

A aproximação será sqrt(soma)

  • Amei 1
Postado

@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;}

Postado

@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 ❤️

  • Solução
Postado

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
Postado

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

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!