Ir ao conteúdo
  • Cadastre-se

C Programa somatório de números impares


Ragnarbrody
Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Boa tarde galera, estou precisando fazer um programa que receba dois valores e calcule o somatório dos numeros

impares entre os mesmo, eu imagino que usando o for dê pra fazer, mas não sei muito bem como, da pra me ajudar?

eu sei que pra verificar se o número é impar eu uso:

(n%2!=0)

esse é o enunciado:

Citação

elabore um programa que receba dois números inteiros, verifique qual é o maior entre eles, calcule e mostre o resultado do somatório dos números ímpares compreendidos entre esses dois números.

Inicie um laço de repetição com teste no final e:

a. Escreva Somatório dos ímpares:

b. Escreva Digite dois numeros inteiros (n m):

c. Leia os valores n e m na mesma linha. (Dica: use scanf(“%d %d, &n, &m).

d. Escreva Somatório dos ímpares entre n e m e.

      Se n for menor ou igual a m, calcule e escreva o somatório dos números ímpares de n até m (n e m inclusive, se ímpares).

      Escreva a operação em ordem crescente, ou seja, suponha que n = 1 e m = 10, escreva 1 + 3 + 5 + 7 + 9 = 25.

f. Se n for maior que m, calcule e escreva o somatório dos números ímpares de n até m (n e m inclusive, se ímpares).

      Escreva a operação em ordem decrescente, ou seja, suponha que n = 10 e m = 1, escreva  25 = 9 + 7 + 5 +3 + 1.

 

Exemplo de saída:

quando n menor ou igual a m 

 

Somatório dos ímpares

 

Digite dois numeros inteiros (n m): 3 5

 

Somatório dos ímpares entre 3 e 5

 

1 + 3 + 5 + 7 + 9 = 25

 

Exemplo de saida se n for maior que m

 

Somatório dos ímpares

 

Digite dois numeros inteiros (n m): 5 3

 

Somatório dos ímpares entre 5 e 3

 

25 = 9 + 7 + 5 +3 + 1

 

Eu tentei usar só pra teste :

for (NS1=NS1; NS1<NS2; NS1++)
{
    for (NS1=NS1; NS1%2!=0; NS1)
        {
           printf("%d", NS1);
        }
}

 

Mas da erro

Link para o comentário
Compartilhar em outros sites

Olá @Ragnarbrody, seu problema é bem simples. Dê uma olhada no código abaixo. Acredito que seja uma solução.

#include<stdio.h>

int main()
{
    int n, m, i;
    int maior, menor, soma = 0;
    int op = 0;
    printf("Entre com 2 numeros: ");
    scanf("%d %d", &n, &m);
   
    if(n > m){
     maior = n;
     menor = m;
     op = 1;
    }else {
     maior = m;
     menor = n;
     op = 0;
    }
   
    if (op != 1){
     for(i = menor; i <= maior; i++){
    
       if (i % 2 != 0){ //reconhece numeros impares
     
        soma += i;
        printf ("\nNumeros impares sao: %d, soma: %d\n", i, soma);
      }
     
     }
    }else {
      for(i = maior; i >= menor; i--){
    
       if (i % 2 != 0){ //reconhece numeros impares
     
        soma += i;
        printf ("\nNumeros impares sao: %d, soma: %d\n", i, soma);
      }
     }
    }
    return 0;
}

 

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

#include<stdio.h>

int main(){
    int n, m, i;
    int maior, menor, soma;
    printf("Digite dois numeros inteiros (n m): ");
    scanf("%d %d", &n, &m);
   
    if(n<m){
	menor = n;
    maior = m;
    printf("numeros impares entre %d e %d sao: ",menor,maior);
     for (i=menor;i<=maior;i++){
    	if(i%2==1){
    		printf ("%d.",i);
    		soma+=i;
		}
	}
	printf ("\nA soma dos numeros impares entre %d e %d e: %d",menor, maior,soma-1);
    }
    else if(n>m){
    maior = n;
	menor = m;
	printf("numeros impares entre %d e %d sao: ",maior,menor);
     for (i=maior;i>=menor;i--){
    	if(i%2==1){
    		printf ("%d.",i);
    		soma+=i;
		}
	}
	printf ("\nA soma dos numeros impares entre %d e %d e: %d",maior, menor,soma-1);
	}	
}
   

 

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

/**
 * Realiza a somatoria dos valores impares entre o intervalo informado.
 * Os parametros podem ser informados em qualquer ordem.
 *
 * @param inicio Valor inicial (inclusivo)
 * @param fim    Valor final (inclusivo)
 *
 * @return Soma dos valores impares.
 */
int somaImpares(int inicio, int fim) {
    int soma = 0;

    if (inicio <= fim) {
        for (; inicio <= fim; ++inicio) {
            if (inicio % 2 != 0) soma += inicio;
        }
    } else {
        for (; inicio >= fim; --inicio) {
            if (inicio % 2 != 0) soma += inicio;
        }
    }

    return soma;
}

 

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

  • Membro VIP

@Ragnarbrody, creio que um ponto importante é seguir o estipulado pelo enunciado, por exemplo:

 

O resultado precisa ficar como foi acordado, algo como:

 

15 horas atrás, Ragnarbrody disse:

Exemplo de saída quando n menor ou igual a m


Somatório dos ímpares
Digite dois números inteiros (n m): 1 10
Somatório dos ímpares entre 1 e 10
1 + 3 + 5 + 7 + 9 = 25

 

Exemplo de saída se n for maior que m


Somatório dos ímpares
Digite dois números inteiros (n m): 1 10
Somatório dos ímpares entre 10 e 1
25 = 9 + 7 + 5 + 3 + 1

 

 

Os resultado DEVEM sair assim... é um contrato!

 

OBSERVAÇÕES IMPORTANTES

  • adicionei o acento agudo no "número"; (é uma proparoxítona)
  • um espaço entre o "+3" no segundo resultado (estava visualmente estranho);
  • e alterei o valor de 3 para 1, assim como de 5 para 10 (pois a resposta está errada - com 3 e 5 daria 8).

 

Uma dica: para gerar a quarta linha, primeiro você precisaria calcular o valor da soma e ter armazenado o resultado numa variável. Após, fazer a parte que gera a sequência utilizando esse valor no lugar adequado... Ou, aproveitando o sugerido pelo @AdrianoSiqueira, outra forma seria utilizar uma função para calcular a soma. Como a dele:

 

2 horas atrás, AdrianoSiqueira disse:

/**
 * Realiza a somatoria dos valores impares entre o intervalo informado.
 * Os parametros podem ser informados em qualquer ordem.
 *
 * @param inicio Valor inicial (inclusivo)
 * @param fim    Valor final (inclusivo)
 *
 * @return Soma dos valores impares.
 */
int somaImpares(int inicio, int fim) {
    int soma = 0;

    if (inicio <= fim) {
        for (; inicio <= fim; ++inicio) {
            if (inicio % 2 != 0) soma += inicio;
        }
    } else {
        for (; inicio >= fim; --inicio) {
            if (inicio % 2 != 0) soma += inicio;
        }
    }

    return soma;
}

 

Aí na hora de gerar a quarta linha, a função seria utilizada para retornar o valor da soma.

 

 

Por favor, poste o código atual para analisarmos. Se tiver dúvidas, informar em qual parte.

 

 

adicionado 43 minutos depois

Um adendo: acho quer seria mais interessante não alterar o valor da variável de entrada. Seguindo a mesma lógica, recomendaria algo como:

int somaImpares(int inicio, int fim) {
    int soma = 0;
    int i;

    if (inicio <= fim) {
        for (i=inicio; i <= fim; ++i)
            if (i % 2 != 0)
                soma += i;
    }
    else {
        for (i=inicio; i >= fim; --i)
            if (i % 2 != 0)
                soma += i;
    }

    return soma;
}

 

 

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

@Simon Viegas Eu não consigo executar, só funciona quando eu coloco para ir do 1 ao 10 e não sei como fazer, por favor me ajude, eu estou me confundindo e não consigo fazer esse código, ele está assim:

#include <stdio.h>

int main()
{
    int n, m, i;
    int maior, menor, soma;
    printf("Digite dois numeros inteiros (n m): ");
    scanf("%d %d", &n, &m);
    if(n<=m)
    {
        menor = n;
        maior = m;
        for (i=menor;i<maior;i++)
        {
            if(i%2!=0)
            {
                printf("%d+", i);
            }
            soma+=menor;
        }
        printf(" = %d", soma);
    }
    else
    {
        menor = m;
        maior = n;
        printf("\n%d = ", soma);
        for (i=maior;i>menor;i--)
        {
             if(i%2!=0)
            {
                printf("%d+", i);
            }
            soma+=maior;
        }
    }
}

 

Link para o comentário
Compartilhar em outros sites

@Ragnarbrody

#include <stdio.h>

int main()
{
    int n, m, i;
    int soma=0;
    printf("Digite dois numeros inteiros (n m): ");
    scanf("%d %d", &n, &m);
    if(n<m)
    {
        for (i=n;i<m;i++)
        {
            if(i%2!=0)
            {
            	soma=soma+i;
                printf("%d+", i);
            }
            
        }
        printf(" = %d", soma);
    }
    else{
    for (i=n;i>=m;i--){
    	if(i%2!=0)
            {
    	printf ("%d+",i);
    	soma=soma+i;
    }
    }
    printf(" = %d", soma);
}
}

 

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

@herbertbahia Obrigado cara, eu consegui fazer do seu jeito

adicionado 1 minuto depois

Só mais uma coisa gente, como eu faço pra caso o n seja maior que m, eu colocar primeiro o resultado na frente e depois a soma?

e também como eu faço pra no ultimo número tira o +?

 

meu código ta assim agora:

#include <stdio.h>

int main()
{
    int n, m, i;
    int soma=0;
    printf("Digite dois numeros inteiros (n m): ");
    scanf("%d %d", &n, &m);
    if(n<=m)
    {
        for (i=n;i<m;i++)
        {
            if(i%2!=0)
            {
                soma=soma+i;
                printf("%d+", i); //como faço para o último número ficar
            }                     //sem o sinal +?
        }
        printf(" = %d", soma);
    }
    else
    {
        for (i=n;i>=m;i--)
        {
            if(i%2!=0)
            {
                soma=soma+i;
                printf("%d+", i);
            }
        }
        printf("\n%d = ", soma); //e como faço para aqui, o resultado
    }                            // aparecer antes da operação?
}

consegui fazer a soma e aparecer o resultado normalmente, mas aparece o sinal de + no ultimo número, como tiro-o?

E quando o 'n' é maior que 'm', preciso fazer o resultado aparecer antes da operação, como faço isso?

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

1 hora atrás, Ragnarbrody disse:

e como faço para aqui, o resultado } // aparecer antes da operação?

