Ir ao conteúdo

Posts recomendados

Postado

Faça um programa em C no qual o usuário digitará os valores inicial (vi) e final (vf), após isso, mostrar na tela todos os números que são múltiplos de 5 e ímpares contidos neste intervalo e ao final a soma de todos os números múltiplos de 5 e ímpares . Supondo que o valor inicial digitado será sempre menor que o valor final, o laço de repetição, para este programa será crescente, utilize o comando WHILE.

 

 

Alguem pode me ajudar a fazer este programa? Sou novo na area de programar em C++ e nao estou conseguindo desenvolve-lo

  • Curtir 3
Postado

para saber se é multiplo use o operado %==0 para saber se é impar use o %==1 para saber se  o valor inicial é maior do que o final use if (>) ou if (<) dependendo da condição o laço for pode ter como o maior ou menor argumento inicial

  • Curtir 2
Postado

@Vinicius Hofman    se é para fazer na linguagem c ,  então não adianta ajudar em  C++ ,  apesar de que a linguagem C++ aceita os comandos da linguagem c ,  então você pode usar o comando scanf para pegar os valores iniciais e finais ,   e usa_los para controlar o  Loop While ,  e dentro dele faça as operações para saber se os valores são  múltiplos e se são ímpares , então faça seu código sobre esse exercício e poste ele aqui , para vermos como está e em que podemos ajudar      ... 

Postado
Em 21/07/2020 às 10:38, herbertbahia disse:

para saber se é multiplo use o operado %==0 para saber se é impar use o %==1 para saber se  o valor inicial é maior do que o final use if (>) ou if (<) dependendo da condição o laço for pode ter como o maior ou menor argumento inicial

 

Não é para testar se o valor inicial é maior que o final:
 

Em 21/07/2020 às 09:35, Vinicius Hofman disse:

Supondo que o valor inicial digitado será sempre menor que o valor final, o laço de repetição, para este programa será crescente, utilize o comando WHILE

 

Está garantido no enunciado

 

Sim,

  • x%5 == 0 indica que é múltiplo de 5 
  • x%2 == 1 indica que é ímpar, mas talvez não seja preciso usar isso
18 horas atrás, devair1010 disse:

dentro dele faça as operações para saber se os valores são  múltiplos e se são ímpares

 

Sim, mas pode não ser preciso fazer isso dentro do loop porque iria fazer muitos cálculos desnecessários. Basta saber o primeiro ímpar múltiplo de 5

 

A solução comum, sem pensar nos dados

    // sem pensar nos dados
    int soma = 0;
    for (int n = inicial; n <= final; n += 1)
        if ((n%5 == 0) && ((n%2 == 1) || (n%2 == -1)))
        {
            printf("%d\n", n);
            soma += n;
        };
    printf("\nSoma dos multiplos = %d\n", soma);

Pois é: identificados os valores inicial e final entra no loop e mostra os caras e vai somando. No final mostra a soma.


Mas era pra ser um while() então

    // sem pensar nos dados
    int soma = 0;
    n = inicial;
    while (n <= final)
    {
        if ((n % 5 == 0) && ((n % 2 == 1) || (n % 2 == -1)))
        {
            printf("%d\n", n);
            soma += n;
        };
        n += 1;
    }
    printf("\nSoma dos multiplos = %d\n", soma);

 

Pensando um pouco nos dados


É claro de de todos os números apenas um em 10 é ímpar e múltiplo de 5, então esse loop é meio best@. Vai calcular toda hora a mesma coisa de que não precisa mais.
 

Citação

Pegadinha: os números podem ser negativos. Cuidado com as contas


Do ensino fundamental: a tabuada do 5

0,5,10,15,20,25,30,35,40,45

Da aritmética elementar: os múltiplos de 5 ímpares terminam em 5. Talvez não seja preciso usar duas vezes módulo e fazer aquelas contas sugeridas aqui.
 

Da matemática elementar: vendo a tabuada do cinco, os múltiplos ímpares de 5 tem diferença de 10. De um modo mais chique, eles
 

Citação

são da forma (2n+1)*5 para algum n


Mas porque tudo isso? E o programa?


Simples: Se a gente souber qual o primeiro ímpar múltiplo de 5 no intervalo então o while() é bem simples: basta ir somando 10 até passar do valor final. E somar. Então o while() que é o objetivo do programa seria apenas

    // o tal while afinal
    while (n <= final)
    {
        printf("%d\n", n);
        soma += n;
        n += 10;
    };


