Ir ao conteúdo

C programa não ler contador e incrementa contador!


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

gente o programa não esta lendo e incrementando e printando os valores das variaveis abaixo alguém me ajuda não estou achando o erro!

 

ele não ler as variaveis , elas sempre continuam no valor inicial.

 

#include <stdio.h>

int main()
{
	int idade, contf=0, maior=0, menor=130, i=1; 
	float salario, media=0;
	char sexo; 

	while(i<=3){

		printf("digite sua idade: \n");
		scanf("%d", &idade);

		printf("digite seu sexo [f-m]: \n");
		scanf("%s", &sexo);

		printf("digite seu salario: \n");
		scanf("%f", &salario);

		if(sexo=="f" && salario <= 200)
		{
			contf = contf+1;
		}

		if (idade<menor)
		{
	   		menor = idade;
		}

	    if (idade>maior){
	    	maior = idade;
	    }
	    
		media = media + salario; 

	    i++;

	}

	media = media / 3;

	printf("a media dos salarios e: R$ %.2f Reais\n", media);
	printf("a maior idade e: %d\n", maior);
	printf("a menor idade e: %d\n", menor);
	printf("o numero de mulheres com salario ate 200 reais e: %d\n", contf);

	return 0;
}

 

 

  • Amei 1
  • Solução
Postado

@Edinei Almeida    As variáveis simples , como as Que você colocou no seu código , só podem ar,azenar um valor nelas de cada vez , e como serão 3 valores , eles não conseguem reter essas informações todas ,  e então o que você precisa mesmo é usar variáveis mais robustas como "vetores "   ou ainda mais poderosas "struct's " e "typedef's" ,  e usando vetores seu código poderia ser assim  :

#include <stdio.h>
#include <windows.h>
int main()
{
  int idade[10], contf=0, maior=0, menor=130, i =0;
  float salario[10], media=0;
  char sexo[10];
  while( i < 3 )
  {
    printf("digite sua idade: \n");
    scanf("%d", &idade[i]);
    printf("digite seu sexo [f-m]: \n");
    scanf("%s", &sexo[i]);
    printf("digite seu salario: \n");
    scanf("%f", &salario[i]);
    if(sexo=="f" && salario <= 200)
    {
      contf = contf+1;
    }
    if (idade[i] < menor)
    {
      menor = idade[i];
    }
    if (idade[i] > maior)
    {
      maior = idade[i];
    }
    media = media + salario[i];
    i++;
  }
  media = media / 3;
  printf("a media dos salarios e: R$ %.2f Reais\n", media);
  printf("a maior idade e: %d\n", maior);
  printf("a menor idade e: %d\n", menor);
  printf("o numero de mulheres com salario ate 200 reais e: %d\n", contf);
  return 0;
}

 

Postado
4 horas atrás, Edinei Almeida disse:
scanf("%s", &sexo);

O especificador %s deve ser usado para strings e não para char como é o caso do seu código. A variável sexo foi declarada como char para receber um caractere, por isso você deve usar o especificador %c e não %s.

 

Ao corrigir o especificador pode acontecer do programa "pular" algum scanf, para resolver isso você pode acrescentar outros em todas as entradas assim,

scanf("%d%*c", &idade);
scanf("%c%*c", &sexo);
scanf("%f%*c", &salario);

 

Nesta parte só tem que substituir aspas duplas por simples já que se trata de um char, então o correto é if(sexo == 'f' && salario <= 200).

4 horas atrás, Edinei Almeida disse:
if(sexo=="f" && salario <= 200)

 

No teste das idades você iniciou essas variáveis com uma margem, mas nem sempre isso pode adiantar. Por isso você devia tentar encontrar uma forma de atribuir esses valores no loop. Uma forma é atribuindo o valor da entrada nas duas variáveis no primeiro loop p.ex,

 

if(i == 1){
    menor = idade;
    maior = idade;
}else{
    if(idade < menor){
        menor = idade;
    }
    if(idade > maior){
	    maior = idade;
    }
}

 

Assim não precisa atribuir um valor qualquer no inicio do código para funcionar em qualquer tipo de exercício que pede isso.

  • Obrigado 1
Postado
1 hora atrás, Midori disse:
if(i == 1){
    menor = idade;
    maior = idade;
}else{
    if(idade < menor){
        menor = idade;
    }
    if(idade > maior){
	    maior = idade;
    }
}

 

