Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Calculadora com procedure e função


Posts recomendados

Program Calculadora ;

Uses crt;

Var opt: char;
    x, y, z: real;
    M: array [1..4, 1..4] of real;
    i, j: integer;
        
{Função para calcular os resultados}
Function Calculo (x:real; y:real; z:real): real;
begin
    Case opt of
                #43: begin
              z:= x+y
            end;
            #45: begin
              z:= x-y
            end;
            #42: begin
              z:= x*y
            end;
            #47: begin
              z:= x / y;
              if y = 0 then
              begin
                Writeln('Divisão inválida, digite um número diferente de zero para o divisor ');
              end;
            end;
    end;
    Calculo:= z            
end;

{Procedure para adição}
Procedure Adicao;
begin
  clrscr;
  writeln;
  writeln ('Insira a primeira parcela');
  readln (x);
  writeln;
  writeln('+');
  writeln;
  writeln ('Insira a segunda parcela');
  readln(y);
  writeln;
  writeln(Calculo(x, y, z):0:2);
  readkey;
  clrscr;
end;

{Procedure para a subtração}
Procedure Sub;
begin
    clrscr;
    writeln;
    writeln ('Insira o minuendo');
    readln (x);
    writeln;
    writeln('-');
    writeln;
    writeln ('Insira o subtraendo');
    readln(y);
    writeln;
    writeln(Calculo(x, y, z):0:2);
    readkey;
    clrscr;
end;

{Procedure para a multiplicação}
Procedure Mult;
begin
    clrscr;
    writeln;
    writeln ('Insira o primeiro fator');
    readln (x);
    writeln;
    writeln('*');
    writeln;
    writeln ('Insira o segundo fator');
    readln(y);
    writeln;
    writeln(Calculo(x, y, z):0:2);
    readkey;
    clrscr;
end;

{Procedure para a divisão}
Procedure quo;
begin
    clrscr;
    writeln;
    writeln ('Insira o dividendo');
    readln (x);
    writeln;
    writeln('/');
    writeln;
    writeln ('Insira o divisor');
    readln(y);
    writeln;
    writeln(Calculo(x, y, z):0:2);
    readkey;
    clrscr;
end;

{Procedure para colocar os resultados em uma matriz e apresenta-los}
Procedure Matriz;
begin
    for i:=1 to 3 do
    begin
        for j:=1 to 3 do
        begin
        M[i,j]:=z
        end;
    end;
    for i:=1 to 3 do
    begin
        for j:=1 to 3 do
        begin
        writeln(M[i,j]:0:2);
        end;
    end;
end;

