Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
estou com dificuldade em resolver o seguinte exercicio!
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 algoritmo que informe:
a) a média de salário do grupo;
B) maior e menor idade do grupo;
c) quantidade de mulheres com salário até R$100,00.
Encerre a entrada de dados quando for digitada uma idade negativa. (Use o comando enquanto-faça e não use vetores ou matrizes)
o codigo abaixo que eu fiz ta ruim
obs: Eu uso o dev c++
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char sexo;
float maidg=0,meidg=0;
int sal=0,id,medsal=0,qms100=0,i,msal100=0,totslg=0,qsal=0;
system("cls");
while (id>0)
{
cout<<"\n Digite a Idade :";
cin>>id;
i++;
if (id>=0)
{
system("cls");
sexo='x';
while ((sexo!='F')&&(sexo!='M'))
{
cout<<"\n M -> para masculino";
cout<<"\n F -> para feminino\n";
cin>>sexo;
sexo = toupper(sexo);
if ((sexo!='M')&&(sexo!='F'))
{
cout<<"\n Sexo invalido\n";
system("pause");
}
}
cout<<"\n Entre com o Salario R$ ";
cin>>sal;
}
}
if (id>0)
{
totslg=totslg+sal;
qsal++;
}
if (qsal>0)
{
medsal=totslg+qsal;
}
if ((sexo=='F')&&(sal<=100))
{
msal100++;
}
if (meidg==0)
{
meidg=id;
if (id>maidg)
{
maidg=id;
}
if (id<meidg)
{
meidg=id;
}
cout<<"\n Media de Salario do Grupo R$ "<<medsal;
cout<<"\n Maior Idade do Grupo :"<<maidg;
cout<<"\n Menor Idade do Grupo :"<<meidg;
cout<<"\n Quantidade de Mulheres que Ganham ate R$ 100,00 :"<<msal100;
}
cout<<"\n";
system("PAUSE");
return EXIT_SUCCESS;
}>
Bom não compilei + me diga, o problema da erro? exibe algo errado? você soh busca otimização??
[]s
da alguns erros de saida
tipo a media do salario n sai
a menor idade vai ser a q você usa pra encerra o programa
e a maior idade tb n sai
a menor idade vai ser a q você usa pra encerra o programa
Você tem -25 anos? A idade negativa é usada p/ encerrar o loop e não deve ser contada como idade real.
Veja se isso funciona (estou sem compilador):
#include <iostream>
using namespace std;
int main(void) {
int idade = 0;
char sexo = ' ';
bool firstSexo = true;
int menorIdade, maiorIdade;
bool firstIdade = true;
float salario;
int qtdeMSalario = 0; // Quantidade de mulheres com salario até 100,00.
int qtdePessoas = 0;
float somaSalarios = 0F;
while (idade > -1) {
cout << "Digite a Idade :";
cin >> idade;
if (idade > 0) {
if (firstIdade) {
menorIdade = maiorIdade = idade;
firstIdade = false;
} else {
menorIdade = (idade < menorIdade)? idade : menorIdade;
maiorIdade = (idade > maiorIdade)? idade : maiorIdade;
}
while (sexo != 'F' && sexo != 'M') {
if (!firstSexo)
cout << "Sexo inválido!" << endl;
cout << "Informe o sexo (M = masculino, F = Feminino): ";
cin >> sexo;
sexo = toupper(sexo);
firstSexo = false;
}
cout << "Digite o salário: ";
cin >> salario;
if (sexo == 'M' && salario <= 100.00)
qtdeMSalario++;
somaSalarios += (float) salario;
qtdePessoas++;
}
}
cout << "Média salarial: " << salario/qtdePessoas << endl;
cout << "Qtde mulheres salario <= 100.00: " << qtdeMSalario << endl;
cout << "Menor idade: " << menorIdade << endl;
cout << "Maior idade: " << maiorIdade << endl;
return 0;
}Olá!
Erros do meu compilador:
Variável id sendo usada sem ser inicializada.Variável i sendo usada sem ser inicializada.
Sugestões ao seu programa:
Tente adicionar comentários ao seu código, não fazem mal a ninguém, não alteram na compilação do seu código e deixam ele muito mais legível. C++ não é modificada por espaços ou enters. O fim da expressão não precisa ser na mesma linha em que ela começou. Ele é demarcado somente e só pelo ; . Torne o texto tão legível quanto puder. C++ já é complexo, se você não escreve ele de um jeito legível, aí fica impossível.
Dê nomes completos para as varíavels (exemplo: int ex; Ex tem muitos significados. Exemplo, Exemplos, Experiência, entre vários outros. Se você colocar int experiencia_ganha; sabe-se facilmente para que ela serve).
Usar por exemplo, maidg e meidg, você mudou uma letra, o que isso muda? Fica fácil de confundir, difícil de entender para os outros etc. Simplifique as coisas, escrevendo nomes inteiros para as variáveis, e bem definidos. Se possível, adicione um comentário após a declaração da variável, para que não deixe dúvidas mesmo.
Sobre o que você escreveu: Inicialize as variáveis 'id' e 'i' antes de usá-las.
No primeiro while, como id seria maior que 0, se ele não tem valor? Aí pula para o próximo IF, que também precisa usar o id, e aí seu programa não funciona.
Tabule ele direito, está uma confusão. Use <TAB>, ou 4 espaços, não um, 2. Volte o mesmo número de <TABS> ou espaços que avança, senão vira confusão, como está.
totslg=totslg+sal;
Isso para mim é grego. Imagine se estivesse assim, como seria melhor e mais fácil de entender:
totslg = totslg + sal;
Ou ainda, se preferir:
totslg = (totslg + sal);
Outro exemplo:
while ((sexo!='F')&&(sexo!='M'))
Olha como fica mais fácil de entender:
while( (sexo != 'F') && (sexo != 'M') )
Ainda que eu não seja a favor de usar o operador ? para criar exemplos para iniciantes, o exemplo da _Isis_ está certinho, apenas falta um .0 entre o 0 e o F, para identificar um float.
float somaSalarios = 0.0F;
Abraços :D
Evil, eu li em algum livro (talvez do Walter Savitch) que o ponto-flutuante padrão é double e se você quer mesmo declarar um float é necessário especificar a letra F. Não lembro de nenhuma menção ao ponto decimal ser necessária nesse caso. Fui ver no draft do último C++ e a árvore de derivação é essa:
floating-literal:
fractional-constant exponent-partopt floating-suffixopt
digit-sequence exponent-part floating-suffixopt
fractional-constant:
digit-sequenceopt . digit-sequence
digit-sequence .
exponent-part:
e signopt digit-sequence
E signopt digit-sequence
sign: one of
+ -
digit-sequence:
digit
digit-sequence digit
floating-suffix: one of
f l F L
O que é estranho é você considerar que dá p/ escrever "7." a partir de floating-literal. E ali também diz que o sufixo é opcional. Interpretações diversas?
Pois é, se você escrever 7. se não estou enganado dá certo sim, mas é melhor colocar 7.0 para não deixar dúvidas...
O que eu sei e que li em vários livros é que se você colocar por exemplo "7" ao invés de "7.0", o 7 será considerado como um inteiro, mesmo se armazenado em um double ou float, e se colocar "7.0" será considerado como um número decimal. Adicionando o "F" ou "f" passa a ser um float. O compilador da MICRO$OFT imprime um erro de compilação caso você adicionar o "F" e não tiver parte decimal, por isso eu disse o que disse... e isso até resolve alguns problemas, pois já ouvi falar de erros em que, por exemplo, você divide um double com o valor inteiro (sem a parte decimal) por um com parte decimal (ou o contrário, não lembro) e o resultado acabava ficando diferente, sendo inteiro...
É sempre bom garantir para funcionar em todos os compiladores e ter certeza de que é um double...
Bom, sobre double ser o padrão, isso eu não sei, mas deve ser sim, igual a int ser o padrão e ter um tipo inteiro menor, o short.
Abraços :D
Mas então se o 7 for considerado inteiro mesmo numa variável float ou double, pra quê precisamos informar o tipo né...O C++0X diz que vai adicionar inferência de tipos (#medo)
Agora que consegui abrir o G++ vi que ele dá o erro que você comentou sobre o número sem parte decimal.
Olá!
Pois é... mas especificamos o tipo para termos controle e sabermos o que está ocorrendo direitinho, sem probleminhas...
Aliás, você soube que o C++0x vai sair esse ano sendo o c++11?
Mas então, abraaoduarte, conseguiu entender o exemplo da _Isis_?
Qualquer dúvida é só falar.
Abraços :D
Bom não compilei + me diga, o problema da erro? exibe algo errado? você soh busca otimização??
[]s