Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Estrutura de repetição (for)


Posts recomendados

Pessoal, preciso de uma ajuda na seguinte questão:

Escrever  um  algoritmo,  que  leia  um  conjunto  de  23  dados,  cada  um,  contendo  o  peso  e  o código do sexo ("F" ou "M") dos alunos de uma classe, calcule e imprima:

- Maior e o menor peso da turma;

-  A média de peso dos homens;

- A média de peso da turma;

Estou com problema pra achar as médias. Tentei de várias formas e nada. Segue código: 

Program Peso_da_Turma;
Var i: integer;
        peso, menor, maior, outroPeso, pesoHomem, mediaTurma, mediaHomens: real;
        sexo: string;
Begin
  textcolor (yellow);
  writeln ('Pesos da turma. Digite f para feminino e m para masculino.');
  writeln ('   ');
  textcolor (white);
    write ('Entre com o 1º peso: ');
    readln (peso);
    write ('Entre com o sexo: ');
    readln (sexo);
    menor:= peso;
    maior:= peso;
    for i:= 2 to 5 do    //até 5 para testar.
    begin
        textcolor (white);
        write ('Entre com o ' , i , ' º peso: ');
        readln (peso);
        write ('Entre com o sexo: ');
        readln (sexo);
        begin
            if (sexo = 'm') then
                pesoHomem:= peso
        end;
        if (peso < menor) then
            menor:= peso
        else if (peso > maior) then
            maior:= peso
        else
            outroPeso:= peso;    
  end;
  mediaTurma:= (outroPeso + menor + maior) / 5;
  mediaHomens:= pesoHomem / 5;
  writeln ('Menor peso é de: ' , menor);
  writeln ('Maior peso é de: ' , maior);
  writeln ('A média de peso da turma é: ' , mediaTurma);
  writeln ('A média de peso dos homens é: ' , mediaHomens);
readkey;
End.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Alan Matos Lourenço. Seja bem vindo ao Fórum do Clube do Hardware.

 

12 horas atrás, Alan Matos Lourenço disse:

Estou com problema pra achar as médias. Tentei de várias formas e nada.

 

Certo, mas qual problema? É lá nas médias, mas o que acontece?

 

Como não sei exatamente do que se trata, vou tratar de um modo geral..

 

 

Observação inicial: eu não fiz testes no código. Apenas vou tratar do tema:

 

A primeira etapa é saber como se calcula uma média. É a base! Parece óbvio, mas é comum não darmos atenção.

 

12 horas atrás, Alan Matos Lourenço disse:

- A média de peso dos homens;

- A média de peso da turma;

 

Como não foi especificado qual tipo de média, provavelmente se trata de média aritmética simples. A partir daí, aplicar ao seu algoritmo.

 

Então, basicamente, como se calcula uma "média"? bastar "pegar a soma dos números e dividir pela quantidade desses números".

 

MAS = S/n
Citação

MAS: média aritmética simples
S: soma dos termos
n: número de termos

 

 

LOGO:

 

A média de peso dos homens é:

mediaHomens = "Soma das notas dos homens" / "Quantidade de notas dos homens"

 

Já a média de peso da turma é:

 mediaTurma = "Soma das notas da turma" / "Quantidade de notas da turma"

 

Daí é com você.

 

 

Obs. 1: se atente que a quantidade de um e outro não necessariamente são iguais. (só seria igual se todos os alunos fossem

homens)

 

Obs. 2: veja que podemos separar as conceitos, ou seja, uma coisa é "saber ou não calcular uma média", uma outra é "ter dificuldade em implementar isso no programa". Você precisa saber fazer as duas coisas, mas tem que ser nessa ordem.. para implementar algo ("criar um algoritmo"), primeiro tem que saber o que vai ser implementado ("médias").

 

 

Tente analisar o que foi dito e tente corrigir o seu código. Caso tenha dúvidas sobre algo como "como calcular uma média", ou "como implementar o cálculo de médias" (ou qualquer outra dúvida) é só postar.

 

 

No aguardo.

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

@Simon Viegas obrigado pelo retorno.

Ok, entendi como faço para calcular as médias. Meu problema antes era que na média dos homens eu estava dividindo o peso dos homens por 5 (quantidade total de alunos) e não pela quantidade de homens. Essa parte deu certo. Agora continuo com problema para fazer a média de pesos da turma porque o cálculo final sai um valor incorreto. Acredito que meu problema esteja em pegar os pesos que não entram nas variáveis menor e maior. Eu pensei que se um peso não é considerado maior e nem menor ele vai entrar em outra variável que, nesse caso, chamei de outroPeso. Só que é como se meu algoritmo não reconhecesse essa última variável. Resultado final ficou assim:
 

