Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Erro "else não esperando" no pascalzim


Posts recomendados

Estou fazendo esse programa e fica dando o erro de ''else não esperando" espero que alguém possa me ajudar

O programa:

Program salario_funcionario;
var
  h, sb, ir, sl : real;
Begin
  Write('Informe o número de horas trabalhadas: ');
    read(h);
    sb:= h * 14.50;
    if sb <= 1200 then
     write('O valor bruto do seu salário é R$ ',sb);
     write('O desconto de I.R é R$ 0 ');
     Write('O valor líquido do seu salário é R$ ',sb);
    end
  else
    begin
     sl:= sb - (sb * 15)100;
     ir:= sb - sl
     write('O valor bruto do seu salário é R$ ',sb);
     write('O desconto de I.R é R$ ',ir);
     Write('O valor líquido do seu salário é R$ ',sl);
    end;
    readln;     
End.

 

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

@Diego A.    ele está dizendo que tem um erro de syntaxe antes do else , e é por que você esqueceu de colocar o begin depois do if / then , com mais de um comando ,  e use  ln depois do write para pular e imprimir na linha de baixo , então seu código poderia ser assim  :

Program salario_funcionario;
var
  h, sb, ir, sl : real;
Begin
  Write('Informe o número de horas trabalhadas: ');
  read(h);
  sb:= h * 14.50;
  writeln;
  if sb <= 1200 then
  begin
    textcolor(yellow);
    textbackground(lightred);
    writeln('O valor bruto do seu salário é ---> R$ ',sb:6:2  );  
    writeln;                                                    // o ln serve para pular para linha de baixo
    writeln('O desconto de I.R é --------------> R$ 0 ',ir:6:2);// o ln serve para pular para linha de baixo
    writeln;                                                    // o ln serve para pular para linha de baixo
    Writeln('O valor líquido do seu salário é -> R$ ',sb:6:2  );// o ln serve para pular para linha de baixo
  end
  else
  begin
    textcolor(white);
    textbackground(lightcyan);
    sl:= sb - (sb * 15) / 100;
    ir:= sb - sl;
    writeln('O valor bruto do seu salário é ---> R$ ',sb:6:2 );// o ln serve para pular para linha de baixo
    writeln;
    writeln('O desconto de I.R é --------------> R$ ',ir:6:2 );// o ln serve para pular para linha de baixo
    writeln;
    Writeln('O valor líquido do seu salário é -> R$ ',sl:6:2);// o ln serve para pular para linha de baixo
  end;
  readln;     
End.

 

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

  • Membro VIP

Olá a todos.

 

@Diego A., SEGUE ALGUMAS SUGESTÕES:

- pegue o seu código original e reindente;

- verás que está faltando o begin depois do if;

- revise linha a linha e veja se achar os "outro problemas"; a depender vai compilando e corrigindo (isso corrige a sintaxe, é você que precisa se preocupar com a lógica);

- após está "rodando", vá fazendo testes de efetuando correções.

- após, poste o código aqui para analisarmos... pois tem alguns trechos que poderiam ser revisados, como:

  • creio que o cálculo de porcentagem está ligeiramente incorreta; (não no resultado, mas na forma)
  • o calculo do IR está incorreto (também não no resultado, mas na forma);
  • na hora de exibir o salário liquido, não use a variável do salário bruto. Antes defina a variável sl = sb e use sl (idem: não é o resulto, mas sim a forma).
  • a exibição do resultado poderia ser um só, em vez de uma para cada caso; usaria o if e o else para auxiliar nos cálculos. A exibição do resultado ficaria depois.
  • para formatar um número real, use como sugerido por @devair1010. Mas acho que bastaria usar :1:2 (em vez de :6:2);
  • etc.

 

