Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

Calculadora-em-Pascal-Lazarus

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

Calculadora em Pascal (Lazarus)

Um projeto simples de calculadora desenvolvido em Pascal utilizando a IDE Lazarus que faz cálculos simples.

Funcionalidades

  • Operações Básicas: Adição, Subtração, Multiplicação e Divisão.
  • Tratamento de Erros: Não permite a divisão por zero.
  • Interface Visual: Calculadora com botões digitais e painel.

Estrutura do Código Principal

O arquivo Unit1.pas contém a lógica de eventos da calculadora:

  • todosBotoesNumericos: Captura o clique de qualquer número e exibe no visor.
  • operacao: Processa os cálculos matemáticos com base no operador selecionado.
  • subtracao, adicao`, divisao, multiplicacao: Configuram o primeiro dígito e o operador atual.
  • deleteTodos / deleteTodosCE: Limpam o visor da calculadora.

Tive dificuldade no inicio, mas tentei. Apesar de ser uma linguagem nova, tive varios conflios durante o processo. inicialmete, era necessario ter uma interface visual, então rapidinho montei ela, e fui colocando os botôes em seus devidos lugares com o objetivo de ser o mais proximo de como é a calculadora do windows.

Ao criar os botões, o Lazarus, automaticamente criou as instâncias de cada botão e tambem a do proprio form.

Por ter uma breve noção, adicinei alguma variaveis globais, para tentar criar uma calculadora que pega um valor da tela por vez e e depois captura o operador para saber qual operacao fazer.

var digitoUM: Double; // Pega o primeiro valor digitoDois : Double; // pega o segundo valor operador: Char; // salva o operador atual limparInput: Boolean; // verifica se ja posso inserir o segundo valor, dando permissao para limpar o input operadorDeclarado: Boolean; // confirma se já tem um operador definido resultado : Double; // Resultado da operacao, que será usado pela função do botão igual quando for habilitado

Para adicionar um valor na tela, clicando em cada botão, inicialmente existe para cada botão uma procedure propria, eu fiz uma para cada, mas pensei melhor sera? que existe uma forma melhor de fazer isso? como não conheço a linguuagem, pesquisei na internet: Como capturar o valor de varios botoes digitais e lançar na tela, e a IA me mostrou uma opção muito melhor do que a que eu tinha feito.

// Captura todos os botoes numericos e captura o valor dele em na string text

procedure TForm1.todosBotoesNumericos(Sender: TObject); // cada botão, meio que tem uma referencia para si memso quando passamod o parametro Sender: TObject begin

if limparInput then // usa a variavel global para fazer a verificação begin Edit1.Text := ''; // Limpa a tela para o novo número limparInput := False; // permanece falso pois ainda é o primeiro digito end;

Edit1.Text := Edit1.Text + (Sender as TButton).Caption; // caso seja o segundo ele insere o texto do botão. operacao(sender); depois de adicionado o segundo valor, ele chama o procedure operacao end;

salvou a variaveis globais,

inseriu o primeiro numero,

verifica se posso limpar a tela, permanece nao, quando for o primeiro digito.

no evento do operador, ele salva os estados, atualiza.

e apos inserir o segundo digito ele chama a função operacao

Das operações básicas Adição, subtração, multiplicação e divisão.

o codigo que está assim de uma delas, pois o resto é uma cópia, apenas alterando o operador lançado em tela.

pascal
criei uma declarac??o na interface, para cada procedura de opera????o, que s?? salva um estado, pra depois a procedure operacao usar e calcular
pascal
procedure TForm1.subtracao(Sender: TObject);
begin
      if Edit1.Text = '' then Exit; // faz uma verificação para ver se o input está vazio ou não, se sim, ele encerra a procedure
      digitoUm := StrToFloat(Edit1.Text);   // salva o o primeiro digito, transformando de string para float
      operador := (Sender as TButton).Caption[1]; // garante que estamos pegando o o primeiro caracter do caption do texto do botão clicado recentemente, 
                                                     pois a a variavel que est?? sendo gurdadado o valor ?? do tipo char.
pascal
limparInput := True;             // verifica se ja pode limpar o input
operadorDeclarado := True;         // verifica se tem o simbolo do operador
igualdade.Enabled := False;     // igual bloqueado
Edit1.text := Edit1.text + '-';
pascal
end;

Agora na procedure operacao, uma parte eu fiz, mas por pouca pratica com a linguagem e pelo curto prazo, precisei pesquisar na internet para tentar entender onde eu sempre errava.

procedure TForm1.operacao(Sender: TObject); begin digitoDois := StrToFloat(Edit1.Text); // aqui a variavel global recebe o valor do ultimo digito do input e o converte em float resultado := 0;

case Operador of '+': resultado := digitoUm + digitoDois; '-': resultado := digitoUM - digitoDois; // faz um case básico, para saber qual foi o operador usado na operação '*': resultado := digitoUM * digitoDois; '/': if digitoDois <> 0 then begin resultado := digitoUM / digitoDois; // na divisão ele verifica se por acaso o segundo digito é igual a zero, se sim, evita um erro, e apresenta ao usuario. //igualdade.Enabled := true; end else begin ShowMessage('Erro: Divisão por zero!'); // mensagem de erro. Edit1.Text := '0'; Operador := #0; // nas pesquisas, me recomendou anular dessa forma a variavel global do operador quando se usa strings. interessante. Exit; // saida do prgrama end;

end; igualdade.Enabled := true; // aqui eu ativo o botão de igual Operador := #0; // Reseta o operador para evitar repetições involuntárias limparInput := True;

Que ao ser liberado, o botão de igual ( = ), ele pega o valor da operação que foi salvo na variavel global resultado, e converte ela de float par string, e devolve para o input.s

pascal
// A operaçao principal é feita aqui

procedure TForm1.mostra(Sender: TObject); begin // botao de igual Edit1.Text := FloatToStr(resultado); end;