Program Peso_da_Turma;
Var i: integer;
        peso, peso1, menor, maior, outroPeso, pesoHomem, pesoMulher, mediaTurma, mediaHomens, cont, cont1: real;
        sexo: string;
Begin
  textcolor (yellow);
  writeln ('Pesos da turma. Digite f para feminino e m para masculino.');
  writeln ('   ');
  textcolor (white);
    write ('Entre com o 1º peso: ');
    readln (peso);
    write ('Entre com o sexo: ');
    readln (sexo);
    menor:= peso;
    maior:= peso;
    for i:= 2 to 5 do    //até 5 para testar.
    begin
        textcolor (white);
        write ('Entre com o ' , i , ' peso: ');
        readln (peso);
        write ('Entre com o sexo: ');
        readln (sexo);
            if (sexo = 'm') then
                begin
                    cont:= cont + 1;  //conta quantos são homens.
                    pesoHomem:= pesoHomem + peso;  //soma os pesos dos homens.
                end
            else
                begin
                    cont1:= cont1 + 1;
                    pesoMulher:= pesoMulher + peso;
                end;
        if (peso < menor) then
              menor:= peso
        else if (peso > maior) then
              maior:= peso
        else if (peso <> maior) and (peso <> menor) then
          begin
              outroPeso:= peso;  //recebe os pesos que não são nem maior e nem menor.
              peso1:= peso1 + outroPeso; //soma os pesos que não são considerados maior e menor.
          end;    
  end;
  mediaTurma:= (menor + maior + peso1) / 5;                    
  mediaHomens:= pesoHomem / cont;
  writeln ('Menor peso é de: ' , menor);
  writeln ('Maior peso é de: ' , maior);
  writeln ('A média de peso da turma é: ' , mediaTurma);
  writeln ('A média de peso dos homens é: ' , mediaHomens);
readkey;
End.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Alan Matos Lourenço.


1) INDENTAÇÃO DE CÓDIGO

Sempre mantenha seu código indentado. Um exemplo:

Program Peso_da_Turma;
var 
  i: integer;
  peso, peso1, menor, maior, outroPeso, pesoHomem, pesoMulher, mediaTurma, mediaHomens, cont, cont1: real;
  sexo: string;
BEGIN
TextColor(Yellow);
writeln('Pesos da turma. Digite f para feminino e m para masculino.');
writeln('');
TextColor(White);
write('Entre com o 1º peso: ');
readln(peso);
write('Entre com o sexo: ');
readln(sexo);
menor:=peso;
maior:=peso;
for i:= 2 to 5 do    //até 5 para testar.
  begin
  textcolor(white);
  write('Entre com o ',i,' peso: ');
  readln(peso);
  write('Entre com o sexo: ');
  readln(sexo);
  if (sexo = 'm') then
    begin
    cont:=cont + 1;  //conta quantos são homens.
    pesoHomem:=pesoHomem + peso;  //soma os pesos dos homens.
    end
  else
    begin
    cont1:= cont1 + 1;
    pesoMulher:=pesoMulher + peso;
    end;
  if (peso < menor) then
    menor:= peso
  else if (peso > maior) then
    maior:= peso
  else if (peso <> maior) and(peso <> menor) then
    begin
    outroPeso:=peso;  //recebe os pesos que não são nem maior e nem menor.
    peso1:=peso1 + outroPeso; //soma os pesos que não são considerados maior e menor.
    end;    
  end;
mediaTurma:=(menor + maior + peso1) / 5;                    
mediaHomens:=pesoHomem / cont;
writeln('Menor peso é de: ',menor);
writeln('Maior peso é de: ',maior);
writeln('A média de peso da turma é  : ',mediaTurma);
writeln('A média de peso dos homens é: ',mediaHomens);
readkey;
END.

 

 

 

2) PRIMEIROS DADOS

Creio que você está esquecendo de verificar os dados do primeira pessoa.

 

 

 

2) COLETA DE DADOS

O cálculo da média não tem correlação com a verificação do menor e maior. Tanto que para homens você não usa eles. Apesar de poder ser funcional, não acho uma boa ideia associar uma coisa com a outra.

 

Para "acumular o peso da turma" simplesmente acumule todos os pesos, algo como:

  readln(peso);
  write('Entre com o sexo: ');
  readln(sexo);
  pesoTurma:=pesoTurma+peso;

 

Obs.: se atentar ao item 1 também.

 

 

Para os homens, como você já faz, idem.

pesoHomens:=pesoHomens + peso;

Lembrando que a primeira leitura não está entrando na conta.. mas deveria.

 

obs.: se atente no uso do plural, para indicar que são pesos de várias pessoas,

 

 

 

3) VERIFICAÇÃO DAS MULHERES

