nao consigo resolver esse exercicio - C/C#/C++ - Clube do Hardware
nao consigo resolver esse exercicio
C++ nao consigo resolver esse exercicio
Por BosakBS, 22 de março em C/C#/C++
BosakBS 4
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)
int i, f, m, cont1 = 0, cont2 = 0, soma1 = 0, soma2 = 0;
float PM, PF;
char sex, resp;
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 (sex == 'f')
soma1++;
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);
onde to errando?
@BosakBS erros por que você colocou %s no scanf , e poderia ser assim
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 .
BosakBS
@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
arfneto 638
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/
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()
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?
E por sua conta você está lendo 10. E os outros 140?
@arfneto eu ainda sou novo nesse mundo, ainda tentando entender como tudo funciona, nao consegui entender o que fazer ai.
1 minuto atrás, BosakBS disse:
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?
2 horas atrás, BosakBS disse:
Notei agora que usou scanf_s()
Essas rotinas que terminam por _s são chamadas "versões seguras" das rotinas originais.
scanf() ==> scanf_s()
Só que você não usou os parâmetros corretos. Você tem um livro-texto? Qual é? Uma apostila ao menos?
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.
@arfneto 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?
AdrianoSiqueira 209
teria outra dica pra me ajudar
Sim, use nomes mais sugestivos para as suas variáveis.
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...
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 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:
Quantos disseram sim: o valor de sim.
Quantos disseram não (total - sim) claro.
% 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
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
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
(sim - feminino_sim): claro devem ser os homens que disseram sim
masculino: claro deve ser o total de homens
(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.
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.