Ir ao conteúdo

Posts recomendados

Postado

Foi feita uma pesquisa entre os habitantes de uma região. Foram coletados os dados de idade, sexo (M/F) e salário. Faça um programa que calcule e mostre: 

a) A média dos salários do grupo;

b. A maior e a menor idade do grupo;

c. A quantidade de mulheres na região;

d. A idade e o sexo da pessoa que possui o menor salário;

Finalize a entrada de dados ao ser digitada uma idade negativa

 

#include <stdio.h>

#include <stdlib.h>



<int main (){

    int idade=0, salario=0, menorIdade, maiorIdade, media=0, mediaSalario=0, salarioTotal=0, sf=0, menorSalario, ims;

    char sexo, sms;

    while (idade>=0){

        printf("digite a idade\n");

        scanf("%d", &idade);

        if(idade<0){

            break;

        }

        if (idade<menorIdade){

            menorIdade=idade;

        }

        if (idade>maiorIdade){

            maiorIdade=idade;

        }

        fflush(stdin);

       

        printf("Digite o sexo 'M' ou 'F'\n");

        scanf("%c", &sexo);

        if(sexo=='f' || sexo=='F'){

            sf++;

        }



        fflush(stdin);

        printf("digite o salario\n");

        scanf("%d", &salario);

        media++;

       

        salarioTotal+=salario;

        if(salario<menorSalario){

            ims=idade;

            sms=sexo;

        }



   

        system ("cls");

    }

        system ("cls");

       

       

        mediaSalario=salarioTotal/media;

        printf("A media salarial he de: %d\n", mediaSalario);

        printf("Maior idade he: %d\n", maiorIdade);  

        printf("Menor idade he: %d\n", menorIdade);

        printf("Numero de mulheres do sexo feminino: %d\n", sf);

        printf("E o menor salario é da pessoa que tem %d anos e he do sexo %c", ims, sms);





    return 0;

}>

 

Postado

Use o botão code, como explicado no primeiro post desse forum. Coo explicado lá.

 

Você colocou main entre '<' e '>'. Não ajuda muito.

 

E porque usar esse botão afinal?

 

Porque é mais fácil de ler, tem a formatação conforme o conteúdo. E é seguro de copiar sem virem coisas estranhas junto, como caracteres de controle no meio do programa.

 

Veja o programa que postou: aparece aqui em espaço duplo. E é isso que vai para o compilador de alguém que queira compilar para ajudar ou testar. Muias vezes vão outros símbolos no meio do código, coisas como tags de HTML.

 

#include <stdio.h>

#include <stdlib.h>

 

<int main (){

    int idade=0, salario=0, menorIdade, maiorIdade, media=0, mediaSalario=0, salarioTotal=0, sf=0, menorSalario, ims;

    char sexo, sms;

    while (idade>=0){

        printf("digite a idade\n");

        scanf("%d", &idade);

        if(idade<0){

            break;

        }

        if (idade<menorIdade){

            menorIdade=idade;

        }

        if (idade>maiorIdade){

            maiorIdade=idade;

        }

        fflush(stdin);

       

        printf("Digite o sexo 'M' ou 'F'\n");

        scanf("%c", &sexo);

        if(sexo=='f' || sexo=='F'){

            sf++;

        }

 

        fflush(stdin);

        printf("digite o salario\n");

        scanf("%d", &salario);

        media++;

       

        salarioTotal+=salario;

        if(salario<menorSalario){

            ims=idade;

            sms=sexo;

        }

 

   

        system ("cls");

    }

        system ("cls");

       

       

        mediaSalario=salarioTotal/media;

        printf("A media salarial he de: %d\n", mediaSalario);

        printf("Maior idade he: %d\n", maiorIdade);  

        printf("Menor idade he: %d\n", menorIdade);

        printf("Numero de mulheres do sexo feminino: %d\n", sf);

        printf("E o menor salario é da pessoa que tem %d anos e he do sexo %c", ims, sms);



 

    return 0;

}>

 

O editor do forum é ruim. Podia ter mais recursos como um editor Markdown ou PDF, mas ao menos tem essas caixas de código.

 

De volta ao programa como postou, mas sem os <> e sem as linhas extras:

 

#include <stdio.h>
#include <stdlib.h>
 
int main (){
    int idade=0, salario=0, menorIdade, maiorIdade, media=0, mediaSalario=0, salarioTotal=0, sf=0, menorSalario, ims;
    char sexo, sms;
    while (idade>=0){
        printf("digite a idade\n");
        scanf("%d", &idade);
        if(idade<0){
            break;
        }
        if (idade<menorIdade){
            menorIdade=idade;
        }
        if (idade>maiorIdade){
            maiorIdade=idade;
        }
        fflush(stdin);
       
        printf("Digite o sexo 'M' ou 'F'\n");
        scanf("%c", &sexo);
        if(sexo=='f' || sexo=='F'){
            sf++;
        }
 
        fflush(stdin);
        printf("digite o salario\n");
        scanf("%d", &salario);
        media++;
       
        salarioTotal+=salario;
        if(salario<menorSalario){
            ims=idade;
            sms=sexo;
        }
 
   
        system ("cls");
    }
        system ("cls");
       
       
        mediaSalario=salarioTotal/media;
        printf("A media salarial he de: %d\n", mediaSalario);
        printf("Maior idade he: %d\n", maiorIdade);  
        printf("Menor idade he: %d\n", menorIdade);
        printf("Numero de mulheres do sexo feminino: %d\n", sf);
        printf("E o menor salario é da pessoa que tem %d anos e he do sexo %c", ims, sms);


 
    return 0;
}

 