Obs.: se atente a fazer rodar sem erros. Após podemos te ajudar em cada ponto citado acima (ou outros pontos que vir a surgir.

 

 

Qualquer dúvida é só postar.

 

 

 

 

 

Aqui vou tentar destrinchar o que ocorreu, vamos lá:

 

Sobre:

12 horas atrás, Diego A. disse:

Estou fazendo esse programa e fica dando o erro de ''else não esperando" espero que alguém possa me ajudar

O programa:

 

O segredo é SEMPRE MANTER O CÓDIGO INDENTADO.

 

Então, como boa prática, devemos já inscrever o código de um modo que o "texto" já fique indentando... mas caso não esteja, pare e reindente todo o código. NÃO TENTE CORRIGIR UM CÓDIGO NÃO INDENTADO.

 

Se estiver utilizando o PascalZim, eu faço assim:

 

- Seleciono todo o texto (CTRL+A);

- Vou pressionando CTRL+TAB até que todo o texto fique alinhado a esquerda.

 

*a maioria dos editores dá para fazer esse mesmo processo.

 

Ficando assim:

Program salario_funcionario;
var
h, sb, ir, sl : real;
Begin
Write('Informe o número de horas trabalhadas: ');
read(h);
sb:= h * 14.50;
if sb <= 1200 then
write('O valor bruto do seu salário é R$ ',sb);
write('O desconto de I.R é R$ 0 ');
Write('O valor líquido do seu salário é R$ ',sb);
end
else
begin
sl:= sb - (sb * 15)100;
ir:= sb - sl
write('O valor bruto do seu salário é R$ ',sb);
write('O desconto de I.R é R$ ',ir);
Write('O valor líquido do seu salário é R$ ',sl);
end;
readln;     
End.

- Agora começo a indentar manualmente, ficando com algo assim:

 

Obs.: deixei um número ao lado de algumas linhas, mais abaixo explico sobre cada uma delas.

program salario_funcionario;
var
  h, sb, ir, sl : real; //[1]
begin //[2]
write('Informe o número de horas trabalhadas: ');
read(h);
sb:= h * 14.50;
if sb <= 1200 then
  write('O valor bruto do seu salário é R$ ',sb); //[3]
write('O desconto de I.R é R$ 0 '); //[4]
Write('O valor líquido do seu salário é R$ ',sb);
end //[5]



else
begin
sl:= sb - (sb * 15)100;
ir:= sb - sl
write('O valor bruto do seu salário é R$ ',sb);
write('O desconto de I.R é R$ ',ir);
Write('O valor líquido do seu salário é R$ ',sl);
end;
readln;     
End.

 

1 - a linha fica com "uma casa para direita" (2 espaços), pois está "dentro do var";

2 - o begin volta para casa anterior; (pois não está dentro do var);

3 - a linha fica com uma casa para direita, pois está dentro do if;

4 - AQUI ESTÁ O PROBLEMA: essa linha volta uma casa, ou seja: ela NÃO está dentro do if, pois o if só coloca UMA coisa dentro dele (ou uma linha, ou um begin/end);

5 - os end se relacionam com o begin livre mais próximo acima (ou a um case). No caso, está vinculando com begin principal.

 

PRONTO. Achamos o problema. Vamos provar!

 

Ao compilar, no PascalZim, vai dar algo como:

tela1.jpg

 

TRADUZINDO: o compilador achou um ELSE, onde não deveria ter. Como o Pascal, é compilado de cima para baixo, provavelmente será na linha anterior... se olharmos tem o tal do end que está vinculado ao begin principal. O que vem depois do end principal? no caso é o ".". Entende? para o PascalZim, o programa deveria ter terminado naquela end. Entendeu que deveria ficar assim:

program salario_funcionario;
var
  h, sb, ir, sl : real;
begin
write('Informe o número de horas trabalhadas: ');
read(h);
sb:= h * 14.50;
if sb <= 1200 then
  write('O valor bruto do seu salário é R$ ',sb);
write('O desconto de I.R é R$ 0 ');
Write('O valor líquido do seu salário é R$ ',sb);
end.

 

É interessante observar que o Pascal NÃO SABE O QUE VOCÊ QUER. Ele apenas analisa se a ordem dos comandos estão numa sintaxe correta ou não.. não tem como ele "adivinhar" que na verdade essas 3 linhas deveriam está vinculados ao if, ou seja, que você simplesmente "esqueceu do begin"... :D. Essa "noção do que você quer" é chamado de ABSTRAÇÃO. É algo da nossa cabeça... o objetivo é justamente fazer que o programa se comporta "COMO EU QUERO".

 

 

Veja, já de cara, só pelo fato de reindentar o código, já apareceria o problema lá no [4]... daí já veríamos que faltou o begin do if. Bastaria inserir e reindetar novamente:

program salario_funcionario;
var     
  h, sb, ir, sl : real;
begin
write('Informe o número de horas trabalhadas: ');
read(h);
sb:= h * 14.50;
if sb <= 1200 then
  begin //[6]
  write('O valor bruto do seu salário é R$ ',sb);
  write('O desconto de I.R é R$ 0 ');
  write('O valor líquido do seu salário é R$ ',sb);
  end
else
  begin
  sl:= sb - (sb * 15)100;
  ir:= sb - sl
  write('O valor bruto do seu salário é R$ ',sb);
  write('O desconto de I.R é R$ ',ir);
  write('O valor líquido do seu salário é R$ ',sl);
  end;
readln;
end.

6 - perceba que agora tem um begin após o if, logo, todo as a linhas dentro desse begin e o seu end vão ficar pelo menos uma casa para direita.

 

Pronto! agora o código está indentado.

 

RESUMINDO:

A indentação ajuda identificar falha na estrutura só de passar o olho... :). Faltam agora verificar se tem outros erros de sintaxe e/ou de lógica.

 

 