deixa o primeiro laço para calcular e exibe em outro laço igual

#include <stdio.h>

int main()
{
    int n, m, i;
    int soma=0;
    printf("Digite dois numeros inteiros (n m): ");
    scanf("%d %d", &n, &m);
    if(n<=m)
    {
        for (i=n;i<m;i++)
        {
            if(i%2!=0)
            {
                soma=soma+i;
                printf("%d+", i); //como faço para o último número ficar
            }                     //sem o sinal +?
        }
        printf(" = %d", soma);
    }
    else
    {
        for (i=n;i>=m;i--){
            if(i%2!=0){
                soma=soma+i;
            }
        }
    	  printf("%d = ",soma);
         for (i=n;i>=m;i--){
        	if(i%2!=0){
                printf("%d+",i);
            }	
    }                            
}
}

 

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

@herbertbahia Funcionou muito bem, mas e para retirar o ultimo sinal de +?

porque sempre aparece um sinal de + no final:

 

caso n menor que m

 1+3+5+7+9+ = 25  // tem um + depois do 9, não era pra estar ali
                  // como tira?

e também no caso de n ser maior que m:

 

 25 = 9+7+5+3+1+  // tem um + depois do 1, não era pra estar ali
                  // como tira?

 

Link para o comentário
Compartilhar em outros sites