Você inseriu pesoMulher (por sinal, seguindo o princípio acima, sugeriria pesoMulheres), mas não está usando posteriormente... e de qualquer modo essa verificação não foi solicitada. Simplesmente retire do código.

 

 

 

***

 

No aguardo.

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

@Simon Viegas Muito obrigado!

 

Aparentemente está certo, pois fiz vários testes e não ocorreu nenhum resultado incorreto. Resultado final ficou assim:

Program Peso_da_Turma;
var 
  i: integer;
  pesos, pesos1, menor, maior, pesoHomens, mediaTurma, mediaHomens, cont, pesosTurma, pesosM: real;
  sexo: string;
BEGIN
TextColor(Yellow);
writeln('pesoss da turma. Digite f para feminino e m para masculino.');
writeln('');
TextColor(White);
write('Entre com o 1º peso: ');
readln(pesos);
pesos1:= pesos1 + pesos;  //recebe o valor do primeiro peso.
write('Entre com o sexo: ');
readln(sexo);
if (sexo = 'm') then
begin
cont:= cont + 1;  //conta o primeiro sexo digitado.
pesosM:= pesos1; //recebe o valor do primeiro peso se o sexo for masculino.
end;  
menor:=pesos;
maior:=pesos;
for i:= 2 to 5 do    //até 5 para testar.
  begin
  textcolor(white);
  write('Entre com o ',i,'º peso: ');
  readln(pesos); 
  write('Entre com o sexo: ');
  readln(sexo);
  pesosTurma:= pesosTurma + pesos;
  if (sexo = 'm') then
    begin
    cont:=cont + 1;  //conta quantos são homens.
    pesoHomens:=pesoHomens + pesos;  //soma os pesoss dos homens.
    end;
  if (pesos < menor) then
    menor:= pesos
  else if (pesos > maior) then
    maior:= pesos;   
  end;  
mediaTurma:=(pesosTurma + pesos1) / 5;                    
mediaHomens:=(pesoHomens + pesosM) / cont;
writeln('');
writeln('Menor peso é de: ',menor :0:2, ' Kg');
writeln('Maior peso é de: ',maior :0:2, ' Kg');
writeln('A média de peso da turma é : ',mediaTurma :0:2, ' Kg');
writeln('A média de peso dos homens é: ',mediaHomens :0:2, ' Kg');
readkey;
END.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá

 

Algumas sugestões:

 

1) INDENTAÇÃO

27 minutos atrás, Alan Matos Lourenço disse:

if (sexo = 'm') then
begin
cont:= cont + 1;  //conta o primeiro sexo digitado.
pesosM:= pesos1; //recebe o valor do primeiro peso se o sexo for masculino.
end;

Esse trecho também precisa ser indentado...

 

 

 

2) TESTES DE MESA

Experimento só digitar pesos de homens. Aqui deu erro.

 

 

 

3) SIMPLIFICAÇÃO

Em

27 minutos atrás, Alan Matos Lourenço disse:

pesos1:= pesos1 + pesos;  //recebe o valor do primeiro peso.

 

Poderia fazer direto

pesoTurma:=pesoTurma + peso;  //recebe o valor do primeiro peso.

 

 

Em

27 minutos atrás, Alan Matos Lourenço disse:

pesosM:= pesos1; //recebe o valor do primeiro peso se o sexo for masculino.

 

Poderia fazer direto:

pesoHomens:=pesoHomens + peso;  //soma os pesos dos homens

 

Obs.: precisará ajustar lá na parte da conta.


 

 

***

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Alan Matos Lourenço.

 

14 horas atrás, Alan Matos Lourenço disse:

Acho que não entendi muito bem a parte da simplificação... 

 

Lá na leitura da primeira pessoa, dá para usar a variável que acumula diretamente... ou seja, a cada pessoa atualiza o peso. Se for homem, atualiza o peso dos homens. (no código mais abaixo tem uma demonstração)

 

 

 

Tem outros pontos:

 

1) TEXTO DE INTERAÇÃO

Vide:

16 horas atrás, Alan Matos Lourenço disse:

writeln('pesoss da turma. Digite f para feminino e m para masculino.');

 

Seria interessante inserir um texto de apresentação. Uma tela de boas vindas ou algo do tipo. Além de uma melhor interação com o usuário... Ai vai da criatividade...

 

Uma dica é você pedir para uma outra pessoa executar o programa... não explicar nada, só peça para executar.. ai vai tentando entender o que ocorre e vai ajustando. Verás que podem ocorrer alguns problemas.

 

 

 

2) DIVISÃO POR ZERO

Um dos problema é esse: se não informar nenhum homem, vai dar problema... pois vai ocorrer divisão por zero... tem que resolver isso.

 

 

 

