Ir ao conteúdo
  • Cadastre-se

C++ nao consigo resolver esse exercicio


BosakBS

Posts recomendados

Uma certa empresa fez uma pesquisa de mercado para saber se as pessoas gostaram ou não do seu último produto lançado. Para isto, coletou o sexo do entrevistado e a sua resposta (sim ou não). Sabendo que foram entrevistadas 150 pessoas, fazer um algoritmo que calcule e mostre ao final: • O número de pessoas que responderam sim; • O número de pessoas que responderam não; • A percentagem de pessoas do sexo feminino que responderam sim; • A percentagem de pessoas do sexo masculino que responderam não; Para a resposta SIM/NÃO. Utilize uma variável do tipo CHAR, que armazena S ou N, ou use uma variável do tipo INT que armazena 1 (para SIM) e 2 (para NÃO) 

 

 

 

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

int main()
{

    int i, f, m, cont1 = 0, cont2 = 0, soma1 = 0, soma2 = 0;
    float PM, PF;
    char sex, resp;


    for (i = 1; i <= 10; i++) {

        printf("Digite o sexo da pessoa(m para masculino e f para feminino):\n");
        scanf_s("%s", &sex);

        printf("Digite a Resposta da pessoa(s para sim e n para nao):\n");
        scanf_s("%d", &resp);

        if (resp == 's') {
            cont1++;
            if (sex == 'f')
                soma1++;
        }
        else {
            cont2++;
            if (sex == 'm')soma2++;
        }
    }

    PM = (float)(soma1 * 100) / (cont1 + cont2);
    PF = (float)(soma2 * 100) / (cont1 + cont2);
    printf("O nuumero de pessoas que responderam sim e: %d\n", cont1);
    printf("O nuumero de pessoas que responderam nao e: %d\n", cont2);
    printf("A porcentagem de pessoas do sexo feminino que responderam sim e: %.2f\n", PM);
    printf("A porcentagem de pessoas do sexo masculino que responeram nao e: %.2f\n", PF);


    system("pause");
    return 0;
}

 

onde to errando?

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

11 minutos atrás, devair1010 disse:

@BosakBS    erros por que você colocou %s no scanf , e poderia ser assim  


fflush(stdin);
scanf("%c",&sex);

o fflush é por que mudou de tipo e precisa limpar o buffer do teclado , senão ele passa direto pelos outros scanf , então coloque isso antes de todos os scanf .

@devair1010 coloquei mas na hora de rodar o codigo, ele fica repentindo os printf, como se tivesse um laço de repetição que nao deixasse seguir o algoritmo

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

5 minutos atrás, devair1010 disse:

o fflush é por que mudou de tipo e precisa limpar o buffer do teclado , senão ele passa direto pelos outros scanf , então coloque isso antes de todos os scanf

 

Cuidado: fflush() só atua na saída. 

 

Veja essa nota em http://www.cplusplus.com/reference/cstdio/fflush/

If the given stream was open for writing (or if it was open for updating and the last i/o operation was an output operation) any unwritten data in its output buffer is written to the file.
If stream is a null pointer, all such streams are flushed.
In all other cases, the behavior depends on the specific library implementation. In some implementations, flushing a stream open for reading causes its input buffer to be cleared (but this is not portable expected behavior).

Ou essa em https://www.geeksforgeeks.org/use-fflushstdin-c/

Can we use it for input stream like stdin?
As per C standard, it is undefined behavior to use fflush(stdin). However some compilers like Microsoft visual studio allows it allow it. How is it used in these in these compilers? While taking an input string with spaces, the buffer does not get cleared for the next input and considers the previous input for the same. To solve this problem fflush(stdin) is. used to clear the stream/buffer

A implementação da Microsoft parece atuar na entrada, mas não é oficial. Não está no padrão e não vai funcionar em outros sistemas e pode parar de funcionar com a Microsoft se a compania resolver seguir o padrão. 

 

Em geral é mais seguro mudar a máscara de scanf() ou ler o que tem até o '\n' inclusive, antes de tentar ler outro valor. Ou não usar scanf() para isso, já que scanf() foi feita para ler entrada formatada e o teclado por certo não é assim: o cara pode digitar o que quiser.

Ou mesmo escrever flush() em seu prgrama. Ou fflush() claro

void    flush()
{
    do { int ch = getc(stdin); } while ((ch != '\n') && (ch!= EOF));
};	// flush()

 

adicionado 4 minutos depois
1 hora atrás, BosakBS disse:

Sabendo que foram entrevistadas 150 pessoas, fazer um algoritmo que calcule e mostre ao final: • O número de pessoas que responderam sim; • O número de pessoas que responderam não; • A percentagem de pessoas do sexo feminino que responderam sim; • A percentagem de pessoas do sexo masculino que responderam não; Para a resposta SIM/NÃO. Utilize uma variável do tipo CHAR, que armazena S ou N, ou use uma variável do tipo INT que armazena 1 (para SIM) e 2 (para NÃO)

 

Que enunciado besta. Nada fala sobre ler os valores, no entanto fala sobre uma hipotética resposta SIm/Não. Mas claramente fala sobre 150. Assim sendo seria o caso de ficar em frente ao terminal digitando 150 grupos de dados, Sério?