Falta só achar o primeiro n. Claro, pode não ter nenhum número.


Pegadinhas de exemplo

  • entre -4 e 4 não tem nenhum
  • entre -5 e 5 tem dois: o inicial e o final
  • entre 1 e 5 tem só o 5, o final
  • entre 5 e 10 tem só o 5, o inicial



Mas como achar o primeiro cara?

 

Usando o mesmo programa


Pode criar uma variável prim e dentro do while marcar quando achou o primeiro e a partir daí andar de 10 em 10. Bem mais esperto e vai fazer no máximo 4 testes para achar o primeiro. Nada de calcular módulo isso e aquilo dentro do loop, nada de contar de 1 em 1. Algo assim

    // pensando um pouco nos dados
    int soma = 0;
    n = inicial;
    int prim = 0; // nao achou ninguem
    while (n <= final)
    {
        if (prim == 0)
        {   // procura o primeiro 
            if ((n % 5 == 0) && ((n % 2 == 1) || (n % 2 == -1)))
            {   // o primeiro
                printf("%d\n", n);
                soma += n;
                prim = 1;
                n += 10;
            }
            else // continua
                n += 1;
        }
        else
        {   // mais um
            printf("%d\n", n);
            soma += n;
            n += 10;
        }
    }
    printf("\nSoma dos multiplos = %d\n", soma);

Mas está comprido e complicado. Mais esperto seria calcular antes de entrar no loop o primeiro cara, e desistir do programa inicial que foi escrito pensando em C e não no problema

 

Pensando mais nos dados: algumas outras soluções

    int soma = 0;
    // encontra o primeiro
    n = (vi / 10) * 10 + (vi < 0) * (-10) + 5;
    if (n < vi) n += 10;

    // o tal while afinal
    while (n <= vf)
    {
        printf("%d\n", n);
        soma += n;
        n += 10;
    };
    printf("\nSoma dos multiplos = %d\n", soma);

Bem menor hein? E nem precisou de módulo. Claro, a conta é a mesma. O loop é sempre o mesmo:

    while (n <= vf)
    {
        printf("%d\n", n);
        soma += n;
        n += 10;
    };
    printf("\nSoma dos multiplos = %d\n", soma);

Outras opções para achar o primeiro múltiplo ímpar de 5 maior ou igual ao valor inicial
 

Em uma linha só talvez?

    // opcao 3
    n = ((vi / 10) * 10 + (vi < 0) * (-10) + 5) + (((vi / 10) * 10 + (vi < 0) * (-10) + 5) < vi) * 10;

Mais difícil de ler, mas é a mesma coisa

 

Um pouco mais legível, com dois if()

    // opcao 1
    if (vi <= 0)
        n = (vi / 10) * 10 - 5;
    else
        n = (vi / 10) * 10 + 5;
    if (n < vi) n += 10;

Um pouco mais legível:

    // encontra o primeiro
    n = (vi / 10) * 10 + 5;
    n += (vi < 0) * (-10);
    n += (n < vi) * 10; // o primeiro n

Um programa assim

Spoiler

#include <stdio.h>
int main(void)
{
    int vi = 0;
    int vf = 0;
    int n = 0;

    printf("Valor Inicial: ");
    n = scanf("%d%*c", &vi);
    if (n != 1) return -1;
    printf("Inicial: %d] Valor Final: ", vi);
    n = scanf("%d%*c", &vf);
    if (n != 1) return -2;
    printf("Somando multiplos impares de 5 entre %d e %d\n",
        vi, vf);

    int soma = 0;
    // encontra o primeiro
    n = (vi / 10) * 10 + 5;
    n += (vi < 0) * (-10);
    n += (n < vi) * 10; // o primeiro n

    // o tal while afinal
    while (n <= vf)
    {
        printf("%d\n", n);
        soma += n;
        n += 10;
    };
    printf("\nSoma dos multiplos = %d\n", soma);
};  // main()

 

Citação

 

Nota: Em C qualquer expressão é avaliada como verdadeira ou falsa. Verdadeiro vale 1, falso vale zero.

(a>2) vale 1 se for verdade. (2>3) vale 0, (3==3) vale 1... Acho que deu pra entender, se acaso tinha essa dúvida ou isso não foi abordado em nenhuma aula...

 

 

Estou postando isso como parte da minha campanha pela criação dos programas em torno dos dados e não da linguagem

🤣

 

  • Curtir 2

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!