7 minutos atrás, Ragnarbrody disse:

@herbertbahia Funcionou muito bem, mas e para retirar o ultimo sinal de +?

porque sempre aparece um sinal de + no final:

basta passar o simbolo de + para o lado esquerdo do %d e caso for falar alguma coisa que o + esta sobrando a esquerda voce pode adicionar 0 que representa o valor de soma antes de receber os valores.

#include <stdio.h>

int main()
{
    int n, m, i;
    int soma=0;
    printf("Digite dois numeros inteiros (n m): ");
    scanf("%d %d", &n, &m);
    if(n<=m)
    {
    	printf("0");
        for (i=n;i<m;i++)
        {
            if(i%2!=0)
            {
                soma=soma+i;
                printf("+%d", i); //como faço para o último número ficar
            }                     //sem o sinal +?
        }
        
        printf(" = %d", soma);
    }
    else
    {
        for (i=n;i>=m;i--){
            if(i%2!=0){
                soma=soma+i;
            }
        }
    	  printf("%d = 0",soma);
         for (i=n;i>=m;i--){
        	if(i%2!=0){
                printf("+%d",i);
            }	
    }                            
}
}

 

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

@herbertbahia Consegui cara, muito obrigado mesmo

 

adicionado 0 minutos depois

@Simon Viegas Muito obrigado também pois me ajudou a entender um pouco melhor o resultado final como um todo

