Ir ao conteúdo
  • Cadastre-se
Vinícius Proença

Pascal Erro semântico (iniciante) podem me ajudar?

Posts recomendados

Bom dia, esse é o meu primeiro tópico aqui e eu gostaria de pedir desculpas pela inconveniência de tomar o tempo de vocês com erros tão toscos quanto os que cometi nesse algoritmo. Acabei de começar a disciplina de algoritmos na faculdade e já estou tendo muitos problemas com a lógica envolvendo as estruturas de repetição aninhadas e eu gostaria que me ajudassem em particular com esse algoritmo que deixarei abaixo... Estou nele a 3 dias e já não sei o que fazer, TUDO dá errado e eu já estou me achando a pessoa mais ***** da face da terra... Eu não quero que resolvam para mim, eu apenas quero entende-lo e aprender a fazer do meu próprio jeito. Desde já agradeço.

Program Pzim ;

//2. Um total de 500 alunos de uma universidade foram entrevistados. De cada um deles foram colhidas as
//seguintes informações: o código do curso que freqüenta (1-engenharia; 2-computação; 3-administração) e
//a idade. Faça um programa que processe estes dados e que forneça as seguintes informações:
//a) número de alunos por curso;
//a) número de alunos com idade entre 20 e 25 anos, por curso; e
//a) qual o curso com menor média de idade.


Var
  cda,ida,ae,ac,aa,aen,idan,acn,aan,na : real;
  resp : string;
Begin
 Repeat
  ae:=0;
  ac:=0;
  aa:=0;
   Repeat
   write('digite o número do aluno');
   readln(na);
   Write('Tecle 1 para engenharia, 2 para computação, 3 para administração e 0 para parar ');
     Readln(cda);
   Write('Digite a idade do aluno');
   readln(ida);
     if cda=1
           then begin
              ae := ae + 1;
              if (ida > 20) and (ida < 25)then 
                begin 
                aen:=aen+1;
                idan:=ida;
                end;
                
                
                
                
       if (cda =2)then 
         begin
               ac := ac + 1;
               if (ida >20 and ida <25)then 
                  begin 
                   acn:=acn+1;
                   idan:=ida;
                end;
                  
         end;
                
                    
                
            if (cda = 3) then 
                 begin
                aa := aa + 1;
                if (ida >20 and ida <25 )then 
                   begin 
                    aan:=aan+1;
                    idan:=ida;
                   end;
                
                end;
                
        Until cda = 0;
         Writeln('há mais algum estudante a ser considerado?:');
         Until resp = 'n';
     Writeln('O número de estudantes que cursam engenharia é:'ae, 'e número de estudantes com idades entre 20 e 25 anos é de:',idan );
     Writeln('O número de estudantes que cursam computação é:'ac, 'e número de estudantes com idades entre 20 e 25 anos é de:',idan );
     Writeln('O número de estudantes que cursam administração é:'aa, 'e número de estudantes com idades entre 20 e 25 anos é de:',idan );
 Readkey;  
End.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá. Seja bem vindo ao Fórum do Clube do Hardware.

 

1) IMPORTÂNCIA DA INDENTAÇÃO E ORGANIZAÇÃO

Sempre mantenha seu código indentado. O próprio PascalZim em um botão indentar.

tela1.JPG

 

Obs.: tirei também os espaços entre linhas desnecessários.

program Pzim ;
//2. Um total de 500 alunos de uma universidade foram entrevistados. De cada um deles foram colhidas as
//seguintes informações: o código do curso que freqüenta (1-engenharia; 2-computação; 3-administração) e
//a idade. Faça um programa que processe estes dados e que forneça as seguintes informações:
//a) número de alunos por curso;
//a) número de alunos com idade entre 20 e 25 anos, por curso; e
//a) qual o curso com menor média de idade.
var
cda,ida,ae,ac,aa,aen,idan,acn,aan,na : real;
resp : string;
begin
  repeat
    ae:=0;
    ac:=0;
    aa:=0;
    repeat
      write('digite o número do aluno');
      readln(na);
      write('Tecle 1 para engenharia, 2 para computação, 3 para administração e 0 para parar ');
      readln(cda);
      write('Digite a idade do aluno');
      readln(ida);
      if cda=1 then
      begin
        ae := ae + 1;
        if (ida > 20) and (ida < 25)then
        begin
          aen:=aen+1;
          idan:=ida;
        end;
        if (cda =2)then
        begin
          ac := ac + 1;
          if (ida >20 and ida <25)then
          begin
            acn:=acn+1;
            idan:=ida;
          end;
        end;
        if (cda = 3) then
        begin
          aa := aa + 1;
          if (ida >20 and ida <25 )then
          begin
            aan:=aan+1;
            idan:=ida;
          end;
        end;
      Until cda = 0;
      Writeln('há mais algum estudante a ser considerado?:');
    Until resp = 'n';
    Writeln('O número de estudantes que cursam engenharia é:'ae, 'e número de estudantes com idades entre 20 e 25 anos é de:',idan );
    Writeln('O número de estudantes que cursam computação é:'ac, 'e número de estudantes com idades entre 20 e 25 anos é de:',idan );
    Writeln('O número de estudantes que cursam administração é:'aa, 'e número de estudantes com idades entre 20 e 25 anos é de:',idan );
    Readkey;
  end.

 

Perceba que só visualmente dá para ver que tem algo errado... como, por exemplo, que tem trechos que ficaram dentro do if cda=1 then, mas não deveriam, ou seja: provavelmente esqueceu o end;. do begin desse if.

 

 

 

