Não consigo encontrar o erro e/ou o que falta (C/C++)

1. Não consigo encontrar o erro e/ou o que falta (C/C++)

Felipe Rosa Neto
feliperosaneto6

(usa Outra)

Enviado em 07/04/2015 - 14:59h

Boa tarde galera, como vocês estão ?

Bom vamos ao assunto

1. Uma pesquisa realizada em uma determinada população deve retornar como resultados:
- quantidade de homens
- quantidade de mulheres
- salario medio do grupo
- salario medio das mulheres


*Programa

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
main ()
{
int selecao, i, genero, qtdrep, qtdh, qtdm, qtdg;
// qtdrep= quantidade de repetição, qtdh= quantidade de homens, qtdm= quantidade de mulheres
float salariohomem, salariomulher, salariototalh, salariototalm, salariostotal, salariosm;
printf("Digite 1 para repetir 10x ou 2 para selecionar outra quantidade:");
scanf("%d", &selecao);
if(selecao == 1){
for(i=1;i<=10;i++){
printf("Digite 1 se for homem ou 2 se for mulher:");
scanf("%d", &genero);
if(genero == 1){
printf("Digite o salario:");
scanf("%f", &salariohomem);
printf("o salario do homem e de:%.2f", salariohomem);
printf("\n\n\n");
}
else{
printf("Digite o salario:");
scanf("%f", &salariomulher);
printf("o salario da mulher e de:%.2f", salariomulher);
printf("\n\n\n");
}
}
salariostotal = (salariohomem+salariomulher)/10;
printf("O salario medio total de todos os membros e:%.2f", salariostotal);
}
else{
printf("digite a quantidade de repeticoes:");
scanf("%d", &qtdrep);
for(i=1;i<=qtdrep;i++){
printf("Digite 1 se for homem ou 2 se for mulher:");
scanf("%d", &genero);
if(genero == 1){
qtdh=1;qtdh++;
printf("Digite o salario:");
scanf("%f", &salariohomem);
printf("\n\n\n");
}
else{
qtdm=1;qtdm++;
printf("Digite o salario:");
scanf("%f", &salariomulher);
printf("\n\n\n");
}
}
salariostotal = (salariohomem*qtdh)+(salariomulher*qtdm)/qtdrep;
salariototalm = salariomulher/qtdm;
printf("O numero de homens e %d , e de mulheres e %d \n", qtdh,qtdm);
printf("O salario medio total de todos os membros e:%.2f\n", salariostotal);
printf("O salario medio total das mulheres e:%.2f\n", salariototalm);
}
getch();
}


  


2. Re: Não consigo encontrar o erro e/ou o que falta (C/C++)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/04/2015 - 18:44h

Você não disse quais dificuldades está tendo, então eu vou falar de modo genérico também sobre problemas que eu encontrei:

- (Técnico) Seu código utiliza um dialeto obsoleto do C, que não vai compilar com compiladores recentes. Em particular, assumir implicitamente que o tipo de retorno de main() ou de qualquer outra função pode ser omitido e que, nesse caso, ele é int é algo que foi explicitamente retirado da linguagem.

- (Técnico) Se o tipo de retorno é int, então você deve explicitamente chamar o comando return ou a função exit() com um valor inteiro antes do programa chegar ao final.

- (Técnico) A inclusão de <conio.h> e a chamada a getch() não têm utilidade nenhuma no programa.

- (Lógica/Matemática) Todos os cálculos de salários médios estão errados. Programar é uma arte e, portanto, admite e requer criatividade. Matemática, por outro lado, não é arte. Ainda que alguns campos da Matemática possam se beneficiar de imaginação (que é uma coisa diferente de criatividade), sua tarefa não está nesses campos: você só tem de calcular uma média aritmética simples, e o único jeito certo de fazer isso é dividindo o valor da soma de todas as parcelas pela quantidade de parcelas.