adicionado 6 minutos depois

E por sua conta você está lendo 10. E os outros 140?

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

1 minuto atrás, BosakBS disse:

@arfneto eu ainda sou novo nesse mundo, ainda tentando entender como tudo funciona, nao consegui entender o que fazer ai.


Entendo. Só estou dizendo que o enunciado 'medíocre e fala claramente em uma amostra com 150 resultados

 

Trocou o %s por %c lá no scanf()? Porque declarou as duas variáveis como char e leu uma com %s e a outra com %d?

 

Ou já alterou isso?  Entendeu o que o pessoal falou sobre "limpar"a entrada do teclado?

adicionado 20 minutos depois
2 horas atrás, BosakBS disse:

scanf_s("%s", &sex);

 

Citação

Notei agora que usou scanf_s() 

 

Essas rotinas que terminam por _s são chamadas "versões seguras" das rotinas originais.

Citação

scanf() ==> scanf_s()

 

Só que você não usou os parâmetros corretos. Você tem um livro-texto? Qual é? Uma apostila ao menos? 

 

Citação

scanf_s() usa dois argumentos para cada especificador %c

 

Então deve escrever

	n =        scanf_s("%c", &sex, 1); // por exemplo

Indicando que espera ler 1 letra apenas

 

Toda a família scanf() retorna um valor. Use! É melhor para você. Deve retornar 1 quando conseguir ler um valor. Pode parecer irrelevante mas no futuro talvez note que isso é algo importante. scanf() foi escrita or gente muito esperta. Alguns dos melhores da história e tudo lá tem uma razão de ser.

 

 

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

O enunciado pede apenas que se faça a contabilização dos dados, não pede que estes sejam digitados, apenas verificar as quantidades suas porcentagens e informar ao final dos cálculos. Ler e interpretar faz parte do exercício, isto evita trabalho desnecessário e consequente perda de tempo...

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

2 horas atrás, BosakBS disse:

fiquei sem internet ontem, eu tenho as apostilas das aulas, mas n entendi mt bem com elas, vou alterar o scanf, tirando isso, teria outra dica pra me ajudar a fazer o algoritmo realizar o pedido do enunciado?

 

Não é pra tirar nada e sim colocar. Use o valor de retorno de scanf_s() ou QUALQUER função dessa família. E coloque o 1 lá como eu te mostrei. É melhor pra você. Para as situações que precisa controlar, isso serve:

    int total = 0;
    int sim = 0;
    int feminino_sim = 0;
    int masculino = 0;
    int masculino_nao = 0;
    int N = ??; // o total que vai ler

E considere muito o que @AdrianoSiqueira disse: se em um programa de 20 linhas você fica em dúvida sobre o que é soma, cont1 e cont2 imagine num programa maior... 

 

Veja a lista acima: é claro o que é cada coisa, como é claro de onde vai tirar as respostas. Não precisa sequer da variável de porcentagem porque só vai calcular e mostrar...

 

Vou dizer algo pobre: seja metódico

 

São só 4 perguntas:

  1. Quantos disseram sim: o valor de sim.
  2. Quantos disseram não :D (total - sim) claro.
  3. % das mulheres que disseram sim. Como eu disse antes, esse enunciado é medíocre. Não sei onde vai entrar o 150 por exemplo. E a porcentagem teria que estar melhor qualificada: seria a porcentagem em relação à amostra toda ou em relação às mulheres? Ficando com o que o idioma português sugere, vamos considerar as porcentagens em relação ao total de amostras do mesmo sexo. E você tem duas possibilidades: se não tem nenhuma mulher a porcentagem é zero. Se tem alguma mulher a conta é simples e não tem a ver com C
    Se:
    
    feminino_sim: tem o total de mulheres que disseram sim, dá pra imaginar
    o total de mulheres é claro (total - masculino) já que dá pra imaginar o que são total e masculino
    
    Então:
    feminino_sim / (total - masculino): é a proporção de mulheres
    100.0 * isso: é a tal porcentagem.
    
    4. % dos homens que disseram não: tem as mesmas considerações: 0% se não tem nenhum homem no grupo. Se tem algum
    Se
    
    (sim - feminino_sim): claro devem ser os homens que disseram sim
    masculino: claro deve ser o total de homens
    
    Então
    
    (masculino - (sim - feminino_sim): devem ser os homens que disseram não
    masculino: tem o total de homens
    (masculino - (sim - feminino_sim)) / (masculino)) é a proporção de homens que responderam não
    100.0 * isso: a tal porcentagem.


Claro que você pode usar as cinco possíveis variáveis e não ter que pensar nisso, mas essa é uma solução possível. Lógico que você tem que acumular esses valores durante a leitura dos N casos, que deveriam ser 150.

 

O lado C

 

Como todas as variáveis são inteiras, usar a constante 100.0 na expressão obriga o compilador C a converter o resultado da expressão para ponto flutuante e você pode imprimir com as decimais, usando por exemplo %6.2f no printf(). Como o '%' é especial em printf() você precisa usar '%%' para imprimir um '%' na saída.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!