2) NÃO TENTE FAZER TODO PROGRAMA DE UMA VEZ

Um dos problemas no seu código é que está tentando fazer muita coisa ao mesmo tempo... Melhor ir fazendo os programas aos poucos. A medida que for implementando, coloque para compilar (Ctrl+F9). Cada estrutura nova, coloca para compilar novamente... com o tempo/experiência vai reduzindo a quantidade.

 

 

 

3) SOBRE A DEFINIÇÃO DAS NOMENCLATURAS

Sugiro refazer o código utilizando variáveis mais sugestivas. Ex.:

program Pzim;
(*
2. Um total de 500 alunos de uma universidade foram entrevistados. De cada um 
deles foram colhidas as seguintes informações: o código do curso que freqüenta
(1-engenharia; 2-computação; 3-administração) e a idade. Faça um programa que 
processe estes dados e que forneça as seguintes informações:
a) número de alunos por curso;
b) número de alunos com idade entre 20 e 25 anos, por curso; e
b) qual o curso com menor média de idade.
*)
uses
  CRT;
var
  codigoCurso :integer; //1-engenharia; 2-computação; 3-administração
  idade       :integer;  
  contAlunos  :integer;  
  somaIdades  :integer;
  mediaIdades :real;
begin
for contAlunos := 1 to 5 do
  begin
  writeln;
  writeln('(1-Engenharia, 2-Computação, 3-Administração)');
  write  ('Códgo do curso :');
  readln(codigoCurso);
  write  ('Idade          :');
  readln(idade);
  somaIdades := somaIdades + idade;
  end;
writeln;
writeln('Total alunos :', contAlunos);
writeln('Soma idades  :', somaIdades);
ReadKey;
end.

 

Então, a ideia seria efetuar testes com dados que eu sei o resultado. Eu coloquei para ler 5, mas poderia ser apenas 3 mesmo... sei lá. Queria apenas que rodasse e desse o resultado esperado... Poderia sair inserindo 2, 2, 2.. e ver se o resultado dessa soma daria 10, por exemplo. Aí testo outra coisa mais complexa... por aí vai.

 

 

 

 

4) SOBRE O REPETIÇÕES ANINHADAS

6 horas atrás, Vinícius Proença disse:

já estou tendo muitos problemas com a lógica envolvendo as estruturas de repetição aninhadas

 

Veja, no momento, o problema no seu código NÃO está no uso de aninhamentos... mas sim nas sintaxes em geral do Pascal. Seu código não compila. Aqui entra também essa questão de fazer o código aos poucos... É isso... faça um código simples. Deixe rodando legal. Quando precisar inserir um novo recurso, você vai se preocupar só com esse recurso novo, entende? a ideia é fica limitado a lógica! assuma que a sintaxe do Pascal é obrigação está rodando! :)

 

***

 

Sugiro que refaça o código. Além do código no 3), segue outro exemplo de base que poderia aproveitar:

program FCdH;
(*
2. Um total de 500 alunos de uma universidade foram entrevistados. De cada um 
deles foram colhidas as seguintes informações: o código do curso que freqüenta
(1-engenharia; 2-computação; 3-administração) e a idade. Faça um programa que 
processe estes dados e que forneça as seguintes informações:
a) número de alunos por curso;
b) número de alunos com idade entre 20 e 25 anos, por curso; e
b) qual o curso com menor média de idade.
*)
uses
  CRT;
var
  codigoCurso :integer; //1-engenharia; 2-computação; 3-administração
  idade       :integer;  
  contAlunos  :integer;  
  somaIdades  :integer;
  mediaIdades :real;
begin
repeat
  writeln;
  contAlunos := contAlunos + 1;
  writeln('ALUNO ', contAlunos);
  writeln('(1-Engenharia, 2-Computação, 3-Administração    ou 0-SAIR)');
  write  ('Códgo do curso :');
  readln(codigoCurso);
  write  ('Idade          :');
  readln(idade);
  somaIdades := somaIdades + idade;
until (codigoCurso = 0) or (contAlunos >= 5);
writeln;
writeln('Total alunos :', contAlunos);
writeln('Soma idades  :', somaIdades);
ReadKey;
end.

 

PS: compare esse código com o outro. Teoricamente o outro estava rodando certo, mas daí resolvi implementar esse opção de "0 para sair". Só essa mudança já trás diversas outros "probleminhas a mais". Tem que analisar direito o que impactar... fazer novos testes e ir ajustando. (já vi que vai dar errada a quantidade de alunos e pode dar errada a soma da idade. Precisaria ajutar). Por aí vai.

 

Para começar, sugiro que pegue o código lá do 3) e edite-o para exibir o "número de alunos por curso". Obs.: deixe esse total e a soma lá também.. apenas para servi de base. Mais pra frente você só deixa o que foi pedido de fato.

 

Qualquer coisa poste o novo código completo e onde está com dúvidas.

 

No aguardo. 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Citação

Muito Obrigado! Vou me dedicar o MÁXIMO que puder. Eu consegui resolver o algoritmo anterior, no entanto o código ficou no PC da faculdade. Assim que puder postarei ele resolvido. Agora, se não abusar muito, gostaria da sua opinião sobre a minha resolução do algoritmo abaixo... Tô no caminho ou nem? kkkk. Aguardo resposta. Muito Obrigado!

 

 

@Vinícius Proença, como o novo código trata-se de outro escopo, criei um novo tópico para ele.

 

 

Nesse tópico, vamos tratar apenas do problema inicial, ok?

 

Fico no aguardo do código.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!