Agora vamos revisar linha a linha...:

Obs.: para facilitar a didática, já vou deixa com a sugestão de "deixar as nomenclaturas das variáveis mais sugestivas".

 

program salario_funcionario;
var     
  horasTrabalhadas :real;
  salarioBruto     :real;
  descontoIR       :real;
  salarioLiquido   :real;
begin
write('Informe o número de horas trabalhadas: ');
{read(horasTrabalhadas);} //no Pascal só use readln (com o "ln"), beleza???
readln(horasTrabalhadas);
salarioBruto := horasTrabalhadas * 14.50;
if salarioBruto <= 1200 then
  begin
  salarioLiquido := salarioBruto;
  writeln('O valor bruto do seu salário é R$ ', salarioBruto:1:2);
  {write('O desconto de I.R é R$ 0 ');}
  writeln('(*Não há desconto de IR)');
  writeln('O valor líquido do seu salário é R$ ', salarioLiquido:1:2);
  end                              
else
  begin
  salarioLiquido := salarioBruto - (salarioBruto)*(15/100);
  descontoIR := salarioBruto - salarioLiquido;
  writeln('O valor bruto do seu salário é R$ ',salarioBruto:1:2);
  writeln('O desconto de I.R é R$ ', descontoIR:1:2);
  writeln('O valor líquido do seu salário é R$ ', salarioLiquido:1:2);
  end;
readln;
end.


 

Existem vários padrões de indentação. Outra bastante comum seria com algo assim:
 

program salario_funcionario;
var
  horasTrabalhadas :real;
  salarioBruto     :real;
  descontoIR       :real;
  salarioLiquido   :real;
begin
  write('Informe o número de horas trabalhadas: ');
  readln(horasTrabalhadas);
  salarioBruto := horasTrabalhadas * 14.50;
  if salarioBruto <= 1200 then
  begin
    salarioLiquido := salarioBruto;
    writeln('O valor bruto do seu salário é R$ ', salarioBruto:1:2);
    {write('O desconto de I.R é R$ 0 ');}
    writeln('(*Não há desconto de IR)');
    writeln('O valor líquido do seu salário é R$ ', salarioLiquido:1:2);
  end
  else
  begin
    salarioLiquido := salarioBruto - (salarioBruto)*(15/100);
    descontoIR := salarioBruto - salarioLiquido;
    writeln('O valor bruto do seu salário é R$ ',salarioBruto:1:2);
    writeln('O desconto de I.R é R$ ', descontoIR:1:2);
    writeln('O valor líquido do seu salário é R$ ', salarioLiquido:1:2);
  end;
  readln;
end.

Etc. Vai do gosto. O importante que esteja indentado!!!

 

Por aí vai!!

 

Em fim, recomendo que pegue o seu código original e vá você mesmo ajustando trecho a trecho como sugerido lá no topo.. após poste o código aqui para revisarmos.

 

No aguardo.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!