Sobre o código

 

Não vou "dar uma nota" 😉 mas vou listar algumas coisas que acho que deve trocar. Se eu fosse rever seu código numa empresa que tivesse isso --- revisão de código --- eis o que eu diria:
 

    int idade = 0, salario = 0, menorIdade, maiorIdade,
        media = 0, mediaSalario = 0, salarioTotal = 0,
        sf = 0, menorSalario, ims;

 

  • inicialize TODAS as variáveis. Escolheu algumas nessa declaração aí. E deixou de fora outras. Qual o critério? 
     
    • menorIdademaiorIdade aparecem logo abaixo:
       
              if (idade < menorIdade) { menorIdade = idade; }
              if (idade > maiorIdade) { maiorIdade = idade; }


      Como não foram inicializadas não há como saber o que vai acontecer na primeira vez que passar pelo loop, e o programa está errado.
       

    • declare uma variável por linha. É grátis. Declarou 10 na mesma linha e não há vantagem nisso. É muito chato ficar procurando uma declaração. É ruim de ler. Se quiser mudar uma variável por exemplo de int para unsigned vai ter que ficar caçando e recortando no meio do código.

    • seu compilador deve ter avisado do uso de variáveis não inicializadas. Se avisou e você não corrigiu está errado. Se não avisou porque você omitiu os warnings do compilador também está errado... Meu compilador reclamou dessas variáveis:
       

       error C4700: uninitialized local variable 'menorIdade' used
       error C4700: uninitialized local variable 'maiorIdade' used
       error C4700: uninitialized local variable 'menorSalario' used

       

  • provavelmente mediaSalario não deveria ser int mas sim float ou double.

  • está computando o total de salários em uma variável chamada média? Não faça isso.

esses if não precisam e não deviam ter chaves
 

        if (idade < menorIdade) { menorIdade = idade; }
        if (idade > maiorIdade) { maiorIdade = idade; }


prefira o simples
 

        if (idade < menorIdade) menorIdade = idade;
        if (idade > maiorIdade) maiorIdade = idade;
  • essa notação, conhecida como camel case na lliteratura, como em menorIdade, é comum em java e Python. Em C é muito mais comum usar menor_idade por exemplo, e reservar a primeira letra em maiúscula para nomes definidos pelo usuário, como structs, e o nome todo em maiúscula para constantes definidas via #define.
  • fflush() não está definida para arquivos (fluxos) de entrada, apenas para saída. Não use isso.

  • scanf() retorna um int. TESTE sempre o retorno de scanf(). É ingênuo não usar,

