Ir ao conteúdo

Posts recomendados

Postado

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
Postado

@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
  • Membro VIP
Postado

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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!