- (Lógica) Se você diz “qtdh=1;qtdh++;”, na prática está sempre fazendo tão-somente qtdh=2;. Se isso não é o que você quer -- eu não creio que seja, até porque está dentro de um laço de repetição e esse valor será usado no cálculo do salario médio --, tem de dizer ao computador o que realmente quer, pois ele faz o que você diz para fazer, não o que você gostaria que ele fizesse. Problema semelhante existe com qtdm.

- (Interface com usuário/Lógica) Por que a distinção entre entrar dez pessoas ou N pessoas? Os dois blocos de código acabam se parecendo muito, e vão ficar ainda mais parecidos -- eu diria até que absolutamente iguais -- quando você corrigir os problemas com cálculos dos salários médios. Eu até entenderia, e acharia útil, código especializado para abreviar a entrada de múltiplos dados absolutamente idênticos (i.e. N pessoas com o mesmo sexo e mesmo salário, sem ter de digitar um por um), mas não é isso que está no seu código. Foi o enunciado do problema que mandou você fazer do jeito como fez, ou foi ideia sua? Se não foi o enunciado que pediu, não invente, para não se complicar.

- (Interface com usuário) A interface com o usuário é muito verborrágica. Foi pedido para ser assim, ou você escolheu ser assim? Se foi pedido no enunciado, então assim deve ser. No entanto, se for uma questão de escolha, eu preferiria um programa que soubesse tratar uma entrada no seguinte formato.

H 1500.00
M 1650.00
H 1700.00
M 1600.00
H 1000.00
(Fim de arquivo)


- (Política/Polêmica) Gênero é uma categoria gramatical, podendo ser masculino e feminino (ou noutras línguas, que não o Português, neutro, ou ainda humano/não-humano, racional/irracional, animado/inanimado, móvel/imóvel, concreto/abstrato). O uso dessa terminologia, em oposição a sexo, que é uma categoria biológica objetiva, é para, por meio de confusão, facilitar a dissolução da realidade objetiva e promover o relativismo e a subjetividade, assim subvertendo o processo cognitivo da sociedade vigente, com o objetivo estratégico de facilitar a transição para outro modelo de sociedade. Nesse processo deliberado de confusão ontológica entram, além da biologia (humano macho/homem vs. humano fêmea/mulher) e gramática (masculino vs. feminino vs. neutro), componentes tais como preferências sexuais, relacionais, sociais, psicológicas e até mesmo estéticas.

Como ninguém nunca soube me dizer que forma terá a nova sociedade pós-destruição-desta-que-temos, e como eu trabalho com informática, em que modelar o indefinido é um problema muito mais difícil do que trabalhar com modelos da realidade objetiva, eu me recuso a jogar pedras no meu próprio telhado ou a cuspir para cima, bem como a usar o vocabulário de quem assim procede. Há quem me chame, por isso, de conservador (OK) ou de reacionário (besteira, pois o meu pensamento seria o mesmo se não existissem os revolucionários), mas a verdade pura e simples é que eu valorizo antes de tudo a coerência. Por isso, da mesma forma como eu aponto as contradições ontológicas no discurso revolucionário da confusão proposital, eu diria que não é coerente, no mesmo programa, falar em gênero e, ao mesmo tempo, fazer a distinção biológica entre homem e mulher.


3. Re: Não consigo encontrar o erro e/ou o que falta (C/C++)

Raphael Oliveira
rapharocket

(usa Solus)

Enviado em 07/04/2015 - 18:59h

paulo1205 escreveu:

Você não disse quais dificuldades está tendo, então eu vou falar de modo genérico também sobre problemas que eu encontrei:

- (Técnico) Seu código utiliza um dialeto obsoleto do C, que não vai compilar com compiladores recentes. Em particular, assumir implicitamente que o tipo de retorno de main() ou de qualquer outra função pode ser omitido e que, nesse caso, ele é int é algo que foi explicitamente retirado da linguagem.

- (Técnico) Se o tipo de retorno é int, então você deve explicitamente chamar o comando return ou a função exit() com um valor inteiro antes do programa chegar ao final.

- (Técnico) A inclusão de <conio.h> e a chamada a getch() não têm utilidade nenhuma no programa.

