Ir ao conteúdo
  • Cadastre-se

C Função que recebe um inteiro como parâmetro


VIAJC
Ir à solução Resolvido por arfneto,

Posts recomendados

Oi, pessoal. Estou tentando resolver esse problema mas não está claro para mim o que está errado. 

Problema: Faça uma função que receba um inteiro como parâmetro, calcule e retorne o resultado da seguinte série:

 

S= 2/4  +  5/5  +  10/6  +...+ (N^2 +1)/(N+3).

 

O que eu fiz:

 

#include<stdio.h>
  
  float funcaoseq( int N){
  
  float s=0;
  
  for(int i=0;i=N;i++){
    
    s=s+((i*i)+1)/(i+3);
  }
  
  return s;
}

int main(){
  int a;
  float total=0;
  
  printf("Digite um numero: ");
  scanf("%d",&a);
  
  total = funcaoseq(a);
  
  printf("total = %d",total);
  
  return 0;
}

 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
1 hora atrás, JorgeGus disse:

Não testei,

Na próxima teste em

https://www.programiz.com/c-programming/online-compiler/

😁

Testei...

// Online C compiler to run C program online
#include <stdio.h>

float funcaoseq( int N){
  
  float s=0;
  
  for(float i=0;i<=N;i++){
    
    s=s+((i*i)+1)/(i+3);
  }
  
  return s;
}

int main(){
  int a;
  float total=0;
  
  printf("Digite um numero: ");
  scanf("%d",&a);
  
  total = funcaoseq(a);
  
  printf("total = %f",total);
  
  return 0;
}

Coloquei i como float

1 deu 0.83333

2 deu 1.83333

3 deu 3.5

4 deu 5.928572

Era esperado isso mesmo? 🤔🙃

 

 

17 minutos atrás, VIAJC disse:

O resultado esperado para N=1,2,3 estão na pergunta. Acredito que faltou

:thumbsup:ok. de fato não vi e continuo sem saber se o meu resultado era o esperado mas isso, claro, não é importante.🙂

 

7 minutos atrás, JorgeGus disse:

Faltou inicializar o for com 1, para ficar como no exemplo do enunciado.

:thumbsup:ok. se você diz então tá. De fato você enxerga bem melhor que eu 😁

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

10 minutos atrás, .if disse:

Na próxima teste em

https://www.programiz.com/c-programming/online-compiler/

😁

Testei...

// Online C compiler to run C program online
#include <stdio.h>

float funcaoseq( int N){
  
  float s=0;
  
  for(float i=0;i<=N;i++){
    
    s=s+((i*i)+1)/(i+3);
  }
  
  return s;
}

int main(){
  int a;
  float total=0;
  
  printf("Digite um numero: ");
  scanf("%d",&a);
  
  total = funcaoseq(a);
  
  printf("total = %f",total);
  
  return 0;
}

Coloquei i como float

1 deu 0.83333

2 deu 1.83333

3 deu 3.5

4 deu 5.928572

Era esperado isso mesmo? 🤔🙃

Faltou inicializar o for com 1, para ficar como no exemplo do enunciado.

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

  • Solução
  for(int i=0;i=N;i++){
        s=s+((i*i)+1)/(i+3);
  }

 

Esse trecho é problemático. 

 

  • Como colocou errado i=N na condição só vai sair do loop quando N for zero. Use i<=N. Em C 0 é falso. Qualquer outro valor é verdadeiro.
  • o numerador é int e o denominador é int então antes de somar em s a divisão vai ser feita e gerar um valor inteiro. Converta um dos dois para float. Veja o exemplo abaixo.
  • TESTE sempre o retorno de scanf().
  • Como está aprendendo ao menos no início dos testes mostre na tela os valores lidos. É muito melhor saber antes. E na série claro que deve mostrar os valores das parcelas. Se tivesse feito isso desde o início saberia do problema...
  • Não precisa de chaves em comandos de uma linha só. Só fica mais difícil de ler.
  • Se o programa só faz isso e você sabe o que, então passe N na linha de comando.
  • Quando está testando use um loop para mostrar alguns valores. É bem melhor que ficar rodando o programa várias vezes.
  • main() deve ser SEMPRE a primeira função de seu programa. 

Exemplo

 

#include<stdio.h>
  
float soma(int);

int main(void)
{
  for ( int a=0; a<5; a+=1)
  printf("Soma = %.4f\n",soma(a));
  return 0;
}

float soma(int N)
{
    float s=0.f;
    printf("\n==> Calculando a soma para N = %d\n", N);
    for(int i=0;i<=N;i+=1)
    {
      float parcela = (i*i+1) / (float)(i+3);
      printf( "  i = %d, parcela = %.4f\n", i, parcela );
      s += parcela;
    }
    return s;
};

 

