Ir ao conteúdo
  • Cadastre-se
volpatoc

C Alguém poderia me ajudar no que eu estou errando?

Recommended Posts

Queria saber tambem como mudar o for por while

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

main(){

int a, b;

printf("\n Insira um numero inteiro, positivo, menor ou igual a 20: ");
scanf("%d", &a);
printf("\n Digite 1 para somar os impares ou 2 para multiplicar os pares até o numero indicado: ");
scanf("%d", &b);
{
    if (b=1);
}

int i=a;

int soma=0;

for(i=0 ; i<=a ; i++)

{
if(i%2!=0)

soma=soma+i;

}

printf("\n O valor da soma dos impares e:\%d", soma);
}
{
    if (b=2);
}
{

int i=a;

int multiplicacao=2;
while (a!=20){
        if(a%2==0){
                multiplicacao *= a;
        }
        ++a;
}
printf("multiplicacao dos numeros pares: %d", multiplicacao);
{
    if (b>=3);
    {
        printf("\n Opcao invalida");
            }
}

{
    if (a>20);
    {
        printf ("\n Opcao invalida");
    }
}
{
    if (a<0);
    {
        printf ("\n Opcao invalida");
    }
}
{
    if (b<=0);
    {
        printf ("\n Opcao invalida");
    }
}
system ("pause");
return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@volpatoc  Antes de comentar sobre o código. Coloque ele na tag <code> e selecione a linguagem C.

image.png.bc62aafde66a20273d812d41e7de65be.png

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

Olá. Se for possível da próxima vez siga o q foi dito acima para postar um código, ok?

Vou passar o básico com o uso do while:

 

Para soma:

 

soma = 0;
i = 0;

while (i <= num)
{
    if (i % 2 != 0)
          soma += i;

    i++;
}

Para multiplicação:

 

multiplicao = 1;
i = 1;
while (i <= num)
{
    if (i % 2 == 0)
           multiplicao *= i;

    i++;
}

Apesar de eu não ter feito o uso das chaves para esse exercício, devo dizer q é altamente recomendável o uso das chaves, para q você não seja induzido ao erro.

Também recomendo o uso de nomes para as variáveis mais intuitivos, como "num" por ex para armazenar o número digitado

e "opcao" por ex. para armazenar a opção q o usuário digitar

Um dos erros q você está cometendo é inicializar a sua variável "multiplicacao" com o valor 2. Isso vai gerar erro no cálculo.

Quando se trata de multiplicações inicialize a variável com o valor 1, q é o 1º número válido em casos de multiplicações 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d conseguiria me dizer aonde estou errando nesse e como substituo o for por while 

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

main(){

int a, b;
printf ("Aluno:       Matricula:");
printf ("Aluno:       Matricula: ");
printf ("Data: 04/05/2018");
printf("===================================== EXERCICIO 1 ===================================");
printf("\n Insira um numero inteiro, positivo, menor ou igual a 20: ");
scanf("%d", &a);
printf("\n Digite 1 para somar os impares ou 2 para multiplicar os pares até o numero indicado: ");
scanf("%d", &b);
{
    if (b=1);
}

int i=a;

int soma=0;

for(i=0 ; i<=a ; i++)

{
if(i%2!=0)

soma=soma+i;

}

printf("\n O valor da soma dos impares e:\%d", soma);
}
{
    if (b=2);

{

int i=a;

int multiplicacao=2;
while (a!=20){
        if(a%2==0){
                multiplicacao *= a;
        }
        ++a;
}
printf("multiplicacao dos numeros pares: %d", multiplicacao);
{
    if (b>=3);
    {
        printf("\n Opcao invalida");
            }
}

{
    if (a>20);
    {
        printf ("\n Opcao invalida");
    }
}
{
    if (a<0);
    {
        printf ("\n Opcao invalida");
    }
}
{
    if (b<=0);
    {
        printf ("\n Opcao invalida");
    }
}
system ("pause");
return 0;
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

Olá. Pelo q vi aqui no caso da multiplicação se o usuário digitar o número 20, o resultado é um valor grande demais para um tipo de dado int.

Alterando a variavel multiplicacao para double é a forma de resolver o exercício usando a lógica q passei para calcular o valor da multiplicação

Se estou errado me corrijam

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@volpatoc  Olá. A princípio vamos procurar resolver o problema q, ao meu ver, é prioridade para o seu exercício.

O que está acontecendo no seu código é o uso inadequado da sintaxe para o C, como, principalmente, chaves e ponto e vírgula colocados de maneira incorreta. 

Outro ponto q gostaria de frisar é q, vendo seu código, algo q aparece umas duas vezes é isso:

if (b = 1) 

É preciso perceber q há uma grande diferença no uso de um sinal de igual para o uso de dois sinais de igual seguidos.

Quando se usa apenas um sinal de igual, o q está se fazendo é uma atribuição, por exemplo atribuir um valor a uma variável:

Por exemplo: int i = 10; // Aqui o q está acontecendo é q estou atribuindo o valor 10 a variável 'i'

No caso de verificar em um comando if se um valor é igual ao outro, seria dessa forma:

if (b == 1) 

Deu para perceber essa diferença?

Como você vinha fazendo com algo como if (b = 1) é atribuindo o valor 1 a variável b e não fazendo a comparação

Se deu para entender essa diferença maravilha!

Mas vou desde já adiantar q, pelo q percebi, você tem demonstrou encontrar uma certa dificuldade no uso do while. Logo, conclui-se q você está a pouco tempo estudando e coisas como essas que falei com relação ao seu código são comuns para quem está começando a programar. Então, nesse caso, não se preocupe e nem fique desanimado por algo assim.

Eu, por exemplo, quando comecei a estudar programação, cometia erros muito piores do q esses.

A boa notícia que tenho para dar é q, com o passar do tempo, a medida em q a gente vai estudando, as coisas vão ficando mais claras. Aquele código que parecia um "bicho d sete cabeças" se torna algo fácil de entender

 

Mas voltando p seu código, dei ênfase, do modo como vou postar abaixo, em ajustar a questão da sintaxe.

Gostaria q procurasse perceber a diferença que tem para o forma como você fez seu código.

Apenas o q fiz foi usar seu código, mas com as devidas correções com relação a sintaxe

 

Segue o código:

 

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

main(){
	
	int a, b, i, soma; // declaracao das variaveis
	double multiplicacao; 
	
	printf ("Aluno:       Matricula:");
	printf ("Aluno:       Matricula: ");
	printf ("Data: 04/05/2018");
	printf("===================================== EXERCICIO 1 ===================================");
	
	printf("\n Insira um numero inteiro, positivo, menor ou igual a 20: ");
	scanf("%d", &a);
	fflush(stdin); // esse comando e um dos comandos que servem para limpar o buffer de entrada. Isso e preciso para q, nas leituras seguintes, nao seja lido "sujeira" do buffer
	
	
	printf("\n Digite 1 para somar os impares ou 2 para multiplicar os pares ate o numero indicado: ");
	scanf("%d", &b);
	fflush(stdin);

    if (b == 1)
    {
    	i = 0;

		soma = 0;

		while (i <= a)
		{
			if (i % 2 != 0)
			{
				soma += i;
			}
			i++;
		}

		printf("\n O valor da soma dos impares e: %d\n\n", soma);
		
		system("pause");
		
		return 0;
	}

    else if (b == 2) 
	{

		i = 1;

		multiplicacao = 1.0;
		
		while (i <= a)
		{
			if (i % 2 == 0)
			{
				multiplicacao *= i;
			}
			i++;
		}
		
		printf("multiplicacao dos numeros pares: %f\n\n", multiplicacao);
		
		system("pause");
		
		return 0; // aqui é para encerrar o programa		
	}

    if (b >= 3)
    {
        printf("\n Opcao invalida");
    }

    if (a > 20)
    {
        printf ("\n Opcao invalida");
    }
    if (a < 0)
    {
        printf ("\n Opcao invalida");
    }
    if (b <= 0)
    {
        printf ("\n Opcao invalida");
    }

	system ("pause");
	
	return 0;
}

A princípio se você conseguir entender as mudanças q foram feitas no código já está bom.

Seria interessante se você pudesse dar uma olhada com calma no código q postei e procurar perceber como o código ficou bem diferente.

Seria isso por enquanto. Se você conseguir entender o q procurei passar ótimo. Devo dizer q não sou professor de programação, então não sei dizer se consegui explicar de maneira correta o que foi dito acima

Poste o que você pode aproveitar desse comentário e, caso tenha algum dúvida, fique a vontade para perguntar.

Tanto você como eu estamos aqui para aprender. Lembre disso!

Abraço! 

adicionado 4 minutos depois

Só um ponto que me passou despercebido.

a função main() deve ser declarada dessa forma:

 

int main()

{

 

 

    return 0;

}

adicionado 13 minutos depois

Só devo dizer que o código que passei não ficou bem formatado. Mas creio que já dá para entender o que procurei explicar

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@volpatoc  Olá, amigo. É o seguinte: apenas com o intuito de você ter uma referência para trabalhar com exercícios como esse, fiz um código q, provavelmente você pode achar até muito complexo.

Mas acredito q se você procurar fazer exercícios mais simples usando essa abordagem q faço, q é muito comum para exercícios como o seu, creio q você vai conseguir entender exatamente o q está acontecendo no código.

Mas a princípio é apenas para você ter uma referência e procurar entender o q está sendo feito.

Fiz uso de dois do/while. A diferença principal entre o while e o do/while é q no while a condição é verificado antes da execução do bloco while. Já no caso do do/while a verificação da condição é avaliada depois da execução do do/while. Isso, na prática, garante q, no mínimo, 1 vez seu código dentro do do/while seja executado. Recurso esse muito útil para esse caso.

 

Segue o código:

 

#include <stdio.h>
#include <windows.h>

int main()
{
    int opcao, soma, num = 0, i;
    long long int multiplicao;

    do
    {
        printf("\nInsira um numero inteiro, positivo, menor ou igual a 20: ");
        scanf("%d", &num);
        fflush(stdin); // esse comando limpa o buffer de entrada

        if (num > 20 || num <= 0)
        {
            printf("\nValor invalido!\n");
            continue;
        }

    } while (num > 20 || num <= 0);

    do
    {
        printf("\nDigite 1 para somar os impares e 2 para multiplicar os pares ate o numero indicado: ");
        scanf("%d", &opcao);
        fflush(stdin);

        switch (opcao)
        {
        case 1:
            soma = 0;
            i = 0;

            while (i < num)
            {
                if (i % 2 != 0)
                    soma += i;

                i++;
            }
            printf("\nO valor da soma dos impares e: %d\n\n", soma);
            break;
        case 2:
            multiplicao = 1;
            i = 1;
            while (i <= num)
            {
                if (i % 2 == 0)
                    multiplicao *= i;

                i++;
            }
            printf("\nMultiplicacao dos numeros pares: %lld\n\n", multiplicao);
            break;
        default:
            printf("\nOpcao invalida!\n");
            break;
        }

    } while (opcao != 1 && opcao != 2);

    system("pause");

    return 0;
}

Para esse exercício, perceba q se o usuário digitar um número como 20 e você fizer o cálculo vai dar erro se usar o tipo de dado int para a variável multiplicação. Para resolver esse problema, como você vai poder ver, coloquei a variável multiplicação não como int e sim como long long int. E para imprimir o valor ficaria do modo como fiz acima: %lld.

Fiz uso também do switch, q pode ser tranquilamente substituído pelo if. Mas vejo q é importante você ter uma referência com relação ao uso do switch.

Se deu ou não para entender o código poste aqui. Se ficou alguma dúvida com relação ao código fique a vontade para perguntar.

Como disse: Tanto eu como você estamos aqui para aprender

Não se incomode se  a forma como fiz o código ficou difícil para você entender. Mas, a princípio, execute o código e aí você vai entender melhor o que está sendo feito, ok?

Abraço 

adicionado 20 minutos depois

apenas uma correção no cálculo da como, na condição do while eu não estou considerando o valor digitado pelo usuário para q o mesmo também seja usado no cálculo. então, corrigindo, ficaria assim:

 

soma = 0;
i = 0;

while (i <= num) // na condicao e preciso incluir o numero digitado pelo usuario no calculo, então, o correto e essa abordagem
{
    if (i % 2 != 0)
           soma += i;

    i++;
}
printf("\nO valor da soma dos impares e: %d\n\n", soma);
break;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante

@volpatoc  Não sei se é permitido algo assim aqui.

Mas caso esteja encontrando muita dificuldade em entender o uso de estruturas de decisão como if/else if/else e switch e em estruturas de repetição como while, do/while e for, a sugestão q eu daria é d fazer um curso de Lógica de Programação para poder entender esses e outros pontos básicos com relação a programação.

E o curso que sugiro pode ser visto nesse link:

http://www.softblue.com.br/site/curso/id/6/CURSO+DE+LOGICA+DE+PROGRAMACAO+BASICO+ON+LINE+LO06+GRATIS

Foi o melhor curso de Lógica q encontrei e recomendo esse curso com bastante frequência, pois o mesmo é ótimo, sem falar que é totalmente gratuito e com certificado ao final do curso, caso aprovado. Até onde sei, é o curso mais acessado de Lógica de Programação do Brasil atualmente

Mas como eu disse: É apenas uma sugestão. Fica a seu critério considerar ou não essa sugestão

adicionado 5 minutos depois

Caso não seja permitido postar conteúdo como esse aqui, peço desde já desculpa aos administradores do site.

Devido a correria, devo admitir que inda não pude ler d forma adequada as regras do site

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×