1 hora atrás, Midori disse:

Assim não precisa atribuir um valor qualquer no inicio do código para funcionar em qualquer tipo de exercício que pede isso

 

É verdade. Mas não é boa ideia. 

 

Eis o total de vezes em que i = 1: Uma vez

 

E o código testa a vida toda por algo que só acontece na primeira vez. Não vou dizer que nunca vi isso porque já li muitas vezes, mas não é certo.

 

As duas maneiras mais ortodoxas de fazer isso:

 

  • Usar INT_MAX e INT_MIN. C tem essas constantes em limits.h para esses casos
    int maior = INT_MIN;
    int menor = INT_MAX;
	int i = 0;
    while (i <= 3)
    {
	    //...
        if (sexo == "f" && salario <= 200)
            contf = contf + 1;
        if (idade < menor) menor = idade;
        if (idade > maior) maior = idade;
        media += salario;
        i+=1;
    }
  • Ler o primeiro valor antes do loop
     
        printf("digite sua idade: \n");
        scanf("%d", &idade);
        printf("digite seu sexo [f-m]: \n");
        scanf("%s", &sexo);
        printf("digite seu salario: \n");
        scanf("%f", &salario);
        int menor = idade;
        int maior = idade;
        int i     = 0;
        while (i <= 3)
        {
            if (sexo == "f" && salario <= 200)
                contf = contf + 1;
            if (idade < menor) menor = idade;
            if (idade > maior) maior = idade;
            media += salario;
            printf("digite sua idade: \n");
            scanf("%d", &idade);
            printf("digite seu sexo [f-m]: \n");
            scanf("%s", &sexo);
            printf("digite seu salario: \n");
            scanf("%f", &salario);
            i += 1;
        }

Claro que para 3 items e 3 campos fica um pouco estranho 🙂 Entenda o exemplo como tal: exemplo.

 

Mais sobre o código

 

  • Não use while nesses casos: só vai correr riscos. NUNCA deixe uma variável viva pela função sem necessidade. Só estará procurando e quase sempre achando problemas. Muito menos uma com o ingênuo nome de i. Use for e deixe o i lá dentro:
    int maior = INT_MIN;
    int menor = INT_MAX;
    for (int i = 0; i < 3; i += 1)
    {
        printf("digite sua idade: \n");
        scanf("%d", &idade);
        printf("digite seu sexo [f-m]: \n");
        scanf("%s", &sexo);
        printf("digite seu salario: \n");
        scanf("%f", &salario);
        if (sexo == "f" && salario <= 200)
            contf = contf + 1;
        if (idade < menor) menor = idade;
        if (idade > maior) maior = idade;
        media += salario;
    };  // for()
  • não use chaves sem necessidade. Só polui o texto e cria a chance de esquecer alguma
     
  • TESTE sempre o retorno de scanf. É ingênuo seguir se não leu nada. E entenda que scanf() não foi escrita para ler do teclado. Se quer usar entenda a mecânica e consuma os '\n' por exemplo. E evite ler uma letra com '%c' ou especificadores do tipo 
    1 hora atrás, Midori disse:
    "%c%*c"

    ou similares. Isso sempre dá problema. Prefira por exemplo ler uma string e pegar a primeira letra. Mais simples.
     

  • um printf() de 5 linhas é bem mais esperto que 5 printf() de uma linha e demora dezenas de vezes menos pra rodar. printf() é uma função.
     

  • Não declare mais que uma variável por linha. É grátis e vai gostar de não ter que ficar procurando pelas declarações.

  • Inicialize todas as variáveis.

 

  • Obrigado 1
Postado
15 horas atrás, arfneto disse:

ou similares. Isso sempre dá problema. Prefira por exemplo ler uma string e pegar a primeira letra. Mais simples.

Que tipo de problema pode dar? Essa talvez não seja a melhor forma de tratar aquela questão do buffer, mas normalmente isso resolve.

  • Curtir 1
Postado
5 horas atrás, Midori disse:

Que tipo de problema pode dar? Essa talvez não seja a melhor forma de tratar aquela questão do buffer, mas normalmente isso resolve

 

Não resolve se o cara digitar mais de uma letra, algo comum no teclado. O simples --- insistindo em usar scanf que não foi escrita para isso --- é ler em um vetor de letrinhas e pegar a primeira como resposta, assim scanf consome tudo exceto o enter

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!