- (Lógica/Matemática) Todos os cálculos de salários médios estão errados. Programar é uma arte e, portanto, admite e requer criatividade. Matemática, por outro lado, não é arte. Ainda que alguns campos da Matemática possam se beneficiar de imaginação (que é uma coisa diferente de criatividade), sua tarefa não está nesses campos: você só tem de calcular uma média aritmética simples, e o único jeito certo de fazer isso é dividindo o valor da soma de todas as parcelas pela quantidade de parcelas.

- (Lógica) Se você diz “qtdh=1;qtdh++;”, na prática está sempre fazendo tão-somente qtdh=2;. Se isso não é o que você quer -- eu não creio que seja, até porque está dentro de um laço de repetição e esse valor será usado no cálculo do salario médio --, tem de dizer ao computador o que realmente quer, pois ele faz o que você diz para fazer, não o que você gostaria que ele fizesse. Problema semelhante existe com qtdm.

- (Interface com usuário/Lógica) Por que a distinção entre entrar dez pessoas ou N pessoas? Os dois blocos de código acabam se parecendo muito, e vão ficar ainda mais parecidos -- eu diria até que absolutamente iguais -- quando você corrigir os problemas com cálculos dos salários médios. Eu até entenderia, e acharia útil, código especializado para abreviar a entrada de múltiplos dados absolutamente idênticos (i.e. N pessoas com o mesmo sexo e mesmo salário, sem ter de digitar um por um), mas não é isso que está no seu código. Foi o enunciado do problema que mandou você fazer do jeito como fez, ou foi ideia sua? Se não foi o enunciado que pediu, não invente, para não se complicar.

- (Interface com usuário) A interface com o usuário é muito verborrágica. Foi pedido para ser assim, ou você escolheu ser assim? Se foi pedido no enunciado, então assim deve ser. No entanto, se for uma questão de escolha, eu preferiria um programa que soubesse tratar uma entrada no seguinte formato.

H 1500.00
M 1650.00
H 1700.00
M 1600.00
H 1000.00
(Fim de arquivo)


- (Política/Polêmica) Gênero é uma categoria gramatical, podendo ser masculino e feminino (ou noutras línguas, que não o Português, neutro, ou ainda humano/não-humano, racional/irracional, animado/inanimado, móvel/imóvel, concreto/abstrato). O uso dessa terminologia, em oposição a sexo, que é uma categoria biológica objetiva, é para, por meio de confusão, facilitar a dissolução da realidade objetiva e promover o relativismo e a subjetividade, assim subvertendo o processo cognitivo da sociedade vigente, com o objetivo estratégico de facilitar a transição para outro modelo de sociedade. Nesse processo deliberado de confusão ontológica entram, além da biologia (humano macho/homem vs. humano fêmea/mulher) e gramática (masculino vs. feminino vs. neutro), componentes tais como preferências sexuais, relacionais, sociais, psicológicas e até mesmo estéticas.

Como ninguém nunca soube me dizer que forma terá a nova sociedade pós-destruição-desta-que-temos, e como eu trabalho com informática, em que modelar o indefinido é um problema muito mais difícil do que trabalhar com modelos da realidade objetiva, eu me recuso a jogar pedras no meu próprio telhado ou a cuspir para cima, bem como a usar o vocabulário de quem assim procede. Há quem me chame, por isso, de conservador (OK) ou de reacionário (besteira, pois o meu pensamento seria o mesmo se não existissem os revolucionários), mas á verdade pura e simples é que eu valorizo antes de tudo a coerência. Por isso, da mesma forma como eu aponto as contradições ontológicas no discurso revolucionário da confusão proposital, eu diria que não é coerente, no mesmo programa, falar em gênero e, ao mesmo tempo, fazer a distinção biológica entre homem e mulher.


Gostei do texto. Bravo! :)


4. Re: Não consigo encontrar o erro e/ou o que falta (C/C++)

Felipe Rosa Neto
feliperosaneto6

(usa Outra)

Enviado em 08/04/2015 - 07:59h