3) CASE SENSITIVE

O Pascal é Case Sensitive para as comparações, logo, ele "sente" a diferença entre os "casos", ou seja, é «sensível a maiúsculas e minúsculas». Exemplo: 'm' é diferente de 'M'. Talvez seja interessante fazer o programa aceitar ambos.

 

Dica: ou usar as duas possibilidades no if, ou faz o uso do UpCase().

 

 

 

***

 

Segue abaixo código com algumas modificações para servir de base e exemplos. São só sugestões... ai vai analisando para o seu código e também verificando esses outros pontos citados acima.
 

Program Peso_da_Turma;
uses
  CRT;
var 
  peso :real;                    //peso da pessoal atual
  {sexo: string;}                //para um caractere usam-se char (pode apagar essa linha)
  sexo :char;                    //sexo da pessoal atual
  menor, maior,                  //menor e maior peso da turma
  pesoTurma , pesoHomens,        //soma dos pesos da turma e dos homens
  mediaTurma, mediaHomens :real; //media de peso da turma e dos homens
  contH,                         //contador de homens
  contP :integer;                //contador de pessoas (em geral)
BEGIN
textcolor(yellow);
writeln('pesoss da turma. Digite f para feminino e m para masculino.');
writeln('');
textcolor(white);
write('Entre com o 1º peso: ');
readln(peso);
{pesos1:= pesos1 + pesos;} //pode usar o "acumulador" geral diretamente (pode apagar essa linha)
pesoTurma:=pesoTurma + peso;  //recebe o valor do primeiro peso
write('Entre com o sexo: ');
readln(sexo);
if (sexo = 'm') then
  begin
  contH:= contH + 1;  //conta o primeiro sexo digitado.
  {pesosM:= pesos1;} //pode usar o "acumulador" geral diretamente (pode apagar essa linha)
  pesoHomens:=pesoHomens + peso; //recebe o valor do primeiro peso se o sexo for masculino
  end;  
menor:=peso;
maior:=peso;
for contP:= 2 to 5 do    //até 5 para testar.
  begin
  textcolor(white);
  write('Entre com o ',contP,'º peso: ');
  readln(peso); 
  write('Entre com o sexo: ');
  readln(sexo);
  pesoTurma:= pesoTurma + peso;
  if (sexo = 'm') then
    begin
    contH:=contH + 1; //conta quantos são homens.
    pesoHomens:=pesoHomens + peso; //soma os pesoss dos homens.
    end;
  if (peso < menor) then
    menor:= peso
  else if (peso > maior) then
    maior:= peso;   
  end;  
{mediaTurma:=(pesosTurma + pesos1) / 5;}
mediaTurma :=pesoTurma  / contP;
mediaHomens:=pesoHomens / contH;
writeln('');
writeln('Menor peso é de: ',menor:0:2,' Kg');
writeln('Maior peso é de: ',maior:0:2,' Kg');
writeln('A média de peso da turma é : ',mediaTurma:0:2,' Kg');
writeln('A média de peso dos homens é: ',mediaHomens:0:2,' Kg');
readkey;
END.

 

 

No aguardo.

 

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

Entendi... 

Antes, na hora da soma, não estava pegando o valor do primeiro peso, por isso eu criei uma variável pra receber o primeiro peso. Talvez o problema fosse outro e eu achei que era porque os primeiros dados estavam fora do For. Apaguei a linha como você sugeriu e deu certo.

 

5 horas atrás, Simon Viegas disse:

2) DIVISÃO POR ZERO

Um dos problema é esse: se não informar nenhum homem, vai dar problema... pois vai ocorrer divisão por zero... tem que resolver isso.

 

Também irei arrumar essa parte. Eu nem me preocupei com isso pelo fato do problema só pedir a média de peso dos homens, mas vou da um jeito pra isso. 

 

5 horas atrás, Simon Viegas disse:

Dica: ou usar as duas possibilidades no if, ou faz o uso do UpCase().

 

Normalmente eu uso o UpCase mesmo. Nesse caso foi porque acabei deixando pra depois.

 

5 horas atrás, Simon Viegas disse:

Seria interessante inserir um texto de apresentação. Uma tela de boas vindas ou algo do tipo. Além de uma melhor interação com o usuário... Ai vai da criatividade...

 

Uma dica é você pedir para uma outra pessoa executar o programa... não explicar nada, só peça para executar.. ai vai tentando entender o que ocorre e vai ajustando. Verás que podem ocorrer alguns problemas.

 

 

Obrigado pela dica. Vou dar uma pesquisada sobre tela de boas vindas pra tirar algumas ideias. Por padrão eu só uso o cabeçalho e um título mesmo porque foi a única forma que aprendi até agora. 

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!