{Procedure com o menu que dá as opções}
Procedure Menu;
Begin
    Repeat
        clrscr;
        writeln;
        writeln('Escolha uma operação usando os simbolos: (+),(-)(*),(/).');
        writeln;
        writeln('Tecle espaço para imprimir a matriz de resultados');
        writeln;
        writeln('Esc para sair do programa');
        opt:=readkey;
        Case opt of
            #43: begin
                 adicao
                 end;
            #45: begin
                 sub
                 end;
            #42: begin
                 mult
                 end;
            #47: begin
                 quo
                 end;
            #32:begin
                    matriz
                    end;     
            #27: begin
                     exit;
                     end;
        end;
        writeln('Esc para sair ou Backspace para voltar ao menu principal');
        opt:=readkey;
    Until(opt = #27 );
End;
Begin
Menu    
End.

 

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

@Vinicius_Menezes80       muito bem , seu programa está funcionando  bem  usando procedure  e função  .

   para postar seu código é melhor usar o botão  <>  que está lá na barra de ferramentas da janela de responder , pois senão seu código fica faltando alguns caracteres .

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

  • Membro VIP

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

 

Em relação ao seu tópico... do que se trata? Seria para divulgar? solicitar análises?

Perceba que você só deu um título e postou um código, ai ficamos sem saber..



Aproveitando, segue algumas sugestões:
 

1#
Sobre:

11 horas atrás, Vinicius_Menezes80 disse:

Function Calculo (x:real; y:real; z:real): real;

 

Analisando o código, vemos que está utilizando o z como uma "auxiliar para os cálculos"... mas perceba que o mundo externo (escopo global) não tem nada a ver com essa necessidade... ou seja, a única coisa que precisaria passar seria o x e y.

RESUMINDO:
O z poderia ser declarado dentro da funtion. Algo assim:

function Calculo(x:real; y:real):real;
  var
    z:real;
  begin
  ...

 

Caso precisa dessa valor, por exemplo, para adicionar na matriz, você poderia pegar o valor do resultado lá fora.

 

 

 

2#

Sobre:

11 horas atrás, Vinicius_Menezes80 disse:

            #47: begin
              z:= x / y;
              if y = 0 then
              begin
                Writeln('Divisão inválida, digite um número diferente de zero para o divisor ');
              end;
            end;

Perceba que está dividindo antes de verificar se pode ou não. Não adiante... Seria como o provérbio "atira primeiro, pergunta depois".

Poderia ser algo assim:

    #47:if (y <> 0) then
          z:=x/y
        else
          writeln('Divisão inválida,digite um número diferente de zero para o divisor ');
    end; //fim case

 

 

 

3#

Sobre:

{procedure para colocar os resultados em uma matriz e apresenta-los}
procedure Matriz;
  begin
  for i:=1 to 3 do
    for j:=1 to 3 do
      M[i,j]:=z;
  for i:=1 to 3 do
    for j:=1 to 3 do
      writeln(M[i,j]:0:2);
  end;

Essa parte em não entendi como usar... mas creio que não vai funcionar, por 2 motivos principais:
3.1 Mesmo se o z estivesse com o resultado da operação anterior (que não estará!), ao entrar nessa procedure, está sendo feita uma espécie e "preenchimento do vetor" nessa parte:

  for i:=1 to 3 do
    for j:=1 to 3 do
      M[i,j]:=z;

Mas percebe que para todas as posições estarão usando o mesmo z, logo, todas as posições vão ficar com o mesmo valor.

Em relação a esse "preenchimento", você poderia após receber a resposta, adicionar na matriz e depois exibir (ou exibir e adicionar na matriz, tanto faz).

 

 

3.2

A matriz deveria ser declarada dentro do método. Vide item 4#.

 

 

 

4#
Sobre o uso das variáveis em funcion e procedure... Então, eu penso assim: OU você só usa variáveis globais OU você só usa variáveis locais/recebidas por parâmetro.

Ou seja, para mim fica estranho ora usar local, ora usar global... se determinada variável você optou por usar global, porque não usar logo tudo como global??? qual o critério para um e para outro?

 

No Pascal tem uma dica que ajuda muito!!! basta declarar as variáveis logo acima do begin/end principal. Algo assim:

var
  opt :char;
  x,y :real;
  M   :array [1..4,1..4] of real;
  i,j :integer;
begin
Menu    
end.

Ai compila... vê o que é do "corpo" principal (entre esse begin/end), e o que é local. Que declararia no método ou passaria por parâmetro.

Então, como está usando direto um Menu, dá logo pra ver que todas as variáveis seriam de algum âmbito local... daí, basta apagar tudo e compila. Aí vai declarando localmente onde precisa... No caso, declarando o opt dentro do

Calculo(); o x e y em cada um dos métodos das operações matemáticas; e o vetor M, e as variáveis i e j no método Matriz(). Por ai vai...
 

Resumindo:

Cada método do programa deve ser independente... tudo que ele precisa, ou recebe via parâmetro, ou é declarado dentro dele.

 

ESSA É A FORMA QUE EU DEFENDO!



OU

Usa logo tudo como variável global..  Só para reforçar... porque pode usar opt como global, mas não pode usar o x e y? Sugiro pensar assim: "O pau que dá em Chico, dá em Francisco."

obs.: há contexto que poderia "só usar globais" e mesmo assim ser necessário receber por parâmetro, pois poderia usar variáveis diferentes... por exemplo.. Eu preciso ler vários valores para só depois efetuar as contas... aí, valores poderia está num vetor,  seria mais prático receber por parâmetro, pois eu poderia invocar o mesmo método usando variáveis distinta, ex.:

Calculo(valores[1,1],valores[1,2]);
Calculo(valores[2,1],valores[2,2]);
Calculo(valores[3,1],valores[3,2]);
Calculo(valores[4,1],valores[4,2]);
Calculo(valores[5,1],valores[5,2]);

Entendeu?  Mas como está somente usando X e Y, não precisaria de parâmetro... usava a variável global e pronto. (isso para esse paradigma de só usar globais.)

Mesmo assim perceba, que poderia simplesmente acessar o vetor global lá no método... mas pelo menos, nesse caso teria uma "justificativa" mais palpável.


 

 

***


Por ai vai.

No aguardo.

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

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!