adicionado 1 minuto depois

@AdrianoSiqueira Eu agradeço também pela sua ajuda, mesmo não tendo entendido de inicio, mas agradeço

adicionado 1 minuto depois

Obrigado a todos que me ajudaram, de coração :D 

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

  • Membro VIP

@Ragnarbrody, poste seu código final para analisarmos.

 

Adendo: creio que a solução de colocar um "0" a esquerda NÃO seja válida!!! Coloquei 1 e 10 no código do @herbertbahia e resultado deu "0+1+3+5+7+9 = 25", ou seja: dando a entender que "0" é impar!!! Pelo que me consta, zero é par, logo o resultado está errado. (e de qualquer forma, no enunciado não tem o "0" na resposta)

 

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

@Simon Viegas Sim, mas ao mesmo tempo que zero é considerado par, se você usar somente o conjunto dos inteiros ele será considerado como nulo, o que eu imagino ser o caso.

 

Meu código:

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

int main ()
{    
setlocale(LC_ALL, "portuguese");
int NS1, MS1, SI1;
        int SOMAS1=0;
        char SC1;
        Somatorio:
        printf("\n");
        printf("\n      Somatório de Números Ímpares        ");
        printf("\n");
        printf("\n**Será efetuada a soma de todos os números ímpares compreendidos \n entre o primeiro e o segundo número**");
        printf("\n");
        printf("\nDigite aqui dois números inteiros: ");
        scanf("%d %d", &NS1, &MS1);
        printf("\n");
        printf("\n      Somatório dos ímpares entre %d e %d", NS1, MS1);
        printf("\n");
        if(NS1<=MS1)
        {
            printf("\n0");
            for (SI1=NS1;SI1<MS1;SI1++)
            {
                if(SI1%2!=0)
                {
                    SOMAS1=SOMAS1+SI1;
                    printf(" + %d", SI1);
                }
            }
            printf(" = %d", SOMAS1);
        }
        else
        {
            for (SI1=NS1;SI1>=MS1;SI1--)
            {
                if(SI1%2!=0)
                {
                    SOMAS1=SOMAS1+SI1;
                }
            }
            printf("\n%d = ", SOMAS1);
            for (SI1=NS1;SI1>=MS1;SI1--)
            {
                if(SI1%2!=0)
                {
                    printf(" %d +",SI1);
                }
            }
            printf(" 0");
        }
        NovaS1:
        printf("\n\nDeseja calcular o somatório de ímpares para outro intervalo?: [S/N]?");
        printf("\nR: ");
        SC1 = getche ();
        if (SC1 == 's')
        {
            system("cls");
            NS1 = 0;
            MS1 = 0;
            SI1 = 0;
            SOMAS1 = 0;
            goto Somatorio;
        }
        if (SC1 == 'S')
        {
            system("cls");
            NS1 = 0;
            MS1 = 0;
            SI1 = 0;
            SOMAS1 = 0;
            goto Somatorio;
        }
        if (SC1 == 'n')
        {
            system("cls");
            NS1 = 0;
            MS1 = 0;
            SI1 = 0;
            SOMAS1 = 0;
            return 0;
        }
        if (SC1 == 'N')
        {
            system("cls");
            NS1 = 0;
            MS1 = 0;
            SI1 = 0;
            SOMAS1 = 0;
            return 0;
        }
        if (SC1 != 'S'||SC1 !='s')
        {
            printf("\n");
            printf("\nDigite uma letra válida!!");
            printf("\n");
            goto NovaS1;
        }
}

 

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

  • Membro VIP

@Ragnarbrody, nops!

 

1 minuto atrás, Ragnarbrody disse:

@Simon Viegas Sim, mas ao mesmo tempo que zero é considerado par, se você usar somente o conjunto dos inteiros ele será considerado como nulo, o que eu imagino ser o caso.

 