Sobre essa construção:
 

    while (idade >= 0)
    {
        printf("digite a idade\n");
        scanf("%d", &idade);

        if (idade < 0) { break; }
        if (idade < menorIdade) { menorIdade = idade; }
        if (idade > maiorIdade) { maiorIdade = idade; }
      // ...
  • Não mude de linha depois de um prompt. SEMPRE se espera que o cursor fique parado logo depois da pergunta e não na linha de baixo.
  • não limpe a tela no meio da leitura: o cara que est;a digitando pode perder o contexto se estiver digitando uma série e não puder ver o anteior.
  • o programa aceita idade 0. É de propósito?
  • Evite esse tipo de construçao: Perceba que está testando idade duas vezes logo no início do loop? Toda vez? Nada eficiente. E ruim de ler.

 

Se idade<0 é sua condição para sair do loop leia o primeiro valor fora dele e leia o próximo ao final do loop... É mais legível e elimina um teste por loop. Pense nisso.

 

Prefira
 

    int    idade        = -1;
    printf("Digite a idade:  ");
    scanf("%d", &idade);
    fgetc(stdin);  // consome o ENTER
    while (idade >= 0)
    {
        // ... o resto do codigo
        // le o proximo
        printf("\nDigite a idade:  ");
        res = scanf("%d", &idade);
        if (res < 1) break;  // encerra se não leu nada
    };  // while()

 

  • um printf() de 6 linhas é muito mais esperto que 6 printf(0 de uma linha. E dezenas de vezes mais rápido.

    Evite
     
        printf("A media salarial he de: %d\n", mediaSalario);
        printf("Maior idade he: %d\n", maiorIdade);
        printf("Menor idade he: %d\n", menorIdade);
        printf("Numero de mulheres do sexo feminino: %d\n", sf);
        printf(
            "E o menor salario é da pessoa que tem %d anos e "
            "he do sexo %c",
            ims, sms);

Evite a expressão redundante  "mulheres do sexo feminino". 

Prefira
 

    printf("\
    Media salarial: %d\n\
    Maior idade: %d\n\
    Menor idade: %d\n\
    Numero de mulheres: %d\n\
    Funcionario com menor salario tem %d anos e "
        "sexo %c",
        mediaSalario, maiorIdade, menorIdade, sf, ims, sms);


É mais fácil de ler e de alinhar e entender como vai sair na tela.

 

EXEMPLO

 

saída do exemplo
 

Digite a idade:  100
Digite o sexo 'M' ou 'F':  f
Digite o salario:  1000

Digite a idade:  80
Digite o sexo 'M' ou 'F':  f
Digite o salario:  2000

Digite a idade:  70
Digite o sexo 'M' ou 'F':  m
Digite o salario:  3000

Digite a idade:  60
Digite o sexo 'M' ou 'F':  m
Digite o salario:  4000

Digite a idade:  x

    Media salarial: 2500.00
    Maior idade: 100
    Menor idade: 60
    Numero de mulheres: 2
    Funcionario com menor salario (1000) tem 100 anos e sexo f

 

codigo (copiado do programa original)
 

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

int main()
{
    int  salario      = 0;
    int  salarioTotal = 0;
    int  sf           = 0;
    int  res          = 0;
    char sexo         = 0;

    int    ims     = 0;
    double media_s = 0.;
    int    menor_i = INT_MAX;
    int    menor_s = INT_MAX;
    int    maior_i = INT_MIN;
    int    n_sal   = 0;  // contador
    char   sms     = 0;
    int    idade   = -1;
    printf("Digite a idade:  ");
    res = scanf("%d", &idade);
    fgetc(stdin);  // consome o ENTER
    while (idade >= 0)
    {
        if (idade < menor_i) menor_i = idade;
        // equivalente usando operador ?
        maior_i =
            (idade < maior_i) ? maior_i : idade;
        printf("Digite o sexo 'M' ou 'F':  ");
        res = scanf("%c", &sexo);
        if (sexo == 'f' || sexo == 'F') sf += 1;
        fgetc(stdin);  // consome o ENTER

        printf("Digite o salario:  ");
        res = scanf("%d", &salario);
        fgetc(stdin);        // consome o ENTER
        if (res < 1) break;  // encerra se não leu nada
        n_sal += 1;
        salarioTotal += salario;
        if (salario < menor_s)
        {   ims = idade;
            sms = sexo;
            menor_s = salario;
        };  // if()
        // le o proximo
        idade = -1; // se não ler nada encerra
        printf("\nDigite a idade:  ");
        res = scanf("%d", &idade);
        fgetc(stdin);          // consome o ENTER
    };  // while()
    if (n_sal == 0) return 0;  // não leu nada
    media_s = (double)salarioTotal / n_sal;

    printf("\
\n\
    Media salarial: %.2f\n\
    Maior idade: %d\n\
    Menor idade: %d\n\
    Numero de mulheres: %d\n\
    Funcionario com menor salario (%d) tem %d anos e "
        "sexo %c\n\n",
        media_s, maior_i, menor_i, sf,
        menor_s, ims, sms);

    return 0;
}

 

Essa é uma maneira comum de escrever isso. Compare e considere o que eu escrevi

 

Sobre o código do exemplo

  • variáveis com nomes muito longos são difíceis de ler e tratar, então encurtei umas
  • INT_MAX e INT_MIN são valores limite e são convenientes para quando precisa de máximo e mínimo.
  • quando scanf() não lê nada não mexe claro nos valores das variáveis.
  • fgetc() lê o ENTER que finalizou a leitura do campo anterior. Resolve o caso comum de consumir o ENTER

 

  • Curtir 1
  • Obrigado 1
Postado
1 hora atrás, Emanuel Gfds disse:

o cara me detonou 😐, calma po to no primeiro semestre de ciência da computação🤣

 

Essa é uma parada curiosa...

 

Eis como eu vejo isso:

  • No título original da pergunta você pedia para "dar uma nota para o programa"

O moderador @Dif alterou o tal título e por exemplo meu comentário

 

13 horas atrás, arfneto disse:

Não vou "dar uma nota" 😉 mas vou listar algumas coisas que acho que deve trocar

 

ficou sem sentido.

 

Eis o que eu fiz:

  • expliquei a razão de usar o tal botão code
  • mostrei um exemplo do inconveniente de não usar, usando seu próprio programa.
  • Vi o que estava errado no código e expliquei.
  •  E o que não estava assim muito bom considerando as práticas comuns de C eu mostrei. repetindo trechos do seu programa e mostrando exemplos quase que linha a linha
  • escrevi um exemplo comum em C usando seu código e problema, e postei
  • acrescentei até o resultado de uma execução para você não ter que rodar e ficar digitando campos antes de saber como sairia na tela

Isso é algo que talvez nem seu professor do tal primeiro semestre do curso de ciência da programação tenha feito para você.

 

E eis sua reação

 

1 hora atrás, Emanuel Gfds disse:

o cara me detonou 😐, calma po to no primeiro semestre de ciência da computação🤣

 

 

Acha mesmo que isso é algo pessoal? Conseguiu aprender algo com o que te expliquei? Leu ao menos?

 

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