Que mostra

 

==> Calculando a soma para N = 0
  i = 0, parcela = 0.3333
Soma = 0.3333

==> Calculando a soma para N = 1
  i = 0, parcela = 0.3333
  i = 1, parcela = 0.5000
Soma = 0.8333

==> Calculando a soma para N = 2
  i = 0, parcela = 0.3333
  i = 1, parcela = 0.5000
  i = 2, parcela = 1.0000
Soma = 1.8333

==> Calculando a soma para N = 3
  i = 0, parcela = 0.3333
  i = 1, parcela = 0.5000
  i = 2, parcela = 1.0000
  i = 3, parcela = 1.6667
Soma = 3.5000

==> Calculando a soma para N = 4
  i = 0, parcela = 0.3333
  i = 1, parcela = 0.5000
  i = 2, parcela = 1.0000
  i = 3, parcela = 1.6667
  i = 4, parcela = 2.4286
Soma = 5.9286

 

E já tira umas dúvidas desde o início. Só DEPOIS você escreve algo como

 

#include<stdio.h>
  
float soma(int);

int main(void)
{
  int a;
  float total=0;
  printf("Digite um numero: ");
  if ( 1 != scanf("%d",&a) ) return -1;  
  printf("Soma = %.4f\n",soma(a));
  return 0;
}

float soma(int N)
{
    float s=0.f;
    for(int i=0; i<=N; s+= (i*i+1) / (float)(i+3), i+=1);
    return s;
};

 

Apagando os printf() e os testes passo a passo...

Programação defensiva. :D 

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

  • Membro VIP
17 horas atrás, arfneto disse:

main() deve ser SEMPRE a primeira função de seu programa

Regra desnecessária mas talvez válida pra trabalho em equipe que segue regra😜. No meu (meu) micromundo eu gosto de deixar por último pra não ter que declarar as d+. Também já optei por colocá-las num #include e também o editor tem opção pra esconder o corpo das funções deixando só seu título ... algo como corta o corpo de deixa a cabeça 🤪

Obs.. opções pessoais mais desnecessárias que a regra 😜

 

 

4 horas atrás, arfneto disse:

o seu micro micro mundo não for bem pequeno, pequeno

sim é pequeno pequeno e pequeno... ainda que prefira usar o termo minimalista. Entre outras coisas, a ideia foi simpatizar e sintonizar com a técnica de escrever mesmo que amadora do autor . Pelo menos eu e ele tmj .. ele talvez por ser inciante e eu...  2old4this .. Mas de toda a forma seu . de vista superior é válido sim amigo 😁

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

@.if 

8 horas atrás, .if disse:

Regra desnecessária mas talvez válida pra trabalho em equipe que segue regra

 

Acho que já sabe que no mundo dos micro controladores nem sempre o programa começa por main(). Mas no geral começa bem aí. Não é uma regra, só é uma maneira que não começar a ler um programa PROCURANDO pela função inicial, seja elea $$init, main(), WinMain ou PGM ;) 

 

Nem todos os programas tem 30 linhas. 

 

E depois de um mês vai gostar de sua equipe, mesmo que seja de 1, ter acesso rápido ao começo das coisas.

 

8 horas atrás, .if disse:

No meu (meu) micromundo eu gosto de deixar por último pra não ter que declarar as d+

 

Se o seu micro micro mundo não for bem pequeno, pequeno a ponto de

  • poder colocar tudo que precisa dentro do MESMO programa fonte.
  • NUNCA precisar de um código já compilável para usar de novo em outro, a popular biblioteca, muito comum em software embarcado
  • NUNCA tiver escrito algo que valha a pena compilar e deixar em um include apenas as declarações e apenas aregar o código compilado na hora do link
  • É muito chato ter que procurar pelas listas de argumentos de cada função, espalhadas no meio do código, ao invés de ter um header no início que mostra todos os parâmetros para todas as funções. E que pode ser destacado e usado em outro arquivo sem ter que ficar editando nada.

Vai entender que

  • declarar as d+ em um cabeçalho existe para poder simplesmente incluir em outros programas APENAS o cabeçalhos, as "d+".  Essa é a razão.

É claro que você pode arbitrar qualquer questão e dizer que é desnecessária. E trabalhar de novo copiando todo o código toda vez para todos os programas. E procurar pelo código de boot toda vez que abrir um programa novo.

 

E ainda tem a questão da cortesia de, ao postar uma questão num forum público, não fazer com que TODOS os caras que eventualmente estejam tentando TE ajudar tenham que procurar por main(). Agora por exemplo esse tópico tem mas de 150 visualizações. Algumas dessas são de pessoas que poderiam se beneficiar dessa coisa desnecessária como classificou.

 

 

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!