Se estiver se referindo a "0" não alterar o resultado da soma, isso não tem algo a ver. O enunciado quer que você exiba algo como sendo a "expressão da adição dos números ímpares", ou seja: estaria dizendo que "0" é ímpar, o que sambemos que não é. Eu entendo como zero sendo par! no máximo seria "nem par, nem ímpar", mas ser ímpar não faz muito sentido.

 

Outro ponto: teu código, assim como o do @herbertbahia, NÃO está considerando se o m é ímpar ou não. Se colocar 3 e 11, tem que dar:

3 + 5 + 7 + 9 + 11 = 35

e não

0 + 3 + 5 + 7 + 9 = 24

 

 

Outro exemplo:

Se eu inserir -3 e 3 tem que dar:

-3 + -1 + 1 + 3 = 0

e não

0 + -3 + -1 + 1 = -3

 

Outro exemplo:

Se eu inserir 5 e 5, o enunciado não deixou muito claro, mas acho que poderia aparecer algo assim:

5 = 5

e não

0 = 0

 

E por fim:

Se inserir dois número pares... eu não sei o que faria, talvez inserir algo como:

A faixa informada não possível números ímpares

ou

O número X não é ímpar

Sendo "X" o número informado.

 

Link para o comentário
Compartilhar em outros sites

@Simon Viegas o erro de não incluir o 11 se colocar do 3 ao 11 eu já corrigi, agora se eu tirar o zero a esquerda do número, ficaria um + solto, flutuando sem rumo, por assim, dizer, coloco ali só para preencher o espaço, se souber de alguma forma de retirar o + eu agradeço

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

  • Membro VIP
  • Solução

Eu acho que o resultado deve ficar como foi solicitado no enunciado... como comentei, ele deve ser entendido como um contrato.. se ele "quer" de determinada forma, precisa ser feito como ele quer... se não quer fazer assim, "sugira refazer o enunciado".

 

Segue:

 

Em 16/04/2020 às 14:11, Simon Viegas disse:

O resultado precisa ficar como foi acordado, algo como:

 

Em 15/04/2020 às 22:58, Ragnarbrody disse:

Exemplo de saída quando n menor ou igual a m



Somatório dos ímpares
Digite dois números inteiros (n m): 1 10
Somatório dos ímpares entre 1 e 10
1 + 3 + 5 + 7 + 9 = 25

 

Exemplo de saída se n for maior que m



Somatório dos ímpares
Digite dois números inteiros (n m): 1 10
Somatório dos ímpares entre 10 e 1
25 = 9 + 7 + 5 + 3 + 1

 

 

Veja que só por aí já verifica que o 0 não pode está na lista.

 

Claro que isso é de um modo geral... pode ser que o "professor" ou a "plataforma" aceite resultado "personalizados". Falo como opinião.

 

adicionado 11 minutos depois

Vi tua resposta depois.. Segue:

 

 

13 minutos atrás, Ragnarbrody disse:

@Simon Viegas o erro de não incluir o 11 se colocar do 3 ao 11 eu já corrigi

Show! Era um detalhe também importante.

 

 

 

13 minutos atrás, Ragnarbrody disse:

@Simon Viegas o erro de não incluir o 11 se colocar do 3 ao 11 eu já corrigi, agora se eu tirar o zero a esquerda do número, ficaria um + solto, flutuando sem rumo, por assim, dizer, coloco ali só para preencher o espaço, se souber de alguma forma de retirar o + eu agradeço

Sim! eu imaginei que era isso, mas a ideia que é procure outra solução.. ;). Veja: provavelmente um dos desafios do problema seja justamente aprender a como gerar aquelas expressões corretamente. Tanto pode ser que foi proposto duas formas diferentes (invertendo os membros). Em fim, colocar um 0 a esquerda seria como "resolver um problema substituindo por outro". (que eu acho que seja mais grave, pois seria um erro de lógica, já que zero não é ímpar. No outro, seria apenas um erro de "impressão")

 

Minha sugestão: guarde esse código que você considera como pronto. Faça uma cópia e tente ajustar para exibir como foi solicitado. Não é difícil, só precisa parar um pouco para tentar... e, por sinal, quando obtiver uma solução para isso, poderá ser utilizada em novos programas... recomendo corrigir!

 

  • Obrigado 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!