Desculpe-me, esqueci, estou tendo problemas no loop, e no armazenamento dos dados, sempre que entramos com 2 ou mais repetições, ele armazena apenas o ultimo numero, sendo assim, os números dos cálculos estão sempre errados, e infelizmente foi o meu professor que pediu assim :/


5. Re: Não consigo encontrar o erro e/ou o que falta (C/C++)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/04/2015 - 18:20h

O programa não pede para você guardar uma memória de todos os números digitados, pede? Você só tem de calcular médias aritméticas simples. Logo, você só tem de armazenar os totais acumulados e lembrar da quantidade de parcelas. Não invente moda; faça o que foi pedido.


6. Erro de lógica

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/04/2015 - 21:03h

Você precisa armazenar o total da soma dos salarios numa variavel para utilizar depois, no seu código, em todo loop para ler um novo salario o valor anterior é substituido pelo ultimo e por isso seu programa só utiliza o ultimo valor inserido;

aqui vai um código parecido com o seu, mas eu resolvi esses problemas nele:


#include <stdio.h>
#include <stdlib.h>
/*
qtdm = quantidade de mulheres;
qtdh = quantidade de homens;
qtdrep = numero de repetições;

salh = salario homem;
salm = salario mulher;
saltotal = soma de todos os salarios;
saltotalm = soma dos salarios das mulheres;
saltotalh = soma dos salarios dos homens;
mediam = media dos salarios das mulheres;
mediah = media dos salarios dos homens;
mediatotal = media de todos os salarios;

*/
int main (void)
{
int selecao, i, genero, qtdh=0, qtdm=0, qtdrep;
float salh, salm, saltotal, saltotalm = 0, saltotalh = 0, mediam, mediah, mediatotal;

printf ("digite 1 para repetir 10x\nou 2 para repetir n vezes");
scanf (" %d", &selecao);

if (selecao == 1)
{
for (i=0, qtdrep = 10; i<qtdrep; i++)
{
printf ("digite 1 caso homem\n2 caso mulher: "); scanf (" %d", &genero);
if (genero == 1)
{
printf ("Digite o salario: "); scanf (" %f", &salh);
saltotalh += salh;
saltotal += salh;
qtdh++;
printf("o salario do homem e de:%.2f", salh);
puts ("\n");
}
if (genero == 2)
{
printf ("Digite o salario: "); scanf (" %f", &salm);
saltotalm += salm;
saltotal += salm;
qtdm++;
printf("o salario da mulher e de:%.2f", salm);
puts ("\n");
}
else
{
printf ("opcao desconhecida!!\n"); return 0;
}
}
}
else if (selecao == 2)
{
printf ("Digite o numero de repeticoes: "); scanf (" %d", &qtdrep);
puts ("\n");
for (i=0; i<qtdrep; i++)
{
printf ("digite 1 caso homem\n2 caso mulher: "); scanf (" %d", &genero);
if (genero == 1)
{
printf ("Digite o salario: "); scanf (" %f", &salh);
saltotalh += salh;
saltotal += salh;
qtdh++;
printf("o salario do homem e de:%.2f", salh);
puts ("\n");
}
if (genero == 2)
{
printf ("Digite o salario: "); scanf (" %f", &salm);
saltotalm += salm;
saltotal += salm;
qtdm++;
printf("o salario da mulher e de:%.2f", salm);
puts ("\n");
}
}
}
else
{
printf ("opcao desconhecida!!"); return 0;
}

mediah = saltotalh/qtdh;
mediam = saltotalm/qtdm;
mediatotal = saltotal/qtdrep;
printf("O numero de homens e %d , e de mulheres e %d \n", qtdh,qtdm);
printf("O salario medio total de todos os membros e:%.2f\n", mediatotal);
printf("O salario medio total das mulheres e:%.2f\n", mediam);
getchar();
}



nota: se estiver compilando no linux use #include <stdio_ext.h> pois inclui algumas bibliotecas para prevenir erros, por exemplo fflush() que deveria limpar o buffer no linux mas nao funciona corretamente, com stdio_ext.h você tem __fpurge(), que faz o que se espera do fflush;

espero estar ajudando apesar de ter demorado tanto...






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts